private void contabilidad_asientosAjuste(dbContab_Contab_Entities context, int cuentaContableID, int moneda, short ano, int ciaSeleccionada, out bool error, out string message)
        {
            error   = false;
            message = "";

            // asientos
            string queryString =
                $"Select d.NumeroAutomatico as numeroAutomatico, Sum(d.Debe) as sumOfDebe, Sum(d.Haber) as sumOfHaber, " +
                "Sum(d.Debe) - Sum(d.Haber) as diferencia, Max(d.Partida) as ultimaPartida " +
                "From dAsientos d Inner Join Asientos a On d.NumeroAutomatico = a.NumeroAutomatico " +
                "Where a.AnoFiscal = {0} And a.Moneda = {1} And a.Cia = {2} " +
                "Group By d.NumeroAutomatico " +
                "Having Sum(d.Debe) <> Sum(d.Haber) ";

            List <asiento_sumarizacion> query = context.ExecuteStoreQuery <asiento_sumarizacion>(queryString, ano, moneda, ciaSeleccionada).ToList();
            dAsiento partida;

            int asientosContablesAjustados = 0;

            foreach (asiento_sumarizacion p in query)
            {
                partida = new dAsiento();

                partida.NumeroAutomatico = p.numeroAutomatico;
                partida.Partida          = Convert.ToInt16(p.ultimaPartida + 10);
                partida.CuentaContableID = cuentaContableID;
                partida.Descripcion      = "Reconversión (2018) - ajuste al asiento contable";
                partida.Referencia       = null;
                partida.Debe             = p.diferencia <= 0 ? Math.Abs(p.diferencia) : 0;
                partida.Haber            = p.diferencia > 0 ? Math.Abs(p.diferencia) : 0;

                context.dAsientos.AddObject(partida);
                asientosContablesAjustados++;
            }

            try
            {
                context.SaveChanges();
            }
            catch (Exception ex)
            {
                error   = true;
                message = "Ha ocurrido un error al intentar ejecutar una operación de acceso a la base de datos. <br /> " +
                          "El mensaje específico de error es: " + ex.Message + "<br /><br />";

                context.Dispose();

                return;
            }

            context.Dispose();

            message = $"<h3>Asientos contables - ajuste contra cuenta de reconversión</h3><br />" +
                      $"Ok, El proceso ha finalizado en forma satisfactoria.<br /><br />" +
                      $"En total, se han actualizado: {asientosContablesAjustados.ToString()} asientos contables, para ajustarlos y <em>cuadrarlos</em> a cero. ";

            return;
        }
Esempio n. 2
0
        public bool CopiarAsientosContables(string filter, string filter_subQuery,
                                            string userName, int ciaTarget, string multiplicarPor_textBox,
                                            string dividirPor_textBox, out int cantidadAsientosCopiados, out string errorMessage)
        {
            errorMessage             = "";
            cantidadAsientosCopiados = 0;

            // sabemos que ambos controles, si tienen un valor, debe ser numérico; nota: también pueden venir vacíos ...
            double multiplicarPor = multiplicarPor_textBox.Trim() != "" ? Convert.ToDouble(multiplicarPor_textBox) : 1;
            double dividirPor     = dividirPor_textBox.Trim() != "" ? Convert.ToDouble(dividirPor_textBox) : 1;

            string filtroAsientosContables = "";

            if (filter_subQuery == null || filter_subQuery == "1 = 1")
            {
                // el usuario no usó criterio por cuenta contable o más de 2 decimales; no usamos sub-query
                filtroAsientosContables = filter;
            }
            else
            {
                // si el usuario indica cuentas contables en su filtro, debemos hacer un subquery para que el resultado final
                // solo incluya asientos que las tengan ...
                filtroAsientosContables = filter +
                                          " And (Asientos.NumeroAutomatico In (SELECT Asientos.NumeroAutomatico FROM Asientos " +
                                          "Left Outer Join dAsientos On Asientos.NumeroAutomatico = dAsientos.NumeroAutomatico " +
                                          "Left Outer Join CuentasContables On CuentasContables.ID = dAsientos.CuentaContableID " +
                                          "Where " + filter + " And " + filter_subQuery + "))";
            }

            // como el filtro viene para Sql, y no para linq to entities, intentamos leer los asientos usando Sql ...
            var query = _context.ExecuteStoreQuery <Asiento>("Select * from Asientos Where" + filtroAsientosContables + " Order By Asientos.Fecha, Asientos.Numero");

            int mesAnterior = -99;
            int anoAnterior = -99;

            short mesFiscal = 0;
            short anoFiscal = 0;

            Asiento  asiento;
            dAsiento partida;

            foreach (Asiento a in query)
            {
                if (mesAnterior != a.Fecha.Month || anoAnterior != a.Fecha.Year)
                {
                    // para cada mes diferente, validamos que el mes no esté cerrado en la compañía 'target' ...
                    if (!ValidarMesCerradoEnContab(a.Fecha, ciaTarget, out mesFiscal, out anoFiscal, out errorMessage))
                    {
                        return(false);
                    }

                    mesAnterior = a.Fecha.Month;
                    anoAnterior = a.Fecha.Year;
                }

                // determinamos un número para el asiento contable en ciaTarget ...
                short numeroAsientoContab = 0;

                if (!ObtenerNumeroAsientoContab(a.Fecha, ciaTarget, a.Tipo, out numeroAsientoContab, out errorMessage))
                {
                    return(false);
                }

                asiento = new Asiento();

                asiento.Mes                        = a.Mes;
                asiento.Ano                        = a.Ano;
                asiento.Numero                     = numeroAsientoContab;
                asiento.Fecha                      = a.Fecha;
                asiento.Tipo                       = a.Tipo;
                asiento.Descripcion                = a.Descripcion;
                asiento.Moneda                     = a.Moneda;
                asiento.MonedaOriginal             = a.MonedaOriginal;
                asiento.ConvertirFlag              = a.ConvertirFlag;
                asiento.FactorDeCambio             = a.FactorDeCambio;
                asiento.ProvieneDe                 = a.ProvieneDe;
                asiento.Ingreso                    = DateTime.Now;
                asiento.UltAct                     = DateTime.Now;
                asiento.CopiableFlag               = a.CopiableFlag;
                asiento.AsientoTipoCierreAnualFlag = false;         // nótese como nunca asumimos que un asiento de cierre anual lo es también en Cia Target ...
                asiento.MesFiscal                  = mesFiscal;
                asiento.AnoFiscal                  = anoFiscal;
                asiento.Usuario                    = userName;
                asiento.Cia                        = ciaTarget;

                // leemos las partidas del asiento y las copiamos al nuevo ...
                var partidas = _context.dAsientos.Where(p => p.NumeroAutomatico == a.NumeroAutomatico).OrderBy(p => p.Partida);

                foreach (dAsiento p in partidas)
                {
                    partida = new dAsiento();

                    // para cada cuenta contable, debemos buscar una idéntica en la compañía target ...
                    int?cuentaContableCiaTarget = _context.CuentasContables.Where(c => c.Cuenta == p.CuentasContable.Cuenta).
                                                  Where(c => c.Cia == ciaTarget).
                                                  Select(c => c.ID).
                                                  FirstOrDefault();

                    if (cuentaContableCiaTarget == null || cuentaContableCiaTarget == 0)
                    {
                        errorMessage = "<b>Error:</b> no hemos podido leer la cuenta contable '" + p.CuentasContable.Cuenta + "' en la compañía indicada.";
                        return(false);
                    }

                    partida.Partida          = p.Partida;
                    partida.CuentaContableID = cuentaContableCiaTarget.Value;
                    partida.Descripcion      = p.Descripcion;
                    partida.Referencia       = p.Referencia;

                    // multiplicamos y dividimos por lo montos que indique el usuario; nota: si no indica estos montos, usamos 1 ...
                    partida.Debe  = Convert.ToDecimal((Convert.ToDouble(p.Debe) * multiplicarPor) / dividirPor);
                    partida.Haber = Convert.ToDecimal((Convert.ToDouble(p.Haber) * multiplicarPor) / dividirPor);

                    asiento.dAsientos.Add(partida);
                }

                _context.Asientos.AddObject(asiento);
                cantidadAsientosCopiados++;
            }

            try
            {
                _context.SaveChanges();
            }
            catch (Exception ex)
            {
                errorMessage = "<b>Error:</b> hemos obtenido un error al intentar efectuar una operación en la " +
                               "base de datos.<br /><br />" +
                               "El mensaje específico de error es: <br /><br />" + ex.Message;

                if (ex.InnerException != null)
                {
                    errorMessage += "<br />" + ex.InnerException.Message;
                }

                return(false);
            }
            finally
            {
                _context = null;
            }

            return(true);
        }