private async Task <bool> PostToStore(Bill bill, BillType billtype, BillItem billItem, ItemUnit itemUnit, bool rollBack = false) { var inOrOut = int.Parse(EnumHelper.GetDescription(billtype.Type)); var billItemQuantity = inOrOut * billItem.Quantity; if (rollBack) { billItemQuantity = billItemQuantity * -1; } #region storeItemUnit var storeItemUnit = await _storeItemUnitRepo.NativeGetAll().FirstOrDefaultAsync(e => e.StoreId == billItem.StoreId && e.ItemUnitId == billItem.ItemUnitId); if (!rollBack && storeItemUnit == null) // check if not exist => create one { if (billtype.PreventNegativeOutput && billItemQuantity < 0) { return(false); } storeItemUnit = new StoreItemUnit(billItem.StoreId, billItem.ItemUnitId, billItemQuantity); _storeItemUnitRepo.Add(storeItemUnit, false); } else // if exist => update quantity { if (!rollBack && billtype.PreventNegativeOutput && storeItemUnit.Quantity + billItemQuantity < 0) { return(false); } storeItemUnit.Quantity = storeItemUnit.Quantity + billItemQuantity; // if quantity equal zero set end date of this item unit store if (!rollBack && billItemQuantity <= 0) { storeItemUnit.SetEndDateNow(); } _storeItemUnitRepo.Edit(storeItemUnit, false); } #endregion #region storeItem var storeItem = await _storeItemRepo.NativeGetAll().FirstOrDefaultAsync(e => e.StoreId == billItem.StoreId && e.ItemId == itemUnit.ItemId); // if (!itemUnit.IsDefault) { billItemQuantity = billItemQuantity * itemUnit.Factor; } // if (!rollBack && storeItem == null) // check if not exist => create one { storeItem = new StoreItem(billItem.StoreId, itemUnit.ItemId, billItemQuantity); _storeItemRepo.Add(storeItem, false); } else // if exist => update quantity { storeItem.Quantity = storeItem.Quantity + billItemQuantity; // if quantity equal zero set end date of this item unit store if (billItemQuantity <= 0) { storeItem.SetEndDateNow(); } _storeItemRepo.Edit(storeItem, false); } #endregion bill.IsPosted = !rollBack; return(await Task.FromResult(true)); }