CUSTOMER.MOD 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. IMPLEMENTATION MODULE Customer;
  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 PMIScreens,Config,NormalTitle;
  14. FROM DBStuff IMPORT MakeSeqNbr,MakeKey;
  15. FROM DBUtils IMPORT ChangeDateField,ChangeRealField,PrintTitle;
  16. FROM Scrn2DBF IMPORT FrameToDBF, DBFToFrame;
  17. FROM NumTypes IMPORT Real8;
  18. FROM DateFunctions IMPORT Date;
  19. FROM Numbers IMPORT Max;
  20. FROM PosUtils IMPORT Equal;
  21. FROM StrEdit IMPORT CrunchBlanks,DeleteRightJustified,Append,CAPstr,
  22. AssignStr,DeleteChar;
  23. FROM M2Strings IMPORT Length,Assign,Concat;
  24. FROM LowLevel IMPORT Fill;
  25. FROM StringIO IMPORT PrintMessage,ErrorMessage,WriteEol,WriteStr;
  26. (* these next two are from stonybrook - the pmi version doesn't work*)
  27. FROM SmartScreen IMPORT ClearScreen;
  28. FROM ScrnUtl1 IMPORT FieldNum;
  29. FROM ScrnUtl2 IMPORT CloseDisplayFrame;
  30. FROM VWindows IMPORT ClearPart, CurrentWindow, SetCursorHeight;
  31. FROM ScrnTypes IMPORT DisplayFrame,InitDisplayFrame,AFrameName,DisplayFile;
  32. FROM FramePainter IMPORT ShowDisplayFrame,RedrawField;
  33. FROM InputManager IMPORT ControlFrame;
  34. FROM FrameManager IMPORT EraseFrame;
  35. FROM Prompts IMPORT Prompt,PromptStr,PromptNum,PromptYN;
  36. FROM SYSTEM IMPORT ADR,SIZE,ADDRESS;
  37. FROM ControlUtils IMPORT ControlSeparately, LoadFrameList,Control,ChangeField;
  38. FROM DspFiles IMPORT OpenDisplayFile,ReadDisplayFrame;
  39. FROM HandleIO IMPORT FileExists,OpenFile,CloseHandle;
  40. FROM Prompts IMPORT Prompt;
  41. FROM ManualInvoice IMPORT AddManualInvoice;
  42. FROM GenLists IMPORT GenList, NewList,ListLength,GetElmt,
  43. GetElmtAdr,DisposeList;
  44. FROM Invoice IMPORT ControlInvoice,PayInvoice,InvoiceHistory,
  45. MakeInvoicePrintLine,InvoiceDaysLate,GetOutstanding;
  46. FROM DBFCustomer IMPORT CustomerDBF, OpenCustomerDBF,
  47. CloseCustomerDBF,CustomerRec,FindCustomerByCin,FindCustomerByName,
  48. NextCustomer,PrevCustomer,FirstCustomer,LastCustomer,MoveCustomerFromDBF,
  49. MoveCustomerToDBF;
  50. FROM Payments IMPORT ShowPaymentHist;
  51. FROM Gas IMPORT ListOutstanding,ListHistory;
  52. VAR
  53. Status : INTEGER;
  54. Environ : ARRAY [0..60] OF CHAR;
  55. J : CARDINAL;
  56. FirstTime: BOOLEAN;
  57. NextFrame,EndingFrame : AFrameName;
  58. SelChar : CHAR;
  59. NoData : BOOLEAN; (* true when no data is on the screen *)
  60. CustomerDF : DisplayFrame;
  61. DSPFile : DisplayFile;
  62. PullDnMenu : GenList;
  63. CurrentCust : CustomerRec;
  64. PROCEDURE GetCustNbr( VAR CustNbr : ARRAY OF CHAR);
  65. BEGIN
  66. Assign(CurrentCust.CIN,CustNbr);
  67. CrunchBlanks(CustNbr);
  68. END GetCustNbr;
  69. PROCEDURE GetCustTerms(VAR Terms : ARRAY OF CHAR);
  70. BEGIN
  71. Assign(CurrentCust.TERMS,Terms );
  72. END GetCustTerms;
  73. PROCEDURE GetCustSalesRep(VAR Rep : ARRAY OF CHAR);
  74. BEGIN
  75. Assign(CurrentCust.SALESREP,Rep );
  76. END GetCustSalesRep;
  77. PROCEDURE GetCustSalesRepCom(VAR Percent : Real8);
  78. BEGIN
  79. Percent := CurrentCust.SALEREPCOM;
  80. END GetCustSalesRepCom;
  81. PROCEDURE GetCustShipVia(VAR Ship : ARRAY OF CHAR);
  82. BEGIN
  83. Assign( CurrentCust.SHIPVIA,Ship);
  84. END GetCustShipVia;
  85. PROCEDURE GetCustDisAmount(VAR DcntAmount : Real8);
  86. BEGIN
  87. DcntAmount := CurrentCust.DISCAMOUNT;
  88. END GetCustDisAmount;
  89. PROCEDURE GetCustDisCntLvl(VAR DefaultLvl : CARDINAL);
  90. BEGIN
  91. DefaultLvl := CurrentCust.DISCLEVEL;
  92. END GetCustDisCntLvl;
  93. PROCEDURE GetCustTaxable(VAR Taxable : CHAR);
  94. BEGIN
  95. Taxable := CurrentCust.TAXABLE;
  96. CAPstr(Taxable);
  97. END GetCustTaxable;
  98. PROCEDURE GetCustFreeFrght(VAR FreeFrght : CHAR);
  99. BEGIN
  100. FreeFrght := CurrentCust.FREEFRGHT;
  101. CAPstr(FreeFrght);
  102. END GetCustFreeFrght;
  103. PROCEDURE GetCustAddr(VAR Addr : AddressRec; AddrType : AddressTypes);
  104. VAR J : CARDINAL;
  105. BEGIN
  106. Fill(ADR(Addr),SIZE(Addr),0);
  107. J := 1;
  108. WITH CurrentCust DO
  109. IF AddrType = Billing
  110. THEN
  111. Assign(NAME,Addr.Line[0]);
  112. Assign( BILLTOZP,Addr.ZipCode);
  113. Assign( BILLTOA1,Addr.Line[1]);
  114. CrunchBlanks(Addr.Line[1]);
  115. IF Length(Addr.Line[1]) > 0
  116. THEN INC(J);
  117. END;
  118. Assign( BILLTOA2,Addr.Line[J]);
  119. CrunchBlanks(Addr.Line[J]);
  120. IF Length(Addr.Line[J]) > 0
  121. THEN INC(J);
  122. END;
  123. Assign( BILLTOA3,Addr.Line[J]);
  124. CrunchBlanks(Addr.Line[J]);
  125. IF Length(Addr.Line[J]) = 0
  126. THEN DEC(J);
  127. END;
  128. Append(Addr.Line[J],' ');
  129. Append(Addr.Line[J],BILLTOZP);
  130. ELSE
  131. Assign( NAME,Addr.Line[0]);
  132. Assign( SHIPTOZP,Addr.ZipCode);
  133. Assign( SHIPTOA1,Addr.Line[1]);
  134. CrunchBlanks(Addr.Line[1]);
  135. IF Length(Addr.Line[1]) > 0
  136. THEN INC(J);
  137. END;
  138. Assign( SHIPTOA2,Addr.Line[J]);
  139. CrunchBlanks(Addr.Line[J]);
  140. IF Length(Addr.Line[J]) > 0
  141. THEN INC(J);
  142. END;
  143. Assign( SHIPTOA3,Addr.Line[J] );
  144. CrunchBlanks(Addr.Line[J]);
  145. IF Length(Addr.Line[J]) = 0
  146. THEN DEC(J);
  147. END;
  148. Append(Addr.Line[J],' ');
  149. Append(Addr.Line[J],' ');
  150. Append(Addr.Line[J],SHIPTOZP);
  151. END;
  152. END; (* end of with *)
  153. END GetCustAddr;
  154. PROCEDURE GetCurrCustName(VAR Name : ARRAY OF CHAR);
  155. BEGIN
  156. Assign( CurrentCust.NAME,Name);
  157. END GetCurrCustName;
  158. PROCEDURE SetCustomerRec(Cust : CustomerRec);
  159. BEGIN
  160. CurrentCust := Cust;
  161. END SetCustomerRec;
  162. PROCEDURE UpdateCustomerFile();
  163. BEGIN
  164. MoveCustomerToDBF(CurrentCust);
  165. WriteDBRec(CustomerDBF);
  166. END UpdateCustomerFile;
  167. PROCEDURE SetCustLastInvDate( D : Date);
  168. BEGIN
  169. CurrentCust.LASTINV := D;
  170. ChangeDateField(CustomerDF,D,'LASTINV');
  171. (* RedrawField(CustomerDF,FieldNum(CustomerDF,'LASTINV'),FALSE); *)
  172. UpdateCustomerFile();
  173. END SetCustLastInvDate;
  174. PROCEDURE SetCustOutStd(AmountOut : Real8);
  175. BEGIN
  176. CurrentCust.AMTOUT := AmountOut;
  177. ChangeRealField(CustomerDF,AmountOut,'AMTOUT');
  178. RedrawField(CustomerDF,FieldNum(CustomerDF,'AMTOUT'),FALSE);
  179. UpdateCustomerFile();
  180. END SetCustOutStd;
  181. PROCEDURE AddCustOutStd(AmountOut : Real8);
  182. BEGIN
  183. CurrentCust.AMTOUT := CurrentCust.AMTOUT + AmountOut;
  184. ChangeRealField(CustomerDF,CurrentCust.AMTOUT,'AMTOUT');
  185. RedrawField(CustomerDF,FieldNum(CustomerDF,'AMTOUT'),FALSE);
  186. UpdateCustomerFile();
  187. END AddCustOutStd;
  188. PROCEDURE AddCustYTD(AddAmount : Real8);
  189. BEGIN
  190. CurrentCust.YTDPURCH := CurrentCust.YTDPURCH + AddAmount;
  191. IF CurrentCust.YTDPURCH < 0.0
  192. THEN
  193. CurrentCust.YTDPURCH := 0.0;
  194. END;
  195. ChangeRealField(CustomerDF,CurrentCust.YTDPURCH,'YTDPURCH');
  196. (* RedrawField(CustomerDF,FieldNum(CustomerDF,'YTDPURCH'),FALSE); *)
  197. UpdateCustomerFile();
  198. END AddCustYTD;
  199. PROCEDURE GetCustName(CIN : ARRAY OF CHAR; VAR Name : ARRAY OF CHAR);
  200. VAR
  201. TMP : CustomerRec;
  202. BEGIN
  203. MakeKey(CIN);
  204. IF NOT FindCustomerByCin(CIN)
  205. THEN AssignStr( '?????',Name);
  206. ELSE
  207. MoveCustomerFromDBF(CurrentCust);
  208. Assign(CurrentCust.NAME,Name);
  209. END;
  210. END GetCustName;
  211. PROCEDURE PrintLabels();
  212. (* print shipping labels*)
  213. CONST
  214. ShipLines = CHR(12);
  215. FF = CHR(12);
  216. NorLength = CHR(66);
  217. (* L1:=ARRAY OF CHAR (CHR(27),'C');
  218. L2:ARRAY OF CHAR=[CHR(27),'C',NorLength]; *)
  219. VAR
  220. Cnt : CARDINAL;
  221. J,K : CARDINAL;
  222. PrtHand : CARDINAL;
  223. EM : ErrorMessage;
  224. Addr : AddressRec;
  225. L1 : ARRAY[0..2] OF CHAR;
  226. L2 : ARRAY[0..3] OF CHAR;
  227. BEGIN
  228. Concat(27C,'C',L1);
  229. Concat(L1,NorLength,L2);
  230. Cnt := PromptNum(' Enter number of labels to print ',1);
  231. EM := OpenFile(PrtHand,Config.LabelPrt);
  232. (* put the form length here *)
  233. (* WriteStr(PrtHand,L1); *) (* set form length to lenght of lables*)
  234. WriteStr(PrtHand,CHAR(18));
  235. FOR J := 1 TO Cnt DO
  236. WriteStr(PrtHand,'FROM ');
  237. WriteEol(PrtHand,Config.CompanyName);
  238. WriteStr(PrtHand,' ');
  239. WriteEol(PrtHand,Config.CompanyAddr1);
  240. WriteStr(PrtHand,' ');
  241. WriteEol(PrtHand,Config.CompanyAddr2);
  242. WriteEol(PrtHand,''); (* go to the from part *)
  243. WriteEol(PrtHand,'');
  244. WriteEol(PrtHand,'');
  245. WriteEol(PrtHand,'');
  246. WriteEol(PrtHand,'');
  247. WriteStr(PrtHand,'TO ');
  248. GetCustAddr(Addr,Shipping);
  249. FOR K := 0 TO 3 DO
  250. WriteEol(PrtHand,Addr.Line[K]);
  251. WriteStr(PrtHand,' ');
  252. END;
  253. FOR K := 1 TO 6 DO
  254. WriteEol(PrtHand,'');
  255. END;
  256. END;
  257. (* WriteStr(PrtHand,L2); (* reset lenght at 66 lines / inch *)*)
  258. EM := CloseHandle(PrtHand);
  259. END PrintLabels;
  260. PROCEDURE FileMenu(SelChar: CHAR);
  261. VAR
  262. B : BOOLEAN;
  263. Str : ARRAY [0..80] OF CHAR;
  264. BEGIN
  265. CASE SelChar OF
  266. 'A' : ReadDisplayFrame(PMIScreens,CustomerDF,'Customer'); (*Clear out any of the fields *)
  267. MakeSeqNbr('Cust',Config.CustNbrPre,Str);
  268. ChangeField(CustomerDF,Str,'CIN',TRUE);
  269. ShowDisplayFrame(CustomerDF,0,0,0,0);
  270. Control(CustomerDF); (* alow user input *)
  271. AppendBlank(CustomerDBF);
  272. B := FrameToDBF(CustomerDBF,CustomerDF); (* do something if couldn't add*)
  273. MoveCustomerFromDBF(CurrentCust);
  274. WITH CurrentCust DO
  275. CrunchBlanks(BILLTOA1);
  276. IF (BILLTOA1[0] = CHR(0))
  277. THEN
  278. Assign( SHIPTOA1,BILLTOA1);
  279. Assign( SHIPTOA2,BILLTOA2);
  280. Assign(SHIPTOA3,BILLTOA3 );
  281. Assign( SHIPTOZP,BILLTOZP);
  282. MoveCustomerToDBF(CurrentCust);
  283. DBFToFrame(CustomerDBF,CustomerDF);
  284. ShowDisplayFrame(CustomerDF,0,0,0,0);
  285. END;
  286. END; (* end of with *)
  287. WriteDBRec(CustomerDBF);
  288. |'F' : FirstCustomer();
  289. DBFToFrame(CustomerDBF,CustomerDF);
  290. ShowDisplayFrame(CustomerDF,0,0,0,0);
  291. |'L' : LastCustomer();
  292. DBFToFrame(CustomerDBF,CustomerDF);
  293. ShowDisplayFrame(CustomerDF,0,0,0,0);
  294. |'N' : IF NextCustomer()
  295. THEN
  296. DBFToFrame(CustomerDBF,CustomerDF);
  297. ShowDisplayFrame(CustomerDF,0,0,0,0);
  298. END;
  299. |'P' : IF PrevCustomer()
  300. THEN
  301. DBFToFrame(CustomerDBF,CustomerDF);
  302. ShowDisplayFrame(CustomerDF,0,0,0,0);
  303. END;
  304. |'C' : (* The first unused letter in the index name or 'Q' *)
  305. Fill(ADR(Str),SIZE(Str),0);
  306. PromptStr('Enter Customer Cin ',Str);
  307. MakeKey(Str);
  308. IF NOT FindCustomerByCin(Str)
  309. THEN
  310. Prompt('Customer Not Found');
  311. ELSE
  312. DBFToFrame(CustomerDBF,CustomerDF);
  313. ShowDisplayFrame(CustomerDF,0,0,0,0);
  314. END;
  315. |'M' : (* The first unused letter in the index name or 'Q' *)
  316. Fill(ADR(Str),SIZE(Str),0);
  317. PromptStr('Enter Customer Nameidx ',Str);
  318. MakeKey(Str);
  319. IF NOT FindCustomerByName(Str)
  320. THEN (* always display the cust or the closet one *)
  321. END;
  322. DBFToFrame(CustomerDBF,CustomerDF);
  323. ShowDisplayFrame(CustomerDF,0,0,0,0);
  324. END; (* end of case *)
  325. END FileMenu;
  326. PROCEDURE EditMenu(SelChar : CHAR);
  327. VAR
  328. B : BOOLEAN;
  329. BEGIN
  330. CASE SelChar OF
  331. 'U' : Control(CustomerDF);
  332. B := FrameToDBF(CustomerDBF,CustomerDF);
  333. WriteDBRec(CustomerDBF);
  334. |'D' : IF PromptYN('About to delete customer - continue ?',CustomerDF)
  335. THEN
  336. DeleteRecord(CustomerDBF);
  337. B :=NextCustomer();
  338. FileMenu('P');
  339. END;
  340. END;
  341. END EditMenu;
  342. PROCEDURE InvoiceMenu(SelChar: CHAR);
  343. VAR
  344. Inv : ARRAY[0..15] OF CHAR;
  345. BEGIN
  346. MoveCustomerFromDBF(CurrentCust);
  347. CASE SelChar OF
  348. 'A' : ControlInvoice('N');
  349. |'E' : ControlInvoice('E'); (*edit invoice *)
  350. |'P' : ControlInvoice('P');
  351. |'C' : ControlInvoice('C');
  352. |'Y' : PayInvoice();
  353. |'M' : AddManualInvoice();
  354. END; (* end of case *)
  355. ShowDisplayFrame(CustomerDF,0,0,0,0); (* clear out the invoice stuff*)
  356. END InvoiceMenu;
  357. PROCEDURE PrintMenu(SelChar : CHAR);
  358. BEGIN
  359. MoveCustomerFromDBF(CurrentCust);
  360. CrunchBlanks(CurrentCust.CIN);
  361. CASE SelChar OF
  362. 'H' : ListOutstanding(CurrentCust.CIN);
  363. |'L' : PrintLabels();
  364. |'E' : ListHistory(CurrentCust.CIN,CustomerDF);
  365. |'Y' : ShowPaymentHist(CurrentCust.CIN);
  366. |'V' : InvoiceHistory();
  367. END;
  368. END PrintMenu;
  369. PROCEDURE ControlCustomer();
  370. BEGIN
  371. (* OpenCustomerDBF(TRUE); *)
  372. ClearScreen();
  373. InitDisplayFrame(CustomerDF,CurrentWindow);
  374. NewList(PullDnMenu);
  375. LoadFrameList(PMIScreens,'TopMenu',PullDnMenu);
  376. NoData := TRUE;
  377. ReadDisplayFrame(PMIScreens,CustomerDF,'Customer');
  378. REPEAT
  379. NextFrame := 'TopMenu';
  380. ControlSeparately(PullDnMenu,NextFrame,SelChar,EndingFrame);
  381. IF Equal(EndingFrame,'FileMenu')
  382. THEN FileMenu(SelChar);
  383. ELSIF Equal(EndingFrame,'EditMenu')
  384. THEN EditMenu(SelChar);
  385. ELSIF Equal(EndingFrame,'InvoiceMenu')
  386. THEN InvoiceMenu(SelChar);
  387. ELSIF Equal(EndingFrame,'PrintMenu')
  388. THEN PrintMenu(SelChar);
  389. END;
  390. UNTIL SelChar='X'; (* Assumes 'X' is only used to exit *)
  391. CloseDisplayFrame(CustomerDF);
  392. (* CloseCustomerDBF();*)
  393. ClearScreen();
  394. END ControlCustomer;
  395. END Customer.
  396.