public OperacionesSalida vincular(OperacionesEntrada operacionesEntrada) { bool ejecutar = true; OperacionesSalida operacionesSalida = new OperacionesSalida(); operacionesSalida.egresos = new List <EgresoSalida>(); operacionesSalida.ingresos = new List <IngresoSalida>(); List <CriterioOrdenamiento> criterioOrdenamientos = operacionesEntrada.criterios; int asignacionesEficaces = 0; int asignacionesParciales = 0; if (operacionesEntrada.ingresos.Count > 0 && operacionesEntrada.egresos.Count > 0) { while (ejecutar) { foreach (var criterio in criterioOrdenamientos) { if (!ejecutar) { break; } asignacionesEficaces = criterio.cantAsignacionesEficaces; setStrategy(criterio); _ordenador.ordenar(operacionesEntrada); if (operacionesEntrada.ingresos.Count > 0 && operacionesEntrada.egresos.Count > 0) { while (asignacionesParciales < asignacionesEficaces && ejecutar) { ejecutar = _criterioVinculacion.asignar(operacionesEntrada, operacionesSalida); asignacionesParciales++; } asignacionesParciales = 0; } } } } return(operacionesSalida); }
public bool asignar(OperacionesEntrada operacionesEntrada, OperacionesSalida operacionesSalida) { double importesAsignados = 0; IngresoEntrada ingresoAnalizar = ListHelper.RemoveAndGetItem(operacionesEntrada.ingresos, 0); //puede romper IngresoSalida ingresoSalida = new IngresoSalida(); ingresoSalida.egresos = new List <int>(); ingresoSalida.idIngreso = ingresoAnalizar.idIngreso; if (operacionesEntrada.ingresos.Count == 0) //si es el ultimo ingreso { double importeEgresosSum = operacionesEntrada.egresos.Sum(x => x.importe); if (importeEgresosSum >= ingresoAnalizar.importe) { EgresoEntrada egresoEntrada = ListHelper.RemoveAndGetItem(operacionesEntrada.egresos, 0); while (egresoEntrada.importe <= (ingresoAnalizar.importe - importesAsignados)) { importesAsignados += egresoEntrada.importe; ingresoSalida.egresos.Add(egresoEntrada.idEgreso); egresoEntrada = ListHelper.RemoveAndGetItem(operacionesEntrada.egresos, 0); } operacionesSalida.ingresos.Add(ingresoSalida); } return(false); } else { if (operacionesEntrada.egresos.Count > 1) { EgresoEntrada egresoEntrada = ListHelper.RemoveAndGetItem(operacionesEntrada.egresos, 0); while (egresoEntrada.importe <= (ingresoAnalizar.importe - importesAsignados)) { if (operacionesEntrada.egresos.Count == 0) //si es el ultimo ingreso { if (egresoEntrada.importe == ingresoAnalizar.importe) { ingresoSalida.egresos.Add(egresoEntrada.idEgreso); } return(false); } else { importesAsignados += egresoEntrada.importe; ingresoSalida.egresos.Add(egresoEntrada.idEgreso); } egresoEntrada = ListHelper.RemoveAndGetItem(operacionesEntrada.egresos, 0); } operacionesSalida.ingresos.Add(ingresoSalida); } else { if (operacionesEntrada.egresos.Count == 0) //si es el ultimo ingreso { return(false); } else { EgresoEntrada egresoEntrada = ListHelper.RemoveAndGetItem(operacionesEntrada.egresos, 0); if (egresoEntrada.importe == ingresoAnalizar.importe) { ingresoSalida.egresos.Add(egresoEntrada.idEgreso); } return(false); } } } return(true); }