public ActionResult WithdrawReportFile(string ids, DateTime?date)
        {
            if (date == null)
            {
                date = DateTime.UtcNow;
            }

            var transactions = transactionDac.Get(ids).OrderBy(x => x.IssueDate);
            var FileName     = Path.Combine(Directory.GetCurrentDirectory(), "ReportSrc/withdrawreport.xlsx");

            SpreadsheetInfo.SetLicense("FREE-LIMITED-KEY");
            var workbook  = ExcelFile.Load(FileName, LoadOptions.XlsxDefault);
            var worksheet = workbook.Worksheets[0];

            worksheet.Cells[3, Col.A].SetValue($"ส่วนราชการ {CurrentSchoolData.sc_name}");
            worksheet.Cells[4, Col.B].SetValue($"บง.01/2563");
            worksheet.Cells[4, Col.F].SetValue(date.Value.ToString("d MMMM yyyy", CultureInfo.GetCultureInfo("th-TH")));
            worksheet.Cells[6, Col.B].SetValue($"ผู้อำนวยการ{CurrentSchoolData.sc_name}");
            var issuer = identityService.GetUser();

            worksheet.Cells[8, Col.B].SetValue($"ด้วยข้าพเจ้า {issuer.Name} ตำแหน่ง {issuer.Position}");
            worksheet.Cells[9, Col.A].SetValue($"{CurrentSchoolData.sc_name} ทำหน้าที่ หัวหน้างานการเงิน ขออนุมัติเบิก-จ่าย");
            var amount = (double)Math.Abs(transactions.Sum(t => t.Amount));

            worksheet.Cells[12, Col.A].SetValue(amount);
            worksheet.Cells[12, Col.C].SetValue($"({VatHelper.ThaiBaht(amount.ToString())})");
            worksheet.Cells[17, Col.D].SetValue($"({issuer.Name})");
            //TODO: school director
            worksheet.Cells[24, Col.E].SetValue("นายสุขสันต์ สอนนวล");
            worksheet.Cells[25, Col.E].SetValue($"ตำแหน่ง ผู้อำนวยการ{CurrentSchoolData.sc_name}");

            var tableRowIndex   = 11;
            var currentRowIndex = tableRowIndex;

            foreach (var item in transactions)
            {
                worksheet.Rows.InsertEmpty(currentRowIndex);
                var range = worksheet.Cells.GetSubrange($"A{currentRowIndex}", $"J{currentRowIndex}");
                range.Merged = false;
                range        = worksheet.Cells.GetSubrange($"B{currentRowIndex}", $"J{currentRowIndex}");
                range.Merged = true;
                worksheet.Rows[currentRowIndex].Style.Font = worksheet.Cells[0, 0].Style.Font;
                worksheet.Cells[currentRowIndex, Col.B].SetValue($"- {item.Title}");

                worksheet.Cells[currentRowIndex, Col.B].Style.WrapText = true;
                worksheet.Rows[currentRowIndex].AutoFit();

                currentRowIndex++;
            }

            var contentStream = new MemoryStream();

            worksheet.PrintOptions.PaperType = PaperType.A4;
            workbook.Save(contentStream, SaveOptions.PdfDefault);

            return(File(contentStream, "application/pdf", $"WithdrawReport-{date:yyyyMMdd}.pdf"));
        }
        public ActionResult VatCertificateFile(int id)
        {
            var transaction = transactionDac.GetWithPartner(id);
            var FileName    = Path.Combine(Directory.GetCurrentDirectory(), "ReportSrc/vatcertificate.xlsx");

            SpreadsheetInfo.SetLicense("FREE-LIMITED-KEY");
            var workbook  = ExcelFile.Load(FileName, LoadOptions.XlsxDefault);
            var worksheet = workbook.Worksheets[0];

            worksheet.Cells[2, Col.R].SetValue(1);
            worksheet.Cells[3, Col.R].SetValue(transaction.Id.ToString());
            worksheet.Cells[5, Col.D].SetValue(CurrentSchoolData.sc_name);
            worksheet.Cells[5, Col.R].SetValue(CurrentSchoolData.VatId);
            worksheet.Cells[7, Col.D].SetValue(CurrentSchoolData.Address);
            worksheet.Cells[11, Col.D].SetValue(transaction.Partner.Name);
            worksheet.Cells[13, Col.D].SetValue(transaction.Partner.Address);
            if (transaction.Partner.PartnerType == PartnerType.Person)
            {
                worksheet.Cells[10, Col.R].SetValue(transaction.Partner.VatNumber);
                worksheet.Cells[11, Col.R].SetValue(string.Empty);
                worksheet.Cells[17, Col.Q].SetValue("☑ (4) ภ.ง.ด.3");
            }
            else
            {
                worksheet.Cells[10, 17].SetValue(string.Empty);
                worksheet.Cells[11, 17].SetValue(transaction.Partner.VatNumber);
                worksheet.Cells[17, Col.Q].SetValue("☑ (7) ภ.ง.ด.53");
            }
            worksheet.Cells[42, Col.G].SetValue(transaction.ProductType);
            worksheet.Cells[42, Col.M].SetValue(transaction.IssueDate.ToString("d MMM yyyy", CultureInfo.CreateSpecificCulture("th-TH")));
            worksheet.Cells[42, Col.O].SetValue((double)(Math.Abs(transaction.Amount) - transaction.VatInclude.Value));
            worksheet.Cells[42, Col.Q].SetValue((double)transaction.VatInclude.Value);
            worksheet.Cells[48, Col.O].SetValue((double)(Math.Abs(transaction.Amount) - transaction.VatInclude.Value));
            worksheet.Cells[48, Col.Q].SetValue((double)transaction.VatInclude.Value);
            worksheet.Cells[50, Col.I].SetValue(VatHelper.ThaiBaht(transaction.VatInclude.ToString()));
            worksheet.Cells[58, Col.K].SetValue(transaction.IssueDate.ToString("d MMMM yyyy", CultureInfo.CreateSpecificCulture("th-TH")));
            worksheet.Cells[62, Col.M].SetValue(transaction.IssueDate.ToString("d MMMM yyyy", CultureInfo.CreateSpecificCulture("th-TH")));
            worksheet.Cells[64, Col.F].SetValue(transaction.Partner.Name);
            worksheet.Cells[66, Col.G].SetValue(VatHelper.ThaiBaht((Math.Abs(transaction.Amount) - transaction.VatInclude).ToString()));
            worksheet.Cells[67, Col.M].SetValue((double)(Math.Abs(transaction.Amount) - transaction.VatInclude.Value));

            var contentStream = new MemoryStream();

            worksheet.PrintOptions.PaperType = PaperType.A4;
            workbook.Save(contentStream, SaveOptions.PdfDefault);

            return(File(contentStream, "application/pdf", $"VatCertificate-{id}.pdf"));
        }
        public IActionResult Edit(int id, Transaction request)
        {
            var transaction = transactionDac.Get(id);

            transaction.IssueDate              = request.IssueDate;
            transaction.DuplicatePaymentType   = request.DuplicatePaymentType;
            transaction.DuplicatePaymentNumber = request.DuplicatePaymentNumber;
            transaction.DuplicatePaymentYear   = request.DuplicatePaymentYear;
            transaction.Title       = request.Title;
            transaction.Remark      = request.Remark;
            transaction.ProductType = request.ProductType;

            if (transaction.Amount < 0)
            {
                if (request.PartnerId.HasValue)
                {
                    var partner = partnerDac.Get(request.PartnerId.Value);
                    transaction.VatInclude = partner.PartnerType switch
                    {
                        PartnerType.Shop => VatHelper.GetShopVatFromFullAmount(request.Amount),
                        PartnerType.Person => VatHelper.GetPersonVatFromFullAmount(request.Amount),
                        _ => 0,
                    };
                }
                transaction.Amount = -Math.Abs(request.Amount);

                if (request.BudgetId == 0)
                {
                    request.DuplicatePaymentType   = null;
                    request.DuplicatePaymentNumber = null;
                    request.DuplicatePaymentYear   = null;
                    request.PaymentType            = null;
                    request.PartnerId = null;
                }
            }

            transactionDac.Update(transaction);
            CalculateBringForword(request.IssueDate, request.BudgetId);
            CalculateBringForword(request.IssueDate, 0);

            return(RedirectToAction(nameof(Index)));
        }
        public IActionResult CreatePayment(Transaction request, string trackVat, int DPYCount)
        {
            if (request.PartnerId.HasValue)
            {
                var partner = partnerDac.Get(request.PartnerId.Value);
                request.VatInclude = partner.PartnerType switch
                {
                    PartnerType.Shop => VatHelper.GetShopVatFromFullAmount(request.Amount),
                    PartnerType.Person => VatHelper.GetPersonVatFromFullAmount(request.Amount),
                    _ => 0,
                };
                var lastDuplicatePaymentNumber = transactionDac.GetLastDuplicatePaymentNumber(CurrentSchoolConfig.SchoolYear);
                var nextNumber = int.Parse(lastDuplicatePaymentNumber?.DuplicatePaymentNumber ?? "1") + (lastDuplicatePaymentNumber?.DuplicatePaymentCount ?? 0);
                request.DuplicatePaymentType   = partner.IsInternal ? "บค." : "บจ.";
                request.DuplicatePaymentNumber = nextNumber.ToString();
                request.DuplicatePaymentCount  = DPYCount < 1 ? 1 : DPYCount;
                request.DuplicatePaymentYear   = CurrentSchoolConfig.SchoolYear;
            }
            request.Amount   = -Math.Abs(request.Amount);
            request.SchoolId = CurrentSchoolData.sc_id;

            if (request.BudgetId == 0)
            {
                request.DuplicatePaymentType   = null;
                request.DuplicatePaymentNumber = null;
                request.DuplicatePaymentCount  = null;
                request.DuplicatePaymentYear   = null;
                request.PaymentType            = null;
                request.PartnerId = null;
            }

            transactionDac.InsertPayment(request);
            CalculateBringForword(request.IssueDate, request.BudgetId);
            CalculateBringForword(request.IssueDate, 0);

            return(RedirectToAction(nameof(Index)));
        }