using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LLNet.Utils;
using LLNet.GUI;
using Microsoft.Win32;
using System.Threading;
using System.Collections;

namespace LLNet.Tienda.MainForms.Forms.OtrosServ.WU
{
    public partial class FrmWesternUnion : Form
    {
        public FrmWesternUnion()
        {
            InitializeComponent();
        }

        #region variables
            private static string subTipoDocumentoPreimpreso;
            private static long documentoPreimpreso;
            private string varWUDolarCompra;
            private char ProcAct = 'N'; //N= nada, P= pago , E = Envío
            private int varCantImp = 1; // Cantidad de Impresiones que se necesita realice el Sistema
            private string vEfectivoCaja;
            private string vEfectivoCajaDol;
        #endregion

        private void LlenarParametros()
            {
                //CONSULTA LOS PARÁMETROS DE LA BD
                DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "C_PWU");

                object[] datos = new object[2];
                datos = dsB.Tables[0].Rows[0].ItemArray;
                
                varWUDolarCompra = datos[0].ToString();
                varCantImp = int.Parse(datos[1].ToString());                
            }
           
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void sbtnEnviar_Click(object sender, EventArgs e)
        {
            //estilo del boton
            sbtnPago.ButtonStyle = DevExpress.XtraEditors.Controls.BorderStyles.Default;
            sbtnEnviar.ButtonStyle = DevExpress.XtraEditors.Controls.BorderStyles.Simple;
            sbtnEnviar.Appearance.BackColor = Color.FromKnownColor(KnownColor.Yellow);
            //Panel de pago / opciones visibles
            pnlCtrlPago.Visible = false;
            pnlCtrlEnvio.Visible = true;
            pnlCtrlAnular.Visible = false;
            sBtnCompPagoWU.Visible = false;
            sBtnCompEnvioWU.Visible = true;
            sBtnAnular.Visible = false;
            ProcAct = 'E';
        }

        private void sbtnPago_Click(object sender, EventArgs e)
        {
            //estilo del boton
            sbtnEnviar.ButtonStyle = DevExpress.XtraEditors.Controls.BorderStyles.Default;
            sbtnPago.ButtonStyle = DevExpress.XtraEditors.Controls.BorderStyles.Simple;
            sbtnPago.Appearance.BackColor = Color.FromKnownColor(KnownColor.Yellow);
            //Panel de pago/ opciones visible
            pnlCtrlPago.Visible = true;
            pnlCtrlEnvio.Visible = false;
            pnlCtrlAnular.Visible = false;
            sBtnCompPagoWU.Visible = true;
            sBtnCompEnvioWU.Visible = false;
            sBtnAnular.Visible = false;
            ProcAct = 'P';
        }

        private void FrmWesternUnion_Load(object sender, EventArgs e)
        {
            habilitaPagos();//habilita los textos de tipos de pago
            LlenarTransacciones();
            sbtnEnviar.PerformClick();
            LlenarParametros();
            // DISPONIBLE FONDO Y EFECTIVO
            mCargaFondoDisponible();

        }
        /// <summary>
        /// Funcion de fondo y efectivo disponible
        /// </summary>
        private void mCargaFondoDisponible()
        {
            Utils.QueryParams vQp = new LLNet.Utils.QueryParams();

            vQp.AddReplaceParam("pJORNADA", Program.Jornada.ToString());

            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "WU_FONDODISPRAPIBAC", vQp);

            if (dsB.Tables[0].Rows.Count > 0)
            {

                object[] dat = new object[2];

                //(dsB.Tables.List)).Items[0])).Rows.table.Rows.list)).Items[1])).ItemArray

                dat = dsB.Tables[0].Rows[0].ItemArray;

                textEditdispo.Text = dat[0].ToString();

                dat = dsB.Tables[0].Rows[1].ItemArray;

                txtdispoFE.Text = dat[0].ToString();

                vEfectivoCaja = dat[0].ToString();

                dat = dsB.Tables[0].Rows[2].ItemArray;
                
                vEfectivoCajaDol =  dat[0].ToString();

            }
        }

        /// <summary>Obtiene los parámetros necesarios de cada tienda </summary>
        private void LlenarTransacciones()
        {  
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pUsuario", GUI.CApp.usuario);// pUsuario
            //CONSULTA LOS PARÁMETROS DE LA BD
            DataSet dsE = GUI.CApp.bll.getDataSet("PDV", "WU_ENVIOS", qp);
            DataSet dsP = GUI.CApp.bll.getDataSet("PDV", "WU_PAGOS", qp);

            if (dsE.Tables.Count > 0)
            {
                gdCtrlWUEnvio.DataSource = dsE.Tables[0];
                calculosEnvios();                
            }
            else
            {
                gdCtrlWUEnvio.DataSource = null;
                gdCtrlWUEnvio.Refresh();               
            }
            if (dsP.Tables.Count > 0)
            {
                gdCtrlWUPago.DataSource = dsP.Tables[0];                              
            }
            else
            {
                gdCtrlWUPago.DataSource = null;
                gdCtrlWUPago.Refresh();
            }
        }

        private void calculosEnvios()
        {
            foreach (int handle in gridView7.GetSelectedRows())
            {
                if (gridView7.RowCount > 0 && gridView7.Columns.Count > 0 )
                {
                    //verificar el tipo de moneda
                    string tipo;
                    tipo = Convert.ToString(gridView7.GetRowCellValue(handle, gridView7.Columns[5]));

                    if (tipo == "LOCAL")
                    {//envio Intra / Local
                        string SmontC, SmontD, Smontdoldiv;
                        int ImontC, ImontD, Imontdoldiv;
                        decimal montC, montDM, montD;

                        SmontC = Convert.ToString(gridView7.GetRowCellValue(handle, gridView7.Columns[4]));
                        SmontD = "0";
                        Smontdoldiv = Convert.ToString(gridView7.GetRowCellValue(handle, gridView7.Columns[6]));

                        ImontC = SmontC.IndexOf('.');
                        ImontD = SmontD.IndexOf('.');
                        Imontdoldiv = Smontdoldiv.IndexOf('.');

                        ImontC = -1;
                        ImontD = -1;
                        Imontdoldiv = -1;

                        if (SmontC.Length > 0 && ImontC > 0)
                            SmontC = SmontC.Substring(0, ImontC);
                        if (SmontD.Length > 0 && ImontD > 0)
                            SmontD = SmontD.Substring(0, ImontD);
                        if (Smontdoldiv.Length > 0 && Imontdoldiv > 0)
                        {
                            Smontdoldiv = Smontdoldiv.Substring(0, Imontdoldiv);
                        }

                        montD = 0;
                        montC = 0;

                        if (SmontC.Length > 0)
                            montC = decimal.Parse(SmontC);
                        if (SmontD.Length > 0)
                            montD = decimal.Parse(SmontD);

                        if (SmontD.Length > 0)
                        {
                            if (Smontdoldiv.Length > 0)
                            {
                                montDM = montD - decimal.Parse(Smontdoldiv);
                            }
                            else
                            {
                                montDM = montD;
                            }
                        }
                        else
                        {
                            montDM = 0;
                        }
                        //txtpagDolMonto.Text = montD.ToString();
                        txtMontColM.Text = montC.ToString();
                        txtMontDolrM.Text = montDM.ToString();
                    }
                    else
                    {//envio internacional
                        string SmontC, SmontD, Smontdoldiv;
                        int ImontC, ImontD, Imontdoldiv;
                        decimal montC, montDM, montD;

                        SmontC = Convert.ToString(gridView7.GetRowCellValue(handle, gridView7.Columns[7]));
                        SmontD = Convert.ToString(gridView7.GetRowCellValue(handle, gridView7.Columns[4]));
                        Smontdoldiv = Convert.ToString(gridView7.GetRowCellValue(handle, gridView7.Columns[6]));

                        ImontC = SmontC.IndexOf('.');
                        ImontD = SmontD.IndexOf('.');
                        Imontdoldiv = Smontdoldiv.IndexOf('.');

                        ImontC = -1;
                        ImontD = -1;
                        Imontdoldiv = -1;

                        if (SmontC.Length > 0 && ImontC > 0)
                            SmontC = SmontC.Substring(0, ImontC);
                        if (SmontD.Length > 0 && ImontD > 0)
                            SmontD = SmontD.Substring(0, ImontD);
                        if (Smontdoldiv.Length > 0 && Imontdoldiv > 0)
                        {
                            Smontdoldiv = Smontdoldiv.Substring(0, Imontdoldiv);
                        }

                        montD = 0;
                        montC = 0;

                        if (SmontC.Length > 0)
                            montC = decimal.Parse(SmontC);
                        if (SmontD.Length > 0)
                            montD = decimal.Parse(SmontD);

                        if (SmontD.Length > 0)
                        {
                            if (Smontdoldiv.Length > 0)
                            {
                                montDM = montD - decimal.Parse(Smontdoldiv);
                            }
                            else
                            {
                                montDM = montD;
                            }
                        }
                        else
                        {
                            montDM = 0;
                        }
                        //txtpagDolMonto.Text = montD.ToString();
                        txtMontColM.Text = montC.ToString();
                        txtMontDolrM.Text = montDM.ToString();
                        //agrega los 0 en los paga con, si los montos a pagar estan en 0
                        if (montC == 0)
                        {
                            txtPCColM.Text = "0";
                        }
                        if (montD == 0)
                        {
                            txtPCDolrM.Text = "0";
                        }                        
                    }
                }
            }
        }

        private void sBtnCompPagoWU_Click(object sender, EventArgs e)
        {
            decimal vMonto = 0;

            foreach (int handle in gridView8.GetSelectedRows())
            {
                 vMonto = Convert.ToDecimal(gridView8.GetRowCellValue(handle, gridView8.Columns[7]));
            }
            
            if (Decimal.Parse(vEfectivoCaja) == 0 && Decimal.Parse(textEditdispo.Text) == 0)
            {
                GUI.CApp.ShowMessage("No puede hacer el PAGO sin disponible ni efectivo en caja", "ERROR", true);
              // textEditdispo.Focus();
                return;
            }
            if (vMonto > (Decimal.Parse(textEditdispo.Text) + Decimal.Parse(vEfectivoCaja)))
            {
                GUI.CApp.ShowMessage("No puede hacer el PAGO, no tiene dinero suficiente efectivo en caja", "ERROR", true);
               
                return;
            }
            
            ComprobPagoWU();
            mCargaFondoDisponible();
        }


        //Crear el comprobante de Western Union
        private void ComprobPagoWU()
        {
            foreach (int handle in gridView8.GetSelectedRows())
            {
                //Id de la transaccion para almacenar los datos
                string IDE = Convert.ToString(gridView8.GetRowCellValue(handle, gridView8.Columns[1]));
                string MTCN = Convert.ToString(gridView8.GetRowCellValue(handle,gridView8.Columns[0]));

                QueryParams qpv = new LLNet.Utils.QueryParams();
                qpv.AddReplaceParam("pID", IDE);
                //Facturado
                int vFacturado = Convert.ToInt16(GUI.CApp.bll.GetSingleValue("WU_ESTADO_TRA_P", qpv, "PDV"));
                //Anulado
                int vAnulado = Convert.ToInt16(GUI.CApp.bll.GetSingleValue("WU_ESTADO_TRA_PA", qpv, "PDV"));
                //Valida si la transaccion ya fue facturada
                if (vFacturado < 1)
                {
                    if (vAnulado < 1)
                    {
                        if (IDE != string.Empty && IDE != "DOCUMENTO")
                        {
                            long varDocumento = Convert.ToInt64(GUI.CApp.bll.GetSingleValue("SEC_DOCUMENTO", "PDV"));
                            //&&pID&& ,  &&pDocumento&& , &&pCaja&& , '&&pUsuario&&' , &&pJornada&& 
                            //Almacenar los datos del comprobante en la tienda y crear el recibo en wms_pague_servicios                
                            QueryParams qp = new LLNet.Utils.QueryParams();
                            qp.AddReplaceParam("pID", IDE);
                            qp.AddReplaceParam("pDocumento", varDocumento.ToString());
                            qp.AddReplaceParam("pCaja", Program.Caja.ToString());
                            qp.AddReplaceParam("pUsuario", GUI.CApp.usuario);
                            qp.AddReplaceParam("pJornada", Program.Jornada.ToString());
                            qp.AddReplaceParam("pMtcn", MTCN);
                            CApp.bll.ExecuteSql("WU_P_DPAGOS", qp, "PDV");

                            long DOCUM = long.Parse(varDocumento.ToString());

                            for (int i = 1; i <= varCantImp; i++)
                            {//cantidad de impresiones
                                //imprimir el comprobante
                                ImpFactWesternUnion(DOCUM, 2);
                            //    GUI.CApp.ShowMessage("El pago se realizo exitosamente", "Mensaje de Informacion", true);

                        
                            }
                        }
                    }
                    else
                    {
                        GUI.CApp.ShowMessage("El pago ya fue Anulado", "Error", false);
                    }
                }
                else
                {
                    GUI.CApp.ShowMessage("El pago ya fue facturado, favor verifique en el reporte", "Error", false);
                }
            }
        }

        //Crear el comprobante de Western Union
        private void ComprobEnvioWU()
        {
            foreach (int handle in gridView7.GetSelectedRows())
            {
                //Id de la transaccion para almacenar los datos
                string IDE = Convert.ToString(gridView7.GetRowCellValue(handle, gridView7.Columns[1]));
                //Echo por Richard Vargas Martinez 
                string Mtcn = Convert.ToString(gridView7.GetRowCellValue(handle, gridView7.Columns[0]));
                //Fin
                QueryParams qpV = new LLNet.Utils.QueryParams();
                qpV.AddReplaceParam("pID", IDE);
                //Facturado
                int vFacturado = Convert.ToInt16(GUI.CApp.bll.GetSingleValue("WU_ESTADO_TRA_E", qpV, "PDV"));
                //Anulado
                int vAnulado = Convert.ToInt16(GUI.CApp.bll.GetSingleValue("WU_ESTADO_TRA_EA", qpV, "PDV"));
                //Valida si la transaccion ya fue facturada
                if (vFacturado < 1)
                {
                    if (vAnulado < 1)
                    {
                        if (IDE != string.Empty && IDE != "DOCUMENTO")
                        {


                            long varDocumento = Convert.ToInt64(GUI.CApp.bll.GetSingleValue("SEC_DOCUMENTO", "PDV"));
                            //&&pID&& ,  &&pDocumento&& , &&pCaja&& , '&&pUsuario&&' , &&pJornada&&, &&pPAGA_CON_COL&& , &&pPAGA_CON_DOL&& , &&pVUELTO_COL&& , &&pPAGO_COL&& , &&pPAGO_DOL&&  ); 
                            //Almacenar los datos del comprobante en la tienda y crear el recibo en wms_pague_servicios                
                            QueryParams qp = new LLNet.Utils.QueryParams();
                            qp.AddReplaceParam("pID", IDE);
                            qp.AddReplaceParam("pDocumento", varDocumento.ToString());
                            qp.AddReplaceParam("pCaja", Program.Caja.ToString());
                            qp.AddReplaceParam("pUsuario", GUI.CApp.usuario);
                            qp.AddReplaceParam("pJornada", Program.Jornada.ToString());
                            qp.AddReplaceParam("pPAGA_CON_COL", txtPCColM.Text);
                            qp.AddReplaceParam("pPAGA_CON_DOL", txtPCDolrM.Text);
                            qp.AddReplaceParam("pVUELTO_COL", txtVueltM.Text);
                            qp.AddReplaceParam("pPAGO_COL", txtMontColM.Text);
                            qp.AddReplaceParam("pPAGO_DOL", txtMontDolrM.Text);
                            qp.AddReplaceParam("pMTCN", Mtcn);
                            CApp.bll.ExecuteSql("WU_P_DENVIOS", qp, "PDV");

                            long DOCUM = long.Parse(varDocumento.ToString());
                            for (int i = 1; i <= varCantImp; i++)
                            {//cantidad de impresiones
                                //imprimir el comprobante
                                ImpFactWesternUnion(DOCUM, 1);
                               // GUI.CApp.ShowMessage("El envio se realizo exitosamente", "Mensaje de Informacion", true);
                         
                            }
                        }
                    }
                    else
                    {
                        GUI.CApp.ShowMessage("El envío ya fue Anulado", "Error", false);
                    }
                }
                else
                {
                    GUI.CApp.ShowMessage("El envío ya fue facturado, favor verifique en el reporte", "Error", false);
                }
            }
        }


        /// <summary>Imprime la factura </summary>
        /// <param name="doc"></param>
        private void ImpFactWesternUnion(long pdoc, int ptabla)
        {
            object FormatoTipoImpresion = null;
            QueryParams qparams = new LLNet.Utils.QueryParams();
            qparams = new LLNet.Utils.QueryParams();
            qparams.AddReplaceParam("RV_DOMAIN", "DOCUMENTOS TIENDA' AND RV_LOW_VALUE = 'RWU");
            Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
            Utils.Helpers.Merge(GUI.CApp.bll.getTypedDataSet(dsDocTienda.GetType(), dsDocTienda.DOMAINS.TableName, qparams), dsDocTienda);
            string format = Utils.Helpers.Nvl(FormatoTipoImpresion, dsDocTienda.DOMAINS[0].RV_MPCC02).ToString();

            imprimirDocumentoDOS(pdoc, "", Convert.ToInt64(format));

            //Cantidad de impresiones
            QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pDOCUMENTO", pdoc.ToString());
            qp.AddReplaceParam("pTABLA", ptabla.ToString());
            CApp.bll.ExecuteSql("WU_P_CANTIMP", qp, "PDV");
        }


        #region Impresion y Abrir el cajón de Dinero

        private static int EsDeCredito(long pDocumento)
        {
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("DOCUMENTO", Convert.ToString(pDocumento));
            int Credito = Convert.ToInt16(CApp.bll.GetSingleValue("ImpresionesCredito", qp, "PDV"));
            return Credito;
        }

        /*Imprimir abrir cajón*/
        private static void imprimirDocumentoDOS(long documento, string Impresora, long formato, string prefijo, string BatName)
        {
            if (BatName == "")
                BatName = "imprimir.bat";
            string Ruta = Application.StartupPath;
            QueryParams qp = new 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 = Helpers.ObjToStr(CApp.GetParam("TTXT"));

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

                try
                {
                    qp.AddReplaceParam("DOCUMENTO", documento.ToString());
                    qp.AddReplaceParam("FORMATO", formato.ToString());
                    qp.AddReplaceParam("USUARIO", CApp.usuario.ToString());
                    CApp.bll.ExecuteSql("GENERAR_IMPRESION_POS", qp, "PDV");
                    Thread.Sleep(3000); // SE LE DA TIEMPO A LA BD DE GENERAR EL ARCHIVO DE TEXTO
                    System.Diagnostics.Process.Start(startInfo);
                }
                catch (Exception ex)
                {
                    CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
                }
            }
            else
            {
                throw new Exception("No esta Definido el Parametro UATI");
            }
            //startInfo.UseShellExecute = false; 
        }
        private static void imprimirDocumentoDOS(long documento, string Impresora, long formato)
        {
            imprimirDocumentoDOS(documento, Impresora, formato, "", "");
        }
        private static void imprimirDocumentoDOS(long documento, string Impresora, long formato, string batName)
        {
            imprimirDocumentoDOS(documento, Impresora, formato, "", batName);
        }
        private static void imprimirFacturaPreimpresa(long documento, string codigoReporte)
        {
            //System.Diagnostics.Process.Start("START", "/min notepad /P" + " C:\\" + GUI.CApp.usuario + ".txt");            
            string PreimpresaXvariables = Helpers.ObjToStr(CApp.GetParam("PIXV"));

            if (PreimpresaXvariables == "NO")
            {
                Hashtable ht = new Hashtable();
                QueryParams QueryParams = new 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 = 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 = CApp.bll;
                xrBase.ExePath = 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 Formato = 2;
                int numImpresiones = 1;
                // int EsCredito = 0;
                QueryParams qp = new 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 = 'FAP");
                        break;
                }


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

                if (dsDocTienda.DOMAINS.Count > 0)
                {
                    // imprimirTicketPreimpresa(documentoPreimpreso, dsDocTienda.DOMAINS[0].RV_MPCC00, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPNC02), Convert.ToInt64(dsDocTienda.DOMAINS[0].RV_MPCC02));
                    imprimirTicketPreimpresa(documentoPreimpreso, dsDocTienda.DOMAINS[0].RV_MPCC00, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPNC02), Convert.ToInt64(dsDocTienda.DOMAINS[0].RV_MPCC02));
                }
            }
        }
        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 = Helpers.ObjToStr(CApp.GetParam("PIXV"));

            if (PreimpresaXvariables == "NO")
            {
                Hashtable ht = new Hashtable();
                QueryParams QueryParams = new 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 = 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 = CApp.bll;
                xrBase.ExePath = 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;
                QueryParams qp = new 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 = 'RR");
                        break;
                }


                Model.General.CgRefCodes dsDocTienda = new LLNet.Model.General.CgRefCodes();
                Helpers.Merge(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 imprimirTicket(long documento, string impresora, int copias, long formato)
        {
            Impresion.Impresion imp = new Impresion.Impresion();
            imp.Conexion = 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 = Helpers.ObjToStr(key.GetValue("Factura", ""));

            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)
            {
                CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
            }
        }
        private static void imprimirTicketPreimpresa(long documento, string impresora, int copias, long formato)
        {
            Impresion.Impresion imp = new Impresion.Impresion();
            imp.Conexion = CApp.bll.ConnectionString;

            Impresion.MensajeImpresion prntMess = new Impresion.MensajeImpresion();
            RegistryKey key = Registry.CurrentUser;

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

            string printerFactura = "";

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

            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)
            {
                CApp.ShowMessage(ex.Message, "Impresion de Documentos", true);
            }
        }


        /// <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 = 'RR");
                    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)
            {
                // GUSTAVO MIRANDA  switch (Convert.ToInt16(dsDocTienda.DOMAINS[0].RV_MPNC03))
                numImpresiones = EsDeCredito(documento);

                switch (Formato)
                {
                    case 1:
                        for (int i = 0; i < numImpresiones; i++)
                        {
                            imprimirFacturaPreimpresa(documento, dsDocTienda.DOMAINS[0].RV_MPCC03);
                            ActualizaImpresiones(documento);
                        }

                        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 = 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());
                            if (numImpresiones > 1)
                            {
                                Thread.Sleep(4000);  // SE DEJA ESTE TIEMPO PARA QUE NO SE LEA EL TXT ADECUADO
                            }
                            ActualizaImpresiones(documento);

                        }

                        break;

                    default:
                        for (int i = 0; i < numImpresiones; i++)
                        {
                            imprimirTicket(documento, dsDocTienda.DOMAINS[0].RV_MPCC00, Convert.ToInt32(dsDocTienda.DOMAINS[0].RV_MPNC02), Convert.ToInt64(dsDocTienda.DOMAINS[0].RV_MPCC02));
                        }
                        break;

                }
            }
        }

        private static void ActualizaImpresiones(long pDocumento)
        {
            QueryParams qp = new QueryParams();
            qp.AddReplaceParam("DOCUMENTO", Convert.ToString(pDocumento));
            CApp.bll.ExecuteSql("ActImpresiones", qp, "PDV");
        }

        #endregion

        private void FrmWesternUnion_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Modifiers == Keys.Alt)
            {
                switch (e.KeyCode)
                {                   
                    case Keys.E:
                        sbtnEnviar.PerformClick();
                        break;
                    case Keys.P:
                        sbtnPago.PerformClick();
                        break;                    
                }
            }
            if (e.Modifiers == Keys.None)
            {
                switch (e.KeyCode)
                {
                    case Keys.F7:
                        if (this.sBtnCompEnvioWU.Visible)
                            sBtnCompEnvioWU.PerformClick();
                        break;
                    case Keys.F8:
                        if (this.sBtnCompPagoWU.Visible)
                            sBtnCompPagoWU.PerformClick();
                        break;
                    case Keys.Escape:
                        btnCancelar.PerformClick();
                        break;
                }
            }
        }

        private void txtpagDolPC_EditValueChanged(object sender, EventArgs e)
        {
            //if (txtpagDolPC.Text != string.Empty)
            //{
            //    if (txtpagDolMonto.Text != string.Empty)
            //    {
            //        float dolarvuelto = float.Parse(txtpagDolPC.Text) - float.Parse(txtpagDolMonto.Text);
            //        if (dolarvuelto >= 1)
            //        {
            //            float colvuelt = dolarvuelto * float.Parse(varWUDolarCompra);
            //            txtpagVueltdol.Text = colvuelt.ToString();
            //        }
            //        else
            //        {
            //            txtpagVueltdol.Text = "0";
            //        }
            //    }
            //}
            //else
            //{
            //    txtpagVueltdol.Text = "0";
            //}
        }

        private void txtPCColM_EditValueChanged(object sender, EventArgs e)
        {   
            string smontoDol, smontoCol, sPCCol, sPCDolar;
            decimal dmontoDol, dmontoCol, dPCCol, dPCDolar;

            smontoDol = txtMontDolrM.Text;
            smontoCol = txtMontColM.Text;
            sPCDolar = txtPCDolrM.Text;
            sPCCol = txtPCColM.Text;

            if (sPCCol.Length > 0)
            {
                dPCCol = decimal.Parse(sPCCol);
            }
            else
            {
                dPCCol = 0;
            }
            
            if (sPCDolar.Length > 0)
            {
                dPCDolar = decimal.Parse(sPCDolar);
            }
            else
            {
                dPCDolar = 0;
            }
            if (smontoDol.Length > 0)
            {
                dmontoDol = decimal.Parse(smontoDol);
            }
            else
            {
                dmontoDol = 0;
            }

            if (smontoCol.Length > 0)
            {
                dmontoCol = decimal.Parse(smontoCol);
            }
            else
            {
                dmontoCol = 0;
            }

            if (dmontoDol == 0)
            {
                //txtpagDolPC.Text = "0"; 
                dPCDolar = 0;
            }

            decimal dcln = PagoColon(dmontoDol,dmontoCol,dPCCol, dPCDolar);
            decimal ddlr = PagoDolar(dmontoDol,dmontoCol,dPCCol,dPCDolar);
            decimal dvuelt = dcln + ddlr;

            txtVueltM.Text = dvuelt.ToString();
        }

        private decimal PagoColon(decimal montoDol, decimal montoCol, decimal PCCol, decimal PCDolar)
        {
            decimal resultado = 0;
            decimal vueltcol = PCCol - montoCol;
            if (vueltcol >= 1)
            {
                resultado = vueltcol;
            }
            return resultado;
        }

        private decimal PagoDolar(decimal montoDol, decimal montoCol, decimal PCCol, decimal PCDolar)
        {
            decimal resultado = 0;
            decimal vueltDol = PCDolar - montoDol;
            if (vueltDol >= 0)
            {
                if (varWUDolarCompra is null)
                {
                    resultado = vueltDol;
                }
                else
                {
                    resultado = vueltDol * decimal.Parse(varWUDolarCompra);
                }
            }
            return resultado;
        }

        private void habilitaPagos()
        {
            txtPCColM.Enabled = true;
            txtPCDolrM.Enabled = true;
        }

        private void deshabilitaPagos(bool todos)
        {
            habilitaPagos();
            if (todos)
            {
                txtPCColM.Enabled = false;
                txtPCDolrM.Enabled = false;
            }
            else
            {
                if (txtMontColM.Text == "0")
                {
                    txtPCColM.Enabled = false;
                    txtPCColM.Text = "0";
                }
                if (txtMontDolrM.Text == "0")
                {
                    txtPCDolrM.Enabled = false;
                    txtPCDolrM.Text = "0";
                }
            }
        }

        private void sBtnCompEnvioWU_Click(object sender, EventArgs e)
        {
            if (txtPCColM.Text.Equals(""))
            {
                txtPCColM.Text = "0";

            }
            if (txtPCDolrM.Text.Equals(""))
            {
                txtPCDolrM.Text = "0";

            }


            try
            {
                if (decimal.Parse(txtPCDolrM.Text) < decimal.Parse(txtMontDolrM.Text))
                {
                    CApp.ShowMessage("El monto en Dolares es menor al monto a pagar", "WESTERNUNION", false);
                    return;
                }
                if (decimal.Parse(txtPCColM.Text) < decimal.Parse(txtMontColM.Text))
                {
                    CApp.ShowMessage("El monto en Colones es menor al monto a pagar", "WESTERNUNION", false);
                    return;
                }

                if (Decimal.Parse(vEfectivoCaja) == 0 && Decimal.Parse(textEditdispo.Text) == 0 && Decimal.Parse(txtPCColM.Text) != Decimal.Parse(txtMontColM.Text) && Decimal.Parse(txtPCDolrM.Text) != Decimal.Parse(txtMontDolrM.Text))
                {
                    GUI.CApp.ShowMessage("No puede hacer el envios sin disponible ni efectivo en caja", "ERROR", true);
                    return;
                }
                //  salida de vuelto dolares UNICAMENTE
                if (Decimal.Parse(txtPCColM.Text) == Decimal.Parse(txtMontColM.Text) && Decimal.Parse(txtPCDolrM.Text) > Decimal.Parse(txtMontDolrM.Text))
                {

                    if ((Decimal.Parse(txtVueltM.Text)) > (Decimal.Parse(textEditdispo.Text) + Decimal.Parse(vEfectivoCaja)))
                    {

                        GUI.CApp.ShowMessage("No puede hacer el envio, no tiene dinero suficiente efectivo en caja", "ERROR", true);
                        // textPagaRetiros.Focus();
                        return;

                    }
                }
                // VALIDA LOS VUELTOS DE DOLARES JUNTO CON LOS DE COLONES 
                if (Decimal.Parse(txtPCColM.Text) > Decimal.Parse(txtMontColM.Text) || Decimal.Parse(txtPCDolrM.Text) > Decimal.Parse(txtMontDolrM.Text))
                {
                    // SACA SOLO LOS DOLARES
                    var vVultosDolares = Decimal.Parse(txtPCDolrM.Text) - Decimal.Parse(txtMontDolrM.Text);

                    var resultaVuelto = Decimal.Parse(vVultosDolares.ToString()) * Decimal.Parse(varWUDolarCompra);


                    if (resultaVuelto > (Decimal.Parse(textEditdispo.Text) + Decimal.Parse(vEfectivoCaja)))
                    {

                        GUI.CApp.ShowMessage("No puede realizar el envio, no tiene dinero suficiente efectivo en caja para sacar el vuelto DOLARES.", "ERROR", true);
                        // textPagaRetiros.Focus();
                        return;

                    }
                    
                    if( Decimal.Parse(txtVueltM.Text) > (Decimal.Parse(textEditdispo.Text) + Decimal.Parse(vEfectivoCaja))) 
                    {

                        GUI.CApp.ShowMessage("No puede realizar el envio, no tiene dinero suficiente efectivo en caja para sacar el vuelto.", "ERROR", true);
                        // textPagaRetiros.Focus();
                        return;
                    }

                }
                ComprobEnvioWU();
                mCargaFondoDisponible();
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "WESTERNUNION", false);
            }
        }

     
        private void txtPCDolrM_EditValueChanged(object sender, EventArgs e)
        {
            string smontoDol, smontoCol, sPCCol, sPCDolar;
            decimal dmontoDol, dmontoCol, dPCCol, dPCDolar;

            smontoDol = txtMontDolrM.Text;
            smontoCol = txtMontColM.Text;
            sPCDolar = txtPCDolrM.Text;
            sPCCol = txtPCColM.Text;

            if (sPCCol.Length > 0)
            {
                dPCCol = decimal.Parse(sPCCol);
            }
            else
            {
                dPCCol = 0;
            }

            if (sPCDolar.Length > 0)
            {
                dPCDolar = decimal.Parse(sPCDolar);
            }
            else
            {
                dPCDolar = 0;
            }

            if (smontoDol.Length > 0)
            {
                dmontoDol = decimal.Parse(smontoDol);
            }
            else
            {
                dmontoDol = 0;
            }

            if (smontoCol.Length > 0)
            {
                dmontoCol = decimal.Parse(smontoCol);
            }
            else
            {
                dmontoCol = 0;
            }

            if (dmontoDol == 0)
            {
               // txtpagDolPC.Text = "0";
                dPCDolar = 0;
            }

            decimal dcln = PagoColon(dmontoDol, dmontoCol, dPCCol, dPCDolar);
            decimal ddlr = PagoDolar(dmontoDol, dmontoCol, dPCCol, dPCDolar);
            decimal dvuelt = dcln + ddlr;

            txtVueltM.Text = dvuelt.ToString();
        }

        private void txtPagaCnCol_EditValueChanged(object sender, EventArgs e)
        {

        }

        private void sbtnImprimir_Click(object sender, EventArgs e)
        {
            try
            {
                if (GUI.CApp.ValidateAccess("Reimprimir", "Reimpresion"))
                {
                    foreach (int handle in gridView6.GetSelectedRows())
                    {
                        for (int i = 1; i <= varCantImp; i++)
                        {//cantidad de impresiones

                            //documento de la transaccion 
                            string Docum = Convert.ToString(gridView6.GetRowCellValue(handle, gridView6.Columns[0]));
                            long doc = long.Parse(Docum);
                            //tipo de la transaccion 
                            string tipo = Convert.ToString(gridView6.GetRowCellValue(handle, gridView6.Columns[3]));
                            if (tipo == "ENVIO")
                            {
                                ImpFactWesternUnion(doc, 1);
                            }
                            else
                            {
                                ImpFactWesternUnion(doc, 2);
                            }
                            System.Console.WriteLine(i);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "WESTERNUNION", false);
            }
        }

        private void sBtnReimpRecNic_Click(object sender, EventArgs e)
        {
            pnlCtrlEnvio.Visible = false;
            pnlCtrlPago.Visible = false;
            pnlCtrlRep.Visible = false;
            pnlCtrlReimpr.Visible = true;
            pnlCtrlAnular.Visible = false;
            sbtnImprimir.Visible = true;
            sBtnCompEnvioWU.Visible = false;
            sBtnCompPagoWU.Visible = false;
            sBtnAnular.Visible = false;
            LlenarComprobImpr();
        }

        private void LlenarComprobImpr()
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pUsuario", GUI.CApp.usuario); //Usuario
            qp.AddReplaceParam("pJornada", Program.Jornada.ToString()); //Jornada
            //CONSULTA LOS PARÁMETROS DE LA BD
            DataSet dsE = GUI.CApp.bll.getDataSet("PDV", "WU_DATOS_REIMP", qp);

            if (dsE.Tables.Count > 0)
            {
                gdCtlReimpWU.DataSource = dsE.Tables[0];
            }
            else
            {
                gdCtlReimpWU.DataSource = null;
                gdCtlReimpWU.Refresh();
            }
        }

        private void sBtnRepWU_Click(object sender, EventArgs e)
        {
            pnlCtrlEnvio.Visible = false;
            pnlCtrlPago.Visible = false;
            pnlCtrlRep.Visible = true;
            pnlCtrlReimpr.Visible = false;
            pnlCtrlAnular.Visible = false;
            sbtnImprimir.Visible = false;
            sBtnAnular.Visible = false;
            ArqJornadaWU();
        }

        /// <summary>Arqueo de la Jornada Actual </summary>
        private void ArqJornadaWU()
        {
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pUsuario", GUI.CApp.usuario); //Usuario
            qp.AddReplaceParam("pJornada", Program.Jornada.ToString()); //Jornada           

            DataSet dsB = GUI.CApp.bll.getDataSet("PDV", "C_REPORTE_WU_ARQ", qp);
            LLNet.Tienda.Reportes.CR_ArqWU objRpt = new LLNet.Tienda.Reportes.CR_ArqWU();
            LLNet.Tienda.Reportes.dsArqWesternU dsdatos = new LLNet.Tienda.Reportes.dsArqWesternU();

            objRpt.Load("C\\ekono\\POS Retail 8.0.0\\CR_ArqWU.rpt");

            long total = 0; //monto total de la suma de los montos de cada recibo

            // N.MONTOD, N.RECIBO_NO FROM wms_v_RECARGANIC N WHERE DOCUMENTO IN ( SELECT DOCUMENTO FROM WMS_DOCUMENTOS W where W.JORNADA = &&pJornada&& AND W.CAJA = &&pCaja&& ) ORDER BY FECHA DESC
            foreach (DataRow Fila in dsB.Tables[0].Rows)
            {
                object[] datos = new object[10];

                datos[0] = Convert.ToString(Fila[0]); //recibo
                datos[1] = Convert.ToString(Fila[1]); //tipo
                datos[2] = Convert.ToString(Fila[2]); //ID
                datos[3] = Convert.ToString(Fila[3]); //monto       
                datos[4] = Convert.ToString(Fila[4]); //remitent         
                datos[5] = Convert.ToString(Fila[5]); //destino       
                datos[6] = Convert.ToDouble(Fila[6]); //ID
                datos[7] = Convert.ToDouble(Fila[7]); //monto       
                datos[8] = Convert.ToString(Fila[8]); //remitent      
                datos[9] = Convert.ToString(Fila[9]); //remitent      
                //total += Convert.ToInt64(Fila[3]);
                dsdatos.Tables[1].Rows.Add(datos);
            }

            string[] totales = new string[3];
            totales[0] = Program.Jornada.ToString(); //JORNADA
            totales[1] = Program.Caja.ToString(); //CAJA
            totales[2] = string.Empty; //MONTO TOTAL            

            dsdatos.Tables[0].Rows.Add(totales);

            objRpt.SetDataSource((DataSet)dsdatos);

            crystalReportViewer3.ReportSource = objRpt;
            crystalReportViewer3.Refresh();

            //GridCRepJorn.Refresh();
        }

        private void txtMontDolrM_EditValueChanged(object sender, EventArgs e)
        {
            deshabilitaPagos(false);
        }

        private void txtMontColM_EditValueChanged(object sender, EventArgs e)
        {
            deshabilitaPagos(false);
        }

        private void btnAnular_Click(object sender, EventArgs e)
        {
           // if (GUI.CApp.ValidateAccess("ANUL_WU", "Anulacion de WesternUnion"))
           // {
                pnlCtrlEnvio.Visible = false;
                pnlCtrlPago.Visible = false;
                pnlCtrlRep.Visible = false;
                pnlCtrlReimpr.Visible = false;
                pnlCtrlAnular.Visible = true;
                sbtnImprimir.Visible = false;
                sBtnCompEnvioWU.Visible = false;
                sBtnCompPagoWU.Visible = false;
                sBtnAnular.Visible = true;
                LlenarComprobAnular();
           // }
        }

        private void LlenarComprobAnular()
        {
            gdCtrlAnular.DataSource = null;
            gdCtrlAnular.Refresh();
            Utils.QueryParams qp = new LLNet.Utils.QueryParams();
            qp.AddReplaceParam("pUsuario", GUI.CApp.usuario); //Usuario
            qp.AddReplaceParam("pJornada", Program.Jornada.ToString()); //Jornada
            //CONSULTA LOS PARÁMETROS DE LA BD
            DataSet dsE = GUI.CApp.bll.getDataSet("PDV", "WU_DATOS_REIMP", qp);

            if (dsE.Tables.Count > 0)
            {
                gdCtrlAnular.DataSource = dsE.Tables[0];
                
                //inicio ************
                foreach (int handle in gdVAnulr.GetSelectedRows())
                {
                    if (gdVAnulr.RowCount > 0 && gdVAnulr.Columns.Count > 0 )
                    {
                        //actualiza el mtcn selccionado actualmente
                        string MTCN = Convert.ToString(gdVAnulr.GetRowCellValue(handle, gdVAnulr.Columns[2]));
                        txtmtcnAnular.Text = MTCN;
                        //actualiza el ID seleccionado actualmente
                        string id = Convert.ToString(gdVAnulr.GetRowCellValue(handle, gdVAnulr.Columns[4]));
                        txtIdAnular.Text = id;
                        //actualiza el tipo seleccionado actualmente
                        string tipo = Convert.ToString(gdVAnulr.GetRowCellValue(handle, gdVAnulr.Columns[3]));
                        txttipoanular.Text = tipo;     
                    }
                }

                //FIN ***************
            }
            else
            {
                gdCtrlAnular.DataSource = null;
                gdCtrlAnular.Refresh();
            }
        }

        #region FocusedRowChanged

        private void gdVAnulr_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            try
            {
                if (gdVAnulr.Columns.Count > 0)
                {
                    foreach (int handle in gdVAnulr.GetSelectedRows())
                    {
                        //actualiza el mtcn sekeccionado actualmente
                        string MTCN = Convert.ToString(gdVAnulr.GetRowCellValue(handle, gdVAnulr.Columns[2]));
                        txtmtcnAnular.Text = MTCN;
                        //actualiza el ID seleccionado actualmente
                        string id = Convert.ToString(gdVAnulr.GetRowCellValue(handle, gdVAnulr.Columns[4]));
                        txtIdAnular.Text = id;
                        //actualiza el tipo seleccionado actualmente
                        string tipo = Convert.ToString(gdVAnulr.GetRowCellValue(handle, gdVAnulr.Columns[3]));
                        txttipoanular.Text = tipo;     
                    }
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Marchamos", true);
            } 
        }

        private void gridView7_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            habilitaPagos();//habilita los textos de tipos de pago
            calculosEnvios();
            
            /*try
            {
                if (gridView7.Columns.Count > 0)
                {
                    foreach (int handle in gridView7.GetSelectedRows())
                    {
                        //actualiza el mtcn sekeccionado actualmente
                        string MTCN = Convert.ToString(gdVAnulr.GetRowCellValue(handle, gdVAnulr.Columns[2]));
                        txtmtcnAnular.Text = MTCN;
                        //actualiza el ID seleccionado actualmente
                        string id = Convert.ToString(gdVAnulr.GetRowCellValue(handle, gdVAnulr.Columns[4]));
                        txtIdAnular.Text = id;
                        //actualiza el tipo seleccionado actualmente
                        string tipo = Convert.ToString(gdVAnulr.GetRowCellValue(handle, gdVAnulr.Columns[3]));
                        txttipoanular.Text = tipo;
                    }
                }
            }
            catch (Exception ex)
            {
                CApp.ShowMessage(ex.Message, "Marchamos", true);
            }*/
        }

        private void gridView8_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {

        }

        private void gridView6_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {

        }

        #endregion
       
        private void sBtnAnular_Click(object sender, EventArgs e)
        {
            if (GUI.CApp.ValidateAccess("ANUL_WU", "Anulacion de WesternUnion"))
            {
                if (pnlCtrlAnular.Visible == true)
                {
                    if (txttipoanular.Text == "ENVIO")
                    {//envio Intra / Local
                        //Anular el Pago/Envio
                        if (txtIdAnular.Text != string.Empty)
                        {
                            //Elimina un comprobante
                            decimal vMontoCol = 0;
                            decimal vMontoDol = 0;
                            foreach (int handle in gdVAnulr.GetSelectedRows())
                            {
                                vMontoCol = Convert.ToDecimal(gdVAnulr.GetRowCellValue(handle, gdVAnulr.Columns[5]));
                                vMontoDol = Convert.ToDecimal(gdVAnulr.GetRowCellValue(handle, gdVAnulr.Columns[6]));
                            }
                            if (Decimal.Parse(vEfectivoCaja) == 0 && Decimal.Parse(textEditdispo.Text) == 0)
                            {
                                GUI.CApp.ShowMessage("No puede hacer la anulación del Envio, sin disponible ni efectivo(Dolares) en caja", "ERROR", true);
                                // textEditdispo.Focus();
                                return;
                            }
                            if (vMontoCol > (Decimal.Parse(textEditdispo.Text) + Decimal.Parse(vEfectivoCaja)))
                            {
                                GUI.CApp.ShowMessage("No puede hacer la anulación del Envio, no tiene dinero suficiente efectivo(Colones) en caja", "ERROR", true);

                                return;
                            }

                            if (vMontoDol > (Decimal.Parse(vEfectivoCajaDol.ToString())))
                            {
                                GUI.CApp.ShowMessage("No puede hacer la anulación del Envio, no tiene dinero suficiente efectivo(Dolares) en caja", "ERROR", true);

                                return;
                            }
                            QueryParams qp = new LLNet.Utils.QueryParams();
                            qp.AddReplaceParam("pID", txtIdAnular.Text);
                            qp.AddReplaceParam("pUsuario", GUI.CApp.usuario);
                            qp.AddReplaceParam("pJornada", Program.Jornada.ToString());
                            CApp.bll.ExecuteSql("WU_P_AENVIOS", qp, "PDV");
                            CApp.ShowMessage("Envío anulado con éxito", "WESTERNUNION", false);
                        }
                    }
                    else
                    {
                        if (txttipoanular.Text == "PAGO")
                        {
                            if (txtIdAnular.Text != string.Empty)
                            {
                                //Elimina un comprobante
                                QueryParams qp = new LLNet.Utils.QueryParams();
                                qp.AddReplaceParam("pID", txtIdAnular.Text);
                                qp.AddReplaceParam("pUsuario", GUI.CApp.usuario);
                                CApp.bll.ExecuteSql("WU_P_APAGOS", qp, "PDV");
                                CApp.ShowMessage("Pago anulado con éxito", "WESTERNUNION", false);
                            }
                        }
                    }
                }
                LlenarComprobAnular();
                mCargaFondoDisponible();
            }
        }

       
        

    }
}
