PAYMENTS.MOD 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. IMPLEMENTATION MODULE Payments;
  2. (*
  3. * ModBase
  4. * Release 3.0
  5. * (c) Copyright 1986 - 1991 PMI
  6. * P.O. Box 8402
  7. * Green Bay Wi 53308
  8. * All Rights Reserved
  9. * by Ed Ross
  10. *)
  11. FROM ModBase3 IMPORT UpdateDBFile,WriteDBRec,DeleteRecord,ReadDBRec,
  12. AppendBlank;
  13. FROM PMIGlobals IMPORT NormalTitle,OpenReportDevice,CloseReportDevice;
  14. FROM DateFunctions IMPORT Date,DaysSince1900,DateToStr;
  15. FROM ScrnUtl2 IMPORT CloseDisplayFrame;
  16. FROM Customer IMPORT GetCurrCustName;
  17. FROM DBStuff IMPORT FindAll,ReadAllRecs,ConditionType;
  18. FROM ScrnUtl1 IMPORT GetFieldRec,PutFieldRec,FieldNum,FieldListTotal;
  19. FROM FramePainter IMPORT ShowDisplayFrame;
  20. FROM DBUtils IMPORT PrintFrame;
  21. FROM NumTypes IMPORT Real8;
  22. FROM StrEdit IMPORT CrunchBlanks,OverWrite,Append;
  23. FROM M2Strings IMPORT CompareStr,Assign;
  24. FROM PosUtils IMPORT Equal;
  25. FROM StrConv IMPORT RealToStr;
  26. FROM SmartScreen IMPORT ClearScreen;
  27. FROM VStorage IMPORT DosAlloc;
  28. FROM VWindows IMPORT ClearPart, CurrentWindow, SetCursorHeight;
  29. FROM ScrnTypes IMPORT DisplayFrame,InputFieldRecord,InitDisplayFrame,
  30. AFrameName,DispCode;
  31. FROM InputManager IMPORT ControlFrame;
  32. FROM FrameManager IMPORT EraseFrame;
  33. FROM Prompts IMPORT Prompt,PromptStr,PromptYN;
  34. FROM SYSTEM IMPORT ADR,SIZE,ADDRESS;
  35. FROM ControlUtils IMPORT ControlSeparately, LoadFrameList,Control,
  36. AddStrField,AddMenuItem;
  37. FROM DspFiles IMPORT OpenDisplayFile,ReadDisplayFrame;
  38. FROM HandleIO IMPORT FileExists;
  39. FROM LowLevel IMPORT Fill;
  40. FROM GenLists IMPORT GenList, NewList,ListLength,SortList,
  41. GetElmt,GetElmtAdr,DisposeList,NilList;
  42. FROM DBFPayments IMPORT PaymentsDBF, OpenPaymentsDBF,CustidIdx,
  43. ClosePaymentsDBF,PaymentsRec,MovePaymentsToDBF,MovePaymentsFromDBF;
  44. PROCEDURE MakePayment(InvoiceNbr : ARRAY OF CHAR;
  45. Pmtdate : Date;
  46. PmtAmt : Real8;
  47. CheckNbr : ARRAY OF CHAR;
  48. CustID : ARRAY OF CHAR);
  49. VAR
  50. Payment :PaymentsRec;
  51. BEGIN
  52. IF PmtAmt < 0.01 (* don't add zero payments *)
  53. THEN RETURN;
  54. END;
  55. WITH Payment DO
  56. Assign( InvoiceNbr,INVOICE );
  57. PMTDATE := Pmtdate;
  58. PMTAMT := PmtAmt;
  59. Assign(CheckNbr,CHECKNB );
  60. Assign( CustID,CUSTID);
  61. END;
  62. AppendBlank(PaymentsDBF);
  63. MovePaymentsToDBF(Payment);
  64. WriteDBRec(PaymentsDBF);
  65. END MakePayment;
  66. PROCEDURE ReadARec(VAR AddressOfRec : ADDRESS; VAR SizeOfRec : CARDINAL);
  67. VAR
  68. P : POINTER TO PaymentsRec;
  69. BEGIN
  70. SizeOfRec := SIZE(P^);
  71. DosAlloc(P,SizeOfRec);
  72. MovePaymentsFromDBF(P^);
  73. AddressOfRec := P;
  74. END ReadARec;
  75. PROCEDURE SortByDate(P1 : ADDRESS; C1 :CARDINAL;
  76. P2 : ADDRESS; C2 : CARDINAL): INTEGER;
  77. (* sort by invoice then payment date within invoice *)
  78. VAR
  79. Pymt1,Pymt2 : POINTER TO PaymentsRec;
  80. Days1,Days2 : CARDINAL;
  81. BEGIN
  82. Pymt1 := P1;
  83. Pymt2 := P2;
  84. IF Equal(Pymt1^.INVOICE,Pymt2^.INVOICE)
  85. THEN
  86. Days1 := DaysSince1900(Pymt1^.PMTDATE);
  87. Days2 := DaysSince1900(Pymt2^.PMTDATE);
  88. IF Days1 < Days2
  89. THEN RETURN -1
  90. ELSIF
  91. Days1 > Days2
  92. THEN RETURN 1
  93. ELSE RETURN 0
  94. END;
  95. ELSE
  96. RETURN CompareStr(Pymt1^.INVOICE,Pymt2^.INVOICE);
  97. END;
  98. END SortByDate;
  99. PROCEDURE ShowPaymentHist(CustID : ARRAY OF CHAR);
  100. VAR Payment : POINTER TO PaymentsRec;
  101. Lst : GenList;
  102. Cnt : CARDINAL;
  103. Handle : CARDINAL;
  104. Size, Code : CARDINAL;
  105. DF : DisplayFrame;
  106. B : BOOLEAN;
  107. Str : ARRAY[0..10] OF CHAR;
  108. Title1 : ARRAY[0..80] OF CHAR;
  109. FieldRec : InputFieldRecord;
  110. Line : ARRAY[0..65] OF CHAR;
  111. CONST
  112. Title = ' Invoice Pymt Date Amount Check Number ';
  113. BEGIN
  114. OpenPaymentsDBF(TRUE);
  115. CrunchBlanks(CustID);
  116. NilList(Lst);
  117. FindAll(CustidIdx,CustID,EQ,Lst);
  118. ReadAllRecs(PaymentsDBF,ReadARec,Lst);
  119. ClosePaymentsDBF();
  120. IF ListLength(Lst) = 0 (* some tanks are outstanding *)
  121. THEN
  122. DisposeList(Lst);
  123. Prompt('No payment history');
  124. RETURN;
  125. END;
  126. SortList(Lst,SortByDate);
  127. (* 1 2 3 4
  128. 01234567890123456789012345678901234567890123456780
  129. Invoice Date Amount Check Number Date
  130. *)
  131. InitDisplayFrame(DF,CurrentWindow);
  132. AddStrField(DF,2,2,Title,55);
  133. GetFieldRec(DF,1,FieldRec);
  134. FieldRec.typ := DispCode; (* headline = display code *)
  135. PutFieldRec(FieldRec,DF,1);
  136. DF^.headline := 2;
  137. FOR Cnt := 1 TO ListLength(Lst) DO
  138. GetElmtAdr(Lst,Cnt,Payment,Size,Code);
  139. Fill(ADR(Line),SIZE(Line),' ');
  140. OverWrite(Payment^.INVOICE,Line,1);
  141. DateToStr(Payment^.PMTDATE,Str,B);
  142. OverWrite(Str,Line,12);
  143. RealToStr(Payment^.PMTAMT,2,8,Str);
  144. OverWrite(Str,Line,22);
  145. OverWrite(Payment^.CHECKNB,Line,33);
  146. AddMenuItem(DF,2,Cnt+2,Line,70,0,' ');
  147. END;
  148. ShowDisplayFrame(DF,1,13,80,24);
  149. Control(DF);
  150. IF PromptYN(' Print the report ',DF)
  151. THEN
  152. GetCurrCustName(Title1);
  153. Append(Title1,' - Payments ');
  154. NormalTitle(Title1);
  155. Handle := OpenReportDevice();
  156. PrintFrame(DF,Handle);
  157. CloseReportDevice(Handle);
  158. END;
  159. CloseDisplayFrame(DF);
  160. END ShowPaymentHist;
  161. PROCEDURE ManagePaymentFile();
  162. END ManagePaymentFile;
  163. END Payments.
  164.