-
Notifications
You must be signed in to change notification settings - Fork 446
[Shopify] Automatic Transaction Posting #9525
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
Onat Buyukakkus (onbuyuka)
wants to merge
18
commits into
main
Choose a base branch
from
bugs/620951-shopify-automatic-transaction-posting
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 15 commits
Commits
Show all changes
18 commits
Select commit
Hold shift + click to select a range
6ade014
[Shopify] Automatic Transaction Posting
onbuyuka 43ccc94
Merge branch 'main' of https://github.com/microsoft/BCApps into bugs/…
onbuyuka 9fc5f4a
Merge branch 'main' of https://github.com/microsoft/BCApps into bugs/…
onbuyuka a1dc4d7
Merge branch 'main' of https://github.com/microsoft/BCApps into bugs/…
onbuyuka 34eab3e
Address PR review feedback on Shopify automatic transaction posting
onbuyuka bd28a61
Fix clashing test object ID: use 139415 for Shpfy Auto Post Trans. Test
onbuyuka f4b58b5
Address review feedback: perf, style and test coverage
onbuyuka 2f9d707
Make auto-post test fixture self-contained to fix CI posting setup fa…
onbuyuka b77c22f
Seed number series in auto-post test so first-run shop init succeeds
onbuyuka addd2a6
Revert "Seed number series in auto-post test so first-run shop init s…
onbuyuka 97bba5e
Revert "Make auto-post test fixture self-contained to fix CI posting …
onbuyuka b61a70b
Mark auto-post test as an integration test
onbuyuka 1c5672b
Fix propagation test flake and add skipped-reason diagnostic
onbuyuka 7d9d4bb
Set source code on auto-post test journal template for country locali…
onbuyuka 3e7a814
[Shopify] Address automatic posting review feedback
onbuyuka 73ba397
Merge remote-tracking branch 'origin/main' into bugs/620951-shopify-a…
onbuyuka 7e2fbbc
[Shopify] Address auto-post review feedback and fix build
onbuyuka ecef587
[Shopify] Fix automatic refund posting review findings
onbuyuka File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
89 changes: 89 additions & 0 deletions
89
src/Apps/W1/Shopify/App/src/Transactions/Codeunits/ShpfyAutoGenJnlPost.Codeunit.al
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,89 @@ | ||
| // ------------------------------------------------------------------------------------------------ | ||
| // Copyright (c) Microsoft Corporation. All rights reserved. | ||
| // Licensed under the MIT License. See License.txt in the project root for license information. | ||
| // ------------------------------------------------------------------------------------------------ | ||
|
|
||
| namespace Microsoft.Integration.Shopify; | ||
|
|
||
| using Microsoft.Finance.GeneralLedger.Journal; | ||
| using Microsoft.Finance.GeneralLedger.Posting; | ||
|
|
||
| /// <summary> | ||
| /// Codeunit Shpfy Auto Gen. Jnl.-Post (ID 30422). | ||
| /// Creates a dedicated, single-use journal batch (cloned from the configured one) and builds the general | ||
| /// journal line(s) for a single Shopify order/refund payment transaction into it. It is invoked through | ||
| /// Codeunit.Run so that any failure while creating the batch or building lines is trapped and rolled back | ||
| /// without leaving a batch or line behind. While bound, it also pre-confirms the "posting after working | ||
| /// date" prompt so the automatic posting stays non-interactive. | ||
| /// </summary> | ||
| codeunit 30422 "Shpfy Auto Gen. Jnl.-Post" | ||
| { | ||
| Access = Internal; | ||
| EventSubscriberInstance = Manual; | ||
| TableNo = "Shpfy Order Transaction"; | ||
|
|
||
| trigger OnRun() | ||
| begin | ||
| CreateBatchAndBuildLines(Rec); | ||
| end; | ||
|
|
||
| var | ||
| PaymentMethodMapping: Record "Shpfy Payment Method Mapping"; | ||
| PostingDate: Date; | ||
| IsolatedTemplateName: Code[10]; | ||
| IsolatedBatchName: Code[10]; | ||
|
|
||
| internal procedure SetParameters(NewPaymentMethodMapping: Record "Shpfy Payment Method Mapping"; NewPostingDate: Date) | ||
| begin | ||
| PaymentMethodMapping := NewPaymentMethodMapping; | ||
| PostingDate := NewPostingDate; | ||
| Clear(IsolatedTemplateName); | ||
| Clear(IsolatedBatchName); | ||
| end; | ||
|
|
||
| internal procedure GetIsolatedBatch(var NewTemplateName: Code[10]; var NewBatchName: Code[10]) | ||
| begin | ||
| NewTemplateName := IsolatedTemplateName; | ||
| NewBatchName := IsolatedBatchName; | ||
| end; | ||
|
|
||
| local procedure CreateBatchAndBuildLines(var OrderTransaction: Record "Shpfy Order Transaction") | ||
| var | ||
| SuggestPayments: Report "Shpfy Suggest Payments"; | ||
| begin | ||
| CreateIsolatedBatch(); | ||
| SuggestPayments.SetJournalParameters(IsolatedTemplateName, IsolatedBatchName, PostingDate); | ||
| SuggestPayments.GetOrderTransactions(OrderTransaction); | ||
| SuggestPayments.CreateGeneralJournalLines(); | ||
| end; | ||
|
|
||
| local procedure CreateIsolatedBatch() | ||
| var | ||
| ConfiguredBatch: Record "Gen. Journal Batch"; | ||
| IsolatedBatch: Record "Gen. Journal Batch"; | ||
| begin | ||
| ConfiguredBatch.Get(PaymentMethodMapping."Auto-Post Jnl. Template", PaymentMethodMapping."Auto-Post Jnl. Batch"); | ||
| IsolatedBatch := ConfiguredBatch; | ||
| IsolatedBatch.Name := GetUniqueBatchName(ConfiguredBatch."Journal Template Name"); | ||
| IsolatedBatch.Insert(true); | ||
| IsolatedTemplateName := IsolatedBatch."Journal Template Name"; | ||
| IsolatedBatchName := IsolatedBatch.Name; | ||
| end; | ||
|
|
||
| local procedure GetUniqueBatchName(TemplateName: Code[10]): Code[10] | ||
| var | ||
| ExistingBatch: Record "Gen. Journal Batch"; | ||
| CandidateName: Code[10]; | ||
| begin | ||
| repeat | ||
| CandidateName := CopyStr('SHPFY' + CopyStr(DelChr(Format(CreateGuid()), '=', '{}-'), 1, 5), 1, 10); | ||
| until not ExistingBatch.Get(TemplateName, CandidateName); | ||
| exit(CandidateName); | ||
| end; | ||
|
|
||
| [EventSubscriber(ObjectType::Codeunit, Codeunit::"Gen. Jnl.-Post Batch", 'OnBeforeCheckLine', '', false, false)] | ||
| local procedure PreconfirmWorkingDateOnBeforeCheckLine(var PostingAfterWorkingDateConfirmed: Boolean) | ||
| begin | ||
| PostingAfterWorkingDateConfirmed := true; | ||
| end; | ||
| } |
85 changes: 85 additions & 0 deletions
85
src/Apps/W1/Shopify/App/src/Transactions/Codeunits/ShpfyAutoPostEligibility.Codeunit.al
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,85 @@ | ||
| // ------------------------------------------------------------------------------------------------ | ||
| // Copyright (c) Microsoft Corporation. All rights reserved. | ||
| // Licensed under the MIT License. See License.txt in the project root for license information. | ||
| // ------------------------------------------------------------------------------------------------ | ||
|
|
||
| namespace Microsoft.Integration.Shopify; | ||
|
|
||
| using Microsoft.Sales.Document; | ||
| using Microsoft.Sales.History; | ||
|
|
||
| /// <summary> | ||
| /// Codeunit Shpfy Auto Post Eligibility (ID 30424). | ||
| /// Keeps automatic-posting and transaction-list filtering predicates aligned. | ||
| /// </summary> | ||
| codeunit 30424 "Shpfy Auto Post Eligibility" | ||
| { | ||
| Access = Internal; | ||
|
|
||
| internal procedure IsReadyToPost(OrderTransaction: Record "Shpfy Order Transaction"; var PaymentMethodMapping: Record "Shpfy Payment Method Mapping"): Boolean | ||
| begin | ||
| exit( | ||
| GetPaymentMethodMapping(OrderTransaction, PaymentMethodMapping) and | ||
| IsMappingConfigured(PaymentMethodMapping) and | ||
| IsTransactionPostable(OrderTransaction)); | ||
| end; | ||
|
|
||
| internal procedure GetPaymentMethodMapping(OrderTransaction: Record "Shpfy Order Transaction"; var PaymentMethodMapping: Record "Shpfy Payment Method Mapping"): Boolean | ||
| begin | ||
| exit(PaymentMethodMapping.Get(OrderTransaction.Shop, OrderTransaction.Gateway, OrderTransaction."Credit Card Company")); | ||
|
onbuyuka marked this conversation as resolved.
|
||
| end; | ||
|
|
||
| internal procedure IsMappingConfigured(PaymentMethodMapping: Record "Shpfy Payment Method Mapping"): Boolean | ||
| begin | ||
| exit( | ||
| PaymentMethodMapping."Post Automatically" and | ||
| (PaymentMethodMapping."Auto-Post Jnl. Template" <> '') and | ||
| (PaymentMethodMapping."Auto-Post Jnl. Batch" <> '')); | ||
| end; | ||
|
|
||
| internal procedure IsTransactionPostable(OrderTransaction: Record "Shpfy Order Transaction"): Boolean | ||
|
onbuyuka marked this conversation as resolved.
|
||
| begin | ||
| if OrderTransaction.Status <> OrderTransaction.Status::Success then | ||
| exit(false); | ||
| if not (OrderTransaction.Type in [OrderTransaction.Type::Capture, OrderTransaction.Type::Sale, OrderTransaction.Type::Refund]) then | ||
| exit(false); | ||
|
|
||
| OrderTransaction.CalcFields(Used); | ||
|
onbuyuka marked this conversation as resolved.
Outdated
|
||
| if OrderTransaction.Used then | ||
| exit(false); | ||
| if OpenSalesDocumentExists(OrderTransaction) then | ||
| exit(false); | ||
| exit(PostedDocumentExists(OrderTransaction)); | ||
| end; | ||
|
|
||
| local procedure OpenSalesDocumentExists(OrderTransaction: Record "Shpfy Order Transaction"): Boolean | ||
| var | ||
| SalesHeader: Record "Sales Header"; | ||
| begin | ||
| if OrderTransaction.Type = OrderTransaction.Type::Refund then begin | ||
| if OrderTransaction."Refund Id" = 0 then | ||
| exit(true); | ||
| SalesHeader.SetRange("Shpfy Refund Id", OrderTransaction."Refund Id"); | ||
| exit(not SalesHeader.IsEmpty()); | ||
| end; | ||
|
|
||
| if OrderTransaction."Shopify Order Id" = 0 then | ||
| exit(true); | ||
| SalesHeader.SetRange("Shpfy Order Id", OrderTransaction."Shopify Order Id"); | ||
| exit(not SalesHeader.IsEmpty()); | ||
| end; | ||
|
|
||
| local procedure PostedDocumentExists(OrderTransaction: Record "Shpfy Order Transaction"): Boolean | ||
| var | ||
| SalesCrMemoHeader: Record "Sales Cr.Memo Header"; | ||
| SalesInvoiceHeader: Record "Sales Invoice Header"; | ||
| begin | ||
| if OrderTransaction.Type = OrderTransaction.Type::Refund then begin | ||
| SalesCrMemoHeader.SetRange("Shpfy Refund Id", OrderTransaction."Refund Id"); | ||
| exit(not SalesCrMemoHeader.IsEmpty()); | ||
| end; | ||
|
|
||
| SalesInvoiceHeader.SetRange("Shpfy Order Id", OrderTransaction."Shopify Order Id"); | ||
| exit(not SalesInvoiceHeader.IsEmpty()); | ||
| end; | ||
| } | ||
67 changes: 67 additions & 0 deletions
67
src/Apps/W1/Shopify/App/src/Transactions/Codeunits/ShpfyAutoPostFinalize.Codeunit.al
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| // ------------------------------------------------------------------------------------------------ | ||
| // Copyright (c) Microsoft Corporation. All rights reserved. | ||
| // Licensed under the MIT License. See License.txt in the project root for license information. | ||
| // ------------------------------------------------------------------------------------------------ | ||
|
|
||
| namespace Microsoft.Integration.Shopify; | ||
|
|
||
| using Microsoft.Finance.GeneralLedger.Journal; | ||
|
|
||
| /// <summary> | ||
| /// Codeunit Shpfy Auto Post Finalize (ID 30423). | ||
| /// Runs cleanup and skipped-record persistence in isolated, trappable transactions. | ||
| /// </summary> | ||
| codeunit 30423 "Shpfy Auto Post Finalize" | ||
| { | ||
| Access = Internal; | ||
|
onbuyuka marked this conversation as resolved.
|
||
| TableNo = "Shpfy Order Transaction"; | ||
| Permissions = tabledata "Gen. Journal Batch" = rimd, | ||
| tabledata "Gen. Journal Line" = rimd; | ||
|
|
||
| trigger OnRun() | ||
| begin | ||
| if CleanupBatch then | ||
| RemoveIsolatedBatch(); | ||
| if FailureReason <> '' then | ||
| LogFailure(Rec); | ||
| end; | ||
|
|
||
| var | ||
| TemplateName: Code[10]; | ||
| BatchName: Code[10]; | ||
| FailureReason: Text; | ||
| CleanupBatch: Boolean; | ||
|
|
||
| internal procedure SetCleanupParameters(NewTemplateName: Code[10]; NewBatchName: Code[10]) | ||
| begin | ||
| TemplateName := NewTemplateName; | ||
| BatchName := NewBatchName; | ||
| CleanupBatch := true; | ||
| Clear(FailureReason); | ||
| end; | ||
|
|
||
| internal procedure SetFailureParameters(NewFailureReason: Text) | ||
| begin | ||
| Clear(TemplateName); | ||
| Clear(BatchName); | ||
| CleanupBatch := false; | ||
| FailureReason := NewFailureReason; | ||
| end; | ||
|
|
||
| local procedure RemoveIsolatedBatch() | ||
| var | ||
| IsolatedBatch: Record "Gen. Journal Batch"; | ||
| begin | ||
| if IsolatedBatch.Get(TemplateName, BatchName) then | ||
| IsolatedBatch.Delete(true); | ||
| end; | ||
|
|
||
| local procedure LogFailure(OrderTransaction: Record "Shpfy Order Transaction") | ||
| var | ||
| Shop: Record "Shpfy Shop"; | ||
| SkippedRecord: Codeunit "Shpfy Skipped Record"; | ||
| begin | ||
| if Shop.Get(OrderTransaction.Shop) then | ||
| SkippedRecord.LogSkippedRecord(OrderTransaction."Shopify Transaction Id", OrderTransaction.RecordId, CopyStr(FailureReason, 1, 250), Shop); | ||
|
onbuyuka marked this conversation as resolved.
|
||
| end; | ||
| } | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.