Please help me understand this code

asemberengasembereng Member Posts: 220
this code generates a report that calculates benefits but it does not go past 31/12/08... It seems as if it is hard coded to stop there.. I want it to do beyond that.
Documentation()

BenefitsRate - OnPreDataItem()


FromDate := 010189D;

// Check if balances exist or not.
Balances.SETCURRENTKEY("SS #");
IF Balances.GET(Empid) = TRUE THEN BEGIN
BalBrFwd := Balances.BalBrFwd;
END ELSE BEGIN
BalBrFwd := 0.00;
END;
// Balance checking ends here.

I := 0;


SETRANGE("Period Start",FromDate,ApprovalDate);


totalBenefits := -1;
BenefitIndex := 0;
PaidInFull := 0;

User.SETCURRENTKEY("User ID");
User.GET(USERID);
UserName := User.Name;


Cont.RESET;
Cont.SETCURRENTKEY("Employee No.","From Date");
Cont.SETRANGE("Employee No.", Empid);
Cont.SETRANGE("From Date",FromDate,ApprovalDate);

IF Cont.FIND('-') THEN
BEGIN
FirstYearContPeriodDate := Cont."From Date";
FirstYearContNotBeginJanuary := FALSE;
FirstYearContPeriodNumber := 0;


BenefitsTable.SETCURRENTKEY("Period Start");
BenefitsTable.SETFILTER("Period Start",'<=%1',FirstYearContPeriodDate);
BenefitsTable.FIND('+');

{MESSAGE( 'FirstYearCont%1 -- BPPeriodStart %2  BTM:%3  FCM%4'
 ,  FORMAT(FirstYearContPeriodDate,0,'<Day>/<Month>/<Year4>'),
                                             FORMAT(BenefitsTable."Period Start",0,'<Day>/<Month>/<Year4>'),
                                             DATE2DMY(BenefitsTable."Period Start",2),
                                             DATE2DMY(FirstYearContPeriodDate,2));
 }

IF (BalBrFwd = 0.00) AND (DATE2DMY(BenefitsTable."Period Start",2) <> DATE2DMY(FirstYearContPeriodDate,2) ) THEN
BEGIN
 //MESSAGE('TRUE');
 FirstYearContNotBeginJanuary := TRUE;
 FirstYearContPeriodNumber := 1;
END;


END;

// if a benefit payment occurs in the same year as the first year of contributions that does not
// start in january than we need to handle this somehow. Payment can not be in the same month I assume
// So is always following it So have if case to handle this possibility.

BenefitsRate - OnAfterGetRecord()
IF I <> 0 THEN
  BalBrFwd := ClBal;

I+=1;

// It is possible to pay in full and continue to post contributions in rare cases
// No interest is paid in this case
// IF PaidInFull THEN
// CurrReport.SKIP;

FOR J := 1 TO 50 DO
BEGIN
  BenefitPayDateArr[J] :=  0D;
  BenefitPayAmountArr[J] :=  0.0;
  PercentPayedArr[J] := 0.0;
END;

Rat := Rate;

benefitPay.RESET;
benefitPay.SETCURRENTKEY("Employee No.","Payment Date");
benefitPay.SETRANGE("Employee No.", Empid);
benefitPay.SETRANGE("Payment Date","Period Start","Period End");



J := 1;
IF benefitPay.FIND('-') THEN
REPEAT

  BenefitPayDateArr[J] :=  benefitPay."Payment Date";
  BenefitPayAmountArr[J] :=  benefitPay.Amounts;
  PercentPayedArr[J] := benefitPay."Percentage Paid";
  J := J + 1;

UNTIL benefitPay.NEXT <= 0;




IF (benefitPay.COUNT > 0) THEN
BEGIN




  IF ( BenefitIndex = 0 ) THEN
  BEGIN

   IF FirstYearContNotBeginJanuary AND (FirstYearContPeriodNumber = 1)  AND
     (("Period Start" < FirstYearContPeriodDate) AND  ("Period End" > FirstYearContPeriodDate)) THEN
   BEGIN
   //MESSAGE( 'x%1' , DATE2DMY(FirstYearContPeriodDate,2));
    StartPeriodDate := "Period Start";
    EndPeriodDate := FirstYearContPeriodDate - 1;
    FirstYearContPeriodNumber := 2;
    BenefitsRate.NEXT(-1);
   END
   ELSE IF FirstYearContNotBeginJanuary AND  (FirstYearContPeriodNumber = 2) AND
     (("Period Start" < FirstYearContPeriodDate) AND ("Period End" > FirstYearContPeriodDate)) THEN
   BEGIN
    //MESSAGE( 'y%1' , DATE2DMY(FirstYearContPeriodDate,2));
    StartPeriodDate := FirstYearContPeriodDate;
    EndPeriodDate := BenefitPayDateArr[1] - 1;
    FirstYearContNotBeginJanuary := FALSE;
    FirstYearContPeriodNumber := 3;
// TODO handle the case where the benefit payment is the same as the first contribution
// this may possibly occur when refunding

    BenefitsRate.NEXT(-1);
   END
   ELSE
   BEGIN



    //MESSAGE( 'z' );

    // initialize benefit index
    BenefitIndex := 1;

    //  benefitPay.FIND('-');
    // calculate the intitial period prior to the payment date
    // TODO::::::handle case where end period is the samne as the end payment period::::TODO

      IF  FirstYearContPeriodNumber = 3 THEN
      BEGIN
        StartPeriodDate := BenefitPayDateArr[BenefitIndex];
        EndPeriodDate := BenefitPayDateArr[BenefitIndex];
        FirstYearContPeriodNumber := 4;
      END
      ELSE
      BEGIN
       StartPeriodDate := "Period Start";
       EndPeriodDate := BenefitPayDateArr[BenefitIndex];
      END;

      // if the start and end periods are the same then we have a complex case
      // We subtract the benefit smount and use the endperiod of either the next
      // payment period of the end period of the benefit rate if the former does not exist
 {
  MESSAGE('A - Start:%1  -- end:%2 ',
  FORMAT(StartPeriodDate,0,'<Day>/<Month>/<Year4>'),
  FORMAT(EndPeriodDate,0,'<Day>/<Month>/<Year4>'));
  }


      IF ( StartPeriodDate = EndPeriodDate ) THEN
      BEGIN

        benefitAmount := BenefitPayAmountArr[BenefitIndex];
        PercentPayed := PercentPayedArr[BenefitIndex];

        IF ( benefitPay.COUNT > BenefitIndex) THEN
        BEGIN

// MESSAGE('b- BI = %1'+'BDAte %2 ' + 'B-Count %3', BenefitIndex, BenefitPayDateArr[BenefitIndex], benefitPay.COUNT);

           IF (PaidInFull  = 0)  AND (PercentPayedArr[BenefitIndex] = 100) THEN
           BEGIN
                PaidInFull := 1;
           END;


          // There is no period calculated without a subtracted payment so we move to next benefit next time
          //BenefitIndex += 1;
          EndPeriodDate := BenefitPayDateArr[BenefitIndex + 1] ;
          benefitPay.NEXT(-1);



        END
        ELSE
        BEGIN
// MESSAGE('a- BI = %1'+'BA %2 ' + 'B-Count %3', BenefitIndex, BenefitPayDateArr[BenefitIndex], BenefitPayAmountArr[BenefitIndex]);
          benefitAmount := BenefitPayAmountArr[BenefitIndex];
          PercentPayed := PercentPayedArr[BenefitIndex];

          IF (PaidInFull  = 0)  AND (PercentPayedArr[BenefitIndex] = 100) THEN
           BEGIN
                PaidInFull := 2;
           END;


          EndPeriodDate := "Period End";
          BenefitIndex := 0;
        END;

      END
      ELSE
      BEGIN
          EndPeriodDate := BenefitPayDateArr[BenefitIndex] ;
          // handle initial payment there is only one period

           IF (PaidInFull  = 0)  AND (PercentPayedArr[BenefitIndex] = 100) THEN
           BEGIN
              //if StartPeriodDate = "Period Start" then
              //  PaidInFull := 2
              // else
                PaidInFull := 1;
           END;


          benefitAmount := 0;
          BenefitsRate.NEXT(-1);
          BenefitIndex := 1;

       END;

      END;

      Cont.RESET;
      Cont.SETCURRENTKEY("Employee No.","From Date");
      Cont.SETRANGE("Employee No.", Empid);
      Cont.SETRANGE("From Date",StartPeriodDate, EndPeriodDate);
      Cont.CALCSUMS(Quantity);
      ContForYear := Cont.Quantity;
      TotCont := BalBrFwd + ContForYear;



  END
  ELSE IF (BenefitIndex >= 1 ) THEN
  BEGIN

 //MESSAGE( 'z1' );
        // TODO::::::handle case where end period is the samne as the end payment period::::TODO

 //MESSAGE('a- BI = %1'+'BA %2 ' + 'B-Count %3', BenefitIndex, BenefitPayDateArr[BenefitIndex],BenefitPayAmountArr[BenefitIndex]);

        IF (BenefitPayDateArr[BenefitIndex] + 1) > "Period End" THEN
          StartPeriodDate := BenefitPayDateArr[BenefitIndex]
        ELSE
          StartPeriodDate := BenefitPayDateArr[BenefitIndex] + 1;

        benefitAmount := BenefitPayAmountArr[BenefitIndex];
        PercentPayed := PercentPayedArr[BenefitIndex];

        // MESSAGE('AAA BI = %1' + 'B Amount = %2'  , BenefitIndex, benefitPay.Amounts );

        IF ( benefitPay.COUNT > BenefitIndex ) THEN
        BEGIN
          BenefitIndex += 1;
          EndPeriodDate := BenefitPayDateArr[BenefitIndex] ;
          BenefitsRate.NEXT(-1);
 //MESSAGE('a-rate = %1'+'rat %2 ' + 'B-Count %3', Rate, Rat ,BenefitPayAmountArr[BenefitIndex]);

        END
        ELSE
        BEGIN
 //MESSAGE('b-rate = %1'+'rat %2 ' + 'B-Count %3', Rate, Rat ,BenefitPayAmountArr[BenefitIndex]);

          IF (PaidInFull  = 0)  AND (PercentPayedArr[BenefitIndex] = 100) THEN
           BEGIN
              IF StartPeriodDate = "Period Start" THEN
                PaidInFull := 2
               ELSE
                PaidInFull := 1;
           END;
          EndPeriodDate := "Period End";
          BenefitIndex := 0;
 { MESSAGE('XXX - Start:%1  -- end:%2 ',
  FORMAT(StartPeriodDate,0,'<Day>/<Month>/<Year4>'),
  FORMAT(EndPeriodDate,0,'<Day>/<Month>/<Year4>'));
  }
        END;

       Cont.RESET;
       Cont.SETCURRENTKEY("Employee No.","From Date");
       Cont.SETRANGE("Employee No.", Empid);
       Cont.SETRANGE("From Date",StartPeriodDate, EndPeriodDate);
       Cont.CALCSUMS(Quantity);
       ContForYear := Cont.Quantity;
    TotCont := BalBrFwd + ContForYear;
  END;


END
ELSE
BEGIN

// Do the calculation without benefit subttractions as none exist
// CALCSUM quantity for the period of similar interest in the benefits table

  IF FirstYearContNotBeginJanuary AND (FirstYearContPeriodNumber = 1)  AND
     (("Period Start" < FirstYearContPeriodDate) AND  ("Period End" > FirstYearContPeriodDate)) THEN
  BEGIN
   // MESSAGE( 'a%1' , DATE2DMY(FirstYearContPeriodDate,2));
    StartPeriodDate := "Period Start";
    EndPeriodDate := FirstYearContPeriodDate - 1;
    FirstYearContPeriodNumber := 2;
    BenefitsRate.NEXT(-1);
  END
  ELSE IF FirstYearContNotBeginJanuary AND  (FirstYearContPeriodNumber = 2) AND
     (("Period Start" < FirstYearContPeriodDate) AND ("Period End" > FirstYearContPeriodDate)) THEN
  BEGIN
  //  MESSAGE( 'b%1' , DATE2DMY(FirstYearContPeriodDate,2));
    StartPeriodDate := FirstYearContPeriodDate;
    EndPeriodDate := "Period End";
    FirstYearContNotBeginJanuary := FALSE;
  END
  ELSE
  BEGIN
 // MESSAGE( 'c%1' , DATE2DMY(FirstYearContPeriodDate,2));
   StartPeriodDate := "Period Start";
   EndPeriodDate := "Period End";
  END;


  Cont.RESET;
  Cont.SETCURRENTKEY("Employee No.","From Date");
  Cont.SETRANGE("Employee No.", Empid);
  Cont.SETRANGE("From Date",StartPeriodDate,EndPeriodDate);
  Cont.CALCSUMS(Quantity);
  ContForYear := Cont.Quantity;
  PercentPayed := 0;
  benefitAmount := 0;
  TotCont := BalBrFwd + ContForYear;

END;

IF (EndPeriodDate > ApprovalDate ) THEN
  BEGIN
  EndPeriodDate := ApprovalDate;
 { MESSAGE('A - Start:%1  -- end:%2 ',
  FORMAT(StartPeriodDate,0,'<Day>/<Month>/<Year4>'),
  FORMAT(EndPeriodDate,0,'<Day>/<Month>/<Year4>'));
  }
 END;

//MESSAGE('A - Start:%1  -- end:%2 ',
// FORMAT(StartPeriodDate,0,'<Day>/<Month>/<Year4>'),
// FORMAT(EndPeriodDate,0,'<Day>/<Month>/<Year4>'));




StartPeriodMonth := DATE2DMY(StartPeriodDate, 2);
EndPeriodMonth :=  DATE2DMY(EndPeriodDate, 2);

StartPeriodYear :=  DATE2DMY(StartPeriodDate, 3);
EndPeriodYear := DATE2DMY(EndPeriodDate, 3);


//MESSAGE('B - Start:%1  -- end:%2 ',
// FORMAT(StartPeriodDate,0,'<Day>/<Month>/<Year4>'),
// FORMAT(EndPeriodDate,0,'<Day>/<Month>/<Year4>'));


//MESSAGE('S %1 ' + ' E %2', StartPeriodMonth, EndPeriodMonth);

//PeriodDateText := FORMAT(StartPeriodDate,0,'<Day>/<Month>/<Year2>');


IF (StartPeriodDate = EndPeriodDate) THEN
BEGIN
      NofMonths := 0;

END
ELSE IF (EndPeriodYear = StartPeriodYear) THEN
BEGIN
      NofMonths := (EndPeriodMonth - StartPeriodMonth + 1 )
END
ELSE
BEGIN
      NofMonths := (EndPeriodMonth  - StartPeriodMonth + 1 );
      NofMonths := NofMonths + ((EndPeriodYear - StartPeriodYear ) * 12);
   // MESSAGE('D%1', NofMonths);
END;

// changed from from + 1 ) MOD 12 to MOD 12) + 1

NofMonths := NofMonths - 2;
NofMonths += (DATE2DMY(DMY2DATE(1, (StartPeriodMonth MOD 12) + 1, StartPeriodYear)-1,1) -  DATE2DMY(StartPeriodDate, 1) + 1)/
  DATE2DMY(DMY2DATE(1, (StartPeriodMonth MOD 12) + 1, StartPeriodYear)-1,1);

NofMonths += DATE2DMY(EndPeriodDate, 1)/ DATE2DMY(DMY2DATE(1, (EndPeriodMonth MOD 12) + 1, EndPeriodYear)-1,1);

IF (StartPeriodDate = EndPeriodDate) THEN
   NofMonths := 0;

MonthCorrectedIntRate :=  Rat * NofMonths/12.00000000000000 ;

// Calculate interests and total balances


IF (PaidInFull <= 1) THEN
BEGIN
  IntTotCont := ((ContForYear - benefitAmount) *  MonthCorrectedIntRate)/2 + BalBrFwd * MonthCorrectedIntRate;
  ClBal := BalBrFwd + ContForYear + IntTotCont - benefitAmount;

  //MESSAGE('PaidInFull %1 ', PaidInFull);

  IF (PaidInFull = 1) THEN
  BEGIN
   PaidInFull := 2;
  END;
END
ELSE
BEGIN
  // It is possible to pay in full and continue to post contributions in rare cases
  // No interest is paid in this case
  IntTotCont := 0;
  //MESSAGE('ContForYear %1 ' + ' benefitAmount %2 ', ContForYear, benefitAmount);
  ClBal := BalBrFwd + ContForYear - benefitAmount;
END;

TotalBenefitPayable := TotalBenefitPayablePercent/100 * ClBal;

BenefitsRate - OnPostDataItem()

{

Debugging statements used to determine period calculations

MESSAGE('S:%1- %2 - %3- %4',
 FORMAT(StartPeriodDate,0,'<Day>/<Month>/<Year4>'),
 FORMAT(DMY2DATE(1, (StartPeriodMonth + 1 ) MOD 12, StartPeriodYear)-1,0,'<Day>/<Month>/<Year4>'),
 FORMAT(EndPeriodDate,0,'<Day>/<Month>/<Year4>'),
 FORMAT(DMY2DATE(1, (EndPeriodMonth + 1) MOD 12, EndPeriodYear)-1,0,'<Day>/<Month>/<Year4>'));

MESSAGE('S:%1- %2 - %3/%4',
 FORMAT(StartPeriodDate,0,'<Day>/<Month>/<Year4>'),
 FORMAT(DMY2DATE(1, (StartPeriodMonth + 1 ) MOD 12, StartPeriodYear)-1,0,'<Day>/<Month>/<Year4>'),
 (DATE2DMY(DMY2DATE(1, (StartPeriodMonth + 1) MOD 12, StartPeriodYear)-1,1) -  DATE2DMY(StartPeriodDate, 1)) + 1,
 DATE2DMY(DMY2DATE(1, (StartPeriodMonth + 1) MOD 12, StartPeriodYear)-1,1));

MESSAGE('S:%1- %2 - %3/%4',
 FORMAT(EndPeriodDate,0,'<Day>/<Month>/<Year4>'),
 FORMAT(DMY2DATE(1, (EndPeriodMonth + 1) MOD 12, EndPeriodYear)-1,0,'<Day>/<Month>/<Year4>'),
 DATE2DMY(EndPeriodDate, 1),
 DATE2DMY(DMY2DATE(1, (EndPeriodMonth + 1) MOD 12, EndPeriodYear)-1,1));


MESSAGE('S:%1- %2 - %3/%4 - %5',
 FORMAT(StartPeriodDate,0,'<Day>/<Month>/<Year4>'),
 FORMAT(DMY2DATE(1, (StartPeriodMonth + 1 ) MOD 12, StartPeriodYear)-1,0,'<Day>/<Month>/<Year4>'),
 (DATE2DMY(DMY2DATE(1, (StartPeriodMonth + 1) MOD 12, StartPeriodYear)-1,1) -  DATE2DMY(StartPeriodDate, 1)) + 1,
 DATE2DMY(DMY2DATE(1, (StartPeriodMonth + 1) MOD 12, StartPeriodYear)-1,1),
 ((DATE2DMY(DMY2DATE(1, (StartPeriodMonth + 1) MOD 12, StartPeriodYear)-1,1) -  DATE2DMY(StartPeriodDate, 1)) + 1)/
 DATE2DMY(DMY2DATE(1, (StartPeriodMonth + 1) MOD 12, StartPeriodYear)-1,1));


    }

Comments

Sign In or Register to comment.