public static void ProcesarLibroHonorTerceroAVoucher(List <LibroHonorariosDeTerceros> lstAConvertir, ClientesContablesModel ObjCliente, FacturaPoliContext db, List <CuentaContableModel> lstCuentaConbtale) { if (lstAConvertir == null || lstAConvertir.Count == 0 || ObjCliente == null || ObjCliente.ParametrosCliente == null) { return; } if (lstAConvertir.Count != lstAConvertir.Count) { throw new Exception(); } CuentaContableModel Retencion = null; CuentaContableModel Retencion2 = null; Retencion = db.DBCuentaContable.SingleOrDefault(x => x.CuentaContableModelID == ObjCliente.ParametrosCliente.CuentaRetencionHonorarios.CuentaContableModelID && x.ClientesContablesModelID == ObjCliente.ClientesContablesModelID); Retencion2 = db.DBCuentaContable.SingleOrDefault(x => x.CuentaContableModelID == ObjCliente.ParametrosCliente.CuentaRetencionesHonorarios2.CuentaContableModelID && x.ClientesContablesModelID == ObjCliente.ClientesContablesModelID); if (Retencion == null) { return; } List <VoucherModel> lstNuevosVouchers = new List <VoucherModel>(); int contadorAnexo = 0; CuentaContableModel cuentaPrincipal = new CuentaContableModel(); DateTime FechaContabilizacion = lstAConvertir.FirstOrDefault().FechaContabilizacion; int NumeroVoucherInicial = ParseExtensions.GetNumVoucher(ObjCliente, db, FechaContabilizacion.Month, FechaContabilizacion.Year).Value; foreach (LibroHonorariosDeTerceros itemLibroHonor in lstAConvertir) { decimal MontoBruto = itemLibroHonor.Brutos; // Debe decimal MontoRetenido = itemLibroHonor.Retenidos; //Haber decimal MontoPagado = itemLibroHonor.Pagado; // Haber VoucherModel nuevoVoucher = new VoucherModel(); nuevoVoucher.TipoOrigen = "HonorarioTercero"; nuevoVoucher.TipoOrigenVoucher = itemLibroHonor.TipoO; nuevoVoucher.ClientesContablesModelID = ObjCliente.ClientesContablesModelID; nuevoVoucher.FechaEmision = itemLibroHonor.FechaContabilizacion; nuevoVoucher.Tipo = itemLibroHonor.TipoV; // Traspaso string FullDescripcionDocOriginal = lstCuentaConbtale[contadorAnexo].nombre + " / Folio: " + itemLibroHonor.NumOFolio + " / " + itemLibroHonor.Receptor.RazonSocial; nuevoVoucher.Glosa = FullDescripcionDocOriginal; nuevoVoucher.NumeroVoucher = NumeroVoucherInicial; nuevoVoucher.NumVoucherWithDate = ParseExtensions.BuildNewFormatNumVoucher(NumeroVoucherInicial, FechaContabilizacion); List <DetalleVoucherModel> DetalleVoucher = new List <DetalleVoucherModel>(); DetalleVoucherModel DetalleVhonorarios = new DetalleVoucherModel(); // Linea 1 Del Voucher DetalleVhonorarios.FechaDoc = itemLibroHonor.FechaContabilizacion; DetalleVhonorarios.GlosaDetalle = "Honorarios Profesionales" + FullDescripcionDocOriginal; DetalleVhonorarios.MontoDebe = MontoBruto; DetalleVhonorarios.MontoHaber = 0; DetalleVhonorarios.ObjCuentaContable = lstCuentaConbtale[contadorAnexo]; DetalleVoucher.Add(DetalleVhonorarios); DetalleVoucherModel DetalleVhonorarios2 = new DetalleVoucherModel(); //Linea 2 Del Voucher if (itemLibroHonor.Retenidos > 0) { DetalleVhonorarios2.FechaDoc = itemLibroHonor.FechaContabilizacion; DetalleVhonorarios2.MontoDebe = 0; DetalleVhonorarios2.MontoHaber = MontoRetenido; DetalleVhonorarios2.ObjCuentaContable = Retencion; DetalleVhonorarios2.GlosaDetalle = Retencion.nombre + FullDescripcionDocOriginal; DetalleVoucher.Add(DetalleVhonorarios2); } DetalleVoucherModel DetalleVhonorarios2parte2 = new DetalleVoucherModel(); // Linea 3 del voucher if (itemLibroHonor.Pagado > 0) { DetalleVhonorarios2parte2.FechaDoc = itemLibroHonor.FechaContabilizacion; DetalleVhonorarios2parte2.MontoDebe = 0; DetalleVhonorarios2parte2.MontoHaber = MontoPagado; DetalleVhonorarios2parte2.GlosaDetalle = Retencion2.nombre + FullDescripcionDocOriginal; DetalleVhonorarios2parte2.ObjCuentaContable = Retencion2; cuentaPrincipal = Retencion2; DetalleVoucher.Add(DetalleVhonorarios2parte2); } if (DetalleVoucher.Sum(x => x.MontoDebe) == DetalleVoucher.Sum(x => x.MontoHaber)) { nuevoVoucher.ListaDetalleVoucher = DetalleVoucher; itemLibroHonor.HaSidoConvertidoAVoucher = true; } else { contadorAnexo++; continue; } lstNuevosVouchers.Add(nuevoVoucher); foreach (DetalleVoucherModel NuevoDetalleVoucher in nuevoVoucher.ListaDetalleVoucher) { if (NuevoDetalleVoucher.ObjCuentaContable == cuentaPrincipal) { AuxiliaresModel Auxiliar = new AuxiliaresModel(); Auxiliar.DetalleVoucherModelID = NuevoDetalleVoucher.DetalleVoucherModelID; Auxiliar.LineaNumeroDetalle = nuevoVoucher.ListaDetalleVoucher.Count; Auxiliar.MontoTotal = NuevoDetalleVoucher.MontoDebe + NuevoDetalleVoucher.MontoHaber; Auxiliar.objCtaContable = NuevoDetalleVoucher.ObjCuentaContable; Auxiliar.Tipo = TipoAuxiliar.Honorarios; db.DBAuxiliares.Add(Auxiliar); AuxiliaresDetalleModel nuevoAuxDetalle = new AuxiliaresDetalleModel(); nuevoAuxDetalle.Fecha = itemLibroHonor.FechaInicial; nuevoAuxDetalle.FechaContabilizacion = itemLibroHonor.FechaContabilizacion; nuevoAuxDetalle.FechaVencimiento = itemLibroHonor.FechaFinal; nuevoAuxDetalle.Folio = itemLibroHonor.NumOFolio; nuevoAuxDetalle.Individuo2 = itemLibroHonor.Receptor; nuevoAuxDetalle.MontoBrutoLinea = MontoBruto; nuevoAuxDetalle.ValorLiquido = MontoPagado; nuevoAuxDetalle.ValorRetencion = MontoRetenido; nuevoAuxDetalle.MontoTotalLinea = MontoPagado; nuevoAuxDetalle.AuxiliaresModelID = Auxiliar.AuxiliaresModelID; db.DBAuxiliaresDetalle.Add(nuevoAuxDetalle); db.SaveChanges(); //decimal MontoBruto = itemLibroHonor.Brutos; // Debe //decimal MontoRetenido = itemLibroHonor.Retenido; //Haber //decimal MontoPagado = itemLibroHonor.Pagado; // Haber } } contadorAnexo++; NumeroVoucherInicial++; } if (lstNuevosVouchers != null && lstNuevosVouchers.Count > 0) { foreach (VoucherModel NuevoVoucher in lstNuevosVouchers) { db.DBVoucher.Add(NuevoVoucher); } db.SaveChanges(); int posicion = 0; foreach (VoucherModel NuevoVoucher in lstNuevosVouchers) { int posicion2 = 0; foreach (LibroHonorariosDeTerceros itemHonor in lstAConvertir) { if (posicion == posicion2) { itemHonor.VoucherModel = NuevoVoucher; db.DBLibroHonorariosTerceros.AddOrUpdate(itemHonor); db.SaveChanges(); } posicion2++; } int total = NuevoVoucher.ListaDetalleVoucher.Count; foreach (DetalleVoucherModel NuevoDetalleVoucher in NuevoVoucher.ListaDetalleVoucher) { if (NuevoDetalleVoucher.ObjCuentaContable == cuentaPrincipal) { AuxiliaresModel auxiliar = db.DBAuxiliares.Where(x => x.LineaNumeroDetalle == total && x.objCtaContable.ClientesContablesModelID == cuentaPrincipal.ClientesContablesModelID && x.DetalleVoucherModelID == 0).FirstOrDefault(); if (auxiliar != null) { auxiliar.DetalleVoucherModelID = NuevoDetalleVoucher.DetalleVoucherModelID; db.DBAuxiliares.AddOrUpdate(auxiliar); NuevoDetalleVoucher.Auxiliar = auxiliar; db.DBDetalleVoucher.AddOrUpdate(NuevoDetalleVoucher); db.SaveChanges(); } } } posicion++; } } }
public static string ProcesarLibrosContablesAVoucher(List <LibrosContablesModel> lstEntradasLibro, ClientesContablesModel objCliente, FacturaPoliContext db, List <CuentaContableModel> lstCuentaContable, List <int> IdsCentroDeCostos) { using (var dbContextTransaction = db.Database.BeginTransaction()) { string FeedBack = ""; try { if (lstEntradasLibro == null || lstEntradasLibro.Count == 0 || objCliente == null || objCliente.ParametrosCliente == null) { throw new Exception("Error no hay datos para procesar."); } var folioExcel = lstEntradasLibro.First().Folio.ToString(); if (lstEntradasLibro.Count != lstCuentaContable.Count) { throw new Exception("Error no hay cuentas contables asignadas para cada registro."); } CuentaContableModel CuentaIVAAUsar = null; if (lstEntradasLibro.First().TipoLibro == TipoCentralizacion.Compra) { CuentaIVAAUsar = db.DBCuentaContable.SingleOrDefault(r => r.CuentaContableModelID == objCliente.ParametrosCliente.CuentaIvaCompras.CuentaContableModelID && r.ClientesContablesModelID == objCliente.ClientesContablesModelID); } else if (lstEntradasLibro.First().TipoLibro == TipoCentralizacion.Venta) { CuentaIVAAUsar = db.DBCuentaContable.SingleOrDefault(r => r.CuentaContableModelID == objCliente.ParametrosCliente.CuentaIvaVentas.CuentaContableModelID && r.ClientesContablesModelID == objCliente.ClientesContablesModelID); } else { throw new Exception("Error el documento no es de compra ni venta."); } if (CuentaIVAAUsar == null) { throw new Exception("Error no se encontró configuración valida en el modulo parametros clientes, Por favor parametrizar las cuentas contables."); } List <VoucherModel> lstNuevosVouchers = new List <VoucherModel>(); int contadorAnexo = 0; CuentaContableModel cuentaPrincipal = new CuentaContableModel(); DateTime FechaContabilizacion = lstEntradasLibro.FirstOrDefault().FechaContabilizacion; int NumeroVoucherInicial = ParseExtensions.GetNumVoucher(objCliente, db, FechaContabilizacion.Month, FechaContabilizacion.Year).Value; foreach (LibrosContablesModel entradaLibro in lstEntradasLibro) { //CuentaIVAAUsar = db.DBCuentaContable.SingleOrDefault(r => r.CuentaContableModelID == objCliente.ParametrosCliente.CuentaIvaCompras.CuentaContableModelID && r.ClientesContablesModelID == objCliente.ClientesContablesModelID ); VoucherModel nuevoVoucher = new VoucherModel(); if (entradaLibro.TipoLibro == TipoCentralizacion.Venta) { nuevoVoucher.TipoOrigen = "Venta"; nuevoVoucher.TipoOrigenVoucher = TipoOrigen.Venta; } if (entradaLibro.TipoLibro == TipoCentralizacion.Compra) { nuevoVoucher.TipoOrigen = "Compra"; nuevoVoucher.TipoOrigenVoucher = TipoOrigen.Compra; } nuevoVoucher.ClientesContablesModelID = objCliente.ClientesContablesModelID; nuevoVoucher.FechaEmision = entradaLibro.FechaContabilizacion; nuevoVoucher.Tipo = TipoVoucher.Traspaso; string FullDescripcionDocOriginal = (int)entradaLibro.TipoDocumento + " / Folio: " + entradaLibro.Folio + " / " + entradaLibro.individuo.RazonSocial; nuevoVoucher.Glosa = FullDescripcionDocOriginal; //nuevoVoucher.NumeroVoucher = ParseExtensions.GetNumVoucher(objCliente, db, entradaLibro.FechaContabilizacion.Month, entradaLibro.FechaContabilizacion.Year).Value; nuevoVoucher.NumeroVoucher = NumeroVoucherInicial; nuevoVoucher.NumVoucherWithDate = ParseExtensions.BuildNewFormatNumVoucher(NumeroVoucherInicial, FechaContabilizacion); //DEFINIR CUAL ES LA CUENTA DE VENTA O COMPRA DONDE VAN LAS VENTAS O COMPRAS List <DetalleVoucherModel> DetalleVoucher = new List <DetalleVoucherModel>(); if (entradaLibro.TipoLibro == TipoCentralizacion.Venta) { // decimal CostoNeto = entradaLibro.MontoTotal - entradaLibro.MontoIva; decimal CostoNeto = entradaLibro.MontoNeto; decimal MontoTotal = entradaLibro.MontoTotal; decimal MontoIva = entradaLibro.MontoIva; decimal MontoExento = entradaLibro.MontoExento; DetalleVoucherModel detalleGastoNeto = new DetalleVoucherModel(); detalleGastoNeto.FechaDoc = entradaLibro.FechaContabilizacion; //EN VENTA EL TOTAL VA AL DEBE, EN EL HABER VA EL GASTO NETO Y EL IVA ... pero si es una nota de credito los del haber van al debe y viceversa if (entradaLibro.TipoDocumento.EsUnaNotaCredito() == false) { detalleGastoNeto.MontoHaber = CostoNeto + MontoExento; detalleGastoNeto.MontoDebe = 0; } else { detalleGastoNeto.MontoHaber = 0; detalleGastoNeto.MontoDebe = CostoNeto + MontoExento; } detalleGastoNeto.GlosaDetalle = "Costo Neto " + FullDescripcionDocOriginal; detalleGastoNeto.ObjCuentaContable = lstCuentaContable[contadorAnexo]; detalleGastoNeto.CentroCostoID = IdsCentroDeCostos[contadorAnexo]; DetalleVoucher.Add(detalleGastoNeto); DetalleVoucherModel detalleGastoIVA = new DetalleVoucherModel(); if (entradaLibro.MontoIva > 0) { detalleGastoIVA.FechaDoc = entradaLibro.FechaContabilizacion; //EN VENTA EL TOTAL VA AL DEBE, EN EL HABER VA EL GASTO NETO Y EL IVA ... pero si es una nota de credito los del haber van al debe y viceversa if (entradaLibro.TipoDocumento.EsUnaNotaCredito() == false) { detalleGastoIVA.MontoHaber = MontoIva; detalleGastoIVA.MontoDebe = 0; } else { detalleGastoIVA.MontoHaber = 0; detalleGastoIVA.MontoDebe = MontoIva; } detalleGastoIVA.GlosaDetalle = "IVA Ventas " + FullDescripcionDocOriginal; detalleGastoIVA.ObjCuentaContable = CuentaIVAAUsar;//objCliente.CtaContable.SingleOrDefault(r => r.CuentaContableModelID == objCliente.ParametrosCliente.CuentaIvaVentas.CuentaContableModelID); DetalleVoucher.Add(detalleGastoIVA); } DetalleVoucherModel detalleCtaVenta = new DetalleVoucherModel(); detalleCtaVenta.FechaDoc = entradaLibro.FechaContabilizacion; //EN VENTA EL TOTAL VA AL DEBE, EN EL HABER VA EL GASTO NETO Y EL IVA ... pero si es una nota de credito los del haber van al debe y viceversa if (entradaLibro.TipoDocumento.EsUnaNotaCredito() == false) { detalleCtaVenta.MontoHaber = 0; detalleCtaVenta.MontoDebe = MontoTotal; } else { detalleCtaVenta.MontoHaber = MontoTotal; detalleCtaVenta.MontoDebe = 0; } detalleCtaVenta.ObjCuentaContable = objCliente.CtaContable.SingleOrDefault(r => r.CuentaContableModelID == objCliente.ParametrosCliente.CuentaVentas.CuentaContableModelID); cuentaPrincipal = detalleCtaVenta.ObjCuentaContable; detalleCtaVenta.GlosaDetalle = detalleCtaVenta.ObjCuentaContable.nombre + " (Venta) " + FullDescripcionDocOriginal; DetalleVoucher.Add(detalleCtaVenta); } //EN COMPRA EL TOTAL VA AL HABER, EN EL DEBE VA EL GASTO NETO Y EL IVA... ...pero si es una nota de credito los del debe van al haber y viceversa else if (entradaLibro.TipoLibro == TipoCentralizacion.Compra) { decimal CostoNeto = entradaLibro.MontoNeto;//entradaLibro.MontoTotal - entradaLibro.MontoIva; decimal CostoIvaNoRecuperable = entradaLibro.MontoIvaNoRecuperable; decimal CostoIvaActivoFijo = entradaLibro.MontoIvaActivoFijo; decimal CostoIvaUsoComun = entradaLibro.MontoIvaUsocomun; decimal MontoTotal = entradaLibro.MontoTotal; decimal MontoIva = entradaLibro.MontoIva; decimal montoExento = entradaLibro.MontoExento; String tipocompra = ""; //Iva No Recuperable if (CostoIvaNoRecuperable > 0 && CostoIvaUsoComun == 0 && MontoIva == 0) { tipocompra = "IvaNoRecuperable"; } if (CostoIvaUsoComun == 0 && MontoIva > 0 && CostoIvaNoRecuperable == 0) { tipocompra = "IvaRecuperable"; } if (CostoIvaNoRecuperable > 0 || CostoIvaNoRecuperable == 0 && MontoIva == 0 && CostoIvaUsoComun > 0) { tipocompra = "IvaUsoComun"; } DetalleVoucherModel detalleGastoNeto = new DetalleVoucherModel(); detalleGastoNeto.FechaDoc = entradaLibro.FechaContabilizacion; //EN COMPRA EL TOTAL VA AL HABER, EN EL DEBE VA EL GASTO NETO Y EL IVA... //pero si es una nota de credito los del debe van al haber y viceversa if (entradaLibro.TipoDocumento.EsUnaNotaCredito() == false) { detalleGastoNeto.MontoHaber = 0; detalleGastoNeto.MontoDebe = CostoNeto + montoExento; } else { detalleGastoNeto.MontoHaber = CostoNeto + montoExento; detalleGastoNeto.MontoDebe = 0; } detalleGastoNeto.GlosaDetalle = "Costo Neto " + FullDescripcionDocOriginal; detalleGastoNeto.ObjCuentaContable = lstCuentaContable[contadorAnexo]; detalleGastoNeto.CentroCostoID = IdsCentroDeCostos[contadorAnexo]; DetalleVoucher.Add(detalleGastoNeto); //DetalleVoucherModel detalleGastoNetoCopiaIva = new DetalleVoucherModel(); //if (tipocompra == "IvaNoRecuperable" || tipocompra == "IvaUsoComun") //{ // detalleGastoNetoCopiaIva.FechaDoc = entradaLibro.FechaContabilizacion; // if (entradaLibro.TipoDocumento.EsUnaNotaCredito() == false) // { // detalleGastoNetoCopiaIva.MontoHaber = 0; // detalleGastoNetoCopiaIva.MontoDebe = CostoIvaNoRecuperable; // } // else // { // detalleGastoNetoCopiaIva.MontoHaber = CostoIvaNoRecuperable; // detalleGastoNetoCopiaIva.MontoDebe = 0; // } // detalleGastoNetoCopiaIva.GlosaDetalle = "Costo Iva No Recuperable " + FullDescripcionDocOriginal; // detalleGastoNetoCopiaIva.ObjCuentaContable = lstCuentaContable[contadorAnexo]; // DetalleVoucher.Add(detalleGastoNetoCopiaIva); //} DetalleVoucherModel detalleGastoIVA = new DetalleVoucherModel(); // if (entradaLibro.MontoIva > 0) //Genero lineas según tipoCompra if (tipocompra == "IvaRecuperable" || tipocompra == "IvaUsoComun") { detalleGastoIVA.FechaDoc = entradaLibro.FechaContabilizacion; decimal montoIvaTotal = MontoIva; if (tipocompra == "IvaUsoComun") { montoIvaTotal = CostoIvaUsoComun; //CostoIvaNoRecuperable + CostoIvaUsoComun; } //EN COMPRA EL TOTAL VA AL HABER, EN EL DEBE VA EL GASTO NETO Y EL IVA... //pero si es una nota de credito los del debe van al haber y viceversa if (entradaLibro.TipoDocumento.EsUnaNotaCredito() == false) { detalleGastoIVA.MontoHaber = 0; detalleGastoIVA.MontoDebe = montoIvaTotal;//MontoIva; } else { detalleGastoIVA.MontoHaber = montoIvaTotal;// MontoIva; detalleGastoIVA.MontoDebe = 0; } detalleGastoIVA.GlosaDetalle = "IVA Compras " + FullDescripcionDocOriginal; detalleGastoIVA.ObjCuentaContable = CuentaIVAAUsar;//objCliente.CtaContable.SingleOrDefault(r => r.CuentaContableModelID == objCliente.ParametrosCliente.CuentaIvaVentas.CuentaContableModelID); DetalleVoucher.Add(detalleGastoIVA); } DetalleVoucherModel detalleCtaCompra = new DetalleVoucherModel(); detalleCtaCompra.FechaDoc = entradaLibro.FechaContabilizacion; //EN COMPRA EL TOTAL VA AL HABER, EN EL DEBE VA EL GASTO NETO Y EL IVA... //pero si es una nota de credito los del debe van al haber y viceversa if (tipocompra == "IvaUsoComun") { if (entradaLibro.TipoDocumento.EsUnaNotaCredito() == false) { detalleCtaCompra.MontoHaber = montoExento + CostoNeto + CostoIvaUsoComun; detalleCtaCompra.MontoDebe = 0; } else { detalleCtaCompra.MontoHaber = 0; detalleCtaCompra.MontoDebe = montoExento + CostoNeto + CostoIvaUsoComun; } } else { if (entradaLibro.TipoDocumento.EsUnaNotaCredito() == false) { detalleCtaCompra.MontoHaber = montoExento + CostoNeto + MontoIva; detalleCtaCompra.MontoDebe = 0; } else { detalleCtaCompra.MontoHaber = 0; detalleCtaCompra.MontoDebe = montoExento + CostoNeto + MontoIva; } } detalleCtaCompra.ObjCuentaContable = objCliente.CtaContable.SingleOrDefault(r => r.CuentaContableModelID == objCliente.ParametrosCliente.CuentaCompras.CuentaContableModelID); cuentaPrincipal = detalleCtaCompra.ObjCuentaContable; detalleCtaCompra.GlosaDetalle = detalleCtaCompra.ObjCuentaContable.nombre + " (Compra) " + FullDescripcionDocOriginal; DetalleVoucher.Add(detalleCtaCompra); } if (DetalleVoucher.Sum(r => r.MontoDebe) == DetalleVoucher.Sum(r => r.MontoHaber)) { nuevoVoucher.ListaDetalleVoucher = DetalleVoucher; entradaLibro.HaSidoConvertidoAVoucher = true; //Convertimosa voucher solo si el libro ya es convertido a voucher. List <ImpuestosAdRelacionModel> AConvertir = db.DBImpuestosAdRelacionSII.Where(x => x.CodigoUnionImpuesto == entradaLibro.CodigoUnionImpuesto).ToList(); if (AConvertir.Count != 0) { foreach (ImpuestosAdRelacionModel Convertidor in AConvertir) { //Cambiar esta parte a la actualizacion dejar de usar addorupdate Convertidor.HaSidoConvertidoAVoucher = true; db.DBImpuestosAdRelacionSII.AddOrUpdate(Convertidor); db.SaveChanges(); } } } else { contadorAnexo++; NumeroVoucherInicial++; continue; //Pensar en como reportar que hubo problemas importando la linea X del libro } lstNuevosVouchers.Add(nuevoVoucher); foreach (DetalleVoucherModel NuevoDetalleVoucher in nuevoVoucher.ListaDetalleVoucher) { if (NuevoDetalleVoucher.ObjCuentaContable == cuentaPrincipal) { AuxiliaresModel Auxiliar = new AuxiliaresModel(); Auxiliar.DetalleVoucherModelID = NuevoDetalleVoucher.DetalleVoucherModelID; Auxiliar.LineaNumeroDetalle = nuevoVoucher.ListaDetalleVoucher.Count; Auxiliar.MontoTotal = NuevoDetalleVoucher.MontoDebe + NuevoDetalleVoucher.MontoHaber; Auxiliar.objCtaContable = NuevoDetalleVoucher.ObjCuentaContable; //Auxiliar.DetalleVoucherModelID = NuevoDetalleVoucher.DetalleVoucherModelID; db.DBAuxiliares.Add(Auxiliar); AuxiliaresDetalleModel nuevoAuxDetalle = new AuxiliaresDetalleModel(); nuevoAuxDetalle.TipoDocumento = entradaLibro.TipoDocumento; nuevoAuxDetalle.Fecha = entradaLibro.FechaDoc; nuevoAuxDetalle.FechaContabilizacion = entradaLibro.FechaContabilizacion; //revisar // nuevoAuxDetalle.FechaVencimiento = entradaLibro.fe nuevoAuxDetalle.Folio = entradaLibro.Folio; nuevoAuxDetalle.Individuo2 = entradaLibro.individuo; nuevoAuxDetalle.MontoNetoLinea = entradaLibro.MontoNeto; nuevoAuxDetalle.MontoExentoLinea = entradaLibro.MontoExento; nuevoAuxDetalle.MontoIVALinea = entradaLibro.MontoIva; nuevoAuxDetalle.MontoTotalLinea = entradaLibro.MontoTotal; nuevoAuxDetalle.AuxiliaresModelID = Auxiliar.AuxiliaresModelID; if (entradaLibro.TipoLibro == TipoCentralizacion.Compra) { nuevoAuxDetalle.MontoIVANoRecuperable = entradaLibro.MontoIvaNoRecuperable; nuevoAuxDetalle.MontoIVAUsoComun = entradaLibro.MontoIvaUsocomun; nuevoAuxDetalle.MontoIVAActivoFijo = entradaLibro.MontoIvaActivoFijo; } db.DBAuxiliaresDetalle.Add(nuevoAuxDetalle); db.SaveChanges(); } } contadorAnexo++; NumeroVoucherInicial++; } if (lstNuevosVouchers != null && lstNuevosVouchers.Count > 0) { foreach (VoucherModel NuevoVoucher in lstNuevosVouchers) { //objCliente.ListVoucher.Add(NuevoVoucher); db.DBVoucher.Add(NuevoVoucher); } db.SaveChanges(); int posicion = 0; foreach (VoucherModel NuevoVoucher in lstNuevosVouchers) { int posicion2 = 0; foreach (LibrosContablesModel entradaLibro in lstEntradasLibro) { if (posicion == posicion2) { entradaLibro.VoucherModelID = NuevoVoucher.VoucherModelID; entradaLibro.estado = true; db.DBLibrosContables.AddOrUpdate(entradaLibro); db.SaveChanges(); } posicion2++; } int total = NuevoVoucher.ListaDetalleVoucher.Count; foreach (DetalleVoucherModel NuevoDetalleVoucher in NuevoVoucher.ListaDetalleVoucher) { if (NuevoDetalleVoucher.ObjCuentaContable == cuentaPrincipal) { AuxiliaresModel auxiliar = (from c in db.DBAuxiliares where c.LineaNumeroDetalle == total && c.objCtaContable.ClientesContablesModelID == cuentaPrincipal.ClientesContablesModelID && c.DetalleVoucherModelID == 0 select c).FirstOrDefault(); if (auxiliar != null) { auxiliar.DetalleVoucherModelID = NuevoDetalleVoucher.DetalleVoucherModelID; db.DBAuxiliares.AddOrUpdate(auxiliar); NuevoDetalleVoucher.Auxiliar = auxiliar; db.DBDetalleVoucher.AddOrUpdate(NuevoDetalleVoucher); db.SaveChanges(); } } } posicion++; } } dbContextTransaction.Commit(); FeedBack = "Exito"; return(FeedBack); } catch (Exception ex) { dbContextTransaction.Rollback(); FeedBack = "Error inesperado " + ex.Message; return(FeedBack); } } }
//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); }