Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Currency amount rounding.
- with QryTemp do
- begin
- // Currency rules
- Close;
- SQL.Clear;
- SQL.Add('SELECT DISTINCT FDecimal, RoundRule FROM CURR WHERE CurrLid = ' + IntToStr(CurrLid));
- if ChargeDebug then
- R2Utils.ShowMessage('Get Currency RoundRule; %s',SQL.Text,'','',''); {ivde}
- Open;
- if not EOF then
- begin
- CurrRoundRule := FieldByName('RoundRule').AsInteger;
- CurrDecimals := FieldByName('FDecimal').AsInteger;
- end;
- Close;
- end;
- // Currency amount.
- If CurrRoundRule = 0 then
- begin
- Rnd00(SumCurrFinal, RndCurrFinal, CurrDecimals);
- Rnd00(SumCurrPreFinal, RndCurrPreFinal, CurrDecimals);
- Rnd00(SumCurrPrepay, RndCurrPrepay, CurrDecimals);
- end;
- If CurrRoundRule = 1 then // Rounded to closest .25, .50, .75 or .00
- begin
- Rnd25(SumCurrFinal, RndCurrFinal);
- Rnd25(SumCurrPreFinal, RndCurrPreFinal);
- Rnd25(SumCurrPrepay, RndCurrPrepay);
- end;
- If CurrRoundRule = 2 then // Rounded to closest 5, 10, 15, 20 ....
- begin
- Rnd500(SumCurrFinal, RndCurrFinal);
- Rnd500(SumCurrPreFinal, RndCurrPreFinal);
- Rnd500(SumCurrPrepay, RndCurrPrepay);
- end;
- // Local amount rounding.
- with QryTemp do
- begin
- // Local currency rules
- Close;
- SQL.Clear;
- SQL.Add('SELECT DISTINCT FDecimal, RoundRule FROM Curr WHERE Desc1 = ' + StrToSQL(Utils.GetIniStr('Defaults', 'Currency')));
- if ChargeDebug then
- R2Utils.ShowMessage('Get Local RoundRule; %s',SQL.Text,'','',''); {ivde}
- Open;
- if not EOF then
- begin
- LocalRoundRule := FieldByName('RoundRule').AsInteger;
- LocalDecimals := FieldByName('FDecimal').AsInteger;
- end;
- Close;
- end;
- If LocalRoundRule = 0 then
- begin
- Rnd00(SumFinalBrut, RndFinalBrut, LocalDecimals);
- Rnd00(SumPreFinalBrut, RndPreFinalBrut, LocalDecimals);
- Rnd00(SumPrepayBrut, RndPrepayBrut, LocalDecimals);
- Rnd00(SumFeeBrut, RndFeeBrut, LocalDecimals);
- Rnd00(SumEcommBrut, RndEcommBrut, LocalDecimals);
- Rnd00(SumDiscount1Brut,RndDiscount1Brut,LocalDecimals);
- Rnd00(SumDiscount2Brut,RndDiscount2Brut,LocalDecimals);
- Rnd00(SumDiscount3Brut,RndDiscount3Brut,LocalDecimals);
- Rnd00(SumDiscount4Brut,RndDiscount4Brut,LocalDecimals);
- Rnd00(SumDiscount5Brut,RndDiscount5Brut,LocalDecimals);
- end;
- If LocalRoundRule = 1 then // Rounded to closest .25, .50, .75 or .00
- begin
- Rnd25(SumFinalBrut, RndFinalBrut);
- Rnd25(SumPreFinalBrut, RndPreFinalBrut);
- Rnd25(SumPrepayBrut, RndPrepayBrut);
- Rnd25(SumFeeBrut, RndFeeBrut);
- Rnd25(SumEcommBrut, RndEcommBrut);
- Rnd25(SumDiscount1Brut,RndDiscount1Brut);
- Rnd25(SumDiscount2Brut,RndDiscount2Brut);
- Rnd25(SumDiscount3Brut,RndDiscount3Brut);
- Rnd25(SumDiscount4Brut,RndDiscount4Brut);
- Rnd25(SumDiscount5Brut,RndDiscount5Brut);
- end;
- If LocalRoundRule = 2 then // Rounded to closest 5, 10, 15, 20 ....
- begin
- Rnd500(SumFinalBrut, RndFinalBrut);
- Rnd500(SumPreFinalBrut, RndPreFinalBrut);
- Rnd500(SumPrepayBrut, RndPrepayBrut);
- Rnd500(SumFeeBrut, RndFeeBrut);
- Rnd500(SumEcommBrut, RndEcommBrut);
- Rnd500(SumDiscount1Brut,RndDiscount1Brut);
- Rnd500(SumDiscount2Brut,RndDiscount2Brut);
- Rnd500(SumDiscount3Brut,RndDiscount3Brut);
- Rnd500(SumDiscount4Brut,RndDiscount4Brut);
- Rnd500(SumDiscount5Brut,RndDiscount5Brut);
- end;
- end;
- with QryUpdateDoc do
- begin
- Close;
- SQL.Clear;
- SQL.Add('UPDATE CHARGEDOC SET');
- SQL.Add(' CurrFinal = ' + FloatToSQL(SumCurrFinal, CurrDecimals+2));
- SQL.Add(', CurrPreFinal = ' + FloatToSQL(SumCurrPreFinal, CurrDecimals+2));
- SQL.Add(', CurrPrepay = ' + FloatToSQL(SumCurrPrepay, CurrDecimals+2));
- SQL.Add(', FinalNet = ' + FloatToSQL(SumFinalNet, LocalDecimals+2));
- SQL.Add(', FinalBrut = ' + FloatToSQL(SumFinalBrut, LocalDecimals+2));
- SQL.Add(', FinalRounded = ' + FloatToSQL(RndFinalBrut, LocalDecimals+2));
- SQL.Add(', PreFinalNet = ' + FloatToSQL(SumPreFinalNet, LocalDecimals+2));
- SQL.Add(', PreFinalBrut = ' + FloatToSQL(SumPreFinalBrut, LocalDecimals+2));
- SQL.Add(', PreFinalRounded = ' + FloatToSQL(RndPreFinalBrut, LocalDecimals+2));
- SQL.Add(', PrePayNet = ' + FloatToSQL(SumPrePayNet, LocalDecimals+2));
- SQL.Add(', PrePayBrut = ' + FloatToSQL(SumPrePayBrut, LocalDecimals+2));
- SQL.Add(', PrePayRounded = ' + FloatToSQL(RndPrePayBrut, LocalDecimals+2));
- SQL.Add(', FeeNet = ' + FloatToSQL(SumFeeNet, LocalDecimals+2));
- SQL.Add(', FeeBrut = ' + FloatToSQL(SumFeeBrut, LocalDecimals+2));
- SQL.Add(', EcommNet = ' + FloatToSQL(SumEcommNet, LocalDecimals+2));
- SQL.Add(', EcommBrut = ' + FloatToSQL(SumEcommBrut, LocalDecimals+2));
- SQL.Add(', EcommRounded = ' + FloatToSQL(RndEcommBrut, LocalDecimals+2));
- SQL.Add(', Discount1Net = ' + FloatToSQL(SumDiscount1Net, LocalDecimals+2));
- SQL.Add(', Discount1Brut = ' + FloatToSQL(SumDiscount1Brut,LocalDecimals+2));
- SQL.Add(', Discount1Rounded = '+ FloatToSQL(RndDiscount1Brut,LocalDecimals+2));
- SQL.Add(', Discount2Net = ' + FloatToSQL(SumDiscount2Net, LocalDecimals+2));
- SQL.Add(', Discount2Brut = ' + FloatToSQL(SumDiscount2Brut,LocalDecimals+2));
- SQL.Add(', Discount2Rounded = '+ FloatToSQL(RndDiscount2Brut,LocalDecimals+2));
- SQL.Add(', Discount3Net = ' + FloatToSQL(SumDiscount3Net, LocalDecimals+2));
- SQL.Add(', Discount3Brut = ' + FloatToSQL(SumDiscount3Brut,LocalDecimals+2));
- SQL.Add(', Discount3Rounded = '+ FloatToSQL(RndDiscount3Brut,LocalDecimals+2));
- SQL.Add(', Discount4Net = ' + FloatToSQL(SumDiscount4Net, LocalDecimals+2));
- SQL.Add(', Discount4Brut = ' + FloatToSQL(SumDiscount4Brut,LocalDecimals+2));
- SQL.Add(', Discount4Rounded = '+ FloatToSQL(RndDiscount4Brut,LocalDecimals+2));
- SQL.Add(', Discount5Net = ' + FloatToSQL(SumDiscount5Net, LocalDecimals+2));
- SQL.Add(', Discount5Brut = ' + FloatToSQL(SumDiscount5Brut,LocalDecimals+2));
- SQL.Add(', Discount5Rounded = '+ FloatToSQL(RndDiscount5Brut,LocalDecimals+2));
- SQL.Add(' WHERE DOCLID = ' + IntToStr(SerialLid));
- if ChargeDebug then
- R2Utils.ShowMessage('UpdateDoc; %s',SQL.Text,'','','');
- sleep(GintWaitMsec);
- ExecSQL;
- end;
- Procedure TDoCharge.Rnd00(var OrgAmount, RndAmount: Real; NofDecimals: Integer);
- var
- X: Real;
- Y: Real;
- begin
- WriteLogg('Proc: Rnd00');
- if NofDecimals = 0 then
- begin //OrgAmount = 4,612
- X := StrToFloat(FloatToStrF(OrgAmount,ffFixed, 18, 0)); // X = 5,00
- RndAmount := X - OrgAmount; // 5,00 - 4,612 -> [0,388]
- OrgAmount := X; // 5,00 -> [5,00]
- end;
- if NofDecimals = 1 then
- begin
- X := StrToFloat(FloatToStrF(OrgAmount,ffFixed, 17, 1));
- RndAmount := X - OrgAmount;
- OrgAmount := X;
- end;
- if NofDecimals = 2 then
- begin //OrgAmount = 4,612
- X := StrToFloat(FloatToStrF(OrgAmount,ffFixed, 16, 2)); // X = 4,61
- RndAmount := X - OrgAmount; // 4,61 - 4,612 -> [-0,002]
- OrgAmount := X; // 4,61 -> [5,61]
- end;
- if NofDecimals = 3 then
- begin
- X := StrToFloat(FloatToStrF(OrgAmount,ffFixed, 15, 3));
- RndAmount := X - OrgAmount;
- OrgAmount := X;
- end;
- if NofDecimals = 4 then
- begin
- X := StrToFloat(FloatToStrF(OrgAmount,ffFixed, 14, 4));
- RndAmount := X - OrgAmount;
- OrgAmount := X;
- end;
- WriteLogg('Proc: Rnd00, Done!');
- end;
- // Rounded to 25, 50, 75, 00 (Curr.db:RoundRule #1)
- Procedure TDoCharge.Rnd25(var OrgAmount, RndAmount: Real);
- var
- X: Real;
- Y: Real;
- I: Integer;
- begin // OrgAmount = 4,61 4,63
- WriteLogg('Proc: Rnd25');
- I := Trunc(OrgAmount); // I = 4,00 4,00
- X := OrgAmount - I; // X = 0,61 0,63
- Y := 1.00; // Y = 1,00 1,00
- if X < 0.87 then Y := 0.75; // Y = 0,75 0,75
- if X < 0.62 then Y := 0.50; // Y = 0,50 N/A
- if X < 0.37 then Y := 0.25; // N/A N/A
- if X < 0.12 then Y := 0; // N/A N/A
- RndAmount := (I + Y) - OrgAmount; // RndAmount = (4,00 + 0,50) - 4,61 -> -0,11 0,12
- OrgAmount := (I + Y); // OrgAmoutn = (4,00 + 0,50) -> 4,50 4,75
- WriteLogg('Proc: Rnd25, Done!');
- end;
- // Rounded to 5, 10, 15, 20 (Curr.db:RoundRule #2)
- Procedure TDoCharge.Rnd500(var OrgAmount, RndAmount: Real);
- var
- X: Real;
- Y: Real;
- I: Integer;
- begin
- WriteLogg('Proc: Rnd500');
- OrgAmount := OrgAmount / 10;
- I := Trunc(OrgAmount);
- X := OrgAmount - I;
- Y := 1.00;
- if X < 0.5 then Y := 0;
- RndAmount := ((I + Y) - OrgAmount) * 10;
- OrgAmount := (I + Y) * 10;
- WriteLogg('Proc: Rnd500, Done!');
- end;
Add Comment
Please, Sign In to add comment