public void AcumulaMontoDe(Retencion other) { NUMPAGOS += other.NUMPAGOS; MONTO += other.MONTO; MONTO_IVA += other.MONTO_IVA; MONTO_IVARET += other.MONTO_IVARET; MONTO_ISRRET += other.MONTO_ISRRET; MESDEPOSITO_INI = Math.Min(MESDEPOSITO_INI, other.MESDEPOSITO_INI); MESDEPOSITO_FIN = Math.Max(MESDEPOSITO_FIN, other.MESDEPOSITO_FIN); }
public static List <Retencion> calcRetencionesMensuales(string IDSIU, string SEDE, string PERIODO, string CVE_NIVEL, int ANIO) { database db = new database(); string sql = "SELECT CVE_SEDE, NUMPAGOS, MONTO, MONTO_IVA, MONTO_IVARET, MONTO_ISRRET, TIPOTRANSFERENCIA, TIPODEPAGO, MESDEPOSITO, ANIODEPOSITO, ID_ESTADODECUENTA, PADRE" + " FROM VESTADO_CUENTA" + " WHERE IDSIU='" + IDSIU + "' AND CVE_SEDE='" + SEDE + "' AND ANIODEPOSITO=" + ANIO + " AND (FECHADEPOSITO IS NOT NULL)"; if (string.IsNullOrWhiteSpace(PERIODO) == false) { sql += " AND PERIODO='" + PERIODO + "'"; } if (string.IsNullOrWhiteSpace(CVE_NIVEL) == false) { sql += " AND CVE_NIVEL='" + CVE_NIVEL + "'"; } sql += " ORDER BY MESDEPOSITO"; ResultSet res = db.getTable(sql); // Paso 1. Se leen todas las retenciones. List <Retencion> todas = new List <Retencion>(); while (res.Next()) { todas.Add(new Retencion(res)); } // Paso 2. Extrae los elementos 'padre' y ordenalos por mes List <Retencion> listPadres = todas.FindAll(x => x.PADRE == 0).OrderBy(x => x.MESDEPOSITO).ToList(); // Paso 4. Estrae los elementos 'hijo' List <Retencion> listHijos = todas.FindAll(x => x.PADRE != 0); foreach (Retencion padre in listPadres) { long YO = padre.ID_ESTADODECUENTA; List <Retencion> misHijos = listHijos.FindAll(x => x.PADRE == YO); foreach (Retencion miHijo in misHijos) { padre.AcumulaMontoDe(miHijo); } } List <int> meses = new List <int>(); foreach (Retencion padre in listPadres) { if (meses.Contains(padre.MESDEPOSITO) == false) { meses.Add(padre.MESDEPOSITO); } } meses = meses.OrderBy(x => x).ToList(); List <Retencion> listRetenciones = new List <Retencion>(); foreach (int mes in meses) { // Busca todas las retenciones de ese mes. List <Retencion> rets_x_mes = listPadres.FindAll(x => x.MESDEPOSITO == mes); // Extrae la primera retencion Retencion acumulado = rets_x_mes[0]; // Acumula las subsecuentes retenciones; rets_x_mes.RemoveAt(0); foreach (Retencion item in rets_x_mes) { acumulado.AcumulaMontoDe(item); } listRetenciones.Add(acumulado); } return(listRetenciones); }