public DomainObjects.InventoryOperation Create(FuelReportDetail fuelReportDetail, long inventoryOperationId, string actionNumber, Enums.InventoryActionType actionType, DateTime actionDate)
        {
            InventoryOperation result = new InventoryOperation(
                inventoryOperationId,
                actionNumber,
                actionDate,
                actionType,
                fuelReportDetail.Id,
                null);

            return result;
        }
        public InventoryOperation ManageOrderItemBalance(OrderItemBalance orderItemBalance, int userId)
        {
            using (var dbContext = new InventoryDbContext())
            {
                using (var transaction = dbContext.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
                {
                    //Finding relevant Receipt Item
                    var receiptReferenceNumber = orderItemBalance.FuelReportDetailId.ToString();

                    var receiptReference = findInventoryOperationReference(
                        dbContext, InventoryOperationType.Receipt,
                        FUEL_REPORT_DETAIL_RECEIVE, receiptReferenceNumber);

                    var receiptReferenceTransactionItem = dbContext.TransactionItems.Single(
                        tip =>
                            tip.TransactionId == (int)receiptReference.OperationId &&
                            tip.GoodId == (int)orderItemBalance.FuelReportDetail.Good.SharedGoodId);

                    var receiptPriceReferenceNumber = generateOrderItemBalancePricingReferenceNumber(orderItemBalance);

                    var receiptRegisteredPriceReference = findInventoryOperationReference(dbContext, InventoryOperationType.Pricing, FUEL_REPORT_DETAIL_RECEIPT_INVOICE, receiptPriceReferenceNumber);
                    //There is no mechanism for editing the price of priced receipts portions.

                    var transactionItemPrice = new TransactionItemPrice()
                    {
                        TransactionItemId = receiptReferenceTransactionItem.Id,
                        QuantityUnitId = getMeasurementUnitId(dbContext, orderItemBalance.UnitCode),
                        QuantityAmount = orderItemBalance.QuantityAmountInMainUnit,
                        PriceUnitId = getCurrencyId(dbContext, orderItemBalance.InvoiceItem.Invoice.Currency.Abbreviation),
                        Fee = orderItemBalance.InvoiceItem.Fee,
                        RegistrationDate = DateTime.Now,
                        Description = "Received Good Pricing > " + orderItemBalance.FuelReportDetail.Good.Code,
                        UserCreatorId = userId
                    };

                    string pricingMessage;

                    priceTransactionItemManually(dbContext, transactionItemPrice, userId, out pricingMessage, FUEL_REPORT_DETAIL_RECEIPT_INVOICE, receiptPriceReferenceNumber);

                    var pricingOperationReference = findInventoryOperationReference(dbContext, InventoryOperationType.Pricing, FUEL_REPORT_DETAIL_RECEIPT_INVOICE, receiptPriceReferenceNumber);

                    var result = new InventoryOperation(
                        pricingOperationReference.OperationId,
                           actionNumber: string.Format("{0}/{1}", (InventoryOperationType)pricingOperationReference.OperationType, pricingOperationReference.OperationId),
                           actionDate: DateTime.Now,
                           actionType: InventoryActionType.Pricing,
                           fuelReportDetailId: null,
                           charterId: null);

                    transaction.Commit();

                    return result;
                }
            }
        }
        //================================================================================
        public InventoryOperation ManageFuelReportConsumption(FuelReport fuelReport, int userId)
        {
            if (!(fuelReport.FuelReportType == FuelReportTypes.EndOfVoyage ||
                fuelReport.FuelReportType == FuelReportTypes.EndOfYear ||
                fuelReport.FuelReportType == FuelReportTypes.EndOfMonth))
                throw new InvalidArgument("The given entity is not EOV, EOM, EOY.", "charterOutStart");

            using (var dbContext = new InventoryDbContext())
            {
                using (var transaction = dbContext.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
                {
                    InventoryOperation result = null;

                    //TODO: EOV-EOM-EOY
                    #region EOV-EOM-EOY

                    var goodsConsumption = new Dictionary<long, decimal>();

                    foreach (var detail in fuelReport.FuelReportDetails)
                    {
                        var consumption = calculateConsumption(detail);

                        goodsConsumption.Add(detail.GoodId, consumption);
                    }

                    var transactionReferenceNumber = fuelReport.Id.ToString();

                    var reference = findInventoryOperationReference(dbContext, InventoryOperationType.Issue, EOV_EOM_EOY_FUEL_REPORT_CONSUMPTION, transactionReferenceNumber);

                    //if (reference.OperationId == INVALID_ID)
                    if (reference == null)
                    {
                        string transactionCode, transactionMessage;

                        var operationReference =
                            issue(
                                  dbContext,
                                  (int)fuelReport.VesselInCompany.CompanyId,
                                  (int)fuelReport.VesselInCompany.VesselInInventory.Id,
                                  1,
                                  convertFuelReportConsumptionTypeToStoreType(fuelReport),
                                    null,
                                  EOV_EOM_EOY_FUEL_REPORT_CONSUMPTION,
                                  transactionReferenceNumber,
                                  userId,
                                  out transactionCode,
                                  out transactionMessage);

                        string transactionItemMessage;

                        var transactionItems = new List<TransactionItem>();

                        foreach (var fuelReportDetail in fuelReport.FuelReportDetails)
                        {
                            transactionItems.Add(new TransactionItem()
                                                 {
                                                     GoodId = (int)fuelReportDetail.Good.SharedGoodId,
                                                     CreateDate = DateTime.Now,
                                                     Description = fuelReportDetail.FuelReport.FuelReportType.ToString(),
                                                     QuantityAmount = goodsConsumption[fuelReportDetail.GoodId],
                                                     QuantityUnitId = getMeasurementUnitId(dbContext, fuelReportDetail.MeasuringUnit.Abbreviation),
                                                     TransactionId = (int)operationReference.OperationId,
                                                     UserCreatorId = userId
                                                 });
                        }

                        var registeredTransactionIds = addTransactionItems(dbContext, (int)operationReference.OperationId, transactionItems, userId, out transactionItemMessage);

                        string issuedItemsPricingMessage;

                        var pricingTransactionIds = registeredTransactionIds.Select(id => new TransactionItemPricingId() { Id = id, Description = "Voyage Consumption FIFO Pricing" });

                        try
                        {
                            priceIssuedItemsInFIFO(dbContext, pricingTransactionIds, userId, out issuedItemsPricingMessage, EOV_EOM_EOY_FUEL_REPORT_CONSUMPTION_PRICING, transactionReferenceNumber);
                        }
                        catch
                        {
                        }

                        result = new InventoryOperation(
                                       inventoryOperationId: operationReference.OperationId,
                                       actionNumber: string.Format("{0}/{1}", (InventoryOperationType)operationReference.OperationType, operationReference.OperationId),
                                       actionDate: DateTime.Now,
                                       actionType: InventoryActionType.Issue,
                                       fuelReportDetailId: null,
                                       charterId: null);
                    }
                    else
                    {
                        throw new InvalidOperation("EndOfVoyage/Month/Year inventory edit", "EndOfVoyage/Month/Year inventory edit is invalid");
                        var transactionItems = dbContext.TransactionItems.Where(ti => ti.TransactionId == reference.OperationId);
                    }

                    #endregion

                    transaction.Commit();

                    return result;
                }
            }
        }
        //================================================================================
        public InventoryOperation ManageCharterOutStart(CharterOut charterOutStart, int userId)
        {
            if (charterOutStart.CharterType != CharterType.Start)
                throw new InvalidArgument("The given entity is not Charter Out Start", "charterOutStart");

            using (var dbContext = new InventoryDbContext())
            {
                using (var transaction = dbContext.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
                {
                    //try
                    //{
                    //    dbContext.Database.ExecuteSqlCommand(
                    //                                         TransactionalBehavior.EnsureTransaction,
                    //                                         "dbo.[IssueItemPricesOperation]");
                    //}
                    //catch (Exception)
                    //{
                    //    throw;
                    //}

                    InventoryOperation result = null;

                    var reference = findInventoryOperationReference(dbContext, InventoryOperationType.Issue, CHARTER_OUT_START_ISSUE, charterOutStart.Id.ToString());

                    //if (reference.OperationId == INVALID_ID)
                    if (reference == null)
                    {
                        string transactionCode, transactionMessage;

                        var operationReference = issue(
                                  dbContext,
                                  (int)charterOutStart.VesselInCompany.CompanyId,
                                  (int)charterOutStart.VesselInCompany.VesselInInventory.Id,
                                  1,
                                  convertCharterOutTypeToStoreType(charterOutStart),
                                    null,
                                  CHARTER_OUT_START_ISSUE,
                                  charterOutStart.Id.ToString(),
                                  userId,
                                  out transactionCode,
                                  out transactionMessage);

                        string transactionItemMessage;

                        var transactionItems = new List<TransactionItem>();

                        foreach (var charterItem in charterOutStart.CharterItems)
                        {

                            transactionItems.Add(new TransactionItem()
                            {
                                GoodId = (int)charterItem.Good.SharedGoodId,
                                CreateDate = DateTime.Now,
                                Description = "Charter Out Start > " + charterItem.Good.Code,
                                QuantityAmount = charterItem.Rob,
                                QuantityUnitId = getMeasurementUnitId(dbContext, charterItem.GoodUnit.Abbreviation),
                                TransactionId = (int)operationReference.OperationId,
                                UserCreatorId = userId
                            });
                        }

                        var registeredTransactionIds = addTransactionItems(dbContext, (int)operationReference.OperationId, transactionItems, userId, out transactionItemMessage);

                        string issuedItemsPricingMessage;

                        var pricingTransactionIds = registeredTransactionIds.Select(id => new TransactionItemPricingId() { Id = id, Description = "Charter-Out Start FIFO Pricing" });

                        priceIssuedItemsInFIFO(dbContext, pricingTransactionIds, userId, out issuedItemsPricingMessage, CHARTER_OUT_START_ISSUE_PRICING, charterOutStart.Id.ToString());

                        deactivateWarehouse(dbContext, (int)charterOutStart.VesselInCompany.VesselInInventory.Id, userId);

                        result = new InventoryOperation(
                                       inventoryOperationId: operationReference.OperationId,
                                       actionNumber: string.Format("{0}/{1}", (InventoryOperationType)operationReference.OperationType, operationReference.OperationId),
                                       actionDate: DateTime.Now,
                                       actionType: InventoryActionType.Issue,
                                       fuelReportDetailId: null,
                                       charterId: null);
                    }
                    else
                    {
                        throw new InvalidOperation("CharterOutStart disapprovement", "CharterOutStart disapprovement is invalid.");

                        var transactionItems = dbContext.TransactionItems.Where(ti => ti.TransactionId == reference.OperationId);

                    }

                    transaction.Commit();

                    return result;
                }
            }
        }
 private InventoryOperation mapInventoryOperationDtoToInventoryOperation(FuelReportInventoryOperationDto arg)
 {
     var result = new InventoryOperation(arg.Code, arg.ActionDate, mapInventoryActionType(arg.ActionType), null, null);
     return result;
 }