Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 134 additions & 0 deletions src/Apps/BE/Peppol/App/src/PEPPOL30BEServiceValidation.Codeunit.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Peppol.BE;

using Microsoft.Peppol;
using Microsoft.Sales.Document;
using Microsoft.Service.Document;
using Microsoft.Service.History;
using System.Reflection;

codeunit 37312 "PEPPOL30 BE Service Validation" implements "PEPPOL30 Validation"
{
TableNo = "Service Header";
InherentEntitlements = X;
InherentPermissions = X;

var
PEPPOL30BESalesValidation: Codeunit "PEPPOL30 BE Sales Validation";

trigger OnRun()
begin
ValidateDocument(Rec);
ValidateDocumentLines(Rec);
end;

procedure ValidateDocument(RecordVariant: Variant)
var
ServiceHeader: Record "Service Header";
SalesHeader: Record "Sales Header";
PEPPOL30: Codeunit "PEPPOL30";
begin
ServiceHeader := RecordVariant;
PEPPOL30.TransferHeaderToSalesHeader(ServiceHeader, SalesHeader);
SalesHeader."Shipment Date" := SalesHeader."Posting Date";
PEPPOL30BESalesValidation.ValidateDocument(SalesHeader);
end;

procedure ValidateDocumentLines(RecordVariant: Variant)
var
ServiceHeader: Record "Service Header";
ServiceLine: Record "Service Line";
begin
ServiceHeader := RecordVariant;
ServiceLine.SetRange("Document Type", ServiceHeader."Document Type");
ServiceLine.SetRange("Document No.", ServiceHeader."No.");
if ServiceLine.FindSet() then
repeat
ValidateDocumentLine(ServiceLine);
until ServiceLine.Next() = 0;
end;

procedure ValidateDocumentLine(RecordVariant: Variant)
var
ServiceLine: Record "Service Line";
SalesLine: Record "Sales Line";
PEPPOL30: Codeunit "PEPPOL30";
begin
ServiceLine := RecordVariant;
PEPPOL30.TransferLineToSalesLine(ServiceLine, SalesLine);
PEPPOL30BESalesValidation.ValidateDocumentLine(SalesLine);
end;

procedure ValidateLineTypeAndDescription(RecordVariant: Variant): Boolean
var
ServiceLine: Record "Service Line";
SalesLine: Record "Sales Line";
PEPPOL30: Codeunit "PEPPOL30";
begin
ServiceLine := RecordVariant;
PEPPOL30.TransferLineToSalesLine(ServiceLine, SalesLine);
exit(PEPPOL30BESalesValidation.ValidateLineTypeAndDescription(SalesLine));
end;

procedure ValidatePostedDocument(RecordVariant: Variant)
var
DataTypeMgt: Codeunit "Data Type Management";
RecordRef: RecordRef;
UnsupportedDocumentErr: Label 'The posted service document type is not supported for PEPPOL 3.0 validation.';
begin
if not DataTypeMgt.GetRecordRef(RecordVariant, RecordRef) then
exit;

case RecordRef.Number() of
Database::"Service Invoice Header":
CheckServiceInvoice(RecordVariant);
Database::"Service Cr.Memo Header":
CheckServiceCreditMemo(RecordVariant);
else
Error(UnsupportedDocumentErr);
end;
end;

local procedure CheckServiceInvoice(ServiceInvoiceHeader: Record "Service Invoice Header")
var
SalesHeader: Record "Sales Header";
SalesLine: Record "Sales Line";
ServiceInvoiceLine: Record "Service Invoice Line";
PEPPOL30: Codeunit "PEPPOL30";
begin
PEPPOL30.TransferHeaderToSalesHeader(ServiceInvoiceHeader, SalesHeader);
SalesHeader."Document Type" := SalesHeader."Document Type"::Invoice;
SalesHeader."Shipment Date" := SalesHeader."Posting Date";
PEPPOL30BESalesValidation.ValidateDocument(SalesHeader);
ServiceInvoiceLine.SetRange("Document No.", ServiceInvoiceHeader."No.");
if ServiceInvoiceLine.FindSet() then
repeat
PEPPOL30.TransferLineToSalesLine(ServiceInvoiceLine, SalesLine);
SalesLine."Document Type" := SalesLine."Document Type"::Invoice;
PEPPOL30BESalesValidation.ValidateDocumentLine(SalesLine);
until ServiceInvoiceLine.Next() = 0;
end;

local procedure CheckServiceCreditMemo(ServiceCrMemoHeader: Record "Service Cr.Memo Header")
var
SalesHeader: Record "Sales Header";
SalesLine: Record "Sales Line";
ServiceCrMemoLine: Record "Service Cr.Memo Line";
PEPPOL30: Codeunit "PEPPOL30";
begin
PEPPOL30.TransferHeaderToSalesHeader(ServiceCrMemoHeader, SalesHeader);
SalesHeader."Document Type" := SalesHeader."Document Type"::"Credit Memo";
SalesHeader."Shipment Date" := SalesHeader."Posting Date";
PEPPOL30BESalesValidation.ValidateDocument(SalesHeader);
ServiceCrMemoLine.SetRange("Document No.", ServiceCrMemoHeader."No.");
if ServiceCrMemoLine.FindSet() then
repeat
PEPPOL30.TransferLineToSalesLine(ServiceCrMemoLine, SalesLine);
SalesLine."Document Type" := SalesLine."Document Type"::"Credit Memo";
PEPPOL30BESalesValidation.ValidateDocumentLine(SalesLine);
until ServiceCrMemoLine.Next() = 0;
end;
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ codeunit 37314 "PEPPOL30 BE Subscribers"
exit;

Rec."PEPPOL 3.0 Sales Format" := Rec."PEPPOL 3.0 Sales Format"::"PEPPOL 3.0 - BE Sales";
Rec."PEPPOL 3.0 Service Format" := Rec."PEPPOL 3.0 Service Format"::"PEPPOL 3.0 - BE Service";
Rec.Modify();
end;
}
7 changes: 7 additions & 0 deletions src/Apps/BE/Peppol/App/src/PEPPOL30FormatBE.EnumExt.al
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,11 @@ enumextension 37310 "PEPPOL 3.0 Format BE" extends "PEPPOL 3.0 Format"
"PEPPOL30 Validation" = "PEPPOL30 BE Sales Validation",
"PEPPOL Posted Document Iterator" = "PEPPOL30 Sales Iterator";
}
value(37311; "PEPPOL 3.0 - BE Service")
{
Caption = 'PEPPOL 3.0 - BE Service';
Implementation = "PEPPOL Party Info Provider" = "PEPPOL30 BE",
"PEPPOL30 Validation" = "PEPPOL30 BE Service Validation",
"PEPPOL Posted Document Iterator" = "PEPPOL30 Services Iterator";
}
}