/// <summary> /// Inserta todos los registros indicados en la tabla [ReciboPago] e indica la cantidad de registros validados, no validados /// y duplicados. /// </summary> /// <param name="registros">La lista de registros a insertar.</param> /// <param name="validados">Guarda la cantidad de registros que fueron validados.</param> /// <param name="sinValidar">Guarda la cantidad de registros que no fueron validados.</param> /// <param name="duplicados">Guarda la cantidad de registros que ya existían en la BD y por lo tanto no fueron insertados.</param> public static void InsertarRegistrosEnDB(IEnumerable <ReciboPago> registros, ref int validados, ref int sinValidar, ref int duplicados) { using (var db = new SCVEntities()) using (var transaction = db.Database.BeginTransaction()) { db.Configuration.EnsureTransactionsForFunctionsAndCommands = false; try { foreach (var registro in registros) { bool validado = false; string referencia = null; int longitudReferenciaRequerida = 5; // Nos aseguramos de que el registro no haya sido insertado previamente en la base de datos. // Se compara la Fecha, el Monto, la Referencia 1 y la Referencia 2 bool registroExistente = db.ReciboPago.Any(rp => rp.Fecha == registro.Fecha && rp.Monto == registro.Monto && rp.Referencia1 == registro.Referencia1 && rp.Referencia2 == registro.Referencia2); if (!registroExistente) { // Buscamos en la tabla [Referencia_Fovi] por medio de las dos referencias del registro bool existeReferencia1 = !string.IsNullOrWhiteSpace(registro.Referencia1) && // No se aceptan referencias inexistentes... registro.Referencia1.Length >= longitudReferenciaRequerida && // ... ni cuya longitud sea menor a 5 (valor arbitrario; puede ser modificado) db.Referencia_Fovi .Any(rf => rf.No_Referencia.Contains(registro.Referencia1) && rf.Estatus_Pago == "0"); if (existeReferencia1) { validado = true; referencia = registro.Referencia1; } else { bool existeReferencia2 = !string.IsNullOrWhiteSpace(registro.Referencia2) && registro.Referencia2.Length >= longitudReferenciaRequerida && db.Referencia_Fovi .Any(rf => rf.No_Referencia.Contains(registro.Referencia2) && rf.Estatus_Pago == "0"); if (existeReferencia2) { validado = true; referencia = registro.Referencia2; } } // Agregamos los registros encontrados por su número de referencia y su prima total calculada. if (validado) { var calculado = db.CalcularPrimaTotalPorReferencia(referencia).FirstOrDefault(); // Si la prima total calculada es igual al monto del registro, actualizamos tablas [Referencia_Fovi] y [ReciboPago] if (calculado != null && calculado.PrimaTotal == registro.Monto) { db.UpdPagoReferenFoviDate(calculado.NoReferencia, "proceso", registro.FechaProceso); registro.Validado = true; // Agregamos el RFC, el código de ramo y el número de póliza obtenidos de [Poliza_Factura] var polizaFactura = db.Poliza_Factura .Where(pf => pf.Cod_ramo == "102" && pf.TipoPoliza == "10" && pf.RFC == db.Referencia_Fovi.FirstOrDefault(rf => rf.No_Referencia == calculado.NoReferencia).User_Reg) .ToList(); if (polizaFactura.Count > 0) { var numerosPoliza = polizaFactura.Select(pf => pf.nro_pol); registro.RFC = polizaFactura[0].RFC; registro.CodRamoNroPol = $"{polizaFactura[0].Cod_ramo}-[{string.Join(",", numerosPoliza)}]"; } validados++; } else { sinValidar++; } } else { sinValidar++; } db.ReciboPago.Add(registro); } else { duplicados++; } } db.SaveChanges(); transaction.Commit(); } catch { transaction.Rollback(); throw; } } }
/// <summary> /// Actualiza la referencia del registro indicado y regresa un mensaje /// con el resultado de la operación. /// </summary> /// <param name="nuevaReferencia">El valor de la nueva referencia.</param> /// <param name="idRecibo">El Id del recibo a actualizar.</param> /// <returns>Un mensaje con el resultado de la actualización.</returns> public static Message ActualizarReferenciaExistente(string nuevaReferencia, int?idRecibo) { if (string.IsNullOrWhiteSpace(nuevaReferencia)) { return(new Message(false, "Debe ingresar la nueva referencia.")); } using (var db = new SCVEntities()) { db.Configuration.EnsureTransactionsForFunctionsAndCommands = false; if (!db.ReciboPago.Any(rp => rp.Id == idRecibo)) { return(new Message(false, $"El recibo de pago con Id = {idRecibo?.ToString() ?? "NULL"} no existe. Por favor, verifique de nuevo.")); } using (var transaction = db.Database.BeginTransaction()) { try { var reciboPago = db.ReciboPago.Find(idRecibo); reciboPago.Referencia1 = nuevaReferencia; bool validado = false; string referencia = null; int longitudReferenciaRequerida = 5; // Buscamos en la tabla [Referencia_Fovi] por medio de las dos referencias del registro bool existeReferencia1 = !string.IsNullOrWhiteSpace(reciboPago.Referencia1) && // No se aceptan referencias inexistentes... reciboPago.Referencia1.Length >= longitudReferenciaRequerida && // ... ni cuya longitud sea menor a 5 (valor arbitrario; puede ser modificado) db.Referencia_Fovi .Any(rf => rf.No_Referencia.Contains(reciboPago.Referencia1) && rf.Estatus_Pago == "0"); if (existeReferencia1) { validado = true; referencia = reciboPago.Referencia1; } else { bool existeReferencia2 = !string.IsNullOrWhiteSpace(reciboPago.Referencia2) && reciboPago.Referencia2.Length >= longitudReferenciaRequerida && db.Referencia_Fovi .Any(rf => rf.No_Referencia.Contains(reciboPago.Referencia2) && rf.Estatus_Pago == "0"); if (existeReferencia2) { validado = true; referencia = reciboPago.Referencia2; } } // Si no se encuentra la nueva referencia, cancelar la actualización. if (!validado) { transaction.Rollback(); return(new Message(false, $"El registro no fue actualizado debido a que no se encontró la referencia indicada.")); } // Verificamos que coincidan los montos del registro y de la prima total. var calculado = db.CalcularPrimaTotalPorReferencia(referencia).FirstOrDefault(); if (calculado != null && calculado.PrimaTotal == reciboPago.Monto) { db.UpdPagoReferenFoviDate(calculado.NoReferencia, "proceso", reciboPago.FechaProceso); reciboPago.Validado = true; // Agregamos el RFC, el código de ramo y el número de póliza obtenidos de [Poliza_Factura] var polizaFactura = db.Poliza_Factura .Where(pf => pf.Cod_ramo == "102" && pf.TipoPoliza == "10" && pf.RFC == db.Referencia_Fovi.FirstOrDefault(rf => rf.No_Referencia == calculado.NoReferencia).User_Reg) .ToList(); if (polizaFactura.Count > 0) { var numerosPoliza = polizaFactura.Select(pf => pf.nro_pol); reciboPago.RFC = polizaFactura[0].RFC; reciboPago.CodRamoNroPol = $"{polizaFactura[0].Cod_ramo}-[{string.Join(",", numerosPoliza)}]"; } db.SaveChanges(); transaction.Commit(); return(new Message(true, "La referencia se ha actualizado con éxito.")); } else { transaction.Rollback(); return(new Message(false, "El registro no fue actualizado debido a que la prima total no coincide con el monto registrado de la referencia indicada.")); } } catch (Exception e) { transaction.Rollback(); return(new Message(false, $"Ocurrió un error al actualizar la referencia de este registro.\nERROR: <pre>{e}</pre>")); } } } }