{$X+,V-,B-}
Program tstacct; {as of 940601}

{ Testprogram for the nwAcct unit / NwTP 0.5 API. (c) 1993,1994, R.Spronk }

{ Tests the following nwAcct functions:

  AccountingInstalled
  AddAccountingServer
  DeleteAccountHolds
  DeleteAccountingServer
  GetAccountStatus
  SetAccountStatus
  SubmitAccountCharge
  SubmitAccountHold
  SubmitAccountNote
}

uses nwBindry,nwConn,nwAcct;

CONST testObjName='TEST';

Var connId    :byte;
    currServer:string;
    balance,limit,holds      :Longint;
    newBalance,newLimit      :LongInt;
    nCharge,nCancelHoldAmount:Longint;
    oldBalance,Oldholds      :LongInt;

begin
writeln('Test of the accounting functions.');
writeln;
writeln('You have to be logged in as SUPERVISOR');
writeln('User ',testObjName,' has to exists. (hardcoded in source, change if needed).');
writeln;
If NOT AccountingInstalled
 then begin
      writeln('error#:',nwAcct.result);
      write('Err:Accounting isn''t installed on the current effective server:');
      GetEffectiveConnectionID(ConnID);
      GetFileServerName(connId,currServer);
      writeln(currServer);
      halt(1);
      end;

AddAccountingServer('SUPERVISOR',OT_USER);


IF GetAccountStatus(testObjName,OT_USER,balance,limit,holds)
  then begin
       writeln('Current account status for user ',testObjName,' :');
       writeln('Balance     :',balance);
       writeln('Credit Limit:',limit);
       writeln('Holds       :',holds);
       end
  else writeln('Err: GetAccountStatus failed. error #',nwAcct.result);

writeln('Setting new account values..');
newBalance:=1020304;
newLimit:=123456;
IF NOT SetAccountStatus(testObjName,OT_USER,newBalance,newLimit)
 then writeln('Err: SetAccountStatus failed. error #',nwAcct.result);

IF GetAccountStatus(testObjName,OT_USER,balance,limit,holds)
  then begin
       writeln('Current account status for user ',testObjName,' :');
       writeln('Balance     :',balance);
       writeln('Credit Limit:',limit);
       writeln('Holds       :',holds);
       if (balance<>newBalance) or (newLimit<>Limit)
        then writeln('Err: the new account values where not set!');
       end
  else writeln('Err: GetAccountStatus failed. error #',nwAcct.result);

OldBalance:=balance;
nCharge:=100;
nCancelHoldAmount:=0;
Writeln('Submitting an account charge. charge=',ncharge,',CancelHold=',ncancelholdamount);
IF NOT SubmitAccountCharge(testObjName,OT_USER,nCharge,nCancelHoldAmount,
                           OT_USER,0,'no note')
 then writeln('Err: SubmitAccountCharge failed. error #',nwAcct.result);

IF GetAccountStatus(testObjName,OT_USER,balance,limit,holds)
  then begin
       writeln('Current account status for user ',testObjName,' :');
       writeln('Balance     :',balance);
       writeln('Credit Limit:',limit);
       writeln('Holds       :',holds);
       if (balance<>(oldBalance-nCharge))
        then writeln('Err: the account charge was not carried out !');
       end
  else writeln('Err: GetAccountStatus failed. error #',nwAcct.result);


OldBalance:=balance;
nCharge:=-200;
nCancelHoldAmount:=0;
Writeln('Submitting a NEGATIVE account charge. charge=',ncharge,',CancelHold=',ncancelholdamount);
Writeln(' (in fact increasing the balance of the ',testObjName,' object.');
IF NOT SubmitAccountCharge(testObjName,OT_USER,nCharge,nCancelHoldAmount,
                           OT_USER,99,'charge! charge!')
 then writeln('Err: SubmitAccountCharge failed. error #',nwAcct.result);

IF GetAccountStatus(testObjName,OT_USER,balance,limit,holds)
  then begin
       writeln('Current account status for user ',testObjName,' :');
       writeln('Balance     :',balance);
       writeln('Credit Limit:',limit);
       writeln('Holds       :',holds);
       if (balance<>(oldBalance-nCharge))
        then writeln('Err: the account charge was not carried out !');
       end
  else writeln('Err: GetAccountStatus failed. error #',nwAcct.result);

OldHolds:=holds;
writeln('Submit an hold in the amount of 1234');
IF SubmitAccountHold(testObjName,OT_USER,1234)
 then begin
      GetAccountStatus(testObjName,OT_USER,balance,limit,holds);
      writeln('Current account status for user ',testObjName,' :');
      writeln('Balance     :',balance);
      writeln('Credit Limit:',limit);
      writeln('Holds       :',holds);

      if (holds<>(OldHolds+1234))
        then writeln('Err: the account hold was not carried out !');
      end
 else writeln('Err: SubmitAccountHold failed. error #',nwAcct.result);

Writeln('Submit a charge of 1000, unhold 1234');
OldHolds:=holds;
nCharge:=1000;
nCancelHoldAmount:=1234;
IF SubmitAccountCharge(testObjName,OT_USER,nCharge,nCancelHoldAmount,
                       OT_USER,99,'let''s charge a few bucks :-)')
 then begin
      GetAccountStatus(testObjName,OT_USER,balance,limit,holds);
      writeln('Current account status for user ',testObjName,' :');
      writeln('Balance     :',balance);
      writeln('Credit Limit:',limit);
      writeln('Holds       :',holds);

      if (holds<>(OldHolds-1234))
        then writeln('Err: the account hold was not carried out !');
      end
 else writeln('Err: SubmitAccountHold failed. error #',nwAcct.result);

IF DeleteAccountHolds(testObjName,OT_USER)
 then begin
      writeln('All further holds bythis accounting server were released.');
      GetAccountStatus(testObjName,OT_USER,balance,limit,holds);
      writeln('Current account status for user ',testObjName,' :');
      writeln('Balance     :',balance);
      writeln('Credit Limit:',limit);
      writeln('Holds       :',holds);
      end
 else writeln('Err: DeleteAccountHolds failed. error #',nwAcct.result);

IF SubmitAccountNote(testObjName,OT_USER,
                     OT_USER,99,'<<TEST OF ACCOUNTNOTE>>')
   then begin
        writeln('Accountnote was submitted correctly.');
        writeln('Please use a hexeditor and have look at \system\net$acct.dat');
        writeln('to check if the accountnote was added to the file.');
        end
  else writeln('Err: SubmitAccountNote failed. error #',nwAcct.result);

IF NOT DeleteAccountingServer('SUPERVISOR',1)
 then writeln('Err: DeleteAccountServer failed. error #',nwacct.result);

end.