Esempio n. 1
0
        public async Task <IActionResult> Generate(Guid?id, int month)
        {
            var prefix = _context.Sequences.SingleOrDefault(s => s.DocumentType == DocumentType.Invoice).Prefix;

            Invoice invoice = null;
            List <InvoiceDetail> details = new List <InvoiceDetail>();
            var enrollActivities         = await _context.EnrollActivity
                                           .Include(e => e.Enrollment.Kid.TutorPrincipal)
                                           .Include(e => e.Activity)
                                           .Include(e => e.Service)
                                           .Where(e => e.EnrollmentId != null &&
                                                  e.ServiceId != null && e.Enrollment.KidId == id).ToListAsync();

            if (enrollActivities != null)
            {
                var kid = await _context.Kid.FindAsync(id);

                decimal acumulativeAmount = 0;
                var     sequence          = _context.Sequences.SingleOrDefault(s => s.DocumentType == DocumentType.Invoice);
                foreach (var activity in enrollActivities)
                {
                    acumulativeAmount += activity.Service.Price;
                    var detail = new InvoiceDetail
                    {
                        Amount   = activity.Service.Price,
                        ItemId   = activity.ServiceId.Value,
                        Quantity = 1,
                        Id       = Guid.NewGuid(),
                        //InvoiceId = invoice.Id
                    };
                    details.Add(detail);
                }

                long nextSequence = sequence.StaringSequence > sequence.CurrentSequence ? sequence.StaringSequence : sequence.CurrentSequence + 1;

                invoice = new Invoice
                {
                    Sequence      = nextSequence,
                    Status        = InvoiceStatus.Generated,
                    GeneratedDate = DateTime.Now,
                    DueDate       = new DateTime(
                        DateTime.Now.Year,
                        month,
                        //DateTime.Now.Month,
                        DateTime.DaysInMonth(
                            DateTime.Now.Year,
                            month
                            )
                        ),
                    KidId          = id.Value,
                    Id             = Guid.NewGuid(),
                    InvoiceDetails = details
                };
                invoice.Document         = prefix + invoice.SequenceString;
                invoice.Price            = acumulativeAmount;
                sequence.CurrentSequence = nextSequence;
                _context.Invoices.Add(invoice);


                _context.SaveChanges();
            }

            return(RedirectToAction(nameof(Index), new { month = month }));
        }