Imports tsl5.Extensiones.StringExtensions Imports bdGestionAsegasa.Utilidades Public Class ProcesosTractoresAxa ''' ''' Revisa qué pólizas de la última semana están pendientes de generación de CSV. Se genera el CSV y se crea en la base de datos toda la informacion relacionada y necesaria. ''' ''' ''' Este método no crea el correo que se envía a AXA diariamente. Para eso se usa otro método distinto. Public Shared Function GenerarYGuardarEnBdCsvTractoresAxa(ByVal bd As bdGestionAsegasa.gestionasegasaEntities) Dim resultadoGuardarCambios As Integer = 0 Try Dim listaAltas As New List(Of bdGestionAsegasa.polizassg) Dim listaAltasFiltradasPorFecha As New List(Of bdGestionAsegasa.polizassg) Dim idRamoTractores = bd.ramos.First(Function(x) x.Codigo = "1-1").idRamo Dim idRamoRemolques = bd.ramos.First(Function(x) x.Codigo = "1-1-1").idRamo Dim idCiaAXA = bd.companias.First(Function(x) x.Codigo = "0027").idCompania Dim idTipoGestionPoliza = bd.enumeraciones.First(Function(x) x.Codigo = "TGP.CSVAXA").idEnumeracion Dim idTipoFicheroCSV = bd.enumeraciones.First(Function(x) x.Codigo = "TIPFIC.CSVAXA").idEnumeracion Dim lineaFichero As bdGestionAsegasa.ficheros Dim lineaGestionesVarias As bdGestionAsegasa.gestionesvarias ' Datos para comprobar que toca hacerlo Dim dHoy As Date = Date.Today Dim dAyer As Date = Date.Today.AddDays(-1) ' Dim dSemana As Date = Date.Today.AddDays(-7) ' Las pólizas que necesitan CSV son las que cumplan estas condiciones: ' - Sean de ramo 1-1 o 1-1-1. ' - La compañía sea AXA. ' - No tengan archivo CSV. Dicho de otro modo, que no tengan líneas en la tabla `gestionespolizassg` con la gestión "Creación de CSV y envío a AXA". ' - Que en la columna idOrigenPresupuesto el valor sea TiposPresupuestos.TRACTORES (2). ' - Que la fecha de creación sea anterior a hoy (ya que esto se ejecutará a las 00:00 y debe procesar las del día anterior). ' - Que la fecha de creación no sea mayor a 7 días. ' - Oculto = false ' Nota: En algún momento me interesaría poner que algunos estos filtros de búsqueda sean parametros que se le pasen a este método. ' Por ahora lo estoy haciendo así como dos consultas porque LINQtoSQL no permite filtrar por Date en los Where. ' Quizás lo mejor sería crear una vista para optimizar el rendimiento. Pero esto se ejecuta una sola vez al día, no sé si merece la pena hacerlo. Try listaAltas = (From x In bd.polizassg Where (x.ramos.idRamo = idRamoTractores OrElse x.ramos.idRamo = idRamoRemolques) _ AndAlso x.idCompania = idCiaAXA _ AndAlso x.FechaAceptacionPresupuesto.HasValue _ AndAlso x.FechaBaja.HasValue = False _ AndAlso Not x.gestionespolizassg.Any(Function(y) y.idTipo = idTipoGestionPoliza) _ AndAlso x.idOrigenPresupuesto = bdGestionAsegasa.polizassg.TiposPresupuestos.TRACTORES ).ToList() 'listaAltasFiltradasPorFecha = listaAltas.Where(Function(x) (x.FechaAlta.HasValue AndAlso x.FechaAlta.Value.Date < dHoy) _ ' AndAlso (x.FechaAlta.HasValue AndAlso x.FechaAlta.Value.Date >= dSemana) ' ).ToList() listaAltasFiltradasPorFecha = listaAltas.Where(Function(x) (x.FechaAlta.HasValue AndAlso x.FechaAlta.Value.Date < dHoy)).ToList Debug.WriteLine("listaAltas: {0}", listaAltas.Count()) Debug.WriteLine("listaAltasFiltradasPorFecha: {0}", listaAltasFiltradasPorFecha.Count()) For Each item In listaAltasFiltradasPorFecha Debug.WriteLine("({0},{1},{2})", item.idPoliza, item.NumeroPoliza, item.Matricula) Next Catch ex As Exception System.Diagnostics.Debug.Write(ex.ToString) Call AñadeLog(tsl5.Enumeraciones.TipoLog.Fallo, "En «" & System.Reflection.MethodBase.GetCurrentMethod.ToString & "`", "En método `" & System.Reflection.MethodBase.GetCurrentMethod.ToString & "`. " _ & Environment.MachineName & " " & ex.ToString, ex) End Try If listaAltasFiltradasPorFecha.Count > 0 Then 'Si entra, significa que toca hacerlo. lineaFichero = New bdGestionAsegasa.ficheros With { .Descripcion = String.Format("{0} {1}", bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.DescripcionFicheroCSV").ValorAlfabeticoLargo, dAyer.ToString("yyyy-MM-dd")), .Fecha = Now, .idTipo = idTipoFicheroCSV, .NombreFichero = String.Format("{0}{1}.csv", bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.NombreFicheroCSV").ValorAlfabeticoLargo, dAyer.ToString("yyyy-MM-dd")) } bd.ficheros.AddObject(lineaFichero) 'bd.GuardarCambios() lineaGestionesVarias = New bdGestionAsegasa.gestionesvarias With { .Descripción = lineaFichero.NombreFichero, .idTipo = idTipoGestionPoliza, .ficheros = lineaFichero, .FechaCreacion = Now } bd.gestionesvarias.AddObject(lineaGestionesVarias) ' ///////////////////////////////////////////////////////// ' // Generar CSV conteniendo todas las altas pendientes // ' /////////////////////////////////////////////////////// Dim archivoCSV As Byte() = GenerarCsvTractoresAxa(bd, listaAltasFiltradasPorFecha, lineaGestionesVarias) ' ///////////////////////////////////////////////////////////// ' // FIN Generar CSV conteniendo todas las altas pendientes // ' /////////////////////////////////////////////////////////// ' Crear líneas en la base de datos para fichero y gestiones varias lineaFichero.Fichero = archivoCSV resultadoGuardarCambios = bd.GuardarCambios() ' Notificación Slack If resultadoGuardarCambios > 0 Then Try Dim mensaje As New Text.StringBuilder mensaje.AppendFormat("Se ha generado un archivo CSV con altas de tractores y/o remolques para AXA.```idFichero: {1}{0}NombreFichero: {2}{0}idGestion: {3}{0}Servidor: {4}```", vbCrLf, lineaFichero.idFichero, lineaFichero.NombreFichero, lineaGestionesVarias.idGestion, Environment.MachineName) tsl5.Utilidades.EnviarNotificacionSlack(mensaje.ToString, destinatario:="#asegasa", descripcionRemitente:=Reflection.MethodBase.GetCurrentMethod.ToString) Catch ex As Exception ' Si esta notificación da error no debe pararse el servicio, así que no hago nada. End Try End If End If Catch ex As Exception System.Diagnostics.Debug.WriteLine("No hay líneas o se produjo excepción.") System.Diagnostics.Debug.WriteLine(ex.ToString) Call AñadeLog(tsl5.Enumeraciones.TipoLog.Fallo, "En «" & System.Reflection.MethodBase.GetCurrentMethod.ToString & "`", "En método `" & System.Reflection.MethodBase.GetCurrentMethod.ToString & "`. " _ & Environment.MachineName & " " & ex.ToString, ex) End Try Debug.WriteLine(System.Reflection.MethodBase.GetCurrentMethod.ToString) Return resultadoGuardarCambios End Function ''' ''' Este es el método que se encarga de crear el CSV propiamente dicho. Opcionalmente (aunque, por lo general, sí) este método ''' va creando en la tabla `gestionnespolizassg` las líneas indicando que se ha creado el CSV para cada póliza. ''' ''' ''' La lista de pólizas de tractores que se van a incluir en el CSV. ''' Si este parámetro se recibe, se crean en la tabla `gestionnespolizassg` las líneas que indican que se ha creado el CSV para cada póliza. ''' Un array de bytes conteniendo el fichero CSV. ''' Si no se recibe el parámtro "lineaGestionesVarias" no se crearán en la base de datos las líneas que indican que se ha creado el CSV para cada póliza. ''' La ventaja de esto es que así se puede usar este método para generar CSV de manera puntual o para depuración. Public Shared Function GenerarCsvTractoresAxa(ByVal bd As bdGestionAsegasa.gestionasegasaEntities, ByVal listaPolizas As List(Of bdGestionAsegasa.polizassg), Optional ByRef lineaGestionesVarias As bdGestionAsegasa.gestionesvarias = Nothing) Dim archivoCSV As Byte() = Nothing Dim idTipoGestionPoliza As String = bd.enumeraciones.First(Function(x) x.Codigo = "TGP.CSVAXA").idEnumeracion Dim sDescripcionGestion As String = bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.DescripcionGestion").ValorAlfabeticoLargo Dim nombreArchivoTemporal As String = System.IO.Path.GetTempFileName Using sw As New IO.StreamWriter(IO.File.Open(nombreArchivoTemporal, IO.FileMode.Create), System.Text.Encoding.GetEncoding("iso-8859-1")) ' Esta línea que escribo a continuación en el archivo era demasiado larga para guardarla en la tabla enumeraciones de la base de datos. sw.WriteLine("Código Marca;Código Modelo;Código Versión;Medofi;Fecha de Efecto;Hora de Fecha Efecto;CAMPAÑA;Producto;Nº Póliza Reservado;Fecha entrada en Delegación;Duración;Plan de cobro;Canal de cobro;Fecha Vto.;NIF, CIF, OTROS;Nº de NIF ó CIF;Primer apellido si es Empresa, no cumplimentar;Segundo apellido si es Empresa, no cumplimentar;Nombre;Fecha Nacimiento;Estado Civil;SEXO;C.P.;Población;Tipo Vía;Nombre Vía;Numero vía;Resto Vía;Propietario;Nombre propietario;Apellido 1 propietario;Apellido 2 propietario;Nif/Cif propietario;Conductor Titular;Nombre Conductor;1º Apellido Conductor;2º Apellido Conductor;Fecha nacimiento conductor DDMMAAAA;Nif, Cif, Otros;NIF Conductor;SEXO;Fecha carnét DDMMAAAA;Conductor Autorizado 1;Nombre Conductor;1º Apellido Conductor;2º Apellido Conductor;Fecha nto. Conductor DDMMAAAA;NIF Conductor;SEXO;Fecha carnet DDMMAAAA;Conductor Autorizado 2;Nombre Conductor;1º Apellido Conductor;2º Apellido Conductor;Fecha nto. Conductor DDMMAAAA;NIF Conductor;SEXO;Fecha carnet DDMMAAAA;Permiso retirado (fijo);Uso Vehículo (según tabla);Accesorios;Tipo de Accesorios;Descripción (Detallar los accesorios separados por comas);Valor Accesorios (valor total);Peso en Toneladas;Literal de Marca;Literal de Modelo;Literal de Versión;Valor (fijo);Valor LUNAS;Matrícula;Fecha 1ª Matriculación DDMMAAAA;C.P. circulación (poner el CP del conductor);Alarma (fijo);Garaje (fijo);KM recorridos (fijo);Combinación de Garantías;Combinación de Accidentes;Kit RC Explotación Agrícola;PRIMA TOTAL;Nº PîLIZA EMITIDA;PNETA EMITIDA;PTOTAL EMITIDA") For Each linea In listaPolizas ' Comprobar si el archivo XML es el tractores.xml de tipo "TIPFIC.PRESUPUESTO Dim idTipoFicheroPresupuesto As Integer = bd.enumeraciones.First(Function(x) x.Codigo = "TIPFIC.PRESUPUESTO").idEnumeracion If linea.ficheros.idTipo = idTipoFicheroPresupuesto _ AndAlso linea.ficheros.NombreFichero.Trim.ToUpper = "tractores.xml".ToUpper _ AndAlso linea.NumeroPoliza IsNot Nothing AndAlso Not String.IsNullOrWhiteSpace(linea.NumeroPoliza) Then ' Componer la poliza del archivo CSV Dim lineaCSV As String = "" Dim lineaCsvCorrecta As Boolean = False Try lineaCSV = ComponerLineaCsv(linea, bd) lineaCsvCorrecta = True Catch ex As Exception Dim asunto As String = "No se ha podido generar una línea del CSV de TractoresAXA; idPoliza = " & linea.idPoliza & "; Máquina = " & Environment.MachineName Dim cuerpo As String = "No se ha podido generar una línea del CSV de TractoresAXA; idPoliza = " & linea.idPoliza & vbCrLf & "Esto podría significar que falta algún dato en esta póliza. " & vbCrLf & "En método `" & System.Reflection.MethodBase.GetCurrentMethod.ToString & "`. " _ & vbCrLf & Environment.MachineName & " " & ex.ToString Call AñadeLog(tsl5.Enumeraciones.TipoLog.Fallo, asunto, cuerpo, ex) tsl5.Utilidades.EnviarNotificacionSlack(asunto, destinatario:="#asegasa", descripcionRemitente:=Reflection.MethodBase.GetCurrentMethod.ToString) End Try If lineaCsvCorrecta Then sw.WriteLine(lineaCSV) ' Si he sido capaz de componer la línea del archivo CSV, tengo que guardarlo en la tabla gestionespolizassg If lineaGestionesVarias IsNot Nothing AndAlso Not String.IsNullOrWhiteSpace(lineaGestionesVarias.Descripción) Then linea.gestionespolizassg.Add(New bdGestionAsegasa.gestionespolizassg With { .idPoliza = linea.idPoliza, .idTipo = idTipoGestionPoliza, .Fecha = Date.Now, .GestionesRealizadas = sDescripcionGestion, .gestionesvarias = lineaGestionesVarias }) End If End If Else Dim cadenaError As String = String.Format("Advertencia: el fichero no es de tipo ""TIPFIC.PRESUPUESTO"" o no se llama ""tractores.xml"", o no hay número de póliza; idPoliza = {0}", linea.idPoliza) Console.WriteLine(cadenaError) Call AñadeLog(tsl5.Enumeraciones.TipoLog.Fallo, "En «" & System.Reflection.MethodBase.GetCurrentMethod.ToString & "`", "En método `" & System.Reflection.MethodBase.GetCurrentMethod.ToString & "`. " _ & Environment.MachineName & " " & cadenaError) End If Next sw.Close() sw.Dispose() End Using ' Solo tenemos que enviarlo si el archivo tiene más de 1 línea. ' Si solo tiene 1, significa que solo va la línea de la cabecera, es decir, ' que no hay datos de ninguna póliza en ese archivo CSV. ' En ese caso, lanzamos una excepción para que se interruma el proceso. If NumeroDeLineasEnElArchivoCSV(nombreArchivoTemporal) <= 1 Then Throw New Exception("El archivo CSV que se ha generado solamente tiene la línea de la cabecera, es decir, no lleva información de ninguna póliza, por lo cual no tiene sentido mandarlo.") End If ' Pasar el archivo CSV a array de bytes archivoCSV = IO.File.ReadAllBytes(nombreArchivoTemporal) Try IO.File.Delete(nombreArchivoTemporal) Catch ex As Exception ' Nada, a propósito. ' Si el archivo sobrevive tampoco es un gran problema. End Try Return archivoCSV End Function ''' ''' Este método solamente crea un CSV; nada se guarda en la base de datos. Principalmente se usará con propósitos de pruebas y/o depuración. ''' ''' ''' Una cadena de texto que incluya listas o rangos de pólizas en este formato: "64816901, 64816906-64816911, 64816915". ''' Esto significa "la póliza 64816901, el rango de las pólizas comprendidas entre la 64816906 y la 64816911, y la póliza 64816915". El separador "-" indica rango; ''' el separador "," separa elementos de la lista. ''' Un array de bytes conteniendo el fichero CSV. ''' Este método solamente crea un CSV; nada se guarda en la base de datos. Principalmente se usará con propósitos de pruebas y/o depuración. ''' Solo funcionará si todas las pólizas especificadas son de tractores de AXA generadas desde WEbAsegasa2018 (agentes.asegasa.com). Public Shared Function GenerarCsvTractoresAxa(ByVal bd As bdGestionAsegasa.gestionasegasaEntities, Optional ByVal cadenaListaPolizas As String = Nothing) Dim archivoCSV As Byte() = Nothing Dim listaPolizas As New List(Of bdGestionAsegasa.polizassg) Dim idRamoTractores As String = (From x In bd.ramos Where x.Codigo = "1-1" Select x.idRamo).FirstOrDefault Dim idRamoRemolques As String = (From x In bd.ramos Where x.Codigo = "1-1-1" Select x.idRamo).FirstOrDefault Dim idCiaAXA As String = (From x In bd.companias Where x.Codigo = "0027" Select x.idCompania).FirstOrDefault Dim listaCadenasSeparadasPorComas As List(Of String) = cadenaListaPolizas.Split(",").ToList For Each x In listaCadenasSeparadasPorComas If x.Contains("-") Then Dim subListaRangos As List(Of String) = x.Split("-").ToList If subListaRangos.Count = 2 Then Dim iRangoDesde As UInteger = UInteger.Parse(subListaRangos.First.Trim()) Dim iRangoHasta As UInteger = UInteger.Parse(subListaRangos.Last.Trim()) listaPolizas.AddRange(bd.polizassg.Where(Function(y) (y.ramos.idRamo = idRamoTractores OrElse y.ramos.idRamo = idRamoRemolques) _ AndAlso y.idCompania = idCiaAXA _ AndAlso y.idOrigenPresupuesto = bdGestionAsegasa.polizassg.TiposPresupuestos.TRACTORES _ AndAlso (y.NumeroPoliza >= iRangoDesde AndAlso y.NumeroPoliza <= iRangoHasta) ).OrderBy(Function(y) y.NumeroPoliza).ToList()) Else Throw New FormatException("Error con el formato de los rangos de números de pólizas especificados: " & cadenaListaPolizas) End If Else Dim sNumeroPoliza As String = x.Trim() Dim temp = bd.polizassg.Where(Function(y) y.NumeroPoliza = sNumeroPoliza).First listaPolizas.Add(temp) End If Next For Each poliza In listaPolizas Debug.WriteLine(String.Format("[{0},{1},{2}]", poliza.idPoliza, poliza.NumeroPoliza, poliza.Matricula)) Next archivoCSV = GenerarCsvTractoresAxa(bd, listaPolizas) Return archivoCSV End Function ''' ''' Este método solamente crea un CSV; nada se guarda en la base de datos. Principalmente se usará con propósitos de pruebas y/o depuración. ''' ''' ''' Desde esta fecha se incluirán todas las pólizas de tractores de AXA en el rango que será procesado. ''' Hasta esta fecha se incluirán todas las pólizas de tractores de AXA en el rango que será procesado. ''' Este método solamente crea un CSV; nada se guarda en la base de datos. Principalmente se usará con propósitos de pruebas y/o depuración. ''' Ambas fechas especificadas están incluídas en el rango que será procesado. Public Shared Function GenerarCsvTractoresAxa(ByVal bd As bdGestionAsegasa.gestionasegasaEntities, ByVal fechaDesde As Date, ByVal fechaHasta As Date) Dim archivoCSV As Byte() = Nothing Dim idRamoTractores As String = (From x In bd.ramos Where x.Codigo = "1-1" Select x.idRamo).FirstOrDefault Dim idRamoRemolques As String = (From x In bd.ramos Where x.Codigo = "1-1-1" Select x.idRamo).FirstOrDefault Dim idCiaAXA As String = (From x In bd.companias Where x.Codigo = "0027" Select x.idCompania).FirstOrDefault Dim listaAltas As List(Of bdGestionAsegasa.polizassg) = (From x In bd.polizassg Where (x.ramos.idRamo = idRamoTractores OrElse x.ramos.idRamo = idRamoRemolques) _ AndAlso x.idCompania = idCiaAXA _ AndAlso x.idOrigenPresupuesto = bdGestionAsegasa.polizassg.TiposPresupuestos.TRACTORES ).ToList() Dim listaAltasFiltradasPorFecha As List(Of bdGestionAsegasa.polizassg) = listaAltas.Where(Function(x) (x.FechaAlta.HasValue AndAlso x.FechaAlta.Value.Date <= fechaHasta) _ AndAlso (x.FechaAlta.HasValue AndAlso x.FechaAlta.Value.Date >= fechaDesde) ).ToList() archivoCSV = GenerarCsvTractoresAxa(bd, listaAltasFiltradasPorFecha) Return archivoCSV End Function Private Shared Function ComponerLineaCsv(poliza As bdGestionAsegasa.polizassg, bd As bdGestionAsegasa.gestionasegasaEntities) As String ' Importante: tengo que hacer trim a todos los campos, por si acaso. Los apellidos se han guardando con espacios por delante. Dim sb As New Text.StringBuilder Try ' Primero verifico que todos los campos tengan datos. Si alguno no tiene, lanzo excepción. Dim listaDatosFaltantes As New List(Of String) If String.IsNullOrWhiteSpace(poliza.Tractores.TipoVehiculo.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.TipoVehiculo") If String.IsNullOrWhiteSpace(poliza.FechaEfecto.ToString("ddMMyyyy")) Then listaDatosFaltantes.Add("poliza.FechaEfecto") If String.IsNullOrWhiteSpace(poliza.Tomador.CIF.Trim()) Then listaDatosFaltantes.Add("poliza.Tomador.CIF") If ObtenerTipoDocumentoTractoresAxa(poliza.Tomador.CIF) <> bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.tipoDoc.PersJuridicaCIF").ValorAlfabeticoLargo Then ' Si no es CIF If String.IsNullOrWhiteSpace(poliza.Tractores.TomadorApellido1.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.TomadorApellido1") 'If String.IsNullOrWhiteSpace(poliza.Tractores.TomadorApellido2.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.TomadorApellido2") End If If String.IsNullOrWhiteSpace(poliza.Tractores.TomadorNombre.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.TomadorNombre") If String.IsNullOrWhiteSpace(poliza.Tractores.TomadorFechaNacimiento.ToString("ddMMyyyy")) Then listaDatosFaltantes.Add("poliza.Tractores.TomadorFechaNacimiento") If String.IsNullOrWhiteSpace(poliza.Tractores.EstadoCivil.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.EstadoCivil") If ObtenerTipoDocumentoTractoresAxa(poliza.Tomador.CIF) <> bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.tipoDoc.PersJuridicaCIF").ValorAlfabeticoLargo Then ' Si no es CIF If String.IsNullOrWhiteSpace(poliza.Tractores.TomadorSexo.ToString) Then listaDatosFaltantes.Add("poliza.Tractores.TomadorSexo") End If If String.IsNullOrWhiteSpace(poliza.Tractores.TomadorCodigoPostal.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.TomadorCodigoPostal") If String.IsNullOrWhiteSpace(poliza.Tractores.TomadorPoblacion.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.TomadorPoblacion") If String.IsNullOrWhiteSpace(poliza.Tractores.TomadorVia.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.TomadorVia") If String.IsNullOrWhiteSpace(poliza.Tractores.TomadorNombreVia.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.TomadorNombreVia") If String.IsNullOrWhiteSpace(poliza.Tractores.TomadorNumeroVia.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.TomadorNumeroVia") If ObtenerTipoDocumentoTractoresAxa(poliza.Propietario.CIF) <> bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.tipoDoc.PersJuridicaCIF").ValorAlfabeticoLargo Then ' Si no es CIF If String.IsNullOrWhiteSpace(poliza.Tractores.PropietarioSexo.ToString) Then listaDatosFaltantes.Add("poliza.Tractores.PropietarioSexo") If String.IsNullOrWhiteSpace(poliza.Tractores.PropietarioApellido1.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.PropietarioApellido1") 'If String.IsNullOrWhiteSpace(poliza.Tractores.PropietarioApellido2.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.PropietarioApellido2") End If If poliza.Propietario IsNot Nothing AndAlso poliza.Propietario.idEntidad <> poliza.Tomador.idEntidad Then If String.IsNullOrWhiteSpace(poliza.Propietario.Nombre.Trim) And (ObtenerTipoDocumentoTractoresAxa(poliza.Propietario.CIF) <> bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.tipoDoc.PersJuridicaCIF").ValorAlfabeticoLargo) Then listaDatosFaltantes.Add("poliza.propietario.nombre") End If If String.IsNullOrWhiteSpace(poliza.Propietario.CIF.Trim()) Then listaDatosFaltantes.Add("poliza.Propietario.CIF") End If If poliza.Conductor Is Nothing OrElse poliza.Conductor.idEntidad = poliza.Tomador.idEntidad Then 'If Not poliza.Conductor.FechaExpedicionCarnet.HasValue Then ' listaDatosFaltantes.Add("poliza.Conductor.FechaExpedicionCarnet") 'Else ' If String.IsNullOrWhiteSpace(poliza.Conductor.FechaExpedicionCarnet.Value.ToString("ddMMyyyy")) Then listaDatosFaltantes.Add("poliza.Conductor.FechaExpedicionCarnet") 'End If If Not (poliza.Tractores.FechaPermisoConduccion > Date.MinValue AndAlso poliza.Tractores.FechaPermisoConduccion < Date.MaxValue) Then listaDatosFaltantes.Add("poliza.Tractores.FechaPermisoConduccion") End If If String.IsNullOrWhiteSpace(poliza.Tractores.FechaPermisoConduccion.ToString("ddMMyyyy")) Then listaDatosFaltantes.Add("poliza.Tractores.FechaPermisoConduccion") Else If String.IsNullOrWhiteSpace(poliza.Tractores.ConductorNombre.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.ConductorNombre") If String.IsNullOrWhiteSpace(poliza.Tractores.ConductorApellido1.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.ConductorApellido1") 'If String.IsNullOrWhiteSpace(poliza.Tractores.ConductorApellido2.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.ConductorApellido2") If String.IsNullOrWhiteSpace(poliza.Tractores.ConductorFechaNacimiento.ToString("ddMMyyyy")) Then listaDatosFaltantes.Add("poliza.Tractores.ConductorFechaNacimiento") If String.IsNullOrWhiteSpace(poliza.Conductor.CIF.Trim()) Then listaDatosFaltantes.Add("poliza.Conductor.CIF") If String.IsNullOrWhiteSpace(poliza.Tractores.ConductorSexo.ToString) Then listaDatosFaltantes.Add("poliza.Tractores.ConductorSexo") If String.IsNullOrWhiteSpace(poliza.Tractores.FechaPermisoConduccion.ToString("ddMMyyyy")) Then listaDatosFaltantes.Add("poliza.Tractores.FechaPermisoConduccion") End If If String.IsNullOrWhiteSpace(poliza.Tractores.UsoVehiculo.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.UsoVehiculo") If String.IsNullOrWhiteSpace(poliza.Tractores.Peso.ToString.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.Peso") If String.IsNullOrWhiteSpace(poliza.Tractores.Marca.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.Marca") If String.IsNullOrWhiteSpace(poliza.Tractores.Modelo.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.Modelo") If String.IsNullOrWhiteSpace(poliza.Tractores.Version.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.Version") If String.IsNullOrWhiteSpace(poliza.Matricula.ToUpper.Trim()) Then listaDatosFaltantes.Add("poliza.Matricula") If String.IsNullOrWhiteSpace(poliza.Tractores.FechaPrimeraMatriculacion.ToString("ddMMyyyy")) Then listaDatosFaltantes.Add("poliza.Tractores.FechaPrimeraMatriculacion") If String.IsNullOrWhiteSpace(poliza.Tractores.TomadorCodigoPostal.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.TomadorCodigoPostal") If String.IsNullOrWhiteSpace(poliza.Tractores.CombinacionAccidentes.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.CombinacionAccidentes") If String.IsNullOrWhiteSpace(poliza.Tractores.PrimaTotal.Trim()) Then listaDatosFaltantes.Add("poliza.Tractores.PrimaTotal") If listaDatosFaltantes.Count > 0 Then Dim sbDatosFaltantes As New Text.StringBuilder For Each l In listaDatosFaltantes sbDatosFaltantes.AppendFormat("{0}, ", l) 'Sí, esto es así. No es un error. Next Throw New Exception(String.Format("No se puede componer esta línea del CSV porque faltan datos en la póliza idPoliza = {0}; Lista de datos faltantes: {1}.", poliza.idPoliza, sbDatosFaltantes.ToString.RecortarPorElFinal(2))) End If ' Fin de la verificación ' Datos generales de la póliza sb.AppendFormat("{0};", poliza.Tractores.TipoVehiculo.Trim()) ' Código Marca sb.AppendFormat("=""{0}"";", "001") ' Código Modelo sb.AppendFormat("=""{0}"";", "001") ' Código Versión sb.AppendFormat("{0};", "674392") ' Medofi sb.AppendFormat("=""{0}"";", poliza.FechaEfecto.ToString("ddMMyyyy")) ' Fecha de Efecto sb.AppendFormat("{0};", "") ' Hora de Fecha Efecto sb.AppendFormat("{0};", "") ' CAMPAÑA sb.AppendFormat("{0};", "8184") ' Producto sb.AppendFormat("{0};", poliza.NumeroPoliza.Trim()) ' Nº Póliza Reservado sb.AppendFormat("{0};", "") ' Fecha entrada en Delegación sb.AppendFormat("{0};", "Anual Renovable") ' Duración sb.AppendFormat("{0};", "Anual") ' Plan de cobro sb.AppendFormat("{0};", "Mediador") ' Canal de cobro sb.AppendFormat("{0};", "") ' Fecha Vto. ' Tomador sb.AppendFormat("{0};", ObtenerTipoDocumentoTractoresAxa(poliza.Tomador.CIF)) ' NIF, CIF, OTROS sb.AppendFormat("{0};", poliza.Tomador.CIF.Trim()) ' Nº de NIF ó CIF sb.AppendFormat("{0};", poliza.Tractores.TomadorApellido1.Trim()) ' Primer apellido si es Empresa, no cumplimentar sb.AppendFormat("{0};", poliza.Tractores.TomadorApellido2.Trim()) ' Segundo apellido si es Empresa, no cumplimentar sb.AppendFormat("{0};", poliza.Tractores.TomadorNombre.Trim()) ' Nombre sb.AppendFormat("=""{0}"";", poliza.Tractores.TomadorFechaNacimiento.ToString("ddMMyyyy")) ' Fecha Nacimiento sb.AppendFormat("{0};", poliza.Tractores.EstadoCivil.Trim()) ' Estado Civil If ObtenerTipoDocumentoTractoresAxa(poliza.Tomador.CIF) = bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.tipoDoc.PersJuridicaCIF").ValorAlfabeticoLargo Then ' Si es CIF sb.AppendFormat("{0};", bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.sexo.SinInformar").ValorAlfabetico1) ' SEXO = "sin informar" para personas jurídicas Else ' Si no es CIF sb.AppendFormat("{0};", ObtenerSexoTractoresAxa(poliza.Tractores.TomadorSexo, bd)) ' SEXO End If sb.AppendFormat("{0};", poliza.Tractores.TomadorCodigoPostal.Trim()) ' C.P. sb.AppendFormat("{0};", poliza.Tractores.TomadorPoblacion.Trim()) ' Población sb.AppendFormat("{0};", poliza.Tractores.TomadorVia.Trim()) ' Tipo Vía sb.AppendFormat("{0};", poliza.Tractores.TomadorNombreVia.Trim()) ' Nombre Vía sb.AppendFormat("{0};", poliza.Tractores.TomadorNumeroVia.Trim()) ' Numero vía sb.AppendFormat("{0};", poliza.Tractores.TomadorRestoVia.Trim()) ' Resto Vía If poliza.Propietario Is Nothing OrElse poliza.Propietario.idEntidad = poliza.Tomador.idEntidad Then ' Propietario: el tomador sb.AppendFormat("{0};", "El Tomador") ' Propietario sb.AppendFormat("{0};", "") ' Nombre propietario sb.AppendFormat("{0};", "") ' Apellido 1 propietario sb.AppendFormat("{0};", "") ' Apellido 2 propietario sb.AppendFormat("{0};", "") ' Nif/Cif propietario Else If ObtenerTipoDocumentoTractoresAxa(poliza.Propietario.CIF) <> bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.tipoDoc.PersJuridicaCIF").ValorAlfabeticoLargo Then ' Si no es CIF ' Propietario: otro, persona física sb.AppendFormat("{0};", "Otra persona distinta del Tomador") ' Propietario sb.AppendFormat("{0};", poliza.Propietario.Nombre.Trim()) ' Nombre propietario sb.AppendFormat("{0};", poliza.Tractores.PropietarioApellido1.Trim()) ' Apellido 1 propietario sb.AppendFormat("{0};", poliza.Tractores.PropietarioApellido2.Trim()) ' Apellido 2 propietario sb.AppendFormat("{0};", poliza.Propietario.CIF.Trim()) ' Nif/Cif propietario Else ' Propietario: otro, persona jurídica sb.AppendFormat("{0};", "Otra persona distinta del Tomador") ' Propietario sb.AppendFormat("{0};", poliza.Propietario.Nombre.Trim()) ' Nombre propietario sb.AppendFormat("{0};", "") ' Apellido 1 propietario, no tiene. sb.AppendFormat("{0};", "") ' Apellido 2 propietario, no tiene. sb.AppendFormat("{0};", poliza.Propietario.CIF.Trim()) ' Nif/Cif propietario End If End If If poliza.Conductor Is Nothing OrElse poliza.Conductor.idEntidad = poliza.Tomador.idEntidad Then ' Conductor: el tomador sb.AppendFormat("{0};", "El Tomador") ' Conductor Titular sb.AppendFormat("{0};", "") ' Nombre Conductor sb.AppendFormat("{0};", "") ' 1º Apellido Conductor sb.AppendFormat("{0};", "") ' 2º Apellido Conductor sb.AppendFormat("{0};", "") ' Fecha nacimiento conductor DDMMAAAA sb.AppendFormat("{0};", "") ' Nif, Cif, Otros sb.AppendFormat("{0};", "") ' NIF Conductor sb.AppendFormat("{0};", "") ' SEXO sb.AppendFormat("=""{0}"";", poliza.Tractores.FechaPermisoConduccion.ToString("ddMMyyyy")) ' Fecha carnét DDMMAAAA Else ' Conductor: otro sb.AppendFormat("{0};", "Es otra persona") ' Conductor Titular sb.AppendFormat("{0};", poliza.Tractores.ConductorNombre.Trim()) ' Nombre Conductor sb.AppendFormat("{0};", poliza.Tractores.ConductorApellido1.Trim()) ' 1º Apellido Conductor sb.AppendFormat("{0};", poliza.Tractores.ConductorApellido2.Trim()) ' 2º Apellido Conductor sb.AppendFormat("=""{0}"";", poliza.Tractores.ConductorFechaNacimiento.ToString("ddMMyyyy")) ' Fecha nacimiento conductor DDMMAAAA sb.AppendFormat("{0};", ObtenerTipoDocumentoTractoresAxa(poliza.Conductor.CIF)) ' Nif, Cif, Otros sb.AppendFormat("{0};", poliza.Conductor.CIF.Trim()) ' NIF Conductor sb.AppendFormat("{0};", ObtenerSexoTractoresAxa(poliza.Tractores.ConductorSexo, bd)) ' SEXO sb.AppendFormat("=""{0}"";", poliza.Tractores.FechaPermisoConduccion.ToString("ddMMyyyy")) ' Fecha carnét DDMMAAAA End If ' Conductor autorizado 1 (siempre vacío) sb.AppendFormat("{0};", "No se declara") ' Conductor Autorizado 1 sb.AppendFormat("{0};", "") ' Nombre Conductor sb.AppendFormat("{0};", "") ' 1º Apellido Conductor sb.AppendFormat("{0};", "") ' 2º Apellido Conductor sb.AppendFormat("{0};", "") ' Fecha nto. Conductor DDMMAAAA sb.AppendFormat("{0};", "") ' NIF Conductor sb.AppendFormat("{0};", "") ' SEXO sb.AppendFormat("{0};", "") ' Fecha carnet DDMMAAAA ' Conductor autorizado 2 (siempre vacío) sb.AppendFormat("{0};", "No se declara") ' Conductor Autorizado 2 sb.AppendFormat("{0};", "") ' Nombre Conductor sb.AppendFormat("{0};", "") ' 1º Apellido Conductor sb.AppendFormat("{0};", "") ' 2º Apellido Conductor sb.AppendFormat("{0};", "") ' Fecha nto. Conductor DDMMAAAA sb.AppendFormat("{0};", "") ' NIF Conductor sb.AppendFormat("{0};", "") ' SEXO sb.AppendFormat("{0};", "") ' Fecha carnet DDMMAAAA ' Otros datos sb.AppendFormat("{0};", "No") ' Permiso retirado (fijo) sb.AppendFormat("{0};", poliza.Tractores.UsoVehiculo.Trim()) ' Uso Vehículo (según tabla) sb.AppendFormat("{0};", "") ' Accesorios sb.AppendFormat("{0};", "") ' Tipo de Accesorios sb.AppendFormat("{0};", "") ' Descripción (Detallar los accesorios separados por comas) sb.AppendFormat("{0};", "") ' Valor Accesorios (valor total) sb.AppendFormat("{0};", poliza.Tractores.Peso.ToString.Trim()) ' Peso en Toneladas sb.AppendFormat("{0};", poliza.Tractores.Marca.Trim()) ' Literal de Marca sb.AppendFormat("{0};", poliza.Tractores.Modelo.Trim()) ' Literal de Modelo sb.AppendFormat("{0};", poliza.Tractores.Version.Trim()) ' Literal de Versión sb.AppendFormat("{0};", "35.000") ' Valor (fijo) sb.AppendFormat("=""{0}"";", "0,00") ' Valor LUNAS sb.AppendFormat("{0};", poliza.Matricula.ToUpper.Trim()) ' Matrícula sb.AppendFormat("=""{0}"";", poliza.Tractores.FechaPrimeraMatriculacion.ToString("ddMMyyyy")) ' Fecha 1ª Matriculación DDMMAAAA sb.AppendFormat("=""{0}"";", poliza.Tractores.TomadorCodigoPostal.Trim()) ' C.P. circulación (poner el CP del conductor) sb.AppendFormat("{0};", "NO") ' Alarma (fijo) sb.AppendFormat("{0};", "NO") ' Garaje (fijo) sb.AppendFormat("{0};", "Sin definir") ' KM recorridos (fijo) sb.AppendFormat("{0};", "Terceros sin Asistencia") ' Combinación de Garantías sb.AppendFormat("{0};", poliza.Tractores.CombinacionAccidentes.Trim()) ' Combinación de Accidentes sb.AppendFormat("{0};", "Si") ' Kit RC Explotación Agrícola sb.AppendFormat("{0};", poliza.Tractores.PrimaTotal.Trim()) ' PRIMA TOTAL sb.AppendFormat("{0};", "") ' Nº PÓLIZA EMITIDA sb.AppendFormat("{0};", "") ' PNETA EMITIDA sb.AppendFormat("{0}", "") ' PTOTAL EMITIDA Catch ex As Exception Throw New Exception(ex.Message, ex) End Try Return sb.ToString End Function Public Shared Function PrepararCorreosCsvTractoresAxa(bd As bdGestionAsegasa.gestionasegasaEntities) As Integer Const danmundebug As Boolean = False Dim resultadoGuardarCambios As Integer = 0 Try Dim dHoy As Date = Date.Today Dim dAyer As Date = Date.Today.AddDays(-1) ' Dim dSemana As Date = Date.Today.AddDays(-7) Dim idTipoGestionPoliza As String = bd.enumeraciones.First(Function(x) x.Codigo = "TGP.CSVAXA").idEnumeracion Dim idTipoFicheroCSV As String = bd.enumeraciones.First(Function(x) x.Codigo = "TIPFIC.CSVAXA").idEnumeracion Dim nLineasPendientesCorreoCsv As Integer = 0 '// Toca hacerlo si tenemos líneas en la tabla gestionesvarias que cumplan las siguientes condiciones '// - idTipo = idTipoGestionPoliza '// - fechaProcesado = NULL Dim lineasPendientesCorreoCsv As List(Of bdGestionAsegasa.gestionesvarias) = bd.gestionesvarias.Where(Function(x) x.idTipo = idTipoGestionPoliza _ AndAlso Not x.FechaProcesado.HasValue).ToList() nLineasPendientesCorreoCsv = lineasPendientesCorreoCsv.Count '// Preparación del correo que sí lleva CSV For Each linea In lineasPendientesCorreoCsv Dim listaEnumeraciones As List(Of bdGestionAsegasa.enumeraciones) = bd.enumeraciones.Where(Function(x) x.Codigo.StartsWith("AXATRACTORES.email.")).ToList() Dim listaDestinatarios As List(Of String) = (From x In bd.enumeraciones Where x.Codigo.StartsWith("AXATRACTORES.email.destinatario") Select x.ValorAlfabeticoLargo.Trim()).ToList() Dim remitente = (From x In bd.enumeraciones Where x.Codigo = "AXATRACTORES.email.remitente" Select x.ValorAlfabeticoLargo).FirstOrDefault().Trim() Dim direccionRespuesta As String = (From x In bd.enumeraciones Where x.Codigo = "AXATRACTORES.email.direccionRespuesta" Select x.ValorAlfabeticoLargo).FirstOrDefault().Trim() Dim asunto = String.Format("{0} {1}", bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.email.asunto").ValorAlfabeticoLargo.Trim(), linea.ficheros.Descripcion.Split(" ").Last) Dim cuerpo = String.Format("{0} {1}", bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.email.cuerpo").ValorAlfabeticoLargo.Trim(), linea.ficheros.Descripcion.Split(" ").Last) Dim nombreArchivoCSV As String = String.Format("{0}{1}.csv", bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.NombreFicheroCSV").ValorAlfabeticoLargo, linea.ficheros.Descripcion.Split(" ").Last) ' Enviar el correo (bueno, en realidad guardarlo en la BD para que se envíe) Dim cuentaCorreo As bdGestionAsegasa.cuentascorreo = bd.cuentascorreo.First(Function(x) x.Codigo = "CSVAXA") For Each destinatario In listaDestinatarios bdGestionAsegasa.correos.GeneraRegistroCorreo(bd, asunto, cuerpo, cuentaCorreo, destinatario,,, linea.idFichero) Next ' Marcar email como enviado. Si no ha dado excepción hasta aquí, significa que ya está en la tabla de salida de correos. linea.FechaProcesado = Now If Not danmundebug Then resultadoGuardarCambios += bd.GuardarCambios() System.Diagnostics.Debug.WriteLine("lineaCSV.enviado: " & resultadoGuardarCambios) ' Notificación Slack If resultadoGuardarCambios > 0 Then Try Dim mensaje As New Text.StringBuilder mensaje.AppendFormat("Se ha generado un email para AXA conteniendo el archivo CSV con altas de tractores y/o remolques para AXA.```Asunto: {1}{0}Servidor: {2}```", vbCrLf, asunto, Environment.MachineName) tsl5.Utilidades.EnviarNotificacionSlack(mensaje.ToString, destinatario:="#asegasa", descripcionRemitente:=Reflection.MethodBase.GetCurrentMethod.ToString) Catch ex As Exception ' Si esta notificación da error no debe pararse el servicio, así que no hago nada. End Try End If Next 'TODO danmun: Preparación del correo que NO lleva CSV '// Preparación del correo que NO lleva CSV '// Sabremos si hay que hacer esto si no hay líneas pendientes de enviar el correo del CSV y si además '// hoy no se envió ningún email con CSV (esto sirve para evitar problemas cuando se lanzan estos métodos '// manualmente, desde los botones rojos del Depurador, por ejemplo) 'If nLineasPendientesCorreoCsv = 0 AndAlso Not YaSeEnvióCsvParaHoy(bd) Then ' resultadoGuardarCambios = 0 ' Dim idTipoGestionNoCSV As String = bd.enumeraciones.First(Function(x) x.Codigo = "TGP.NOCSVAXA").idEnumeracion ' '// Hacerlo solamente si no existe una línea en `gestionesvarias` de tipo "TGP.NOCSVAXA" con fecha de procesado dAyer ' If bd.gestionesvarias.Where(Function(x) x.idTipo = idTipoGestionNoCSV AndAlso Not (x.FechaProcesado.Value > dAyer AndAlso x.FechaProcesado.Value < dHoy)).Count = 0 Then ' Dim listaEnumeraciones As List(Of bdGestionAsegasa.enumeraciones) = bd.enumeraciones.Where(Function(x) x.Codigo.StartsWith("AXATRACTORES.emailnocsv.")).ToList() ' Dim listaDestinatarios As List(Of String) = listaEnumeraciones.Where(Function(x) x.Codigo.StartsWith("AXATRACTORES.emailnocsv.destinatario")).Select(Function(x) x.ValorAlfabeticoLargo.Trim()).ToList() ' Dim remitente As String = listaEnumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.emailnocsv.remitente").ValorAlfabeticoLargo.Trim() ' Dim direccionRespuesta As String = listaEnumeraciones.Where(Function(x) x.Codigo = "AXATRACTORES.emailnocsv.direccionResp").Select(Function(x) x.ValorAlfabeticoLargo).FirstOrDefault().Trim() ' Dim asunto As String = String.Format("{0} {1}", ' listaEnumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.emailnocsv.asunto").ValorAlfabeticoLargo.Trim(), ' dAyer.ToString("yyyy-MM-dd")) ' Dim cuerpo As String = String.Format("{0} {1} {2}", ' listaEnumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.emailnocsv.cuerpo1").ValorAlfabeticoLargo.Trim(), ' dAyer.ToString("yyyy-MM-dd"), ' listaEnumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.emailnocsv.cuerpo2").ValorAlfabeticoLargo.Trim()) ' Dim sDescripcion As String = String.Format("{0} {1}", ' bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.DescripcionEmailNoTractores").ValorAlfabeticoLargo, ' dAyer.ToString("yyyy-MM-dd")) ' Dim nuevaGestionVaria As New bdGestionAsegasa.gestionesvarias With { ' .FechaCreacion = Now, ' .idTipo = idTipoGestionNoCSV, ' .Descripción = sDescripcion ' } ' bd.gestionesvarias.AddObject(nuevaGestionVaria) ' ' Enviar el correo (bueno, en realidad guardarlo en la BD para que se envíe) ' Dim cuentaCorreo As bdGestionAsegasa.cuentascorreo = bd.cuentascorreo.First(Function(x) x.Codigo = "CSVAXA") ' For Each destinatario In listaDestinatarios ' bdGestionAsegasa.correos.GeneraRegistroCorreo(bd, asunto, cuerpo, cuentaCorreo, destinatario) ' Next ' ' Marcar email como enviado. Si no ha dado excepción hasta aquí, significa que ya está en la tabla de salida de correos. ' nuevaGestionVaria.FechaProcesado = Now ' If Not danmundebug Then resultadoGuardarCambios += bd.GuardarCambios() ' System.Diagnostics.Debug.WriteLine("Guardada gestión varia NO CSV: " & resultadoGuardarCambios) ' ' Notificación Slack ' If resultadoGuardarCambios > 0 Then ' Try ' Dim mensaje As New Text.StringBuilder ' mensaje.AppendFormat("Se ha generado un email para ASEGASA indicando que no se ha enviado archivo CSV de tractores porque no hay altas en el sistema Asegasa-AXA tractores.```Asunto: {1}{0}Servidor: {2}```", vbCrLf, ' asunto, Environment.MachineName) ' tsl5.Utilidades.EnviarNotificacionSlack(mensaje.ToString, destinatario:="#asegasa", descripcionRemitente:=Reflection.MethodBase.GetCurrentMethod.ToString) ' Catch ex As Exception ' ' Si esta notificación da error no debe pararse el servicio, así que no hago nada. ' End Try ' End If ' End If 'End If Catch ex As Exception System.Diagnostics.Debug.WriteLine("No hay líneas o se produjo excepción.") Call AñadeLog(tsl5.Enumeraciones.TipoLog.Fallo, "En «" & System.Reflection.MethodBase.GetCurrentMethod.ToString & "`", "En método `" & System.Reflection.MethodBase.GetCurrentMethod.ToString & "`. " _ & Environment.MachineName & " " & ex.ToString, ex) End Try Return resultadoGuardarCambios End Function Public Shared Function YaSeEnvióCsvParaAyer(ByVal bd As bdGestionAsegasa.gestionasegasaEntities) As Boolean Dim resultado As Boolean = False Dim idTipoGestionPoliza As String = bd.enumeraciones.First(Function(x) x.Codigo = "TGP.CSVAXA").idEnumeracion Dim idTipoFicheroCSV As String = bd.enumeraciones.First(Function(x) x.Codigo = "TIPFIC.CSVAXA").idEnumeracion Dim dAyer As Date = Today.AddDays(-1) Dim sDescripcion As String = String.Format("{0}{1}.csv", bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.NombreFicheroCSV").ValorAlfabeticoLargo, dAyer.ToString("yyyy-MM-dd")) resultado = bd.gestionesvarias.Any(Function(x) x.idTipo = idTipoGestionPoliza AndAlso x.FechaProcesado.HasValue _ AndAlso x.Descripción = sDescripcion) 'resultado = (From x In bd.gestionesvarias Where x.idTipo = idTipoGestionPoliza AndAlso x.FechaProcesado.HasValue AndAlso x.Descripción = sDescripcion).Count > 0 Return resultado End Function Public Shared Function YaSeEnvióCsvParaHoy(ByVal bd As bdGestionAsegasa.gestionasegasaEntities) As Boolean Dim resultado As Boolean = False Dim idTipoGestionPoliza As String = bd.enumeraciones.First(Function(x) x.Codigo = "TGP.CSVAXA").idEnumeracion Dim idTipoFicheroCSV As String = bd.enumeraciones.First(Function(x) x.Codigo = "TIPFIC.CSVAXA").idEnumeracion Dim sDescripcion As String = String.Format("{0}{1}.csv", bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.NombreFicheroCSV").ValorAlfabeticoLargo, Today.ToString("yyyy-MM-dd")) resultado = bd.gestionesvarias.Any(Function(x) x.idTipo = idTipoGestionPoliza AndAlso x.FechaProcesado.HasValue _ AndAlso x.Descripción = sDescripcion) Return resultado End Function Public Shared Function NumeroDeLineasEnElArchivoCSV(ByVal rutaArchivoCSV As String) As Integer Dim resultado = 0 resultado = IO.File.ReadLines(rutaArchivoCSV).Count() Return resultado End Function ''' ''' Obtiene el siguiente nº de póliza disponible para TractoresAXA. ''' ''' ''' Este parámetro se usa solo para depuración. Sirve para simular cuál es el último nº de póliza usado especificándolo en este parámetro. ''' Devuelve el siguiente nº de póliza disponible ó -1 si no hay ninguno disponible. ''' Para uso en producción es imprescindible evitar usar el segundo parámetro opcional. 'Public Shared Function ObtenerNumeroDePolizaDisponibleTractoresAXA(ByVal bd As bdGestionAsegasa.gestionasegasaEntities, Optional ByVal n As UInteger = 0) As String ' Dim resultado As String = "" ' Dim inicio As bdGestionAsegasa.enumeraciones ' Dim fin As bdGestionAsegasa.enumeraciones ' Dim actual As UInteger = 0 ' Dim bEncontrado As Boolean = False ' Dim enumNumeracion = (From x In bd.enumeraciones Where x.Codigo.StartsWith("AXATRACTORES.numeracion.") AndAlso x.ValorAlfabetico1.ToUpper.Trim = "DISPONIBLE" ' Order By x.Codigo Select x).ToList() ' Dim idRamoTractores As String = (From x In bd.ramos Where x.Codigo = "1-1" Select x.idRamo).FirstOrDefault ' Dim idRamoRemolques As String = (From x In bd.ramos Where x.Codigo = "1-1-1" Select x.idRamo).FirstOrDefault ' ' De todos los posibles rangos, tengo que elegir el más bajo que esté disponible. ' ' Como lo he ordenado por Codigo, al hacerlo así ya estoy eligiendo el más bajo disponible. ' ' Con rango más bajo me refiero al valor que está dentro del código, no a los números del rango en sí. ' ' Formato del código: "AXATRACTORES.numeracion.0000" ' inicio = enumNumeracion.Where(Function(x) x.Codigo.EndsWith(".inicio")).FirstOrDefault ' fin = enumNumeracion.Where(Function(x) x.Codigo.EndsWith(".fin")).FirstOrDefault ' Try ' If n = 0 Then ' actual = (From x In bd.polizassg Where x.NumeroPoliza >= inicio.ValorNumerico1 AndAlso x.NumeroPoliza <= fin.ValorNumerico1 AndAlso ' (x.idRamo = idRamoTractores OrElse x.idRamo = idRamoRemolques) ' Order By x.NumeroPoliza Descending ' Select x.NumeroPoliza Take 10).ToList().FirstOrDefault ' Else ' actual = n ' End If ' Catch ex As Exception ' ' Nada, significa que aún no existe el primero. ' End Try ' If actual = 0 Then ' ' Si "actual" vale 0 significa que es la primera vez y tenemos que usar el primero del rango. ' resultado = inicio.ValorNumerico1 ' bEncontrado = True ' Else ' If actual < inicio.ValorNumerico1 Then ' resultado = inicio.ValorNumerico1 ' bEncontrado = True ' ElseIf actual = fin.ValorNumerico1 Then ' ' Caso en el que hay que pasar a usar el siguiente rango. ' ' Hay que marcar el actual rango como completado. ' inicio.ValorAlfabetico1 = "Usado" ' fin.ValorAlfabetico1 = "Usado" ' bd.GuardarCambios() ' resultado = ObtenerNumeroDePolizaDisponibleTractoresAXA(bd) ' ' Sí, esta es una función recursiva. Está comprobado que esta recursividad funciona adecuadamente según los datos que haya en la base de datos. ' ElseIf actual > fin.ValorNumerico1 Then 'El número final sí lo podemos usar, por eso la comparación se hace con ">". ' resultado = -1 'Significa que ya hemos llegado al límite de asignaciones, no podemos asignar más. ' bEncontrado = True ' ' TODO: Mirar si hay otro rango más? ' Dim asunto As String = "TractoresAXA: Se han acabado los nºs de pólizas reservados para el servicio de TractoresAXA. Todas las altas que se realicen a partir de ahora fallarán hasta que se asignen nuevos rangos." ' Dim cuerpo As String = asunto & vbCrLf & " Hay que avisar a ASEGASA para que gestionen con AXA la asignación de un nuevo rango de nºs de pólizas para este servicio." & vbCrLf & ' "En método `" & System.Reflection.MethodBase.GetCurrentMethod.ToString & "`. " _ ' & vbCrLf & Environment.MachineName ' Call AñadeLog(tsl5.Enumeraciones.TipoLog.Fallo, asunto, cuerpo) ' tsl5.Utilidades.EnviarNotificacionSlack(asunto, destinatario:="#asegasa", descripcionRemitente:=Reflection.MethodBase.GetCurrentMethod.ToString) ' Else ' ' Caso normal, en el que hay que usar el número que sigue, porque seguimos dentro del rango. ' ' ' ' Pero tengo que comprobar que "actual + 1" no esté usado. ¿Cómo lo hago? Bueno, sería mucha ' ' casualidad y mucha mala suerte que dos altas coincidan en el tiempo de tal modo que ambas ' ' pillen el mismo nº de poliza. ' resultado = actual + 1 ' bEncontrado = True ' End If ' End If ' ' TODO: danmun: Lanzar aquí mensajes cuando falten 500, 200, 100, 50, 20, 10, avisando. ' 'If bEncontrado Then ' ' Dim numerosReservadosDisponibles As Integer = ComprobarCuantosNumerosReservadosQuedanDisponibles(actual, inicio, fin) ' ' Dim listaDeLimitesParaEnviarAdvertencias As Integer() = {10, 20, 50, 100, 200, 500} ' ' Dim bAdvertenciaEnviada As Boolean = False ' ' ' La idea es la siguiente: dispongo de un array donde tenemos los límites en los que hay que lanzar la advertencia ' ' ' de que se están gastando los nºs de pólizas reservados para TractoresAXA. El array está ordenado de menor a mayor. ' ' ' Al recorrer el array, compruebo: ¿quedan menos de 10 números disponibles? Si es así, lanzo advertencia y ya no vuelvo ' ' ' a realizar más comprobaciones. Si no es así, compruebo con el siguiente límite, que sería 20. Por lo tanto, es posible ' ' ' completar el recorrido del array sin enviar ninguna advertencia o bien enviando solamente 1. ' ' For Each i In listaDeLimitesParaEnviarAdvertencias ' ' If Not bAdvertenciaEnviada AndAlso numerosReservadosDisponibles < i Then ' ' ' Notificación Slack ' ' Try ' ' Dim asunto As String = String.Format("TractoresAXA: quedan menos de {0} nºs de póliza reservados sin usar.", i) ' ' Dim sbCuerpo As New Text.StringBuilder() ' ' sbCuerpo.AppendFormat("*TractoresAXA*: quedan menos de {1} nºs de póliza reservados sin usar.{0}", vbCrLf, i) ' ' sbCuerpo.AppendLine("Es recomendable avisar a ASEGASA para que gestionen con AXA la asignación de un nuevo rango de nºs de pólizas para este servicio.") ' ' sbCuerpo.AppendFormat("```Próximo nº de póliza que va a ser usado de inmediato: {1}{0}Primer nº del rango actual:{2}{0}Último nº del rango actual: {3}{0}Servidor: {4}```{0}", vbCrLf, ' ' resultado, inicio.ValorNumerico1, fin.ValorNumerico1, Environment.MachineName) ' ' sbCuerpo.AppendFormat("En método `{0}` y en máquina `{1}`.", System.Reflection.MethodBase.GetCurrentMethod.ToString, Environment.MachineName) ' ' Call AñadeLog(tsl5.Enumeraciones.TipoLog.Advertencia, asunto, sbCuerpo.ToString) ' ' tsl5.Utilidades.EnviarNotificacionSlack(sbCuerpo.ToString, destinatario:="#asegasa", descripcionRemitente:=Reflection.MethodBase.GetCurrentMethod.ToString) ' ' Catch ex As Exception ' ' ' Si esta notificación da error no debe pararse el servicio, así que no hago nada. ' ' End Try ' ' bAdvertenciaEnviada = True ' ' End If ' ' Next ' 'End If ' Return resultado 'End Function Private Shared Function ComprobarCuantosNumerosReservadosQuedanDisponibles(ByVal nActual As Integer, ByRef inicio As bdGestionAsegasa.enumeraciones, ByRef fin As bdGestionAsegasa.enumeraciones) As Integer ' TODO: danmun: comprobar que esto funciona bien cuando hay rangos (creo que va a ser que no) Dim resultado As Integer = 0 resultado = Integer.Parse(fin.ValorNumerico1) - nActual Debug.WriteLine("ComprobarCuantosNumerosReservadosQuedanDisponibles = " & resultado) Return resultado End Function Private Shared Function ObtenerTipoDocumentoTractoresAxa(ByVal numeroDocumento As String) As String Dim TipoDI = numeroDocumento.TipoDocumentoIdentidad If TipoDI = tsl5.ValidarDocumentoIdentidad.TiposDocumentosEnum.CIF Then Return "CIF" Else Return "NIF" End If End Function Private Shared Function ObtenerSexoTractoresAxa(ByVal cadenaSexo As String, ByVal bd As bdGestionAsegasa.gestionasegasaEntities) As String Dim resultado As String = bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.sexo.SinInformar").ValorAlfabetico1 Dim axaHombre As String = bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.sexo.Hombre").ValorAlfabetico1 Dim axaMujer As String = bd.enumeraciones.First(Function(x) x.Codigo = "AXATRACTORES.sexo.Mujer").ValorAlfabetico1 Dim idEnumSexoHombre As Integer = bd.enumeraciones.First(Function(x) x.Codigo = "SEXO.HOMBRE").idEnumeracion Dim idEnumSexoMujer As Integer = bd.enumeraciones.First(Function(x) x.Codigo = "SEXO.MUJER").idEnumeracion If cadenaSexo = idEnumSexoHombre Then resultado = axaHombre If cadenaSexo = idEnumSexoMujer Then resultado = axaMujer Return resultado End Function End Class