Example #1
0
        /// <summary>
        /// Con esta capacidad puedes generar el interes de los prestamos que cumplen 1 mes
        /// </summary>
        public int GenerarInteresPrestamo()
        {
            using (var scope = new TransactionScope())
            {
                //levanta los prestamos activos
                var prestamosActivos = _unitOfWork.PrestamoRepository.GetMany(n => n.ESTADO == "AC");

                if (prestamosActivos == null)
                {
                    throw new ApplicationException("No se encontraron prestamos activos");
                }
                var cantidadInteresesGenerados = 0;
                //itera entre los prestamos
                foreach (var prestamo in prestamosActivos)
                {
                    //buscar ultimo interes calculado de cada prestamo
                    var detallePrestamo = prestamo.DETALLE_PRESTAMO.Where(n => n.TIPO_MOVIMIENTO_ID == 2).Max(n => n.FECHA);

                    var fechaUltimoCalculoInteres = detallePrestamo;

                    var aplicaCalculoInteres = (DateTime.Now.Subtract(fechaUltimoCalculoInteres).Days / (365.25 / 12)) > 0;

                    if (aplicaCalculoInteres)
                    {
                        //busco la deuda del prestamo a calcular interes
                        var deudaPrestamo = BuscarDeudaPorPrestamoId(prestamo.PRESTAMO_ID);

                        //Busca tasa del prestamo
                        var tasaPrestamo = BuscarTasaPorPrestamoId(prestamo.PRESTAMO_ID);

                        //Calcula el interes del prestamo
                        var interes = deudaPrestamo * tasaPrestamo;

                        //registra el interes
                        var nuevoDetallePrestamo = new DETALLE_PRESTAMO
                        {
                            PRESTAMO_ID        = prestamo.PRESTAMO_ID,
                            FECHA              = DateTime.Now,
                            COMENTARIO         = "Interes",
                            MOVIMIENTO         = interes,
                            TIPO_MOVIMIENTO_ID = 2
                        };

                        _unitOfWork.DetallePrestamoRepository.Insert(nuevoDetallePrestamo);
                        cantidadInteresesGenerados = cantidadInteresesGenerados + 1;
                    }
                }
                _unitOfWork.Save();
                scope.Complete();
                return(cantidadInteresesGenerados);
            }
        }
Example #2
0
        public int RealizarPago(RealizarPagoInputType realizarPagoDto)
        {
            //----------------------------------------REGLAS DE INTEGRIDAD----------------------------------------
            if (realizarPagoDto.Monto <= 0)
            {
                throw new ApplicationException("El monto a pagar debe ser mayor a cero");
            }
            if (realizarPagoDto.ClienteId <= 0)
            {
                throw new ApplicationException("El id del cliente debe ser mayor a cero");
            }
            //cuando la deuda sea mayor
            var deudaTotal = _prestamoService.CalcularDeudaPorClienteId(realizarPagoDto.ClienteId);

            if (deudaTotal < realizarPagoDto.Monto)
            {
                throw new ApplicationException("El pago supera la deuda : " + deudaTotal + " pesos");
            }
            //cliente no existe
            var cliente = _clienteService.BuscarClientePorId(realizarPagoDto.ClienteId);

            if (cliente == null)
            {
                throw new ApplicationException("Cliente no existe");
            }

            //----------------------------------------REGLAS DE NEGOCIO----------------------------------------
            using (var scope = new TransactionScope())
            {
                //inserto la cabecera del pago
                var pago = new PAGO
                {
                    CLIENTE_ID = realizarPagoDto.ClienteId,
                    FECHA      = DateTime.Now,
                    MONTO      = realizarPagoDto.Monto
                };

                _unitOfWork.PagoRepository.Insert(pago);

                var prestamosActivosOrdenadOrderByFecha = _unitOfWork.PrestamoRepository.GetMany(n => n.ESTADO == "AC").OrderBy(n => n.FECHA_PRESTAMO).ThenBy(n => n.TASA_INTERES);

                //cuando la deuda sea igual a lo que se esta pagando
                if (deudaTotal == realizarPagoDto.Monto)
                {
                    foreach (var obj in prestamosActivosOrdenadOrderByFecha)
                    {
                        var buscarDeudaPorPrestamoId = _prestamoService.BuscarDeudaPorPrestamoId(obj.PRESTAMO_ID);

                        //inserto un detalle pago por cada detalle prestamo
                        var detallePago = new DETALLE_PAGO
                        {
                            MONTO         = buscarDeudaPorPrestamoId,
                            PAGO_ID       = pago.PAGO_ID,
                            PRESTAMO_ID   = obj.PRESTAMO_ID,
                            TASA_EFECTIVA = _prestamoService.BuscarTasaPorPrestamoId(obj.PRESTAMO_ID),
                        };
                        _unitOfWork.DetallePagoRepository.Insert(detallePago);

                        //inserto un detalle prestamo por cada detalle pago
                        var detallePrestamo = new DETALLE_PRESTAMO
                        {
                            DETALLE_PAGO_ID = detallePago.DETALLE_PAGO_ID,
                            PRESTAMO_ID     = obj.PRESTAMO_ID,
                            COMENTARIO      = realizarPagoDto.Comentario + " PAGO " + realizarPagoDto.Monto +
                                              " dividido entre  " + prestamosActivosOrdenadOrderByFecha.Count() + "prestamos",
                            FECHA              = DateTime.Now,
                            MOVIMIENTO         = buscarDeudaPorPrestamoId * -1,
                            TIPO_MOVIMIENTO_ID = 3
                        };
                        _unitOfWork.DetallePrestamoRepository.Insert(detallePrestamo);

                        //aqui marco el prestamo como finalizado
                        _prestamoService.FinalizarPrestamoPrestamo(obj.PRESTAMO_ID);

                        _unitOfWork.Save();
                    }


                    scope.Complete();

                    return(pago.PAGO_ID);
                }

                //cuando la deuda total es mayor al pago
                if (deudaTotal > realizarPagoDto.Monto)
                {
                    var balancePago = realizarPagoDto.Monto;

                    //itero entre todos los prestamos a pagar
                    foreach (var obj in prestamosActivosOrdenadOrderByFecha)
                    {
                        var balancePrestamo = _prestamoService.BuscarDeudaPorPrestamoId(obj.PRESTAMO_ID);

                        if (balancePago < balancePrestamo)
                        {
                            //inserto un detalle pago por cada detalle prestamo
                            var detallePago = new DETALLE_PAGO
                            {
                                MONTO         = balancePago,
                                PAGO_ID       = pago.PAGO_ID,
                                PRESTAMO_ID   = obj.PRESTAMO_ID,
                                TASA_EFECTIVA = _prestamoService.BuscarTasaPorPrestamoId(obj.PRESTAMO_ID),
                            };
                            _unitOfWork.DetallePagoRepository.Insert(detallePago);

                            //inserto un detalle prestamo por cada detalle pago
                            var detallePrestamo = new DETALLE_PRESTAMO
                            {
                                DETALLE_PAGO_ID    = detallePago.DETALLE_PAGO_ID,
                                PRESTAMO_ID        = obj.PRESTAMO_ID,
                                COMENTARIO         = realizarPagoDto.Comentario,
                                FECHA              = DateTime.Now,
                                MOVIMIENTO         = balancePago * -1,
                                TIPO_MOVIMIENTO_ID = 3
                            };
                            _unitOfWork.DetallePrestamoRepository.Insert(detallePrestamo);

                            _unitOfWork.Save();
                            scope.Complete();
                            return(pago.PAGO_ID);
                        }

                        if (balancePago > balancePrestamo)
                        {
                            var buscarDeudaPorPrestamoId =
                                _prestamoService.BuscarDeudaPorPrestamoId(obj.PRESTAMO_ID);

                            //inserto un detalle pago por cada detalle prestamo
                            var detallePago = new DETALLE_PAGO
                            {
                                MONTO         = buscarDeudaPorPrestamoId,
                                PAGO_ID       = pago.PAGO_ID,
                                PRESTAMO_ID   = obj.PRESTAMO_ID,
                                TASA_EFECTIVA = _prestamoService.BuscarTasaPorPrestamoId(obj.PRESTAMO_ID),
                            };
                            _unitOfWork.DetallePagoRepository.Insert(detallePago);

                            //inserto un detalle prestamo por cada detalle pago
                            var detallePrestamo = new DETALLE_PRESTAMO
                            {
                                DETALLE_PAGO_ID    = detallePago.DETALLE_PAGO_ID,
                                PRESTAMO_ID        = obj.PRESTAMO_ID,
                                COMENTARIO         = realizarPagoDto.Comentario,
                                FECHA              = DateTime.Now,
                                MOVIMIENTO         = buscarDeudaPorPrestamoId * -1,
                                TIPO_MOVIMIENTO_ID = 3
                            };
                            _unitOfWork.DetallePrestamoRepository.Insert(detallePrestamo);

                            //aqui marco el prestamo como finalizado
                            _prestamoService.FinalizarPrestamoPrestamo(obj.PRESTAMO_ID);

                            balancePago = balancePago - balancePrestamo;
                            _unitOfWork.Save();
                        }

                        if (balancePago == balancePrestamo)
                        {
                            var buscarDeudaPorPrestamoId =
                                _prestamoService.BuscarDeudaPorPrestamoId(obj.PRESTAMO_ID);

                            //inserto un detalle pago por cada detalle prestamo
                            var detallePago = new DETALLE_PAGO
                            {
                                MONTO         = buscarDeudaPorPrestamoId,
                                PAGO_ID       = pago.PAGO_ID,
                                PRESTAMO_ID   = obj.PRESTAMO_ID,
                                TASA_EFECTIVA = _prestamoService.BuscarTasaPorPrestamoId(obj.PRESTAMO_ID),
                            };
                            _unitOfWork.DetallePagoRepository.Insert(detallePago);

                            //inserto un detalle prestamo por cada detalle pago
                            var detallePrestamo = new DETALLE_PRESTAMO
                            {
                                DETALLE_PAGO_ID    = detallePago.DETALLE_PAGO_ID,
                                PRESTAMO_ID        = obj.PRESTAMO_ID,
                                COMENTARIO         = realizarPagoDto.Comentario,
                                FECHA              = DateTime.Now,
                                MOVIMIENTO         = buscarDeudaPorPrestamoId * -1,
                                TIPO_MOVIMIENTO_ID = 3
                            };
                            _unitOfWork.DetallePrestamoRepository.Insert(detallePrestamo);

                            //aqui marco el prestamo como finalizado
                            _prestamoService.FinalizarPrestamoPrestamo(obj.PRESTAMO_ID);

                            _unitOfWork.Save();
                            scope.Complete();
                            return(pago.PAGO_ID);
                        }
                    }

                    _unitOfWork.Save();
                    scope.Complete();
                    return(pago.PAGO_ID);
                }
            }

            throw new Exception();
        }