Sure.
This is a custom API response. The "Non-MAIB" code (which just adds without updating) works fine, it's the "MAIB" code producing the error above ...
- Code: Select all
[Authenticate]
public SalesOrderLinesResponse Post(SalesOrderLinesRequest request)
{
var manager = this.SessionAs<JiwaFinancials.Jiwa.JiwaServiceModel.JiwaAuthUserSession>().Manager;
var pendingOrders = GetPendingOrders(manager);
var response = new SalesOrderLinesResponse();
foreach (var orderLine in request.SalesOrderLines.OrderBy(x => x.DebtorCode).ThenBy(x => x.Reference).ToArray())
{
var errors = new List<string>();
// Parameter validation trimmed for clarity
string invoiceNo = null;
if (!errors.Any() && debtorRec != null)
{
if (orderLine.DebtorCode == "MAIB")
{
var wrapper = pendingOrders.FirstOrDefault(x => x.DebtorID == debtorRec.DebtorID && x.ClientNameMatch(orderLine.ClientName) && x.ClaimNumberMatch(orderLine.ClaimNumber) && x.EndDate == orderLine.EndDate && x.DescriptionMatch(orderLine.Description));
if (wrapper == null) { wrapper = new SalesOrderWrapper(CreateNewSalesOrder(manager, debtorRec.DebtorID, orderLine)); pendingOrders.Add(wrapper); }
invoiceNo = wrapper.SalesOrder.InvoiceNo;
var price = orderLine.UnitPrice ?? 0;
if (orderLine.Gst ?? false) price = Math.Round(price * 1.1m, 2);
var salesOrderLine = (from SalesOrderLine line in wrapper.SalesOrder.SalesOrderLines select line).FirstOrDefault(x => x.Description.Contains(" - Week " + orderLine.WeekNo + " - ") && x.PriceIncGST == price);
if (salesOrderLine == null) AddMaibSalesOrderLines(manager, orderLine, wrapper.SalesOrder);
wrapper.SalesOrder.Read(wrapper.SalesOrder.InvoiceID);
salesOrderLine = (from SalesOrderLine line in wrapper.SalesOrder.SalesOrderLines select line).FirstOrDefault(x => x.Description.Contains(" - Week " + orderLine.WeekNo + " - ") && x.PriceIncGST == price);
if (salesOrderLine == null) { errors.Add("Untrapped error: Cannot find 'Week " + orderLine.WeekNo + "', Price:" + price + " in MAIB sales order " + wrapper.SalesOrder.OrderNo); continue; }
salesOrderLine.QuantityOrdered += orderLine.Quantity ?? 0;
wrapper.SalesOrder.Save();
}
else
{
var wrapper = pendingOrders.FirstOrDefault(x => x.DebtorID == debtorRec.DebtorID && x.Reference == orderLine.Reference);
if (wrapper == null) { wrapper = new SalesOrderWrapper(CreateNewSalesOrder(manager, debtorRec.DebtorID, orderLine)); pendingOrders.Add(wrapper); }
invoiceNo = wrapper.SalesOrder.InvoiceNo;
var error = AddSalesOrderLine(manager, orderLine, wrapper.SalesOrder);
if (error != null) errors.Add(error);
}
}
response.SalesOrderLines.Add(new SalesOrderLineResponse(orderLine, invoiceNo, errors));
}
return response;
}
I should also add, that I'm seeing a SOE with the qty of one of the lines updated once ... so it seems the code works on the first iteration, but when the same salesOrderLine is re-processed to further amend the qty, it fails.
Note that I can't pre-process these quantities and then just add a SOE with final quantities, as this process (amending the quantities) occurs over multiple API transactions over time.
Cheers,
Neil