public IActionResult GetReport([FromQuery(Name = "from")] string from, [FromQuery(Name = "to")] string to)
        {
            //add some validation
            DateTime       fromDate = DateTime.Parse(from);
            DateTime       toDate   = DateTime.Parse(to);
            SalesReportDto report   = _mangementService.GetSalesReport(fromDate, toDate);

            if (report == null)
            {
                return(BadRequest("system error report couldnt be generated"));
            }

            return(Ok(report));
        }
        public SalesReportDto GetSalesReport(DateTime from, DateTime to)
        {
            SalesReportDto report = new SalesReportDto
            {
                From              = from.ToString(),
                To                = to.ToString(),
                CashAmount        = 0.00m,
                EftposAmount      = 0.00m,
                AfterPayAmount    = 0.00m,
                StoreCreditAmount = 0.00m,
                TotalRefunds      = 0.00m,
                TotalAmount       = 0.00m,
                NetTotal          = 0.00m,
            };

            var invoices = _saleRepo.GetInvoicePayments(from, to);

            if (invoices == null || invoices.Count() == 0)
            {
                return(report);
            }

            //   IEnumerable<IGrouping<int, int>> payments = invoices.SelectMany(si => si.Payments)
            //                       .GroupBy(p => p.PaymentMethodId, p => p.Amount);
            var payments = invoices.SelectMany(si => si.Payments).ToList();

            var cash        = payments.Where(p => p.PaymentMethodId == 1).Sum(p => p.Amount);
            var eftpos      = payments.Where(p => p.PaymentMethodId == 2).Sum(p => p.Amount);
            var afterPay    = payments.Where(p => p.PaymentMethodId == 3).Sum(p => p.Amount);
            var storeCredit = payments.Where(p => p.PaymentMethodId == 4).Sum(p => p.Amount);
            var refund      = invoices.SelectMany(i => i.Refunds).Sum(r => r.Amount);

            report.CashAmount        = ToDecimal2dp(cash);
            report.EftposAmount      = ToDecimal2dp(eftpos);
            report.AfterPayAmount    = ToDecimal2dp(afterPay);
            report.StoreCreditAmount = ToDecimal2dp(storeCredit);
            report.TotalRefunds      = ToDecimal2dp(refund);

            report.TotalAmount = Decimal.Round((report.CashAmount + report.EftposAmount + report.AfterPayAmount), 2);
            report.NetTotal    = Decimal.Round((report.TotalAmount - report.TotalRefunds), 2);

            return(report);
        }