예제 #1
0
        /// <summary>
        /// Suma los valores de las casillas cuyas claves de encuentran
        /// en el array de claves pasado como argumento, y almacena el resultado
        /// en la casilla con la clave 'casillaResultado' de la página facilitada
        /// como parámtro.
        /// </summary>
        /// <param name="casillasBase">Array con las claves de las casillas a acumular.</param>
        /// <param name="casillaResultado">Clave de la casilla dónde irá el resultado
        /// de la suma.</param>
        /// <param name="modPagina">Página de las casillas.</param>
        private void AcumulaCasillas(string[] casillasBase, string casillaResultado, IPagina modPagina)
        {
            decimal suma = 0;

            foreach (var clave in casillasBase)
            {
                suma += Convert.ToDecimal(modPagina[clave]?.Valor);
            }

            if (Convert.ToDecimal(modPagina[casillaResultado]?.Valor) == 0)
            {
                modPagina[casillaResultado].Valor = suma;
            }
        }
예제 #2
0
        /// <summary>
        /// En caso de que la declaración sea a devolver realiza las operaciones necesarias.
        /// </summary>
        protected override void PreparaDevolucion()
        {
            IPagina modPagina1 = RecuperaPagina(1, 0, false) as IPagina;
            IPagina modPagina3 = RecuperaPagina(3, 0, false) as IPagina;

            if (modPagina3 == null)
            {
                throw new ArgumentException($"Se ha seleccionado devolución ('D') como tipo de declaración y no se ha proporcionado IBAN");
            }

            if ($"{modPagina3["IBAN"].Valor}".Trim() == "")
            {
                throw new ArgumentException($"Se ha seleccionado devolución ('D') como tipo de declaración y no se ha proporcionado IBAN");
            }

            modPagina3["DevolucionMarcaSEPA"].Valor = 1;
        }
예제 #3
0
        /// <summary>
        /// Actualiza el valor de todos los campos calculados.
        /// </summary>
        public override void Calcular()
        {
            IPagina modPagina1 = RecuperaPagina(1, 0, false) as IPagina;
            IPagina modPagina2 = RecuperaPagina(2, 0, false) as IPagina;
            IPagina modPagina3 = RecuperaPagina(3, 0, true) as IPagina; // Si no existe la crea

            // Último perido no válido valor 0 (establecemos por defecto el valor 2, no exonerado de 390)
            if ($"{modPagina1["Periodo"].Valor}" == "4T" || $"{modPagina1["Periodo"].Valor}" == "12")
            {
                if ($"{modPagina1["Exonerado390"].Valor}" == "0")
                {
                    modPagina1["Exonerado390"].Valor = 2; // (1=SI, 2=NO)
                }
            }
            // Me aseguro de informar los tipos necesarios.

            int[] clavesCuota = new int[] { 3, 6, 9, 21, 24 };
            decimal[] tipos   = new decimal[] { 4m, 10m, 21m, 1.4m, 5.2m };

            for (int k = 0; k < clavesCuota.Length; k++)
            {
                string claveCuota = $"{clavesCuota[k]}".PadLeft(2, '0');
                string claveTipo  = $"{clavesCuota[k] - 1}".PadLeft(2, '0');

                if (Convert.ToDecimal(modPagina1[claveCuota]?.Valor) != 0 &&
                    Convert.ToDecimal(modPagina1[claveTipo]?.Valor) == 0)
                {
                    modPagina1[claveTipo].Valor = tipos[k];
                }
            }


            string[] clavesASumar = null;

            // Total cuota devengada ( [03] + [06] + [09] + [11] + [13] + [15] + [18] + [21] + [24] + [26] )

            clavesASumar = new string[] { "03", "06", "09", "11", "13", "15", "18", "21", "24", "26" };

            AcumulaCasillas(clavesASumar, "27", modPagina1);


            // Total a deducir ( [29] + [31] + [33] + [35] + [37] + [39] + [41] + [42] + [43] + [44] )

            clavesASumar = new string[] { "29", "31", "33", "35", "37", "39", "41", "42", "43", "44" };

            AcumulaCasillas(clavesASumar, "45", modPagina1);


            // Resultado régimen general ( [27] - [45] )
            if (Convert.ToDecimal(modPagina1["46"]?.Valor) == 0)
            {
                modPagina1["46"].Valor = Convert.ToDecimal(modPagina1["27"].Valor) - Convert.ToDecimal(modPagina1["45"].Valor);
            }


            // Suma de resultados ( [46] + [58] + [76] )
            if (modPagina3["64"] != null && Convert.ToDecimal(modPagina3["64"]?.Valor) == 0)
            {
                modPagina3["64"].Valor = Convert.ToDecimal(modPagina1["46"].Valor) + ((modPagina2 == null) ? 0 :
                                                                                      Convert.ToDecimal(modPagina2["58"] == null ? 0 : modPagina2["58"].Valor)) +
                                         Convert.ToDecimal(modPagina3["76"] == null ? 0 : modPagina3["76"].Valor);
            }

            // Atribuible a la Administracion del Estado
            if (modPagina3["65"] != null && Convert.ToDecimal(modPagina3["65"]?.Valor) == 0)
            {
                modPagina3["65"].Valor = 100;
            }

            // Atribuible a la Administración del Estado
            if (Convert.ToDecimal(modPagina3["66"]?.Valor) == 0)
            {
                modPagina3["66"].Valor = Math.Round(Convert.ToDecimal(modPagina3["65"].Valor) / 100 *
                                                    Convert.ToDecimal(modPagina3["64"].Valor), 2);
            }

            // Comprobamos si existen cuotas a compensar de periodos anteriores.
            decimal cuotasACompensar = Convert.ToDecimal(modPagina3["110"].Valor);

            if (cuotasACompensar > 0) // Existen cuotas a compensar de periodos anteriores, por lo que calculamos que importe se aplicará en este periodo.
            {
                decimal resultadoPeriodo = Convert.ToDecimal(modPagina3["66"].Valor) + Convert.ToDecimal(modPagina3["77"].Valor) + Convert.ToDecimal(modPagina3["68"].Valor);

                if (Convert.ToDecimal(modPagina3["78"]?.Valor) == 0)
                {
                    if (resultadoPeriodo <= 0)
                    {
                        modPagina3["78"].Valor = 0;
                    }
                    else if (resultadoPeriodo >= cuotasACompensar)
                    {
                        modPagina3["78"].Valor = cuotasACompensar;
                    }
                    else
                    {
                        modPagina3["78"].Valor = resultadoPeriodo;
                    }
                }
            }

            // Cuotas a compensar de periodos previos pendientes para periodos posteriores ([110] - [78]) [87]
            if (Convert.ToDecimal(modPagina3["87"]?.Valor) == 0)
            {
                modPagina3["87"].Valor = Convert.ToDecimal(modPagina3["110"].Valor) - Convert.ToDecimal(modPagina3["78"].Valor);
            }

            // Resultado ( [66] + [77] - [78] + [68] )
            decimal resultado = Convert.ToDecimal(modPagina3["66"].Valor) +
                                Convert.ToDecimal(modPagina3["77"].Valor) -
                                Convert.ToDecimal(modPagina3["78"].Valor) +
                                Convert.ToDecimal(modPagina3["68"].Valor);

            if (Convert.ToDecimal(modPagina3["69"]?.Valor) == 0)
            {
                modPagina3["69"].Valor = resultado;
            }

            // Resultado de la liquidación ( [69] - [70] ) [71]
            if (Convert.ToDecimal(modPagina3["71"]?.Valor) == 0)
            {
                modPagina3["71"].Valor = Convert.ToDecimal(modPagina3["69"].Valor) - Convert.ToDecimal(modPagina3["70"].Valor);
            }

            // Verificaciones tipo declaración
            if ($"{modPagina1["TipoDeclaracion"].Valor}" == "D")
            {
                PreparaDevolucion();
            }

            Paginas.Empaquetables.Sort(); // Ordenamos las páginas para evitar problemas indeseados.
        }
예제 #4
0
 public MenuPaginas(IPagina Principal,IPagina Settings)
 {
     principal = Principal;
     settings = Settings;
 }