Exemplo n.º 1
0
        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());
            }
        }
Exemplo n.º 2
0
        private Lfx.Types.OperationResult EditarPago()
        {
            Lbl.Comprobantes.ComprobanteConArticulos Factura = this.Elemento as Lbl.Comprobantes.ComprobanteConArticulos;

            if (Factura.ImporteCancelado >= Factura.Total)
            {
                return(new Lfx.Types.FailureOperationResult("Este comprobante ya fue cancelado en su totalidad."));
            }

            if (Factura.FormaDePago.Tipo == Lbl.Pagos.TiposFormasDePago.Efectivo)
            {
                using (IDbTransaction Trans = Factura.Connection.BeginTransaction()) {
                    Factura.AsentarPago(false);
                    Factura.MoverExistencias(false);
                    Trans.Commit();
                }
                this.PuedeEditarPago = false;
            }
            else if (Factura.FormaDePago.Tipo == Lbl.Pagos.TiposFormasDePago.CuentaCorriente)
            {
                CrearReciboParaEstaFactura();
            }
            else
            {
                using (Comprobantes.Recibos.EditarCobro FormularioEditarPago = new Comprobantes.Recibos.EditarCobro()) {
                    FormularioEditarPago.Cobro.FromCobro(new Lbl.Comprobantes.Cobro(this.Connection, Factura.FormaDePago));
                    FormularioEditarPago.Cobro.FormaDePagoEditable = true;
                    FormularioEditarPago.Cobro.Importe             = Factura.Total;
                    FormularioEditarPago.Cobro.ImporteVisible      = true;
                    FormularioEditarPago.Cobro.ImporteEditable     = false;
                    if (FormularioEditarPago.ShowDialog() == DialogResult.OK)
                    {
                        Lbl.Comprobantes.Cobro MiCobro = FormularioEditarPago.Cobro.ToCobro(Factura.Connection);
                        if (MiCobro.FormaDePago.Id != Factura.FormaDePago.Id)
                        {
                            // Tengo que actualizar la forma de pago
                            using (IDbTransaction Trans = Factura.Connection.BeginTransaction()) {
                                Factura.FormaDePago       = MiCobro.FormaDePago;
                                EntradaFormaPago.Elemento = MiCobro;
                                Factura.Connection.FieldInt("UPDATE comprob SET id_formapago=" + MiCobro.FormaDePago.Id.ToString() + " WHERE id_comprob=" + Factura.Id.ToString());
                                if (MiCobro.FormaDePago.Tipo == Lbl.Pagos.TiposFormasDePago.CuentaCorriente)
                                {
                                    // Si la nueva forma de pago es cta. cte., asiento el saldo
                                    // Y uso saldo a favor, si lo hay
                                    decimal Saldo = Factura.Cliente.CuentaCorriente.ObtenerSaldo(true);
                                    Factura.Cliente.CuentaCorriente.AsentarMovimiento(true,
                                                                                      Lbl.Cajas.Concepto.IngresosPorFacturacion,
                                                                                      "Saldo a Cta. Cte. s/" + Factura.ToString(),
                                                                                      Factura.ImporteImpago,
                                                                                      null,
                                                                                      Factura,
                                                                                      null,
                                                                                      null);
                                    if (Saldo < 0)
                                    {
                                        Saldo = Math.Abs(Saldo);
                                        if (Saldo > Factura.Total)
                                        {
                                            Factura.CancelarImporte(Factura.Total, null);
                                        }
                                        else
                                        {
                                            Factura.CancelarImporte(Saldo, null);
                                        }
                                    }
                                }
                                Trans.Commit();
                            }
                        }
                        switch (Factura.FormaDePago.Tipo)
                        {
                        case Lbl.Pagos.TiposFormasDePago.Efectivo:
                            using (IDbTransaction TransEfe = Factura.Connection.BeginTransaction()) {
                                Lbl.Cajas.Caja CajaDiaria = new Lbl.Cajas.Caja(Factura.Connection, Lfx.Workspace.Master.CurrentConfig.Empresa.CajaDiaria);
                                CajaDiaria.Movimiento(true, Lbl.Cajas.Concepto.IngresosPorFacturacion, Factura.ToString(), Factura.Cliente, Factura.ImporteImpago, Factura.Obs, Factura, null, null);
                                Factura.CancelarImporte(Factura.Total, null);
                                TransEfe.Commit();
                            }
                            break;

                        case Lbl.Pagos.TiposFormasDePago.CuentaCorriente:
                            CrearReciboParaEstaFactura();
                            break;

                        case Lbl.Pagos.TiposFormasDePago.ChequeTerceros:
                            using (IDbTransaction TransCheTer = Factura.Connection.BeginTransaction()) {
                                Lbl.Bancos.Cheque Cheque = MiCobro.Cheque;
                                Cheque.Concepto      = Lbl.Cajas.Concepto.IngresosPorFacturacion;
                                Cheque.ConceptoTexto = "Cobro s/" + this.Elemento.ToString();
                                Cheque.Factura       = Factura;
                                Cheque.Guardar();
                                Factura.CancelarImporte(Factura.Total, null);
                                TransCheTer.Commit();
                            }
                            PuedeEditarPago = false;
                            break;

                        case Lbl.Pagos.TiposFormasDePago.Tarjeta:
                            using (IDbTransaction TransTarj = Factura.Connection.BeginTransaction()) {
                                Lbl.Pagos.Cupon CuponCredito = MiCobro.Cupon;
                                CuponCredito.Concepto      = Lbl.Cajas.Concepto.IngresosPorFacturacion;
                                CuponCredito.ConceptoTexto = "Cobro s/" + Factura.ToString();

                                if (EntradaVendedor.ValueInt > 0)
                                {
                                    CuponCredito.Vendedor = new Lbl.Personas.Persona(Factura.Connection, EntradaVendedor.ValueInt);
                                }

                                CuponCredito.Factura = Factura;
                                CuponCredito.Guardar();

                                Factura.CancelarImporte(Factura.Total, null);
                                TransTarj.Commit();
                            }
                            PuedeEditarPago = false;
                            break;

                        case Lbl.Pagos.TiposFormasDePago.Caja:
                            using (IDbTransaction TransCaja = Factura.Connection.BeginTransaction()) {
                                Lbl.Cajas.Caja CajaDeposito = MiCobro.CajaDestino;
                                CajaDeposito.Movimiento(true, Lbl.Cajas.Concepto.IngresosPorFacturacion, "Cobro s/" + Factura.ToString(), Factura.Cliente, MiCobro.Importe, MiCobro.Obs, Factura, null, null);
                                Factura.CancelarImporte(Factura.Total, null);
                                TransCaja.Commit();
                            }
                            PuedeEditarPago = false;
                            break;

                        default:
                            throw new NotImplementedException("No se reconoce la forma de pago " + Factura.FormaDePago.Tipo.ToString());
                        }
                    }
                    else
                    {
                        return(new Lfx.Types.SuccessOperationResult());
                    }
                }
                this.PuedeEditarPago = false;
            }

            return(new Lfx.Types.SuccessOperationResult());
        }
Exemplo n.º 3
0
                public Lazaro.Impresion.Comprobantes.Fiscal.Respuesta ImprimirComprobante(int idComprob)
                {
                        try {
                                using (System.Diagnostics.Process Yo = System.Diagnostics.Process.GetCurrentProcess()) {
                                        Yo.PriorityClass = System.Diagnostics.ProcessPriorityClass.AboveNormal;
                                }
                        } catch {
                                // No siempre puedo elevar mi propia prioridad (creo que sólo en Windows XP o en Vista/7 sin UAC)
                        }

                        // *** Inicializar la impresora fiscal
                        Lazaro.Impresion.Comprobantes.Fiscal.Respuesta Res = this.Inicializar();

                        if (Res.Error != ErroresFiscales.Ok)
                                return Res;

                        NotificacionEventHandler NotifHandler = Notificacion;
                        if (NotifHandler != null)
                                NotifHandler(this, new ImpresoraEventArgs(ImpresoraEventArgs.EventTypes.InicioImpresion));

                        // *** Obtener datos previos
                        Lbl.Comprobantes.ComprobanteConArticulos Comprob = new Lbl.Comprobantes.ComprobanteConArticulos(DataBase, idComprob);

                        if (Comprob.Impreso)
                                return new Respuesta(ErroresFiscales.Ok);

                        string TipoDocumento = null;
                        string Letra = null;

                        switch (Modelo) {
                                case Lbl.Impresion.ModelosFiscales.EpsonTiquedora:
                                        if (Comprob.Tipo.EsNotaDebito) {
                                                TipoDocumento = "D";
                                        } else if (Comprob.Tipo.EsNotaCredito) {
                                                TipoDocumento = "M";
                                        } else {
                                                TipoDocumento = "T";
                                        }
                                        break;
                                default:

                                        if (Comprob.Tipo.EsNotaDebito) {
                                                TipoDocumento = "D";
                                        } else if (Comprob.Tipo.EsNotaCredito) {
                                                TipoDocumento = "C";
                                        } else if (Comprob.Tipo.EsTicket) {
                                                TipoDocumento = "T";
                                        } else {
                                                TipoDocumento = "F";
                                        }
                                        break;
                        }

                        switch (Comprob.Tipo.Nomenclatura) {
                                case "FM":
                                case "NDM":
                                case "NCM":
                                        Letra = "M";
                                        break;
                                case "FA":
                                case "NDA":
                                        Letra = "A";
                                        break;
                                case "NCA":
                                        if (Modelo == Lbl.Impresion.ModelosFiscales.HasarTiquedora)
                                                Letra = "R";
                                        else
                                                Letra = "A";
                                        break;

                                case "FB":
                                case "NDB":
                                        Letra = "B";
                                        break;
                                case "NCB":
                                        if (Modelo == Lbl.Impresion.ModelosFiscales.HasarTiquedora)
                                                Letra = "S";
                                        else
                                                Letra = "B";
                                        break;

                                case "FC":
                                case "NDC":
                                        Letra = "C";
                                        break;
                                case "NCC":
                                        if (Modelo == Lbl.Impresion.ModelosFiscales.HasarTiquedora)
                                                Letra = "S";
                                        else
                                                Letra = "C";
                                        break;

                                case "FE":
                                case "NDE":
                                case "NCE":
                                        Letra = "E";
                                        break;
                        }

                        string ClienteTipoDoc = "DNI";
                        string ClienteNumDoc = Comprob.Cliente.NumeroDocumento.Replace("-", "").Replace(".", "");

                        if (Comprob.Cliente.TipoDocumento != null) {
                                switch (Comprob.Cliente.TipoDocumento.Id) {
                                        case 1:
                                                ClienteTipoDoc = "DNI";
                                                break;
                                        case 2:
                                                ClienteTipoDoc = "LE";
                                                break;
                                        case 3:
                                                ClienteTipoDoc = "LC";
                                                break;
                                        case 4:
                                                ClienteTipoDoc = "CI";
                                                break;
                                        case 5:
                                                if (ClienteNumDoc.Length > 0)
                                                        ClienteTipoDoc = "CUIL";
                                                break;
                                        case 6:
                                                if (ClienteNumDoc.Length > 0)
                                                        ClienteTipoDoc = "CUIT";
                                                break;
                                        default:
                                                ClienteTipoDoc = "DNI";
                                                break;
                                }
                        }

                        if (Comprob.Cliente.SituacionTributaria != null) {
                                switch (Comprob.Cliente.SituacionTributaria.Id) {
                                        case 1:
                                                ClienteNumDoc = Comprob.Cliente.NumeroDocumento.Replace("-", "").Replace(" ", "").Replace(".", "");
                                                ClienteTipoDoc = "DNI";
                                                break;
                                        case 2:
                                                ClienteTipoDoc = "CUIT";
                                                ClienteNumDoc = Comprob.Cliente.ClaveTributaria.ToString().Replace("-", "");
                                                break;
                                        case 3:
                                                ClienteTipoDoc = "CUIT";
                                                ClienteNumDoc = Comprob.Cliente.ClaveTributaria.ToString().Replace("-", "");
                                                break;
                                        case 4:
                                                ClienteTipoDoc = "CUIT";
                                                ClienteNumDoc = Comprob.Cliente.ClaveTributaria.ToString().Replace("-", "");
                                                break;
                                        case 5:
                                                ClienteTipoDoc = "CUIT";
                                                ClienteNumDoc = Comprob.Cliente.ClaveTributaria.ToString().Replace("-", "");
                                                break;
                                }
                        }

                        Comando ComandoAEnviar;

                        string TextoRemitoLinea1 = "";
                        string TextoRemitoLinea2 = "";

                        if (Comprob.IdRemito == 0) {
                                if (Comprob.Obs == null) {
                                        TextoRemitoLinea1 = "";
                                } else if (Comprob.Obs.Length > 40) {
                                        TextoRemitoLinea1 = Comprob.Obs.Substring(0, 40);
                                        int RestoObs = Comprob.Obs.Length - 40;
                                        if (RestoObs > 40)
                                                RestoObs = 40;
                                        TextoRemitoLinea2 = Comprob.Obs.Substring(40, RestoObs);
                                } else {
                                        TextoRemitoLinea1 = Comprob.Obs;
                                }
                        } else {
                                TextoRemitoLinea1 = "Remito(s) " + Comprob.IdRemito.ToString();
                        }

                        string Domicilio = Comprob.Cliente.Domicilio;
                        string ClienteLocalidad = "";
                        if (Comprob.Cliente.Localidad != null)
                                ClienteLocalidad = Comprob.Cliente.Localidad.ToString();

                        //si hay un documento abierto (fiscal, no fiscal o no fiscal homologado) lo cancelo
                        Res = ObtenerEstadoImpresora();
                        if (Res.EstadoFiscal.DocumentoAbierto) {
                                Res = CancelarDocumentoFiscal();
                                System.Threading.Thread.Sleep(500);
                        }
                        // *** Abrir Documento
                        if (NotifHandler != null)
                                NotifHandler(this, new ImpresoraEventArgs("Abrir documento fiscal"));

                        switch (Modelo) {
                                case Lbl.Impresion.ModelosFiscales.EpsonTiquedora:
                                case Lbl.Impresion.ModelosFiscales.EpsonGenerico:
                                case Lbl.Impresion.ModelosFiscales.Emulacion:
                                        string ClienteLinea1 = "";
                                        string ClienteLinea2 = "";

                                        if (Comprob.Cliente.ToString().Length > 40) {
                                                ClienteLinea1 = Comprob.Cliente.ToString().Substring(0, 40);
                                                ClienteLinea2 = Comprob.Cliente.ToString().Substring(40, Comprob.Cliente.ToString().Length - 40);
                                        } else {
                                                ClienteLinea1 = Comprob.Cliente.ToString();
                                                ClienteLinea2 = "";
                                        }

                                        if (Domicilio.Length > 40)
                                                Domicilio = Domicilio.Substring(0, 40);

                                        if (ClienteLocalidad.Length > 40)
                                                ClienteLocalidad = ClienteLocalidad.Substring(0, 40);

                                        string ClienteSituacionEpson = "";
                                        switch (Comprob.Cliente.SituacionTributaria.Id) {
                                                case 1:
                                                        ClienteSituacionEpson = "F";
                                                        break;
                                                case 2:
                                                        ClienteSituacionEpson = "I";
                                                        break;
                                                case 3:
                                                        ClienteSituacionEpson = "R";
                                                        break;
                                                case 4:
                                                        ClienteSituacionEpson = "M";
                                                        break;
                                                case 5:
                                                        ClienteSituacionEpson = "E";
                                                        break;
                                                default:
                                                        ClienteSituacionEpson = "S";
                                                        break;
                                        }
                                        if (Modelo == Lbl.Impresion.ModelosFiscales.EpsonTiquedora) {
                                                // La impresora epson TMU220 no acepta vacios por eso cambio por un punto.
                                                string Vacio=".";
                                                        if (TextoRemitoLinea1=="")
                                                        TextoRemitoLinea1 = ".";
                                                        if (TextoRemitoLinea2 == "")
                                                        TextoRemitoLinea2 = ".";
                                                
                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.EpsonDocumentoFiscalAbrir,
                                                         TipoDocumento,
                                                         "C",
                                                         Letra,
                                                         "1",
                                                         "P",
                                                         "10",
                                                         "I",
                                                        FiscalizarTexto(ClienteSituacionEpson),
                                                        FiscalizarTexto(ClienteLinea1),
                                                        FiscalizarTexto(ClienteLinea2),
                                                        FiscalizarTexto(ClienteTipoDoc),
                                                        FiscalizarTexto(ClienteNumDoc),
                                                        "N",
                                                        FiscalizarTexto(Domicilio),
                                                        FiscalizarTexto(ClienteLocalidad),
                                                        Vacio,
                                                        FiscalizarTexto(TextoRemitoLinea1),
                                                        FiscalizarTexto(TextoRemitoLinea2),
                                                        "C");
                                        } else {
                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.EpsonDocumentoFiscalAbrir,
                                                        TipoDocumento,
                                                        "C",
                                                        Letra,
                                                        "1",
                                                        "F",
                                                        "12",
                                                        "I",
                                                        FiscalizarTexto(ClienteSituacionEpson),
                                                        FiscalizarTexto(ClienteLinea1),
                                                        FiscalizarTexto(ClienteLinea2),
                                                        FiscalizarTexto(ClienteTipoDoc),
                                                        FiscalizarTexto(ClienteNumDoc),
                                                        "N",
                                                        FiscalizarTexto(Domicilio),
                                                        FiscalizarTexto(ClienteLocalidad),
                                                        "",
                                                        FiscalizarTexto(TextoRemitoLinea1),
                                                        FiscalizarTexto(TextoRemitoLinea2),
                                                        "C");
                                        }
                                                Res = Enviar(ComandoAEnviar);
                                        
                                        break;

                                case Lbl.Impresion.ModelosFiscales.HasarTiquedora:
                                case Lbl.Impresion.ModelosFiscales.HasarGenerico:
                                        if (Comprob.Cliente.Id != 999) {
                                                //Sólo envío comando SetCustomerData (HasarDocumentoSetDatosCliente)
                                                //si el cliente NO es consumidor final
                                                string ClienteSituacionHasar = "";
                                                switch (Comprob.Cliente.SituacionTributaria.Id) {
                                                        case 1:
                                                                ClienteSituacionHasar = "C";
                                                                break;
                                                        case 2:
                                                                ClienteSituacionHasar = "I";
                                                                break;
                                                        case 3:
                                                                // No existente en los modelos SMH/P- 715F, SMH/P-PR5F, SMH/P-441F y SMH/P-451F 
                                                                ClienteSituacionHasar = "N";
                                                                break;
                                                        case 4:
                                                                // No existente en el modelo SMH/P-PR4F
                                                                ClienteSituacionHasar = "M";
                                                                break;
                                                        case 5:
                                                                ClienteSituacionHasar = "E";
                                                                break;
                                                        case 6:
                                                                ClienteSituacionHasar = "A";
                                                                break;
                                                        case 7:
                                                                ClienteSituacionHasar = "T";
                                                                break;
                                                }

                                                string TipoDocumentoClienteHasar = " ";
                                                switch (ClienteTipoDoc) {
                                                        case "CUIT":
                                                                TipoDocumentoClienteHasar = "C";
                                                                break;
                                                        case "CUIL":
                                                                TipoDocumentoClienteHasar = "L";
                                                                break;
                                                        case "LE":
                                                                TipoDocumentoClienteHasar = "0";
                                                                break;
                                                        case "LC":
                                                                TipoDocumentoClienteHasar = "1";
                                                                break;
                                                        case "DNI":
                                                                TipoDocumentoClienteHasar = "2";
                                                                break;
                                                        case "PP":
                                                                TipoDocumentoClienteHasar = "3";
                                                                break;
                                                        case "CI":
                                                                TipoDocumentoClienteHasar = "4";
                                                                break;
                                                        default:
                                                                TipoDocumentoClienteHasar = " ";// Sin clasificador
                                                                break;
                                                }

                                                string NombreClienteHasar = Comprob.Cliente.ToString();
                                                // Comando  SetCustomerData (Manual Comandos Hasar)
                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoSetDatosCliente,
                                                        FiscalizarTexto(NombreClienteHasar, 30),
                                                        ClienteNumDoc,
                                                        ClienteSituacionHasar,
                                                        TipoDocumentoClienteHasar,
                                                        FiscalizarTexto(Domicilio, 40));
                                                Res = Enviar(ComandoAEnviar);
                                        }

                                        //Abrir documento   

                                        string TipoDocumentoHasar = "B";
                                        if (TipoDocumento == "D" && Letra == "A")
                                                TipoDocumentoHasar = "D";	//ND A
                                        else if (TipoDocumento == "D")
                                                TipoDocumentoHasar = "E";	//ND B Y C
                                        else if (TipoDocumento == "F" && Letra == "A")
                                                TipoDocumentoHasar = "A";	//Fac A
                                        else if (TipoDocumento == "F")
                                                TipoDocumentoHasar = "B";	//Fac B y C
                                        else if (TipoDocumento == "T")
                                                TipoDocumentoHasar = "T";	//Ticket


                                        if (Modelo == Lbl.Impresion.ModelosFiscales.HasarTiquedora) {
                                                string NombreFantasiaHasar = Lbl.Sys.Config.Empresa.Nombre.ToUpper();
                                                int EspaciosParaCentrado = NombreFantasiaHasar.Length;
                                                int EspaciosAIncertar;
                                                Comando EstablecerTituloTiquet;
                                                if (NombreFantasiaHasar.Length <= 20) {
                                                        if (NombreFantasiaHasar.Length >= 19) {
                                                                // El caracter especial ô indica que la imprecion debe ser con doble ancho, en dicho caso La cantidad maxima de caracteres se reduce de 40 a 20 
                                                                EstablecerTituloTiquet = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalNombreFantasia,
                                                                "2",
                                                                'ô' + NombreFantasiaHasar);
                                                                Res = Enviar(EstablecerTituloTiquet);
                                                        }
                                                        if (NombreFantasiaHasar.Length < 19) {
                                                                EspaciosParaCentrado = (20 - NombreFantasiaHasar.Length) / 2;
                                                                EspaciosAIncertar = NombreFantasiaHasar.Length + EspaciosParaCentrado;
                                                                NombreFantasiaHasar = NombreFantasiaHasar.PadLeft(EspaciosAIncertar, ' ');
                                                                // El caracter especial ô indica que la imprecion debe ser con doble ancho, en dicho caso La cantidad maxima de caracteres se reduce de 40 a 20 
                                                                EstablecerTituloTiquet = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalNombreFantasia,
                                                                "2",
                                                                'ô' + NombreFantasiaHasar);
                                                                Res = Enviar(EstablecerTituloTiquet);
                                                        }


                                                } else {
                                                        EstablecerTituloTiquet = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalNombreFantasia,
                                                                        "2",
                                                                        NombreFantasiaHasar);
                                                        Res = Enviar(EstablecerTituloTiquet);

                                                }


                                                //N° de línea de encabezamiento (1-10) o cola (11-20)
                                                //0: borra encabezamiento y cola,  -1: borra encabezamiento,  -2: borra cola. 
                                                Comando EstablecerEncabezadoCola = new Comando(CodigosComandosFiscales.HasarDocumentoEstablecerEncabezadoCola,
                                                                "12",
                                                                "        Muchas gracias por su compra");
                                                Res = Enviar(EstablecerEncabezadoCola);
                                        }

                                        if (Letra == "S" || Letra == "R") {
                                                // Para notas de Crédito primero tengo que acentar los datos del comprobante original y luego abrir el documento 
                                                string ComprobanteOriginal = Comprob.ComprobanteOriginal.Nombre;
                                                string[] partes = ComprobanteOriginal.Split(new char[] { '-' });
                                                ComprobanteOriginal = partes[1];
                                                // El segundo parámetro corresponde al numero de línea donde se va a imprimir la información del comprobante original 
                                                // 0: Borra ambas líneas
                                                Comando ComandoEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalCargarComprobanteOriginal, "1",
                                                          ComprobanteOriginal);
                                                Res = Enviar(ComandoEnviar);

                                                ComandoEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoNoFiscalHomologadoAbrir, Letra, "T"
                                                        );
                                                Res = Enviar(ComandoEnviar);


                                        } else {
                                                // El segundo parámetro corresponde al numero de línea donde se va a imprimir la información del comprobante original 
                                                // 0: Borra ambas líneas
                                                // Borro cualquier línea que haya quedado de una nota de crédito anterior 
                                                Comando ComandoEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalCargarComprobanteOriginal, "0",
                                                          "1234");
                                                Res = Enviar(ComandoEnviar);
                                                // Comando OpenFiscalReceipt (Manual de comandos Hasar) 
                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalAbrir,
                                                        TipoDocumentoHasar,
                                                        "T");
                                                Res = Enviar(ComandoAEnviar);
                                        }
                                        break;
                        }

                        if (Res.Error != ErroresFiscales.Ok) {
                                Res.Lugar = "DocumentoFiscalAbrir";
                                return Res;
                        }

                        // *** Imprimir Detalles
                        foreach (Lbl.Comprobantes.DetalleArticulo Detalle in Comprob.Articulos) {
                                string StrCodigo = Lfx.Workspace.Master.CurrentConfig.Productos.CodigoPredeterminado();

                                if (Detalle.Articulo != null) {
                                        if (StrCodigo == "id_articulo")
                                                StrCodigo = Detalle.Articulo.Id.ToString();
                                        else
                                                StrCodigo = DataBase.FieldString("SELECT " + StrCodigo + " FROM articulos WHERE id_articulo=" + Detalle.Articulo.Id.ToString());
                                }

                                if (StrCodigo.Length > 0)
                                        StrCodigo = "(" + StrCodigo + ") ";

                                decimal Cantidad = Detalle.Cantidad;
                                decimal Unitario = Detalle.UnitarioAImprimir;

                                //Si es cantidad negativa, pongo precio negativo y cantidad positiva
                                if (Cantidad < 0) {
                                        Cantidad = -Cantidad;
                                        Unitario = -Unitario;
                                }

                                string ItemNombre = Detalle.Nombre;
                                string ParametroSumaResta;
                                switch (Modelo) {
                                        case Lbl.Impresion.ModelosFiscales.EpsonTiquedora:
                                                ParametroSumaResta = "M";
                                                if (Unitario < 0)
                                                        ParametroSumaResta = "R";
                                                
                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.EpsonDocumentoFiscalItem,
                                                        FiscalizarTexto(ItemNombre,18),
                                                        FormatearNumeroEpson(Cantidad, 3).PadLeft(8, '0'),
                                                        FormatearNumeroEpson(Math.Abs(Unitario), 2).PadLeft(9, '0'),
                                                        "0000",
                                                        ParametroSumaResta,
                                                        "00001",
                                                        "00000000",
                                                        "",
                                                        "",
                                                        "",
                                                        "0000",
                                                        "000000000000000");
                                                Res = Enviar(ComandoAEnviar);
                                                Res = Enviar(new Comando(CodigosComandosFiscales.EpsonDocumentoFiscalSubtotal, "P", ""));
                                                break;
                                        case Lbl.Impresion.ModelosFiscales.EpsonGenerico:
                                        case Lbl.Impresion.ModelosFiscales.Emulacion:
                                                ParametroSumaResta = "M";
                                                if (Unitario < 0)
                                                        ParametroSumaResta = "R";

                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.EpsonDocumentoFiscalItem,
                                                        FiscalizarTexto(ItemNombre).PadRight(54).Substring(0, 54),
                                                        FormatearNumeroEpson(Cantidad, 3).PadLeft(8, '0'),
                                                        FormatearNumeroEpson(Math.Abs(Unitario), 2).PadLeft(9, '0'),
                                                        "0000",
                                                        ParametroSumaResta,
                                                        "00001",
                                                        "00000000",
                                                        "",
                                                        "",
                                                        "",
                                                        "0000",
                                                        "000000000000000");
                                                Res = Enviar(ComandoAEnviar);
                                                
                                                break;

                                        case Lbl.Impresion.ModelosFiscales.HasarTiquedora:
                                        case Lbl.Impresion.ModelosFiscales.HasarGenerico:
                                                if (Detalle.DatosSeguimiento != null && Detalle.DatosSeguimiento.Count > 0) {
                                                        ComandoAEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalTexto,
                                                                FiscalizarTexto(Detalle.DatosSeguimiento.ToString(), 50),
                                                                "0"
                                                                );
                                                        Res = Enviar(ComandoAEnviar);
                                                        if (Res.Error != ErroresFiscales.Ok) {
                                                                Res.Lugar = "DocumentoFiscalText";
                                                                return Res;
                                                        }
                                                }

                                                if (Unitario < 0) {
                                                        ComandoAEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalDescuentoGeneral,
                                                                FiscalizarTexto(ItemNombre, 50),
                                                                FormatearNumeroHasar(Math.Abs(Unitario), 2),
                                                                "m",
                                                                "0",
                                                                "T");
                                                } else {
                                                        ComandoAEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalItem,
                                                                FiscalizarTexto(ItemNombre, 50),
                                                                FormatearNumeroHasar(Cantidad, 2),
                                                                FormatearNumeroHasar(Unitario, 2),
                                                                "0.0", /* IVA */
                                                                "M",
                                                                "0.0", /* Impuestos Interno s */
                                                                "0", /* Campo Display */
                                                                "B" /* Precio total o base */
                                                                );
                                                }
                                                Res = Enviar(ComandoAEnviar);
                                                break;
                                }

                                if (Res.Error != ErroresFiscales.Ok) {
                                        Res.Lugar = "DocumentoFiscalItem";
                                        return Res;
                                }
                        }

                        // Calculo el total real, tomando en cuenta el redondeo y los decimales
                        if (Comprob.Descuento > 0) {
                                decimal MontoDescuento = Comprob.SubTotal * (Comprob.Descuento / 100);

                                switch (Modelo) {
                                        case Lbl.Impresion.ModelosFiscales.EpsonTiquedora:
                                        case Lbl.Impresion.ModelosFiscales.EpsonGenerico:
                                        case Lbl.Impresion.ModelosFiscales.Emulacion:
                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.EpsonDocumentoFiscalPagosYDescuentos,
                                                        "Descuento " + Lfx.Types.Formatting.FormatCurrencyForPrint(Comprob.Descuento, 2) + "%",
                                                        FormatearNumeroEpson(MontoDescuento, 2).PadLeft(12, '0'),
                                                        "D");
                                                Res = Enviar(ComandoAEnviar);
                                                break;

                                        case Lbl.Impresion.ModelosFiscales.HasarTiquedora:
                                        case Lbl.Impresion.ModelosFiscales.HasarGenerico:
                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalDescuentoGeneral,
                                                        "Descuento " + Lfx.Types.Formatting.FormatCurrencyForPrint(Comprob.Descuento, 2) + "%",
                                                        FormatearNumeroHasar(MontoDescuento, 2),
                                                        "m",
                                                        "0",
                                                        "T");
                                                Res = Enviar(ComandoAEnviar);
                                                break;
                                }

                                if (Res.Error != ErroresFiscales.Ok) {
                                        Res.Lugar = "DocumentoFiscalPagosYDescuentos:Descuento";
                                        return Res;
                                }
                        }

                        if (Math.Abs(Comprob.TotalSinRedondeo - Comprob.Total) >= 0.001m) {
                                switch (Modelo) {
                                        case Lbl.Impresion.ModelosFiscales.EpsonTiquedora:
                                        case Lbl.Impresion.ModelosFiscales.EpsonGenerico:
                                        case Lbl.Impresion.ModelosFiscales.Emulacion:
                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.EpsonDocumentoFiscalPagosYDescuentos,
                                                        "Ajustes por Redondeo",
                                                        FormatearNumeroEpson((Comprob.Total - Comprob.TotalSinRedondeo), 2).PadLeft(12, '0'),
                                                        "D");
                                                Res = Enviar(ComandoAEnviar);
                                                break;

                                        case Lbl.Impresion.ModelosFiscales.HasarTiquedora:
                                        case Lbl.Impresion.ModelosFiscales.HasarGenerico:
                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalDescuentoGeneral,
                                                        "Ajustes por Redondeo",
                                                        FormatearNumeroHasar((Comprob.Total - Comprob.TotalSinRedondeo), 2),
                                                        "m",
                                                        "0",
                                                        "T");
                                                Res = Enviar(ComandoAEnviar);
                                                break;
                                }

                                if (Res.Error != ErroresFiscales.Ok) {
                                        // Error, pero continúo
                                        // Res.Lugar = "DocumentoFiscalPagosYDescuentos:Redondeo"
                                        // If Not (OFormFiscalEstado Is Nothing) Then OFormFiscalEstado.Listo()
                                        // Return Res
                                }
                        }

                        //Recargos
                        if (Comprob.Recargo > 0) {
                                switch (Modelo) {
                                        case Lbl.Impresion.ModelosFiscales.EpsonTiquedora:
                                        case Lbl.Impresion.ModelosFiscales.EpsonGenerico:
                                        case Lbl.Impresion.ModelosFiscales.Emulacion:
                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.EpsonDocumentoFiscalPagosYDescuentos,
                                                        "Recargo " + Lfx.Types.Formatting.FormatCurrencyForPrint(Comprob.Recargo, Lfx.Workspace.Master.CurrentConfig.Moneda.DecimalesCosto) + "%",
                                                        FormatearNumeroEpson(Comprob.SubTotal * (Comprob.Recargo / 100), 2).PadLeft(12, '0'),
                                                        "R");
                                                Res = Enviar(ComandoAEnviar);
                                                break;

                                        case Lbl.Impresion.ModelosFiscales.HasarTiquedora:
                                        case Lbl.Impresion.ModelosFiscales.HasarGenerico:
                                                ComandoAEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalDevolucionesYRecargos,
                                                        "Recargo " + Lfx.Types.Formatting.FormatCurrencyForPrint(Comprob.Recargo, Lfx.Workspace.Master.CurrentConfig.Moneda.DecimalesCosto) + "%",
                                                        FormatearNumeroHasar(Comprob.SubTotal * (Comprob.Recargo / 100), 2).PadLeft(10, '0'),
                                                        "M",
                                                        "00000000000",
                                                        "0",
                                                        "T",
                                                        "B");
                                                Res = Enviar(ComandoAEnviar);
                                                break;

                                }

                                if (Res.Error != ErroresFiscales.Ok) {
                                        Res.Lugar = "DocumentoFiscalPagosYDescuentos:Interes";
                                        return Res;
                                }
                        }

                        // Pago
                        switch (Modelo) {
                                case Lbl.Impresion.ModelosFiscales.EpsonTiquedora:
                                case Lbl.Impresion.ModelosFiscales.EpsonGenerico:
                                case Lbl.Impresion.ModelosFiscales.Emulacion:
                                        ComandoAEnviar = new Comando(CodigosComandosFiscales.EpsonDocumentoFiscalPagosYDescuentos,
                                                FiscalizarTexto(Comprob.FormaDePago.ToString(), 50),
                                                FormatearNumeroEpson(Comprob.Total, 2).PadLeft(12, '0'),
                                                "T");
                                        Res = Enviar(ComandoAEnviar);
                                        break;

                                case Lbl.Impresion.ModelosFiscales.HasarTiquedora:
                                case Lbl.Impresion.ModelosFiscales.HasarGenerico:
                                        ComandoAEnviar = new Comando(CodigosComandosFiscales.HasarDocumentoFiscalPago,
                                                FiscalizarTexto(Comprob.FormaDePago.ToString(), 50),
                                                FormatearNumeroHasar(Comprob.Total, 2),
                                                "T",
                                                "0");
                                        Res = Enviar(ComandoAEnviar);
                                        break;
                        }


                        if (Res.Error != ErroresFiscales.Ok) {
                                Res.Lugar = "DocumentoFiscalPagosYDescuentos:Pago";
                                return Res;
                        }

                        // *** Cerrar Documento
                        switch (Modelo) {
                                case Lbl.Impresion.ModelosFiscales.EpsonTiquedora:
                                        Res = Enviar(new Comando(CodigosComandosFiscales.EpsonDocumentoFiscalCerrar, TipoDocumento, Letra, ""));
                                        break;
                                case Lbl.Impresion.ModelosFiscales.EpsonGenerico:
                                case Lbl.Impresion.ModelosFiscales.Emulacion:
                                        Res = Enviar(new Comando(CodigosComandosFiscales.EpsonDocumentoFiscalCerrar, TipoDocumento, Letra, "Final"));
                                        break;

                                case Lbl.Impresion.ModelosFiscales.HasarTiquedora:
                                case Lbl.Impresion.ModelosFiscales.HasarGenerico:
                                        if (Letra == "S" || Letra == "R") {
                                                // Si es nota de credito cierro dicha nota 
                                                Res = Enviar(new Comando(CodigosComandosFiscales.HasarDocumentoNoFiscalHomologadoCerrar, "1", ""));
                                        } else {

                                                // Comando CloseFiscalReceipt (Manual de comandos hasar)
                                                Res = Enviar(new Comando(CodigosComandosFiscales.HasarDocumentoFiscalCerrar, "1"));

                                        }
                                        break;

                        }

                        if (Res.Error != ErroresFiscales.Ok) {
                                Res.Lugar = "DocumentoFiscalCerrar";
                                return Res;
                        } else {
                                if (NotifHandler != null)
                                        NotifHandler(this, new ImpresoraEventArgs("Asentando el movimiento"));

                                IDbTransaction Trans = null;
                                try {
                                        Trans = Comprob.Connection.BeginTransaction(IsolationLevel.Serializable);

                                        // Marco la factura como impresa y numerada
                                        Comprob.Numerar(Res.NumeroComprobante, true);

                                        // Mover stock si corresponde
                                        Comprob.MoverExistencias(false);

                                        // Asentar pagos si corresponde
                                        Comprob.AsentarPago(false);

                                        Trans.Commit();
                                } catch (Exception ex) {
                                        Res = new Respuesta(ErroresFiscales.Error);
                                        Res.Mensaje = ex.ToString();
                                        if (Trans != null)
                                                Trans.Rollback();
                                }

                                if (NotifHandler != null)
                                        NotifHandler(this, new ImpresoraEventArgs("Se imprimió el comprobante"));
                                return Res;
                        }
                }