INVREPOR.MOD 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. IMPLEMENTATION MODULE InvReports;
  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 DBFInvoice IMPORT InvoiceRec,MoveInvoiceFromDBF,
  12. OpenInvoiceDBF,CloseInvoiceDBF,InvoiceDBF;
  13. FROM Invoice IMPORT MakeInvoicePrintLine,FInvoice;
  14. FROM PosUtils IMPORT Equal;
  15. FROM PMIGlobals IMPORT Today,TodayDays,NormalTitle,PMIScreens,
  16. OpenReportDevice,CloseReportDevice;
  17. FROM Customer IMPORT GetCustName;
  18. FROM DBFCustomer IMPORT OpenCustomerDBF,CloseCustomerDBF;
  19. FROM DBUtils IMPORT GetDateRange,PrintFrame;
  20. FROM GenLists IMPORT GenList,ListInsert,DisposeList,
  21. GetElmt,GetElmtAdr,NewList,ListLength,SortList;
  22. FROM DateFunctions IMPORT Comparison,CompareDates,Date,DateToStr,
  23. CardToDate,DaysSince1900;
  24. FROM StrConv IMPORT RealToStr,CardinalToStr;
  25. FROM StrEdit IMPORT CrunchBlanks,DeleteRightJustified,Append,
  26. CAPstr,OverWrite,RightJustify,Center,SetLength;
  27. FROM ModBase3 IMPORT ReadDBRec,CloseDBF,NumberRecords;
  28. FROM M2Strings IMPORT Length,CompareStr,Assign;
  29. FROM LowLevel IMPORT Fill;
  30. FROM NumTypes IMPORT Real8;
  31. IMPORT VWindows;
  32. FROM ScrnUtl2 IMPORT CloseDisplayFrame;
  33. FROM ScrnUtl1 IMPORT GetFieldRec,PutFieldRec,FieldNum,FieldListTotal;
  34. FROM ScrnTypes IMPORT DisplayFrame,InitDisplayFrame,AFrameName,
  35. DispCode,ContinueInput,CancelInput,SubmitInput,InputFieldRecord;
  36. FROM FramePainter IMPORT ShowDisplayFrame,RedrawField;
  37. FROM ControlUtils IMPORT Control,AddStrField,AddMenuItem;
  38. FROM Prompts IMPORT Prompt,PromptStr,PromptYN;
  39. FROM ScrnTypes IMPORT AFrameName, InitDisplayFrame,DisplayFile;
  40. FROM SYSTEM IMPORT ADDRESS,ADR,SIZE;
  41. TYPE
  42. InvCust = RECORD
  43. Invoice : InvoiceRec;
  44. CustName : ARRAY[0..40] OF CHAR;
  45. END;
  46. VAR
  47. IncludeSet : SET OF CHAR;
  48. StartDate, EndDate : Date;
  49. PROCEDURE MakeInvoiceList(VAR InvList : GenList);
  50. VAR
  51. LI : LONGINT;
  52. InvRec : InvCust;
  53. D : CARDINAL;
  54. BEGIN
  55. D := DaysSince1900(StartDate); (* adjust to days so I get =>, <=*)
  56. CardToDate(D,StartDate);
  57. D := DaysSince1900(EndDate);
  58. INC(D);
  59. CardToDate(D,EndDate);
  60. NewList(InvList);
  61. OpenInvoiceDBF(FALSE); (* Dont need the index *)
  62. OpenCustomerDBF(TRUE);
  63. FOR LI := 1 TO NumberRecords(InvoiceDBF) DO
  64. ReadDBRec(InvoiceDBF,LI);
  65. MoveInvoiceFromDBF(InvRec.Invoice);
  66. CrunchBlanks(InvRec.Invoice.INVOICE);
  67. IF (InvRec.Invoice.INVPRNT IN IncludeSet) AND
  68. (CompareDates(InvRec.Invoice.INVDATE,StartDate) = DateGreater) AND
  69. (CompareDates(InvRec.Invoice.INVDATE,EndDate) = DateLess)
  70. THEN
  71. GetCustName(InvRec.Invoice.CUSTID,InvRec.CustName);
  72. ListInsert(InvRec,3,InvList,30000);
  73. END;
  74. END;
  75. CloseDBF(InvoiceDBF);
  76. CloseCustomerDBF();
  77. END MakeInvoiceList;
  78. PROCEDURE SortByCustName(Item1 : ADDRESS; Size1 : CARDINAL;
  79. Item2 : ADDRESS; Size2 : CARDINAL): INTEGER;
  80. (* sort by name here becase want an alpha sort rather than CIN sort*)
  81. VAR
  82. P1, P2 : POINTER TO InvCust;
  83. BEGIN
  84. P1 := Item1;
  85. P2 := Item2;
  86. IF NOT Equal(P1^.CustName,P2^.CustName)
  87. THEN
  88. RETURN CompareStr(P1^.CustName,P2^.CustName);
  89. ELSE
  90. RETURN CompareStr(P1^.Invoice.INVOICE,P2^.Invoice.INVOICE);
  91. END;
  92. END SortByCustName;
  93. PROCEDURE SortByInvoiceNbr(Item1 : ADDRESS; Size1 : CARDINAL;
  94. Item2 : ADDRESS; Size2 : CARDINAL): INTEGER;
  95. (* sort by name here becase want an alpha sort rather than CIN sort*)
  96. VAR
  97. P1, P2 : POINTER TO InvCust;
  98. BEGIN
  99. P1 := Item1;
  100. P2 := Item2;
  101. RETURN CompareStr(P1^.Invoice.INVOICE,P2^.Invoice.INVOICE);
  102. END SortByInvoiceNbr;
  103. PROCEDURE InvHistory();
  104. VAR
  105. J : CARDINAL;
  106. InvTotal : Real8;
  107. InvRec : InvCust;
  108. InvList : GenList;
  109. Code : CARDINAL;
  110. FieldRec : InputFieldRecord;
  111. DF : DisplayFrame;
  112. DF2 : DisplayFrame;
  113. B : BOOLEAN;
  114. Str : ARRAY[0..12] OF CHAR;
  115. Line : ARRAY[0..80] OF CHAR;
  116. NbrO,NbrP,NbrC : CARDINAL;
  117. InvTotP,InvTotO,InvTotC : Real8;
  118. InvNetP,InvNetO,InvNetC : Real8;
  119. Handle : CARDINAL;
  120. PROCEDURE DisplayTotals();
  121. BEGIN
  122. ShowDisplayFrame(DF,1,1,80,24);
  123. DF2^.startcol := 5;
  124. DF2^.endcol := 75;
  125. DF2^.startrow := 5;
  126. DF2^.endrow := 20;
  127. AddStrField(DF,2,2,
  128. ' Num Net Total',50);
  129. Fill(ADR(Line),SIZE(Line),' ');
  130. OverWrite(' Outstanding ',Line,3);
  131. CardinalToStr(NbrO,3,Str);
  132. OverWrite(Str,Line,13);
  133. RealToStr(InvNetO,2,8,Str);
  134. OverWrite(Str,Line,22);
  135. RealToStr(InvTotO,2,8,Str);
  136. OverWrite(Str,Line,34);
  137. AddStrField(DF2,2,4,Line,50);
  138. Fill(ADR(Line),SIZE(Line),' ');
  139. OverWrite(' Posted ',Line,3);
  140. CardinalToStr(NbrP,3,Str);
  141. OverWrite(Str,Line,13);
  142. RealToStr(InvNetP,2,8,Str);
  143. OverWrite(Str,Line,22);
  144. RealToStr(InvTotP,2,8,Str);
  145. OverWrite(Str,Line,32);
  146. AddStrField(DF2,2,5,Line,50);
  147. Fill(ADR(Line),SIZE(Line),' ');
  148. OverWrite(' Closed ',Line,3);
  149. CardinalToStr(NbrC,3,Str);
  150. OverWrite(Str,Line,13);
  151. RealToStr(InvNetC,2,8,Str);
  152. OverWrite(Str,Line,22);
  153. RealToStr(InvTotC,2,8,Str);
  154. OverWrite(Str,Line,32);
  155. AddStrField(DF2,2,6,Line,50);
  156. ShowDisplayFrame(DF2,0,0,0,0);
  157. Control(DF2);
  158. END DisplayTotals;
  159. BEGIN
  160. GetDateRange(StartDate,EndDate,PMIScreens);
  161. IncludeSet := IncludeSet / IncludeSet; (* clear the set *)
  162. INCL(IncludeSet,'P');
  163. INCL(IncludeSet,'O');
  164. INCL(IncludeSet,'C');
  165. MakeInvoiceList(InvList);
  166. NbrO := 0;
  167. NbrP := 0;
  168. NbrC := 0;
  169. InvTotP := 0.0;
  170. InvTotO := 0.0;
  171. InvTotC := 0.0;
  172. InvNetO := 0.0;
  173. InvNetP := 0.0;
  174. InvNetC := 0.0;
  175. InitDisplayFrame(DF,VWindows.CurrentWindow);
  176. InitDisplayFrame(DF2,VWindows.CurrentWindow);
  177. AddStrField(DF,2,2,
  178. 'Inv Nbr Customer Name Date Inv Total OutStd Stat',79);
  179. GetFieldRec(DF,1,FieldRec);
  180. FieldRec.typ := DispCode; (* headline = display code *)
  181. PutFieldRec(FieldRec,DF,1);
  182. DF^.headline := 2;
  183. FOR J := 1 TO ListLength(InvList) DO
  184. GetElmt(InvList,J,InvRec,Code);
  185. Fill(ADR(Line),80,' ');
  186. Line[77] := 0C;
  187. CASE InvRec.Invoice.INVPRNT OF
  188. 'O' :INC(NbrO);
  189. InvTotO := InvTotO + InvRec.Invoice.TOTALAMT;
  190. InvNetO := InvNetO + InvRec.Invoice.INVNET;
  191. |'P' :INC(NbrP);
  192. InvTotP := InvTotP + InvRec.Invoice.TOTALAMT;
  193. InvNetP := InvNetP + InvRec.Invoice.INVNET;
  194. |'C' :INC(NbrC);
  195. InvTotC := InvTotC + InvRec.Invoice.TOTALAMT;
  196. InvNetC := InvNetC + InvRec.Invoice.INVNET;
  197. END;
  198. OverWrite(InvRec.Invoice.INVOICE,Line,1);
  199. SetLength(InvRec.CustName,25);
  200. OverWrite(InvRec.CustName,Line,11);
  201. DateToStr(InvRec.Invoice.INVDATE,Str,B);
  202. OverWrite(Str,Line,40);
  203. RealToStr(InvRec.Invoice.TOTALAMT,2,9,Str);
  204. OverWrite(Str,Line,49);
  205. RealToStr(InvRec.Invoice.AMTOUT,2,9,Str);
  206. OverWrite(Str,Line,58);
  207. OverWrite(InvRec.Invoice.INVPRNT,Line,75);
  208. AddMenuItem(DF,2,J+2,Line,78,0,' ');
  209. END;
  210. DisposeList(InvList);
  211. (* DisplayTotals(); *)
  212. Control(DF);
  213. DisplayTotals();
  214. IF PromptYN(' Print Report ',DF)
  215. THEN
  216. Line := 'INVOICE HISTORY';
  217. NormalTitle(Line);
  218. Handle := OpenReportDevice ();
  219. PrintFrame(DF,Handle);
  220. Line := 'Invoice Totals ';
  221. NormalTitle(Line);
  222. PrintFrame(DF2,Handle);
  223. CloseReportDevice(Handle);
  224. END;
  225. CloseDisplayFrame(DF);
  226. CloseDisplayFrame(DF2);
  227. END InvHistory;
  228. PROCEDURE InvOutstanding();
  229. VAR
  230. J : CARDINAL;
  231. InvTotal : Real8;
  232. InvRec : InvCust;
  233. InvList : GenList;
  234. Code : CARDINAL;
  235. FieldRec : InputFieldRecord;
  236. DF : DisplayFrame;
  237. B : BOOLEAN;
  238. Str : ARRAY[0..12] OF CHAR;
  239. Line : ARRAY[0..80] OF CHAR;
  240. LastCust : ARRAY[0..40] OF CHAR;
  241. CustTotal: Real8;
  242. TotalOut : Real8;
  243. LineCnt : CARDINAL;
  244. Handle : CARDINAL;
  245. PROCEDURE MakeLine();
  246. BEGIN
  247. OverWrite(InvRec.Invoice.INVOICE,Line,30);
  248. DateToStr(InvRec.Invoice.INVDATE,Str,B);
  249. OverWrite(Str,Line,40);
  250. RealToStr(InvRec.Invoice.TOTALAMT,2,9,Str);
  251. OverWrite(Str,Line,49);
  252. RealToStr(InvRec.Invoice.AMTOUT,2,9,Str);
  253. OverWrite(Str,Line,58);
  254. OverWrite(InvRec.Invoice.INVPRNT,Line,75);
  255. END MakeLine;
  256. BEGIN
  257. GetDateRange(StartDate,EndDate,PMIScreens);
  258. IncludeSet := IncludeSet / IncludeSet; (* clear the set *)
  259. INCL(IncludeSet,'P');
  260. MakeInvoiceList(InvList);
  261. SortList(InvList,SortByCustName);
  262. InitDisplayFrame(DF,VWindows.CurrentWindow);
  263. AddStrField(DF,2,2,
  264. ' Customer Name Invoice Date Inv Total OutStd Stat',79);
  265. GetFieldRec(DF,1,FieldRec);
  266. FieldRec.typ := DispCode; (* headline = display code *)
  267. PutFieldRec(FieldRec,DF,1);
  268. DF^.headline := 2;
  269. LastCust := '';
  270. CustTotal := 0.0;
  271. TotalOut := 0.0;
  272. LineCnt := 2;
  273. FOR J := 1 TO ListLength(InvList) DO
  274. INC(LineCnt);
  275. GetElmt(InvList,J,InvRec,Code);
  276. SetLength(InvRec.CustName,25);
  277. Fill(ADR(Line),80,' ');
  278. Line[78] := 0C;
  279. IF LastCust[0] = 0C (* first time *)
  280. THEN
  281. Assign( InvRec.CustName,LastCust );
  282. OverWrite(InvRec.CustName,Line,1);
  283. END;
  284. TotalOut := TotalOut + InvRec.Invoice.AMTOUT;
  285. IF Equal(LastCust,InvRec.CustName)
  286. THEN
  287. CustTotal := CustTotal + InvRec.Invoice.AMTOUT;
  288. MakeLine();
  289. AddMenuItem(DF,2,LineCnt,Line,78,0,' ');
  290. ELSE
  291. OverWrite('===========',Line,58);
  292. AddMenuItem(DF,2,LineCnt,Line,78,0,' ');
  293. Fill(ADR(Line),80,' ');
  294. Line[78] := 0C;
  295. RealToStr(CustTotal,2,9,Str);
  296. OverWrite(Str,Line,58);
  297. AddMenuItem(DF,2,LineCnt+1,Line,78,0,' ');
  298. Fill(ADR(Line),80,' ');
  299. Line[78] := 0C;
  300. AddMenuItem(DF,2,LineCnt+2,Line,78,0,' '); (* add blank line *)
  301. Assign( InvRec.CustName,LastCust);
  302. SetLength(InvRec.CustName,25);
  303. OverWrite(InvRec.CustName,Line,1);
  304. CustTotal := InvRec.Invoice.AMTOUT;
  305. MakeLine();
  306. AddMenuItem(DF,2,LineCnt+3,Line,78,0,' ');
  307. INC(LineCnt,3);
  308. END;
  309. END;
  310. Fill(ADR(Line),80,' ');
  311. Line[78] := 0C;
  312. OverWrite('===========',Line,58);
  313. AddMenuItem(DF,2,LineCnt+1,Line,78,0,' ');
  314. Fill(ADR(Line),80,' ');
  315. Line[78] := 0C;
  316. RealToStr(CustTotal,2,9,Str);
  317. OverWrite(Str,Line,58);
  318. AddMenuItem(DF,2,LineCnt+2,Line,78,0,' ');
  319. OverWrite('===========',Line,58);
  320. AddMenuItem(DF,2,LineCnt+3,Line,78,0,' ');
  321. Fill(ADR(Line),80,' ');
  322. Line[78] := 0C;
  323. OverWrite(' Total outstanding ',Line,2);
  324. RealToStr(TotalOut,2,9,Str);
  325. OverWrite(Str,Line,58);
  326. AddMenuItem(DF,2,LineCnt+4,Line,78,0,' ');
  327. DisposeList(InvList);
  328. ShowDisplayFrame(DF,1,1,80,24);
  329. Control(DF);
  330. IF PromptYN(' Print Report ',DF)
  331. THEN
  332. Line := 'INVOICE HISTORY';
  333. NormalTitle(Line);
  334. Handle := OpenReportDevice();
  335. PrintFrame(DF,Handle);
  336. CloseReportDevice(Handle);
  337. END;
  338. CloseDisplayFrame(DF);
  339. END InvOutstanding;
  340. PROCEDURE InvOutByDate();
  341. VAR
  342. J : CARDINAL;
  343. InvTotal : Real8;
  344. InvRec : InvCust;
  345. InvList : GenList;
  346. Code : CARDINAL;
  347. FieldRec : InputFieldRecord;
  348. DF : DisplayFrame;
  349. B : BOOLEAN;
  350. Str : ARRAY[0..12] OF CHAR;
  351. Line : ARRAY[0..80] OF CHAR;
  352. Days : CARDINAL;
  353. Handle : CARDINAL;
  354. BEGIN
  355. GetDateRange(StartDate,EndDate,PMIScreens);
  356. IncludeSet := IncludeSet / IncludeSet; (* clear the set *)
  357. INCL(IncludeSet,'P');
  358. MakeInvoiceList(InvList);
  359. SortList(InvList,SortByInvoiceNbr);
  360. InitDisplayFrame(DF,VWindows.CurrentWindow);
  361. AddStrField(DF,2,2,
  362. 'Inv Nbr Customer Name Date Inv Total OutStd Late',79);
  363. GetFieldRec(DF,1,FieldRec);
  364. FieldRec.typ := DispCode; (* headline = display code *)
  365. PutFieldRec(FieldRec,DF,1);
  366. DF^.headline := 2;
  367. FOR J := 1 TO ListLength(InvList) DO
  368. GetElmt(InvList,J,InvRec,Code);
  369. Fill(ADR(Line),80,' ');
  370. Line[77] := 0C;
  371. OverWrite(InvRec.Invoice.INVOICE,Line,1);
  372. SetLength(InvRec.CustName,25);
  373. OverWrite(InvRec.CustName,Line,11);
  374. DateToStr(InvRec.Invoice.INVDATE,Str,B);
  375. OverWrite(Str,Line,40);
  376. RealToStr(InvRec.Invoice.TOTALAMT,2,9,Str);
  377. OverWrite(Str,Line,49);
  378. RealToStr(InvRec.Invoice.AMTOUT,2,9,Str);
  379. OverWrite(Str,Line,58);
  380. CardinalToStr(TodayDays -DaysSince1900(InvRec.Invoice.INVDATE),3,Str);
  381. OverWrite(Str,Line,72);
  382. AddMenuItem(DF,2,J+2,Line,78,0,' ');
  383. END;
  384. DisposeList(InvList);
  385. ShowDisplayFrame(DF,1,1,80,24);
  386. Control(DF);
  387. IF PromptYN(' Print Report ',DF)
  388. THEN
  389. Line := 'INVOICE HISTORY';
  390. NormalTitle(Line);
  391. Handle := OpenReportDevice();
  392. PrintFrame(DF,Handle);
  393. CloseReportDevice(Handle);
  394. END;
  395. CloseDisplayFrame(DF);
  396. END InvOutByDate;
  397. END InvReports.
  398.