private void amzQueryToken(DateTime stDate, DateTime endDate, int res, string amzNowToken, int statusIndex, bool dataModifica, bool prime, LavClass.TipoOperatore tp, UtilityMaietta.genSettings s)
    {
        string    nexttoken, errore;
        ArrayList lista;

        lista = AmazonOrder.GetOrdersToken(amzSettings, aMerchant, amzNowToken, out nexttoken, out errore);
        if (lista == null || errore != "")
        {
            Response.Write("Impossibile contattare amazon, riprova più tardi!<br />Errore: " + errore);
            return;
        }
        AmazonOrder.Order.OrderComparer comparer = new AmazonOrder.Order.OrderComparer();
        comparer.ComparisonMethod = (AmazonOrder.Order.OrderComparer.ComparisonType) int.Parse(dropOrdina.SelectedValue.ToString());
        lista.Sort(comparer);

        imbNextPag.PostBackUrl = "amzShipDownload.aspx?token=" + Request.QueryString["token"].ToString() + "&merchantId=" + Request.QueryString["merchantId"].ToString() + "&amzToken=" + HttpUtility.UrlEncode(nexttoken);
        if (res > lista.Count || nexttoken == null || nexttoken == "")
        {
            imbNextPag.Visible = false;
        }
        else
        {
            imbNextPag.Visible = true;
        }

        //gvShips.Columns.Clear();
        //gvShips.DataSource = null;
        //gvShips.DataBind();
        //addFirstRow(tp, s);
        //createGrid(lista, false, tp, s);

        fillGrid(int.Parse(dropVett.SelectedValue), amzSettings, lista); //, true);
    }
Esempio n. 2
0
        public void Delete(AmazonOrder item)
        {
            _amazonLogService.Add(AmazonLogType.Orders, AmazonLogStatus.Delete,
                                  null, null, null, null, item, null, null, "Amazon Order #" + item.AmazonOrderId);

            _session.Transact(session => session.Delete(item));
        }
Esempio n. 3
0
        public OrderFulfillment GetOrderFulfillment(AmazonOrder amazonOrder)
        {
            var orderFulfillment = new OrderFulfillment()
            {
                Item            = amazonOrder.AmazonOrderId,
                ItemElementName = ItemChoiceType2.AmazonOrderID,
                FulfillmentData = new OrderFulfillmentFulfillmentData()
                {
                    Item           = "Other",
                    ShippingMethod = "Standard"
                },
                Item1 = new OrderFulfillmentItemCollection()
            };

            orderFulfillment.FulfillmentDate = amazonOrder.Order.ShippingDate.HasValue ? amazonOrder.Order.ShippingDate.Value.ToUniversalTime().AddMinutes(-15) : DateTime.UtcNow.AddMinutes(-15); //-15 because server times differ

            foreach (var amazonOrderItem in amazonOrder.Items)
            {
                var item = new OrderFulfillmentItem()
                {
                    Item            = amazonOrderItem.AmazonOrderItemId,
                    ItemElementName = ItemChoiceType3.AmazonOrderItemCode,
                    Quantity        = decimal.ToInt32(amazonOrderItem.QuantityOrdered).ToString()
                };
                orderFulfillment.Item1.Add(item);
            }
            return(orderFulfillment);
        }
Esempio n. 4
0
        public AmazonLog Add(AmazonLogType type, AmazonLogStatus status, Exception elmahError, MarketplaceWebService.Model.Error amazonError,
                             AmazonApiSection?apiSection, string apiOperation, AmazonOrder amazonOrder, AmazonListing amazonListing, AmazonListingGroup amazonListingGroup,
                             string message = "", string details = "")
        {
            var log = new AmazonLog
            {
                LogType            = type,
                LogStatus          = status,
                AmazonOrder        = amazonOrder,
                ApiSection         = apiSection,
                ApiOperation       = !String.IsNullOrWhiteSpace(apiOperation) ? apiOperation : null,
                AmazonListing      = amazonListing,
                AmazonListingGroup = amazonListingGroup,
                Message            = !String.IsNullOrWhiteSpace(message) ? message : null,
                Detail             = !String.IsNullOrWhiteSpace(details) ? details : null,
                Site = CurrentRequestData.CurrentSite
            };

            log.SetGuid(Guid.NewGuid());
            if (elmahError != null)
            {
                log.Message = elmahError.Message;
                log.Detail  = elmahError.StackTrace;
            }
            if (amazonError != null)
            {
                log.ErrorCode = amazonError.Code;
                log.ErrorType = amazonError.Type;
                log.Message   = amazonError.Message;
                log.Detail    = amazonError.Detail.ToString();
            }

            return(Save(log));
        }
Esempio n. 5
0
 public ActionResult Details(AmazonOrder amazonOrder)
 {
     if (amazonOrder != null)
     {
         return(View(amazonOrder));
     }
     return(RedirectToAction("Index"));
 }
Esempio n. 6
0
 public bool Update(AmazonOrder amazonOrder, Order order)
 {
     if (amazonOrder.Status == AmazonOrderStatus.Unshipped)
     {
         var shippingAddress = _validateAmazonOrderService.GetAmazonOrderAddress(order);
         _validateAmazonOrderService.SetShippingAddress(amazonOrder, shippingAddress);
     }
     return(true);
 }
Esempio n. 7
0
        public void SaveOrUpdate(AmazonOrder amazonOrder)
        {
            var orderId = amazonOrder.AmazonOrderId;
            var id      = amazonOrder.Id;

            _session.Transact(session => session.SaveOrUpdate(amazonOrder));
            _amazonLogService.Add(AmazonLogType.Orders, id > 0?AmazonLogStatus.Update:AmazonLogStatus.Insert,
                                  null, null, null, null, amazonOrder, null, null, "Amazon Order #" + orderId);
        }
Esempio n. 8
0
        public void AmazonOrderPlaced(AmazonOrder order)
        {
            var items = GetAll <IOnAmazonOrderPlaced>();

            if (items.Any())
            {
                items.ForEach(placed => placed.OnAmazonOrderPlaced(order));
            }
        }
Esempio n. 9
0
        public void AmazonOrderService_Get_ShouldReturnPersistedEntryFromSession()
        {
            var item = new AmazonOrder();

            Session.Transact(session => session.Save(item));

            var results = _amazonOrderService.Get(1);

            results.As <AmazonOrder>().Id.Should().Be(1);
        }
Esempio n. 10
0
        public void AmazonOrderService_Delete_ShouldRemoveItemFromTheSession()
        {
            var item = new AmazonOrder();

            Session.Transact(session => session.Save(item));

            _amazonOrderService.Delete(item);

            Session.QueryOver <AmazonOrder>().RowCount().Should().Be(0);
        }
        public decimal GetNumberOfShippedProducts(DateTime from, DateTime to)
        {
            AmazonOrder     amazonOrderAlias     = null;
            AmazonOrderItem amazonOrderItemAlias = null;

            return(_session.QueryOver(() => amazonOrderItemAlias)
                   .JoinAlias(() => amazonOrderItemAlias.AmazonOrder, () => amazonOrderAlias)
                   .Where(() => amazonOrderAlias.PurchaseDate >= from && amazonOrderAlias.PurchaseDate <= to)
                   .Cacheable().List().Sum(x => x.QuantityShipped));
        }
Esempio n. 12
0
        public bool Update(AmazonOrder amazonOrder, Order order)
        {
            if (amazonOrder.Status == AmazonOrderStatus.Unshipped && order.OrderStatus == OrderStatusEnum.Canceled)
            {
                amazonOrder.Status = AmazonOrderStatus.Canceled;
                _amazonOrderService.Update(amazonOrder);

                _orderService.Cancel(amazonOrder.Order);
            }
            return(true);
        }
Esempio n. 13
0
        public void AmazonOrderService_Update_ShouldUpdateInSession()
        {
            var item = new AmazonOrder();

            Session.Transact(session => session.Save(item));
            item.BuyerName = "T1";

            _amazonOrderService.Update(item);
            Session.Evict(item);

            Session.Get <AmazonOrder>(1).BuyerName.Should().Be("T1");
        }
Esempio n. 14
0
        public bool Update(AmazonOrder amazonOrder, Order order)
        {
            if (amazonOrder.Id == 0 || (amazonOrder.Status != AmazonOrderStatus.Shipped &&
                                        amazonOrder.Status != AmazonOrderStatus.Canceled))
            {
                var shippingAddress = _validateAmazonOrderService.GetAmazonOrderAddress(order);
                _validateAmazonOrderService.GetAmazonOrderDetails(order, ref amazonOrder, shippingAddress);
            }

            amazonOrder.NumberOfItemsShipped = order.NumberOfItemsShipped;
            amazonOrder.Status = order.OrderStatus.GetEnumByValue <AmazonOrderStatus>();
            return(true);
        }
Esempio n. 15
0
        private static int CreateAmazonOrder(IContainer container, int customerMarketPlaceId, int marketPlaceHistoryId)
        {
            AmazonOrder order = new AmazonOrder {
                Created = DateTime.UtcNow,
                CustomerMarketPlaceId = customerMarketPlaceId,
                CustomerMarketPlaceUpdatingHistoryRecordId = marketPlaceHistoryId
            };

            var amazonOrdersQueries = container.GetInstance <IAmazonOrdersQueries>();
            int orderId             = (int)amazonOrdersQueries.SaveOrder(order);

            Assert.IsTrue(orderId > 0, "error inserting order id");
            return(orderId);
        }
Esempio n. 16
0
        public void AmazonOrderService_Delete_ShouldCallAddLog()
        {
            var item = new AmazonOrder()
            {
                AmazonOrderId = "1"
            };

            Session.Transact(session => session.Save(item));

            _amazonOrderService.Delete(item);

            A.CallTo(() => _amazonLogService.Add(AmazonLogType.Orders, AmazonLogStatus.Delete,
                                                 null, null, null, null, item, null, null, "Amazon Order #" +
                                                 item.AmazonOrderId, string.Empty)).MustHaveHappened();
        }
Esempio n. 17
0
        /// <summary>
        /// Saves the order.
        /// </summary>
        /// <param name="order">The order.</param>
        /// <returns></returns>
        public Optional <int> SaveOrder(AmazonOrder order)
        {
            using (var connection = GetOpenedSqlConnection2()) {
                var cmd = new MultiInsertCommandGenerator <AmazonOrder>()
                          .WithOptionalConnection(connection.SqlConnection())
                          .WithTableName(Tables.AmazonOrder)
                          .WithModels(order.ToEnumerable())
                          .WithSkipColumns(o => o.Id)
                          .WithOutputColumns(o => o.Id)
                          .Verify().GenerateCommands().First();

                using (var sqlCommand = cmd) {
                    return(ExecuteScalarAndLog <int>(sqlCommand));
                }
            }
        }
Esempio n. 18
0
        public void SetAmazonOrderItem(ref AmazonOrder amazonOrder, OrderItem rawOrderItem)
        {
            AmazonOrderItem item =
                amazonOrder.Items.SingleOrDefault(x => x.AmazonOrderItemId == rawOrderItem.OrderItemId);

            if (item != null)
            {
                item.QuantityShipped = rawOrderItem.QuantityShipped;
            }
            else
            {
                AmazonOrderItem orderItem = GetAmazonOrderItem(amazonOrder, rawOrderItem);

                amazonOrder.Items.Add(orderItem);
            }
        }
        public void AmazonOrder_ShippingTotal_ShouldBeSumOShippingAmountShippingTaxMinusShippingDiscountAmount()
        {
            var item1 = A.Fake <AmazonOrderItem>();

            A.CallTo(() => item1.ShippingPriceAmount).Returns(10);
            A.CallTo(() => item1.ShippingTaxAmount).Returns(10);
            A.CallTo(() => item1.ShippingDiscountAmount).Returns(10);
            var amazonOrder = new AmazonOrder()
            {
                Items = new List <AmazonOrderItem> {
                    item1
                }
            };

            var result = amazonOrder.ShippingTotal;

            result.Should().Be(10);
        }
        public void AmazonOrder_ItemAmount_ShouldBeSumOfItemPriceAmount()
        {
            var item1 = A.Fake <AmazonOrderItem>();
            var item2 = A.Fake <AmazonOrderItem>();

            A.CallTo(() => item1.ItemPriceAmount).Returns(10);
            A.CallTo(() => item2.ItemPriceAmount).Returns(20);
            var amazonOrder = new AmazonOrder()
            {
                Items = new List <AmazonOrderItem> {
                    item1, item2
                }
            };

            var result = amazonOrder.ItemAmount;

            result.Should().Be(30);
        }
Esempio n. 21
0
        public Ecommerce.Entities.Orders.Order GetOrder(AmazonOrder amazonOrder)
        {
            Ecommerce.Entities.Orders.Order order = amazonOrder.Order ?? new Ecommerce.Entities.Orders.Order();

            if (order.Id == 0)
            {
                order = GetOrderDetails(amazonOrder);
                Ecommerce.Entities.Orders.Order order1 = order;
                _session.Transact(session => session.Save(order1));
                GetOrderLines(amazonOrder, ref order);

                _setTax.SetTax(ref order, amazonOrder.Tax);
            }

            order.ShippingStatus = amazonOrder.Status.GetEnumByValue <ShippingStatus>();

            return(order);
        }
        public void AmazonOrder_ShippingTax_ShouldBeSumOfShippingTaxAmount()
        {
            var item1 = A.Fake <AmazonOrderItem>();
            var item2 = A.Fake <AmazonOrderItem>();

            A.CallTo(() => item1.ShippingTaxAmount).Returns(10);
            A.CallTo(() => item2.ShippingTaxAmount).Returns(20);
            var amazonOrder = new AmazonOrder()
            {
                Items = new List <AmazonOrderItem> {
                    item1, item2
                }
            };

            var result = amazonOrder.ShippingTax;

            result.Should().Be(30);
        }
 public bool Update(AmazonOrder amazonOrder, Order order)
 {
     if (amazonOrder.Items.Any())
     {
         return(true);
     }
     try
     {
         var orderItems = _amazonOrdersApiService.ListOrderItems(amazonOrder.AmazonOrderId);
         _importAmazonOrderService.SetAmazonOrderItems(orderItems, amazonOrder);
         return(true);
     }
     catch (Exception exception)
     {
         CurrentRequestData.ErrorSignal.Raise(exception);
         return(false);
     }
 }
        public void AmazonOrder_Tax_ShouldBeSumOfItemTaxShippingTaxGiftWrapTax()
        {
            var item1 = A.Fake <AmazonOrderItem>();

            A.CallTo(() => item1.ItemTaxAmount).Returns(10);
            A.CallTo(() => item1.ShippingTaxAmount).Returns(10);
            A.CallTo(() => item1.GiftWrapTaxAmount).Returns(10);
            var amazonOrder = new AmazonOrder()
            {
                Items = new List <AmazonOrderItem> {
                    item1
                }
            };

            var result = amazonOrder.Tax;

            result.Should().Be(30);
        }
Esempio n. 25
0
 private Ecommerce.Entities.Orders.Order GetOrderDetails(AmazonOrder amazonOrder)
 {
     return(new Ecommerce.Entities.Orders.Order
     {
         ShippingAddress = amazonOrder.ShippingAddress,
         BillingAddress = amazonOrder.ShippingAddress,
         PaymentMethod = amazonOrder.PaymentMethod.GetDescription(),
         PaidDate = amazonOrder.PurchaseDate,
         Total = amazonOrder.OrderTotalAmount,
         TotalPaid = amazonOrder.OrderTotalAmount,
         Subtotal = amazonOrder.ItemAmount,
         DiscountAmount = amazonOrder.ItemDiscountAmount,
         ShippingTax = amazonOrder.ShippingTax,
         ShippingTotal = amazonOrder.ShippingTotal,
         OrderEmail = amazonOrder.BuyerEmail,
         IsCancelled = false,
         SalesChannel = AmazonApp.SalesChannel,
         PaymentStatus = PaymentStatus.Paid,
         OrderDate = amazonOrder.PurchaseDate.HasValue ? amazonOrder.PurchaseDate : CurrentRequestData.Now
     });
 }
Esempio n. 26
0
 private void GetOrderLines(AmazonOrder amazonOrder, ref Ecommerce.Entities.Orders.Order order)
 {
     foreach (AmazonOrderItem amazonOrderItem in amazonOrder.Items)
     {
         var orderLine = new OrderLine
         {
             Order     = order,
             UnitPrice =
                 amazonOrderItem.QuantityOrdered > 0
                     ? (amazonOrderItem.ItemPriceAmount / amazonOrderItem.QuantityOrdered)
                     : 0,
             Price    = amazonOrderItem.ItemPriceAmount,
             Name     = amazonOrderItem.Title,
             Tax      = amazonOrderItem.ItemTaxAmount,
             Discount = amazonOrderItem.PromotionDiscountAmount,
             Quantity = Decimal.ToInt32(amazonOrderItem.QuantityOrdered),
             SKU      = amazonOrderItem.SellerSKU
         };
         order.OrderLines.Add(orderLine);
         _session.Transact(session => session.Save(orderLine));
     }
 }
Esempio n. 27
0
        private bool ProcessOrder(Order order, ref AmazonOrder amazonOrder, bool newOrder)
        {
            foreach (var update in _amazonUpdates.OrderBy(updates => updates.Order))
            {
                if (!update.Update(amazonOrder, order))
                {
                    return(false);
                }
            }

            _amazonOrderService.SaveOrUpdate(amazonOrder);

            if (newOrder)
            {
                foreach (var orderPlaced in _onAmazonOrderPlaceds)
                {
                    orderPlaced.OnAmazonOrderPlaced(amazonOrder);
                }
            }

            return(true);
        }
Esempio n. 28
0
 public void GetAmazonOrderDetails(Order rawOrder, ref AmazonOrder order, AddressData shippingAddress)
 {
     order.AmazonOrderId = !String.IsNullOrWhiteSpace(rawOrder.AmazonOrderId)
         ? rawOrder.AmazonOrderId
         : String.Empty;
     order.BuyerEmail   = !String.IsNullOrWhiteSpace(rawOrder.BuyerEmail) ? rawOrder.BuyerEmail : String.Empty;
     order.BuyerName    = !String.IsNullOrWhiteSpace(rawOrder.BuyerName) ? rawOrder.BuyerName : String.Empty;
     order.PurchaseDate = TimeZoneInfo.ConvertTime(rawOrder.PurchaseDate, TimeZoneInfo.Utc,
                                                   CurrentRequestData.TimeZoneInfo);
     order.PaymentMethod = rawOrder.PaymentMethod.GetEnumByValue <AmazonPaymentMethod>();
     order.SalesChannel  = !String.IsNullOrWhiteSpace(rawOrder.SalesChannel)
         ? rawOrder.SalesChannel
         : String.Empty;
     order.OrderType        = !String.IsNullOrWhiteSpace(rawOrder.OrderType) ? rawOrder.OrderType : String.Empty;
     order.OrderTotalAmount = (rawOrder.OrderTotal != null && rawOrder.OrderTotal.Amount != null)
         ? Decimal.Parse(rawOrder.OrderTotal.Amount, (new CultureInfo("en-GB", false)))
         : 0;
     order.OrderCurrency = (rawOrder.OrderTotal != null && rawOrder.OrderTotal.Amount != null)
         ? rawOrder.OrderTotal.CurrencyCode
         : String.Empty;
     order.MarketplaceId = !String.IsNullOrWhiteSpace(rawOrder.MarketplaceId)
         ? rawOrder.MarketplaceId
         : String.Empty;
     order.ShipServiceLevel = !String.IsNullOrWhiteSpace(rawOrder.ShipServiceLevel)
         ? rawOrder.ShipServiceLevel
         : String.Empty;
     order.ShipmentServiceLevelCategory = !String.IsNullOrWhiteSpace(rawOrder.ShipmentServiceLevelCategory)
         ? rawOrder.ShipmentServiceLevelCategory
         : String.Empty;
     SetShippingAddress(order, shippingAddress);
     order.NumberOfItemsUnshipped = rawOrder.NumberOfItemsUnshipped;
     order.NumberOfItemsShipped   = rawOrder.NumberOfItemsShipped;
     order.FulfillmentChannel     = rawOrder.FulfillmentChannel.GetEnumByValue <AmazonFulfillmentChannel>();
     order.LastUpdatedDate        = TimeZoneInfo.ConvertTime(rawOrder.LastUpdateDate, TimeZoneInfo.Utc,
                                                             CurrentRequestData.TimeZoneInfo);
 }
        /// <summary>
        /// Creates an incoming payment.
        /// </summary>
        /// <param name="cardCode">The BP's CardCode.</param>
        /// <param name="salesOrderNo">The salesOrder's DocNum</param>
        /// <param name="order">The Amazon order object</param>
        /// <returns>Payment DocNum on success, -1 on error.</returns>
        public string CreatePayment(string cardCode, string salesOrderNo, AmazonOrder order)
        {
            Recordset rs;
            string    DocEntry = null, DocNum = null, q;

            try
            {
                // If incoming payment exists with AmzOrderId, log and return
                q  = "usp_MarketplaceGetIncomingPaymentByAmazonOrderID '" + order.AmazonOrderId + "'";
                rs = (Recordset)DIAPI_Objects.Company.GetBusinessObject(BoObjectTypes.BoRecordset);
                rs.DoQuery(q);
                if (!(rs.EoF)) // Invoice exists
                {
                    _amazonOrderLogRepository.LogEvent(
                        order.AmazonOrderId,
                        "Incoming Payment #" + rs.Fields.Item(0).Value.ToString() + " already exists in SAP.",
                        nameof(LogEventLevel.Information),
                        "Bast",
                        "DIAPI_Services",
                        StackExtensions.GetCurrentMethod(),
                        "HAL 9000");

                    return(rs.Fields.Item(0).Value.ToString());
                }
                rs = null;

                DIAPI_Objects.Payment                  = (Payments)DIAPI_Objects.Company.GetBusinessObject(BoObjectTypes.oIncomingPayments);
                DIAPI_Objects.Payment.Series           = 12;
                DIAPI_Objects.Payment.CardCode         = cardCode; // Mandatory
                DIAPI_Objects.Payment.CashSum          = 0;        // Mandatory (DocTotal Invoice)
                DIAPI_Objects.Payment.DocDate          = DateTime.Now;
                DIAPI_Objects.Payment.Remarks          = order.AmazonOrderId;
                DIAPI_Objects.Payment.CounterReference = salesOrderNo;

                // Bank Transfer
                DIAPI_Objects.Payment.TransferAccount   = "_SYS00000001076";
                DIAPI_Objects.Payment.TransferDate      = DateTime.Now;
                DIAPI_Objects.Payment.TransferReference = order.AmazonOrderId;

                // if shipping state is CA, use OrderTotal (includes tax and freight).
                if (string.Equals(order.StateOrRegion, "ca", StringComparison.OrdinalIgnoreCase) || string.Equals(order.StateOrRegion, "california", StringComparison.OrdinalIgnoreCase))
                {
                    DIAPI_Objects.Payment.TransferSum = Decimal.ToDouble(order.OrderTotal);
                }
                else // Non-CA, so omit tax. Generate order total from the sum of totalItemPrice + totalShipCost
                {
                    double totalItemPrice = 0, totalShipCost = 0;
                    foreach (var l in order.OrderItems)
                    {
                        totalItemPrice += Decimal.ToDouble(l.ItemPrice);
                        totalShipCost  += Decimal.ToDouble(l.ShippingPrice);
                    }
                    DIAPI_Objects.Payment.TransferSum = totalItemPrice + totalShipCost;
                }

                RetCode = DIAPI_Objects.Payment.Add();

                if (RetCode != 0)
                {
                    DIAPI_Objects.Company.GetLastError(out errCode, out errMsg);

                    _amazonOrderLogRepository.LogEvent(
                        order.AmazonOrderId,
                        errCode + " - " + errMsg + " - Incoming payment was not created.",
                        nameof(LogEventLevel.Critical),
                        "Bast",
                        "DIAPI_Services",
                        StackExtensions.GetCurrentMethod(),
                        "HAL 9000");

                    DocNum = RetCode.ToString(); // return err num
                }
                else
                {
                    // return DocEntry of new payment
                    DIAPI_Objects.Company.GetNewObjectCode(out DocEntry);

                    // NOTE: pass DocEntry to proc to get payment DocNum for log
                    q  = "usp_MarketplaceGetDocNum " + DocEntry + ", 'Pmt'";
                    rs = (Recordset)DIAPI_Objects.Company.GetBusinessObject(BoObjectTypes.BoRecordset);
                    rs.DoQuery(q);
                    if (!(rs.EoF))
                    {
                        DocNum = rs.Fields.Item(0).Value.ToString();
                    }

                    _amazonOrderLogRepository.LogEvent(
                        order.AmazonOrderId,
                        String.Format("Incoming Payment {0} was created.", DocNum),
                        nameof(LogEventLevel.Information),
                        "Bast",
                        "DIAPI_Services",
                        StackExtensions.GetCurrentMethod(),
                        "HAL 9000");

                    rs = null;
                }

                _unitOfWorkMarketplace.Commit();

                return(DocNum);
            }
            catch (Exception ex)
            {
                _amazonOrderLogRepository.LogEvent(
                    order.AmazonOrderId,
                    ex.GetType().Name + " - " + ex.Message + " - Incoming payment was not created.",
                    nameof(LogEventLevel.Critical),
                    "Bast",
                    "DIAPI_Services",
                    StackExtensions.GetCurrentMethod(),
                    "HAL 9000");

                return("-1"); // error
            }
        }
        /// <summary>
        /// Create SAP Sales Order
        /// </summary>
        /// <param name="cardCode">The CardCode for the BP.</param>
        /// <param name="o">The Amazon order object</param>
        /// <returns>Dictionary with DocEntry and DocNum of the sales order.</returns>
        public Dictionary <string, string> CreateSalesOrder(string cardCode, AmazonOrder o)
        {
            double totalItemPrice = 0, totalItemTax = 0, totalShipCost = 0, totalShipTax = 0;
            string DocEntry = null, q;
            int    DocNum = 0;
            Dictionary <string, string> SalesOrderNums = new Dictionary <string, string>();
            Recordset rs;

            try
            {
                // If sales order exists with AmzOrderId, log and return
                q  = "usp_MarketplaceGetOrderDocNumByAmazonOrderID '" + o.AmazonOrderId + "'";
                rs = (Recordset)DIAPI_Objects.Company.GetBusinessObject(BoObjectTypes.BoRecordset);
                rs.DoQuery(q);
                if (!(rs.EoF)) // sales order exists
                {
                    _amazonOrderLogRepository.LogEvent(
                        o.AmazonOrderId,
                        "Invoice #" + rs.Fields.Item(0).Value.ToString() + " already exists in SAP.",
                        nameof(LogEventLevel.Warning),
                        "Bast",
                        "DIAPI_Services",
                        StackExtensions.GetCurrentMethod(),
                        "HAL 9000");

                    SalesOrderNums.Add("DocNum", rs.Fields.Item(0).Value.ToString());
                    SalesOrderNums.Add("DocEntry", rs.Fields.Item(1).Value.ToString());

                    // Check if sales order total matches Amazon order total
                    var validInvTotal = Decimal.TryParse(rs.Fields.Item(2).Value.ToString(), out decimal invTotal);
                    if (Decimal.Compare(invTotal, o.OrderTotal) != 0)
                    {
                        bool shipToWA = false;
                        if (o.StateOrRegion == "WA" || o.StateOrRegion == "Washington")
                        {
                            shipToWA = true;
                        }

                        _amazonOrderLogRepository.LogEvent(
                            o.AmazonOrderId,
                            (shipToWA ? "Shipped to WA: " : "") + "Sales order total $" + invTotal.ToString() + " doesn't equal Amazon-order total of $" + o.OrderTotal.ToString() + ". Please verify that this isn't an error.",
                            nameof(LogEventLevel.Warning),
                            "Bast",
                            "DIAPI_Services",
                            StackExtensions.GetCurrentMethod(),
                            "HAL 9000");
                    }

                    _unitOfWorkMarketplace.Commit();

                    return(SalesOrderNums);
                }
                rs = null;

                DIAPI_Objects.Order                 = (Documents)DIAPI_Objects.Company.GetBusinessObject(BoObjectTypes.oOrders);
                DIAPI_Objects.Order.CardCode        = cardCode;
                DIAPI_Objects.Order.NumAtCard       = o.AmazonOrderId.Trim();
                DIAPI_Objects.Order.HandWritten     = BoYesNoEnum.tNO;
                DIAPI_Objects.Order.DocDate         = DateTime.Now;
                DIAPI_Objects.Order.DocDueDate      = DateTime.Now;
                DIAPI_Objects.Order.DocCurrency     = "$";
                DIAPI_Objects.Order.SalesPersonCode = 68; // Amazon slpcode
                DIAPI_Objects.Order.UserFields.Fields.Item("U_LeadSource").Value = "29";

                // Calculate shipping
                foreach (var l in o.OrderItems)
                {
                    totalShipCost += Decimal.ToDouble(l.ShippingPrice);
                    //totalShipTax += Decimal.ToDouble(l.ShippingTax);
                }

                DIAPI_Objects.Order.Expenses.ExpenseCode = 1;
                DIAPI_Objects.Order.Expenses.LineTotal   = totalShipCost;
                DIAPI_Objects.Order.Expenses.Add();

                bool partFound = false;
                foreach (var line in o.OrderItems)
                {
                    q  = "usp_findPartBySKU '" + line.VendorSKU + "'";
                    rs = (Recordset)DIAPI_Objects.Company.GetBusinessObject(BoObjectTypes.BoRecordset);
                    rs.DoQuery(q);
                    if (!(rs.EoF))
                    {
                        DIAPI_Objects.Order.Lines.ItemCode      = rs.Fields.Item(0).Value.ToString();
                        DIAPI_Objects.Order.Lines.Quantity      = Decimal.ToDouble(line.QuantityOrdered);
                        DIAPI_Objects.Order.Lines.WarehouseCode = "DS1";

                        // Set tax
                        // flag "Shipping to CA, but no sales tax charged"
                        if ((string.Equals(o.StateOrRegion, "ca", StringComparison.OrdinalIgnoreCase) || string.Equals(o.StateOrRegion, "california", StringComparison.OrdinalIgnoreCase)) && line.ItemTax == 0)
                        {
                            DIAPI_Objects.Order.Lines.TaxCode  = "Exempt";
                            DIAPI_Objects.Order.Lines.TaxTotal = 0;

                            _amazonOrderLogRepository.LogEvent(
                                o.AmazonOrderId,
                                "Adding " + line.VendorSKU + " - Shipping address is CA, but no sales tax was charged.",
                                nameof(LogEventLevel.Information),
                                "Bast",
                                "DIAPI_Services",
                                StackExtensions.GetCurrentMethod(),
                                "HAL 9000");
                        }
                        else if (!string.Equals(o.StateOrRegion, "ca", StringComparison.OrdinalIgnoreCase) && !string.Equals(o.StateOrRegion, "california", StringComparison.OrdinalIgnoreCase))
                        {
                            // no tax outside of california
                            DIAPI_Objects.Order.Lines.TaxCode  = "Exempt";
                            DIAPI_Objects.Order.Lines.TaxTotal = 0;
                        }
                        else // California
                        {
                            // Set tax
                            DIAPI_Objects.Order.Lines.TaxCode  = "CA";
                            DIAPI_Objects.Order.Lines.TaxTotal = Decimal.ToDouble(line.ItemTax);
                        }

                        totalItemPrice += Decimal.ToDouble(line.ItemPrice); // add ItemPrice to total

                        // Amazon ItemPrice = Quantity * ItemPrice
                        DIAPI_Objects.Order.Lines.LineTotal = Decimal.ToDouble(line.ItemPrice);
                        DIAPI_Objects.Order.Lines.Add();

                        partFound = true;

                        _amazonOrderLogRepository.LogEvent(
                            o.AmazonOrderId,
                            String.Format("{0} was added to sales order", line.VendorSKU),
                            nameof(LogEventLevel.Information),
                            "Bast",
                            "DIAPI_Services",
                            StackExtensions.GetCurrentMethod(),
                            "HAL 9000");
                    }
                    else // SKU not found
                    {
                        // update return Dictionary with 'ActionRequired' flag
                        if (!SalesOrderNums.ContainsKey("ActionRequired"))
                        {
                            SalesOrderNums.Add("ActionRequired", "true");
                        }
                        else
                        {
                            SalesOrderNums["ActionRequired"] = "true";
                        }

                        _amazonOrderLogRepository.LogEvent(
                            o.AmazonOrderId,
                            String.Format("{0} was not found. Please add manually", line.VendorSKU),
                            nameof(LogEventLevel.Error),
                            "Bast",
                            "DIAPI_Services",
                            StackExtensions.GetCurrentMethod(),
                            "HAL 9000");
                    }
                }
                rs = null;

                if (!partFound)
                {
                    DIAPI_Objects.Order.Lines.ItemCode        = "PLCHLDR";
                    DIAPI_Objects.Order.Lines.ItemDescription = "Placeholder";
                    DIAPI_Objects.Order.Lines.Quantity        = 1;
                    DIAPI_Objects.Order.Lines.UnitPrice       = 0;
                    DIAPI_Objects.Order.Lines.Add();

                    _amazonOrderLogRepository.LogEvent(
                        o.AmazonOrderId,
                        "Unable to find SKUs for sales order, so a placeholder was added.",
                        nameof(LogEventLevel.Error),
                        "Bast",
                        "DIAPI_Services",
                        StackExtensions.GetCurrentMethod(),
                        "HAL 9000");
                }

                // Override OrderTotal
                // if shipping state is not CA, ignore tax and generate order total from the sum of all totalItemPrice + totalShipCost
                if (string.Equals(o.StateOrRegion, "ca", StringComparison.OrdinalIgnoreCase) || string.Equals(o.StateOrRegion, "california", StringComparison.OrdinalIgnoreCase))
                {
                    DIAPI_Objects.Order.DocTotal = Decimal.ToDouble(o.OrderTotal);
                }
                else
                {
                    DIAPI_Objects.Order.DocTotal = totalItemPrice + totalShipCost;
                }

                RetCode = DIAPI_Objects.Order.Add();

                if (RetCode != 0)
                {
                    DIAPI_Objects.Company.GetLastError(out errCode, out errMsg);

                    _amazonOrderLogRepository.LogEvent(
                        o.AmazonOrderId,
                        errCode + " - " + errMsg + " - Sales order was not created.",
                        nameof(LogEventLevel.Critical),
                        "Bast",
                        "DIAPI_Services",
                        StackExtensions.GetCurrentMethod(),
                        "HAL 9000");

                    if (!SalesOrderNums.ContainsKey("ActionRequired"))
                    {
                        SalesOrderNums.Add("ActionRequired", "true");
                    }
                    else
                    {
                        SalesOrderNums["ActionRequired"] = "true";
                    }

                    DocEntry = RetCode.ToString(); // return err num
                }
                else
                {
                    // return DocEntry of new Invoice
                    DIAPI_Objects.Company.GetNewObjectCode(out DocEntry);

                    // NOTE: pass DocEntry to proc to get sales-order DocNum for log, but return DocEntry
                    q  = "usp_MarketplaceGetDocNum " + DocEntry + ", 'SO'";
                    rs = (Recordset)DIAPI_Objects.Company.GetBusinessObject(BoObjectTypes.BoRecordset);
                    rs.DoQuery(q);
                    if (!(rs.EoF))
                    {
                        DocNum = Convert.ToInt32(rs.Fields.Item(0).Value);
                    }

                    SalesOrderNums.Add("DocEntry", DocEntry);
                    SalesOrderNums.Add("DocNum", DocNum.ToString());

                    _amazonOrderLogRepository.LogEvent(
                        o.AmazonOrderId,
                        String.Format("Sales order {0} was created. Please verify addresses, pricing, warehouses and shipping.", DocNum),
                        nameof(LogEventLevel.Information),
                        "Bast",
                        "DIAPI_Services",
                        StackExtensions.GetCurrentMethod(),
                        "HAL 9000");

                    rs = null;
                }

                _unitOfWorkMarketplace.Commit();

                // return Dictionary with sales-order DocNum and DocEntry
                return(SalesOrderNums);
            }
            catch (Exception ex)
            {
                _amazonOrderLogRepository.LogEvent(
                    o.AmazonOrderId,
                    String.Format("{0} - Sales order was not created.", ex.GetType().Name + " - " + ex.Message),
                    nameof(LogEventLevel.Critical),
                    "Bast",
                    "DIAPI_Services",
                    StackExtensions.GetCurrentMethod(),
                    "HAL 9000");

                if (!SalesOrderNums.ContainsKey("ActionRequired"))
                {
                    SalesOrderNums.Add("ActionRequired", "true");
                }
                else
                {
                    SalesOrderNums["ActionRequired"] = "true";
                }

                rs = null;

                return(SalesOrderNums);
            }
        }