Skip to content

Commit c459f18

Browse files
authored
Merge pull request #364 from dave-sewell/VendorOrders2
Add VendorOrders getPurchaseOrdersStatus function.
2 parents a9cf36d + cd90c46 commit c459f18

20 files changed

+1568
-23
lines changed
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
using FikaAmazonAPI.Utils;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using FikaAmazonAPI.AmazonSpApiSDK.Models.VendorOrders;
8+
using FikaAmazonAPI.Parameter.VendorOrders;
9+
using System.Data;
10+
using Constants = FikaAmazonAPI.AmazonSpApiSDK.Models.VendorOrders.Constants;
11+
12+
namespace FikaAmazonAPI.SampleCode
13+
{
14+
public class VendorOrdersSample
15+
{
16+
AmazonConnection amazonConnection;
17+
18+
public VendorOrdersSample(AmazonConnection amazonConnection)
19+
{
20+
this.amazonConnection = amazonConnection;
21+
}
22+
23+
public void LoadNewPurchaseOrders()
24+
{
25+
// Load all new purchase orders not yet acknowledged.
26+
ParameterVendorOrdersGetPurchaseOrders filter = new ParameterVendorOrdersGetPurchaseOrders();
27+
filter.purchaseOrderState = Constants.PurchaseOrderState.New;
28+
LoadPurchaseOrders(filter);
29+
}
30+
31+
public void LoadPurchaseOrdersChangedAfter(DateTime changedAfter)
32+
{
33+
// Load all purchase orders changed after a certain date.
34+
ParameterVendorOrdersGetPurchaseOrders filter = new ParameterVendorOrdersGetPurchaseOrders();
35+
filter.changedAfter = changedAfter;
36+
LoadPurchaseOrders(filter);
37+
}
38+
39+
void LoadAcknowledgedPurchaseOrders()
40+
{
41+
// Load all purchase orders acknowledged but not closed.
42+
ParameterVendorOrdersGetPurchaseOrders filter = new ParameterVendorOrdersGetPurchaseOrders();
43+
filter.limit = 100;
44+
filter.purchaseOrderState = Constants.PurchaseOrderState.Acknowledged;
45+
LoadPurchaseOrders(filter);
46+
}
47+
48+
private void LoadPurchaseOrders(ParameterVendorOrdersGetPurchaseOrders filter)
49+
{
50+
var orders = amazonConnection.VendorOrders.GetPurchaseOrders(filter);
51+
foreach (var order in orders)
52+
{
53+
OrderDetails details = order.OrderDetails;
54+
/* _log.LogInformation("PO {0}, {1}, date {2}, changed = {3}, stateChanged = {4}, buyer {5}, seller {6}, shipTo {7}, billTo {8}, shipStart {9}, shipEnd = {10}",
55+
order.PurchaseOrderNumber, order.PurchaseOrderState, details.PurchaseOrderDate, details.PurchaseOrderChangedDate, details.PurchaseOrderStateChangedDate,
56+
details.BuyingParty.PartyId, details.SellingParty.PartyId, details.ShipToParty.PartyId, details.BillToParty.PartyId, details.ShipWindow.StartDate, details.ShipWindow.EndDate); */
57+
}
58+
}
59+
60+
public void LoadPurchaseOrdersWithStatusUpdates(DateTime? updatedAfter)
61+
{
62+
ParameterVendorOrdersGetPurchaseOrdersStatus filter = new ParameterVendorOrdersGetPurchaseOrdersStatus();
63+
filter.purchaseOrderStatus = Constants.PurchaseOrderStatus.OPEN;
64+
if (updatedAfter.HasValue)
65+
{
66+
filter.updatedAfter = updatedAfter;
67+
}
68+
var ordersStatus = amazonConnection.VendorOrders.GetPurchaseOrdersStatus(filter);
69+
foreach (OrderStatus orderStatus in ordersStatus)
70+
{
71+
/* _log.LogInformation("PO {0}, status {1}, poDate {2}, lastUpdatedDate {3}, seller {4}, shipTo {5}",
72+
orderStatus.PurchaseOrderNumber, orderStatus.PurchaseOrderStatus, orderStatus.PurchaseOrderDate, orderStatus.LastUpdatedDate, orderStatus.SellingParty.PartyId, orderStatus.ShipToParty.PartyId); */
73+
List<OrderItemStatus> items = orderStatus.ItemStatus;
74+
foreach (OrderItemStatus item in items)
75+
{
76+
foreach(OrderedQuantityDetails oqd in item.OrderedQuantity.OrderedQuantityDetails)
77+
{
78+
}
79+
if (item.AcknowledgementStatus.AcknowledgementStatusDetails != null)
80+
{
81+
foreach (AcknowledgementStatusDetails asd in item.AcknowledgementStatus.AcknowledgementStatusDetails)
82+
{
83+
}
84+
}
85+
/* _log.LogDebug("{0}: ASIN {1}, Sku {2}, cost {3}, list {4}, ordered {5} {6}, status {7}, accepted {8}, rejected {9} {10}, receiveStatus {11}, receivedQuantity {12}, lastReceive {13}",
86+
item.ItemSequenceNumber, item.BuyerProductIdentifier, item.VendorProductIdentifier, item.NetCost.Amount, item.ListPrice.Amount,
87+
item.OrderedQuantity.OrderedQuantity.Amount, details.ToString(),
88+
item.AcknowledgementStatus.ConfirmationStatus,
89+
item.AcknowledgementStatus.AcceptedQuantity != null ? item.AcknowledgementStatus.AcceptedQuantity.Amount : 0,
90+
item.AcknowledgementStatus.RejectedQuantity != null ? item.AcknowledgementStatus.RejectedQuantity.Amount : 0, ackDetails.ToString(),
91+
item.ReceivingStatus.ReceiveStatus, item.ReceivingStatus.ReceivedQuantity != null ? item.ReceivingStatus.ReceivedQuantity.Amount : 0,
92+
item.ReceivingStatus.LastReceiveDate); */
93+
}
94+
}
95+
}
96+
97+
public void LoadPurchaseOrder(string poNumber)
98+
{
99+
var order = amazonConnection.VendorOrders.GetPurchaseOrder(poNumber);
100+
}
101+
102+
public void AcknowledgePo(string poNumber, NewPo newPo)
103+
{
104+
// Acknowledge PO specified. Assumes details of which items to accept and which to reject have already been constructed in the NewPo object.
105+
SubmitAcknowledgementRequest request = new SubmitAcknowledgementRequest();
106+
request.Acknowledgements = new List<OrderAcknowledgement>();
107+
OrderAcknowledgement acknowledgement = new OrderAcknowledgement();
108+
acknowledgement.PurchaseOrderNumber = poNumber;
109+
PartyIdentification sellingParty = new PartyIdentification();
110+
sellingParty.PartyId = "XXXX";
111+
acknowledgement.SellingParty = sellingParty;
112+
acknowledgement.AcknowledgementDate = DateTime.UtcNow;
113+
acknowledgement.Items = new List<OrderAcknowledgementItem>();
114+
foreach (KeyValuePair<string, PoItem> kvp in newPo.PoItems)
115+
{
116+
string sku = kvp.Key;
117+
PoItem poItem = kvp.Value;
118+
bool obsolete = poItem.Obsolete;
119+
OrderAcknowledgementItem item = new OrderAcknowledgementItem();
120+
item.ItemAcknowledgements = new List<OrderItemAcknowledgement>();
121+
item.ItemSequenceNumber = "";
122+
item.AmazonProductIdentifier = poItem.AmazonAsin;
123+
item.VendorProductIdentifier = sku;
124+
item.NetCost = new FikaAmazonAPI.AmazonSpApiSDK.Models.ListingsItems.Money("USD", poItem.AcceptedPrice.ToString());
125+
item.ListPrice = new FikaAmazonAPI.AmazonSpApiSDK.Models.ListingsItems.Money("USD", poItem.ListPrice.ToString());
126+
item.DiscountMultiplier = "";
127+
ItemQuantity orderedQuantity = new ItemQuantity();
128+
orderedQuantity.Amount = poItem.QuantityOrdered;
129+
orderedQuantity.UnitOfMeasure = ItemQuantity.UnitOfMeasureEnum.Eaches;
130+
item.OrderedQuantity = orderedQuantity;
131+
OrderItemAcknowledgement itemAcknowledgement = new OrderItemAcknowledgement();
132+
itemAcknowledgement.AcknowledgementCode = poItem.QuantityConfirmed > 0 ? AcknowledgementCode.Accepted : AcknowledgementCode.Rejected;
133+
ItemQuantity acknowledgeQuantity = new ItemQuantity();
134+
acknowledgeQuantity.Amount = poItem.QuantityConfirmed;
135+
acknowledgeQuantity.UnitOfMeasure = ItemQuantity.UnitOfMeasureEnum.Eaches;
136+
itemAcknowledgement.AcknowledgedQuantity = acknowledgeQuantity;
137+
if (poItem.QuantityConfirmed == 0)
138+
{
139+
itemAcknowledgement.RejectionReason = obsolete ? RejectionReason.ObsoleteProduct : RejectionReason.TemporarilyUnavailable;
140+
}
141+
item.ItemAcknowledgements.Add(itemAcknowledgement);
142+
acknowledgement.Items.Add(item);
143+
}
144+
request.Acknowledgements.Add(acknowledgement);
145+
var transactionId = amazonConnection.VendorOrders.SubmitAcknowledgement(request);
146+
}
147+
148+
149+
150+
public class NewPo
151+
{
152+
public NewPo(DateTime orderDate, DateOnly shipWindowStartDate, DateOnly shipWindowEndDate, string fulfillmentCenter, bool fcKnown)
153+
{
154+
OrderDate = orderDate;
155+
ShipWindowStartDate = shipWindowStartDate;
156+
ShipWindowEndDate = shipWindowEndDate;
157+
FulfillmentCenter = fulfillmentCenter;
158+
FcKnown = fcKnown;
159+
PoItems = new Dictionary<string, PoItem>();
160+
}
161+
public DateTime OrderDate { get; set; }
162+
public DateOnly ShipWindowStartDate { get; set; }
163+
public DateOnly ShipWindowEndDate { get; set; }
164+
public string FulfillmentCenter { get; set; }
165+
public bool FcKnown { get; set; }
166+
public Dictionary<string, PoItem> PoItems { get; set; }
167+
public bool IsFutureOrder
168+
{
169+
get
170+
{
171+
bool isFutureOrder = false;
172+
if (ShipWindowStartDate >= DateOnly.FromDateTime(DateTime.UtcNow.AddDays(7)))
173+
{
174+
isFutureOrder = true;
175+
}
176+
return isFutureOrder;
177+
}
178+
}
179+
}
180+
181+
public class PoItem
182+
{
183+
public PoItem(string amazonAsin, int quantityOrdered, decimal acceptedPrice, decimal listPrice)
184+
{
185+
AmazonAsin = amazonAsin;
186+
QuantityOrdered = quantityOrdered;
187+
AcceptedPrice = acceptedPrice;
188+
ListPrice = listPrice;
189+
}
190+
public string AmazonAsin { get; set; }
191+
public int QuantityOrdered { get; set; }
192+
public decimal AcceptedPrice { get; set; }
193+
public decimal ListPrice { get; set; }
194+
public int QuantityConfirmed { get; set; }
195+
public bool Obsolete { get; set; } // Is this item obsolete (i.e. we don't sell it to Vendor Central anymore)?
196+
}
197+
198+
199+
200+
}
201+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
using System;
2+
using System.Text;
3+
using System.Collections.Generic;
4+
using System.Runtime.Serialization;
5+
using Newtonsoft.Json;
6+
using System.ComponentModel.DataAnnotations;
7+
8+
namespace FikaAmazonAPI.AmazonSpApiSDK.Models.VendorOrders
9+
{
10+
[DataContract]
11+
public partial class AcknowledgementStatusDetails : IEquatable<AcknowledgementStatusDetails>, IValidatableObject
12+
{
13+
[JsonConstructorAttribute]
14+
public AcknowledgementStatusDetails() { }
15+
public AcknowledgementStatusDetails(DateTime? acknowledgementDate = default(DateTime?), ItemQuantity acceptedQuantity = default(ItemQuantity), ItemQuantity rejectedQuantity = default(ItemQuantity))
16+
{
17+
this.AcknowledgementDate = acknowledgementDate;
18+
this.AcceptedQuantity = acceptedQuantity;
19+
this.RejectedQuantity = rejectedQuantity;
20+
}
21+
22+
[DataMember(Name = "acknowledgementDate", EmitDefaultValue = false)]
23+
public DateTime? AcknowledgementDate { get; set; }
24+
25+
[DataMember(Name = "acceptedQuantity", EmitDefaultValue = false)]
26+
public ItemQuantity AcceptedQuantity { get; set; }
27+
28+
[DataMember(Name = "rejectedQuantity", EmitDefaultValue = false)]
29+
public ItemQuantity RejectedQuantity { get; set; }
30+
31+
32+
/// <summary>
33+
/// Returns the string presentation of the object
34+
/// </summary>
35+
/// <returns>String presentation of the object</returns>
36+
public override string ToString()
37+
{
38+
var sb = new StringBuilder();
39+
sb.Append("class AcknowledgementStatusDetails {\n");
40+
sb.Append(" AcknowledgementDate: ").Append(AcknowledgementDate).Append("\n");
41+
sb.Append(" AcceptedQuantity: ").Append(AcceptedQuantity).Append("\n");
42+
sb.Append(" RejectedQuantity: ").Append(RejectedQuantity).Append("\n");
43+
sb.Append("}\n");
44+
return sb.ToString();
45+
}
46+
47+
/// <summary>
48+
/// Returns the JSON string presentation of the object
49+
/// </summary>
50+
/// <returns>JSON string presentation of the object</returns>
51+
public virtual string ToJson()
52+
{
53+
return JsonConvert.SerializeObject(this, Formatting.Indented);
54+
}
55+
56+
/// <summary>
57+
/// Returns true if objects are equal
58+
/// </summary>
59+
/// <param name="input">Object to be compared</param>
60+
/// <returns>Boolean</returns>
61+
public override bool Equals(object input)
62+
{
63+
return this.Equals(input as AcknowledgementStatusDetails);
64+
}
65+
66+
/// <summary>
67+
/// Returns true if ItemQuantity instances are equal
68+
/// </summary>
69+
/// <param name="input">Instance of ItemQuantity to be compared</param>
70+
/// <returns>Boolean</returns>
71+
public bool Equals(AcknowledgementStatusDetails input)
72+
{
73+
if (input == null)
74+
return false;
75+
76+
return
77+
(
78+
this.AcknowledgementDate == input.AcknowledgementDate ||
79+
(this.AcknowledgementDate != null &&
80+
this.AcknowledgementDate.Equals(input.AcknowledgementDate))
81+
) &&
82+
(
83+
this.AcceptedQuantity == input.AcceptedQuantity ||
84+
(this.AcceptedQuantity != null &&
85+
this.AcceptedQuantity.Equals(input.AcceptedQuantity))
86+
) &&
87+
(
88+
this.RejectedQuantity == input.RejectedQuantity ||
89+
(this.RejectedQuantity != null &&
90+
this.RejectedQuantity.Equals(input.RejectedQuantity))
91+
);
92+
}
93+
94+
/// <summary>
95+
/// Gets the hash code
96+
/// </summary>
97+
/// <returns>Hash code</returns>
98+
public override int GetHashCode()
99+
{
100+
unchecked // Overflow is fine, just wrap
101+
{
102+
int hashCode = 41;
103+
if (this.AcknowledgementDate != null)
104+
hashCode = hashCode * 59 + this.AcknowledgementDate.GetHashCode();
105+
if (this.AcceptedQuantity != null)
106+
hashCode = hashCode * 59 + this.AcceptedQuantity.GetHashCode();
107+
if (this.RejectedQuantity != null)
108+
hashCode = hashCode * 59 + this.RejectedQuantity.GetHashCode();
109+
return hashCode;
110+
}
111+
}
112+
113+
/// <summary>
114+
/// To validate all properties of the instance
115+
/// </summary>
116+
/// <param name="validationContext">Validation context</param>
117+
/// <returns>Validation Result</returns>
118+
IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
119+
{
120+
yield break;
121+
}
122+
}
123+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using Newtonsoft.Json;
2+
using Newtonsoft.Json.Converters;
3+
using System.Runtime.Serialization;
4+
5+
namespace FikaAmazonAPI.AmazonSpApiSDK.Models.VendorOrders
6+
{
7+
public class Constants
8+
{
9+
[JsonConverter(typeof(StringEnumConverter))]
10+
public enum PoItemState
11+
{
12+
Cancelled
13+
}
14+
15+
[JsonConverter(typeof(StringEnumConverter))]
16+
public enum PurchaseOrderState
17+
{
18+
New,
19+
Acknowledged,
20+
Closed
21+
}
22+
23+
[JsonConverter(typeof(StringEnumConverter))]
24+
public enum PurchaseOrderStatus
25+
{
26+
OPEN,
27+
CLOSED
28+
}
29+
30+
[JsonConverter(typeof(StringEnumConverter))]
31+
public enum ItemConfirmationStatus
32+
{
33+
ACCEPTED,
34+
PARTIALLY_ACCEPTED,
35+
REJECTED,
36+
UNCONFIRMED
37+
}
38+
39+
[JsonConverter(typeof(StringEnumConverter))]
40+
public enum ItemReceiveStatus
41+
{
42+
NOT_RECEIVED,
43+
PARTIALLY_RECEIVED,
44+
RECEIVED
45+
}
46+
47+
}
48+
}

Source/FikaAmazonAPI/AmazonSpApiSDK/Models/VendorOrders/GetPurchaseOrdersResponse.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
using System.Runtime.Serialization;
1515
using Newtonsoft.Json;
1616
using System.ComponentModel.DataAnnotations;
17-
using FikaAmazonAPI.AmazonSpApiSDK.Models.Authorization;
1817

1918
namespace FikaAmazonAPI.AmazonSpApiSDK.Models.VendorOrders
2019
{
@@ -59,7 +58,7 @@ public GetPurchaseOrdersResponse()
5958
public override string ToString()
6059
{
6160
var sb = new StringBuilder();
62-
sb.Append("class GetOrderResponse {\n");
61+
sb.Append("class GetPurchaseOrdersResponse {\n");
6362
sb.Append(" Payload: ").Append(Payload).Append("\n");
6463
sb.Append(" Errors: ").Append(Errors).Append("\n");
6564
sb.Append("}\n");

0 commit comments

Comments
 (0)