public Result Print(CommandDocument document)
        {
            int        ultimo = 0;
            Documentos curso;

            try
            {
                printer = new HASAR();
                Inicializar(printer, document.Header);
                printer.Comenzar();
                if (HasError(printer, document.Header, out message))
                {
                    throw new Exception(message);
                }

                //si no hay comprobante abierto cancela
                curso = printer.DocumentoEnCurso;
                if (curso == Documentos.D_NO_DOCUMENTO_EN_CURSO)
                {
                    throw new Exception("No hay documentos en curso iniciados");
                }

                //imprimir los comandos
                foreach (var command in document.Commands)
                {
                    printer.Enviar(command);
                }

                double total = 0;
                printer.LeerMontoTotal(FiscalHelper.GetDocumentoIVA(curso), out total);

                DocPrinter doc = new DocPrinter();
                doc.Class       = FiscalHelper.GetDocumentClass(curso);
                doc.DocDate     = printer.FechaHoraFiscal;
                doc.PosNum      = FiscalHelper.GetPosNumer(printer);
                doc.Type        = FiscalHelper.GetDocumentType(curso);
                doc.DocNum      = FiscalHelper.GetUltimoComprobanteACancelar(curso, printer).ToString();
                doc.TotalAmount = total;

                printer.Finalizar();
                return(new Success(doc));
            }
            catch (Exception ex)
            {
                printer.Abortar();
                try
                {
                    curso = printer.DocumentoEnCurso;
                    if (curso != Documentos.D_NO_DOCUMENTO_EN_CURSO)
                    {
                        ultimo = FiscalHelper.GetUltimoComprobanteACancelar(curso, printer);
                        printer.TratarDeCancelarTodo();
                    }
                }
                catch (Exception)
                { }
                printer.Finalizar();
                return(new Fail((ultimo == 0) ? string.Empty : ultimo.ToString(), ex.Message, ex));
            }
        }
        public Result Print(TestDocument document)
        {
            try
            {
                printer = new HASAR();
                Inicializar(printer, document.Header);
                printer.Comenzar();
                if (HasError(printer, document.Header, out message))
                {
                    throw new Exception(message);
                }
                try
                {
                    printer.TratarDeCancelarTodo();
                }
                catch (System.Exception)
                { }
                if (HasError(printer, document.Header, out message))
                {
                    throw new Exception(message);
                }
                printer.BorrarFantasiaEncabezadoCola(false, false, true);
                printer.AbrirComprobanteNoFiscal();

                printer.ImprimirTextoNoFiscal("Impresora:" + document.Header.PrinterName);
                printer.ImprimirTextoNoFiscal("IP:" + document.Header.Ip);
                printer.ImprimirTextoNoFiscal("Puerto:" + document.Header.Port.ToString());
                printer.ImprimirTextoNoFiscal("Sucursal:" + document.Header.Channel);
                printer.ImprimirTextoNoFiscal("Caja:" + document.Header.Registry);

                if (HasError(printer, document.Header, out message))
                {
                    throw new Exception(message);
                }
                printer.CerrarComprobanteNoFiscal();
                printer.Finalizar();
                return(new Success());
            }
            catch (Exception ex)
            {
                printer.Abortar();
                try
                {
                    printer.TratarDeCancelarTodo();
                }
                catch (Exception)
                { }
                printer.Finalizar();
                return(new Fail(ex.Message, ex));
            }
        }
        public Result Print(OpenCommandDocument document)
        {
            int        ultimo = 0;
            Documentos curso;

            try
            {
                printer = new HASAR();
                Inicializar(printer, document.Header);
                printer.Comenzar();
                if (HasError(printer, document.Header, out message))
                {
                    throw new Exception(message);
                }

                try
                {
                    //si hay un documento en curso busco el numero al cancelarlo
                    curso = printer.DocumentoEnCurso;
                    if (curso != Documentos.D_NO_DOCUMENTO_EN_CURSO)
                    {
                        ultimo = FiscalHelper.GetUltimoComprobanteACancelar(curso, printer);
                        printer.TratarDeCancelarTodo();
                    }
                }
                catch (Exception)
                { }
                if (HasError(printer, document.Header, out message))
                {
                    throw new Exception(message);
                }

                //imprimir los comandos
                foreach (var command in document.Commands)
                {
                    printer.Enviar(command);
                }

                //pedir comprobate
                curso = printer.DocumentoEnCurso;

                DocPrinter doc = new DocPrinter();
                doc.Class   = FiscalHelper.GetDocumentClass(curso);
                doc.DocDate = printer.FechaHoraFiscal;
                doc.PosNum  = FiscalHelper.GetPosNumer(printer);
                doc.Type    = FiscalHelper.GetDocumentType(curso);
                doc.DocNum  = FiscalHelper.GetUltimoComprobanteACancelar(curso, printer).ToString();

                printer.Finalizar();
                return(new Success((ultimo != 0) ? ultimo.ToString() : string.Empty, doc));
            }
            catch (Exception ex)
            {
                printer.Abortar();
                try
                {
                    curso = printer.DocumentoEnCurso;
                    if (curso != Documentos.D_NO_DOCUMENTO_EN_CURSO)
                    {
                        ultimo = FiscalHelper.GetUltimoComprobanteACancelar(curso, printer);
                        printer.TratarDeCancelarTodo();
                    }
                }
                catch (Exception)
                { }
                printer.Finalizar();
                return(new Fail((ultimo != 0) ? ultimo.ToString() : string.Empty, ex.Message, ex));
            }
        }