How to solve this issue in Service Contract Invoice creation
Aravindh_Navision
Member Posts: 258
Hi Friends,
Navision Default Scenario in Service Contract creation:
When I create a Service Contract, the Starting Date that I give is 12-04-15. I will give the Invoice Period as "Two Months". I can create Service invoice directly while "Signing Contract" or run the the batch job "Create Contract Invoice". So initially the Service Contract creates partial invoice for 12-04-15 to 30-04-15. Then the next invoice creates for 01-05-15 and 31-05-15.
Customized Scenario:
I have done a customization. I will give "Start Inv. from Start Date" (boolean field as TRUE - a customization field). When I create a Service Contract, the Starting Date that I give is 12-04-15. I will give the Invoice Period as "Two Months". In this case I can create the invoice by running the batch job "Create Contract Invoice" only. Then the first invoice creates for the period 12-04-15 to 11-06-15. Then the next invoice creates for 12-06-15 and 11-08-15. All these modifications are running fine.
When I give the Expiration Date (Header's Details tab) or Contract Expiration Date (Line) say between second invoice period 12-06-15 and 11-08-15 or later, then it is working fine. But when I give the expiration date between the first invoice date period 12-04-15 to 11-06-15, I am getting the error "Service Ledger Entry Entry No xxxxx does not exist." or "The date is invalid."
Since I am unable to attach the txt/fob files, I have given the objects's code herewith.
I am calling the customized function in Codeunit from the batch job report.
Report: 6030 - Create Contract Invoices (batch job report)
Service Contract Header - OnAfterGetRecord()
Codeunit 5944 - SignServContractDoc [Customized Area contains customized code]
SignContract(FromServContractHeader : Record "Service Contract Header")
Two new function I have created:
UpdateServiceInvoice(recServConHead : Record "Service Contract Header";cdeInvoiceNo : Code[20])
UpdateServiceLedger(recServConHead : Record "Service Contract Header";cdeInvNo : Code[20])
Can anyone please help me where I have made mistake?
Thanks in advance,
Aravindh R.
Navision Default Scenario in Service Contract creation:
When I create a Service Contract, the Starting Date that I give is 12-04-15. I will give the Invoice Period as "Two Months". I can create Service invoice directly while "Signing Contract" or run the the batch job "Create Contract Invoice". So initially the Service Contract creates partial invoice for 12-04-15 to 30-04-15. Then the next invoice creates for 01-05-15 and 31-05-15.
Customized Scenario:
I have done a customization. I will give "Start Inv. from Start Date" (boolean field as TRUE - a customization field). When I create a Service Contract, the Starting Date that I give is 12-04-15. I will give the Invoice Period as "Two Months". In this case I can create the invoice by running the batch job "Create Contract Invoice" only. Then the first invoice creates for the period 12-04-15 to 11-06-15. Then the next invoice creates for 12-06-15 and 11-08-15. All these modifications are running fine.
When I give the Expiration Date (Header's Details tab) or Contract Expiration Date (Line) say between second invoice period 12-06-15 and 11-08-15 or later, then it is working fine. But when I give the expiration date between the first invoice date period 12-04-15 to 11-06-15, I am getting the error "Service Ledger Entry Entry No xxxxx does not exist." or "The date is invalid."
Since I am unable to attach the txt/fob files, I have given the objects's code herewith.
I am calling the customized function in Codeunit from the batch job report.
Report: 6030 - Create Contract Invoices (batch job report)
Service Contract Header - OnAfterGetRecord()
IF (ServContractHeader."Start Inv. from Start Date") THEN BEGIN
IF intCount = 1 THEN BEGIN
cuSignServ.UpdateServiceInvoice(ServContractHeader,'');
cuSignServ.UpdateServiceLedger(ServContractHeader,'');
END ELSE BEGIN
cuSignServ.UpdateServiceInvoice(ServContractHeader,InvoiceNo);
cuSignServ.UpdateServiceLedger(ServContractHeader,InvoiceNo);
END;
END;
Codeunit 5944 - SignServContractDoc [Customized Area contains customized code]
SignContract(FromServContractHeader : Record "Service Contract Header")
IF NOT HideDialog THEN
CLEARALL;
ServContractHeader := FromServContractHeader;
IF ServContractHeader.Status = ServContractHeader.Status::Signed THEN
EXIT;
IF ServContractHeader.Status = ServContractHeader.Status::Canceled THEN
ERROR(Text024);
ServContractHeader.TESTFIELD("Serv. Contract Acc. Gr. Code");
ServContractHeader.TESTFIELD("Service Period");
ServContractHeader.CALCFIELDS("Calcd. Annual Amount");
IF ServContractHeader."Annual Amount" <> ServContractHeader."Calcd. Annual Amount" THEN
ERROR(Text023,ServContractHeader.FIELDCAPTION("Annual Amount"),
ServContractHeader.FIELDCAPTION("Calcd. Annual Amount"));
IF ServContractHeader."Annual Amount" < 0 THEN
ERROR(Text019);
ServContractAccGr.GET(ServContractHeader."Serv. Contract Acc. Gr. Code");
ServContractAccGr.TESTFIELD("Non-Prepaid Contract Acc.");
GLAcc.GET(ServContractAccGr."Non-Prepaid Contract Acc.");
GLAcc.TESTFIELD("Direct Posting");
IF (ServContractHeader.Prepaid) THEN BEGIN
ServContractAccGr.TESTFIELD("Prepaid Contract Acc.");
GLAcc.GET(ServContractAccGr."Prepaid Contract Acc.");
GLAcc.TESTFIELD("Direct Posting");
END;
ServContractLine.RESET;
ServContractLine.SETRANGE("Contract Type",ServContractHeader."Contract Type");
ServContractLine.SETRANGE("Contract No.",ServContractHeader."Contract No.");
ServContractLine.SETRANGE("Line Amount",0);
IF ServContractLine.FIND('-') THEN
ERROR(
Text004,
ServContractHeader."Contract No.",
ServContractLine.FIELDCAPTION("Line Amount"));
//>> EC1.65
ServContractLine.SETRANGE("Line Amount");
ServContractLine.SETFILTER("Service Item No.", '<>%1', '');
ServContractLine.SETRANGE("Shortcut Dimension 2 Code", '');
IF ServContractLine.FINDFIRST THEN
ServContractLine.TESTFIELD("Shortcut Dimension 2 Code")
ELSE
ServContractLine.RESET;
//<< EC1.65
//>>EC1.95
ServContractLine2.SETRANGE("Contract Type",ServContractHeader."Contract Type"::Contract);
ServContractLine2.SETRANGE("Contract No.",ServContractHeader."Contract No.");
ServContractLine2.SETRANGE(ServContractLine2."Invoice Description Code", '');
IF ServContractLine2.FINDFIRST THEN
ERROR('Invoice Description Code must not be blank' );
//ServContractLine2.TESTFIELD("Invoice Description Code");
//<<EC1.95
ServContractHeader.TESTFIELD("Starting Date");
IF ServContractHeader."Invoice Period" <> ServContractHeader."Invoice Period"::None THEN BEGIN
IF ServContractHeader."Annual Amount" = 0 THEN
ERROR(Text020);
ServContractHeader.TESTFIELD("Amount per Period");
END;
ServMgtSetup.GET;
IF ServMgtSetup."Salesperson Mandatory" THEN
ServContractHeader.TESTFIELD("Salesperson Code");
IF ServContractHeader."Invoice Period" <> ServContractHeader."Invoice Period"::None THEN BEGIN
IF ServContractHeader.Prepaid THEN BEGIN
IF CALCDATE(
'<-CM>',ServContractHeader."Next Invoice Date")
<> ServContractHeader."Next Invoice Date"
THEN
ERROR(Text003,ServContractHeader.FIELDCAPTION("Next Invoice Date"));
END ELSE BEGIN
IF
CALCDATE('<CM>',ServContractHeader."Next Invoice Date")
<> ServContractHeader."Next Invoice Date"
THEN
IF NOT HideDialog THEN
IF NOT CONFIRM(
STRSUBSTNO(
Text005,
ServContractHeader.FIELDCAPTION("Next Invoice Date")))
THEN
EXIT;
END;
END;
IF ServMgtSetup."Contract Rsp. Time Mandatory" THEN BEGIN
ServContractLine.RESET;
ServContractLine.SETRANGE("Contract Type",ServContractHeader."Contract Type");
ServContractLine.SETRANGE("Contract No.",ServContractHeader."Contract No.");
ServContractLine.SETRANGE("Response Time (Hours)",0);
IF ServContractLine.FIND('-') THEN
ServContractLine.FIELDERROR("Response Time (Hours)");
END;
ServContractMgt.CopyCheckSCDimToTempSCDim(ServContractHeader);
IF NOT HideDialog THEN
IF NOT CONFIRM(Text010,TRUE,ServContractHeader."Contract No.") THEN
EXIT;
IF NOT HideDialog THEN BEGIN
FromServContractLine.RESET;
FromServContractLine.SETRANGE("Contract Type",FromServContractHeader."Contract Type");
FromServContractLine.SETRANGE("Contract No.",FromServContractHeader."Contract No.");
FromServContractLine.SETRANGE("Next Planned Service Date",0D);
IF FromServContractLine.FIND('-') THEN
IF NOT
CONFIRM(
Text022,
TRUE,
FromServContractLine.FIELDCAPTION("Next Planned Service Date"))
THEN
EXIT;
END;
Window.OPEN(
Text012 +
Text013);
FiledServContractHeader.FileQuotationBeforeSigning(ServContractHeader);
// Customized Area
IF (ServContractHeader."Start Inv. from Start Date") THEN BEGIN
locServContractLine.RESET;
locServContractLine.SETRANGE("Contract Type",ServContractHeader."Contract Type");
locServContractLine.SETRANGE("Contract No.",ServContractHeader."Contract No.");
IF locServContractLine.FIND('-') THEN BEGIN
REPEAT
locServContractLine."New Line" := FALSE;
locServContractLine.MODIFY;
UNTIL locServContractLine.NEXT = 0;
END;
ServContractHeader."Change Status" := ServContractHeader."Change Status"::Locked;
ServContractHeader.Status := ServContractHeader.Status::Signed;
ServContractHeader.MODIFY;
EXIT;
END;
// Customized Area
Window.UPDATE(1,1);
WPostLine := 0;
InvoicingStartingPeriod := FALSE;
IF ServContractHeader."Invoice Period" <> ServContractHeader."Invoice Period"::None THEN BEGIN
IF ServContractHeader.Prepaid THEN BEGIN
IF ServContractHeader."Starting Date" < ServContractHeader."Next Invoice Date" THEN BEGIN
IF HideDialog THEN
InvoiceNow := TRUE
ELSE
IF CONFIRM(Text015,TRUE,
ServContractHeader."Starting Date",ServContractHeader."Next Invoice Date" - 1)
THEN
InvoiceNow := TRUE;
InvoiceFrom := ServContractHeader."Starting Date";
InvoiceTo := ServContractHeader."Next Invoice Date" - 1;
END;
END ELSE BEGIN
GoOut := TRUE;
TempDate := ServContractHeader."Next Invoice Period Start";
IF ServContractHeader."Starting Date" < TempDate THEN BEGIN
TempDate := TempDate -1;
GoOut := FALSE;
END;
IF NOT GoOut THEN BEGIN
IF HideDialog THEN
InvoiceNow := TRUE
ELSE
IF CONFIRM(
Text015,TRUE,
ServContractHeader."Starting Date",TempDate)
THEN
InvoiceNow := TRUE;
InvoiceFrom := ServContractHeader."Starting Date";
InvoiceTo := TempDate;
InvoicingStartingPeriod := TRUE;
END;
END;
END;
IF InvoiceNow THEN BEGIN
PostingDate := InvoiceFrom;
AmountNow := ServContractMgt.CalcContractAmount(ServContractHeader,InvoiceFrom,InvoiceTo);
END;
IF InvoiceNow THEN BEGIN
ServContractHeader."Last Invoice Date" := ServContractHeader."Starting Date";
ServContractHeader.VALIDATE("Last Invoice Period End",InvoiceTo);
END;
ServContractLine.RESET;
ServContractLine.SETRANGE("Contract Type",FromServContractHeader."Contract Type");
ServContractLine.SETRANGE("Contract No.",FromServContractHeader."Contract No.");
IF ServContractLine.FIND('-') THEN REPEAT
ServContractLine."Contract Status" := ServContractLine."Contract Status"::Signed;
ServContractLine.MODIFY;
CLEAR(ServLogMgt);
WPostLine := WPostLine + 1;
Window.UPDATE(2,WPostLine);
UNTIL ServContractLine.NEXT = 0;
IF InvoicingStartingPeriod AND
NOT ServContractHeader.Prepaid AND
InvoiceNow
THEN BEGIN
ServContractHeader.VALIDATE("Last Invoice Date",InvoiceTo);
ServContractHeader.MODIFY;
END;
IF InvoiceNow THEN BEGIN
ServContractMgt.InitCodeUnit;
ServHeaderNo :=
ServContractMgt.CreateServHeader(ServContractHeader,PostingDate,FALSE);
ServHeader.GET(ServHeader."Document Type"::Invoice,ServHeaderNo);
ServMgtSetup.GET;
AppliedEntry :=
ServContractMgt.CreateServiceLedgerEntry(
ServHeader,ServContractHeader."Contract Type",
ServContractHeader."Contract No.",InvoiceFrom,
InvoiceTo,AmountNow,TRUE,FALSE,InvAmountRounded);
IF ServContractHeader."Contract Lines on Invoice" THEN BEGIN
ServContractLine.RESET;
ServContractLine.SETRANGE("Contract Type",ServContractHeader."Contract Type");
ServContractLine.SETRANGE("Contract No.",ServContractHeader."Contract No.");
IF ServContractLine.FIND('-') THEN
REPEAT
ServContractMgt.CreateDetailedServLine(
ServHeader,
ServContractLine,
ServContractHeader."Contract Type",
ServContractHeader."Contract No.");
UNTIL ServContractLine.NEXT = 0;
END ELSE
ServContractMgt.CreateHeadingServLine(
ServHeader,
ServContractHeader."Contract Type",
ServContractHeader."Contract No.");
ServContractMgt.CreateServLine(
ServHeader,
ServContractHeader."Contract Type",
ServContractHeader."Contract No.",
InvoiceFrom,InvoiceTo,InvAmountRounded,AppliedEntry,TRUE);
ServContractMgt.FinishServiceInvoice(ServHeader."No."); //EC1.32
ServContractHeader.MODIFY;
ServContractMgt.FinishCodeunit;
END;
ContractGainLossEntry.AddEntry(
2,ServContractHeader."Contract Type",
ServContractHeader."Contract No.",
ServContractHeader."Annual Amount",'');
ServContractHeader.Status := ServContractHeader.Status::Signed;
ServContractHeader."Change Status" := ServContractHeader."Change Status"::Locked;
ServContractHeader.MODIFY;
ServContractLine.RESET;
ServContractLine.SETRANGE("Contract Type",ServContractHeader."Contract Type");
ServContractLine.SETRANGE("Contract No.",ServContractHeader."Contract No.");
IF ServContractLine.FIND('-') THEN BEGIN
REPEAT
ServContractLine."New Line" := FALSE;
ServContractLine.MODIFY;
UNTIL ServContractLine.NEXT = 0;
END;
IF ServMgtSetup."Register Contract Changes" THEN
ContractChangeLog.LogContractChange(
ServContractHeader."Contract No.",0,ServContractHeader.FIELDCAPTION(Status),0,
'',FORMAT(ServContractHeader.Status),'',0);
CLEAR(FromServContractHeader);
Window.CLOSE;
IF NOT HideDialog THEN
IF ServHeaderNo <> '' THEN
MESSAGE(Text016,ServHeaderNo);
[/code]Two new function I have created:
UpdateServiceInvoice(recServConHead : Record "Service Contract Header";cdeInvoiceNo : Code[20])
IF cdeInvoiceNo = '' THEN
dtDate := recServConHead."Starting Date"
ELSE
dtDate := recServConHead."Last Invoice Date" +1;
recServCondHead1.GET(recServConHead."Contract Type",recServConHead."Contract No.");
recServContLine.RESET;
recServContLine.SETRANGE(recServContLine."Contract Type",recServContLine."Contract Type"::Contract);
recServContLine.SETRANGE(recServContLine."Contract No.", recServConHead."Contract No.");
IF recServContLine.FINDSET THEN
REPEAT
recServLine.RESET;
recServLine.SETRANGE(recServLine."Document Type",recServLine."Document Type"::Invoice);
IF ( cdeInvoiceNo <> '' ) THEN
recServLine.SETRANGE(recServLine."Document No.",cdeInvoiceNo);
recServLine.SETRANGE(recServLine."Contract No.",recServContLine."Contract No.");
recServLine.SETRANGE(recServLine."Contract Line No.",recServContLine."Line No.");
IF recServLine.FINDFIRST THEN BEGIN
CASE recServConHead."Invoice Period" OF
recServConHead."Invoice Period"::Month:
BEGIN
txtStart := FORMAT(dtDate);
txtEnd := FORMAT(CALCDATE('<+1M>',dtDate) - 1);
// recServLine.Description := txtStart + ' - ' + txtEnd;
END;
recServConHead."Invoice Period"::"Two Months":
BEGIN
txtStart := FORMAT(dtDate);
txtEnd := FORMAT(CALCDATE('<+2M>',dtDate) - 1);
// recServLine.Description := txtStart + ' - ' + txtEnd;
END;
recServConHead."Invoice Period"::Quarter:
BEGIN
txtStart := FORMAT(dtDate);
txtEnd := FORMAT(CALCDATE('<+3M>',dtDate) - 1);
// recServLine.Description := txtStart + ' - ' + txtEnd;
END;
recServConHead."Invoice Period"::"Half Year":
BEGIN
txtStart := FORMAT(dtDate);
txtEnd := FORMAT(CALCDATE('<+6M>',dtDate) - 1);
// recServLine.Description := txtStart + ' - ' + txtEnd;
END;
recServConHead."Invoice Period"::Year:
BEGIN
txtStart := FORMAT(dtDate);
txtEnd := FORMAT(CALCDATE('<+1Y>',dtDate) - 1);
// recServLine.Description := txtStart + ' - ' + txtEnd;
END;
END;
recServLine."Unit Price" := recServContLine."Line Amount";
IF recServConHead."Expiration Date" > 0D THEN BEGIN
IF (recServConHead."Next Invoice Date" = recServConHead."Expiration Date") THEN BEGIN
recServLine."Unit Price" := ROUND(((recServContLine."Line Amount" / 365) * (recServConHead."Next Invoice Date" -
recServConHead."Last Invoice Date")),0.01,'=');
recServLine.Description := txtStart + ' - ' + FORMAT(recServConHead."Next Invoice Date");
CASE recServConHead."Invoice Period" OF
recServConHead."Invoice Period"::Month:
recServLine."Unit Price" := recServLine."Unit Price" * 12;
recServConHead."Invoice Period"::"Two Months":
recServLine."Unit Price" := recServLine."Unit Price" * 6;
recServConHead."Invoice Period"::Quarter:
recServLine."Unit Price" := recServLine."Unit Price" * 4;
recServConHead."Invoice Period"::"Half Year":
recServLine."Unit Price" := recServLine."Unit Price" * 2;
recServConHead."Invoice Period"::Year:
recServLine."Unit Price" := recServLine."Unit Price" * 1;
END;
END;
END;
IF recServContLine."Contract Expiration Date" > 0D THEN BEGIN
IF ( recServContLine."Contract Expiration Date" = recServContLine."Invoiced to Date") THEN BEGIN
recServLine."Unit Price" := ROUND(((recServContLine."Line Amount" / 365)
* ( recServContLine."Contract Expiration Date" - recServConHead."Last Invoice Date")),0.01,'=');
recServLine.Description := FORMAT(recServConHead."Last Invoice Date"+1) + ' - '
+ FORMAT(recServContLine."Contract Expiration Date");
CASE recServConHead."Invoice Period" OF
recServConHead."Invoice Period"::Month:
recServLine."Unit Price" := recServLine."Unit Price" * 12;
recServConHead."Invoice Period"::"Two Months":
recServLine."Unit Price" := recServLine."Unit Price" * 6;
recServConHead."Invoice Period"::Quarter:
recServLine."Unit Price" := recServLine."Unit Price" * 4;
recServConHead."Invoice Period"::"Half Year":
recServLine."Unit Price" := recServLine."Unit Price" * 2;
recServConHead."Invoice Period"::Year:
recServLine."Unit Price" := recServLine."Unit Price" * 1;
END;
END;
END;
recServLine.Description :=
FORMAT(recServConHead."Next Invoice Period Start") + ' - ' + FORMAT(recServConHead."Next Invoice Period End");
recServLine.VALIDATE(recServLine."Unit Price");
recServLine.MODIFY;
END;
UNTIL recServContLine.NEXT = 0;
EVALUATE(dtStart,txtStart);
EVALUATE(dtEnd,txtEnd);
dtOldStart := dtStart;
CASE recServConHead."Invoice Period" OF
recServConHead."Invoice Period"::Month:
BEGIN
dtStart := (CALCDATE('<+1M>',dtStart));
dtEnd := (CALCDATE('<+1M>',dtEnd));
END;
recServConHead."Invoice Period"::"Two Months":
BEGIN
dtStart := (CALCDATE('<+2M>',dtStart));
dtEnd := (CALCDATE('<+2M>',dtEnd));
END;
recServConHead."Invoice Period"::Quarter:
BEGIN
dtStart := (CALCDATE('<+3M>',dtStart));
dtEnd := (CALCDATE('<+3M>',dtEnd));
END;
recServConHead."Invoice Period"::"Half Year":
BEGIN
dtStart := (CALCDATE('<+6M>',dtStart));
dtEnd := (CALCDATE('<+6M>',dtEnd));
END;
recServConHead."Invoice Period"::Year:
BEGIN
dtStart := (CALCDATE('<+1Y>',dtStart));
dtEnd := (CALCDATE('<+1Y>',dtEnd));
END;
END;
IF (DATE2DMY(dtDate,1) = 31) AND (DATE2DMY(dtStart,1) = 30) THEN BEGIN
IF (DATE2DMY(CALCDATE('CM',dtStart),1) = 30) THEN
dtStart := dtStart + 1;
END;
IF (DATE2DMY(dtStart,1) = 1) THEN BEGIN
CASE recServConHead."Invoice Period" OF
recServConHead."Invoice Period"::Month:
dtEnd := CALCDATE('CM',dtStart);
recServConHead."Invoice Period"::"Two Months":
dtEnd := (CALCDATE('1M+CM',dtStart));
recServConHead."Invoice Period"::Quarter:
dtEnd := (CALCDATE('2M+CM',dtStart));
recServConHead."Invoice Period"::"Half Year":
dtEnd := (CALCDATE('5M+CM',dtStart));
recServConHead."Invoice Period"::Year:
dtEnd := (CALCDATE('11M+CM',dtStart));
END;
END;
IF (DATE2DMY(dtStart,2) = 2)THEN BEGIN
IF (DATE2DMY(dtOldStart,1) = 29) OR (DATE2DMY(dtOldStart,1) = 30) OR
(DATE2DMY(dtOldStart,1) = 31) THEN
BEGIN
CLEAR(intCheck);
IF (DATE2DMY(dtStart,1) = 29) THEN
intCheck := 1;
IF (DATE2DMY(dtStart,1) = 28) THEN
BEGIN
IF (DATE2DMY(CALCDATE('CM',dtStart),1) = 28) THEN
intCheck := 1;
END;
IF (intCheck = 1) THEN BEGIN
dtStart := dtStart + 1;
CASE recServConHead."Invoice Period" OF
recServConHead."Invoice Period"::Month:
dtEnd := CALCDATE('CM',dtStart);
recServConHead."Invoice Period"::"Two Months":
dtEnd := (CALCDATE('1M+CM',dtStart));
recServConHead."Invoice Period"::Quarter:
dtEnd := (CALCDATE('2M+CM',dtStart));
recServConHead."Invoice Period"::"Half Year":
dtEnd := (CALCDATE('5M+CM',dtStart));
recServConHead."Invoice Period"::Year:
dtEnd := (CALCDATE('11M+CM',dtStart));
END;
END;
END;
END;
IF (recServConHead."Expiration Date" = 0D) THEN BEGIN
recServCondHead1."Last Invoice Date" := dtStart - 1;
recServCondHead1."Next Invoice Date" := dtEnd;
recServCondHead1."Next Invoice Period Start" := dtStart;
recServCondHead1."Next Invoice Period End" := dtEnd;
END ELSE BEGIN
IF (recServConHead."Next Invoice Date" = recServConHead."Expiration Date") THEN BEGIN
recServCondHead1."Last Invoice Date" := recServConHead."Expiration Date";
recServCondHead1."Next Invoice Date" := 0D;
recServCondHead1."Next Invoice Period Start" := 0D;
recServCondHead1."Next Invoice Period End" := 0D;
recServCondHead1."Amount per Period" := 0;
END ELSE IF (recServConHead."Next Invoice Date" < recServConHead."Expiration Date") THEN BEGIN
recServCondHead1."Last Invoice Date" := dtStart - 1;
IF dtEnd < recServConHead."Expiration Date" THEN BEGIN
recServCondHead1."Next Invoice Date" := dtEnd;
recServCondHead1."Next Invoice Period End" := dtEnd;
END ELSE BEGIN
recServCondHead1."Next Invoice Date" := recServConHead."Expiration Date";
recServCondHead1."Next Invoice Period End" := recServConHead."Expiration Date";
END;
recServCondHead1."Next Invoice Period Start" := dtStart;
recServCondHead1."Amount per Period" := recServConHead."Annual Amount";
END;
END;
recServCondHead1.MODIFY;
UpdateServiceLedger(recServConHead : Record "Service Contract Header";cdeInvNo : Code[20])
IF cdeInvNo = '' THEN
dtDate := recServConHead."Starting Date"
ELSE
dtDate := recServConHead."Last Invoice Date" +1;
recServContLine.RESET;
recServContLine.SETRANGE(recServContLine."Contract Type",recServContLine."Contract Type"::Contract);
recServContLine.SETRANGE(recServContLine."Contract No.",recServConHead."Contract No.");
IF recServContLine.FINDSET THEN
REPEAT
recServLedg.RESET;
recServLedg.SETRANGE(recServLedg."Service Contract No.",recServContLine."Contract No.");
IF (cdeInvNo <> '') THEN
recServLedg.SETRANGE(recServLedg."Document No.",cdeInvNo);
recServLedg.SETRANGE(recServLedg."Service Item No. (Serviced)",recServContLine."Service Item No.");
IF recServLedg.FINDFIRST THEN BEGIN
CASE recServConHead."Invoice Period" OF
recServConHead."Invoice Period"::Month:
BEGIN
txtStart := FORMAT(dtDate);
txtEnd := FORMAT(CALCDATE('<+1M>',dtDate) - 1);
recServLedg.Description := txtStart + ' - ' + txtEnd;
END;
recServConHead."Invoice Period"::"Two Months":
BEGIN
txtStart := FORMAT(dtDate);
txtEnd := FORMAT(CALCDATE('<+2M>',dtDate) - 1);
recServLedg.Description := txtStart + ' - ' + txtEnd;
END;
recServConHead."Invoice Period"::Quarter:
BEGIN
txtStart := FORMAT(dtDate);
txtEnd := FORMAT(CALCDATE('<+3M>',dtDate) - 1);
recServLedg.Description := txtStart + ' - ' + txtEnd;
END;
recServConHead."Invoice Period"::"Half Year":
BEGIN
txtStart := FORMAT(dtDate);
txtEnd := FORMAT(CALCDATE('<+6M>',dtDate) - 1);
recServLedg.Description := txtStart + ' - ' + txtEnd;
END;
recServConHead."Invoice Period"::Year:
BEGIN
txtStart := FORMAT(dtDate);
txtEnd := FORMAT(CALCDATE('<+1Y>',dtDate) - 1);
recServLedg.Description := txtStart + ' - ' + txtEnd;
END;
END;
recServLedg."Amount (LCY)" := -recServContLine."Line Amount";
recServLedg."Unit Price" := -recServContLine."Line Amount";
recServLedg.Amount := -recServContLine."Line Amount";
IF recServConHead."Expiration Date" > 0D THEN BEGIN
IF (recServConHead."Next Invoice Date" = recServConHead."Expiration Date") THEN BEGIN
recServLedg.Description := txtStart + ' - ' + FORMAT(recServConHead."Next Invoice Date");
CLEAR(decAmount);
decAmount := ROUND(((recServContLine."Line Amount" / 365) * (recServConHead."Next Invoice Date" -
recServConHead."Last Invoice Date")),0.01,'=');
CASE recServConHead."Invoice Period" OF
recServConHead."Invoice Period"::Month:
decAmount := decAmount * 12;
recServConHead."Invoice Period"::"Two Months":
decAmount := decAmount * 6;
recServConHead."Invoice Period"::Quarter:
decAmount := decAmount * 4;
recServConHead."Invoice Period"::"Half Year":
decAmount := decAmount * 2;
recServConHead."Invoice Period"::Year:
decAmount := decAmount * 1;
END;
recServLedg."Amount (LCY)" := -decAmount;
recServLedg."Unit Price" := -decAmount;
recServLedg.Amount := -decAmount;
END;
END;
IF recServContLine."Contract Expiration Date" > 0D THEN BEGIN
IF ( recServContLine."Contract Expiration Date" = recServContLine."Invoiced to Date") THEN BEGIN
CLEAR(decAmount);
decAmount := ROUND(((recServContLine."Line Amount" / 365)
* ( recServContLine."Contract Expiration Date" - recServConHead."Last Invoice Date")),0.01,'=');
recServLedg.Description := FORMAT(recServConHead."Last Invoice Date"+1) + ' - '
+ FORMAT(recServContLine."Contract Expiration Date");
CASE recServConHead."Invoice Period" OF
recServConHead."Invoice Period"::Month:
decAmount := decAmount * 12;
recServConHead."Invoice Period"::"Two Months":
decAmount := decAmount * 6;
recServConHead."Invoice Period"::Quarter:
decAmount := decAmount * 4;
recServConHead."Invoice Period"::"Half Year":
decAmount := decAmount * 2;
recServConHead."Invoice Period"::Year:
decAmount := decAmount * 1;
END;
recServLedg."Amount (LCY)" := -decAmount;
recServLedg."Unit Price" := -decAmount;
recServLedg.Amount := -decAmount;
END;
END;
recServLedg.Description :=
FORMAT(recServConHead."Next Invoice Period Start") + ' - ' + FORMAT(recServConHead."Next Invoice Period End");
recServLedg.MODIFY;
END;
UNTIL recServContLine.NEXT = 0;
Can anyone please help me where I have made mistake?
Thanks in advance,
Aravindh R.
0
Categories
- All Categories
- 73 General
- 73 Announcements
- 66.6K Microsoft Dynamics NAV
- 18.7K NAV Three Tier
- 38.4K NAV/Navision Classic Client
- 3.6K Navision Attain
- 2.4K Navision Financials
- 116 Navision DOS
- 851 Navision e-Commerce
- 1K NAV Tips & Tricks
- 772 NAV Dutch speaking only
- 617 NAV Courses, Exams & Certification
- 2K Microsoft Dynamics-Other
- 1.5K Dynamics AX
- 323 Dynamics CRM
- 111 Dynamics GP
- 10 Dynamics SL
- 1.5K Other
- 990 SQL General
- 383 SQL Performance
- 34 SQL Tips & Tricks
- 35 Design Patterns (General & Best Practices)
- 1 Architectural Patterns
- 10 Design Patterns
- 5 Implementation Patterns
- 53 3rd Party Products, Services & Events
- 1.6K General
- 1.1K General Chat
- 1.6K Website
- 83 Testing
- 1.2K Download section
- 23 How Tos section
- 252 Feedback
- 12 NAV TechDays 2013 Sessions
- 13 NAV TechDays 2012 Sessions