Hey Guys, fairly knew to navision, having a very hard time getting this job queue to run properly
The issue is in relation to an external amazon mws merchant fulfillment api
I get the following error:
Microsoft Dynamics NAV Server attempted to issue a client callback to create an Automation object: e8c66249-fcb1-4160-9a97-bbcecbcef34c (CodeUnit 50035 Automatic Amazon Connector). Client callbacks are not supported on Microsoft Dynamics NAV Server.
What I've tried:
Logging in as the nav service account, running the job manually and and selecting "always allow" for each of the prompts. Besides that no forms are popping up so im not sure why its getting stuck. All of this works perfectly in Nav 2009
These are the components nav asked for permission to access:
AmazonConnector.Connector
AmazonConnector.amz.AmzShipmentRequestDetails
AmazonConnector.amz.AmzPackageDimensions
AmazonConnector.amz.AmzWeight
AmazonConnector.amz.AmzAddress
AmazonConnector.amz.AmzShippingServiceOptions
AmazonConnector.amz.AmzItem
Here's the code, put it in blue so its easier to read:
OnRun(VAR Rec : Record "Job Queue Entry")
GetAmazonOrder;
GetAmazonOrder()
SalesHeader.RESET;
SalesHeader.SETRANGE("Document Type",SalesHeader."Document Type"::Order);
SalesHeader.SETRANGE("Shipping Agent Code",'AMAZON');
SalesHeader.SETRANGE("E-Ship Agent Service",'PRIME');
SalesHeader.SETRANGE(Status,SalesHeader.Status::Released);
IF SalesHeader.FINDSET THEN BEGIN
REPEAT
AmazonShippingDetails.SETRANGE("Sales Order No.",SalesHeader."No.");
AmazonShippingDetails.SETRANGE(Status,AmazonShippingDetails.Status::Shipped);
IF NOT AmazonShippingDetails.FINDFIRST THEN BEGIN
IF CheckRegiPicks(SalesHeader."No.") THEN BEGIN
EntryNo := 0;
IF AmazonShippingDetails2.FINDLAST THEN
EntryNo := AmazonShippingDetails2."Entry No." + 1
ELSE
EntryNo := 1;
AmazonShippingDetails_GL.RESET;
AmazonShippingDetails_GL.INIT;
AmazonShippingDetails_GL."Entry No." := EntryNo;
AmazonShippingDetails_GL."Sales Order No.":= SalesHeader."No.";
AmazonShippingDetails_GL.Status := AmazonShippingDetails_GL.Status::" ";
AmazonShippingDetails_GL."External Document No." := SalesHeader."External Document No.";
AmazonShippingDetails_GL."Created Dated" := TODAY;
AmazonShippingDetails_GL."Promised Delivery Date" := SalesHeader."Promised Delivery Date";
AmazonShippingDetails_GL.INSERT;
GetEligibleShippingServices(SalesHeader."No.");
END;
END;
UNTIL SalesHeader.NEXT = 0;
END;
CheckRegiPicks(DocumentNo : Code[20]) : Boolean
SalesLine.RESET;
SalesLine.SETRANGE("Document Type",SalesLine."Document Type"::Order);
SalesLine.SETRANGE("Document No.",DocumentNo);
SalesLine.SETRANGE(Type,SalesLine.Type::Item);
SalesLine.SETRANGE("Drop Shipment",FALSE);
SalesLine.SETFILTER("Quantity Shipped",'<>%1',0);
IF SalesLine.FINDFIRST THEN
EXIT(FALSE);
WarehouseActivityLine.RESET;
WarehouseActivityLine.SETRANGE("Activity Type",WarehouseActivityLine."Activity Type"::Pick);
WarehouseActivityLine.SETRANGE("Source Document",WarehouseActivityLine."Source Document"::"Sales Order");
WarehouseActivityLine.SETRANGE("Source No.",DocumentNo);
IF WarehouseActivityLine.FINDFIRST THEN
EXIT(FALSE);
SalesLine.RESET;
SalesLine.SETRANGE("Document Type",SalesLine."Document Type"::Order);
SalesLine.SETRANGE("Document No.",DocumentNo);
SalesLine.SETRANGE(Type,SalesLine.Type::Item);
SalesLine.SETRANGE("Drop Shipment",FALSE);
IF SalesLine.FINDFIRST THEN REPEAT
ShipmentQty := 0;
PickedQty := 0;
WarehouseShipmentLine.RESET;
WarehouseShipmentLine.SETRANGE("Source Document",WarehouseShipmentLine."Source Document"::"Sales Order");
WarehouseShipmentLine.SETRANGE("Source No.",SalesLine."Document No.");
WarehouseShipmentLine.SETRANGE("Source Line No.",SalesLine."Line No.");
WarehouseShipmentLine.SETRANGE("Item No.",SalesLine."No.");
IF WarehouseShipmentLine.FINDFIRST THEN BEGIN
REPEAT
ShipmentQty += WarehouseShipmentLine."Qty. (Base)";
RegisteredWhseActivityLine.RESET;
RegisteredWhseActivityLine.SETRANGE("Activity Type",RegisteredWhseActivityLine."Activity Type"::Pick);
RegisteredWhseActivityLine.SETRANGE("Whse. Document Type",RegisteredWhseActivityLine."Whse. Document Type"::Shipment);
RegisteredWhseActivityLine.SETRANGE("Whse. Document No.",WarehouseShipmentLine."No.");
RegisteredWhseActivityLine.SETRANGE("Whse. Document Line No.",WarehouseShipmentLine."Line No.");
RegisteredWhseActivityLine.SETRANGE("Item No.",WarehouseShipmentLine."Item No.");
RegisteredWhseActivityLine.SETRANGE("Action Type",RegisteredWhseActivityLine."Action Type"::Take);
IF RegisteredWhseActivityLine.FINDFIRST THEN BEGIN
REPEAT
PickedQty += RegisteredWhseActivityLine.Quantity;
UNTIL RegisteredWhseActivityLine.NEXT=0;
END;
UNTIL WarehouseShipmentLine.NEXT =0;
END;
IF (SalesLine.Quantity <> ShipmentQty) OR (SalesLine.Quantity <> PickedQty) THEN
EXIT(FALSE);
UNTIL SalesLine.NEXT = 0;
EXIT(TRUE);
GetEligibleShippingServices(DocumentNo : Code[20])
CLEAR(conn);
CLEAR(rq);
CLEAR(dim);
CLEAR(weight);
CLEAR(shipFromAddr);
CLEAR(shippingOptions);
CLEAR(declaredValue);
CLEAR(Cost);
CLEAR(result);
CLEAR(errMsg);
CLEAR(resultShipping);
SalesHeader.GET(SalesHeader."Document Type"::Order,DocumentNo);
CreateConnection;
CREATE(rq,FALSE,TRUE);
//[Ok :=] CREATE(Automation [,NewServer] [,OnClient])
GetItemNetWeightAndPrice(DocumentNo);
AmazonOrderID := GetAmazonOrderNoFromSO(DocumentNo,AmazonOrderItemNo,MustArriveByDate);
rq.amazonOrderId := AmazonOrderID;
IF MustArriveByDate <> 0D THEN
// rq.mustArriveByDate := MustArriveByDate; //ZHRP3.28.17.001
rq.mustArriveByDate := MustArriveByDate + 1; //ZHRP3.28.17.001
CREATE(dim,FALSE,TRUE);
dim.height := ShippingSetup."Std. Amazon Pack. Height";
dim.length := ShippingSetup."Std. Amazon Pack. Length";
dim.width := ShippingSetup."Std. Amazon Pack. Width";
dim.unit := 'inches';
rq.packageDimensions := dim;
CREATE(weight,FALSE,TRUE);
weight.unit := 'ounces';
weight.value := AmazonShippingDetails_GL.Weight;
rq.weight := weight;
CREATE(shipFromAddr,FALSE,TRUE);
IF UserSetup.GET(USERID) THEN
IF PackingStation.GET(UserSetup."Packing Station") THEN;
shipFromAddr.name := PackingStation."Ship-from Company";
shipFromAddr.addressLine1 := PackingStation."Ship-from Address";
shipFromAddr.city := PackingStation."Ship-from City";
shipFromAddr.stateOrProvinceCode := PackingStation."Ship-from State";
shipFromAddr.postalCode := PackingStation."Ship-from ZIP Code";
shipFromAddr.countryCode := PackingStation."Ship-from Country Code";
shipFromAddr.email := PackingStation."Ship-from E-Mail";
shipFromAddr.phone := PackingStation."Ship-from Phone No.";
rq.shipFromAddress := shipFromAddr;
CREATE(shippingOptions,FALSE,TRUE);
shippingOptions.deliveryExperience := 'DeliveryConfirmationWithoutSignature';
shippingOptions.carrierWillPickUp := FALSE;
//--> //ZH.3.13.17.001
//CREATE(declaredValue);
//declaredValue.amount := AmazonShippingDetails_GL."Value Price";
//declaredValue.currencyCode := 'USD';
//shippingOptions.declaredValue := declaredValue;
// <-- //ZH.3.13.17.001
rq.shippingServiceOptions := shippingOptions;
SalesLine.RESET;
SalesLine.SETRANGE("Document Type",SalesLine."Document Type"::Order);
SalesLine.SETRANGE("Document No.",DocumentNo);
SalesLine.SETRANGE(Type,SalesLine.Type::Item);
SalesLine.SETRANGE("Drop Shipment",FALSE);
IF SalesLine.FINDSET THEN BEGIN
REPEAT
CREATE(itm,FALSE,TRUE);
AmazonOrderItemNo := SalesLine."Amazon Order Line ID";
IF AmazonOrderItemNo <> '' THEN BEGIN
itm.orderItemId := AmazonOrderItemNo;
itm.quantity := SalesLine.Quantity;
rq.itemListAdd(itm);
END;
CLEAR(itm);
UNTIL SalesLine.NEXT = 0;
END;
result := conn.GetEligibleShippingServices(rq);
errMsg := conn.ErrorMsg;
IF NOT ISCLEAR(errMsg) THEN BEGIN
HandleError(errMsg,DocumentNo);
EXIT;
END;
IF ISCLEAR(result) THEN BEGIN
AmazonShippingDetails_GL.Comment := 'No result';
AmazonShippingDetails_GL.MODIFY;
EXIT;
END;
CREATE(Cost,FALSE,TRUE);
// success
//JEG1711.481 -START
NextOccurrenceNo := 0;
AmazonEligibleServiceOrg.RESET;
AmazonEligibleServiceOrg.SETRANGE("Package No",DocumentNo);
IF AmazonEligibleServiceOrg.FINDLAST THEN
NextOccurrenceNo := AmazonEligibleServiceOrg."Occurrence No." + 1
ELSE
NextOccurrenceNo := 1;
//JEG1711.481 -END
FOR i := 0 TO result.shippingServiceCount-1 DO BEGIN
//JEG1712.481 -START
resultShipping := result.GetShippingService(i);
carrierName := resultShipping.carrierName;
shippingServiceId := resultShipping.shippingServiceId;
shippingServiceName := resultShipping.shippingServiceName;
SkipRecord := FALSE;
IF (carrierName <> '') AND (shippingServiceName <> '') THEN BEGIN
ShippingServDis.RESET;
ShippingServDis.SETRANGE("Carrier Name",carrierName);
ShippingServDis.SETRANGE("Service Name",shippingServiceName);
ShippingServDis.SETRANGE(Disable,TRUE);
IF ShippingServDis.FINDFIRST THEN
SkipRecord := TRUE;
END;
IF carrierName <> '' THEN BEGIN
IF NOT SkipRecord THEN BEGIN
ShippingServDis.RESET;
ShippingServDis.SETRANGE("Carrier Name",carrierName);
ShippingServDis.SETFILTER("Service Name",'%1','');
ShippingServDis.SETRANGE(Disable,TRUE);
IF ShippingServDis.FINDFIRST THEN
SkipRecord := TRUE;
END;
END;
IF NOT SkipRecord THEN BEGIN
{
resultShipping := result.GetShippingService(i);
carrierName := resultShipping.carrierName;
shippingServiceId := resultShipping.shippingServiceId;
shippingServiceName := resultShipping.shippingServiceName;
}
//JEG1712.481 -END
AmazonEligibleService.INIT;
AmazonEligibleService."Package No" := DocumentNo;
AmazonEligibleService."Occurrence No." := NextOccurrenceNo;//JEG1711.481
IF i = 0 THEN
AmazonEligibleService."Line No" := 10000
ELSE
AmazonEligibleService."Line No" += 10000;
AmazonEligibleService."Carrier Name" := carrierName;
AmazonEligibleService."Service Name" := shippingServiceName;
AmazonEligibleService."Service ID" := shippingServiceId;
AmazonEligibleService."Earliest Estimated Delivery On" := resultShipping.earliestEstimatedDeliveryDate;
AmazonEligibleService."Latest Estimated Delivery On" := resultShipping.latestEstimatedDeliveryDate;
Cost := resultShipping.rate;
CostAmount := Cost.amount;
// AmazonEligibleService.Cost := ROUND(CostAmount,2); //ZH32817.001
AmazonEligibleService.Cost := CostAmount; //ZH32817.001
//JEG1711.481 -START
AmazonEligibleService."User ID" := USERID;
AmazonEligibleService."Created On" := TODAY;
AmazonEligibleService."Created At" := TIME;
//JEG1711.481 -END
AmazonEligibleService.INSERT;
//JEG1711.481 -START
AmazonEligibleServiceOrg.RESET;
AmazonEligibleServiceOrg.INIT;
AmazonEligibleServiceOrg.TRANSFERFIELDS(AmazonEligibleService);
AmazonEligibleServiceOrg.INSERT;
//JEG1711.481 -END
END;//JEG1712.481
END;
COMMIT;
AmazonEligibleService.RESET;
AmazonEligibleService.SETCURRENTKEY(AmazonEligibleService.Cost);
AmazonEligibleService.ASCENDING(TRUE);
AmazonEligibleService.SETRANGE("Package No",DocumentNo);
IF AmazonEligibleService.FINDFIRST THEN BEGIN
GEligibleServiceSelected := AmazonEligibleService."Service ID";
//JEG1711.481 -START
AmazonEligibleServiceOrg.RESET;
AmazonEligibleServiceOrg.GET(AmazonEligibleService."Package No",AmazonEligibleService."Occurrence No.",
AmazonEligibleService."Line No");
AmazonEligibleServiceOrg.Selected := TRUE;
AmazonEligibleServiceOrg.MODIFY;
AmazonShippingDetails_GL."Carrier Name" := AmazonEligibleServiceOrg."Carrier Name";
AmazonShippingDetails_GL."Service Name" := AmazonEligibleServiceOrg."Service Name";
AmazonShippingDetails_GL."Service ID" := AmazonEligibleServiceOrg."Service ID";
AmazonShippingDetails_GL.MODIFY;
//JEG1711.481 -END
END;
IF GEligibleServiceSelected <> '' THEN
CreateShipment(DocumentNo)
ELSE BEGIN
AmazonShippingDetails_GL.Comment := 'No Service Found';
AmazonShippingDetails_GL.MODIFY;
END;
CreateConnection()
ShippingSetup.GET;
ShippingSetup.TESTFIELD(ShippingSetup."Amazaon Access Key");
ShippingSetup.TESTFIELD(ShippingSetup."Amazon Secret Key");
ShippingSetup.TESTFIELD(ShippingSetup."Amazon Service URL");
ShippingSetup.TESTFIELD(ShippingSetup."Amazon Seller ID");
ShippingSetup.TESTFIELD(ShippingSetup."Amazon Label File Path");
ShippingSetup.TESTFIELD(ShippingSetup."Amazon Label Path On Server");
ShippingSetup.TESTFIELD(ShippingSetup."Amazon Label Printer Port");
CREATE(conn,FALSE,TRUE);
conn.accessKey := ShippingSetup."Amazaon Access Key";
conn.secretKey := ShippingSetup."Amazon Secret Key";
conn.serviceURL := ShippingSetup."Amazon Service URL";
conn.sellerId := ShippingSetup."Amazon Seller ID";
conn.Init(); //important
GetAmazonOrderNoFromSO(SourceID : Code[20];VAR OrderItem : Code[20];VAR PromiseDeliveryDate : Date) : Code[50]
IF SalesHeader.GET(SalesHeader."Document Type"::Order,SourceID) THEN BEGIN
OrderItem := SalesHeader."Your Reference";
SalesHeader.TESTFIELD("Promised Delivery Date");
PromiseDeliveryDate := SalesHeader."Promised Delivery Date";
EXIT(SalesHeader."External Document No.");
END;
LOCAL HandleError(VAR amzError : Automation "Unknown Automation Server.Unknown Class";DocumentNo : Code[20])
//HandleError
requestId := amzError.requestId;
timeStamp := amzError.timeStamp;
msg := amzError.message;
statusCode := amzError.statusCode;
errorCode := amzError.errorCode;
errorType := amzError.errorType;
//ERROR(
// 'Service Exception:\' +
// ' RequestId: %1\' +
// ' Timestamp: %2\' +
// ' Message: %3\' +
// ' StatusCode: %4\' +
// ' ErrorCode: %5\' +
// ' ErrorType: %6',
// requestId,timeStamp,msg,statusCode,errorCode,errorType);
AmazonShippingDetails_GL.Comment := COPYSTR(STRSUBSTNO('Msg-%1,Status Code-%2,Err Code -%3',msg,statusCode,errorCode),1,250);
AmazonShippingDetails_GL.MODIFY;
COMMIT;
CreateShipment(DocumentNo : Code[20])
CLEAR(result);
CLEAR(errMsg);
CLEAR(Label);
CLEAR(AmzFileContents);
result := conn.CreateShipment(rq,GEligibleServiceSelected,'');
errMsg := conn.ErrorMsg;
IF NOT ISCLEAR(errMsg) THEN BEGIN
HandleError(errMsg,DocumentNo);
EXIT;
END;
IF ISCLEAR(result) THEN BEGIN
AmazonShippingDetails_GL.Comment := 'No result';
AmazonShippingDetails_GL.MODIFY;
EXIT;
END;
CREATE(shipment,FALSE,TRUE);
shipment := result.shipment;
CREATE(Label,FALSE,TRUE);
CREATE(AmzFileContents,FALSE,TRUE);
Label := shipment.label;
AmzFileContents := Label.fileContents;
AmazonShippingDetails_GL.Status := AmazonShippingDetails_GL.Status::Shipped;
AmazonShippingDetails_GL."Amazon Shipping ID" := shipment.shipmentid;
AmazonShippingDetails_GL."External Tracking No." := shipment.trackingId;
AmazonShippingDetails_GL.Label.CREATEINSTREAM(inStr);
AmzFileContents.ContentsToStream(inStr);
AmazonShippingDetails_GL.MODIFY;
COMMIT;
CancelShipment(ShipmentID : Text[50])
//CancelShipment
CreateConnection;
result := conn.CancelShipment(ShipmentID); //package shipment id
errMsg := conn.ErrorMsg;
IF NOT ISCLEAR(errMsg) THEN BEGIN
HandleError(errMsg,'');
EXIT;
END;
IF ISCLEAR(result) THEN
ERROR('No result');
shipment := result.shipment;
MESSAGE('Shipment Canceled.\Shipment id: %1\Tracking id: %2\Amazon order id: %3',
shipment.shipmentid,shipment.trackingId,shipment.amazonOrderId);
PrintPNGFile(PackageNo : Code[20])
printer_lr.SETFILTER(ID,'@*zebra*');
IF NOT printer_lr.FINDFIRST THEN EXIT;
path_lt := ShippingSetup."Amazon Label File Path";
pictureName_lt := PackageNo + '.png';
//JEG1711.481.002 -START
IF CarrierName = 'FEDEX' THEN
pictureName_lt := PackageNo + '.pdf';
//JEG1711.481.002 -END
IF ISCLEAR(WshShell) THEN
CREATE(WshShell,FALSE,TRUE);
WshMode := 1;
WaitForEndOfCommand := TRUE;
//JEG1715.481 -START
IntegerREC.SETRANGE(Number,1);
REPORT.RUNMODAL(50307,FALSE,FALSE,IntegerREC);
IF CarrierName <> 'FEDEX' THEN BEGIN
//JEG1715.481 -END
WshShell.Run(
path_lt + 'i_view32.exe' + ' ' + path_lt + pictureName_lt + ' /print="' + printer_lr.Name + '"',
WshMode,
WaitForEndOfCommand)
//JEG1715.481 -START
END ELSE BEGIN
printer_lr2.SETFILTER(ID,'HP*');
IF NOT printer_lr2.FINDFIRST THEN EXIT;
WshShell.Run(
path_lt + 'i_view32.exe' + ' ' + path_lt + pictureName_lt + ' /print="' + printer_lr2.Name + '"',
WshMode,
WaitForEndOfCommand)
END;
//JEG1715.481 -END
PrintFromPackage(VAR CurrentPackage : Record Package)
AmazonShippingDetails_L.RESET;
AmazonShippingDetails_L.SETRANGE("Sales Order No.",CurrentPackage."Source ID");
AmazonShippingDetails_L.SETRANGE(Status,AmazonShippingDetails_L.Status::Shipped);
IF AmazonShippingDetails_L.FINDLAST THEN BEGIN
CurrentPackage."Amazon Shipping ID" := AmazonShippingDetails_L."Amazon Shipping ID";
CurrentPackage."External Tracking No." :=AmazonShippingDetails_L."External Tracking No.";
CurrentPackage.MODIFY;
AmazonShippingDetails_L."Package No." := CurrentPackage."No.";
AmazonShippingDetails_L.MODIFY;
ShippingSetup.GET;
AmazonLabelPath := ShippingSetup."Amazon Label File Path" + CurrentPackage."No." +
FORMAT(ShippingSetup."Amazon Label Format");
AmazonLabelPathOnServer := ShippingSetup."Amazon Label Path On Server" + CurrentPackage."No." +
FORMAT(ShippingSetup."Amazon Label Format");
//JEG1711.481.002 -START
IF AmazonShippingDetails_L."Carrier Name" = 'FEDEX' THEN BEGIN
AmazonLabelPath := ShippingSetup."Amazon Label File Path" + CurrentPackage."No." + '.pdf'; //RP
// FORMAT(ShippingSetup."Amazon Label Format"::".pdf");
AmazonLabelPathOnServer := ShippingSetup."Amazon Label Path On Server" + CurrentPackage."No." + '.pdf'; //RP
// FORMAT(ShippingSetup."Amazon Label Format"::".pdf");
CarrierName := 'FEDEX';
END
ELSE
CarrierName := '';
//JEG1711.481.002 -END
AmazonShippingDetails_L.CALCFIELDS(Label);
IF AmazonShippingDetails_L.Label.HASVALUE THEN BEGIN
AmazonShippingDetails_L.Label.EXPORT(AmazonLabelPath);
AmazonShippingDetails_L.Label.EXPORT(AmazonLabelPathOnServer);
END;
PrintPNGFile(CurrentPackage."No.");
END;
GetItemNetWeightAndPrice(documentNo : Code[20])
SalesHeader.GET(SalesHeader."Document Type"::Order,documentNo);
IF SalesHeader."Currency Factor" = 0 THEN
SalesHeader."Currency Factor" := 1;
SalesLine.RESET;
SalesLine.SETRANGE("Document Type",SalesLine."Document Type"::Order);
SalesLine.SETRANGE("Document No.",documentNo);
SalesLine.SETRANGE(Type,SalesLine.Type::Item);
SalesLine.SETRANGE("Drop Shipment",FALSE);
IF SalesLine.FINDFIRST THEN BEGIN
REPEAT
IF (SalesLine.Amount > SalesLine."Amount Including VAT") THEN
d := SalesLine.Amount
ELSE
d := SalesLine."Amount Including VAT";
Item.GET(SalesLine."No.");
NetWeight += Item."Net Weight" * SalesLine."Quantity (Base)"*16; // LBS conveted to Ounces
ValuePrice += ROUND(d / SalesHeader."Currency Factor",0.01);
UNTIL SalesLine.NEXT =0 ;
END;
AmazonShippingDetails_GL.Weight := NetWeight;
AmazonShippingDetails_GL."Value Price" := ValuePrice;
AmazonShippingDetails_GL.MODIFY;