private async Task <int> AddFulfillmentAsync(DeliveryOrder model, string username)
        {
            var internalPOFacade = serviceProvider.GetService <InternalPurchaseOrderFacade>();
            int count            = 0;

            foreach (var item in model.Items)
            {
                foreach (var detail in item.Details)
                {
                    var fulfillment = new InternalPurchaseOrderFulFillment()
                    {
                        DeliveryOrderDate = model.ArrivalDate,
                        DeliveryOrderDeliveredQuantity = detail.DOQuantity,
                        DeliveryOrderDetailId          = detail.Id,
                        DeliveryOrderId     = model.Id,
                        DeliveryOrderItemId = item.Id,
                        DeliveryOrderNo     = model.DONo,
                        SupplierDODate      = model.DODate,
                        POItemId            = detail.POItemId
                    };


                    count += await internalPOFacade.CreateFulfillmentAsync(fulfillment, username);
                }
            }
            return(count);
        }
        private async Task <int> EditFulfillmentAsync(DeliveryOrder model, string username)
        {
            int count            = 0;
            var internalPOFacade = serviceProvider.GetService <InternalPurchaseOrderFacade>();
            var dbFulfillments   = dbContext.InternalPurchaseOrderFulfillments.AsNoTracking().Where(x => x.DeliveryOrderId == model.Id);
            var localFulfilments = model.Items.SelectMany(x => x.Details);

            var addedFulfillments   = localFulfilments.Where(x => !dbFulfillments.Any(y => y.DeliveryOrderItemId == x.DOItemId && y.DeliveryOrderDetailId == x.Id && y.POItemId == x.POItemId));
            var updatedFulfillments = localFulfilments.Where(x => dbFulfillments.Any(y => y.DeliveryOrderItemId == x.DOItemId && y.DeliveryOrderDetailId == x.Id && y.POItemId == x.POItemId));
            var deletedFulfillments = dbFulfillments.Where(x => !localFulfilments.Any(y => y.DOItemId == x.DeliveryOrderItemId && y.Id == x.DeliveryOrderDetailId && y.POItemId == x.POItemId));

            foreach (var item in updatedFulfillments)
            {
                var dbItem = dbContext.InternalPurchaseOrderFulfillments.AsNoTracking()
                             .FirstOrDefault(x => x.DeliveryOrderId == model.Id && x.DeliveryOrderItemId == item.DOItemId && x.DeliveryOrderDetailId == item.Id && item.POItemId == x.POItemId);

                dbItem.DeliveryOrderDate = model.ArrivalDate;
                dbItem.SupplierDODate    = model.DODate;
                dbItem.DeliveryOrderDeliveredQuantity = item.DOQuantity;
                dbItem.DeliveryOrderNo = model.DONo;
                dbItem.POItemId        = item.POItemId;

                count += await internalPOFacade.UpdateFulfillmentAsync(dbItem.Id, dbItem, username);
            }

            foreach (var item in addedFulfillments)
            {
                var fulfillment = new InternalPurchaseOrderFulFillment()
                {
                    DeliveryOrderDate = model.ArrivalDate,
                    DeliveryOrderDeliveredQuantity = item.DOQuantity,
                    DeliveryOrderDetailId          = item.Id,
                    DeliveryOrderId     = model.Id,
                    DeliveryOrderItemId = item.DOItemId,
                    DeliveryOrderNo     = model.DONo,
                    SupplierDODate      = model.DODate,
                    POItemId            = item.POItemId
                };

                count += await internalPOFacade.CreateFulfillmentAsync(fulfillment, username);
            }

            foreach (var item in deletedFulfillments)
            {
                count += internalPOFacade.DeleteFulfillment(item.Id, username);
            }

            return(count);
        }