-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathCod50213.SCSalesPostingProcedures.al
187 lines (156 loc) · 7.52 KB
/
Cod50213.SCSalesPostingProcedures.al
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
codeunit 50213 "SC Sales Posting Procedures"
{
EventSubscriberInstance = Manual;
Permissions = TableData "Batch Processing Parameter" = rimd,
TableData "Batch Processing Session Map" = rimd;
TableNo = "Sales Header";
trigger OnRun()
var
SalesHeader: Record "Sales Header";
SalesBatchPostMgt: Codeunit "Sales Batch Post Mgt.";
begin
SalesHeader.Copy(Rec);
BindSubscription(SalesBatchPostMgt);
SalesBatchPostMgt.SetPostingCodeunitId(PostingCodeunitId);
SalesBatchPostMgt.SetBatchProcessor(BatchProcessingMgt);
SalesBatchPostMgt.Code(SalesHeader);
Rec := SalesHeader;
end;
var
BatchProcessingMgt: Codeunit "Batch Processing Mgt.";
PostingCodeunitId: Integer;
PostingDateIsNotSetErr: Label 'Enter the posting date.';
BatchPostingMsg: Label 'Bacth posting of sales documents.';
procedure RunBatch(var SalesHeader: Record "Sales Header"; ReplacePostingDate: Boolean; PostingDate: Date; ReplaceDocumentDate: Boolean; CalcInvoiceDiscount: Boolean; Ship: Boolean; Invoice: Boolean)
var
TempErrorMessage: Record "Error Message" temporary;
BatchPostParameterTypes: Enum "Batch Posting Parameter Type";
SalesBatchPostMgt: Codeunit "Sales Batch Post Mgt.";
ErrorMessages: Page "Error Messages";
ErrorText: Text;
MyRecordRef: RecordRef;
ErrorRec: FieldRef;
ErrorDesc: FieldRef;
ErrorMessageMgt: Codeunit "Error Message Management";
ErrorMessageHandler: Codeunit "Error Message Handler";
ErrorContextElement: Codeunit "Error Context Element";
begin
ErrorMessageMgt.Activate(ErrorMessageHandler);
if ReplacePostingDate and (PostingDate = 0D) then
Error(PostingDateIsNotSetErr);
BatchProcessingMgt.SetParameter(BatchPostParameterTypes::Invoice, Invoice);
BatchProcessingMgt.SetParameter(BatchPostParameterTypes::Ship, Ship);
BatchProcessingMgt.SetParameter(BatchPostParameterTypes::"Calculate Invoice Discount", CalcInvoiceDiscount);
BatchProcessingMgt.SetParameter(BatchPostParameterTypes::"Posting Date", PostingDate);
BatchProcessingMgt.SetParameter(BatchPostParameterTypes::"Replace Posting Date", ReplacePostingDate);
BatchProcessingMgt.SetParameter(BatchPostParameterTypes::"Replace Document Date", ReplaceDocumentDate);
ErrorMessageMgt.PushContext(ErrorContextElement, DATABASE::"Sales Header", 0, BatchPostingMsg);
SalesBatchPostMgt.SetBatchProcessor(BatchProcessingMgt);
Commit();
if SalesBatchPostMgt.Run(SalesHeader) then;
BatchProcessingMgt.ResetBatchID;
//Error Handling
if ErrorMessageMgt.GetLastErrorID > 0 then begin
ErrorMessageMgt.GetErrors(TempErrorMessage);
MyRecordRef.GetTable(TempErrorMessage);
ErrorDesc := MyRecordRef.FIELD(5);
ErrorRec := MyRecordRef.FIELD(10);
if MyRecordRef.FINDSET(FALSE, FALSE) then begin
repeat
ErrorText := ErrorText + Format(ErrorRec.VALUE) + ': ' + Format(ErrorDesc.VALUE) + '\\';
until MyRecordRef.NEXT = 0;
end;
ErrorText := 'Error Count: ' + Format(MyRecordRef.Count) + '\\Error Messages: ' + ErrorText;
error(ErrorText);
end;
end;
procedure GetBatchProcessor(var ResultBatchProcessingMgt: Codeunit "Batch Processing Mgt.")
begin
ResultBatchProcessingMgt := BatchProcessingMgt;
end;
procedure SetBatchProcessor(NewBatchProcessingMgt: Codeunit "Batch Processing Mgt.")
begin
BatchProcessingMgt := NewBatchProcessingMgt;
end;
procedure "Code"(var SalesHeader: Record "Sales Header")
var
RecRef: RecordRef;
begin
if PostingCodeunitId = 0 then
PostingCodeunitId := CODEUNIT::"Sales-Post";
RecRef.GetTable(SalesHeader);
BatchProcessingMgt.SetProcessingCodeunit(PostingCodeunitId);
BatchProcessingMgt.BatchProcess(RecRef);
RecRef.SetTable(SalesHeader);
end;
local procedure PrepareSalesHeader(var SalesHeader: Record "Sales Header"; var BatchConfirm: Option)
var
BatchPostParameterTypes: Enum "Batch Posting Parameter Type";
CalcInvoiceDiscont: Boolean;
ReplacePostingDate: Boolean;
PostingDate: Date;
begin
BatchProcessingMgt.GetBooleanParameter(SalesHeader.RecordId, BatchPostParameterTypes::"Calculate Invoice Discount", CalcInvoiceDiscont);
BatchProcessingMgt.GetBooleanParameter(SalesHeader.RecordId, BatchPostParameterTypes::"Replace Posting Date", ReplacePostingDate);
BatchProcessingMgt.GetDateParameter(SalesHeader.RecordId, BatchPostParameterTypes::"Posting Date", PostingDate);
if CalcInvoiceDiscont then
CalculateInvoiceDiscount(SalesHeader);
SalesHeader.BatchConfirmUpdateDeferralDate(BatchConfirm, ReplacePostingDate, PostingDate);
BatchProcessingMgt.GetBooleanParameter(SalesHeader.RecordId, BatchPostParameterTypes::Ship, SalesHeader.Ship);
BatchProcessingMgt.GetBooleanParameter(SalesHeader.RecordId, BatchPostParameterTypes::Invoice, SalesHeader.Invoice);
BatchProcessingMgt.GetBooleanParameter(SalesHeader.RecordId, BatchPostParameterTypes::Receive, SalesHeader.Receive);
BatchProcessingMgt.GetBooleanParameter(SalesHeader.RecordId, BatchPostParameterTypes::Print, SalesHeader."Print Posted Documents");
OnAfterPrepareSalesHeader(SalesHeader);
end;
procedure SetPostingCodeunitId(NewPostingCodeunitId: Integer)
begin
PostingCodeunitId := NewPostingCodeunitId;
end;
local procedure CalculateInvoiceDiscount(var SalesHeader: Record "Sales Header")
var
SalesLine: Record "Sales Line";
begin
SalesLine.Reset();
SalesLine.SetRange("Document Type", SalesHeader."Document Type");
SalesLine.SetRange("Document No.", SalesHeader."No.");
if SalesLine.FindFirst then begin
CODEUNIT.Run(CODEUNIT::"Sales-Calc. Discount", SalesLine);
Commit();
SalesHeader.Get(SalesHeader."Document Type", SalesHeader."No.");
end;
end;
local procedure CanPostDocument(var SalesHeader: Record "Sales Header"): Boolean
var
ApprovalsMgmt: Codeunit "Approvals Mgmt.";
begin
if ApprovalsMgmt.IsSalesApprovalsWorkflowEnabled(SalesHeader) then
exit(false);
if SalesHeader.Status = SalesHeader.Status::"Pending Approval" then
exit(false);
if not SalesHeader.IsApprovedForPostingBatch then
exit(false);
exit(true);
end;
[EventSubscriber(ObjectType::Codeunit, 1380, 'OnBeforeBatchProcessing', '', false, false)]
local procedure PrepareSalesHeaderOnBeforeBatchProcessing(var RecRef: RecordRef; var BatchConfirm: Option)
var
SalesHeader: Record "Sales Header";
begin
RecRef.SetTable(SalesHeader);
PrepareSalesHeader(SalesHeader, BatchConfirm);
RecRef.GetTable(SalesHeader);
end;
[EventSubscriber(ObjectType::Codeunit, 1380, 'OnVerifyRecord', '', false, false)]
local procedure CheckSalesHeaderOnVerifyRecord(var RecRef: RecordRef; var Result: Boolean)
var
SalesHeader: Record "Sales Header";
begin
RecRef.SetTable(SalesHeader);
Result := CanPostDocument(SalesHeader);
RecRef.GetTable(SalesHeader);
end;
[IntegrationEvent(false, false)]
local procedure OnAfterPrepareSalesHeader(var SalesHeader: Record "Sales Header")
begin
end;
}