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/ShpfyOrderRefundTest.Codeunit.al b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al index 98f60f979a..1cb3271193 100644 --- a/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al +++ b/Apps/W1/Shopify/test/Order Refunds/ShpfyOrderRefundTest.Codeunit.al @@ -4,7 +4,11 @@ codeunit 139611 "Shpfy Order Refund Test" TestPermissions = Disabled; var + ShpfyInitializeTest: Codeunit "Shpfy Initialize Test"; LibraryAssert: Codeunit "Library Assert"; + Any: Codeunit Any; + ShopifyIds: Dictionary of [Text, List of [BigInteger]]; + IsInitialized: Boolean; trigger OnRun() begin @@ -12,28 +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; - - 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 @@ -45,7 +27,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 +63,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 +99,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 +137,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 +155,224 @@ 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 UnitTestFillInRefundLineWithLocation() var - ShopifyIds: Dictionary of [Text, List Of [BigInteger]]; - IsInitialized: Boolean; + 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]; + RefundLocationId: BigInteger; + RefundLineId: BigInteger; + begin + // [SCENARIO] Import refund lines with location + Initialize(); + + // [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 UnitTestFillInRefundLineWithReturnLocations() + 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 + 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 + 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(false); + + //[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; + + [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); + // [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"; + 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 + 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) + var + OrderRefundsHelper: Codeunit "Shpfy Order Refunds Helper"; + begin + OrderRefundsHelper.SetDefaultSeed(); + 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; + + 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 c1c16f46af..23b9e6dba6 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,11 +70,12 @@ 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; begin + Any.SetDefaultSeed(); Customer := GetCustomer(); OrderHeader."Shopify Order Id" := Any.IntegerInRange(100000, 999999); OrderHeader."Sales Order No." := Any.AlphabeticText(10); @@ -136,7 +132,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 +154,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 +168,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 +185,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 +203,43 @@ 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 + Any.SetDefaultSeed(); + 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"; @@ -223,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; @@ -239,4 +273,31 @@ codeunit 139564 "Shpfy Order Refunds Helper" begin 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"; + begin + Any.SetDefaultSeed(); + RefundHeader.Init(); + RefundHeader."Refund Id" := Any.IntegerInRange(100000, 9999999); + RefundHeader.Insert(false); + exit(RefundHeader."Refund Id"); + end; + + internal procedure SetDefaultSeed() + begin + Any.SetDefaultSeed(); + end; } \ No newline at end of file