// POST: rrhh/Descuento_Periodico/Delete/5
 public ActionResult Eliminar(int id)
 {
     using (DbContextTransaction tran = db.Database.BeginTransaction())
     {
         try
         {
             int id_usuario         = Cache.DiccionarioUsuariosLogueados[User.Identity.Name].usuario.id_usuario;
             Descuento_Periodico dp = db.Descuento_Periodico.Find(id);
             dp.activo                 = false;
             dp.eliminado              = true;
             dp.fecha_eliminacion      = DateTime.Now;
             dp.id_usuario_eliminacion = id_usuario;
             db.Entry(dp).State        = EntityState.Modified;
             foreach (var prestamo in db.Descuento.Where(d => d.id_descuento_periodico == id && d.activo && d.eliminado))
             {
                 prestamo.activo                 = false;
                 prestamo.eliminado              = true;
                 prestamo.fecha_eliminacion      = DateTime.Now;
                 prestamo.id_usuario_eliminacion = id_usuario;
             }
             db.SaveChanges();
             tran.Commit();
             return(RedirectToAction("Index"));
         }
         catch
         {
             tran.Rollback();
         }
     }
     return(Delete(id));
 }
 public ActionResult Edit(Descuento_Periodico descuento_Periodico, DateTime fecha_inicio_prestamo)
 {
     ModelState.Clear();
     descuento_Periodico.fecha_inicio = fecha_inicio_prestamo;
     if (ModelState.IsValid)
     {
         using (DbContextTransaction tran = db.Database.BeginTransaction())
         {
             try
             {
                 Descuento_Periodico dp = db.Descuento_Periodico.Find(descuento_Periodico.id_descuento_periodico);
                 dp.descripcion             = descuento_Periodico.descripcion;
                 dp.id_tipo_plan_pago       = descuento_Periodico.id_tipo_plan_pago;
                 dp.id_tipo_prestamo        = dp.id_tipo_prestamo;
                 dp.fecha_inicio            = descuento_Periodico.fecha_inicio;
                 dp.fecha_modificacion      = DateTime.Now;
                 dp.id_usuario_modificacion = Cache.DiccionarioUsuariosLogueados[User.Identity.Name].usuario.id_usuario;
                 db.Entry(dp).State         = EntityState.Modified;
                 db.SaveChanges();
                 tran.Commit();
                 return(RedirectToAction("Index"));
             }
             catch
             {
                 tran.Rollback();
                 ModelState.AddModelError("", "Error. Cambios no guardados.");
             }
         }
     }
     ViewBag.fecha_inicio_prestamo = fecha_inicio_prestamo.ToString("MM/yyyy");
     ViewBag.id_tipo_prestamo      = new SelectList(db.Tipo_Prestamo.Where(t => !t.eliminado).OrderBy(t => t.nombre), "id_tipo_prestamo", "nombre", descuento_Periodico.id_tipo_prestamo);
     ViewBag.id_tipo_plan_pago     = new SelectList(db.Tipo_Plan_Pago.Where(t => !t.eliminado).OrderBy(t => t.nombre), "id_tipo_plan_pago", "nombre", descuento_Periodico.id_tipo_plan_pago);
     return(View(descuento_Periodico));
 }
 public ActionResult Pagar_Cuota(int id_descuento)
 {
     using (DbContextTransaction tran = db.Database.BeginTransaction())
     {
         try
         {
             int       id_usuario = Cache.DiccionarioUsuariosLogueados[User.Identity.Name].usuario.id_usuario;
             Descuento descuento  = db.Descuento.Find(id_descuento);
             descuento.activo                  = false;
             descuento.fecha_modificacion      = DateTime.Now;
             descuento.id_usuario_modificacion = id_usuario;
             Descuento_Periodico dp = db.Descuento_Periodico.Find(descuento.id_descuento_periodico);
             dp.pagos_actuales++;
             dp.cantidad_pagado        += descuento.total;
             dp.fecha_modificacion      = DateTime.Now;
             dp.id_usuario_modificacion = id_usuario;
             db.Entry(dp).State         = EntityState.Modified;
             db.SaveChanges();
             tran.Commit();
             return(Json(new { msg = "", response = true }));
         }
         catch
         {
             tran.Rollback();
             return(Json(new { msg = "Ocurrio un error durante la operación. Cambios no guardados.", response = false }));
         }
     }
 }
 public Descuento_Periodico InicializarDescuentoPeriodico(Descuento_Periodico dp)
 {
     dp.activo              = true;
     dp.eliminado           = false;
     dp.cantidad_pagado     = 0;
     dp.pagos_actuales      = 0;
     dp.id_usuario_creacion = Cache.DiccionarioUsuariosLogueados[User.Identity.Name].usuario.id_usuario;
     dp.fecha_creacion      = DateTime.Now;
     return(dp);
 }
        public ActionResult Cuotas(int id, bool error)
        {
            var cuotas = db.Descuento.Where(d => d.id_descuento_periodico == id && !d.eliminado).OrderBy(d => d.fecha);

            ViewBag.cuotas = cuotas;
            Descuento_Periodico dp = db.Descuento_Periodico.Find(id);

            if (error)
            {
                ModelState.AddModelError("", "Ocurrio un error durante la operación. Cambios no guardados.");
            }
            return(View(dp));
        }
        // GET: rrhh/Descuento_Periodico/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Descuento_Periodico descuento_Periodico = db.Descuento_Periodico.Find(id);

            if (descuento_Periodico == null)
            {
                return(HttpNotFound());
            }
            return(View(descuento_Periodico));
        }
        public ActionResult Create(Descuento_Periodico descuento_Periodico, DateTime fecha_inicio_prestamo, string cantidad_a_pagar)
        {
            ModelState.Clear();
            if (fecha_inicio_prestamo == null)
            {
                ModelState.AddModelError("", "Ingrese la cantidad del préstamo.");
            }
            if (ModelState.IsValid)
            {
                using (DbContextTransaction tran = db.Database.BeginTransaction())
                {
                    try
                    {
                        descuento_Periodico.cantidad_a_pagar = Convert.ToDecimal(cantidad_a_pagar, CultureInfo.InvariantCulture);
                        descuento_Periodico = InicializarDescuentoPeriodico(descuento_Periodico);
                        descuento_Periodico.fecha_inicio = fecha_inicio_prestamo;
                        decimal cuota = (descuento_Periodico.cantidad_a_pagar / descuento_Periodico.total_pagos);
                        db.Descuento_Periodico.Add(descuento_Periodico);
                        db.SaveChanges();
                        DateTime fecha_fin = GenerarDescuentos(descuento_Periodico, cuota); //Genera los descuentos y envia la fecha final del prestamo
                        descuento_Periodico.fecha_fin       = fecha_fin;
                        db.Entry(descuento_Periodico).State = EntityState.Modified;
                        db.SaveChanges();
                        tran.Commit();
                        return(RedirectToAction("Index"));
                    }
                    catch
                    {
                        ModelState.AddModelError("", "Error. Cambios no guardados.");
                        tran.Rollback();
                    }
                }
            }
            ViewBag.id_tipo_prestamo      = new SelectList(db.Tipo_Prestamo.Where(t => !t.eliminado).OrderBy(t => t.nombre), "id_tipo_prestamo", "nombre", descuento_Periodico.id_tipo_prestamo);
            ViewBag.id_tipo_plan_pago     = new SelectList(db.Tipo_Plan_Pago.Where(t => !t.eliminado).OrderBy(t => t.nombre), "id_tipo_plan_pago", "nombre", descuento_Periodico.id_tipo_plan_pago);
            ViewBag.fecha_inicio_prestamo = fecha_inicio_prestamo.ToString("dd/MM/yyyy");
            Empleado empleado = db.Empleado.Find(descuento_Periodico.id_empleado);

            if (empleado != null)
            {
                ViewBag.id_empleado = descuento_Periodico.id_empleado;
                ViewBag.nombre      = empleado.primer_apellido + " " + empleado.segundo_apellido + ", " + empleado.primer_nombre + " " + empleado.segundo_nombre;
            }
            ViewBag.empleados = db.Empleado.Where(e => !e.eliminado && e.activo).ToList();
            return(View(descuento_Periodico));
        }
        // GET: rrhh/Descuento_Periodico/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Descuento_Periodico descuento_Periodico = db.Descuento_Periodico.Find(id);

            ViewBag.tipo_prestamo         = new SelectList(db.Tipo_Prestamo.Where(t => !t.eliminado), "id_tipo_prestamo", "nombre", descuento_Periodico.id_tipo_prestamo);
            ViewBag.tipos_pago            = new SelectList(db.Tipo_Plan_Pago.Where(t => !t.eliminado), "id_tipo_plan_pago", "nombre", descuento_Periodico.id_tipo_plan_pago);;
            ViewBag.fecha_inicio_prestamo = descuento_Periodico.fecha_inicio.ToString("MM/yyyy");
            if (descuento_Periodico == null)
            {
                return(HttpNotFound());
            }
            return(View(descuento_Periodico));
        }
        public ActionResult EditarCuota(string cantidad, DateTime fecha, int id_descuento_periodico, int id_descuento)
        {
            bool error = false;

            using (DbContextTransaction tran = db.Database.BeginTransaction())
            {
                try
                {
                    int       id_usuario      = Cache.DiccionarioUsuariosLogueados[User.Identity.Name].usuario.id_usuario;
                    Descuento descuento       = db.Descuento.Find(id_descuento);
                    decimal   cantidad_previa = descuento.total;
                    descuento.total = Convert.ToDecimal(cantidad, CultureInfo.InvariantCulture);
                    descuento.fecha = fecha;
                    descuento.fecha_modificacion      = DateTime.Now;
                    descuento.id_usuario_modificacion = id_usuario;
                    Descuento_Periodico dp = db.Descuento_Periodico.Find(id_descuento_periodico);
                    dp.fecha_modificacion      = DateTime.Now;
                    dp.id_usuario_modificacion = id_usuario;
                    if (cantidad_previa > descuento.total) //descuento.total ya tiene el nuevo total de la cuota
                    {
                        dp.cantidad_a_pagar -= (cantidad_previa - descuento.total);
                    }
                    else
                    {
                        dp.cantidad_a_pagar += (descuento.total - cantidad_previa);
                    }
                    db.Entry(dp).State = EntityState.Modified;
                    db.SaveChanges();
                    tran.Commit();
                }
                catch
                {
                    tran.Rollback();
                    error = true;
                }
            }
            return(RedirectToAction("Cuotas", new { id = id_descuento_periodico, error = error }));
        }
        public ActionResult AgregarCuota(int id_descuento_periodico, string fecha, string cantidad)
        {
            bool error = false;

            using (DbContextTransaction tran = db.Database.BeginTransaction())
            {
                try
                {
                    int id_usuario                = Cache.DiccionarioUsuariosLogueados[User.Identity.Name].usuario.id_usuario;
                    Descuento_Periodico dp        = db.Descuento_Periodico.Find(id_descuento_periodico);
                    Descuento           descuento = new Descuento();
                    descuento.total = Convert.ToDecimal(cantidad, CultureInfo.InvariantCulture);
                    descuento.fecha = DateTime.ParseExact(fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                    descuento.id_descuento_periodico = id_descuento_periodico;
                    descuento.activo              = true;
                    descuento.eliminado           = false;
                    descuento.fecha_creacion      = DateTime.Now;
                    descuento.id_usuario_creacion = id_usuario;
                    descuento.id_tipo_descuento   = 3; //Tipo: Prestamo (id=3)
                    dp.cantidad_a_pagar          += Convert.ToDecimal(cantidad, CultureInfo.InvariantCulture);
                    dp.total_pagos++;
                    db.Descuento.Add(descuento);
                    dp.fecha_modificacion      = DateTime.Now;
                    dp.id_usuario_modificacion = id_usuario;
                    db.Entry(dp).State         = EntityState.Modified;
                    db.SaveChanges();
                    tran.Commit();
                }
                catch
                {
                    tran.Rollback();
                    error = true;
                }
            }
            return(RedirectToAction("Cuotas", new { id = id_descuento_periodico, error = error }));
        }
        public DateTime GenerarDescuentos(Descuento_Periodico dp, decimal cuota)
        {
            DateTime fecha       = dp.fecha_inicio;
            int      total_pagos = dp.total_pagos;

            switch (dp.id_tipo_plan_pago)
            {
            case 1:                                                                    //Quincenal
                fecha = new DateTime(dp.fecha_inicio.Year, dp.fecha_inicio.Month, 15); //quincena;
                for (int i = 0; i < total_pagos; i++)
                {
                    fecha = new DateTime(fecha.Year, fecha.Month, 15);
                    GuardarDescuento(fecha, cuota, dp.id_descuento_periodico);
                    i++;
                    if (i < total_pagos)
                    {
                        fecha = new DateTime(fecha.Year, fecha.Month, DateTime.DaysInMonth(fecha.Year, fecha.Month));     //fin de mes
                        GuardarDescuento(fecha, cuota, dp.id_descuento_periodico);
                        fecha = fecha.AddMonths(1);
                    }
                }
                break;

            case 2:     //Mensual
                fecha = new DateTime(dp.fecha_inicio.Year, dp.fecha_inicio.Month, 1);
                for (int i = 0; i < total_pagos; i++)
                {
                    DateTime fecha_aux = new DateTime(fecha.Year, fecha.Month, DateTime.DaysInMonth(fecha.Year, fecha.Month));
                    GuardarDescuento(fecha_aux, cuota, dp.id_descuento_periodico);
                    fecha = fecha.AddMonths(1);
                }
                break;

            case 3:     //Bimensual
                fecha = new DateTime(dp.fecha_inicio.Year, dp.fecha_inicio.Month, 1);
                for (int i = 0; i < total_pagos; i++)
                {
                    DateTime fecha_aux = new DateTime(fecha.Year, fecha.Month, DateTime.DaysInMonth(fecha.Year, fecha.Month));
                    GuardarDescuento(fecha_aux, cuota, dp.id_descuento_periodico);
                    fecha = fecha.AddMonths(2);
                }
                break;

            case 4:     //Trimestral
                fecha = new DateTime(dp.fecha_inicio.Year, dp.fecha_inicio.Month, 1);
                for (int i = 0; i < total_pagos; i++)
                {
                    DateTime fecha_aux = new DateTime(fecha.Year, fecha.Month, DateTime.DaysInMonth(fecha.Year, fecha.Month));
                    GuardarDescuento(fecha_aux, cuota, dp.id_descuento_periodico);
                    fecha = fecha.AddMonths(3);
                }
                break;

            case 5:     //Anual
                fecha = new DateTime(dp.fecha_inicio.Year, dp.fecha_inicio.Month, 1);
                for (int i = 0; i < total_pagos; i++)
                {
                    DateTime fecha_aux = new DateTime(fecha.Year, fecha.Month, DateTime.DaysInMonth(fecha.Year, fecha.Month));
                    GuardarDescuento(fecha_aux, cuota, dp.id_descuento_periodico);
                    fecha = fecha.AddYears(1);
                }
                break;

            case 6:     //Semestral
                fecha = new DateTime(dp.fecha_inicio.Year, dp.fecha_inicio.Month, 1);
                for (int i = 0; i < total_pagos; i++)
                {
                    DateTime fecha_aux = new DateTime(fecha.Year, fecha.Month, DateTime.DaysInMonth(fecha.Year, fecha.Month));
                    GuardarDescuento(fecha_aux, cuota, dp.id_descuento_periodico);
                    fecha = fecha.AddMonths(6);
                }
                break;
            }
            return(fecha);
        }