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