//Queda pendiente crear este mismo metodo pero generico para reutilizar. //public static List<ObjCartolaYVouchers> ConvertirAObjetoCartola(HttpPostedFileBase file) //{ // List<ObjCartolaYVouchers> ReturnValues = new List<ObjCartolaYVouchers>(); // if (file == null || file.ContentLength == 0) // { // string Error = "Error Excel Vacio"; // } // else // { // if (file.FileName.EndsWith("xls") || file.FileName.EndsWith("xlsx")) // { // string path = ParseExtensions.Get_Temp_path(file.FileName); // Le indicamos la ruta donde guardará el excel. // if (File.Exists(path)) // { // File.Delete(path); //Si ya existe lo elimina. // } // file.SaveAs(path); //Guardamos momentaneamente el fichero. -> La idea es extraer su información y luego eliminarlo. // Application application = new Application(); // Workbook workBook = application.Workbooks.Open(path); // Worksheet worksheet = workBook.ActiveSheet; // Range range = worksheet.UsedRange; // for (int row = 2; row <= range.Rows.Count; row++) // { // ObjCartolaYVouchers FilaAGuardar = new ObjCartolaYVouchers(); // FilaAGuardar.Fecha = ParseExtensions.ToDD_MM_AAAA_Multi(((Range)range.Cells[row, 1]).Text); // FilaAGuardar.Docum = Convert.ToInt32(((Range)range.Cells[row, 2]).Text); // FilaAGuardar.Detalle = ((Range)range.Cells[row, 3]).Text; // FilaAGuardar.Debe = decimal.Parse(((Range)range.Cells[row, 4]).Text); // FilaAGuardar.Haber = decimal.Parse(((Range)range.Cells[row, 5]).Text); // FilaAGuardar.Saldo = decimal.Parse(((Range)range.Cells[row, 6]).Text); // //Parte del voucher // FilaAGuardar.CodigoInterno = ((Range)range.Cells[row, 7]).Text; // FilaAGuardar.Rut = ((Range)range.Cells[row, 8]).Text; // FilaAGuardar.Glosa = ((Range)range.Cells[row, 9]).Text; // ReturnValues.Add(FilaAGuardar); // } // workBook.Close(); // File.Delete(path); // } // } // return ReturnValues; //} public static Tuple <bool, List <ObjCartolaYVouchers> > ConvertirAVoucher(List <ObjCartolaYVouchers> LstCartolaYVouchers, ClientesContablesModel ObjCliente, FacturaPoliContext db, CuentaContableModel CuentaConsultada, string FechaCartola, int NumeroCartola) { bool Result = false; List <ObjCartolaYVouchers> LosQueNoPudieronInsertarse = new List <ObjCartolaYVouchers>(); List <ObjCartolaYVouchers> LosQueTienenInformacion = LstCartolaYVouchers.Where(x => !string.IsNullOrWhiteSpace(x.CodigoInterno)).ToList(); if (!LosQueTienenInformacion.Any()) { throw new Exception("No hay registros validos para insertar."); } //Los que están en la cartola pero no en el mayor... List <ObjCartolaYVouchers> Pendientes = LstCartolaYVouchers.Where(x => string.IsNullOrWhiteSpace(x.CodigoInterno)).ToList(); LosQueNoPudieronInsertarse.AddRange(Pendientes); List <CartolaBancariaModel> CartolaCompleta = new List <CartolaBancariaModel>(); if (LstCartolaYVouchers.Any()) { db.Configuration.AutoDetectChangesEnabled = false; //revisar como mejora la performance DateTime FechaConvertida = ParseExtensions.ToDD_MM_AAAA_Multi(FechaCartola); DeleteCartolaBancariaExistente(FechaConvertida, NumeroCartola, db, ObjCliente); List <CartolaBancariaModel> CartolaDetalle = new List <CartolaBancariaModel>(); DateTime Fecha = LosQueTienenInformacion.FirstOrDefault().Fecha; int? nullableProxVoucherNumber = ParseExtensions.GetNumVoucher(ObjCliente, db, Fecha.Month, Fecha.Year); int baseNumberFolio = nullableProxVoucherNumber.Value; List <VoucherModel> LstVoucher = new List <VoucherModel>(); foreach (ObjCartolaYVouchers itemCartola in LosQueTienenInformacion) { CuentaContableModel CuentaAUsar = UtilesContabilidad.CuentaContableDesdeCodInterno(itemCartola.CodigoInterno, ObjCliente); QuickReceptorModel Prestador = UtilesContabilidad.ObtenerPrestadorSiExiste(itemCartola.Rut, db, ObjCliente); TipoOrigen TipoPrestador = UtilesContabilidad.RetornaTipoReceptor(Prestador); if (CuentaAUsar == null) { throw new Exception($"La cuenta contable que intentas ingresar no está en el plan de cuentas O no está digitada en el excel CUENTA CONTABLE CON ERROR : {itemCartola.CodigoInterno}"); } if (CuentaAUsar.TieneAuxiliar == 1 && Prestador != null || CuentaAUsar.TieneAuxiliar == 0 && Prestador == null) { VoucherModel CapaVoucher = new VoucherModel(); CapaVoucher.TipoOrigenVoucher = TipoPrestador; CapaVoucher.FechaEmision = itemCartola.Fecha; CapaVoucher.NumeroVoucher = baseNumberFolio; CapaVoucher.NumVoucherWithDate = ParseExtensions.BuildNewFormatNumVoucher(baseNumberFolio, Fecha); CapaVoucher.ClientesContablesModelID = ObjCliente.ClientesContablesModelID; CapaVoucher.Glosa = itemCartola.Glosa; if (itemCartola.Debe > 0 && itemCartola.Haber == 0) { CapaVoucher.Tipo = TipoVoucher.Ingreso; } else if (itemCartola.Haber > 0 && itemCartola.Debe == 0) { CapaVoucher.Tipo = TipoVoucher.Egreso; } //Armamos tabla Detalle Voucher //1 List <DetalleVoucherModel> LstToEvaluate = new List <DetalleVoucherModel>(); DetalleVoucherModel DetalleCartola = new DetalleVoucherModel(); //cada linea es solo 1 monto DetalleCartola.VoucherModelID = CapaVoucher.VoucherModelID; DetalleCartola.ObjCuentaContable = CuentaConsultada; DetalleCartola.FechaDoc = itemCartola.Fecha; DetalleCartola.GlosaDetalle = itemCartola.Glosa; if (itemCartola.Debe > 0 && itemCartola.Haber == 0) { DetalleCartola.MontoDebe = itemCartola.Debe; } else if (itemCartola.Haber > 0 && itemCartola.Debe == 0) { DetalleCartola.MontoHaber = itemCartola.Haber; } //2 DetalleVoucherModel DetalleConciliacion = new DetalleVoucherModel(); DetalleConciliacion.VoucherModelID = CapaVoucher.VoucherModelID; DetalleConciliacion.FechaDoc = itemCartola.Fecha; DetalleConciliacion.ObjCuentaContable = CuentaAUsar; DetalleConciliacion.GlosaDetalle = itemCartola.Glosa; if (DetalleCartola.MontoDebe > 0 && DetalleCartola.MontoHaber == 0) { DetalleConciliacion.MontoHaber = DetalleCartola.MontoDebe; } else if (DetalleCartola.MontoHaber > 0 && DetalleCartola.MontoDebe == 0) { DetalleConciliacion.MontoDebe = DetalleCartola.MontoHaber; } LstToEvaluate.Add(DetalleCartola); LstToEvaluate.Add(DetalleConciliacion); //Guardamos los detalles en una lista de detalles if (LstToEvaluate.Sum(r => r.MontoDebe) == LstToEvaluate.Sum(r => r.MontoHaber)) { foreach (DetalleVoucherModel itemDetalle in LstToEvaluate) { itemDetalle.Conciliado = true; } CapaVoucher.ListaDetalleVoucher = LstToEvaluate; LstVoucher.Add(CapaVoucher); if (CuentaAUsar.TieneAuxiliar == 1 && Prestador != null) { foreach (DetalleVoucherModel NuevoDetalleVoucher in LstToEvaluate) { if (NuevoDetalleVoucher.ObjCuentaContable == CuentaAUsar) { CuentaContableModel CtaAux = NuevoDetalleVoucher.ObjCuentaContable; AuxiliaresModel Auxiliar = new AuxiliaresModel(); Auxiliar.LineaNumeroDetalle = CapaVoucher.ListaDetalleVoucher.Count; Auxiliar.MontoTotal = NuevoDetalleVoucher.MontoDebe + NuevoDetalleVoucher.MontoHaber; Auxiliar.objCtaContable = CtaAux; NuevoDetalleVoucher.Auxiliar = Auxiliar; List <AuxiliaresDetalleModel> lstAuxDetalle = new List <AuxiliaresDetalleModel>(); AuxiliaresDetalleModel nuevoAuxDetalle = new AuxiliaresDetalleModel(); decimal MontoTotal = NuevoDetalleVoucher.MontoDebe + NuevoDetalleVoucher.MontoHaber; nuevoAuxDetalle.TipoDocumento = itemCartola.TipoDteNumVoucher; nuevoAuxDetalle.Fecha = itemCartola.Fecha; nuevoAuxDetalle.FechaContabilizacion = itemCartola.Fecha; nuevoAuxDetalle.Folio = itemCartola.Docum; nuevoAuxDetalle.Individuo2 = Prestador; nuevoAuxDetalle.MontoNetoLinea = 0; nuevoAuxDetalle.MontoExentoLinea = 0; nuevoAuxDetalle.MontoIVALinea = 0; nuevoAuxDetalle.MontoTotalLinea = MontoTotal; nuevoAuxDetalle.AuxiliaresModelID = Auxiliar.AuxiliaresModelID; nuevoAuxDetalle.MontoIVANoRecuperable = 0; nuevoAuxDetalle.MontoIVAUsoComun = 0; nuevoAuxDetalle.MontoIVAActivoFijo = 0; if (CtaAux.TipoAuxiliarQueUtiliza == TipoAuxiliar.Honorarios) { nuevoAuxDetalle.ValorLiquido = MontoTotal; } lstAuxDetalle.Add(nuevoAuxDetalle); Auxiliar.ListaDetalleAuxiliares = lstAuxDetalle; } } } baseNumberFolio++; } } else { LosQueNoPudieronInsertarse.Add(itemCartola); } } List <DetalleVoucherModel> detalle = LstVoucher.SelectMany(x => x.ListaDetalleVoucher.Where(y => y.Auxiliar != null)).ToList(); db.DBVoucher.AddRange(LstVoucher); db.SaveChanges(); if (detalle.Any()) { detalle.ForEach(x => { x.Auxiliar.DetalleVoucherModelID = x.DetalleVoucherModelID; }); foreach (AuxiliaresModel itemAuxiliar in detalle.Select(x => x.Auxiliar).ToArray()) { db.Entry(itemAuxiliar).State = System.Data.Entity.EntityState.Modified; } db.SaveChanges(); } CartolaDetalle = LstVoucher.SelectMany(x => x.ListaDetalleVoucher.Where(y => y.ObjCuentaContable.CuentaContableModelID == CuentaConsultada.CuentaContableModelID)) .Select(x => new CartolaBancariaModel { VoucherModelID = x.VoucherModelID, Fecha = x.FechaDoc, Folio = x.Auxiliar != null ? x.Auxiliar.ListaDetalleAuxiliares.FirstOrDefault().Folio : 0, EstaConciliado = true, Detalle = x.GlosaDetalle, CuentaContableModelID = x.ObjCuentaContable, Debe = x.MontoDebe, Haber = x.MontoHaber }).ToList(); bool ResultadoInsercionCartolaBancaria = GuardarCartolaBancaria(CartolaDetalle, FechaCartola, NumeroCartola, CuentaConsultada, ObjCliente, db); Result = true; } else { throw new Exception("No hay registros para insertar."); } return(Tuple.Create(Result, LosQueNoPudieronInsertarse)); }
public static bool InsertBoletasCovLinq(ClientesContablesModel ObjCliente, List <BoletasExcelModel> BoletasItems, TipoCentralizacion Tipo, FacturaPoliContext db) { using (var dbTransaction = db.Database.BeginTransaction()) { List <BoletasCoVModel> ListaBoletasHijo = new List <BoletasCoVModel>(); CuentaContableModel CuentaIva = ParametrosClienteModel.GetCuentaContableIvaAUsarObj(ObjCliente, db); //cuenta Iva //Al importar un libro hay 2 opciones para saber si es compra o venta //1.- al momento de importar la intefaz grafica dirá que elija si es compra o venta //2.- la segunda forma es la siguiente -> tomar el primer registro y dependiendo de su centralización indicar si es compra o venta. //Ambas opciones pueden llegar a cometer errores por ende tener en cuenta esto para cuando el desarrollo ya esté avanzado decimal TotalNeto = 0; decimal TotalIva = 0; TipoReceptor tipoReceptor = new TipoReceptor(); if (Tipo == TipoCentralizacion.Compra) { tipoReceptor = TipoReceptor.PR; } if (Tipo == TipoCentralizacion.Venta) { tipoReceptor = TipoReceptor.CL; } DateTime Fecha = BoletasItems.FirstOrDefault().Fecha; int? nullableProxVoucherNumber = ParseExtensions.GetNumVoucher(ObjCliente, db, Fecha.Month, Fecha.Year); int baseNumberFolio = nullableProxVoucherNumber.Value; List <BoletasExcelModel> LosQueNoPudieronInsertarse = new List <BoletasExcelModel>(); List <VoucherModel> LstVoucher = new List <VoucherModel>(); //en el futuro hacer estas agrupaciones por día -> un voucher tendrá tantos registros como todos los que caigan en el mismo día (se sugiere hacer un group by con este criterio en el foreach) foreach (BoletasExcelModel ItemBoleta in BoletasItems) { List <DetalleVoucherModel> detalleVoucher = new List <DetalleVoucherModel>(); QuickReceptorModel Receptor = QuickReceptorModel.CrearOActualizarPrestadorPorRut(ItemBoleta.Rut, ItemBoleta.RazonSocial, ObjCliente, db, tipoReceptor.ToString()); CuentaContableModel CuentaAuxiliar = UtilesContabilidad.CuentaContableDesdeCodInterno(ItemBoleta.CuentaAuxiliar, ObjCliente); //CuentaAuxiliar CuentaContableModel CuentaProveedorDeudor = UtilesContabilidad.CuentaContableDesdeCodInterno(ItemBoleta.CuentaContable, ObjCliente); //Cuenta ProveedorDeudor if (CuentaProveedorDeudor == null) { throw new Exception("La cuenta de proveedor deudor debe existir para este cliente contable"); } //Cada uno de estos detallevouchers que se hará lleva la misma logica que los libros de compra que se insertan a día de hoy -> revisar la inserción de libros de compra y venta ya existente VoucherModel NuevoVoucher = new VoucherModel(); NuevoVoucher.TipoOrigen = Tipo == TipoCentralizacion.Compra ? "Compra" : "Venta"; NuevoVoucher.TipoOrigenVoucher = Tipo == TipoCentralizacion.Compra ? TipoOrigen.Compra : TipoOrigen.Venta; NuevoVoucher.ClientesContablesModelID = ObjCliente.ClientesContablesModelID; NuevoVoucher.FechaEmision = ItemBoleta.Fecha; NuevoVoucher.Tipo = TipoVoucher.Traspaso; NuevoVoucher.NumeroVoucher = baseNumberFolio; NuevoVoucher.NumVoucherWithDate = ParseExtensions.BuildNewFormatNumVoucher(baseNumberFolio, Fecha); string FullDescripcionDocOriginal = (int)ItemBoleta.TipoDocumento + " / Folio: " + ItemBoleta.NumeroDeDocumento + " / " + Receptor != null ? Receptor.NombreFantasia : ""; NuevoVoucher.Glosa = FullDescripcionDocOriginal; //Revisar como debe ser creada la glosa es probable que se haga con la misma logica que con la importación de libros de compra y ventas //Encerrar la logica de las compras y las ventas en otra función? decimal CostoNeto = ItemBoleta.Neto; decimal MontoIva = ItemBoleta.Iva; decimal MontoTotal = ItemBoleta.Neto + ItemBoleta.Iva; DetalleVoucherModel LineaCuentaCorriente = new DetalleVoucherModel(); DetalleVoucherModel LineaDetalleIva = new DetalleVoucherModel(); DetalleVoucherModel LineaDetalleAuxiliar = new DetalleVoucherModel(); LineaCuentaCorriente.FechaDoc = ItemBoleta.Fecha; LineaCuentaCorriente.ObjCuentaContable = CuentaProveedorDeudor; LineaCuentaCorriente.GlosaDetalle = "Costo Neto" + FullDescripcionDocOriginal; LineaDetalleIva.FechaDoc = ItemBoleta.Fecha; LineaDetalleIva.ObjCuentaContable = CuentaIva; LineaDetalleIva.GlosaDetalle = "Iva Compras" + FullDescripcionDocOriginal; LineaDetalleAuxiliar.FechaDoc = ItemBoleta.Fecha; LineaDetalleAuxiliar.ObjCuentaContable = CuentaAuxiliar; LineaDetalleAuxiliar.GlosaDetalle = ""; if (ItemBoleta.TipoDocumento.EsUnaNotaCredito()) { LineaCuentaCorriente.MontoDebe = 0; LineaCuentaCorriente.MontoHaber = CostoNeto; LineaDetalleIva.MontoDebe = 0; LineaDetalleIva.MontoHaber = MontoIva; LineaDetalleAuxiliar.MontoDebe = MontoTotal; LineaDetalleAuxiliar.MontoHaber = 0; } else { LineaCuentaCorriente.MontoDebe = CostoNeto; LineaCuentaCorriente.MontoHaber = 0; //detalle voucher 2 -> Iva LineaDetalleIva.MontoDebe = MontoIva; LineaDetalleIva.MontoHaber = 0; //detalle voucher 3 -> Auxiliar} LineaDetalleAuxiliar.MontoDebe = 0; LineaDetalleAuxiliar.MontoHaber = MontoTotal; } detalleVoucher.Add(LineaCuentaCorriente); detalleVoucher.Add(LineaDetalleIva); detalleVoucher.Add(LineaDetalleAuxiliar); if (detalleVoucher.Sum(x => x.MontoDebe) == detalleVoucher.Sum(x => x.MontoHaber)) { NuevoVoucher.ListaDetalleVoucher = detalleVoucher; baseNumberFolio++; } else { LosQueNoPudieronInsertarse.Add(ItemBoleta); } //revisar si funciona de esta manera foreach (DetalleVoucherModel ItemDetalle in NuevoVoucher.ListaDetalleVoucher.Where(x => x.ObjCuentaContable == CuentaAuxiliar).ToList()) { AuxiliaresModel Auxiliar = new AuxiliaresModel(); CuentaContableModel CtaAux = ItemDetalle.ObjCuentaContable; Auxiliar.LineaNumeroDetalle = NuevoVoucher.ListaDetalleVoucher.Count; Auxiliar.MontoTotal = ItemDetalle.MontoDebe + ItemDetalle.MontoHaber; Auxiliar.objCtaContable = CtaAux; ItemDetalle.Auxiliar = Auxiliar; List <AuxiliaresDetalleModel> lstAuxDetalle = new List <AuxiliaresDetalleModel>(); AuxiliaresDetalleModel AuxiliarDetalle = new AuxiliaresDetalleModel(); decimal MontoTotalLinea = ItemDetalle.MontoDebe + ItemDetalle.MontoHaber; AuxiliarDetalle.TipoDocumento = ItemBoleta.TipoDocumento; AuxiliarDetalle.Fecha = ItemBoleta.Fecha; AuxiliarDetalle.FechaContabilizacion = ItemBoleta.Fecha; AuxiliarDetalle.Folio = ItemBoleta.NumeroDeDocumento; AuxiliarDetalle.Individuo2 = Receptor; AuxiliarDetalle.MontoNetoLinea = 0; AuxiliarDetalle.MontoExentoLinea = 0; AuxiliarDetalle.MontoIVALinea = 0; AuxiliarDetalle.MontoTotalLinea = MontoTotalLinea; AuxiliarDetalle.AuxiliaresModelID = Auxiliar.AuxiliaresModelID; AuxiliarDetalle.MontoIVANoRecuperable = 0; AuxiliarDetalle.MontoIVAUsoComun = 0; AuxiliarDetalle.MontoIVAActivoFijo = 0; lstAuxDetalle.Add(AuxiliarDetalle); Auxiliar.ListaDetalleAuxiliares = lstAuxDetalle; } //BaseNumFolio List <DetalleVoucherModel> detalle = LstVoucher.SelectMany(x => x.ListaDetalleVoucher.Where(y => y.Auxiliar != null)).ToList(); db.DBVoucher.AddRange(LstVoucher); db.SaveChanges(); if (detalle.Any()) { detalle.ForEach(x => { x.Auxiliar.DetalleVoucherModelID = x.DetalleVoucherModelID; }); foreach (AuxiliaresModel itemAuxiliar in detalle.Select(x => x.Auxiliar).ToArray()) { db.Entry(itemAuxiliar).State = System.Data.Entity.EntityState.Modified; } db.SaveChanges(); } } } return(false); }