public ActionResult Confirm(AbonoVM model)
        {
            bool exito = true;

            if (!(validations.IsValidReferenciaDeposito(model.Referencia, model.BancoId)))
            {
                //todo:Preguntar de esta validacion
                AddValidationMessage(enumMessageType.BRException, "La referencia especificada ya existe en el sistema. Favor de verificarla.");
                exito = false;
            }

            if (Convert.ToDateTime(model.FechaPago).CompareTo(DateTime.UtcNow.GetCurrentTime()) == 1)
            {
                AddValidationMessage(enumMessageType.BRException, "La fecha de depósito debe ser menor o igual a la fecha actual.");
                exito = false;
            }

            if (exito)
            {
                if (ModelState.IsValid)
                {
                    PaycenterBR payCenterBR = new PaycenterBR();
                    model.CuentaId=payCenterBR.GetOrCreateCuentaPayCenter(PayCenterId, model.TipoCuenta,model.ProveedorId);
                    Abono abono = new Abono
                    {
                        BancoId = model.BancoId,
                        CuentaBancariaId = model.CuentaBancariaId,
                        CuentaId = model.CuentaId,
                        Status = (Int16)enumEstatusMovimiento.Procesando,
                        FechaCreacion = DateTime.UtcNow.GetCurrentTime(),
                        FechaPago = (DateTime)model.FechaPago,
                        Monto = (Decimal)model.Monto,
                        PayCenterId = PayCenterId,
                        Referencia = model.Referencia,
                        RutaFichaDeposito = model.RutaFichaDeposito,
                        ProveedorId = (short)model.ProveedorId
                    };
                    repository.Add(abono);

                    EstadoCuentaBR estadoCuentaBR = new EstadoCuentaBR(repository.context);
                    var movimiento = estadoCuentaBR.CrearMovimiento(PayCenterId, enumTipoMovimiento.Abono, model.AbonoId, model.CuentaId, (Decimal)model.Monto, enumMotivo.Deposito, PayCenterName);
                    abono.Clave = movimiento.Clave;

                    exito = repository.Save();
                    //Julius: Tuve que guardar otra vez para guardar el abonoId generado en la BD
                    estadoCuentaBR.ActualizaReferenciaIdMovimiento(movimiento.MovimientoId, abono.AbonoId);
                    repository.Save();

                    model.AbonoId = abono.AbonoId;
                    AddValidationMessage(enumMessageType.Succeed, "Se ha registrado su depósito con éxito con clave " + movimiento.Clave + ". En breve será revisado y aplicado.");
                }
            }
            else
            {
                AddValidationMessage(enumMessageType.BRException, "No fue posible guardar el reporte de depósito.");
            }
            model.FechaCreacion = DateTime.UtcNow.GetCurrentTime();
            return View(model);
        }
        public ActionResult Report(ReporteDepositoVM model)
        {
            Succeed = true;
            if (PayCenterId <= 0)
            {
                //Preguntar de esta validación
                AddValidationMessage(enumMessageType.BRException, "No ha especificado un paycenter válido. Favor de especificarlo.");
                Succeed = false;
            }
            PayCentersRepository payCentersRepository = new PayCentersRepository();

            if (!(validations.IsValidReferenciaDeposito(model.Referencia, model.BancoId)))
            {
                //Preguntar de esta validación
                AddValidationMessage(enumMessageType.BRException,"La referencia especificada ya existe en el sistema. Favor de verificarla.");
                Succeed = false;
            }

            if (Convert.ToDateTime(model.FechaPago).CompareTo(DateTime.UtcNow.GetCurrentTime()) == 1)
            {
                AddValidationMessage(enumMessageType.BRException, "La fecha de depósito debe ser menor o igual a la fecha actual.");
                Succeed = false;
            }

            if (Succeed)
            {
                model.PayCenterName = PayCenterName;
                AbonoVM abonoVM = new AbonoVM();
                Mapper.Map(model, abonoVM);
                abonoVM.MontoString = ((decimal)model.Monto).ToString("C");
                abonoVM.Status = (Int16)enumEstatusMovimiento.Procesando;
                abonoVM.PayCenterId = PayCenterId;
                abonoVM.PayCenterName = PayCenterName;
                abonoVM.FechaCreacion = DateTime.UtcNow.GetCurrentTime();
                abonoVM.FechaPago = ((DateTime)model.FechaPago).GetCurrentTime();
                abonoVM.ProveedorId = model.ProveedorId;
                return View("Confirm", abonoVM);
            }
            else
            {
                //model.CuentasDeposito = GetProveedoresByTipoCuenta(PayCenterName);
                LlenarBancos_Cuentas();
                return View(model);
            }
        }
        /// <summary>
        /// LLena el AbonoVM
        /// </summary>
        /// <param name="id">AbonoId</param>
        /// <returns></returns>
        private AbonoVM FillAbonoVM(int id)
        {
            Abono abono = repository.LoadById(id);
            if (abono == null)
            {
                return null;
            }

            //Me aseguro de obtener el abono tal y como estaba en la BD y sin cambios
            repository.context.Refresh(System.Data.Objects.RefreshMode.StoreWins, abono);

            BancosRepository bancosRepository = new BancosRepository();
            var banco = bancosRepository.LoadById(abono.BancoId);

            //fill estatus movimientos
            int movimientoId = 0;
            var movimiento = abono.CuentaPayCenter.Movimientos.Where(x => x.CuentaId == abono.CuentaId && x.Motivo == enumMotivo.Deposito.GetHashCode() && x.PayCenterId == abono.PayCenterId && x.Id == abono.AbonoId).FirstOrDefault();
            if (movimiento != null)
            {
                movimientoId = movimiento.MovimientoId;
            }
            else
            {
                this.AddValidationMessage(enumMessageType.BRException, "No existe el movimiento para el depósito.");
            }
            //  var movimiento = estadoDeCuentaRepository.LoadById(movimientoId);
            AbonoVM abonoVM = new AbonoVM
            {
                AbonoId = id,
                Banco = banco.Nombre,
                CuentaBancaria = banco.CuentasBancarias.Where(x => x.CuentaId == abono.CuentaBancariaId).FirstOrDefault().NumeroCuenta,
                Status = abono.Status, //((enumEstatusMovimiento)abono.Status).ToString(),
                FechaCreacion = abono.FechaCreacion,
                FechaPago = abono.FechaPago,
                MontoString = abono.Monto.ToString("C"),
                PayCenterName = abono.PayCenter.UserName,
                Referencia = abono.Referencia,
                RutaFichaDeposito = abono.RutaFichaDeposito,
                TipoCuenta = (enumTipoCuenta)abono.CuentaPayCenter.TipoCuenta,
                HistorialEstatusVM = movimiento != null ? movimiento.Movimientos_Estatus.OrderByDescending(x => x.FechaCreacion).Select(x => new HistorialEstatusVM { Fecha = x.FechaCreacion.ToString(), Estatus = ((enumEstatusMovimiento)x.Status).ToString(), Comentarios = x.Comentarios, UserName = x.UserName }).ToList() : null,
                Clave = abono.Clave
            };
            return abonoVM;
        }
        public ViewResult Details(AbonoVM model)
        {
            //Aquí van las acciones del PayCenter y Staf para el depósito
            var id = model.AbonoId;
            var action = model.CambioEstatusVM.Estatus;
            string comentario = model.CambioEstatusVM.Comentario != null ? model.CambioEstatusVM.Comentario.TrimEnd() : null;
            Abono abono = repository.LoadById(id);

            if (id > 0)
            {
                var movimiento = abono.CuentaPayCenter.Movimientos.Where(x => x.Motivo == enumMotivo.Deposito.GetHashCode() && x.Id == abono.AbonoId).FirstOrDefault();

                //validar que exista el moviento y sino mandar mensaje de error
                if (movimiento != null)
                {
                    EstadoCuentaBR estadoCuentaBR = new EstadoCuentaBR(repository.context);
                    //Asigno valor default en caso de que entre en ningún case de switch
                    enumEstatusMovimiento nuevoEstatus = (enumEstatusMovimiento)movimiento.Status;
                    switch (action)
                    {
                        case "Cancelar":
                            nuevoEstatus = enumEstatusMovimiento.Cancelado;
                            break;
                        case "Aplicar":
                            nuevoEstatus = enumEstatusMovimiento.Aplicado;
                            break;
                        case "Rechazar":
                            nuevoEstatus = enumEstatusMovimiento.Rechazado;
                            break;
                    }
                    abono.Status = (Int16)nuevoEstatus;
                    movimiento = estadoCuentaBR.ActualizarMovimiento(movimiento.MovimientoId, nuevoEstatus, comentario);
                    this.Succeed = estadoCuentaBR.Succeed;
                    this.ValidationMessages = estadoCuentaBR.ValidationMessages;

                    if (Succeed)
                    {
                        Succeed = repository.Save();
                        if (Succeed)
                        {
                            ModelState.Clear();
                            AddValidationMessage(enumMessageType.Succeed, "El reporte de depósito ha sido " + nuevoEstatus.ToString() + " correctamente");
                            //return Details(id);
                        }
                        else
                        {
                            //TODO: implemtar código que traiga mensajes del repositorio
                        }
                    }
                }
                else
                {
                    this.AddValidationMessage(enumMessageType.BRException, "No se encontró el movimiento para el depósito.");
                }

            }
            else
            {
                this.AddValidationMessage(enumMessageType.BRException, "No existe el depósito.");
            }

            return Details(id);
        }