using System;
using Microsoft.Win32;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using LLNet.Utils;
using LLNet.GUI;
using System.Net;
using System.IO;
using DevExpress.XtraEditors;
using System.Xml;

namespace LLNet.Tienda.MainForms.Forms
{
    public partial class frmCoupons : GUI.FormBases.frmBase
    {
        private static string subTipoDocumentoPreimpreso;
        private string docDevPts;
        private string varUrlPts, varCodemprPts, varCodsucPts;
        private static string notac = "";
        private int pSkuAlt;

        public frmCoupons()
        {
            InitializeComponent();
            ctlMaster1.DataSource = Program.FrmMainPos.DsPedido;
            docDevPts = Program.FrmMainPos.pos.ctlAddSkus1.DocumentoPTS.ToString();
            GUI.CApp.TraducirForm(this);
            LlenarParametros();
        }

        public void FrmCupones(int psku)
        {
            this.pSkuAlt = psku;
        }

        #region mTrama
        /// <summary>
        /// Este método genera la trama y la envía al proveedor
        /// </summary>
        /// <param name="pDocumento"></param>
        private void mTrama(long pDocumento)
        {
            string vClave = String.Empty, vCodigo = String.Empty;
            string vEnvio_Trama = String.Empty;
            QueryParams vParametros = new QueryParams();
            string vRespuesta = String.Empty;
            string vRespuesta_Xml = String.Empty;
            string vUrl = String.Empty;
            try
            {
                vEnvio_Trama = Helpers.Nvl(CApp.GetParam("ETFE"), "N").ToString();

                if (vEnvio_Trama == "S")
                {
                    vParametros.AddReplaceParam("pNDOCUMENTO", pDocumento.ToString());
                    //
                    // Se crea la trama
                    GUI.CApp.bll.ExecuteSql("FE_P_CREAR_TRAMA", vParametros, "PDV");
                    //
                    // Obtiene la trama
                    using (DataSet vDatos = GUI.CApp.bll.getDataSet("PDV", "OBTENER_TRAMAS", vParametros))
                    {
                        if (vDatos.Tables.Count > 0 && vDatos.Tables[0].Rows.Count > 0)
                        {
                            vUrl = Helpers.Nvl(CApp.GetParam("URLF"), "").ToString();

                            WSAVD.WSFEBuilderSoapClient vFact_Elect = new WSAVD.WSFEBuilderSoapClient();
                            //
                            // Actualiza la dirección del web services
                            vFact_Elect.Endpoint.Address = new System.ServiceModel.EndpointAddress(vUrl);
                            //
                            // Envía la trama
                            vRespuesta_Xml = vFact_Elect.procesarTextoPlano(vDatos.Tables[0].Rows[0].ItemArray[2].ToString(),
                                vDatos.Tables[0].Rows[0].ItemArray[3].ToString(), vDatos.Tables[0].Rows[0].ItemArray[4].ToString(),
                                vDatos.Tables[0].Rows[0].ItemArray[1].ToString(), vDatos.Tables[0].Rows[0].ItemArray[0].ToString());
                            //
                            if (!String.IsNullOrEmpty(vRespuesta_Xml))
                            {
                                XmlDocument vXml_Doc = new XmlDocument();
                                vXml_Doc.LoadXml(vRespuesta_Xml);
                                //
                                using (DataSet vDatosXML = new DataSet())
                                {
                                    vDatosXML.ReadXml(new XmlNodeReader(vXml_Doc));

                                    if (vDatosXML.Tables.Count > 0 && vDatosXML.Tables[0].Rows.Count > 0)
                                    {
                                        // Código respuesta del proveedor
                                        vCodigo = vDatosXML.Tables[0].Rows[0].ItemArray[0].ToString();
                                        vRespuesta = vDatosXML.Tables[0].Rows[0].ItemArray[2].ToString();

                                        if (vCodigo.Replace("'", "") == "S0001")
                                        {
                                            vClave = vDatosXML.Tables[0].Rows[0].ItemArray[3].ToString();
                                        }
                                        else
                                        {
                                            vClave = String.Empty;
                                        }
                                    }
                                }
                            }
                            //
                            // Almacena la respuesta
                            vParametros.AddReplaceParam("pCCODIGO", vCodigo.Replace("'", ""));
                            vParametros.AddReplaceParam("pCRESPUESTA", vRespuesta.Replace("'", ""));
                            vParametros.AddReplaceParam("pCRESPUESTA_XML", vRespuesta_Xml.Replace("'", ""));
                            vParametros.AddReplaceParam("pCCLAVE", vClave);

                            GUI.CApp.bll.ExecuteSql("FE_P_ALM_RESPUESTA", vParametros, "PDV");
                        }
                    }
                }
            }
            catch (Exception vError)
            {
                vParametros = new QueryParams();
                // Error envío AVD
                vParametros.AddReplaceParam("pNDOCUMENTO", pDocumento.ToString());
                vParametros.AddReplaceParam("pCERROR", vError.Message.Replace("'", ""));
                //
                GUI.CApp.bll.ExecuteSql("FE_P_REGISTRO_ERROR", vParametros, "PDV");
            }
        }
        #endregion

        private void btnCobrar_Click(object sender, EventArgs e)
        {

        }

        private void btnCoupon_Click(object sender, EventArgs e)
        {
            if (rowVale.Properties.Value == null || rowVale.Properties.Value == DBNull.Value)
            {
                GUI.CApp.ShowMessage("Ingrese número de vale", "Vales por Devolución", true);
                vGridControl1.FocusedRow = rowVale;
                return;
            }

            if (rowVencimiento.Properties.Value != null || rowVencimiento.Properties.Value != DBNull.Value)
            {
                if (Convert.ToDateTime(rowVencimiento.Properties.Value) < DateTime.Today)
                {
                    GUI.CApp.ShowMessage("La fecha de vencimiento no es válida", "Vales por Devolución", true);
                    vGridControl1.FocusedRow = rowVencimiento;
                    vGridControl1.Focus();
                    return;
                }
            }
            else
            {
                GUI.CApp.ShowMessage("La fecha de vencimiento no es válida", "Vales por Devolución", true);
                vGridControl1.FocusedRow = rowVencimiento;
                vGridControl1.Focus();
                return;
            }

            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("VALE", rowVale.Properties.Value.ToString());
            if (Utils.Helpers.ObjToStr(GUI.CApp.bll.GetSingleValue("ValidaRangoVale", qp, "PDV")) == "0")
            {
                GUI.CApp.ShowMessage("El número de vale no se encuentra dentro del rango permitido para la tienda", "Vales por Devolución", true);
                vGridControl1.FocusedRow = rowVale;
                vGridControl1.Focus();
                return;
            }

            #region Creo la factura y el vale

            decimal  vVale        = Convert.ToDecimal(rowVale.Properties.Value);
            decimal  vSocio       = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO;
            DateTime vVencimiento = Convert.ToDateTime(rowVencimiento.Properties.Value);
            qp.Clear();
            qp.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.Order.ToString());

            decimal vMonto = 0;
            object oMonto = GUI.CApp.bll.GetSingleValue("TotalValeDevolucion", qp, "PDV");
            if (oMonto != null && oMonto != DBNull.Value)
                vMonto = Convert.ToDecimal(oMonto);
            else
                vMonto = Program.FrmMainPos.DsPedido.TDA_DATOS_DOCUMENTO[0].TOTAL * -1;
            
            string vObservaciones = null ;
            if (rowObservaciones.Properties.Value != null)
                vObservaciones = rowObservaciones.Properties.Value.ToString();

            if (vMonto > 0)
            {
                if (!CreateCoupon(vVale, vSocio, vMonto, vVencimiento, vObservaciones))
                    return;
            }

            if (Program.MAFD == "1")
            {
                #region Obtengo el sku de vale para agregarlo al pedido

                decimal skuCoupon = 0;
                skuCoupon = Convert.ToDecimal(GUI.CApp.GetParam("SPIV"));

                #endregion

                qp.Clear();
                qp.AddReplaceParam("SKU", skuCoupon.ToString());
                qp.AddReplaceParam("SOCIO", vSocio.ToString());
                decimal vPctImp = Convert.ToDecimal(GUI.CApp.bll.GetSingleValue("GetTaxes", qp, "PDV"));

                decimal vPrecioUnitario = vMonto / (1 + (vPctImp / 100));
                decimal vImpuesto = vMonto - vPrecioUnitario;

                Program.FrmMainPos.pos.ctlAddSkus1.InsertOrderLine(null, 1, GUI.CApp.usuario, Math.Round(vPrecioUnitario, 6), Math.Round(vImpuesto, 6), null, null, skuCoupon, vVale, null, null);

                CreateInvoice();
            }
            else
                CreateRefund("V");

            PostData();

            #endregion

            #region Imprimo documentos y limpio el pedido

            if (DsFactura.WMS_DOCUMENTOS.Count > 0)
            {
                long documento = (long)DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO;
                string sdocumento = DsFactura.WMS_DOCUMENTOS[0]["SUBTIPO_DOCUMENTO"].ToString();
                frmPayments.printInvoice(documento,sdocumento);
            }
            #region pts
            //consulta los puntos que debe eliminar o acumular
            Utils.QueryParams qp4 = new LLNet.Utils.QueryParams();
            qp4.AddReplaceParam("v_ORDEN", Program.FrmMainPos.Order.ToString());
            DataSet dsB5 = GUI.CApp.bll.getDataSet("PDV", "TyF_DEVOLUCION", qp4);
            DataSet dsB4 = GUI.CApp.bll.getDataSet("PDV", "PUNTOS_DEVOLUCION", qp4);

            if (dsB4.Tables.Count > 0)
            {
                if (dsB4.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow fila in dsB4.Tables[0].Rows)
                    {
                        DataRow fila2 =  dsB5.Tables[0].Rows[0];
                        if (Convert.ToString(fila2[0]) != string.Empty)
                        {
                            try
                            {
                                Utils.QueryParams qpD = new LLNet.Utils.QueryParams();
                                qpD.AddReplaceParam("DEVOLUCION", Convert.ToString(fila2[1]));
                                decimal ValFactPts = decimal.Parse(GUI.CApp.bll.GetSingleValue("C_FactorAlm", qpD, "PDV").ToString());
                                decimal ValRealPts = decimal.Parse(Convert.ToString(fila[0])) * ValFactPts;
                                //Envia los datos de la compra al proveedor para que descuente los puntos
                                string PData = "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&numero_tarjeta=" + Convert.ToString(fila2[0]);
                                // PData += "&numero_factura=" + documento.ToString() + "&puntos=" + Convert.ToString(fila[0]) + "&monto_factura=" + Convert.ToString(fila[0]) + "&nombre_cajero=" + CApp.usuario;
                                PData += "&numero_factura=" + Convert.ToString(fila2[1]) + "&puntos=" + ValRealPts;//Convert.ToString(fila[0]);
                                string info = RequestPOST(varUrlPts + "ws_devolucion.inc.php", PData);
                                info = info.Trim();
                                string[] datos = info.Split(' ');
                                if (datos[0].ToString() != "10")
                                {
                                    CApp.ShowMessage(info, "RedimirPuntos", true);
                                    //BitacoraErrorWS("WS=" + varUrlPts + "ws_devolucion.inc.php" + info, PData);
                                    string log = "WS=" + varUrlPts + "ws_devolucion.inc.php" + info;
                                    if (log.Length > 50)
                                    {
                                        log = log.Substring(0, 49);
                                    }

                                    BitacoraErrorWS(log, PData);
                                }
                                else
                                {
                                    //Almacena los puntos en nuestra Base d Datos
                                    Utils.QueryParams qp3 = new LLNet.Utils.QueryParams();
                                    qp3.AddReplaceParam("pDOCUMENTO", Program.FrmMainPos.Order.ToString());
                                    qp3.AddReplaceParam("pPTSGANA", Convert.ToString(fila[0]));
                                    GUI.CApp.bll.ExecuteSql("WMS_IPtsFACTURA", qp3, "PDV");
                                }
                            }
                            catch (Exception ex)
                            {
                                string log = ex.Message;
                                log = log.Replace("'", " ");
                                if (ex.Message.Length > 50)
                                {
                                    BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "ws_devolucion.inc.php" + log.Substring(0, 49), "ORDER: " + Program.FrmMainPos.Order.ToString());
                                }
                                else
                                {
                                    BitacoraErrorWS("SIN INTERNET WS=" + varUrlPts + "ws_devolucion.inc.php" + log, "ORDER: " + Program.FrmMainPos.Order.ToString());
                                }
                            }
                        }
                        else
                        {
                            BitacoraErrorWS("WS=" + varUrlPts + "ws_devolucion.inc.php", "El documento no tiene tarjeta asociada " + Program.FrmMainPos.Order.ToString() + " TyF_DEVOLUCION ");
                        }
                        //else
                        //{
                        //    //Almacena el ID_Maestro del proceso de redimir
                        //    Utils.QueryParams qp3 = new LLNet.Utils.QueryParams();
                        //    qp3.AddReplaceParam("pDOCUMENTO", Program.FrmMainPos.Order.ToString());
                        //    qp3.AddReplaceParam("pIDMAESTRO", datos[3].ToString());
                        //    GUI.CApp.bll.ExecuteSql("WMS_IIDMAESTRO", qp3, "PDV");
                        //}
                    }
                }
            }

            
            ////Devolucion de pts -elimina los puntos que gano
            ////Pagar con Pts
            ////AGREGA LOS PUNTOS A LA DEVOLUCION
            //qp.Clear();
            //qp.AddReplaceParam("v_ORDEN", Program.FrmMainPos.Order.ToString());
            //GUI.CApp.bll.ExecuteSql("PTS_DEVOLUCION", qp, "PDV");
            ////CONSULTA LOS PUNTOS y los envia
            //Utils.QueryParams qp4 = new LLNet.Utils.QueryParams();
            //qp4.AddReplaceParam("v_DOC", Program.FrmMainPos.Order.ToString());           
            //DataSet dsB4 = GUI.CApp.bll.getDataSet("PDV", "PTS_REDIMIR_DEVO", qp4);
            //if (dsB4.Tables.Count > 0)
            //{
            //    if (dsB4.Tables[0].Rows.Count > 0)
            //    {
            //        foreach (DataRow fila in dsB4.Tables[0].Rows)
            //        {
            //            //Envia los datos de la compra al proveedor para que descuente los puntos
            //            string PData = "url_respuesta=" + varUrlPts + "prueba_respuesta.php&tipo_respuesta=1&cod_empresa=" + varCodemprPts + "&cod_sucursal=" + varCodsucPts + "&numero_tarjeta=" + Convert.ToString(fila[1]) + "&tipo_transaccion=2";
            //            // PData += "&numero_factura=" + documento.ToString() + "&puntos=" + Convert.ToString(fila[0]) + "&monto_factura=" + Convert.ToString(fila[0]) + "&nombre_cajero=" + CApp.usuario;
            //            PData += "&numero_factura=" + Convert.ToString(fila[2]) + "&puntos=" + Convert.ToString(fila[0]) + "&monto_factura=&nombre_cajero=" + CApp.usuario;
            //            string info = RequestPOST(varUrlPts + "redimir_puntos.php", PData);
            //            info = info.Trim();
            //            string[] datos = info.Split(' ');
            //            if (datos[0].ToString() != "10")
            //            {
            //                CApp.ShowMessage(info, "RedimirPuntos", true);
            //                BitacoraErrorWS("WS=" + varUrlPts + "redimir_puntos.php " + info, PData);
            //            }
            //            else
            //            {
            //                //Almacena el ID_Maestro del proceso de redimir
            //                Utils.QueryParams qp3 = new LLNet.Utils.QueryParams();
            //                qp3.AddReplaceParam("pDOCUMENTO", Program.FrmMainPos.Order.ToString());
            //                qp3.AddReplaceParam("pIDMAESTRO", datos[3].ToString());
            //                GUI.CApp.bll.ExecuteSql("WMS_IIDMAESTRO", qp3, "PDV");
            //            }
            //        }
            //    }
            //}


            #endregion

            printCoupon(vVale);

            /****************Cambio Factura Electrónica*******************/
            Utils.QueryParams vParametro = new LLNet.Utils.QueryParams();
            vParametro.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.DsPedido.TDA_DETALLE_PEDIDO[0].DOCUMENTO_PADRE3.ToString());
            long vDocNC = Utils.Helpers.ObjToInt64(GUI.CApp.bll.GetSingleValue("OBTIENE_NC_GENERADA", vParametro, "PDV"));

            mTrama(vDocNC);
            printCreditNote(Program.FrmMainPos.Order);
            /****************Cambio Factura Electrónica*******************/

            /****************Cambio Membresia*******************/
            string supervisor = "";

            if (GUI.CApp.Sup != null && GUI.CApp.Sup != "")
            {
                supervisor = GUI.CApp.Sup;
            }
            else
            {
                supervisor = GUI.CApp.usuario;
            }

            //qp.Clear();
            //qp = new LLNet.Utils.QueryParams();
            //qp.AddReplaceParam("DOCUMENTO", dsPDV1.TDA_DETALLE_PEDIDO[0].DOCUMENTO.ToString());
            vParametro.AddReplaceParam("USUARIO", supervisor);

            //ELIMINA MEMBRESIA EKONO PLUS
            GUI.CApp.bll.ExecuteSql("PLUS_ElimMembresiaPlus", vParametro, "PDV");

            /****************Cambio Membresia*******************/

            Hide();
            Close();
            Program.FrmMainPos.newOrder();
            
            #endregion

        }

        private void printCoupon(decimal vVale)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VAT");

            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();

            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);

            if (dsDocTienda.DOMAINS.Count > 0)
            {
                switch (Convert.ToInt16(dsDocTienda.DOMAINS[0].RV_MPNC03))
                {
                    case 1:
                        printCouponPreimpreso(vVale, dsDocTienda.DOMAINS[0].RV_MPCC03);
                        break;
                    case 2:
                        printInvoice(long.Parse(vVale.ToString()), "");
                        break;
                    default:
                        printCouponTicket(vVale, dsDocTienda.DOMAINS[0].RV_MPCC00, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPNC02), Convert.ToInt64(dsDocTienda.DOMAINS[0].RV_MPCC02));
                        break;
                }
            }
        }

        private static void printCouponPreimpreso(decimal vVale, string codigoReporte)
        {
            Hashtable ht = new Hashtable();
            Utils.QueryParams QueryParams = new LLNet.Utils.QueryParams();
            QueryParams.AddReplaceParam("VALE", vVale.ToString());
            ht.Add("TDA_V_VALES", QueryParams);

            try
            {
                LLNet.Reports.BaseReports.XRInfo Info;
                Info = Reports.BaseReports.XRBase.SetInfo("VALE");

                RegistryKey key = Registry.CurrentUser;
                key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Printers\Preimpresos", true);

                string printerVale = "";

                if (key != null)
                    printerVale = Utils.Helpers.ObjToStr(key.GetValue("Vale", ""));

                if (printerVale != string.Empty)
                    Info.PrinterName = printerVale;

                LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
                xrBase.Parametros = Info;
                xrBase.BllInstance = GUI.CApp.bll;
                xrBase.ExePath = GUI.CApp.ExeDir;
                xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);
            }
            catch
            { }
        }

        private static void printCouponTicket(decimal vVale, string impresora, int copias, long formato)
        {
            Impresion.Impresion imp = new Impresion.Impresion();
            imp.Conexion = GUI.CApp.bll.ConnectionString;

            Impresion.MensajeImpresion prntMess = new Impresion.MensajeImpresion();

            RegistryKey key = Registry.CurrentUser;
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Ticket", true);

            string printerFactura = "";

            if (key != null)
                printerFactura = Utils.Helpers.ObjToStr(key.GetValue("Vale", ""));

            if (printerFactura != string.Empty)
                prntMess.Impresora = printerFactura;
            else
                prntMess.Impresora = impresora;
            prntMess.TipoFormato = Impresion.TipoFormato.Vales;
            prntMess.Llave1 = Convert.ToInt64(vVale);
            prntMess.Copias = copias;
            prntMess.Formato = formato;
            imp.SetMensajeImpresion(prntMess);
            try
            {
                imp.ImprimirDocumento();
            }
            catch (Exception ex)
            {
                GUI.CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
            }
        }


        private void printCreditNote(object Order)
        {
            string pFormatoNC = Utils.Helpers.Nvl(Program.FrmMainPos.DsPedido.WMS_SOCIOS[0]["FORMATO_NOTA_CREDITO"], "NC").ToString();

            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = '" + pFormatoNC);
            subTipoDocumentoPreimpreso = pFormatoNC;

            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();

            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);

            if (dsDocTienda.DOMAINS.Count > 0)
            {
                qp.Clear();
                qp.AddReplaceParam("DOCUMENTO", Order.ToString());
                DataSet ds = GUI.CApp.bll.getDataSet("PDV", "NotasCredito", qp);
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    switch (Convert.ToInt16(dsDocTienda.DOMAINS[0].RV_MPNC03))
                    {
                        case 1:
                            imprimirNCPreimpresa(Convert.ToInt64(dr["DOCUMENTO"]), dsDocTienda.DOMAINS[0].RV_MPCC03);
                            break;
                        case 3:
                            RegistryKey Printer = Registry.CurrentUser;
                            Printer = Printer.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

                            string printerFactura = "";

                            if (Printer != null)
                                printerFactura = Utils.Helpers.ObjToStr(Printer.GetValue("Factura", ""));
                            if (printerFactura == "")
                                printerFactura = dsDocTienda.DOMAINS[0].RV_MPCC00;
                            imprimirDocumentoPreimpresaDOS(Convert.ToInt64(dr["DOCUMENTO"]), printerFactura, dsDocTienda.DOMAINS[0].RV_MPCC03, dsDocTienda.DOMAINS[0].RV_MPCC02.ToString(), "imprimir.bat", "");
                            break;
                        default:
                            imprimirNCTicket(Convert.ToInt64(dr["DOCUMENTO"]), dsDocTienda.DOMAINS[0].RV_MPCC00, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPNC02), Convert.ToInt64(dsDocTienda.DOMAINS[0].RV_MPCC02));
                            break;
                    }
                }
            }
        }

        private static void imprimirDocumentoPreimpresaDOS(long documento, string Impresora, string codigoReporte, string formato)
        {
            imprimirDocumentoPreimpresaDOS(documento, Impresora, codigoReporte, formato, "", "");
        }
        private static void imprimirDocumentoPreimpresaDOS(long documento, string Impresora, string codigoReporte, string batName, string formato)
        {
            imprimirDocumentoPreimpresaDOS(documento, Impresora, codigoReporte, formato, batName, "");
        }

        private static void imprimirDocumentoPreimpresaDOS(long documento, string Impresora, string codigoReporte, string formato, string batName, string prefijo)
        {
            //System.Diagnostics.Process.Start("START", "/min notepad /P" + " C:\\" + GUI.CApp.usuario + ".txt");            
            string PreimpresaXvariables = Utils.Helpers.ObjToStr(GUI.CApp.GetParam("PIXV"));

            if (PreimpresaXvariables == "NO")
            {
                Hashtable ht = new Hashtable();
                Utils.QueryParams QueryParams = new LLNet.Utils.QueryParams();
                QueryParams.AddReplaceParam("DOCUMENTO", documento.ToString());
                ht.Add("TDA_V_REP_DOCUMENTOS", QueryParams);
                ht.Add("TDA_V_REP_DET_DOCUMENTOS", QueryParams);

                LLNet.Reports.BaseReports.XRInfo Info;
                Info = Reports.BaseReports.XRBase.SetInfo(codigoReporte);

                RegistryKey key = Registry.CurrentUser;
                key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

                string printerFactura = "";

                if (key != null)
                    printerFactura = Utils.Helpers.ObjToStr(key.GetValue("Factura", ""));


                if (printerFactura != string.Empty)
                    Info.PrinterName = printerFactura;

                LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
                xrBase.Parametros = Info;
                xrBase.BllInstance = GUI.CApp.bll;
                xrBase.ExePath = GUI.CApp.ExeDir;

                xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);

                //xrBase.Report.ExportToText("c:/logistika/factura.txt");
            }
            else
            {
                //Impresion.Impresion imp = new Impresion.Impresion();
                //imp.ImprimirFacturaMedianteVariables();                
                int numImpresiones = 1;
                // int EsCredito = 0;
                Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                switch (subTipoDocumentoPreimpreso)
                {
                    case "C":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'CF");
                        break;
                    case "T":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'TKT");
                        break;
                    case "E":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'EX");
                        break;
                    case "L":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'LI");
                        break;
                    case "S":
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'SI");
                        break;
                    default:
                        qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VAT");
                        break;
                }


                Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);

                if (dsDocTienda.DOMAINS.Count > 0)
                {

                    imprimirDocumentoDOS(documento, Impresora, Convert.ToInt32(formato), prefijo, batName);
                }
            }
        }

        private static void imprimirDocumentoDOS(long documento, string Impresora, long formato, string prefijo, string BatName)
        {
            if (BatName == "")
                BatName = "imprimir.bat";
            string Ruta = Application.StartupPath;
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            if (Ruta != string.Empty)
            {
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(Ruta + "\\" + BatName);
                startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                string Args = "";
                string varTipoTxt = Utils.Helpers.ObjToStr(GUI.CApp.GetParam("TTXT"));

                if (varTipoTxt == "U") // SI EL TIPO DE GENERACION DE ARCHIVO ES POR USUARIO O DOCUMENTO
                {
                    if (prefijo != "")
                        Args = prefijo + GUI.CApp.usuario + ".txt ";
                    else
                        Args = GUI.CApp.usuario + ".txt ";
                }
                else
                {
                    long pDocumento = documento;
                    if (prefijo != "")
                        Args = prefijo + pDocumento + ".txt ";
                    else
                        Args = pDocumento + ".txt ";
                }

                startInfo.Arguments = Args;
                try
                {
                    qp.Clear();
                    qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                    qp.AddReplaceParam("FORMATO", formato.ToString());
                    qp.AddReplaceParam("USUARIO", GUI.CApp.usuario.ToString());
                    if(formato == 3023)
                        GUI.CApp.bll.ExecuteSql("GENERAR_IMPRESION_POS", qp, "PDV");
                    else
                        GUI.CApp.bll.ExecuteSql("WMS_P_GENERAR_IMPRV", qp, "PDV");
                    System.Threading.Thread.Sleep(2000); // SE DEJA DELAY PARA QUE LA BD TENGA TIEMPO DE GENERAR EL TXT
                    System.Diagnostics.Process.Start(startInfo);
                }
                catch (Exception ex)
                {
                    GUI.CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
                }
            }
            else
            {
                throw new Exception("No esta Definido el Parametro UATI");
            }
            //startInfo.UseShellExecute = false; 
        }

        /// <summary>
        /// Imprime la factura
        /// </summary>
        /// <param name="documento"></param>
        public static void printInvoice(long documento, string subtipodocumento)
        {
            int Formato = 2;
            int numImpresiones = 1;
            object FormatoTipoImpresion = null;
            // int EsCredito = 0;
            QueryParams qp = new QueryParams();
            switch (Helpers.ObjToStr(subtipodocumento))
            {
                case "C":
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'CF");
                    break;
                case "T":
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'TKT");
                    break;
                case "E":
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'EX");
                    break;
                case "L":
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'LI");
                    break;
                case "S":
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'SI");
                    break;
                default:
                    qp.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'VAT");
                    break;
            }


            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
            Helpers.Merge(CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qp), dsDocTienda);



            RegistryKey key = Registry.CurrentUser; // GUSTAVO MIRANDA
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0", true);
            if (key != null)
            {
                if (Convert.ToString(key.GetValue("FormatoImpresion", null)) != "")
                {
                    Formato = Convert.ToInt16(key.GetValue("FormatoImpresion", 2));
                }
            }

            RegistryKey keyImp = Registry.CurrentUser;

            keyImp = keyImp.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0", true);
            if (keyImp != null)
            {
                if (Convert.ToString(keyImp.GetValue("FormatoTipoImpresion", null)) != "")
                {
                    FormatoTipoImpresion = keyImp.GetValue("FormatoTipoImpresion");
                }
            }
            if (Formato != 1)
            {
                if (Formato != 0)
                {
                    Formato = Convert.ToInt16(dsDocTienda.DOMAINS[0]["RV_MPNC03"]);
                }
            }

            // POR ALGUNA RAZON EL CODIGO NO SE EJECUTA BIEN POR ESO DE DEJAN LOS 2 IF ANIDADOS ARRIBA
            //  if (Formato != 0 || Formato != 1)
            //  {
            //     Formato = Convert.ToInt16(dsDocTienda.DOMAINS[0]["RV_MPNC03"]);
            // }

            if (dsDocTienda.DOMAINS.Count > 0)
            {
                RegistryKey Printer = Registry.CurrentUser;
                Printer = Printer.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Preimpresos", true);

                string printerFactura = "";

                if (Printer != null)
                    printerFactura = Helpers.ObjToStr(Printer.GetValue("Factura", ""));
                if (printerFactura == "")
                    printerFactura = dsDocTienda.DOMAINS[0].RV_MPCC00;
                for (int i = 0; i < numImpresiones; i++)
                {
                    imprimirDocumentoPreimpresaDOS(documento, printerFactura, dsDocTienda.DOMAINS[0].RV_MPCC03, Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString());
                }
            }
        } 


        private static void imprimirNCTicket(long documento, string impresora, int copias, long formato)
        {
            Impresion.Impresion imp = new Impresion.Impresion();
            imp.Conexion = GUI.CApp.bll.ConnectionString;

            Impresion.MensajeImpresion prntMess = new Impresion.MensajeImpresion();

            RegistryKey key = Registry.CurrentUser;
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Impresoras\Ticket", true);

            string printerFactura = "";

            if (key != null)
                printerFactura = Utils.Helpers.ObjToStr(key.GetValue("Nota de Credito", ""));

            if (printerFactura != string.Empty)
                prntMess.Impresora = printerFactura;
            else
                prntMess.Impresora = impresora;
            prntMess.TipoFormato = Impresion.TipoFormato.Documentos;
            prntMess.Llave1 = documento;
            prntMess.Copias = copias;
            prntMess.Formato = formato;
            imp.SetMensajeImpresion(prntMess);
            try
            {
                imp.ImprimirDocumento();
            }
            catch (Exception ex)
            {
                GUI.CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
            }
        }

        private static void imprimirNCPreimpresa(long documento, string codigoReporte)
        {
            Hashtable ht = new Hashtable();
            Utils.QueryParams QueryParams = new LLNet.Utils.QueryParams();
            QueryParams.AddReplaceParam("DOCUMENTO", documento.ToString());
            ht.Add("TDA_V_REP_DOCUMENTOS", QueryParams);
            ht.Add("TDA_V_REP_DET_DOCUMENTOS", QueryParams);

            LLNet.Reports.BaseReports.XRInfo Info;
            Info = Reports.BaseReports.XRBase.SetInfo(codigoReporte);

            RegistryKey key = Registry.CurrentUser;
            key = key.OpenSubKey(@"Software\Logistika\POS Retail 8.0.0\Printers\Preimpresos", true);

            string printerNC = "";
            if (key != null)
                printerNC = Utils.Helpers.ObjToStr(key.GetValue("Nota de Credito", ""));

            if (printerNC != string.Empty)
            {
                Info.PrinterName = printerNC;
            }

            LLNet.Reports.BaseReports.XRBase xrBase = new LLNet.Reports.BaseReports.XRBase(Info.BaseReport, Info.CodeReport);
            xrBase.Parametros = Info;
            xrBase.BllInstance = GUI.CApp.bll;
            xrBase.ExePath = GUI.CApp.ExeDir;
            xrBase.ExecuteReport(LLNet.Reports.BaseReports.XRExecution.XRPrint, false, ht);
        }



        public void PostData()
        {
            // Guardando datos del pedido
            GUI.CApp.bll.updateDataSet(Program.FrmMainPos.DsPedido, Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS.TableName);

            if (DsFactura.WMS_DOCUMENTOS.Count > 0)
            {
                // Guardando datos de la factura
                GUI.CApp.bll.updateDataSet(DsFactura, DsFactura.WMS_DOCUMENTOS.TableName);
                GUI.CApp.bll.updateDataSet(DsFactura, DsFactura.WMS_SKUS_X_DOCUMENTO.TableName);


                Utils.QueryParams qp = new LLNet.Utils.QueryParams();
                qp.AddReplaceParam("DOCUMENTO", DsFactura.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
                GUI.CApp.bll.ExecuteSql("wms_p_documentos.procesar_facturas_in", qp, "PDV");
            }
        }

        #region Invoices

        /// <summary>
        /// Crea una devolucion en base al pedido
        /// </summary>
        /// <returns></returns>
        public void CreateRefund(string pTipo)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("DOCUMENTO", Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString());
            qp.AddReplaceParam("TIPO", pTipo);

            GUI.CApp.bll.ExecuteSql("tda_p_procesar_pedido", qp, "PDV");

            if (Utils.Helpers.ObjToStr(GUI.CApp.GetParam("AICD")) == "X")
            {
                qp.Clear();
                string stmnt = "SELECT documento FROM wms_documentos where TIPO_DOCUMENTO = 'D' and documento_padre = " + Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString();
                qp.AddReplaceParam("STATEMENT", stmnt);

                DataSet devolucion = GUI.CApp.bll.getDataSet("PDV","RunGenericStatement", qp);

                foreach (DataRow dr in devolucion.Tables[0].Rows)
                {
                    qp.Clear();
                    qp.AddReplaceParam("&&p_documento&&", dr[0].ToString());
                    qp.AddReplaceParam("&&p_bodega&&", Utils.Helpers.ObjToStr(GUI.CApp.GetParam("BADD")));
                    qp.AddReplaceParam("&&p_ajustar_inventario&&", "TRUE");
                    qp.AddReplaceParam("&&p_actualizar_costos&&", "FALSE");
                    qp.AddReplaceParam("&&p_valida_cantidad&&", "NULL");
                    qp.AddReplaceParam("&&p_usuario&&", GUI.CApp.usuario);
                    qp.AddReplaceParam("&&p_valida_permiso&&", "FALSE");
                    qp.AddReplaceParam("&&p_commit&&", "FALSE");

                    GUI.CApp.bll.ExecuteSql("RecibirDocumento", qp, "PDV");
                }
            }
        }

        /// <summary>
        /// Crea una factura en base al pedido
        /// </summary>
        /// <returns></returns>
        public decimal CreateInvoice()
        {
            decimal pInvoice;

            #region Inserta los datos de la factura

            Model.PDV.DsPDV.WMS_DOCUMENTOSRow row = DsFactura.WMS_DOCUMENTOS.NewWMS_DOCUMENTOSRow();
            pInvoice = Convert.ToDecimal(GUI.CApp.GetSecuence("WMS_S_DOCUMENTO"));
            row.SOCIO = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SOCIO;
            row.DOCUMENTO = pInvoice;
            row.DOCUMENTO_PADRE = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO;
            row.TIPO_DOCUMENTO = "F";
            row.SITUACION = 3;

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["SUBTIPO_DOCUMENTO"] != DBNull.Value)
                row.SUBTIPO_DOCUMENTO = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SUBTIPO_DOCUMENTO;

            row.TOTAL = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].TOTAL;
            row.CREADO_POR = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].CREADO_POR;


            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["APROBACION2"] != DBNull.Value)
                row.APROBACION2 = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].APROBACION2;

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["ENGANCHE"] != DBNull.Value)
                row.ENGANCHE = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].ENGANCHE;

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["CUOTAS"] != DBNull.Value)
                row.CUOTAS = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].CUOTAS;

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["ULTIMA_CUOTA"] != DBNull.Value)
                row.ULTIMA_CUOTA = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].ULTIMA_CUOTA;

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["FECHA_PRIMERA_CUOTA"] != DBNull.Value)
                row.FECHA_PRIMERA_CUOTA = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].FECHA_PRIMERA_CUOTA;

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["CANTIDAD_PAGOS"] != DBNull.Value)
                row.CANTIDAD_PAGOS = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].CANTIDAD_PAGOS;

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["SUBTIPO_PAGO"] != DBNull.Value)
                row.SUBTIPO_PAGO = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SUBTIPO_PAGO;

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["PORCENTAJE_INTERES"] != DBNull.Value)
                row.PORCENTAJE_INTERES = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].PORCENTAJE_INTERES;

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["ULTIMA_CUOTA"] != DBNull.Value)
                row.ULTIMA_CUOTA = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].ULTIMA_CUOTA;

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["ESCENARIO_FINANCIERA"] != DBNull.Value)
                row.ESCENARIO_FINANCIERA = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].ESCENARIO_FINANCIERA;

            row.USUARIO1 = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].USUARIO1;

            if (Program.Caja == null)
                row.CAJA = (decimal)Program.Caja;

            if (Program.Jornada != null)
                row.JORNADA = (decimal)Program.Jornada;

            if (Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0]["SALDO"] != DBNull.Value)
                row.SALDO = Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].SALDO;
            else
                row.SetSALDONull();

            DsFactura.WMS_DOCUMENTOS.AddWMS_DOCUMENTOSRow(row);

            #endregion

            #region Inserta el detalle de la factura

            foreach (Model.PDV.DsPDV.WMS_SKUS_X_DOCUMENTORow sdrOrder in Program.FrmMainPos.DsPedido.WMS_SKUS_X_DOCUMENTO.Select("documento = " + Program.FrmMainPos.DsPedido.WMS_DOCUMENTOS[0].DOCUMENTO.ToString() + " and usuario_anulo is null "))
            {
                // Solo facturar lineas no anuladas
                if (sdrOrder["USUARIO_ANULO"] == System.DBNull.Value)
                {
                    Model.PDV.DsPDV.WMS_SKUS_X_DOCUMENTORow sdrInvoice = DsFactura.WMS_SKUS_X_DOCUMENTO.NewWMS_SKUS_X_DOCUMENTORow();
                    sdrInvoice.DOCUMENTO = pInvoice;
                    sdrInvoice.LINEA = sdrOrder.LINEA;
                    sdrInvoice.SKU = sdrOrder.SKU;
                    sdrInvoice.CANTIDAD = sdrOrder.CANTIDAD;
                    sdrInvoice.PRECIO_UNITARIO = sdrOrder.PRECIO_UNITARIO;                    
                    sdrInvoice.CREADO_POR = sdrOrder.CREADO_POR;

                    if (sdrOrder["DOCUMENTO_PADRE3"] != DBNull.Value)
                        sdrInvoice.DOCUMENTO_PADRE3 = sdrOrder.DOCUMENTO_PADRE3;

                    if (sdrOrder["LINEA_PADRE3"] != DBNull.Value)
                        sdrInvoice.LINEA_PADRE3 = sdrOrder.LINEA_PADRE3;

                    if (sdrOrder["VALE"] != DBNull.Value)
                        sdrInvoice.VALE = sdrOrder.VALE;

                    if (sdrOrder["IMPUESTO"] == System.DBNull.Value)
                        sdrInvoice.SetIMPUESTONull();
                    else
                        sdrInvoice.IMPUESTO = sdrOrder.IMPUESTO;

                    if (sdrOrder["DESCUENTO"] == System.DBNull.Value)
                        sdrInvoice.SetDESCUENTONull();
                    else
                        sdrInvoice.DESCUENTO = sdrOrder.DESCUENTO;

                    if (sdrOrder["BODEGA"] == System.DBNull.Value)
                        sdrInvoice.SetBODEGANull();
                    else
                        sdrInvoice.BODEGA = sdrOrder.BODEGA;

                    if (sdrOrder["BODEGA2"] == System.DBNull.Value)
                        sdrInvoice.SetBODEGA2Null();
                    else
                        sdrInvoice.BODEGA2 = sdrOrder.BODEGA2;

                    if (sdrOrder["BODEGA3"] == System.DBNull.Value)
                        sdrInvoice.SetBODEGA3Null();
                    else
                        sdrInvoice.BODEGA3 = sdrOrder.BODEGA3;

                    if (sdrOrder["A_DOMICILIO"] == System.DBNull.Value)
                        sdrInvoice.SetA_DOMICILIONull();
                    else
                        sdrInvoice.A_DOMICILIO = sdrOrder.A_DOMICILIO;

                    if (sdrOrder["DIRECCION"] == System.DBNull.Value)
                        sdrInvoice.SetDIRECCIONNull();
                    else
                        sdrInvoice.DIRECCION = sdrOrder.DIRECCION;

                    if (sdrOrder["REGION"] == System.DBNull.Value)
                        sdrInvoice.SetREGIONNull();
                    else
                        sdrInvoice.REGION = sdrOrder.REGION;

                    if (sdrOrder["SITUACION_SKU"] == System.DBNull.Value)
                        sdrInvoice.SetSITUACION_SKUNull();
                    else
                        sdrInvoice.SITUACION_SKU = sdrOrder.SITUACION_SKU;

                    if (sdrOrder["PORCENTAJE1"] == System.DBNull.Value)
                        sdrInvoice.SetPORCENTAJE1Null();
                    else
                        sdrInvoice.PORCENTAJE1 = sdrOrder.PORCENTAJE1;

                    if (sdrOrder["PORCENTAJE2"] == System.DBNull.Value)
                        sdrInvoice.SetPORCENTAJE2Null();
                    else
                        sdrInvoice.PORCENTAJE2 = sdrOrder.PORCENTAJE2;

                    if (sdrOrder["PORCENTAJE3"] == System.DBNull.Value)
                        sdrInvoice.SetPORCENTAJE3Null();
                    else
                        sdrInvoice.PORCENTAJE3 = sdrOrder.PORCENTAJE3;

                    if (sdrOrder["USUARIO"] == System.DBNull.Value)
                        sdrInvoice.SetUSUARIONull();
                    else
                        sdrInvoice.USUARIO = sdrOrder.USUARIO;

                    if (sdrOrder["USUARIO2"] == System.DBNull.Value)
                        sdrInvoice.SetUSUARIO2Null();
                    else
                        sdrInvoice.USUARIO2 = sdrOrder.USUARIO2;

                    if (sdrOrder["USUARIO3"] == System.DBNull.Value)
                        sdrInvoice.SetUSUARIO3Null();
                    else
                        sdrInvoice.USUARIO3 = sdrOrder.USUARIO3;

                    if (sdrOrder["FECHA_ENTREGA"] == System.DBNull.Value)
                        sdrInvoice.SetFECHA_ENTREGANull();
                    else
                        sdrInvoice.FECHA_ENTREGA = sdrOrder.FECHA_ENTREGA;

                    if (sdrOrder["COSTO_PROMEDIO"] == System.DBNull.Value)
                        sdrInvoice.SetCOSTO_PROMEDIONull();
                    else
                        sdrInvoice.COSTO_PROMEDIO = sdrOrder.COSTO_PROMEDIO;

                    if (sdrOrder["OBSERVACIONES"] == System.DBNull.Value)
                        sdrInvoice.SetOBSERVACIONESNull();
                    else
                        sdrInvoice.OBSERVACIONES = sdrOrder.OBSERVACIONES;

                    sdrOrder.FACTURADO = sdrInvoice.CANTIDAD;

                    DsFactura.WMS_SKUS_X_DOCUMENTO.AddWMS_SKUS_X_DOCUMENTORow(sdrInvoice);
                }
            }

            #endregion

            return pInvoice;
        }

        #endregion

        public bool CreateCoupon(decimal pVale, decimal pSocio, decimal pMonto, DateTime pVencimiento, string pObservaciones)
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("VALE", pVale.ToString());

            if (GUI.CApp.bll.GetSingleValue("ExisteVale", qp, "PDV").ToString() == "1")
            {
                GUI.CApp.ShowMessage("El número de vale ya existe", "Certificados de Regalo", true);
                vGridControl1.FocusedRow = rowVale;
                vGridControl1.Focus();
                return false;
            }

            Model.PDV.DsPDV.DOC_VALESRow dvr = dsTienda1.DOC_VALES.NewDOC_VALESRow();
            dvr.VALE = pVale;
            dvr.SOCIO = pSocio;
            dvr.MONTO = pMonto;
            dvr.VENCE_EL = pVencimiento;
            dvr.OBSERVACIONES = pObservaciones;
            dvr.CREADO_POR = GUI.CApp.usuario;
            dvr.JORNADA = (decimal)Program.Jornada;
            dvr.TIPO = "D";
            dvr.ESTADO = "E";
            dvr.DEVOLUCION = Program.FrmMainPos.Order;
            dvr.AUTORIZADO_POR = GUI.CApp.usuario;

            dsTienda1.DOC_VALES.AddDOC_VALESRow(dvr);
            GUI.CApp.bll.updateDataSet(dsTienda1, dsTienda1.DOC_VALES.TableName);
            return true;
        }

        private void frmCoupons_Load(object sender, EventArgs e)
        {

            rowVale.Properties.Value = null;
            rowVencimiento.Properties.Value = null;

            double dias = 0;
            dias = Convert.ToDouble(GUI.CApp.GetParam("DVVD"));

            DateTime dt = new DateTime();
            dt = DateTime.Today;
            dt = dt.AddDays(dias);

            rowVencimiento.Properties.Value = dt;

            vGridControl1.FocusedRow = rowVale;
            vGridControl1.ShowEditor();
        }

        private void frmCoupons_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.F12:
                    btnCoupon_Click(null, null);
                    break;
                case Keys.F2:
                    simpleButton1_Click(null, null);
                    break;
                case Keys.Escape :
                    btnCancelar.PerformClick();
                    break; 
                case Keys.F4://IMGF
                    btnPrueba_Click(null, null);
                    break;
            }
        }       

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            rowVale.Properties.Value = GUI.CApp.GetSecuence("DOC_S_VALE");

            this.Focus();
            vGridControl1.Focus();
            vGridControl1.FocusedRow = rowVencimiento;
            vGridControl1.ShowEditor();
            
        }

        private void btnCashRefund_Click(object sender, EventArgs e)
        {
            CreateInvoice();
            CreateRefund("D");
        }

        private void simpleButton2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void vGridControl1_ValidatingEditor(object sender, DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs e)
        {
        }

        //almacena el error en el WS
        private void BitacoraErrorWS(string pError, string pWServ)
        {
            if (pWServ.Length > 300)
                pWServ = pWServ.Substring(0, 300);
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pError", pError);
            qp.AddReplaceParam("pWServ", pWServ);
            // Llama el procedimiento que almacena el error del WS en la BD
            GUI.CApp.bll.ExecuteSql("WMS_P_BITAC_E_AFIL", qp, "PDV");
        }

        /// <summary>Ejecuta por medio de post un llamado al Web Service utilizando HTTP POST</summary>
        /// <param name="URL"></param>
        /// <param name="PostData"></param>
        /// <returns></returns>
        private string RequestPOST(string URL, string PostData)
        {
            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create(URL);
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            //string postData = "";
            byte[] byteArray = Encoding.UTF8.GetBytes(PostData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/x-www-form-urlencoded";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;
            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();
            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
            // MessageBox.Show(((HttpWebResponse)response).StatusDescription, "DESCRIPCION");
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
            // Display the content.            
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();
            return responseFromServer;
        }

        /// <summary>Obtiene los parámetros necesarios de cada tienda </summary>
        private void LlenarParametros()
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            //CONSULTA LOS PARÁMETROS DE LA BD
            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "C_PPTS", qp);

            object[] datos = new object[3];
            datos = dsB.Tables[0].Rows[0].ItemArray;

            varUrlPts = datos[0].ToString();
            varCodemprPts = datos[1].ToString();
            varCodsucPts = datos[2].ToString();
        }

        #region btnPrueba_Click IMGF
        private void btnPrueba_Click(object sender, EventArgs e)
        {
            string vale = GUI.CApp.bll.GetSingleValue("NVP", "PDV").ToString();
            if(vale != "")
                printCoupon(decimal.Parse(vale));
            else
                XtraMessageBox.Show("No hay datos para mostrar");
        }
        #endregion
    }
}