public async Task <IActionResult> CreateSalesOrderDetail([FromBody] SalesOrderDetailDataTransformation salesOrderDetailDataTransformation)
        {
            SecurityModel securityModel = (SecurityModel)(HttpContext.Items["SecurityModel"]);

            int accountId    = securityModel.AccountId;
            int salesOrderId = salesOrderDetailDataTransformation.SalesOrderId;

            salesOrderDetailDataTransformation.AccountId = accountId;

            ResponseModel <SalesOrderDetailDataTransformation> returnResponse = new ResponseModel <SalesOrderDetailDataTransformation>();

            try
            {
                returnResponse = await _salesOrderManagementBusinessService.CreateSalesOrderDetail(salesOrderDetailDataTransformation);

                returnResponse.Token = securityModel.Token;
                if (returnResponse.ReturnStatus == false)
                {
                    return(BadRequest(returnResponse));
                }

                return(Ok(returnResponse));
            }
            catch (Exception ex)
            {
                returnResponse.ReturnStatus = false;
                returnResponse.ReturnMessage.Add(ex.Message);
                return(BadRequest(returnResponse));
            }
        }
示例#2
0
        public async Task <IActionResult> UpdateSalesOrderDetail([FromBody] SalesOrderDetailDataTransformation salesOrderDetailDataTransformation)
        {
            SecurityModel securityModel = (SecurityModel)(HttpContext.Items["SecurityModel"]);

            int accountId = securityModel.AccountId;

            salesOrderDetailDataTransformation.AccountId = accountId;

            ResponseModel <SalesOrderDetailDataTransformation> returnResponse = new ResponseModel <SalesOrderDetailDataTransformation>();

            try
            {
                returnResponse = await _inventoryManagementBusinessService.UpdateSalesOrderDetail(salesOrderDetailDataTransformation);

                returnResponse.Token = securityModel.Token;
                if (returnResponse.ReturnStatus == false)
                {
                    return(BadRequest(returnResponse));
                }

                await _messageQueueContext.Clients.All.SendAsync(MessageQueueEndpoints.InventoryQueue, string.Empty);

                return(Ok(returnResponse));
            }
            catch (Exception ex)
            {
                returnResponse.ReturnStatus = false;
                returnResponse.ReturnMessage.Add(ex.Message);
                return(BadRequest(returnResponse));
            }
        }
        /// <summary>
        /// Get Sales Order
        /// </summary>
        /// <param name="accountId"></param>
        /// <param name="salesOrderId"></param>
        /// <returns></returns>
        public async Task <ResponseModel <SalesOrderDataTransformation> > GetSalesOrder(int accountId, int salesOrderId)
        {
            ResponseModel <SalesOrderDataTransformation> returnResponse = new ResponseModel <SalesOrderDataTransformation>();
            SalesOrderDataTransformation salesOrderDataTransformation   = new SalesOrderDataTransformation();

            try
            {
                _inventoryManagementDataService.OpenConnection(_connectionStrings.PrimaryDatabaseConnectionString);

                SalesOrder salesOrder = await _inventoryManagementDataService.GetSalesOrder(accountId, salesOrderId);

                salesOrderDataTransformation.SalesOrderId       = salesOrderId;
                salesOrderDataTransformation.SalesOrderNumber   = salesOrder.SalesOrderNumber;
                salesOrderDataTransformation.SalesOrderStatusId = salesOrder.SalesOrderStatusId;
                salesOrderDataTransformation.CustomerName       = salesOrder.CustomerName;
                salesOrderDataTransformation.AddressLine1       = salesOrder.AddressLine1;
                salesOrderDataTransformation.AddressLine2       = salesOrder.AddressLine2;
                salesOrderDataTransformation.City       = salesOrder.City;
                salesOrderDataTransformation.Region     = salesOrder.Region;
                salesOrderDataTransformation.PostalCode = salesOrder.PostalCode;
                salesOrderDataTransformation.OrderTotal = salesOrder.OrderTotal;
                salesOrderDataTransformation.SalesOrderStatusDescription = salesOrder.SalesOrderStatus.Description;
                salesOrderDataTransformation.DateCreated       = salesOrder.DateCreated;
                salesOrderDataTransformation.DateUpdated       = salesOrder.DateUpdated;
                salesOrderDataTransformation.SalesOrderDetails = new List <SalesOrderDetailDataTransformation>();

                foreach (SalesOrderDetail salesOrderDetail in salesOrder.SalesOrderDetails)
                {
                    SalesOrderDetailDataTransformation salesOrderDetailDataTransformation = new SalesOrderDetailDataTransformation();
                    salesOrderDetailDataTransformation.SalesOrderDetailId = salesOrderDetail.SalesOrderDetailId;
                    salesOrderDetailDataTransformation.SalesOrderId       = salesOrderDetail.SalesOrderId;
                    salesOrderDetailDataTransformation.ProductId          = salesOrderDetail.ProductId;
                    salesOrderDetailDataTransformation.ProductNumber      = salesOrderDetail.Product.ProductNumber;
                    salesOrderDetailDataTransformation.ProductDescription = salesOrderDetail.Product.Description;
                    salesOrderDetailDataTransformation.UnitPrice          = salesOrderDetail.UnitPrice;
                    salesOrderDetailDataTransformation.OrderQuantity      = salesOrderDetail.OrderQuantity;
                    salesOrderDetailDataTransformation.ShippedQuantity    = salesOrderDetail.ShippedQuantity;
                    salesOrderDetailDataTransformation.DateCreated        = salesOrderDetail.DateCreated;
                    salesOrderDetailDataTransformation.DateUpdated        = salesOrderDetail.DateUpdated;

                    salesOrderDataTransformation.SalesOrderDetails.Add(salesOrderDetailDataTransformation);
                }

                returnResponse.ReturnStatus = true;
            }
            catch (Exception ex)
            {
                returnResponse.ReturnStatus = false;
                returnResponse.ReturnMessage.Add(ex.Message);
            }
            finally
            {
                _inventoryManagementDataService.CloseConnection();
            }

            returnResponse.Entity = salesOrderDataTransformation;

            return(returnResponse);
        }
        /// <summary>
        /// Update Sales Order Detail
        /// </summary>
        /// <param name="salesOrderDetailDataTransformation"></param>
        /// <returns></returns>
        public async Task <ResponseModel <SalesOrderDetailDataTransformation> > UpdateSalesOrderDetail(SalesOrderDetailDataTransformation salesOrderDetailDataTransformation)
        {
            ResponseModel <SalesOrderDetailDataTransformation> returnResponse = new ResponseModel <SalesOrderDetailDataTransformation>();

            SalesOrderDetail salesOrderDetail = new SalesOrderDetail();

            try
            {
                int accountId          = salesOrderDetailDataTransformation.AccountId;
                int salesOrderId       = salesOrderDetailDataTransformation.SalesOrderId;
                int salesOrderDetailId = salesOrderDetailDataTransformation.SalesOrderDetailId;
                //
                //	Validate Shipped Quantity
                //
                if (salesOrderDetailDataTransformation.CurrentShippedQuantity == 0)
                {
                    returnResponse.ReturnMessage.Add("Invalid Shipped Quantity");
                    returnResponse.ReturnStatus = false;

                    return(returnResponse);
                }
                //
                //	Begin a Serializable Transaction
                //
                _inventoryManagementDataService.OpenConnection(_connectionStrings.PrimaryDatabaseConnectionString);
                _inventoryManagementDataService.BeginTransaction((int)IsolationLevel.Serializable);
                //
                //	Get Sales Order Header
                //
                SalesOrder salesOrder = await _inventoryManagementDataService.GetSalesOrderHeader(accountId, salesOrderId);

                if (salesOrder == null)
                {
                    _inventoryManagementDataService.RollbackTransaction();

                    returnResponse.ReturnMessage.Add("Sales Order not found");
                    returnResponse.ReturnStatus = false;

                    return(returnResponse);
                }
                //
                //	Get Sales Order Detail
                //
                salesOrderDetail = await _inventoryManagementDataService.GetSalesOrderDetailForUpdate(salesOrderDetailId);

                if (salesOrderDetail == null)
                {
                    _inventoryManagementDataService.RollbackTransaction();

                    returnResponse.ReturnMessage.Add("Sales Order Detail not found");
                    returnResponse.ReturnStatus = false;

                    return(returnResponse);
                }
                //
                //	Update Sales Order Shipped Quantity
                //
                salesOrderDetail.ShippedQuantity = salesOrderDetail.ShippedQuantity + salesOrderDetailDataTransformation.CurrentShippedQuantity;

                await _inventoryManagementDataService.UpdateSalesOrderDetail(salesOrderDetail);

                //
                //	Get Product Record with an exclusive update lock
                //
                Product product = await _inventoryManagementDataService.GetProductInformationForUpdate(salesOrderDetail.ProductId);

                if (product == null)
                {
                    _inventoryManagementDataService.RollbackTransaction();

                    returnResponse.ReturnMessage.Add("Product not found");
                    returnResponse.ReturnStatus = false;

                    return(returnResponse);
                }
                //
                //	Reduce Product OnHand Quantity by the quantity shipped
                //
                product.OnHandQuantity = product.OnHandQuantity - salesOrderDetailDataTransformation.CurrentShippedQuantity;

                await _inventoryManagementDataService.UpdateProduct(product);

                //
                //	Create Inventory Transaction Record
                //
                InventoryTransaction inventoryTransaction = new InventoryTransaction();
                inventoryTransaction.EntityId        = salesOrderDetail.SalesOrderDetailId;
                inventoryTransaction.MasterEntityId  = salesOrderDetail.MasterSalesOrderDetailId;
                inventoryTransaction.ProductId       = salesOrderDetail.ProductId;
                inventoryTransaction.UnitCost        = product.AverageCost;
                inventoryTransaction.Quantity        = salesOrderDetailDataTransformation.CurrentShippedQuantity;
                inventoryTransaction.TransactionDate = DateTime.UtcNow;

                await _inventoryManagementDataService.CreateInventoryTransaction(inventoryTransaction);

                //
                //	Create Transaction Queue record and create inventory transaction payload
                //
                TransactionQueueOutbound transactionQueue = new TransactionQueueOutbound();
                transactionQueue.Payload         = GenerateInventoryTransactionPayload(inventoryTransaction);
                transactionQueue.TransactionCode = TransactionQueueTypes.InventoryShipped;
                transactionQueue.ExchangeName    = MessageQueueExchanges.InventoryManagement;

                await _inventoryManagementDataService.CreateOutboundTransactionQueue(transactionQueue);

                //await _inventoryManagementDataService.UpdateDatabase();

                //
                //	Commit Transaction
                //
                _inventoryManagementDataService.CommitTransaction();

                returnResponse.ReturnStatus = true;
            }
            catch (Exception ex)
            {
                _inventoryManagementDataService.RollbackTransaction();
                returnResponse.ReturnStatus = false;
                returnResponse.ReturnMessage.Add(ex.Message);
            }
            finally
            {
                _inventoryManagementDataService.CloseConnection();
            }

            returnResponse.Entity = salesOrderDetailDataTransformation;

            return(returnResponse);
        }