private void GenerateInvoice(Activity activity)
        {
            if (activity is null)
            {
                return;
            }

            List <Service> services = activity.ActivitiesServices.Select(s => s.Service).ToList();

            ServiceInvoice serviceInvoice = new ServiceInvoice
            {
                Client         = activity.Client,
                ClientId       = activity.ClientId,
                PaymentMethod  = PaymentMethod.None,
                State          = InvoiceState.Generated,
                IVA            = 0.19M,
                GenerationDate = DateTime.Now
            };

            services.ForEach(service => { serviceInvoice.AddDetail(service); });

            serviceInvoice.CalculateTotal();

            _serviceInvoicesRepository.Insert(serviceInvoice);
        }
Exemplo n.º 2
0
        public async Task <ActionResult <ServiceInvoiceViewModel> > PayServiceInvoice(int id,
                                                                                      [FromBody] PaymentModel paymentModel)
        {
            ServiceInvoice serviceInvoice = await _serviceInvoicesRepository.FindByIdAsync(id);

            if (serviceInvoice is null)
            {
                return(NotFound($"No existe ninguna factura de servicio con el código {id}."));
            }

            serviceInvoice.CalculateTotal();

            PaymentCreateRequest paymentCreateRequest = new PaymentCreateRequest
            {
                Token             = paymentModel.Token,
                PaymentMethodId   = paymentModel.PaymentMethodId,
                TransactionAmount = serviceInvoice.Total,
                Description       = $"Pay of service invoice {serviceInvoice.Id}",
                Installments      = 1,
                Payer             = new PaymentPayerRequest
                {
                    FirstName = serviceInvoice.Client.FirstName,
                    LastName  = serviceInvoice.Client.LastName,
                    Email     = paymentModel.Email
                }
            };

            Payment payment = await _paymentClient.CreateAsync(paymentCreateRequest);

            if (payment.Status == PaymentStatus.Rejected)
            {
                return(BadRequest("El pago no pudo ser procesado."));
            }

            serviceInvoice.State         = InvoiceState.Paid;
            serviceInvoice.PaymentDate   = DateTime.Now;
            serviceInvoice.PaymentMethod = PaymentMethod.CreditCard;

            serviceInvoice.PublishEvent(new PaidInvoice(serviceInvoice));
            _serviceInvoicesRepository.Update(serviceInvoice);

            try
            {
                await _unitWork.SaveAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ServiceInvoiceExists(id))
                {
                    return(NotFound(
                               $"Error de actualizacón. No existe ninguna factura de servicio con el código {id}."));
                }

                throw;
            }

            return(_mapper.Map <ServiceInvoiceViewModel>(serviceInvoice));
        }