public HttpResponseMessage Post([FromBody] RealizarPagoInputType realizarPagoInputType) { try { var obj = _pagoService.RealizarPago(realizarPagoInputType); return(Request.CreateResponse(HttpStatusCode.OK, obj)); } catch (ApplicationException ex) { return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message)); } }
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(); }