public static Lbl.Impresion.ClasesImpresora ObtenerClaseImpresora(Lbl.Comprobantes.Comprobante comprobante) { Lbl.Impresion.ClasesImpresora Res; if (Lbl.Comprobantes.PuntoDeVenta.TodosPorNumero.ContainsKey(comprobante.PV)) { switch (Lbl.Comprobantes.PuntoDeVenta.TodosPorNumero[comprobante.PV].Tipo) { case Lbl.Comprobantes.TipoPv.Talonario: Res = Lbl.Impresion.ClasesImpresora.Papel; break; case Lbl.Comprobantes.TipoPv.ControladorFiscal: Res = Lbl.Impresion.ClasesImpresora.FiscalAfip; break; case Lbl.Comprobantes.TipoPv.ElectronicoAfip: Res = Lbl.Impresion.ClasesImpresora.ElectronicaAfip; break; case Lbl.Comprobantes.TipoPv.Inactivo: throw new ApplicationException("No se puede imprimir en un PV inactivo."); default: throw new ApplicationException("Tipo de PV no reconocido " + Lbl.Comprobantes.PuntoDeVenta.TodosPorNumero[comprobante.PV].Tipo.ToString()); } } else { Res = Lbl.Impresion.ClasesImpresora.Papel; } return(Res); }
public static int ProximoNumero(Lbl.Comprobantes.Comprobante comprobante) { string TipoReal = ""; // Las notas de crédito y débito comparten la numeración de las comprob switch (comprobante.Tipo.Nomenclatura) { case "A": case "FA": case "NCA": case "NDA": TipoReal = "'FA', 'NCA', 'NDA'"; break; case "B": case "FB": case "NCB": case "NDB": TipoReal = "'FB', 'NCB', 'NDB'"; break; case "C": case "FC": case "NCC": case "NDC": TipoReal = "'FC', 'NCC', 'NDC'"; break; case "E": case "FE": case "NCE": case "NDE": TipoReal = "'FE', 'NCE', 'NDE'"; break; case "M": case "FM": case "NCM": case "NDM": TipoReal = "'FM', 'NCM', 'NDM'"; break; default: TipoReal = "'" + comprobante.Tipo.Nomenclatura + "'"; break; } string SqlWhere = "pv=" + comprobante.PV.ToString() + " AND tipo_fac IN (" + TipoReal + ")"; if (comprobante is Lbl.Comprobantes.ComprobanteConArticulos) { // Si es comprobante con artículos, agrego una condicion más para los comprobantes de compra SqlWhere += " AND compra=" + (((Lbl.Comprobantes.ComprobanteConArticulos)(comprobante)).Compra ? "1" : "0"); } return(comprobante.Connection.FieldInt("SELECT MAX(numero) FROM " + comprobante.TablaDatos + " WHERE " + SqlWhere) + 1); }
public override void AfterSave(System.Data.IDbTransaction transaction) { Lbl.Comprobantes.Comprobante Compr = this.Elemento as Lbl.Comprobantes.Comprobante; if (Compr != null && Compr.Tipo != null && Compr.Tipo.ImprimirAlGuardar) { Lazaro.Impresion.Impresor Impr = Lazaro.Impresion.Instanciador.InstanciarImpresor(Compr, transaction); Impr.Imprimir(); } }
public static Lbl.Impresion.Impresora ObtenerImpresora(Lbl.Comprobantes.Comprobante comprobante) { // Primero busco una una impresora específica para este comprobante Lbl.Impresion.Impresora Res = comprobante.ObtenerImpresora(); // Si no hay, devuelvo la impresora para este tipo de elemento if (Res == null) { // TODO: return base.ObtenerImpresora(); return(null); } else { return(Res); } }
public static Lbl.Impresion.Plantilla ObtenerPlantilla(Lbl.Comprobantes.Comprobante comprobante) { if (Lbl.Impresion.Plantilla.TodasPorCodigo.ContainsKey(comprobante.Tipo.Nomenclatura)) { // Busco una plantilla para el tipo exacto return(Lbl.Impresion.Plantilla.TodasPorCodigo[comprobante.Tipo.Nomenclatura]); } else if (comprobante.Tipo.EsFacturaNCoND && Lbl.Impresion.Plantilla.TodasPorCodigo.ContainsKey("F" + comprobante.Tipo.Letra)) { // En caso de NC y ND, pruebo utilizando la plantilla de facturas return(Lbl.Impresion.Plantilla.TodasPorCodigo["F" + comprobante.Tipo.Letra]); } else { // TODO: return base.ObtenerPlantilla(); return(null); } }
public override void AfterSave(System.Data.IDbTransaction transaction) { Lbl.Comprobantes.Comprobante Comprob = this.Elemento as Lbl.Comprobantes.Comprobante; if (Comprob != null && Comprob.Tipo != null && Comprob.Tipo.ImprimirAlGuardar) { if (transaction == null) { using (transaction = this.Connection.BeginTransaction()) { var Controlador = new Lazaro.Base.Controller.ComprobanteController(transaction); Controlador.Imprimir(Comprob, null); transaction.Commit(); transaction = null; } } else { var Controlador = new Lazaro.Base.Controller.ComprobanteController(transaction); Controlador.Imprimir(Comprob, null); } } }
public static decimal DescancelarImpagos(Lbl.Personas.Persona cliente, Lbl.Comprobantes.ColeccionComprobanteImporte listaComprob, Lbl.Comprobantes.Comprobante comprob, decimal importe) { // Doy los comprob por cancelados decimal TotalACancelar = Math.Abs(importe); //"Descancelo" comprob if (listaComprob != null && listaComprob.Count > 0) { // Si hay una lista de comprob, los descancelo foreach (ComprobanteImporte CompImp in listaComprob) { // Intento descancelar todo decimal Cancelando = CompImp.Importe; // Si mes demasiado, hago un pago parcial if (Cancelando > CompImp.Comprobante.ImporteCancelado) { Cancelando = CompImp.Comprobante.ImporteCancelado; } // Si se acabó la plata, hago un pago parcial if (Cancelando > TotalACancelar) { Cancelando = TotalACancelar; } // Si alcanzo a cancelar algo, lo asiento if (Cancelando > 0) { CompImp.Comprobante.DescancelarImporte(Cancelando, comprob); } TotalACancelar = TotalACancelar - Cancelando; if (TotalACancelar == 0) { break; } } } if (TotalACancelar > 0) { // Si queda más saldo, sigo buscando facturas a descancelar qGen.Select SelFacConSaldo = new qGen.Select("comprob"); SelFacConSaldo.WhereClause = new qGen.Where(); SelFacConSaldo.WhereClause.AddWithValue("impresa", qGen.ComparisonOperators.NotEqual, 0); SelFacConSaldo.WhereClause.AddWithValue("anulada", 0); SelFacConSaldo.WhereClause.AddWithValue("numero", qGen.ComparisonOperators.GreaterThan, 0); SelFacConSaldo.WhereClause.AddWithValue("id_formapago", qGen.ComparisonOperators.In, new int[] { 1, 3, 99 }); SelFacConSaldo.WhereClause.AddWithValue("cancelado", qGen.ComparisonOperators.GreaterThan, 0); SelFacConSaldo.WhereClause.AddWithValue("id_cliente", cliente.Id); SelFacConSaldo.WhereClause.AddWithValue("tipo_fac", qGen.ComparisonOperators.In, new string[] { "FA", "FB", "FC", "FE", "FM", "NDA", "NDB", "NDC", "NDE", "NDM" }); if (importe > 0) { // Cancelo facturas y ND regulares SelFacConSaldo.WhereClause.AddWithValue("compra", 0); } else { // Cancelo facturas y de compra SelFacConSaldo.WhereClause.AddWithValue("compra", qGen.ComparisonOperators.NotEqual, 0); } SelFacConSaldo.Order = "id_comprob DESC"; using (System.Data.DataTable FacturasConSaldo = cliente.Connection.Select(SelFacConSaldo)) { foreach (System.Data.DataRow Factura in FacturasConSaldo.Rows) { Lbl.Comprobantes.ComprobanteConArticulos Fact = new ComprobanteConArticulos(cliente.Connection, (Lfx.Data.Row)Factura); decimal SaldoFactura = Fact.ImporteCancelado; decimal ImporteASaldar = SaldoFactura; if (ImporteASaldar > TotalACancelar) { ImporteASaldar = TotalACancelar; } Fact.DescancelarImporte(ImporteASaldar, comprob); TotalACancelar -= ImporteASaldar; if (TotalACancelar <= 0) { break; } } } } /* if (TotalACancelar > 0) { * Lbl.Cajas.Concepto Conc; * if (comprob is Recibo) * Conc = ((Recibo)comprob).Concepto; * else * Conc = Lbl.Cajas.Concepto.AjustesYMovimientos; * cliente.CuentaCorriente.Movimiento(true, Conc, "Anulación de " + comprob.ToString(), TotalACancelar * DireccionCtaCte, comprob.Obs, comprob as Lbl.Comprobantes.ComprobanteConArticulos, comprob as Lbl.Comprobantes.Recibo, null); * TotalACancelar = 0; * } */ // Devuelvo el sobrante return(TotalACancelar); }
public Lfx.Types.OperationResult Imprimir(Lbl.Comprobantes.Comprobante comprobante, Lbl.Impresion.Impresora impresora) { if (impresora == null) { impresora = Util.Comprobantes.Impresion.ObtenerImpresora(comprobante); } var Reimpresion = comprobante.Impreso; var ClaseImpr = Util.Comprobantes.Impresion.ObtenerClaseImpresora(comprobante); if (ClaseImpr != Lbl.Impresion.ClasesImpresora.FiscalAfip && ClaseImpr != Lbl.Impresion.ClasesImpresora.ElectronicaAfip && impresora != null) { ClaseImpr = impresora.Clase; if (comprobante.Tipo.EsFacturaNCoND && impresora.EsVistaPrevia) { return(new Lfx.Types.FailureOperationResult("Este tipo de comprobante no puede ser previsualizado")); } } Lfx.Types.OperationResult ResultadoImprimir; Lbl.Comprobantes.ComprobanteConArticulos ComprobConArt = comprobante as Lbl.Comprobantes.ComprobanteConArticulos; switch (ClaseImpr) { case Lbl.Impresion.ClasesImpresora.ElectronicaAfip: if (ComprobConArt == null) { throw new InvalidOperationException("El comprobante no es una factura"); } if (Reimpresion) { this.GenerarPdf(ComprobConArt); return(new Lfx.Types.SuccessOperationResult()); } else { ResultadoImprimir = this.ImprimirFacturaElectronicaAfip(comprobante as Lbl.Comprobantes.ComprobanteConArticulos); if (ResultadoImprimir.Success == true) { //Resto el stock si corresponde ComprobConArt.MoverExistencias(false); // Asentar pagos si corresponde ComprobConArt.AsentarPago(false); } return(ResultadoImprimir); } case Lbl.Impresion.ClasesImpresora.FiscalAfip: if (Reimpresion) { return(new Lfx.Types.FailureOperationResult("No se permiten reimpresiones fiscales")); } // Primero hago un COMMIT, porque si no el otro proceso no va a poder hacer movimientos if (this.Transaction != null) { this.Transaction.Commit(); this.Transaction.Dispose(); this.Transaction = null; } // Lo mando a imprimir al servidor fiscal string Estacion = null; if (ClaseImpr == Lbl.Impresion.ClasesImpresora.FiscalAfip) { Estacion = Lbl.Comprobantes.PuntoDeVenta.TodosPorNumero[comprobante.PV].Estacion; } if (Estacion == null && impresora != null) { Estacion = impresora.Estacion; } if (Estacion != null) { Lfx.Workspace.Master.DefaultScheduler.AddTask("IMPRIMIR " + comprobante.Id.ToString(), "fiscal" + comprobante.PV.ToString(), Estacion); } else { throw new Exception("No se ha definido el equipo al cual está conectada la impresora remota"); } //Espero hasta que la factura está impresa o hasta que pasen X segundos System.DateTime FinEsperaFiscal = System.DateTime.Now.AddSeconds(90); int NumeroFiscal = 0; while (System.DateTime.Now < FinEsperaFiscal && NumeroFiscal == 0) { System.Threading.Thread.Sleep(1000); NumeroFiscal = comprobante.Connection.FieldInt("SELECT numero FROM comprob WHERE impresa<>0 AND id_comprob=" + comprobante.Id.ToString()); } if (NumeroFiscal == 0) { // Llegó el fin del tiempo de espera y no imprimió return(new Lfx.Types.FailureOperationResult("Se superó el tiempo de espera para recibir respuesta del Servidor Fiscal.")); } else { comprobante.Cargar(); // Tengo número de factura. Imprimió Ok return(new Lfx.Types.SuccessOperationResult()); } case Lbl.Impresion.ClasesImpresora.Nula: if (Reimpresion == false && comprobante.Tipo.NumerarAlImprimir) { new Lbl.Comprobantes.Numerador(comprobante).Numerar(true); } if (Reimpresion == false) { //Resto el stock si corresponde ComprobConArt.MoverExistencias(false); // Asentar pagos si corresponde ComprobConArt.AsentarPago(false); } return(new Lfx.Types.SuccessOperationResult()); case Lbl.Impresion.ClasesImpresora.Papel: if (impresora == null || impresora.EsLocal) { var Impresor = Lazaro.Base.Util.Impresion.Instanciador.InstanciarImpresor(comprobante, this.Transaction); return(Impresor.Imprimir()); } else { if (Reimpresion) { throw new Lfx.Types.DomainException("No se permiten reimpresiones remotas"); } // Primero hago un COMMIT, porque si no el otro proceso no va a poder hacer movimientos if (this.Transaction != null) { this.Transaction.Commit(); this.Transaction.Dispose(); this.Transaction = null; } // Lo mando a imprimir a la estación remota Lfx.Workspace.Master.DefaultScheduler.AddTask("IMPRIMIR " + comprobante.GetType().ToString() + " " + comprobante.Id.ToString() + " EN " + impresora.Dispositivo, "lazaro", impresora.Estacion); if (Reimpresion == false) { //Espero hasta que la factura está impresa o hasta que pasen X segundos System.DateTime FinEspera = System.DateTime.Now.AddSeconds(90); int Impreso = 0; while (System.DateTime.Now < FinEspera && Impreso == 0) { System.Threading.Thread.Sleep(1000); Impreso = comprobante.Connection.FieldInt("SELECT impresa FROM comprob WHERE impresa<>0 AND id_comprob=" + comprobante.Id.ToString()); } if (Impreso == 0) { // Llegó el fin del tiempo de espera y no imprimió return(new Lfx.Types.FailureOperationResult("Se superó el tiempo de espera para recibir respuesta del sistema remoto.")); } else { comprobante.Cargar(); // Tengo número de factura. Imprimió Ok return(new Lfx.Types.SuccessOperationResult()); } } return(new Lfx.Types.SuccessOperationResult()); } default: throw new NotImplementedException("No se reconoce el tipo de impresora " + ClaseImpr.ToString()); } }
public GeneradorManual(Lbl.Comprobantes.Comprobante comprobante) : base(comprobante) { }
/// <summary> /// Cancela el importe impago de los comprobantes en listaComprob y si sobra continúa cancelando en los comprobantes /// más viejos que tengan saldo pendiente. Si continúa sobrando, deja el saldo a favor en cta. cte. /// </summary> /// <param name="cliente">El cliente.</param> /// <param name="listaComprob">La lista de comprobantes en los cuales cancelar saldo impago.</param> /// <param name="comprob">El comprobante que está cancelando saldos. Puede ser un recibo o una NC.</param> /// <param name="importe">El importe total a cancelar. Puede ser negativo para hacerlo en contra del cliente.</param> public static decimal CancelarImpagos(Lbl.Personas.Persona cliente, ColeccionComprobanteImporte listaComprob, Lbl.Comprobantes.Comprobante comprob, decimal importe) { decimal TotalACancelar = Math.Abs(importe); if (listaComprob != null && listaComprob.Count > 0) { // Si hay una lista de facturas, las cancelo foreach (ComprobanteImporte CompImp in listaComprob) { // Calculo cuanto queda por cancelar en esta factura decimal ImportePendiente = CompImp.Comprobante.Total - CompImp.Comprobante.ImporteCancelado; // Intento cancelar todo decimal Cancelando = ImportePendiente; // Si se acabó la plata, hago un pago parcial if (Cancelando > TotalACancelar) Cancelando = TotalACancelar; // Si alcanzo a cancelar algo, lo asiento if (Cancelando > 0) CompImp.Comprobante.CancelarImporte(Cancelando, comprob); CompImp.Importe = Cancelando; TotalACancelar -= Cancelando; if (TotalACancelar <= 0) break; } } if (TotalACancelar > 0) { // Si queda más saldo, sigo buscando facturas a cancelar qGen.Select SelFacConSaldo = new qGen.Select("comprob"); SelFacConSaldo.WhereClause = new qGen.Where(); SelFacConSaldo.WhereClause.AddWithValue("impresa", qGen.ComparisonOperators.NotEqual, 0); SelFacConSaldo.WhereClause.AddWithValue("anulada", 0); SelFacConSaldo.WhereClause.AddWithValue("numero", qGen.ComparisonOperators.GreaterThan, 0); SelFacConSaldo.WhereClause.AddWithValue("id_formapago", qGen.ComparisonOperators.In, new int[] { 1, 3, 99 }); SelFacConSaldo.WhereClause.AddWithValue("cancelado", qGen.ComparisonOperators.LessThan, new qGen.SqlExpression("total")); SelFacConSaldo.WhereClause.AddWithValue("id_cliente", cliente.Id); SelFacConSaldo.WhereClause.AddWithValue("tipo_fac", qGen.ComparisonOperators.In, new string[] { "FA", "FB", "FC", "FE", "FM", "NDA", "NDB", "NDC", "NDE", "NDM" }); if (importe > 0) { // Cancelo facturas y ND regulares SelFacConSaldo.WhereClause.AddWithValue("compra", 0); } else { // Cancelo facturas y de compra SelFacConSaldo.WhereClause.AddWithValue("compra", qGen.ComparisonOperators.NotEqual, 0); } SelFacConSaldo.Order = "id_comprob"; using (System.Data.DataTable FacturasConSaldo = cliente.Connection.Select(SelFacConSaldo)) { foreach (System.Data.DataRow Factura in FacturasConSaldo.Rows) { Lbl.Comprobantes.ComprobanteConArticulos Fact = new ComprobanteConArticulos(cliente.Connection, (Lfx.Data.Row)Factura); decimal SaldoFactura = Fact.ImporteImpago; decimal ImporteASaldar = SaldoFactura; if (ImporteASaldar > TotalACancelar) ImporteASaldar = TotalACancelar; listaComprob.AddWithValue(Fact, ImporteASaldar); Fact.CancelarImporte(ImporteASaldar, comprob); TotalACancelar -= ImporteASaldar; if (TotalACancelar <= 0) break; } } } /* if (TotalACancelar > 0) { Lbl.Cajas.Concepto Conc; if (comprob is Recibo) Conc = ((Recibo)comprob).Concepto; else Conc = Lbl.Cajas.Concepto.IngresosPorFacturacion; cliente.CuentaCorriente.Movimiento(true, Conc, "Saldo s/" + comprob.ToString(), TotalACancelar * DireccionCtaCte, comprob.Obs, comprob as Lbl.Comprobantes.ComprobanteConArticulos, comprob as Lbl.Comprobantes.Recibo, null); cliente.CuentaCorriente.CancelarComprobantesConSaldo(TotalACancelar * -DireccionCtaCte, true); TotalACancelar = 0; } */ // Devuelvo el sobrante return TotalACancelar; }
public Numerador(Lbl.Comprobantes.Comprobante comprob) { this.Comprob = comprob; }
public Generador(Lbl.Comprobantes.Comprobante comprobante) { this.Comprobante = comprobante; }