CUSTREPO.MOD 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. IMPLEMENTATION MODULE CustReports;
  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 PosUtils IMPORT Equal;
  12. FROM PMIGlobals IMPORT Config,NormalTitle,OpenReportDevice,CloseReportDevice;
  13. FROM Customer IMPORT GetCustName,SetCustomerRec,GetCustAddr,
  14. AddressRec,AddressTypes;
  15. FROM DBFCustomer IMPORT OpenCustomerDBF,CloseCustomerDBF,
  16. CustomerRec,CustomerDBF,MoveCustomerFromDBF;
  17. FROM DBUtils IMPORT GetDateRange,PrintFrame,PrintTitle;
  18. FROM HandleIO IMPORT OpenFile,CloseHandle;
  19. FROM StringIO IMPORT WriteStr,WriteEol;
  20. FROM GenLists IMPORT GenList,ListInsert,DisposeList,
  21. GetElmt,GetElmtAdr,NewList,ListLength,SortList;
  22. FROM ListUtils IMPORT PrintList,TextFileToList;
  23. FROM Invoice IMPORT MakeInvoicePrintLine,GetOutstanding,InvoiceDaysLate;
  24. FROM DateFunctions IMPORT Comparison,CompareDates,Date,DateToStr,
  25. CardToDate,DaysSince1900;
  26. FROM StrConv IMPORT RealToStr,CardinalToStr;
  27. FROM StrEdit IMPORT CrunchBlanks,DeleteRightJustified,Append,
  28. CAPstr,OverWrite,RightJustify,Center,SetLength;
  29. FROM ModBase3 IMPORT ReadDBRec,CloseDBF,NumberRecords;
  30. FROM M2Strings IMPORT Concat,Length,CompareStr;
  31. FROM LowLevel IMPORT Fill;
  32. FROM NumTypes IMPORT Real8;
  33. FROM Numbers IMPORT Max;
  34. IMPORT VWindows;
  35. FROM ScrnUtl2 IMPORT CloseDisplayFrame;
  36. FROM ScrnUtl1 IMPORT GetFieldRec,PutFieldRec,FieldNum,FieldListTotal;
  37. FROM ScrnTypes IMPORT DisplayFrame,InitDisplayFrame,AFrameName,
  38. DispCode,ContinueInput,CancelInput,SubmitInput,InputFieldRecord;
  39. FROM FramePainter IMPORT ShowDisplayFrame,RedrawField;
  40. FROM ControlUtils IMPORT Control,AddStrField,AddMenuItem;
  41. FROM Prompts IMPORT Prompt,PromptStr,PromptYN;
  42. FROM ScrnTypes IMPORT AFrameName, InitDisplayFrame,DisplayFile;
  43. FROM SYSTEM IMPORT ADDRESS,ADR,SIZE;
  44. FROM VStorage IMPORT DosAlloc;
  45. VAR
  46. MinOut : Real8;
  47. PROCEDURE ReadCustFile(VAR TheList : GenList);
  48. VAR
  49. LI : LONGINT;
  50. Cust : CustomerRec;
  51. BEGIN
  52. OpenCustomerDBF(FALSE);
  53. NewList(TheList);
  54. FOR LI := 1 TO NumberRecords(CustomerDBF) DO
  55. ReadDBRec(CustomerDBF,LI);
  56. MoveCustomerFromDBF(Cust);
  57. IF Cust.YTDPURCH >= MinOut
  58. THEN ListInsert(Cust,1,TheList,1);
  59. END;
  60. END;
  61. END ReadCustFile;
  62. PROCEDURE SortByZipCode(C1 : ADDRESS; S1 : CARDINAL;
  63. C2 : ADDRESS; S2 : CARDINAL): INTEGER;
  64. VAR
  65. P1,P2 :POINTER TO CustomerRec;
  66. BEGIN
  67. P1 := C1;
  68. P2 := C2;
  69. RETURN CompareStr(P1^.BILLTOZP, P2^.BILLTOZP);
  70. END SortByZipCode;
  71. PROCEDURE SortByValue(C1 : ADDRESS; S1 : CARDINAL;
  72. C2 : ADDRESS; S2 : CARDINAL): INTEGER;
  73. VAR
  74. P1 : POINTER TO CustomerRec;
  75. P2 : POINTER TO CustomerRec;
  76. BEGIN
  77. P1 := C1;
  78. P2 := C2;
  79. IF P1^.YTDPURCH < P2^.YTDPURCH
  80. THEN RETURN -1;
  81. ELSIF P1^.YTDPURCH > P2^.YTDPURCH
  82. THEN RETURN 1;
  83. ELSE RETURN 0;
  84. END;
  85. END SortByValue;
  86. PROCEDURE CustMailLabels();
  87. CONST
  88. FormFeed = 12C;
  89. VAR
  90. CustList : GenList;
  91. J,K : CARDINAL;
  92. Cust : CustomerRec;
  93. Code : CARDINAL;
  94. CustAddr : AddressRec;
  95. Handle : CARDINAL;
  96. BEGIN
  97. MinOut := 0.0; (* get everyone *)
  98. ReadCustFile(CustList);
  99. SortList(CustList,SortByZipCode);
  100. Handle := OpenReportDevice();
  101. FOR J := 1 TO ListLength(CustList) DO
  102. GetElmt(CustList,J,Cust,Code);
  103. SetCustomerRec(Cust);
  104. GetCustAddr(CustAddr,Billing);
  105. FOR K := 0 TO 3 DO
  106. WriteEol(Handle,CustAddr.Line[K]);
  107. END; (* end for k *)
  108. WriteEol(Handle,'');
  109. WriteEol(Handle,'');
  110. END;
  111. CloseReportDevice(Handle);
  112. DisposeList(CustList);
  113. END CustMailLabels;
  114. PROCEDURE CustValue();
  115. VAR
  116. CustList : GenList;
  117. J : CARDINAL;
  118. Cust : CustomerRec;
  119. Code : CARDINAL;
  120. CustAddr : AddressRec;
  121. Handle : CARDINAL;
  122. Str : ARRAY[0..10]OF CHAR;
  123. FieldRec : InputFieldRecord;
  124. DF : DisplayFrame;
  125. Line : ARRAY[0..80] OF CHAR;
  126. BEGIN
  127. MinOut := 1.0; (* get everyone that has purchased anything*)
  128. ReadCustFile(CustList);
  129. SortList(CustList,SortByValue);
  130. InitDisplayFrame(DF,VWindows.CurrentWindow);
  131. AddStrField(DF,2,2,
  132. ' Customer Name Sales Rep YTD Purchase',67);
  133. GetFieldRec(DF,1,FieldRec);
  134. FieldRec.typ := DispCode; (* headline = display code *)
  135. PutFieldRec(FieldRec,DF,1);
  136. DF^.headline := 2;
  137. FOR J := 1 TO ListLength(CustList) DO
  138. GetElmt(CustList,J,Cust,Code);
  139. Fill(ADR(Line),SIZE(Line),' ');
  140. Line[77] := 0C;
  141. OverWrite(Cust.NAME,Line,1);
  142. OverWrite(Cust.SALESREP,Line,45);
  143. RealToStr(Cust.YTDPURCH,2,8,Str);
  144. OverWrite(Str,Line,60);
  145. AddMenuItem(DF,2,J+2,Line,78,0,' ');
  146. END;
  147. DisposeList(CustList);
  148. ShowDisplayFrame(DF,1,1,80,24);
  149. Control(DF);
  150. IF PromptYN(' Print Report ',DF)
  151. THEN
  152. Line := 'Customer Sorted by YTD Purchases';
  153. NormalTitle(Line);
  154. Handle := OpenReportDevice();
  155. PrintFrame(DF,Handle);
  156. CloseReportDevice(Handle);
  157. END;
  158. CloseDisplayFrame(DF);
  159. DisposeList(CustList);
  160. END CustValue;
  161. PROCEDURE CustLateLetters();
  162. VAR
  163. L10Pre,
  164. L10Suf,
  165. L30Pre,
  166. L30Suf,
  167. L60Pre,
  168. L60Suf : GenList;
  169. LI : LONGINT;
  170. DaysLate : CARDINAL;
  171. PrtStr : ARRAY[0..80] OF CHAR;
  172. InvList : GenList;
  173. J : CARDINAL;
  174. InvAddr : ADDRESS;
  175. Code,Size : CARDINAL;
  176. PtrHand : CARDINAL;
  177. EM : CARDINAL;
  178. Cust : CustomerRec;
  179. B : BOOLEAN;
  180. PROCEDURE PrintLetter(Prefix,Suffix ,Invoice : GenList);
  181. CONST
  182. (* FormLength : ARRAY OF CHAR = [027c,'C',66c]; *)
  183. FormFeed = 012C;
  184. VAR
  185. J : CARDINAL;
  186. Addr :AddressRec;
  187. Line : ARRAY [0..80] OF CHAR;
  188. FormLength : ARRAY[0..3] OF CHAR;
  189. BEGIN
  190. Concat(027C,'C',FormLength);
  191. Append(FormLength,66C);
  192. WriteStr( PtrHand,FormLength);
  193. Line := '';
  194. NormalTitle(Line);
  195. FOR J := 0 TO 6 DO
  196. WriteEol(PtrHand,PrintTitle[J]);
  197. END;
  198. SetCustomerRec(Cust);
  199. GetCustAddr(Addr,Billing);
  200. FOR J := 0 TO 3 DO
  201. WriteEol(PtrHand,'');
  202. END;
  203. FOR J := 0 TO 3 DO
  204. WriteEol(PtrHand,Addr.Line[J]);
  205. WriteStr(PtrHand,' ');
  206. END;
  207. PrintList(PtrHand,Prefix,4,'');
  208. FOR J := 1 TO ListLength(InvList) DO
  209. GetElmtAdr(InvList,J,InvAddr,Code,Size);
  210. MakeInvoicePrintLine(InvAddr,Line);
  211. WriteEol(PtrHand,Line);
  212. END;
  213. PrintList(PtrHand,Suffix,4,'');
  214. WriteEol(PtrHand,FormFeed);
  215. END PrintLetter;
  216. BEGIN
  217. EM := OpenFile(PtrHand,Config.LabelPrt);
  218. NewList(L10Pre);
  219. NewList(L10Suf);
  220. NewList(L30Pre);
  221. NewList(L30Suf);
  222. NewList(L60Pre);
  223. NewList(L60Suf);
  224. PrtStr := 'l10pre.txt';
  225. J := TextFileToList(PrtStr,L10Pre);
  226. PrtStr := 'l30pre.txt';
  227. J := TextFileToList(PrtStr,L30Pre);
  228. PrtStr := 'l60pre.txt';
  229. J := TextFileToList(PrtStr,L60Pre);
  230. PrtStr := 'l10Suf.txt';
  231. J := TextFileToList(PrtStr,L10Suf);
  232. PrtStr := 'l30Suf.txt';
  233. J := TextFileToList(PrtStr,L10Suf);
  234. PrtStr := 'l60Suf.txt';
  235. J := TextFileToList(PrtStr,L10Suf);
  236. OpenCustomerDBF(FALSE);
  237. FOR LI := 1 TO NumberRecords(CustomerDBF) DO
  238. ReadDBRec(CustomerDBF,LI);
  239. MoveCustomerFromDBF(Cust);
  240. GetOutstanding(Cust.CIN,InvList);
  241. DaysLate := 0;
  242. FOR J := 1 TO ListLength(InvList) DO
  243. GetElmtAdr(InvList,J,InvAddr,Code,Size);
  244. DaysLate := Max(DaysLate,InvoiceDaysLate(InvAddr));
  245. END;
  246. IF DaysLate >= 60
  247. THEN PrintLetter(L60Pre,L60Suf,InvList);
  248. ELSIF DaysLate >= 30
  249. THEN PrintLetter(L30Pre,L30Suf,InvList);
  250. ELSIF DaysLate >= 10
  251. THEN PrintLetter(L10Pre,L10Suf,InvList);
  252. END;
  253. DisposeList(InvList);
  254. END;
  255. DisposeList(L10Pre);
  256. DisposeList(L30Pre);
  257. DisposeList(L60Pre);
  258. DisposeList(L10Suf);
  259. DisposeList(L30Suf);
  260. DisposeList(L60Suf);
  261. EM := CloseHandle(PtrHand);
  262. END CustLateLetters;
  263. END CustReports.