public static IEnumerable <T> Where <T>(this IEnumerable <T> items, Predicado <T> filtro) { foreach (T x in items) { if (filtro(x)) { yield return(x); } } }
public List <T> AplicarReglasContratoCobertura(out List <MensajeConfiguracionRegla> listaMensajes, int convenio = 0, int aplicacion = 0, int plataforma = 0) { listaMensajes = new List <MensajeConfiguracionRegla>(); if (!puedeAplicarRegla) { listaMensajes.Add(new MensajeConfiguracionRegla { Codigo = "NO_PUEDE_APLICAR", Mensaje = "No se puede aplicar la regla" }); return(null); } // lista de respaldo var listaContratoOriginal = _listaContratos.Clonar(); try { _listaReglas = Predicado.ObtenerReglasCandidatas(_listaReglas, convenio, aplicacion, plataforma); if (_listaReglas.IsNullOrEmpty()) { listaMensajes.Add(new MensajeConfiguracionRegla { Codigo = "LISTA_REGLAS_VACIA", Mensaje = "Lista de reglas vacia" }); return(_listaContratos.DeserializarGenerico <T>()); } // Creación de constructores para Contrato - Beneficiario - BeneficioPlan var constructorContrato = new GestorReglaConstructorContrato(new Contrato()); var constructorBeneficiario = new GestorReglaConstructorBeneficiario(new Beneficiario()); var constructorBeneficioPlan = new GestorReglaConstructorBeneficioPlan(new BeneficiosPlan()); //Variables auxiliares var modificarBeneficiario = false; var modificarContrato = false; foreach (var regla in _listaReglas) { try { var contratosCandidatos = Predicado.ObtenerContratosCandidatos(_listaContratos, regla, out var listaMensajesContrato); if (contratosCandidatos.IsNullOrEmpty()) { listaMensajes.AddRange(listaMensajesContrato); throw new Exception(); } foreach (var contrato in contratosCandidatos) { if (regla.Entrada.EntradaBeneficiario.IsNotNull()) { regla.Entrada.EntradaBeneficiario.DeducibleTotal = contrato.DeducibleTotal; } var beneficiariosCandidatos = Predicado.ObtenerBeneficiariosCandidatos(contrato.Beneficiarios, regla, out var listaMensajesBeneficiarios); if (beneficiariosCandidatos.IsNull()) { listaMensajes.AddRange(listaMensajesBeneficiarios); continue; } foreach (var beneficiario in beneficiariosCandidatos) { if (regla.Entrada.EntradaBeneficios.IsNotNullOrEmpty()) { modificarBeneficiario = false; foreach (var reglaBeneficio in regla.Entrada.EntradaBeneficios) { var beneficiosPlanCandidatos = Predicado.ObtenerBeneficiosPlanCandidatos(beneficiario.BeneficiosPlan, reglaBeneficio.EntradaBeneficioPlan); foreach (var beneficioPlan in beneficiosPlanCandidatos) { modificarBeneficiario = true; if (reglaBeneficio.SalidaBeneficioPlan.IsNotNullOrEmpty()) { constructorBeneficioPlan.IncorporarBeneficioPlan(beneficioPlan); constructorBeneficioPlan.AplicarRegla(reglaBeneficio.SalidaBeneficioPlan); } } } } else { if (regla.Salida.IsNotNull() && regla.Salida.SalidaBeneficiario.IsNotNullOrEmpty()) { constructorBeneficiario.IncorporarBeneficiario(beneficiario); constructorBeneficiario.AplicarRegla(regla.Salida.SalidaBeneficiario); } modificarContrato = true; } if (modificarBeneficiario) { if (regla.Salida.IsNotNull() && regla.Salida.SalidaBeneficiario.IsNotNullOrEmpty()) { constructorBeneficiario.IncorporarBeneficiario(beneficiario); constructorBeneficiario.AplicarRegla(regla.Salida.SalidaBeneficiario); } modificarContrato = true; } } if (beneficiariosCandidatos.IsNullOrEmpty() || modificarContrato && regla.Salida.SalidaContrato.IsNotNullOrEmpty()) { constructorContrato.IncorporarContrato(contrato); constructorContrato.AplicarRegla(regla.Salida.SalidaContrato); } } } catch (Exception) { continue; } } return(_listaContratos.DeserializarGenerico <T>()); } catch (Exception) { return(listaContratoOriginal.DeserializarGenerico <T>()); } }