Beispiel #1
0
        public void Pagos(ComplementoPago complementoPago)
        {
            if (complementoPago.Pagos != null)
            {
                var idsBorrar       = complementoPago.Pagos.Select(e => e.Id);
                var pagosAnteriores = _db.Pagos.Where(es => es.ComplementoPagoId == complementoPago.Id && !idsBorrar.Contains(es.Id)).ToList();

                _db.Pagos.RemoveRange(pagosAnteriores);
                _db.SaveChanges();

                foreach (var pago in complementoPago.Pagos.Except(pagosAnteriores))
                {
                    pago.ComplementoPagoId = complementoPago.Id;
                    pago.BancoOrdenante    = null;
                    pago.BancoBeneficiario = null;
                    pago.ComplementoPago   = null;

                    _db.Pagos.AddOrUpdate(pago);
                    try
                    {
                        _db.SaveChanges();
                    }
                    catch (System.Exception)
                    {
                    }
                }
            }
            else
            {
                var pagosAnteriores = _db.Pagos.Where(es => es.ComplementoPagoId == complementoPago.Id).ToList();

                _db.Pagos.RemoveRange(pagosAnteriores);
                _db.SaveChanges();
            }
        }
Beispiel #2
0
        // GET: ComplementosPago/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            ComplementoPago complementoPago = _db.ComplementosPago.Find(id);

            if (complementoPago == null)
            {
                return(HttpNotFound());
            }

            complementoPago.Pago = new Pago
            {
                FechaPago  = DateTime.Now,
                FormaPago  = c_FormaPago.TransferenciaElectronicaDeFondos,
                Moneda     = c_Moneda.MXN,
                TipoCambio = 1,
                Monto      = 0.0,
            };

            PopulaClientes(complementoPago.ReceptorId);
            PopulaBancos(ObtenerSucursal());
            PopulaCfdiRelacionado(complementoPago.CfdiRelacionadoId);

            return(View(complementoPago));
        }
Beispiel #3
0
        public void DocumentosRelacionados(ComplementoPago complementoPago)
        {
            //if (complementoPago.DocumentosRelacionados != null)
            //{
            //    foreach (var pago in complementoPago.Pagos)
            //    {
            //        var idsBorrar = complementoPago.DocumentosRelacionados.Select(e => e.Id);
            //        var documentosAnteriores = _db.DocumentosRelacionados.Where(es => es.PagoId == pago.Id && !idsBorrar.Contains(es.Id)).ToList();

            //        _db.DocumentosRelacionados.RemoveRange(documentosAnteriores);
            //        _db.SaveChanges();

            //        foreach (var documento in complementoPago.DocumentosRelacionados)
            //        {
            //            documento.PagoId = pago.Id;
            //            _db.DocumentosRelacionados.AddOrUpdate(documento);
            //        }

            //        _db.SaveChanges();
            //    }
            //}
            //else
            //{
            var documentosAnteriores = _db.DocumentosRelacionados.Where(es => es.Pago.ComplementoPagoId == complementoPago.Id).ToList();

            _db.DocumentosRelacionados.RemoveRange(documentosAnteriores);
            _db.SaveChanges();
            //}
        }
Beispiel #4
0
        public ActionResult Generar(ComplementoPago complementoPago)
        {
            PopulaClientes(complementoPago.ReceptorId);

            if (ModelState.IsValid)
            {
                try
                {
                    var sucursalId = ObtenerSucursal();

                    //Actualizacion Receptor

                    DateTime fechaDoc  = complementoPago.FechaDocumento;
                    var      horaHoy   = DateTime.Now;
                    var      fechaTime = new DateTime(fechaDoc.Year, fechaDoc.Month, fechaDoc.Day, horaHoy.Hour, horaHoy.Minute, horaHoy.Second);

                    var complementoPagoDb = _db.ComplementosPago.Find(complementoPago.Id);
                    complementoPagoDb.ReceptorId       = complementoPago.ReceptorId;
                    complementoPagoDb.FechaDocumento   = fechaTime;
                    _db.Entry(complementoPagoDb).State = EntityState.Modified;
                    _db.SaveChanges();

                    _pagosManager.GenerarComplementoPago(sucursalId, complementoPago.Id, "");
                    return(RedirectToAction("Index"));
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError("", ex.Message);
                }
            }
            return(View(complementoPago));
        }
Beispiel #5
0
        // GET: ComplementosPago/Create
        public ActionResult Create()
        {
            PopulaClientes();
            PopulaBancos(ObtenerSucursal());
            PopulaCfdiRelacionado();

            var complementoPago = new ComplementoPago
            {
                Generado       = false,
                Status         = Status.Activo,
                FechaDocumento = DateTime.Now,
                Mes            = (Meses)Enum.ToObject(typeof(Meses), DateTime.Now.Month),
                SucursalId     = ObtenerSucursal(),
                Version        = "1.0",
                Pago           = new Pago
                {
                    FechaPago  = DateTime.Now,
                    FormaPago  = c_FormaPago.TransferenciaElectronicaDeFondos,
                    Moneda     = c_Moneda.MXN,
                    TipoCambio = 1,
                    Monto      = 0.0,
                }
            };

            return(View(complementoPago));
        }
Beispiel #6
0
        public ActionResult DocumentosRelacionados(ComplementoPago complementoPago)
        {
            PopulaFacturas(complementoPago.ReceptorId);
            PopulaPagos(complementoPago.Id);

            ModelState.Remove("Receptor.Nombre");
            ModelState.Remove("Receptor.Pais");
            ModelState.Remove("Pago.DocumentoRelacionado.IdDocumento");

            complementoPago.Pago = null;

            if (ModelState.IsValid)
            {
                _acondicionarComplementosPagos.DocumentosRelacionados(complementoPago);

                if (complementoPago.DocumentosRelacionados != null)
                {
                    foreach (var pago in complementoPago.DocumentosRelacionados)
                    {
                        complementoPago.DocumentosRelacionados.ForEach(dr => dr.FacturaEmitida = null);
                        complementoPago.DocumentosRelacionados.ForEach(dr => dr.Pago           = null);
                        complementoPago.DocumentosRelacionados.ForEach(dr => _db.DocumentosRelacionados.Add(dr));
                    }
                }

                _db.SaveChanges();

                return(RedirectToAction("Index"));
            }

            return(View(complementoPago));
        }
Beispiel #7
0
        public ActionResult Edit(ComplementoPago complementoPago)
        {
            ModelState.Remove("Pago.FechaPago");
            ModelState.Remove("Pago.FormaPago");
            ModelState.Remove("Pago.Moneda");
            ModelState.Remove("Pago.TipoCambio");
            ModelState.Remove("Pago.Monto");
            ModelState.Remove("Pago.ArchivoFisico");
            ModelState.Remove("Pago.ComplementoPagoId");
            ModelState.Remove("Pago.SucursalId");

            PopulaClientes(complementoPago.ReceptorId);
            PopulaBancos(ObtenerSucursal());
            PopulaCfdiRelacionado(complementoPago.CfdiRelacionadoId);

            if (ModelState.IsValid)
            {
                _acondicionarComplementosPagos.Pagos(complementoPago);

                complementoPago.Pagos            = null;
                _db.Entry(complementoPago).State = EntityState.Modified;
                _db.SaveChanges();
                return(RedirectToAction("Index"));
            }
            return(View(complementoPago));
        }
Beispiel #8
0
        public ActionResult DeleteConfirmed(int id)
        {
            ComplementoPago complementoPago = _db.ComplementosPago.Find(id);

            _db.ComplementosPago.Remove(complementoPago);
            _db.SaveChanges();
            return(RedirectToAction("Index"));
        }
Beispiel #9
0
 public void CfdisRelacionados(ref FacturaDto facturaDto, ComplementoPago complementoPago)
 {
     if (complementoPago.CfdiRelacionadoId != null && complementoPago.TipoRelacion != null)
     {
         facturaDto.TipoRelacion      = complementoPago.TipoRelacion;
         facturaDto.CfdisRelacionados = new List <string> {
             complementoPago.CfdiRelacionado.Uuid
         };
     }
 }
Beispiel #10
0
 private void cmdBuscarFactura_Click(object sender, EventArgs e)
 {
     if (IsNumeric(txtCFDI.Text))
     {
         FacturaComplementoPago f  = new FacturaComplementoPago();
         ComplementoPago        cp = f.getFactura(Convert.ToDouble(txtCFDI.Text));
         cargarValores(cp);
     }
     else
     {
         MessageBox.Show("Por favor indique un folio de factura válido");
         txtCFDI.Text = string.Empty;
     }
 }
Beispiel #11
0
        public void CargaInicial(ref ComplementoPago complementoPago)
        {
            if (complementoPago.Pagos != null)
            {
                foreach (var pago in complementoPago.Pagos)
                {
                    pago.BancoOrdenante    = null;
                    pago.BancoBeneficiario = null;
                    pago.ComplementoPago   = null;
                }
            }

            complementoPago.Pago = null;
        }
Beispiel #12
0
        public ActionResult Generar(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            ComplementoPago complementoPago = _db.ComplementosPago.Find(id);

            if (complementoPago == null)
            {
                return(HttpNotFound());
            }
            PopulaClientes(complementoPago.ReceptorId);
            return(View(complementoPago));
        }
Beispiel #13
0
        public ActionResult Create(ComplementoPago complementoPago)
        {
            ModelState.Remove("Pago.FechaPago");
            ModelState.Remove("Pago.FormaPago");
            ModelState.Remove("Pago.Moneda");
            ModelState.Remove("Pago.TipoCambio");
            ModelState.Remove("Pago.Monto");
            ModelState.Remove("Pago.ArchivoFisico");
            ModelState.Remove("Pago.ComplementoPagoId");
            ModelState.Remove("Pago.SucursalId");
            ModelState.Remove("CfdiRelacionado.FacturaEmitidaId");

            PopulaClientes(complementoPago.ReceptorId);
            PopulaBancos(ObtenerSucursal());
            PopulaCfdiRelacionado(complementoPago.CfdiRelacionadoId);

            if (ModelState.IsValid)
            {
                _acondicionarComplementosPagos.CargaInicial(ref complementoPago);

                try
                {
                    var pagos = complementoPago.Pagos;
                    pagos.ForEach(p => p.ComplementoPago = null);

                    complementoPago.Pagos = null;
                    _db.ComplementosPago.Add(complementoPago);
                    _db.SaveChanges();

                    foreach (var pago in pagos)
                    {
                        pago.ComplementoPago   = null;
                        pago.ComplementoPagoId = complementoPago.Id;
                        _db.Pagos.Add(pago);
                    }
                    _db.SaveChanges();

                    return(RedirectToAction("DocumentosRelacionados", new { @id = complementoPago.Id }));
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError("", ex.Message);
                }
            }

            return(View(complementoPago));
        }
Beispiel #14
0
        // GET: ComplementosPago/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            ComplementoPago complementoPago = _db.ComplementosPago.Find(id);

            if (complementoPago == null)
            {
                return(HttpNotFound());
            }
            PopulaClientes(complementoPago.ReceptorId);
            PopulaBancos(ObtenerSucursal());
            PopulaCfdiRelacionado(complementoPago.CfdiRelacionadoId);
            PopulaCfdiRelacionado(complementoPago.CfdiRelacionadoId);

            return(View(complementoPago));
        }
Beispiel #15
0
        public String GenerarPdf(byte[] xml, ComplementoPago complementoPago)
        {
            try
            {
                var path = String.Format("C:/Infodextra/Temp/{0} - {1} - {2}.pdf", complementoPago.FacturaEmitida.Serie, complementoPago.FacturaEmitida.Folio, DateTime.Now.ToString("yyyyMMddHHmmssfff"));

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

                var pdf = _facturacionInfodextra.GenerarPdf(xml, complementoPago.Sucursal.Logo, null);
                _operacionesStreams.ByteArrayArchivo(pdf, path);
                return(path);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Beispiel #16
0
 private void cargarValores(ComplementoPago result)
 {
     txtFecha.Text    = result.FECHA.ToString();
     txtReceptor.Text = result.Receptor;
     txtFolio.Text    = result.Folio;
     txtSerie.Text    = result.Serie;
     // txtUsoCFDI.Text = result.Receptor.UsoCFDI;
     //txtSubtotal.Text = result.SubTotal.ToString();
     txtTotal.Text      = result.MONTO;
     lblMetodoPago.Text = result.metodoPago.Substring(0, 3);
     //txtIVA.Text = result.Impuestos.TotalImpuestosTrasladados.ToString();
     if (result.UUIDRELACIONADO != null)
     {
         txtUUID.Text = result.UUIDRELACIONADO;
         FacturaComplementoPago factura = new FacturaComplementoPago(oComprobante);
         List <ComplementoPago> cp      = factura.getPagos(txtUUID.Text.Trim());
         llenardetallePagos(cp);
     }
     //foreach(ComprobanteConcepto c in result.Conceptos)
     //{
     //    dgConceptos.Rows.Add(c.ClaveProdServ,c.Cantidad,c.ClaveUnidad,c.Unidad,c.Descripcion,c.ValorUnitario,c.Importe);
     //}
 }
Beispiel #17
0
        private void button2_Click(object sender, EventArgs e)
        {
            if (txtCFDI.Text.Trim() == string.Empty)
            {
                MessageBox.Show("Por favor indique un número de folio");
                return;
            }
            FacturaComplementoPago f  = new FacturaComplementoPago();
            ComplementoPago        cp = f.getFactura(Convert.ToDouble(txtCFDI.Text));

            if (cp == null)
            {
                MessageBox.Show("El folio " + txtCFDI.Text + " no existe o ya fue cobrada anteriormente");
                return;
            }
            if (txtReceptor.Text == string.Empty || txtReceptor.Text == cp.Receptor)
            {
                cargarValores(cp);
                if (existeFactura(cp.UUIDRELACIONADO))
                {
                    MessageBox.Show("La factura ya fue agregada a este pago");
                    return;
                }
                dgFacturas.Rows.Add(cp.UUIDRELACIONADO, cp.FECHA, cp.MONTO, cp.Serie, cp.Folio);
                decimal saldo = 0;
                foreach (DataGridViewRow r in dgFacturas.Rows)
                {
                    saldo += Convert.ToDecimal(r.Cells[2].Value.ToString());
                }
                lblSaldo.Text = saldo.ToString();
                txtCFDI.Text  = "";
            }
            else
            {
                MessageBox.Show("El RFC receptor no correponde con los proporcionados anteriormente");
            }
        }
Beispiel #18
0
        public ComplementoPagoDto GenerarComplemento(ComplementoPago complementoPago)
        {
            var complementoPagoDto = new ComplementoPagoDto
            {
                FechaDocumento = complementoPago.FechaDocumento,
                Sucursal       = new EmisorDto
                {
                    LugarExpedicion = complementoPago.Sucursal.CodigoPostal,
                    RazonSocial     = complementoPago.Sucursal.RazonSocial,
                    RegimenFiscal   = complementoPago.Sucursal.RegimenFiscal,
                    Rfc             = complementoPago.Sucursal.Rfc
                },
                Receptor = new ReceptorDto
                {
                    RazonSocial      = complementoPago.Receptor.RazonSocial,
                    ResidenciaFiscal = complementoPago.Receptor.Pais,
                    Rfc     = complementoPago.Receptor.Rfc,
                    UsoCfdi = c_UsoCFDI.PorDefinir
                }
            };

            if (complementoPago.Pagos != null)
            {
                complementoPagoDto.Pagos = new List <PagoDto>();
            }

            for (int i = 0; i < complementoPago.Pagos.Count; i++)
            {
                var pago = new PagoDto
                {
                    FechaPago = complementoPago.Pagos[i].FechaPago,
                    FormaPago = complementoPago.Pagos[i].FormaPago,
                    Moneda    = complementoPago.Pagos[i].Moneda,
                    Monto     = complementoPago.Pagos[i].Monto,
                    NombreBancoOrdenanteExtranjero = complementoPago.Pagos[i].NombreBancoOrdenanteExtranjero,
                    Notas           = complementoPago.Pagos[i].Notas,
                    NumeroOperacion = complementoPago.Pagos[i].NumeroOperacion,
                    TipoCambio      = complementoPago.Pagos[i].TipoCambio,

                    //SPEI
                    //TipoCadenaPago = complementoPago.Pagos[i].TipoCadenaPago,
                    //SelloPago = complementoPago.Pagos[i].SelloPago,
                    //CadenaPago = complementoPago.Pagos[i].CadenaPago,
                    //CertificadoPago = complementoPago.Pagos[i].CertificadoPago,
                };

                if (complementoPago.Pagos[i].BancoOrdenante != null)
                {
                    pago.RfcEmisorCuentaOrigen = complementoPago.Pagos[i].BancoOrdenante.Banco.Rfc;
                    pago.BancoEmisor           = complementoPago.Pagos[i].BancoOrdenante.Banco.RazonSocial;
                    pago.CuentaOrdenante       = complementoPago.Pagos[i].BancoOrdenante.NumeroCuenta;

                    if (!complementoPago.Pagos[i].BancoOrdenante.Banco.Nacional)
                    {
                        pago.NombreBancoOrdenanteExtranjero = complementoPago.Pagos[i].BancoOrdenante.Banco.RazonSocial;
                    }
                }

                if (complementoPago.Pagos[i].BancoBeneficiario != null)
                {
                    pago.RfcEmisorCuentaBeneficiario = complementoPago.Pagos[i].BancoBeneficiario.Banco.Rfc;
                    pago.BancoReceptor      = complementoPago.Pagos[i].BancoBeneficiario.Banco.RazonSocial;
                    pago.CuentaBeneficiario = complementoPago.Pagos[i].BancoBeneficiario.NumeroCuenta;
                }

                if (complementoPago.Pagos[i].DocumentosRelacionados != null)
                {
                    pago.DocumentosRelacionados = new List <DocumentoRelacionadoDto>();

                    for (int j = 0; j < complementoPago.Pagos[i].DocumentosRelacionados.Count; j++)
                    {
                        var documentoRelacionado = new DocumentoRelacionadoDto
                        {
                            Folio                = complementoPago.Pagos[i].DocumentosRelacionados[j].Folio,
                            IdDocumento          = complementoPago.Pagos[i].DocumentosRelacionados[j].IdDocumento,
                            ImportePagado        = complementoPago.Pagos[i].DocumentosRelacionados[j].ImportePagado,
                            ImporteSaldoAnterior = complementoPago.Pagos[i].DocumentosRelacionados[j].ImporteSaldoAnterior,
                            ImporteSaldoInsoluto = complementoPago.Pagos[i].DocumentosRelacionados[j].ImporteSaldoInsoluto,
                            MetodoPago           = complementoPago.Pagos[i].DocumentosRelacionados[j].MetodoPago,
                            Moneda               = complementoPago.Pagos[i].DocumentosRelacionados[j].Moneda,
                            NumeroParcialidad    = complementoPago.Pagos[i].DocumentosRelacionados[j].NumeroParcialidad,
                            Serie                = complementoPago.Pagos[i].DocumentosRelacionados[j].Serie,
                            TipoCambio           = complementoPago.Pagos[i].DocumentosRelacionados[j].TipoCambio
                        };

                        pago.DocumentosRelacionados.Add(documentoRelacionado);
                    }
                }

                foreach (var documentoRelacionado in pago.DocumentosRelacionados)
                {
                    if (documentoRelacionado.Moneda == pago.Moneda)
                    {
                        documentoRelacionado.TipoCambio = 1.0;
                    }
                }

                complementoPagoDto.Pagos.Add(pago);
            }

            return(complementoPagoDto);
        }
Beispiel #19
0
        public List <ComplementoPago> Importar(string path, int sucursalId, Meses mes, bool previsualizacion)
        {
            var errores          = new List <String>();
            var complementosPago = new List <ComplementoPago>();

            using (StreamReader archivo = File.OpenText(path))
            {
                try
                {
                    var csv = new CsvReader(archivo);

                    var registros = new List <List <String> >();
                    var sucursal  = _db.Sucursales.Find(sucursalId);

                    while (csv.Read())
                    {
                        var registro = new List <String>();
                        for (int i = 0; csv.TryGetField(i, out string value); i++)
                        {
                            registro.Add(value);
                        }
                        registros.Add(registro);
                    }

                    var pagos = new List <Pago>();

                    //var facturasEmitidas = _db.FacturasEmitidas.Where(fe => fe.EmisorId == sucursalId).ToList();
                    for (int i = 1; i < registros.Count(); i++)
                    {
                        try
                        {
                            var fechaPago      = Convert.ToDateTime(registros[i][0]);
                            var formaPago      = ParseEnum <c_FormaPago>(registros[i][1], i);
                            var monto          = Convert.ToDouble(registros[i][2]);
                            var moneda         = ParseEnum <c_Moneda>(registros[i][3], i);
                            var tipoCambioPago = Convert.ToDouble(registros[i][4]);
                            var tipoCambioDocumentoRelacionado = Convert.ToDouble(registros[i][5]);
                            var numeroOperacion = registros[i][6];
                            if (String.IsNullOrEmpty(numeroOperacion))
                            {
                                numeroOperacion = null;
                            }


                            var serie = registros[i][10];
                            var folio = registros[i][11];

                            var facturaEmitida = _db.FacturasEmitidas.FirstOrDefault(fe => fe.EmisorId == sucursalId && fe.Serie == serie && fe.Folio == folio);
                            if (facturaEmitida == null)
                            {
                                errores.Add(String.Format("La factura {0} - {1} no fue encontrada para el registro {2}", serie, folio, i));
                                continue;
                            }

                            //Se desorganizaron los numeros por que necesito el cliente para determinar el banco
                            var          nombreBancoOrdenante = registros[i][7];
                            BancoCliente bancoOrdenante       = null;
                            if (!String.IsNullOrEmpty(nombreBancoOrdenante))
                            {
                                bancoOrdenante = _db.BancosClientes.FirstOrDefault(b => b.Nombre == nombreBancoOrdenante && b.Cliente.SucursalId == sucursalId && b.ClienteId == facturaEmitida.ReceptorId);
                                if (bancoOrdenante == null)
                                {
                                    errores.Add(String.Format("El banco {0} no fue encontrado para el registro {1}", nombreBancoOrdenante, i));
                                    continue;
                                }
                            }

                            var           nombreBancoBeneficiario = registros[i][8];
                            BancoSucursal bancoBeneficiario       = null;
                            if (!String.IsNullOrEmpty(nombreBancoBeneficiario))
                            {
                                bancoBeneficiario = _db.BancosSucursales.FirstOrDefault(b => b.Nombre == nombreBancoBeneficiario && b.SucursalId == sucursalId);
                                if (bancoBeneficiario == null)
                                {
                                    errores.Add(String.Format("El banco {0} no fue encontrado para el registro {1}", nombreBancoBeneficiario, i));
                                    continue;
                                }
                            }

                            var numeroParcialidad = registros[i][9];


                            var importePagado        = String.IsNullOrEmpty(registros[i][12]) ? facturaEmitida.Total : Convert.ToDouble(registros[i][12]);
                            var importeSaldoAnterior = String.IsNullOrEmpty(registros[i][13]) ? facturaEmitida.Total : Convert.ToDouble(registros[i][13]);
                            var importeSaldoInsoluto = String.IsNullOrEmpty(registros[i][14]) ? 0.0 : Convert.ToDouble(registros[i][14]);

                            #region Pagos

                            #region Documentos Relacionados

                            var documentoRelacionado = new DocumentoRelacionado
                            {
                                FacturaEmitidaId     = facturaEmitida.Id,
                                FacturaEmitida       = facturaEmitida,
                                Folio                = facturaEmitida.Folio,
                                IdDocumento          = facturaEmitida.Uuid,
                                ImportePagado        = importePagado,
                                ImporteSaldoAnterior = importeSaldoAnterior,
                                ImporteSaldoInsoluto = importeSaldoInsoluto,
                                MetodoPago           = facturaEmitida.MetodoPago,
                                Moneda               = facturaEmitida.Moneda,
                                NumeroParcialidad    = Convert.ToInt32(String.IsNullOrEmpty(numeroParcialidad) ? "1" : numeroParcialidad),
                                Serie                = facturaEmitida.Serie,
                                TipoCambio           = tipoCambioDocumentoRelacionado
                            };

                            #endregion

                            if (pagos.Any(p => p.NumeroOperacion == numeroOperacion && p.FechaPago == fechaPago && p.Monto == monto && p.DocumentosRelacionados.Any(dr => dr.FacturaEmitida.ReceptorId == documentoRelacionado.FacturaEmitida.ReceptorId)))
                            {
                                pagos.First(p => p.NumeroOperacion == numeroOperacion && p.FechaPago == fechaPago && p.Monto == monto && p.DocumentosRelacionados.Any(dr => dr.FacturaEmitida.ReceptorId == documentoRelacionado.FacturaEmitida.ReceptorId)).DocumentosRelacionados.Add(documentoRelacionado);
                            }
                            else
                            {
                                var pago = new Pago
                                {
                                    FechaPago       = fechaPago,
                                    FormaPago       = formaPago,
                                    Moneda          = moneda,
                                    Monto           = monto,
                                    NumeroOperacion = numeroOperacion,
                                    SucursalId      = sucursalId,
                                    TipoCambio      = tipoCambioPago
                                };

                                if (bancoOrdenante != null)
                                {
                                    pago.BancoOrdenante   = bancoOrdenante;
                                    pago.BancoOrdenanteId = bancoOrdenante.Id;
                                }

                                if (bancoBeneficiario != null)
                                {
                                    pago.BancoBeneficiario   = bancoBeneficiario;
                                    pago.BancoBeneficiarioId = bancoBeneficiario.Id;
                                }

                                if (pago.DocumentosRelacionados == null)
                                {
                                    pago.DocumentosRelacionados = new List <DocumentoRelacionado>();
                                }

                                pago.DocumentosRelacionados.Add(documentoRelacionado);

                                pagos.Add(pago);
                            }


                            #endregion
                        }
                        catch (Exception ex)
                        {
                            errores.Add(String.Format("No se pudo procesar el registro {0} el motivo reportado: {1} </br>", i, ex.Message));
                            continue;
                        }
                    }

                    foreach (var pago in pagos)
                    {
                        var receptor = pago.DocumentosRelacionados.FirstOrDefault().FacturaEmitida.Receptor;
                        if (receptor == null)
                        {
                            errores.Add(String.Format("El pago {0} no tiene documentos relacionados", pago.Desplegado));
                        }

                        var complementoPago = complementosPago.FirstOrDefault(cp => cp.ReceptorId == receptor.Id);
                        if (complementoPago == null)
                        {
                            complementoPago = new ComplementoPago
                            {
                                FechaDocumento = DateTime.Now,
                                Generado       = false,
                                ReceptorId     = receptor.Id,
                                Receptor       = receptor,
                                Status         = Status.Activo,
                                Mes            = mes,
                                SucursalId     = sucursal.Id,
                                Sucursal       = sucursal,
                                Version        = "1.0",
                                Pagos          = new List <Pago> {
                                    pago
                                }
                            };
                            complementosPago.Add(complementoPago);
                        }
                        else
                        {
                            complementoPago.Pagos.Add(pago);
                        }
                    }
                }
                catch (Exception ex)
                {
                    errores.Add(ex.Message);
                }
                finally
                {
                    archivo.Close();
                    archivo.Dispose();
                }
            }

            if (errores.Count > 0)
            {
                throw new Exception(String.Join("|", errores));
            }

            if (!previsualizacion)
            {
                foreach (var complementoPago in complementosPago)
                {
                    _db.ComplementosPago.Add(complementoPago);
                    try
                    {
                        _db.SaveChanges();
                    }
                    catch (DbEntityValidationException dbEx)
                    {
                        foreach (var validationErrors in dbEx.EntityValidationErrors)
                        {
                            foreach (var validationError in validationErrors.ValidationErrors)
                            {
                                errores.Add(String.Format("Propiedad: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage));
                            }
                        }
                    }
                }

                //foreach (var complementoPago in complementosPago)
                //{
                //    try
                //    {
                //        _pagosManager.GenerarComplementoPago(sucursalId, complementoPago.ReceptorId, complementoPago.Id);
                //        errores.Add(String.Format("Comando realizado con éxito del complemento del receptor {0} con total de montos {1:c}", complementoPago.Receptor.RazonSocial, complementoPago.Pagos.Sum(p => p.Monto)));
                //    }
                //    catch (Exception ex)
                //    {
                //        errores.Add(String.Format("Error de generación del complemento del receptor {0} con total de montos {1:c}: {2}", complementoPago.Receptor.RazonSocial, complementoPago.Pagos.Sum(p => p.Monto), ex.Message));
                //    }

                //}
            }

            return(complementosPago);
        }