From 8125df78d11b6560c172840bf789c431a2dd0ac7 Mon Sep 17 00:00:00 2001 From: Piotr Michalak Date: Fri, 25 Oct 2024 08:41:23 +0200 Subject: [PATCH 1/4] first test --- .../Codeunits/ShpfyRefundsAPI.Codeunit.al | 2 +- .../ShpfyOrderRefundSubs.Codeunit.al | 70 +++++++++++++++++++ .../ShpfyOrderRefundTest.Codeunit.al | 32 +++++++-- .../ShpfyOrderRefundsHelper.Codeunit.al | 11 +++ 4 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundSubs.Codeunit.al diff --git a/Apps/W1/Shopify/app/src/Order Refunds/Codeunits/ShpfyRefundsAPI.Codeunit.al b/Apps/W1/Shopify/app/src/Order Refunds/Codeunits/ShpfyRefundsAPI.Codeunit.al index 6b5b9e943c..3f498cb6d6 100644 --- a/Apps/W1/Shopify/app/src/Order Refunds/Codeunits/ShpfyRefundsAPI.Codeunit.al +++ b/Apps/W1/Shopify/app/src/Order Refunds/Codeunits/ShpfyRefundsAPI.Codeunit.al @@ -101,7 +101,7 @@ codeunit 30228 "Shpfy Refunds API" exit(ReturnsAPI.GetReturnLocations(ReturnId)); end; - local procedure FillInRefundLine(RefundId: BigInteger; JLine: JsonObject; NonZeroOrReturnRefund: Boolean; ReturnLocations: Dictionary of [BigInteger, BigInteger]) + internal procedure FillInRefundLine(RefundId: BigInteger; JLine: JsonObject; NonZeroOrReturnRefund: Boolean; ReturnLocations: Dictionary of [BigInteger, BigInteger]) var DataCapture: Record "Shpfy Data Capture"; RefundLine: Record "Shpfy Refund Line"; diff --git a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundSubs.Codeunit.al b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundSubs.Codeunit.al new file mode 100644 index 0000000000..791604bd22 --- /dev/null +++ b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundSubs.Codeunit.al @@ -0,0 +1,70 @@ +codeunit 139581 "Shpfy Order Refund Subs" +{ + EventSubscriberInstance = Manual; + + var + ShopifyCustomerId: BigInteger; + GQLQueryTxt: Text; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Shpfy Communication Events", 'OnClientSend', '', true, false)] + local procedure OnClientSend(HttpRequestMessage: HttpRequestMessage; var HttpResponseMessage: HttpResponseMessage) + begin + MakeResponse(HttpRequestMessage, HttpResponseMessage); + end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Shpfy Communication Events", 'OnGetContent', '', true, false)] + local procedure OnGetContent(HttpResponseMessage: HttpResponseMessage; var Response: Text) + begin + HttpResponseMessage.Content.ReadAs(Response); + end; + + [EventSubscriber(ObjectType::Codeunit, Codeunit::"Shpfy Customer Events", OnBeforeFindMapping, '', true, false)] + local procedure OnBeforeFindMapping(var Handled: Boolean; var ShopifyCustomer: Record "Shpfy Customer") + begin + ShopifyCustomer.Id := ShopifyCustomerId; + Handled := true; + end; + + local procedure MakeResponse(HttpRequestMessage: HttpRequestMessage; var HttpResponseMessage: HttpResponseMessage) + var + Uri: Text; + GraphQlQuery: Text; + GetCustomersGQLMsg: Label '{"query":"{customers(first:100){pageInfo{endCursor hasNextPage} nodes{ legacyResourceId }}}"}', Locked = true; + GraphQLCmdTxt: Label '/graphql.json', Locked = true; + begin + case HttpRequestMessage.Method of + 'POST': + begin + Uri := HttpRequestMessage.GetRequestUri(); + if Uri.EndsWith(GraphQLCmdTxt) then + if HttpRequestMessage.Content.ReadAs(GraphQlQuery) then + case true of + GraphQlQuery.Contains(GetCustomersGQLMsg): + HttpResponseMessage := GetEmptyResponse(); + + end; + end; + end; + end; + + + local procedure GetEmptyResponse(): HttpResponseMessage + var + HttpResponseMessage: HttpResponseMessage; + Body: Text; + begin + Body := '{}'; + HttpResponseMessage.Content.WriteFrom(Body); + exit(HttpResponseMessage); + end; + + internal procedure SetShopifyCustomerId(Id: BigInteger) + begin + ShopifyCustomerId := Id; + end; + + internal procedure GetGQLQuery(): Text + begin + exit(GQLQueryTxt); + end; +} diff --git a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al index 98f60f979a..5c7d57948d 100644 --- a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al +++ b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al @@ -4,7 +4,10 @@ codeunit 139611 "Shpfy Order Refund Test" TestPermissions = Disabled; var + ShpfyInitializeTest: Codeunit "Shpfy Initialize Test"; LibraryAssert: Codeunit "Library Assert"; + ShopifyIds: Dictionary of [Text, List of [BigInteger]]; + IsInitialized: Boolean; trigger OnRun() begin @@ -19,6 +22,7 @@ codeunit 139611 "Shpfy Order Refund Test" if IsInitialized then exit; + ShpfyInitializeTest.Run(); ShopifyIds := OrderRefundsHelper.CreateShopifyDocuments(); IsInitialized := true; @@ -45,7 +49,6 @@ codeunit 139611 "Shpfy Order Refund Test" ErrorInfo: ErrorInfo; begin // [SCENARIO] Create a Credit Memo from a Shopify Refund where the item is totally refunded. - Codeunit.Run(Codeunit::"Shpfy Initialize Test"); Initialize(); // [GIVEN] Set the process of the document: "Auto Create Credit Memo"; @@ -82,7 +85,6 @@ codeunit 139611 "Shpfy Order Refund Test" ErrorInfo: ErrorInfo; begin // [SCENARIO] Create a Credit Memo from a Shopify Refund where only the shipment is refunded. - Codeunit.Run(Codeunit::"Shpfy Initialize Test"); Initialize(); // [GIVEN] Set the process of the document: "Auto Create Credit Memo"; @@ -119,7 +121,6 @@ codeunit 139611 "Shpfy Order Refund Test" ErrorInfo: ErrorInfo; begin // [SCENARIO] Create a Credit Memo from a Shopify Refund where the item is not refunded. - Codeunit.Run(Codeunit::"Shpfy Initialize Test"); Initialize(); // [GIVEN] Set the process of the document: "Auto Create Credit Memo"; @@ -158,7 +159,6 @@ codeunit 139611 "Shpfy Order Refund Test" // Non-zero refund = true // Linked return refund = true // Zero and not linked refund = false - Codeunit.Run(Codeunit::"Shpfy Initialize Test"); Initialize(); // [GIVEN] Non-zero refund @@ -177,7 +177,27 @@ codeunit 139611 "Shpfy Order Refund Test" LibraryAssert.ExpectedError('The refund imported from Shopify can''t be used to create a credit memo. Only refunds for paid items can be used to create credit memos.'); end; + [Test] + procedure UnitTestGetRefundLineWithLocation() var - ShopifyIds: Dictionary of [Text, List Of [BigInteger]]; - IsInitialized: Boolean; + RefundHeader: Record "Shpfy Refund Header"; + RefundsAPI: Codeunit "Shpfy Refunds API"; + OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; + RefundId: BigInteger; + ReturnLocations: Dictionary of [BigInteger, BigInteger]; + RefundLine: Record "Shpfy Refund Line"; + RefundLineId: BigInteger; + begin + // [SCENARIO] Import refund lines with location + Initialize(); + + // [GIVEN] Refund Header + RefundId := OrderRefundsHelper.CreateRefundHeader(); + + // [GIVEN] Return Locations + // RefundsAPI. + + + + end; } \ No newline at end of file diff --git a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al index c1c16f46af..764d66c74f 100644 --- a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al +++ b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al @@ -239,4 +239,15 @@ codeunit 139564 "Shpfy Order Refunds Helper" begin exit(InitializeTest.GetDummyCustomer()); end; + + internal procedure CreateRefundHeader(): BigInteger + var + RefundHeader: Record "Shpfy Refund Header"; + begin + Any.SetDefaultSeed(); + RefundHeader.Init(); + RefundHeader."Refund Id" := Any.IntegerInRange(100000, 9999999); + RefundHeader.Insert(false); + exit(RefundHeader."Refund Id"); + end; } \ No newline at end of file From 088b03ea936671ec8cd9703b10a02c550dd05b9a Mon Sep 17 00:00:00 2001 From: Piotr Michalak Date: Fri, 25 Oct 2024 10:53:52 +0200 Subject: [PATCH 2/4] modify test --- .../Order Refunds/ShpfyOrderRefundTest.Codeunit.al | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al index 5c7d57948d..8431c29218 100644 --- a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al +++ b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al @@ -184,6 +184,7 @@ codeunit 139611 "Shpfy Order Refund Test" RefundsAPI: Codeunit "Shpfy Refunds API"; OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; RefundId: BigInteger; + JRefundLine: JsonObject; ReturnLocations: Dictionary of [BigInteger, BigInteger]; RefundLine: Record "Shpfy Refund Line"; RefundLineId: BigInteger; @@ -194,10 +195,16 @@ codeunit 139611 "Shpfy Order Refund Test" // [GIVEN] Refund Header RefundId := OrderRefundsHelper.CreateRefundHeader(); - // [GIVEN] Return Locations - // RefundsAPI. - + // [GIVEN] Refund Line response + JRefundLine.ReadFrom('{"lineItem": {"id": "gid://shopify/LineItem/1234567890"}, "quantity": 1, "restockType": "no_restock", "location": {"legacyResourceId": 1234567890}'); + // [WHEN] Execute RefundsAPI.FillInRefundLine + RefundsAPI.FillInRefundLine(RefundId, JRefundLine, false, ReturnLocations); + // [THEN] Refund Line with location is created + RefundLine.SetRange("Refund Id", RefundId); + RefundLine.SetRange("Refund Line Id", 1234567890); + LibraryAssert.IsTrue(RefundLine.Find(), 'Refund line not creatred'); + LibraryAssert.AreEqual(1234567890, RefundLine."Location Id", 'Refund line location not set'); end; } \ No newline at end of file From bdfe839dc10a23891f66ff3479ae69e311e2284c Mon Sep 17 00:00:00 2001 From: Piotr Michalak Date: Fri, 25 Oct 2024 13:02:49 +0200 Subject: [PATCH 3/4] Test for default lcoation --- .../ShpfyOrderRefundTest.Codeunit.al | 170 ++++++++++++++---- .../ShpfyOrderRefundsHelper.Codeunit.al | 66 +++++-- 2 files changed, 193 insertions(+), 43 deletions(-) diff --git a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al index 8431c29218..438546c1ea 100644 --- a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al +++ b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al @@ -6,6 +6,7 @@ codeunit 139611 "Shpfy Order Refund Test" var ShpfyInitializeTest: Codeunit "Shpfy Initialize Test"; LibraryAssert: Codeunit "Library Assert"; + Any: Codeunit Any; ShopifyIds: Dictionary of [Text, List of [BigInteger]]; IsInitialized: Boolean; @@ -15,29 +16,6 @@ codeunit 139611 "Shpfy Order Refund Test" IsInitialized := false; end; - local procedure Initialize() - var - OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; - begin - if IsInitialized then - exit; - - ShpfyInitializeTest.Run(); - ShopifyIds := OrderRefundsHelper.CreateShopifyDocuments(); - - IsInitialized := true; - Commit(); - end; - - local procedure ResetProccesOnRefund(ReFundId: Integer) - var - ShpfyDocLinkToDoc: Record "Shpfy Doc. Link To Doc."; - begin - ShpfyDocLinkToDoc.SetRange("Shopify Document Type", ShpfyDocLinkToDoc."Shopify Document Type"::"Shopify Shop Refund"); - ShpfyDocLinkToDoc.SetRange("Shopify Document Id", ReFundId); - ShpfyDocLinkToDoc.DeleteAll(); - end; - [Test] procedure UnitTestCreateCrMemoFromRefundWithFullyRefundedItem() var @@ -178,15 +156,15 @@ codeunit 139611 "Shpfy Order Refund Test" end; [Test] - procedure UnitTestGetRefundLineWithLocation() + procedure UnitTestFillInRefundLineWithLocation() var - RefundHeader: Record "Shpfy Refund Header"; + RefundLine: Record "Shpfy Refund Line"; RefundsAPI: Codeunit "Shpfy Refunds API"; OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; RefundId: BigInteger; JRefundLine: JsonObject; ReturnLocations: Dictionary of [BigInteger, BigInteger]; - RefundLine: Record "Shpfy Refund Line"; + RefundLocationId: BigInteger; RefundLineId: BigInteger; begin // [SCENARIO] Import refund lines with location @@ -194,17 +172,147 @@ codeunit 139611 "Shpfy Order Refund Test" // [GIVEN] Refund Header RefundId := OrderRefundsHelper.CreateRefundHeader(); + // [GIVEN] Refund Line response + RefundLocationId := Any.IntegerInRange(100000, 999999); + RefundLineId := Any.IntegerInRange(100000, 999999); + CreateRefundLineResponse(JRefundLine, RefundLineId, RefundLocationId); + // [WHEN] Execute RefundsAPI.FillInRefundLine + RefundsAPI.FillInRefundLine(RefundId, JRefundLine, false, ReturnLocations); + + // [THEN] Refund Line with location is created + LibraryAssert.IsTrue(RefundLine.Get(RefundId, RefundLineId), 'Refund line not creatred'); + LibraryAssert.AreEqual(RefundLocationId, RefundLine."Location Id", 'Refund line location not set'); + end; + + [Test] + procedure UnitTestFillInRefundLineWithLocations() + var + RefundLine: Record "Shpfy Refund Line"; + RefundsAPI: Codeunit "Shpfy Refunds API"; + OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; + RefundId: BigInteger; + JRefundLine: JsonObject; + ReturnLocations: Dictionary of [BigInteger, BigInteger]; + RefundLineId: BigInteger; + ReturnLocationId: BigInteger; + begin + // [SCENARIO] Import refund lines with locations + Initialize(); + + // [GIVEN] Refund Header + RefundId := OrderRefundsHelper.CreateRefundHeader(); // [GIVEN] Refund Line response - JRefundLine.ReadFrom('{"lineItem": {"id": "gid://shopify/LineItem/1234567890"}, "quantity": 1, "restockType": "no_restock", "location": {"legacyResourceId": 1234567890}'); + RefundLineId := Any.IntegerInRange(100000, 999999); + CreateRefundLineResponse(JRefundLine, RefundLineId, 0); + //[GIVEN] Return Locations + ReturnLocationId := Any.IntegerInRange(100000, 999999); + ReturnLocations.Add(RefundLineId, ReturnLocationId); // [WHEN] Execute RefundsAPI.FillInRefundLine RefundsAPI.FillInRefundLine(RefundId, JRefundLine, false, ReturnLocations); // [THEN] Refund Line with location is created - RefundLine.SetRange("Refund Id", RefundId); - RefundLine.SetRange("Refund Line Id", 1234567890); - LibraryAssert.IsTrue(RefundLine.Find(), 'Refund line not creatred'); - LibraryAssert.AreEqual(1234567890, RefundLine."Location Id", 'Refund line location not set'); + LibraryAssert.IsTrue(RefundLine.Get(RefundId, RefundLineId), 'Refund line not creatred'); + LibraryAssert.AreEqual(ReturnLocationId, RefundLine."Location Id", 'Refund line location not set'); + end; + + [Test] + procedure UnitTestCreateSalesOrderLineFromRefundWithDefaultLocation() + var + SalesHeader: Record "Sales Header"; + SalesLine: Record "Sales Line"; + Shop: Record "Shpfy Shop"; + Location: Record Location; + OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; + IReturnRefundProcess: Interface "Shpfy IReturnRefund Process"; + RefundId: BigInteger; + OrderId, OrderLineId : BigInteger; + ReturnId: BigInteger; + begin + // [SCENARIO] Create sales credit memo line from refund with default location + Initialize(); + + // [GIVEN] Location + CreateLocation(Location); + + // [GIVEN] Shop with setup to use default return location + Shop := ShpfyInitializeTest.CreateShop(); + Shop."Return Location Priority" := Enum::"Shpfy Return Location Priority"::"Default Return Location"; + Shop."Return Location" := Location.Code; + Shop.Modify(); + + //[GIVEN] Processed Shopify Order + CerateProcessedShopifyOrder(OrderId, OrderLineId); + // [GIVEN] Shopify Return + CreateShopifyReturn(ReturnId, OrderId); + // [GIVEN] Refund Header + RefundId := OrderRefundsHelper.CreateRefundHeader(OrderId, ReturnId, 156.38, Shop.Code); + // [GIVEN] Refund line without location + OrderRefundsHelper.CreateRefundLine(RefundId, OrderLineId, 0); + + // [WHEN] Execute create credit memo + IReturnRefundProcess := Enum::"Shpfy ReturnRefund ProcessType"::"Auto Create Credit Memo"; + SalesHeader := IReturnRefundProcess.CreateSalesDocument(Enum::"Shpfy Source Document Type"::Refund, RefundId); + + // [THEN] Credit Memo Line with default location is created + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.FindFirst(); + LibraryAssert.AreEqual(Location.Code, SalesLine."Location Code", 'Sales line location not set'); + end; + + local procedure Initialize() + var + OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; + begin + Any.SetDefaultSeed(); + + if IsInitialized then + exit; + + ShpfyInitializeTest.Run(); + ShopifyIds := OrderRefundsHelper.CreateShopifyDocuments(); + + IsInitialized := true; + Commit(); + end; + + local procedure ResetProccesOnRefund(ReFundId: Integer) + var + ShpfyDocLinkToDoc: Record "Shpfy Doc. Link To Doc."; + begin + ShpfyDocLinkToDoc.SetRange("Shopify Document Type", ShpfyDocLinkToDoc."Shopify Document Type"::"Shopify Shop Refund"); + ShpfyDocLinkToDoc.SetRange("Shopify Document Id", ReFundId); + ShpfyDocLinkToDoc.DeleteAll(); + end; + + local procedure CreateRefundLineResponse(var JRefundLine: JsonObject; RefundLineId: BigInteger; RefundLocationId: BigInteger) + begin + JRefundLine.ReadFrom(StrSubstNo('{"lineItem": {"id": "gid://shopify/LineItem/%1"}, "quantity": 1, "restockType": "no_restock", "location": {"legacyResourceId": %2}}', RefundLineId, RefundLocationId)); + end; + + local procedure CerateProcessedShopifyOrder(var OrderId: BigInteger; var OrderLineId: BigInteger) + var + OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; + begin + OrderId := OrderRefundsHelper.CreateShopifyOrder(); + OrderLineId := OrderRefundsHelper.CreateOrderLine(OrderId, 10000, Any.IntegerInRange(100000, 999999), Any.IntegerInRange(100000, 999999)); + OrderRefundsHelper.ProcessShopifyOrder(OrderId); + end; + + local procedure CreateShopifyReturn(var ReturnId: BigInteger; OrderId: BigInteger) + var + OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; + begin + ReturnId := OrderRefundsHelper.CreateReturn(OrderId); + OrderRefundsHelper.CreateReturnLine(ReturnId, OrderId, ''); + end; + + local procedure CreateLocation(var Location: Record Location) + begin + Location.Init(); + Location.Code := Any.AlphanumericText(10); + Location.Insert(); end; } \ No newline at end of file diff --git a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al index 764d66c74f..07f21d0f63 100644 --- a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al +++ b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al @@ -7,7 +7,6 @@ codeunit 139564 "Shpfy Order Refunds Helper" internal procedure CreateShopifyDocuments() ShopifyIds: Dictionary of [Text, List of [BigInteger]] var - DocLink: Record "Shpfy Doc. Link To Doc."; CommunicationMgt: Codeunit "Shpfy Communication Mgt."; OrderId: BigInteger; ProductId: BigInteger; @@ -28,11 +27,7 @@ codeunit 139564 "Shpfy Order Refunds Helper" ShopifyIds.Get('Order').Add(OrderId); ShopifyIds.Get('OrderLine').Add(CreateOrderLine(OrderId, 1, ProductId, VariantId)); ShopifyIds.Get('OrderLine').Add(CreateOrderLine(OrderId, 2, ProductId, VariantId)); - DocLink."Shopify Document Type" := Enum::"Shpfy shop Document Type"::"Shopify shop Order"; - DocLink."Shopify Document Id" := OrderId; - DocLink."Document Type" := Enum::"Shpfy Document Type"::"Sales Order"; - DocLink."Document No." := Any.AlphabeticText(10); - DocLink.Insert(); + ProcessShopifyOrder(OrderId); ReturnId := CreateReturn(OrderId); CreateReturnLine(ReturnId, ShopifyIds.Get('OrderLine').Get(1), 'DEFECTIVE'); @@ -75,7 +70,7 @@ codeunit 139564 "Shpfy Order Refunds Helper" exit(Ids); end; - local procedure CreateShopifyOrder(): BigInteger + internal procedure CreateShopifyOrder(): BigInteger var OrderHeader: Record "Shpfy Order Header"; Customer: Record Customer; @@ -136,7 +131,7 @@ codeunit 139564 "Shpfy Order Refunds Helper" exit(OrderHeader."Shopify Order Id"); end; - local procedure CreateOrderLine(OrderId: BigInteger; LineNo: Integer; ProductId: BigInteger; VariantId: BigInteger): BigInteger + internal procedure CreateOrderLine(OrderId: BigInteger; LineNo: Integer; ProductId: BigInteger; VariantId: BigInteger): BigInteger var Item: Record Item; OrderLine: Record "Shpfy Order Line"; @@ -158,7 +153,7 @@ codeunit 139564 "Shpfy Order Refunds Helper" exit(OrderLine."Line Id"); end; - local procedure CreateReturn(OrderId: BigInteger): BigInteger + internal procedure CreateReturn(OrderId: BigInteger): BigInteger var ReturnHeader: Record "Shpfy Return Header"; begin @@ -172,7 +167,7 @@ codeunit 139564 "Shpfy Order Refunds Helper" exit(ReturnHeader."Return Id"); end; - local procedure CreateReturnLine(ReturnOrderId: BigInteger; OrderLineId: BigInteger; ReturnReason: Text) + internal procedure CreateReturnLine(ReturnOrderId: BigInteger; OrderLineId: BigInteger; ReturnReason: Text): BigInteger var ReturnLine: Record "Shpfy Return Line"; ReturnEnumConvertor: Codeunit "Shpfy Return Enum Convertor"; @@ -189,9 +184,10 @@ codeunit 139564 "Shpfy Order Refunds Helper" ReturnLine."Weight Unit" := 'KILOGRAMS'; ReturnLine."Discounted Total Amount" := 156.38; ReturnLine.Insert(); + exit(ReturnLine."Return Line Id"); end; - local procedure CreateRefundHeader(OrderId: BigInteger; ReturnId: BigInteger; Amount: Decimal): BigInteger + internal procedure CreateRefundHeader(OrderId: BigInteger; ReturnId: BigInteger; Amount: Decimal): BigInteger var RefundHeader: Record "Shpfy Refund Header"; begin @@ -206,7 +202,42 @@ codeunit 139564 "Shpfy Order Refunds Helper" exit(RefundHeader."Refund Id"); end; - local procedure CreateRefundLine(RefundId: BigInteger; OrderLineId: BigInteger) + internal procedure CreateRefundHeader(OrderId: BigInteger; ReturnId: BigInteger; Amount: Decimal; ShopCode: Code[20]): BigInteger + var + RefundHeader: Record "Shpfy Refund Header"; + begin + RefundHeader."Refund Id" := Any.IntegerInRange(100000, 9999999); + RefundHeader."Order Id" := OrderId; + RefundHeader."Return Id" := ReturnId; + RefundHeader."Created At" := CurrentDateTime; + RefundHeader."Shop Code" := ShopCode; + RefundHeader."Updated At" := CurrentDateTime; + RefundHeader."Total Refunded Amount" := Amount; + RefundHeader.Insert(); + exit(RefundHeader."Refund Id"); + end; + + internal procedure CreateRefundLine(RefundId: BigInteger; OrderLineId: BigInteger) + var + RefundLine: Record "Shpfy Refund Line"; + RefundHeader: Record "Shpfy Refund Header"; + RefundsAPI: Codeunit "Shpfy Refunds API"; + RefundEnumConvertor: Codeunit "Shpfy Refund Enum Convertor"; + begin + RefundHeader.Get(RefundId); + RefundLine."Refund Line Id" := Any.IntegerInRange(100000, 999999); + RefundLine."Refund Id" := RefundId; + RefundLine."Order Line Id" := OrderLineId; + RefundLine."Restock Type" := RefundEnumConvertor.ConvertToReStockType('RETURN'); + RefundLine.Quantity := 1; + RefundLine.Restocked := true; + RefundLine.Amount := 156.38; + RefundLine."Subtotal Amount" := 156.38; + RefundLine."Can Create Credit Memo" := RefundsAPI.IsNonZeroOrReturnRefund(RefundHeader); + RefundLine.Insert(); + end; + + internal procedure CreateRefundLine(RefundId: BigInteger; OrderLineId: BigInteger; LocationId: BigInteger) var RefundLine: Record "Shpfy Refund Line"; RefundHeader: Record "Shpfy Refund Header"; @@ -240,6 +271,17 @@ codeunit 139564 "Shpfy Order Refunds Helper" exit(InitializeTest.GetDummyCustomer()); end; + internal procedure ProcessShopifyOrder(var OrderId: BigInteger) + var + DocLink: Record "Shpfy Doc. Link To Doc."; + begin + DocLink."Shopify Document Type" := Enum::"Shpfy shop Document Type"::"Shopify shop Order"; + DocLink."Shopify Document Id" := OrderId; + DocLink."Document Type" := Enum::"Shpfy Document Type"::"Sales Order"; + DocLink."Document No." := Any.AlphabeticText(10); + DocLink.Insert(); + end; + internal procedure CreateRefundHeader(): BigInteger var RefundHeader: Record "Shpfy Refund Header"; From 6f09637e76a2ae9ec85fd2dac981c943c6aa095a Mon Sep 17 00:00:00 2001 From: Piotr Michalak Date: Fri, 25 Oct 2024 14:18:39 +0200 Subject: [PATCH 4/4] add credit memo location test --- .../ShpfyOrderRefundTest.Codeunit.al | 68 +++++++++++++++++-- .../ShpfyOrderRefundsHelper.Codeunit.al | 8 +++ 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al index 438546c1ea..424a7212b1 100644 --- a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al +++ b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al @@ -186,7 +186,7 @@ codeunit 139611 "Shpfy Order Refund Test" end; [Test] - procedure UnitTestFillInRefundLineWithLocations() + procedure UnitTestFillInRefundLineWithReturnLocations() var RefundLine: Record "Shpfy Refund Line"; RefundsAPI: Codeunit "Shpfy Refunds API"; @@ -240,12 +240,12 @@ codeunit 139611 "Shpfy Order Refund Test" Shop := ShpfyInitializeTest.CreateShop(); Shop."Return Location Priority" := Enum::"Shpfy Return Location Priority"::"Default Return Location"; Shop."Return Location" := Location.Code; - Shop.Modify(); + Shop.Modify(false); //[GIVEN] Processed Shopify Order CerateProcessedShopifyOrder(OrderId, OrderLineId); // [GIVEN] Shopify Return - CreateShopifyReturn(ReturnId, OrderId); + CreateShopifyReturn(ReturnId, OrderId, Shop.Code); // [GIVEN] Refund Header RefundId := OrderRefundsHelper.CreateRefundHeader(OrderId, ReturnId, 156.38, Shop.Code); // [GIVEN] Refund line without location @@ -262,6 +262,52 @@ codeunit 139611 "Shpfy Order Refund Test" LibraryAssert.AreEqual(Location.Code, SalesLine."Location Code", 'Sales line location not set'); end; + [Test] + procedure UnitTestCreateSalesCrMemoLineFromRefundWithReturnLocation() + var + SalesHeader: Record "Sales Header"; + SalesLine: Record "Sales Line"; + Shop: Record "Shpfy Shop"; + Location: Record Location; + OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; + IReturnRefundProcess: Interface "Shpfy IReturnRefund Process"; + RefundId: BigInteger; + OrderId, OrderLineId : BigInteger; + ReturnId: BigInteger; + LocationId: BigInteger; + begin + // [SCENARIO] Create sales credit memo line from refund with return location + Initialize(); + + // [GIVEN] Shop with setup to use original return location + Shop := ShpfyInitializeTest.CreateShop(); + Shop."Return Location Priority" := Enum::"Shpfy Return Location Priority"::"Original -> Default Location"; + Shop."Return Location" := ''; + Shop.Modify(false); + // [GIVEN] Location + CreateLocation(Location); + // [GIVEN] Shop Location + LocationId := CreateShopLocation(Shop.Code, Location.Code); + //[GIVEN] Processed Shopify Order + CerateProcessedShopifyOrder(OrderId, OrderLineId); + // [GIVEN] Shopify Return + CreateShopifyReturn(ReturnId, OrderId, Shop.Code); + // [GIVEN] Refund Header + RefundId := OrderRefundsHelper.CreateRefundHeader(OrderId, ReturnId, 156.38, Shop.Code); + // [GIVEN] Refund line without location + OrderRefundsHelper.CreateRefundLine(RefundId, OrderLineId, LocationId); + + // [WHEN] Execute create credit memo + IReturnRefundProcess := Enum::"Shpfy ReturnRefund ProcessType"::"Auto Create Credit Memo"; + SalesHeader := IReturnRefundProcess.CreateSalesDocument(Enum::"Shpfy Source Document Type"::Refund, RefundId); + + // [THEN] Credit Memo Line with return location is created + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.FindFirst(); + LibraryAssert.AreEqual(Location.Code, SalesLine."Location Code", 'Sales line location not set'); + end; + local procedure Initialize() var OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; @@ -296,15 +342,17 @@ codeunit 139611 "Shpfy Order Refund Test" var OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; begin + OrderRefundsHelper.SetDefaultSeed(); OrderId := OrderRefundsHelper.CreateShopifyOrder(); OrderLineId := OrderRefundsHelper.CreateOrderLine(OrderId, 10000, Any.IntegerInRange(100000, 999999), Any.IntegerInRange(100000, 999999)); OrderRefundsHelper.ProcessShopifyOrder(OrderId); end; - local procedure CreateShopifyReturn(var ReturnId: BigInteger; OrderId: BigInteger) + local procedure CreateShopifyReturn(var ReturnId: BigInteger; OrderId: BigInteger; ShopCode: Code[20]) var OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; begin + OrderRefundsHelper.SetDefaultSeed(); ReturnId := OrderRefundsHelper.CreateReturn(OrderId); OrderRefundsHelper.CreateReturnLine(ReturnId, OrderId, ''); end; @@ -315,4 +363,16 @@ codeunit 139611 "Shpfy Order Refund Test" Location.Code := Any.AlphanumericText(10); Location.Insert(); end; + + local procedure CreateShopLocation(ShopCode: Code[20]; LocationCode: Code[10]): BigInteger + var + ShopLocation: Record "Shpfy Shop Location"; + begin + ShopLocation.Init(); + ShopLocation."Shop Code" := ShopCode; + ShopLocation.Id := Any.IntegerInRange(100000, 999999); + ShopLocation."Default Location Code" := LocationCode; + ShopLocation.Insert(false); + exit(ShopLocation.Id); + end; } \ No newline at end of file diff --git a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al index 07f21d0f63..23b9e6dba6 100644 --- a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al +++ b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundsHelper.Codeunit.al @@ -75,6 +75,7 @@ codeunit 139564 "Shpfy Order Refunds Helper" OrderHeader: Record "Shpfy Order Header"; Customer: Record Customer; begin + Any.SetDefaultSeed(); Customer := GetCustomer(); OrderHeader."Shopify Order Id" := Any.IntegerInRange(100000, 999999); OrderHeader."Sales Order No." := Any.AlphabeticText(10); @@ -206,6 +207,7 @@ codeunit 139564 "Shpfy Order Refunds Helper" var RefundHeader: Record "Shpfy Refund Header"; begin + Any.SetDefaultSeed(); RefundHeader."Refund Id" := Any.IntegerInRange(100000, 9999999); RefundHeader."Order Id" := OrderId; RefundHeader."Return Id" := ReturnId; @@ -254,6 +256,7 @@ codeunit 139564 "Shpfy Order Refunds Helper" RefundLine.Amount := 156.38; RefundLine."Subtotal Amount" := 156.38; RefundLine."Can Create Credit Memo" := RefundsAPI.IsNonZeroOrReturnRefund(RefundHeader); + RefundLine."Location Id" := LocationId; RefundLine.Insert(); end; @@ -292,4 +295,9 @@ codeunit 139564 "Shpfy Order Refunds Helper" RefundHeader.Insert(false); exit(RefundHeader."Refund Id"); end; + + internal procedure SetDefaultSeed() + begin + Any.SetDefaultSeed(); + end; } \ No newline at end of file