public IActionResult Post([FromBody] CustomsFormDto form)
        {
            try
            {
                VerifyUser();

                var id = _service.CreateFromCustoms(form);

                var result = new ResultFormatter(ApiVersion, General.CREATED_STATUS_CODE, General.OK_MESSAGE).Ok();

                return(Created(string.Concat(Request.Path, "/", id), result));
            }
            catch (Exception e)
            {
                var result =
                    new ResultFormatter(ApiVersion, General.INTERNAL_ERROR_STATUS_CODE, e.Message)
                    .Fail();
                return(StatusCode(General.INTERNAL_ERROR_STATUS_CODE, result));
            }
        }
        public async Task <int> Create(GarmentBeacukai model, string username, int clientTimeZoneOffset = 7)
        {
            int Created = 0;

            using (var transaction = this.dbContext.Database.BeginTransaction())
            {
                try
                {
                    EntityExtension.FlagForCreate(model, username, USER_AGENT);

                    var lastPaymentBill = GeneratePaymentBillNo();

                    foreach (GarmentBeacukaiItem item in model.Items)
                    {
                        GarmentDeliveryOrder deliveryOrder = dbSetDeliveryOrder.Include(m => m.Items)
                                                             .ThenInclude(i => i.Details).FirstOrDefault(s => s.Id == item.GarmentDOId);
                        if (deliveryOrder != null)
                        {
                            if (model.BillNo == "" | model.BillNo == null)
                            {
                                deliveryOrder.BillNo = GenerateBillNo();
                            }
                            else
                            {
                                deliveryOrder.BillNo = model.BillNo;
                            }
                            deliveryOrder.PaymentBill = string.Concat(lastPaymentBill.format, (lastPaymentBill.counterId++).ToString("D3"));
                            //deliveryOrder.CustomsId = model.Id;
                            double qty = 0;
                            foreach (var deliveryOrderItem in deliveryOrder.Items)
                            {
                                foreach (var detail in deliveryOrderItem.Details)
                                {
                                    qty += detail.DOQuantity;
                                }
                            }
                            item.TotalAmount = Convert.ToDecimal(deliveryOrder.TotalAmount);
                            item.TotalQty    = qty;
                            EntityExtension.FlagForCreate(item, username, USER_AGENT);
                        }
                    }

                    this.dbSet.Add(model);
                    Created = await dbContext.SaveChangesAsync();

                    transaction.Commit();
                    foreach (GarmentBeacukaiItem item in model.Items)
                    {
                        GarmentDeliveryOrder deliveryOrder = dbSetDeliveryOrder.Include(m => m.Items)
                                                             .ThenInclude(i => i.Details).FirstOrDefault(s => s.Id == item.GarmentDOId);
                        if (deliveryOrder != null)
                        {
                            deliveryOrder.CustomsId = model.Id;
                        }
                    }
                    Created = await dbContext.SaveChangesAsync();

                    foreach (var item in model.Items)
                    {
                        var deliveryOrder = dbSetDeliveryOrder
                                            .Include(m => m.Items)
                                            .ThenInclude(i => i.Details)
                                            .FirstOrDefault(s => s.Id == item.GarmentDOId);

                        var deliveryOrderEPOIds  = deliveryOrder.Items.Select(s => s.EPOId);
                        var garmentExternalOrder = dbContext.GarmentExternalPurchaseOrders.Where(s => deliveryOrderEPOIds.Contains(s.Id));

                        if (deliveryOrder != null)
                        {
                            var dppAmount         = 0.0;
                            var currencyDPPAmount = 0.0;

                            if (deliveryOrder.DOCurrencyCode == "IDR")
                            {
                                dppAmount = deliveryOrder.TotalAmount;
                            }
                            else
                            {
                                currencyDPPAmount = deliveryOrder.TotalAmount;
                                dppAmount         = deliveryOrder.TotalAmount * deliveryOrder.DOCurrencyRate.GetValueOrDefault();
                            }

                            //var categories = deliveryOrder.Items.SelectMany(doItem => doItem.Details).Select(detail => detail.CodeRequirment);
                            var categories    = string.Join(',', garmentExternalOrder.Select(s => s.Category).ToList().GroupBy(s => s).Select(s => s.Key));
                            var paymentMethod = garmentExternalOrder.FirstOrDefault().PaymentType;
                            var productNames  = string.Join(", ", deliveryOrder.Items.SelectMany(doItem => doItem.Details).Select(doDetail => doDetail.ProductName).ToList());

                            await _garmentDebtBalanceService.CreateFromCustoms(new CustomsFormDto(0, string.Join("\n", categories), deliveryOrder.BillNo, deliveryOrder.PaymentBill, (int)deliveryOrder.Id, deliveryOrder.DONo, (int)model.SupplierId, model.SupplierCode, model.SupplierName, deliveryOrder.SupplierIsImport, (int)deliveryOrder.DOCurrencyId.GetValueOrDefault(), deliveryOrder.DOCurrencyCode, deliveryOrder.DOCurrencyRate.GetValueOrDefault(), productNames, deliveryOrder.ArrivalDate, dppAmount, currencyDPPAmount, paymentMethod));
                        }
                    }
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw new Exception(e.Message);
                }
            }

            return(Created);
        }