public HttpResponseMessage construirDocumentoExcel([FromUri] int?cuentaBancariaID, [FromBody] ConstruirExcelCollections construirDocExcel_Collections)
        {
            if (!User.Identity.IsAuthenticated)
            {
                var errorResult = new
                {
                    errorFlag     = true,
                    resultMessage = "Error: por favor haga un login a esta aplicación, y luego regrese a ejecutar esta función."
                };

                return(Request.CreateResponse(HttpStatusCode.OK, errorResult));
            }

            try
            {
                // --------------------------------------------------------------------------------------------------------------------------
                // establecemos una conexión a mongodb
                string contabm_mongodb_connection = System.Web.Configuration.WebConfigurationManager.AppSettings["contabm_mongodb_connectionString"];
                string contabM_mongodb_name       = System.Web.Configuration.WebConfigurationManager.AppSettings["contabM_mongodb_name"];

                var client = new MongoClient(contabm_mongodb_connection);
                // var server = client.GetServer();
                // nótese como el nombre de la base de datos mongo (de contabM) está en el archivo webAppSettings.config; en este db se registran las vacaciones
                var mongoDataBase = client.GetDatabase(contabM_mongodb_name);

                // vamos a leer todas las compañías y ponerlas en una lista ... la cuenta bancaria (default) para cada compañía, será buscada allí ...

                var companiasMongoCollection = mongoDataBase.GetCollection <Compania_mongodb>("Compania");
                var mongoQuery = from e in companiasMongoCollection.AsQueryable <Compania_mongodb>()
                                 select e;
                List <Compania_mongodb> companias = mongoQuery.ToList();

                // -----------------------------------------------------------------------------------------------------------------
                // preparamos el documento Excel, para tratarlo con ClosedXML ...
                string fileName = System.Web.HttpContext.Current.Server.MapPath("~/Excel/Plantillas/InstruccionesPagoAlBanco/InstruccionesPagoAlBanco.xlsx");

                XLWorkbook   wb;
                IXLWorksheet ws;

                try
                {
                    wb = new XLWorkbook(fileName);
                    ws = wb.Worksheet(1);
                }
                catch (Exception ex)
                {
                    string errorMessage = ex.Message;
                    if (ex.InnerException != null)
                    {
                        errorMessage += "<br />" + ex.InnerException.Message;
                    }

                    var errorResult = new
                    {
                        errorFlag     = true,
                        resultMessage = errorMessage
                    };

                    return(Request.CreateResponse(HttpStatusCode.OK, errorResult));
                }

                var excelTable = ws.Table("Facturas");
                // -----------------------------------------------------------------------------------------------------------------

                int cantidadRows = 0;

                foreach (var factura in construirDocExcel_Collections.FacturasSeleccionadas_List)
                {
                    cantidadRows++;

                    excelTable.DataRange.LastRow().Field(0).SetValue(factura.companiaID);
                    excelTable.DataRange.LastRow().Field(1).SetValue(factura.compania);
                    excelTable.DataRange.LastRow().Field(2).SetValue(new DateTime(factura.fechaRecepcion.Year, factura.fechaRecepcion.Month, factura.fechaRecepcion.Day));
                    excelTable.DataRange.LastRow().Field(3).SetValue(factura.numeroFactura);
                    excelTable.DataRange.LastRow().Field(4).SetValue(factura.numeroControl);
                    excelTable.DataRange.LastRow().Field(5).SetValue(factura.concepto);

                    excelTable.DataRange.LastRow().Field(6).SetValue(factura.montoNoImponible);
                    excelTable.DataRange.LastRow().Field(7).SetValue(factura.montoImponible);
                    excelTable.DataRange.LastRow().Field(8).SetValue(factura.Iva);
                    excelTable.DataRange.LastRow().Field(9).SetValue(factura.totalFactura);
                    excelTable.DataRange.LastRow().Field(10).SetValue(factura.montoPagado);
                    excelTable.DataRange.LastRow().Field(11).SetValue(factura.montoAPagar);

                    excelTable.DataRange.InsertRowsBelow(1);
                }



                // ----------------------------------------------------------
                // ahora escribimos registros a otra tabla en el documento
                ws         = wb.Worksheet(2);
                excelTable = ws.Table("Pagos");

                cantidadRows = 0;

                foreach (var pago in construirDocExcel_Collections.ResumenFacturas_List)
                {
                    cantidadRows++;

                    excelTable.DataRange.LastRow().Field(0).SetValue(pago.companiaID);
                    excelTable.DataRange.LastRow().Field(1).SetValue(pago.compania);
                    excelTable.DataRange.LastRow().Field(2).SetValue(pago.cantidadFacturasAPagar);
                    excelTable.DataRange.LastRow().Field(3).SetValue(pago.tipoPersona + '-' + pago.numeroRif);
                    excelTable.DataRange.LastRow().Field(4).SetValue(pago.nombreBeneficiario);
                    excelTable.DataRange.LastRow().Field(5).SetValue(pago.codigoBanco);
                    excelTable.DataRange.LastRow().Field(6).SetValue(pago.numeroCuentaBancaria);
                    excelTable.DataRange.LastRow().Field(7).SetValue(new DateTime(pago.fechaValor.Year, pago.fechaValor.Month, pago.fechaValor.Day));
                    excelTable.DataRange.LastRow().Field(8).SetValue(pago.monto);

                    excelTable.DataRange.InsertRowsBelow(1);
                }



                BancosEntities context = new BancosEntities();

                string nombreCiaContab = "";
                string rifCiaContab    = "";

                CuentasBancaria cuentaBancaria = context.CuentasBancarias.Where(cta => cta.CuentaInterna == cuentaBancariaID).FirstOrDefault();

                if (cuentaBancaria != null)
                {
                    ContabSysNet_Web.ModelosDatos_EF.Bancos.Compania ciaContab = context.Companias.Where(cia => cia.Numero == cuentaBancaria.Cia).FirstOrDefault();

                    nombreCiaContab = ciaContab.Nombre;
                    rifCiaContab    = ciaContab.Rif;
                }


                ws = wb.Worksheet(1);
                ws.Cell("B2").Value = nombreCiaContab;
                ws.Cell("B3").Value = "Rif: " + rifCiaContab;

                string userName = User.Identity.Name.Replace("@", "_").Replace(".", "_");
                fileName = System.Web.HttpContext.Current.Server.MapPath("~/Excel/InstruccionesPagoAlBanco_" + userName + ".xlsx");

                if (File.Exists(fileName))
                {
                    File.Delete(fileName);
                }

                wb.SaveAs(fileName);

                var errorResult2 = new
                {
                    errorFlag     = false,
                    resultMessage = "Ok, el documento Excel se ha construído en forma satisfactoria.<br />" +
                                    "Por favor haga un click en la opción que le permite descargar (download) el documento a su computador."
                };

                return(Request.CreateResponse(HttpStatusCode.OK, errorResult2));
            }
            catch (Exception ex)
            {
                string message = ex.Message;
                if (ex.InnerException != null)
                {
                    message += "<br />" + ex.InnerException.Message;
                }

                var errorResult = new
                {
                    errorFlag     = true,
                    resultMessage = "Error: se ha producido un error al intentar efectuar una operación en la base de datos.<br />" +
                                    "El mensaje específico de error es: <br />" + message
                };

                return(Request.CreateResponse(HttpStatusCode.OK, errorResult));
            }
        }
        public HttpResponseMessage leerDatosCompanias([FromUri] int?cuentaBancariaID, [FromBody] List <ResumenFacturas> resumenFacturas)
        {
            if (!User.Identity.IsAuthenticated)
            {
                var errorResult = new
                {
                    errorFlag     = true,
                    resultMessage = "Error: por favor haga un login a esta aplicación, y luego regrese a ejecutar esta función."
                };

                return(Request.CreateResponse(HttpStatusCode.OK, errorResult));
            }

            try
            {
                // --------------------------------------------------------------------------------------------------------------------------
                // establecemos una conexión a mongodb
                string contabm_mongodb_connection = System.Web.Configuration.WebConfigurationManager.AppSettings["contabm_mongodb_connectionString"];
                string contabM_mongodb_name       = System.Web.Configuration.WebConfigurationManager.AppSettings["contabM_mongodb_name"];

                var client = new MongoClient(contabm_mongodb_connection);
                // var server = client.GetServer();
                // nótese como el nombre de la base de datos mongo (de contabM) está en el archivo webAppSettings.config; en este db se registran las vacaciones
                var mongoDataBase = client.GetDatabase(contabM_mongodb_name);

                // vamos a leer todas las compañías y ponerlas en una lista ... la cuenta bancaria (default) para cada compañía, será buscada allí ...

                var companiasMongoCollection = mongoDataBase.GetCollection <Compania_mongodb>("Compania");

                var mongoQuery = from e in companiasMongoCollection.AsQueryable <Compania_mongodb>()
                                 select e;

                List <Compania_mongodb> companias = mongoQuery.ToList();

                // --------------------------------------------------------------------------------------------------------------------------

                BancosEntities context = new BancosEntities();

                // antes que nada, leemos la cuenta bancaria y los datos de la cia contab ...

                ContabSysNet_Web.ModelosDatos_EF.Bancos.Compania ciaContab = null;
                CuentasBancaria cuentaBancariaCiaContab = null;
                string          codigoBancoCiaContab    = "";

                if (cuentaBancariaID != null)
                {
                    cuentaBancariaCiaContab = context.CuentasBancarias.Where(cta => cta.CuentaInterna == cuentaBancariaID).FirstOrDefault();
                    if (cuentaBancariaCiaContab != null)
                    {
                        ciaContab            = context.Companias.Where(cia => cia.Numero == cuentaBancariaCiaContab.Cia).FirstOrDefault();
                        codigoBancoCiaContab = cuentaBancariaCiaContab.Agencia1.Banco1.Codigo;
                    }
                }

                foreach (var c in resumenFacturas)
                {
                    Proveedore compania = context.Proveedores.Include("Personas").Where(p => p.Proveedor == c.companiaID).FirstOrDefault();

                    if (compania != null)
                    {
                        c.tipoPersona = compania.Rif != null?compania.Rif.Substring(0, 1) : "";

                        c.numeroRif = compania.Rif != null?compania.Rif.Substring(1, compania.Rif.Length - 1) : "";

                        Persona persona = compania.Personas.Where(p => p.DefaultFlag.HasValue && p.DefaultFlag.Value).FirstOrDefault();

                        if (persona != null)
                        {
                            c.nombreBeneficiario = persona.Nombre + ' ' + persona.Apellido;
                            c.email   = persona.email;
                            c.celular = persona.Celular;

                            // solo si la persona posee un Rif registrado, lo usamos
                            if (!string.IsNullOrEmpty(persona.Rif))
                            {
                                c.tipoPersona = persona.Rif != null?persona.Rif.Substring(0, 1) : "";

                                c.numeroRif = persona.Rif != null?persona.Rif.Substring(1, persona.Rif.Length - 1) : "";
                            }
                        }

                        // buscamos la compañía en la lista que leímos desde mongo

                        var compania2 = companias.Where(x => x.Id == c.companiaID).FirstOrDefault();

                        if (compania2 != null && compania2.cuentasBancarias.Any(x => x.isDefault))
                        {
                            var cuentaBancaria = compania2.cuentasBancarias.Where(x => x.isDefault).FirstOrDefault();
                            var banco          = context.Bancos.Where(b => b.Banco1 == cuentaBancaria.banco).FirstOrDefault();

                            c.numeroCuentaBancaria = cuentaBancaria.numero;
                            c.codigoBanco          = banco != null ? banco.Codigo : null;

                            c.modalidadPago = "";

                            if (!(cuentaBancaria.tipo == "VI" || cuentaBancaria.tipo == "MA" || cuentaBancaria.tipo == "AM"))
                            {
                                // la cuenta no es una tarjeta; es una cuenta de ahorros o corriente
                                if (c.codigoBanco == codigoBancoCiaContab)
                                {
                                    // cuentas del mismo banco (que nuestro banco)
                                    c.modalidadPago = "CTA";
                                }
                                else
                                {
                                    // cuenta de difenrente banco (a nuestro banco)
                                    c.modalidadPago = "BAN";
                                }
                            }
                            else
                            {
                                // tarjetas de crédito
                                if (cuentaBancaria.tipo == "AM")
                                {
                                    c.modalidadPago = "AME";
                                }
                                else if (c.codigoBanco == codigoBancoCiaContab)
                                {
                                    // visa/master mismo banco
                                    c.modalidadPago = "V/M";
                                }
                                else
                                {
                                    // visa/master otros bancos
                                    c.modalidadPago = "TAR";
                                }
                            }
                        }
                    }
                }

                var registroCiaContab = new
                {
                    tipoRegistro                                = "01",
                    descripcionLote                             = "Proveedores",
                    tipoPersona                                 = ciaContab.Rif != null?ciaContab.Rif.Substring(0, 1) : "",
                                                      numeroRif = ciaContab.Rif != null?ciaContab.Rif.Replace("-", "").Substring(1, ciaContab.Rif.Replace("-", "").Length - 1) : "",
                                                                      numeroContrato      = cuentaBancariaCiaContab.NumeroContrato,
                                                                      numeroLote          = 0,
                                                                      fechaEnvio          = DateTime.Today,
                                                                      cantidadOperaciones = resumenFacturas.Count(),
                                                                      montoTotal          = resumenFacturas.Sum(f => f.monto),
                                                                      moneda = "VEB"
                };

                var result = new
                {
                    errorFlag       = false,
                    resultMessage   = "",
                    resumenFacturas = resumenFacturas,
                    registroCiaContab
                };

                return(Request.CreateResponse(HttpStatusCode.OK, result));
            }
            catch (Exception ex)
            {
                string message = ex.Message;
                if (ex.InnerException != null)
                {
                    message += "<br />" + ex.InnerException.Message;
                }

                var errorResult = new
                {
                    errorFlag     = true,
                    resultMessage = "Error: se ha producido un error al intentar efectuar una operación en la base de datos.<br />" +
                                    "El mensaje específico de error es: <br />" + message
                };

                return(Request.CreateResponse(HttpStatusCode.OK, errorResult));
            }
        }