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);
        }