GAS.MOD 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. IMPLEMENTATION MODULE Gas;
  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 AppendBlank,ReadDBRec, WriteDBRec,Record;
  12. FROM NumTypes IMPORT Real8,REALToReal8;
  13. FROM DBFGas IMPORT GasRec,MoveGasFromDBF,MoveGasToDBF;
  14. FROM LowLevel IMPORT Fill;
  15. FROM StrEdit IMPORT Append,OverWrite,AssignStr;
  16. FROM StrConv IMPORT CardinalToStr;
  17. FROM M2Strings IMPORT CompareStr,Assign;
  18. FROM ScrnUtl2 IMPORT CloseDisplayFrame;
  19. FROM ScrnUtl1 IMPORT GetFieldRec,PutFieldRec,FieldNum,FieldListTotal;
  20. FROM ScrnTypes IMPORT DisplayFrame,InitDisplayFrame,AFrameName,
  21. DispCode,ContinueInput,CancelInput,SubmitInput,InputFieldRecord;
  22. FROM FramePainter IMPORT ShowDisplayFrame,RedrawField;
  23. FROM Prompts IMPORT PromptYN,Prompt,PromptNum;
  24. FROM ControlUtils IMPORT Control,AddStrField,AddMenuItem;
  25. FROM PMIGlobals IMPORT Today,TodayP30,TodayP30Str,Config,
  26. OpenReportDevice,CloseReportDevice,NormalTitle;
  27. FROM SYSTEM IMPORT ADR,SIZE;
  28. FROM PosUtils IMPORT Equal;
  29. FROM GenLists IMPORT ListLength,GenList,DisposeList,GetElmtAdr,
  30. SortList,GetElmt,NilList;
  31. FROM DateFunctions IMPORT Date,DaysSince1900,DateToStr;
  32. FROM DBStuff IMPORT ConditionType,MakeKey,FindAll,ReadAllRecs,DeleteAllRecs;
  33. FROM DBUtils IMPORT PrintFrame;
  34. FROM Customer IMPORT GetCurrCustName;
  35. FROM DBFGas IMPORT GasRec,GasDBF,GasIdx,OpenGasDBF,CloseGasDBF,
  36. GasOutIdx,GasInIdx;
  37. FROM SYSTEM IMPORT SIZE,ADDRESS;
  38. FROM VWindows IMPORT CurrentWindow;
  39. FROM Storage IMPORT ALLOCATE;
  40. TYPE
  41. FGasRec = RECORD
  42. Gas: GasRec;
  43. LI : LONGINT;
  44. END;
  45. PROCEDURE SortByDate (P1 : ADDRESS; C1 :CARDINAL; P2 : ADDRESS; C2 : CARDINAL): INTEGER;
  46. VAR
  47. Gas1, Gas2 : POINTER TO FGasRec;
  48. BEGIN
  49. Gas1 := P1; (* sort by invoice by item types *)
  50. Gas2 := P2;
  51. IF Equal(Gas1^.Gas.INVNBR,Gas2^.Gas.INVNBR)
  52. THEN
  53. RETURN CompareStr(Gas1^.Gas.ITEMNBR,Gas2^.Gas.ITEMNBR)
  54. ELSE
  55. RETURN CompareStr(Gas1^.Gas.INVNBR,Gas2^.Gas.INVNBR); (* inv numbers sort by date*)
  56. END;
  57. END SortByDate;
  58. PROCEDURE ReadARec(VAR AddressOfRec : ADDRESS;
  59. VAR SizeOfRec: CARDINAL);
  60. VAR
  61. P : POINTER TO FGasRec;
  62. BEGIN
  63. SizeOfRec := SIZE(FGasRec);
  64. ALLOCATE(P,SizeOfRec);
  65. MoveGasFromDBF(P^.Gas);
  66. P^.LI := Record(GasDBF);
  67. AddressOfRec := P;
  68. END ReadARec;
  69. PROCEDURE DeleteGasFromInv(InvNbr : ARRAY OF CHAR);
  70. VAR
  71. TheList : GenList;
  72. J : CARDINAL;
  73. LI : LONGINT;
  74. Gas : GasRec;
  75. Code : CARDINAL;
  76. BEGIN
  77. OpenGasDBF(TRUE);
  78. MakeKey(InvNbr);
  79. NilList(TheList);
  80. FindAll(GasOutIdx,InvNbr,EQ,TheList);
  81. DeleteAllRecs(GasDBF,TheList); (* delete all recs from check out*)
  82. FindAll(GasInIdx,InvNbr,EQ,TheList); (* find any check in recs *)
  83. IF ListLength(TheList) > 0
  84. THEN
  85. FOR J := 1 TO ListLength(TheList) DO
  86. GetElmt(TheList,J,LI,Code);
  87. ReadDBRec(GasDBF,LI);
  88. MoveGasFromDBF(Gas);
  89. Gas.STATUS := 'O'; (* make outstanding*)
  90. Gas.ININVNBR := '';
  91. MoveGasToDBF(Gas);
  92. WriteDBRec(GasDBF);
  93. END;
  94. END;
  95. DisposeList(TheList);
  96. CloseGasDBF();
  97. END DeleteGasFromInv;
  98. PROCEDURE CheckOutGas(CustID,OutInvoiceNbr,InvtryItem : ARRAY OF CHAR;
  99. Quant : CARDINAL;InvDate: Date);
  100. VAR
  101. Rec : GasRec;
  102. J : CARDINAL;
  103. BEGIN
  104. OpenGasDBF(TRUE);
  105. Fill(ADR(Rec),SIZE(Rec),0);
  106. WITH Rec DO
  107. Assign( CustID,CIN );
  108. Assign( OutInvoiceNbr,INVNBR );
  109. Assign( InvtryItem,ITEMNBR);
  110. DATEOUT := InvDate;
  111. DUEDATE := TodayP30;
  112. STATUS := 'O';
  113. END;
  114. FOR J := 1 TO Quant DO
  115. AppendBlank(GasDBF);
  116. MoveGasToDBF(Rec);
  117. WriteDBRec(GasDBF);
  118. END;
  119. CloseGasDBF();
  120. END CheckOutGas;
  121. PROCEDURE GetGasByCust(CustID,InvtryItem : ARRAY OF CHAR;Status : CHAR;
  122. VAR TheList : GenList);
  123. VAR
  124. Str : ARRAY[0..30] OF CHAR;
  125. J : CARDINAL;
  126. BEGIN
  127. Assign(CustID,Str ); (* form the partial key *)
  128. Append(Str,Status);
  129. Append(Str,InvtryItem);
  130. MakeKey(Str); (* upcase remove blanks *)
  131. NilList(TheList);
  132. FindAll(GasIdx,Str,BeginsWith,TheList);
  133. ReadAllRecs(GasDBF,ReadARec,TheList);
  134. SortList(TheList,SortByDate);
  135. END GetGasByCust;
  136. PROCEDURE CheckInGas(CustID,InInvoiceNbr,InvtryItem: ARRAY OF CHAR;
  137. Quant : CARDINAL; InvDate : Date);
  138. VAR
  139. OutList : GenList;
  140. J : CARDINAL;
  141. Size, Code : CARDINAL;
  142. LL : CARDINAL;
  143. Str : ARRAY[0..30] OF CHAR;
  144. Str2 : ARRAY[0..5] OF CHAR;
  145. Rec : POINTER TO FGasRec;
  146. D1,D2 : CARDINAL;
  147. BEGIN
  148. OpenGasDBF(TRUE);
  149. InvtryItem[1] := '0'; (* find by the size checkout *)
  150. GetGasByCust(CustID,InvtryItem,'O',OutList);
  151. LL := ListLength(OutList);
  152. IF Quant <= LL (* can handle this - more tanks out than turned in*)
  153. THEN
  154. FOR J := 1 TO Quant DO
  155. GetElmtAdr(OutList,J,Rec,Size,Code);
  156. Rec^.Gas.DATEIN := InvDate;
  157. Assign( InInvoiceNbr,Rec^.Gas.ININVNBR );
  158. Rec^.Gas.STATUS := 'I'; (* change status *)
  159. D2 := DaysSince1900(Rec^.Gas.DUEDATE);
  160. D1 := DaysSince1900(Rec^.Gas.DATEIN);
  161. IF D1 > D2
  162. THEN
  163. Rec^.Gas.DAYSLATE := D1 - D2;
  164. END;
  165. ReadDBRec(GasDBF,Rec^.LI); (* position the database *)
  166. MoveGasToDBF(Rec^.Gas); (* update the record *)
  167. WriteDBRec(GasDBF);
  168. END; (* end of for *)
  169. ELSE (* here were in trouble - the cust wants to return more*)
  170. (* tanks than what I have recored as outstanding *)
  171. D1 := Quant - LL; (* number to be checked in without being checkou*)
  172. CardinalToStr(D1,4,Str2);
  173. Str := ' WARNING - ';
  174. Append(Str,Str2);
  175. Append(Str,' More tanks checked out than on record');
  176. Prompt(Str);
  177. CheckOutGas(CustID,'??????',InvtryItem,D1,InvDate); (* check out with out an in*)
  178. (* make a recursive call to check in - this time it should work*)
  179. CheckInGas(CustID,InInvoiceNbr,InvtryItem,Quant,InvDate);
  180. END;
  181. CloseGasDBF();
  182. END CheckInGas;
  183. PROCEDURE GasAmountDue(CustID, InvtryItem : ARRAY OF CHAR;Quant : CARDINAL;
  184. InvDate : Date;
  185. VAR AmountDue : Real8;
  186. VAR Notes : ARRAY OF CHAR); (* filled in if late*)
  187. VAR Str : ARRAY[0..40] OF CHAR;
  188. Str2 : ARRAY[0..5] OF CHAR;
  189. DaysLate : CARDINAL;
  190. List : GenList;
  191. Rec : POINTER TO FGasRec;
  192. J, Size,Code : CARDINAL;
  193. D1, D2 : CARDINAL;
  194. DL : Real8;
  195. BEGIN
  196. OpenGasDBF(TRUE);
  197. InvtryItem[1] := '0'; (* make it look like a check out *)
  198. GetGasByCust(CustID,InvtryItem,'O',List);
  199. DaysLate := 0;
  200. D1 := DaysSince1900(InvDate);
  201. IF Quant > ListLength(List)
  202. THEN Quant := ListLength(List);
  203. END;
  204. FOR J := 1 TO Quant DO
  205. GetElmtAdr(List,J,Rec,Size,Code);
  206. D2 := DaysSince1900(Rec^.Gas.DUEDATE);
  207. IF D1 > D2 (* late *)
  208. THEN
  209. Str := 'Tank late by ';
  210. CardinalToStr(D1-D2,5,Str2);
  211. Append(Str,Str2);
  212. Append(Str,' Days - Charge for ');
  213. DaysLate := DaysLate + PromptNum(Str,D1 - D2);
  214. END;
  215. END; (* end for J := quant *)
  216. DL := REALToReal8(FLOAT(DaysLate));
  217. AmountDue := DL * Config.OvertimeCharge;
  218. IF DaysLate > 0
  219. THEN
  220. AssignStr( 'Late charge for ',Notes);
  221. CardinalToStr(DaysLate,3,Str);
  222. Append(Str,Notes);
  223. Append(Notes,' tank days ');
  224. END;
  225. DisposeList(List);
  226. CloseGasDBF();
  227. END GasAmountDue;
  228. PROCEDURE ListOutstanding(CustID : ARRAY OF CHAR);
  229. CONST
  230. Title =
  231. ' Tank Size Invoice Out Invoice Date Due Date ';
  232. (*
  233. 0123456789012345678901234567890123456789012345678901234567890*)
  234. VAR
  235. DF : DisplayFrame;
  236. Handle : CARDINAL;
  237. Line : ARRAY[0..80] OF CHAR;
  238. Str : ARRAY [0..20] OF CHAR;
  239. Rec : POINTER TO FGasRec;
  240. B : BOOLEAN;
  241. J : CARDINAL;
  242. Code,Size : CARDINAL;
  243. FieldRec : InputFieldRecord;
  244. List : GenList;
  245. Title1 : ARRAY[0..80] OF CHAR;
  246. BEGIN
  247. OpenGasDBF(TRUE);
  248. GetGasByCust(CustID,'','O',List); (* get all items *)
  249. CloseGasDBF();
  250. InitDisplayFrame(DF,CurrentWindow);
  251. AddStrField(DF,2,2,Title,75);
  252. GetFieldRec(DF,1,FieldRec);
  253. FieldRec.typ := DispCode; (* headline = display code *)
  254. PutFieldRec(FieldRec,DF,1);
  255. DF^.headline := 2;
  256. IF ListLength(List) > 0 (* some tanks are outstanding *)
  257. THEN
  258. FOR J := 1 TO ListLength(List) DO
  259. GetElmtAdr(List,J,Rec,Size,Code);
  260. Fill(ADR(Line),SIZE(Line),' ');
  261. OverWrite(Rec^.Gas.ITEMNBR,Line,1);
  262. OverWrite(Rec^.Gas.INVNBR,Line,14);
  263. DateToStr(Rec^.Gas.DATEOUT,Str,B);
  264. OverWrite(Str,Line,29);
  265. DateToStr(Rec^.Gas.DUEDATE,Str,B);
  266. OverWrite(Str,Line,47);
  267. AddMenuItem(DF,2,J+2,Line,78,0,' ');
  268. END;
  269. ShowDisplayFrame(DF,1,13,80,24);
  270. Control(DF);
  271. IF PromptYN('Do you wish to print Y/N?',DF)
  272. THEN
  273. GetCurrCustName(Title1);
  274. Append(Title1,' - Gas Outstanding');
  275. Handle := OpenReportDevice();
  276. NormalTitle(Title1);
  277. PrintFrame(DF,Handle);
  278. CloseReportDevice(Handle);
  279. END;
  280. END; (* end of if > 0 *)
  281. CloseDisplayFrame(DF);
  282. DisposeList(List);
  283. END ListOutstanding;
  284. PROCEDURE ListHistory(CustID : ARRAY OF CHAR; DF1 : DisplayFrame);
  285. CONST
  286. Title =
  287. ' Size InvoiceOut DateOut DueDate InvoiceIn DateIn DaysLate Charge ';
  288. (*
  289. 0123456789012345678901234567890123456789012345678901234567890*)
  290. VAR
  291. DF : DisplayFrame;
  292. Line : ARRAY[0..80] OF CHAR;
  293. Str : ARRAY [0..20] OF CHAR;
  294. Rec : POINTER TO FGasRec;
  295. B : BOOLEAN;
  296. J : CARDINAL;
  297. Code,Size : CARDINAL;
  298. FieldRec : InputFieldRecord;
  299. List : GenList;
  300. Title1 : ARRAY[0..80] OF CHAR;
  301. Handle : CARDINAL;
  302. BEGIN
  303. IF NOT PromptYN('Warning Display gas history could take several minutes',DF1)
  304. THEN
  305. RETURN
  306. END;
  307. OpenGasDBF(TRUE);
  308. GetGasByCust(CustID,'','I',List); (* get all items *)
  309. CloseGasDBF();
  310. InitDisplayFrame(DF,CurrentWindow);
  311. AddStrField(DF,2,2,Title,75);
  312. GetFieldRec(DF,1,FieldRec);
  313. FieldRec.typ := DispCode; (* headline = display code *)
  314. PutFieldRec(FieldRec,DF,1);
  315. DF^.headline := 2;
  316. IF ListLength(List) > 0 (* some tanks are outstanding *)
  317. THEN
  318. FOR J := 1 TO ListLength(List) DO
  319. (***************************************************************************
  320. Size InvoiceOut DateOut DueDate InvoiceIn DateIn DaysLate Charge ';
  321. 0123456789012345678901234567890123456789012345678901234567890123456781234567*)
  322. GetElmtAdr(List,J,Rec,Size,Code);
  323. Fill(ADR(Line),SIZE(Line),' ');
  324. OverWrite(Rec^.Gas.ITEMNBR,Line,1);
  325. OverWrite(Rec^.Gas.INVNBR,Line,8);
  326. DateToStr(Rec^.Gas.DATEOUT,Str,B);
  327. OverWrite(Str,Line,20);
  328. DateToStr(Rec^.Gas.DUEDATE,Str,B);
  329. OverWrite(Str,Line,29);
  330. OverWrite(Rec^.Gas.ININVNBR,Line,38);
  331. DateToStr(Rec^.Gas.DATEIN,Str,B);
  332. OverWrite(Str,Line,49);
  333. CardinalToStr(Rec^.Gas.DAYSLATE,4,Str);
  334. OverWrite(Str,Line,60);
  335. AddMenuItem(DF,2,J+2,Line,78,0,' ');
  336. END;
  337. ShowDisplayFrame(DF,1,13,80,24);
  338. Control(DF);
  339. IF PromptYN('Do you wish to print Y/N?',DF)
  340. THEN
  341. GetCurrCustName(Title1);
  342. Append(Title1,' - Gas History');
  343. NormalTitle(Title1);
  344. Handle := OpenReportDevice();
  345. PrintFrame(DF,Handle);
  346. CloseReportDevice(Handle);
  347. END;
  348. END; (* end of if > 0 *)
  349. CloseDisplayFrame(DF);
  350. DisposeList(List);
  351. END ListHistory;
  352. END Gas.
  353.