INVOICEP.MOD 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. IMPLEMENTATION MODULE InvoicePrint;
  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 PMIGlobals IMPORT PMIScreens,Today,TodayStr,
  12. TodayDays,Config,NormalTitle;
  13. FROM PriceTable IMPORT ClearGrpCnt,AddGrp,GrpTotal,GetPrice,
  14. GetPriceTable;
  15. FROM DBFSalesrec IMPORT SalesRec,SalesrecDBF,SalesRecIdx,MoveSalesrecToDBF,
  16. MoveSalesrecFromDBF,OpenSalesrecDBF,CloseSalesrecDBF;
  17. FROM DBIndxes IMPORT FindPositionCh,CurrentRec;
  18. FROM ModBase3 IMPORT AppendBlank,ReadDBRec,WriteDBRec;
  19. FROM ScrnUtl1 IMPORT FieldNum;
  20. FROM DBStuff IMPORT MakeKey;
  21. FROM InputManager IMPORT ControlFrame;
  22. FROM Customer IMPORT AddressRec,AddCustYTD,GetCustAddr,AddressTypes,
  23. AddCustOutStd,SetCustLastInvDate;
  24. FROM DateFunctions IMPORT DateToStr;
  25. FROM DBFOrder IMPORT OrderRec,InvnbrIdx,OrderDBF,MoveOrderFromDBF;
  26. FROM PosUtils IMPORT Equal,Pos;
  27. FROM StrEdit IMPORT CrunchBlanks,DeleteRightJustified,Append,
  28. CAPstr,OverWrite,RightJustify,Center;
  29. FROM StrConv IMPORT CardinalToStr,RealToStr,StrToReal;
  30. FROM M2Strings IMPORT Length,Assign,Concat;
  31. FROM Gas IMPORT CheckOutGas,CheckInGas,DeleteGasFromInv;
  32. FROM LowLevel IMPORT Fill;
  33. FROM DBStuff IMPORT MakeSeqNbr,FindAll,ReadAllRecs,
  34. ConditionType,ChangeDateField,DeleteAllRecs;
  35. FROM DBUtils IMPORT ReadCardField,ReadRealField,ReadDateField,
  36. ChangeCardField,ChangeRealField,PrintFrame;
  37. FROM ScrnTypes IMPORT AFrameName;
  38. FROM NumTypes IMPORT Real8;
  39. FROM StringIO IMPORT PrintMessage,ErrorMessage,WriteEol,WriteStr;
  40. (* these next two are from stonybrook - the pmi version doesn't work*)
  41. FROM Prompts IMPORT Prompt,PromptStr,PromptYN;
  42. FROM SYSTEM IMPORT ADR,SIZE,TSIZE,ADDRESS,BYTE;
  43. FROM HandleIO IMPORT FileExists,OpenFile,CloseHandle,BlockWrite;
  44. FROM GenLists IMPORT GenList, NewList,ListLength,GetElmt,ElmtNow,GetElmtAdr,
  45. JoinLists,ListDelete,ListInsert,DisposeList,ShellSortList;
  46. FROM DBFInvoice IMPORT InvoiceDBF, OpenInvoiceDBF,InvoiceIdx,
  47. CloseInvoiceDBF,InvoiceRec,FindInvoiceByInvoice,CustidIdx,
  48. FindInvoiceByCustid,NextInvoice,PrevInvoice,InvoiceDBF,
  49. FirstInvoice,LastInvoice,MoveInvoiceToDBF,MoveInvoiceFromDBF;
  50. FROM Invoice IMPORT InvoiceItem,FInvoice,Credit,GasOut,GasIn,
  51. InvoiceHeadDF,OrderItemDF,CurrentInvoice,CurrInvOldAmt,OrderItemLst,
  52. SummaryDF,CurrentItem,HeaderChanged,Recompute,Special,ReadHeader;
  53. (***********************************************************************
  54. invoices are stored with the invoice number indexed and the
  55. customer number indexed.
  56. The customer number is indexed as
  57. Customer Number + Status
  58. Where status =
  59. 'O' - Open - not yet printed so can be edited
  60. 'P' - Posted (printed ) - can not be editied but can be viewes
  61. 'C' - Invoice is closed i.e. paid off
  62. Item Status = 'R' - Items still recorded
  63. 'D' - Items deleted
  64. ********************************************************************)
  65. PROCEDURE PostSales(InvNbr : ARRAY OF CHAR);
  66. (* go through the invoice and add items to inventory sales history*)
  67. VAR
  68. J : CARDINAL;
  69. Key : ARRAY[0..15] OF CHAR;
  70. Found : BOOLEAN;
  71. Sales : SalesRec;
  72. Size,Code : CARDINAL;
  73. TheList : GenList;
  74. Item : OrderRec;
  75. RecNbr : LONGINT;
  76. BEGIN
  77. RETURN; (* * * * * * * * * * *TEMP FIX * * * * * * * * * * *)
  78. NewList(TheList);
  79. CrunchBlanks(InvNbr);
  80. FindAll(InvnbrIdx,InvNbr,EQ,TheList); (* get items ordered *)
  81. OpenSalesrecDBF(TRUE);
  82. FOR J := 1 TO ListLength(TheList) DO
  83. GetElmt(TheList,J,RecNbr,Code);
  84. ReadDBRec(OrderDBF,RecNbr);
  85. MoveOrderFromDBF(Item);
  86. IF NOT Special(Item.ITEMNBR)
  87. THEN
  88. Assign( Item.ITEMNBR,Key );
  89. FindPositionCh(SalesRecIdx,Key,Found);
  90. IF Found
  91. THEN
  92. ReadDBRec(SalesrecDBF,CurrentRec(SalesRecIdx));
  93. MoveSalesrecFromDBF(Sales);
  94. Sales.Sold[Today.mo] := Sales.Sold[Today.mo] +
  95. Item.QNTSOLD;
  96. MoveSalesrecToDBF(Sales);
  97. ELSE
  98. AppendBlank(SalesrecDBF);
  99. Fill(ADR(Sales),SIZE(Sales),0);
  100. Sales.Sold[Today.mo] := Item.QNTSOLD;
  101. Assign( Item.ITEMNBR,Sales.ITEMNBR );
  102. MoveSalesrecToDBF(Sales);
  103. END;
  104. WriteDBRec(SalesrecDBF);
  105. END; (* end if not special order *)
  106. END; (* end of loop *)
  107. DisposeList(TheList);
  108. CloseSalesrecDBF();
  109. END PostSales;
  110. PROCEDURE PrintInvoice(PkgSlipOnly : BOOLEAN);
  111. CONST
  112. Blank = ' ';
  113. LinesPerPage = 32;
  114. VAR
  115. Str : ARRAY[0..100] OF CHAR;
  116. CurrentPage : CARDINAL;
  117. CurrentLine : CARDINAL;
  118. TotalPages : CARDINAL;
  119. NextFrame : AFrameName;
  120. BufCnt : CARDINAL;
  121. FF : BYTE;
  122. Prt : CARDINAL;
  123. R : Real8;
  124. J : CARDINAL;
  125. EM : ErrorMessage;
  126. Size,Code : CARDINAL;
  127. ShipTo,BillTo : AddressRec;
  128. TmpTotal : Real8;
  129. PROCEDURE NbrOfPages() : CARDINAL;
  130. (* calculate the number of pages for the invoice *)
  131. VAR J : CARDINAL;
  132. Lines : CARDINAL;
  133. Size,Code : CARDINAL;
  134. Tmp : ARRAY[0..80] OF CHAR;
  135. PgNbr : CARDINAL;
  136. PROCEDURE CountNoteLines();
  137. BEGIN
  138. CrunchBlanks(CurrentInvoice.NOTE1);
  139. IF Length(CurrentInvoice.NOTE1) > 1
  140. THEN INC(Lines);
  141. END;
  142. CrunchBlanks(CurrentInvoice.NOTE2);
  143. IF Length(CurrentInvoice.NOTE2) > 1
  144. THEN INC(Lines);
  145. END;
  146. CrunchBlanks(CurrentInvoice.NOTE3);
  147. IF Length(CurrentInvoice.NOTE3) > 1
  148. THEN INC(Lines);
  149. END;
  150. END CountNoteLines;
  151. BEGIN
  152. Lines := 1; (**)
  153. PgNbr := 1;
  154. IF (CurrentInvoice.NOTESFOR = 'B')
  155. THEN CountNoteLines();
  156. ELSIF ((CurrentInvoice.NOTESFOR='P') AND PkgSlipOnly)
  157. THEN CountNoteLines();
  158. ELSIF ((CurrentInvoice.NOTESFOR='I') AND NOT PkgSlipOnly)
  159. THEN CountNoteLines();
  160. END;
  161. FOR J := 1 TO ListLength(OrderItemLst) DO
  162. INC(Lines);
  163. IF Lines > LinesPerPage
  164. THEN
  165. INC (PgNbr);
  166. Lines := 1;
  167. END;
  168. GetElmtAdr(OrderItemLst,J,CurrentItem,Size,Code);
  169. CrunchBlanks(CurrentItem^.ItemOrderRec.NOTES1);
  170. CrunchBlanks(CurrentItem^.ItemOrderRec.NOTES2);
  171. CrunchBlanks(CurrentItem^.ItemOrderRec.NOTES3);
  172. IF Length(CurrentItem^.ItemOrderRec.NOTES1 ) > 1
  173. THEN
  174. INC(Lines);
  175. END;
  176. IF Length(CurrentItem^.ItemOrderRec.NOTES2) > 1
  177. THEN
  178. INC(Lines);
  179. END;
  180. IF Length(CurrentItem^.ItemOrderRec.NOTES3) > 1
  181. THEN
  182. INC(Lines);
  183. END;
  184. END; (* end for j *)
  185. (* Lines := Lines + 5; (* net, tax, discount, total *)*)
  186. RETURN PgNbr;
  187. END NbrOfPages;
  188. PROCEDURE PrintLine(Item : OrderRec; PksOnly : BOOLEAN);
  189. VAR
  190. Line : ARRAY[0..120] OF CHAR;
  191. BEGIN
  192. INC(CurrentLine); (* increment line counter *)
  193. Fill(ADR(Line),102,' ');
  194. RealToStr(Item.QNTSOLD,2,8,Str);
  195. RightJustify(Str,8);
  196. (* CrunchBlanks(Str); *)
  197. OverWrite(Str,Line,0);
  198. OverWrite(Item.UNITS,Line,8);
  199. OverWrite(Item.ITEMNBR,Line,14);
  200. OverWrite(Item.DESC,Line,23);
  201. IF NOT PksOnly
  202. THEN
  203. RealToStr(Item.UNITPRC,2,6,Str);
  204. RightJustify(Str,6);
  205. OverWrite(Str,Line,78);
  206. RealToStr(Item.TOTAL,2,6,Str);
  207. RightJustify(Str,7);
  208. OverWrite(Str,Line,88);
  209. Line[96] := 0C;
  210. ELSE
  211. Line[79] := 0C;
  212. END;
  213. WriteEol(Prt,Line);
  214. CrunchBlanks(Item.NOTES1);
  215. CrunchBlanks(Item.NOTES2);
  216. CrunchBlanks(Item.NOTES3);
  217. IF Item.NOTES1[0] > 0C (* notes exist *)
  218. THEN
  219. WriteStr(Prt,Blank);
  220. WriteEol(Prt,Item.NOTES1);
  221. INC(CurrentLine);
  222. IF Item.NOTES2[0] > 0C
  223. THEN
  224. WriteStr(Prt,Blank);
  225. WriteEol(Prt,Item.NOTES2);
  226. INC(CurrentLine);
  227. IF Item.NOTES3[0] > 0C
  228. THEN
  229. WriteStr(Prt,Blank);
  230. WriteEol(Prt,Item.NOTES3);
  231. INC(CurrentLine);
  232. END;
  233. END;
  234. END;
  235. END PrintLine;
  236. PROCEDURE PrintPkgSlpHeader();
  237. VAR J : CARDINAL;
  238. Str2 : ARRAY[0..10] OF CHAR;
  239. BEGIN
  240. Assign( Config.CompanyName,Str );
  241. Center(Str,80);
  242. OverWrite(TodayStr,Str,64);
  243. WriteEol(Prt,Str);
  244. Fill(ADR(Str),SIZE(Str),' ');
  245. Assign( Config.CompanyAddr1,Str );
  246. Center(Str,80);
  247. CardinalToStr(CurrentPage,2,Str2);
  248. INC(CurrentPage);
  249. OverWrite('Page ',Str,60);
  250. OverWrite(Str2,Str,65);
  251. OverWrite('OF ',Str,67);
  252. CardinalToStr(TotalPages,2,Str2);
  253. OverWrite(Str2,Str,70);
  254. WriteEol(Prt,Str);
  255. Fill(ADR(Str),SIZE(Str),' ');
  256. Assign( Config.CompanyAddr2,Str );
  257. Center(Str,80);
  258. OverWrite(CurrentInvoice.CUSTID,Str,64);
  259. WriteEol(Prt,Str);
  260. Assign( Config.Phone,Str );
  261. Center(Str,80);
  262. WriteEol(Prt,Str);
  263. Assign( TodayStr,Str );
  264. Center(Str,80);
  265. WriteEol(Prt,Str);
  266. WriteEol(Prt,'');
  267. WriteEol(Prt,'');
  268. WriteEol(Prt,'');
  269. Fill(ADR(Str),SIZE(Str),' ');
  270. Str[79] := 0C;
  271. OverWrite('SHIP TO: ',Str,10);
  272. FOR J := 0 TO 3 DO
  273. OverWrite(ShipTo.Line[J],Str,20);
  274. WriteEol(Prt,Str);
  275. Fill(ADR(Str),SIZE(Str),' ');
  276. Str[79] := 0C;
  277. END;
  278. WriteEol(Prt,'');
  279. WriteEol(Prt,'');
  280. WriteEol(Prt,'');
  281. WriteStr(Prt,'Ship VIA: ');
  282. WriteStr(Prt,CurrentInvoice.SHIPVIA);
  283. WriteStr(Prt,' FF = ');
  284. WriteStr(Prt,CurrentInvoice.FREEFRGHT);
  285. WriteStr(Prt,'Terms: ');
  286. WriteStr(Prt,CurrentInvoice.TERMS);
  287. WriteEol(Prt,'');
  288. WriteStr(Prt,'Invoice Number: ');
  289. WriteStr(Prt,CurrentInvoice.INVOICE);
  290. WriteEol(Prt,'');
  291. WriteEol(Prt,'');
  292. END PrintPkgSlpHeader;
  293. PROCEDURE PrintHeader();
  294. CONST
  295. err = 'ASCII ERROR';
  296. VAR
  297. Tmp : ARRAY[0..10] OF CHAR;
  298. B : BOOLEAN;
  299. J : CARDINAL;
  300. TLines : CARDINAL;
  301. Str2,
  302. CPI12,
  303. CPIPana : ARRAY[0..10] OF CHAR;
  304. Str : ARRAY[0..120] OF CHAR;
  305. BEGIN
  306. Concat(CHR(27),':',CPI12);
  307. Concat(CHR(27),CHR(15),CPIPana);
  308. Str := err;
  309. WriteStr(Prt,CPI12);
  310. CurrentLine := 1;
  311. IF PkgSlipOnly
  312. THEN
  313. WriteStr(Prt,CPIPana);
  314. PrintPkgSlpHeader();
  315. RETURN;
  316. END;
  317. Fill(ADR(Str),SIZE(Str),' ');
  318. Str[95] := 0C;
  319. WriteEol(Prt,'');
  320. DateToStr(CurrentInvoice.INVDATE,Str2,B);
  321. OverWrite(Str2,Str,75);
  322. WriteEol(Prt,Str);
  323. Fill(ADR(Str),SIZE(Str),' ');
  324. CardinalToStr(CurrentPage,2,Str2);
  325. OverWrite(Str2,Str,76);
  326. INC(CurrentPage);
  327. OverWrite('OF ',Str,79);
  328. TLines := TotalPages;
  329. CardinalToStr(TLines,2,Str2);
  330. (* CardinalToStr(TotalPages,2,Str[70..73]);*)
  331. OverWrite(Str2,Str,82);
  332. Str[96] := 0C;
  333. WriteEol(Prt,Str);
  334. Fill(ADR(Str),SIZE(Str),' ');
  335. Str[96] := 0C;
  336. OverWrite(CurrentInvoice.CUSTID,Str,76);
  337. WriteEol(Prt,Str);
  338. WriteEol(Prt,'');
  339. WriteEol(Prt,'');
  340. WriteEol(Prt,'');
  341. WriteEol(Prt,'');
  342. WriteEol(Prt,'');
  343. FOR J := 0 TO 3 DO
  344. Fill(ADR(Str),SIZE(Str),' ');
  345. OverWrite(BillTo.Line[J],Str,15);
  346. OverWrite(ShipTo.Line[J],Str,66);
  347. Str[94] := 0C;
  348. WriteEol(Prt,Str);
  349. END;
  350. FOR J := 1 TO 5 DO
  351. WriteEol(Prt,'');
  352. END;
  353. Fill(ADR(Str),SIZE(Str),' ');
  354. Str[95] := 0C;
  355. DateToStr(CurrentInvoice.INVDATE,Str2,B);
  356. OverWrite(Str2,Str,0);
  357. OverWrite(CurrentInvoice.CUSTPO,Str,10);
  358. OverWrite(Str2,Str,23);
  359. OverWrite(CurrentInvoice.SALESMAN,Str,33);
  360. OverWrite(CurrentInvoice.TERMS,Str,42);
  361. OverWrite(CurrentInvoice.SHIPVIA,Str,63);
  362. OverWrite(CurrentInvoice.INVOICE,Str,88);
  363. WriteEol(Prt,Str);
  364. FOR J := 1 TO 4 DO
  365. WriteEol(Prt,'');
  366. END;
  367. END PrintHeader;
  368. PROCEDURE WriteHeaderNotes();
  369. VAR
  370. TmpStr : ARRAY[0..30] OF CHAR;
  371. BEGIN
  372. IF Length(CurrentInvoice.NOTE1) > 1
  373. THEN
  374. WriteStr(Prt,Blank);
  375. WriteEol(Prt,CurrentInvoice.NOTE1);
  376. INC(CurrentLine);
  377. END;
  378. IF Length(CurrentInvoice.NOTE2) > 1
  379. THEN
  380. WriteStr(Prt,Blank);
  381. WriteEol(Prt,CurrentInvoice.NOTE2);
  382. INC(CurrentLine);
  383. END;
  384. IF Length(CurrentInvoice.NOTE3) > 1
  385. THEN
  386. WriteStr(Prt,Blank);
  387. WriteEol(Prt,CurrentInvoice.NOTE3);
  388. INC(CurrentLine);
  389. END;
  390. END WriteHeaderNotes;
  391. VAR
  392. TmpStr : ARRAY[0..10] OF CHAR;
  393. BEGIN (* print invoice *)
  394. TotalPages :=NbrOfPages();
  395. IF CurrentInvoice.INVPRNT # 'O'
  396. THEN
  397. IF NOT PromptYN('WARNING Invoice already posted - Continue (y/n)?',InvoiceHeadDF)
  398. THEN
  399. RETURN
  400. ELSE
  401. IF CurrentInvoice.HELIUM = 'Y'
  402. THEN
  403. DeleteGasFromInv(CurrentInvoice.INVOICE);
  404. END;
  405. R := - CurrInvOldAmt;
  406. AddCustYTD(R); (* subtract the value from invoice prior to *)
  407. END;
  408. END;
  409. GetCustAddr(BillTo,Billing);
  410. GetCustAddr(ShipTo, Shipping);
  411. IF PkgSlipOnly
  412. THEN EM := OpenFile(Prt,Config.PksSlipPrt) (* which printer *)
  413. ELSE
  414. EM := OpenFile(Prt,Config.InvoicePrt);
  415. CurrentInvoice.INVPRNT := 'P'; (* printed/posted *)
  416. CurrentInvoice.AMTOUT := CurrentInvoice.TOTALAMT;
  417. HeaderChanged := TRUE;
  418. IF CurrentInvoice.AMTOUT = 0.0
  419. THEN IF PromptYN('Zero Invoice Amount - close invoice ',InvoiceHeadDF)
  420. THEN CurrentInvoice.INVPRNT := 'C';
  421. END;
  422. END;
  423. AddCustOutStd(CurrentInvoice.AMTOUT);
  424. SetCustLastInvDate(CurrentInvoice.INVDATE);
  425. (*CurrentInvoice.INVDATE := Today; invoice date = date printed *)
  426. AddCustYTD(CurrentInvoice.INVNET); (* update YTD Amount *)
  427. CurrInvOldAmt := CurrentInvoice.INVNET;
  428. IF (CurrentInvoice.SHIPPING = 0.0 ) AND (CurrentInvoice.FREEFRGHT # 'Y')
  429. THEN
  430. R := - CurrentInvoice.AMTOUT;
  431. AddCustOutStd(R);
  432. ControlFrame(InvoiceHeadDF,FieldNum(InvoiceHeadDF,'Shipping'),'',FALSE,NextFrame);
  433. ReadHeader();
  434. Recompute(); (* get shipping charge *)
  435. CurrentInvoice.AMTOUT := CurrentInvoice.TOTALAMT;
  436. END;
  437. AddCustOutStd(CurrentInvoice.AMTOUT);
  438. END;
  439. CurrentPage := 1;
  440. CurrentLine := 1;
  441. PrintHeader();
  442. IF (CurrentInvoice.NOTESFOR = 'B')
  443. THEN WriteHeaderNotes();
  444. ELSIF ((CurrentInvoice.NOTESFOR = 'P') AND PkgSlipOnly)
  445. THEN WriteHeaderNotes();
  446. ELSIF ((CurrentInvoice.NOTESFOR = 'I') AND NOT PkgSlipOnly)
  447. THEN WriteHeaderNotes();
  448. END;
  449. FOR J := 1 TO ListLength(OrderItemLst) DO
  450. IF((CurrentLine MOD LinesPerPage) = 0)
  451. THEN
  452. FF := 0C;
  453. EM := BlockWrite(Prt,ADR(FF),1);
  454. PrintHeader()
  455. END;
  456. GetElmtAdr(OrderItemLst,J,CurrentItem,Size,Code); (* get the item*)
  457. PrintLine(CurrentItem^.ItemOrderRec,PkgSlipOnly);
  458. IF NOT PkgSlipOnly
  459. THEN
  460. IF Pos(GasOut,CurrentItem^.ItemOrderRec.ITEMNBR) = 0
  461. THEN
  462. CurrentInvoice.HELIUM := 'Y';
  463. CheckOutGas(CurrentInvoice.CUSTID,CurrentInvoice.INVOICE,
  464. CurrentItem^.ItemOrderRec.ITEMNBR,
  465. TRUNC(CurrentItem^.ItemOrderRec.QNTSOLD),
  466. CurrentInvoice.INVDATE);
  467. ELSIF Pos(GasIn,CurrentItem^.ItemOrderRec.ITEMNBR) = 0
  468. THEN
  469. CurrentInvoice.HELIUM := 'Y';
  470. CheckInGas(CurrentInvoice.CUSTID,CurrentInvoice.INVOICE,
  471. CurrentItem^.ItemOrderRec.ITEMNBR,
  472. TRUNC(CurrentItem^.ItemOrderRec.QNTSOLD),
  473. CurrentInvoice.INVDATE);
  474. END;
  475. END;
  476. END;
  477. IF NOT PkgSlipOnly
  478. THEN
  479. WriteEol(Prt,'');
  480. Fill(ADR(Str),SIZE(Str)-2,' ');
  481. OverWrite('========',Str,88);
  482. WriteEol(Prt,Str);
  483. Fill(ADR(Str),SIZE(Str)-2,' ');
  484. OverWrite('Net',Str,40);
  485. TmpTotal := CurrentInvoice.INVNET / (1.0 - (CurrentInvoice.INVDSCNT/100.0));
  486. RealToStr(TmpTotal,2,8,TmpStr);
  487. OverWrite(Str,TmpStr,87);
  488. WriteEol(Prt,Str);
  489. IF CurrentInvoice.INVDSCNT > 0.0
  490. THEN
  491. Fill(ADR(Str),SIZE(Str)-2,' ');
  492. OverWrite('Discount @',Str,40);
  493. RealToStr(CurrentInvoice.INVDSCNT ,1,4,TmpStr);
  494. OverWrite(Str,TmpStr,51);
  495. OverWrite('%',Str,56);
  496. IF Str[55] = 0C
  497. THEN
  498. Str[55] := ' ';
  499. END;
  500. RealToStr((-1.0 * TmpTotal * CurrentInvoice.INVDSCNT/100.0 ),
  501. 2,8,TmpStr);
  502. OverWrite(TmpStr,Str,87);
  503. WriteEol(Prt,Str);
  504. END;
  505. IF (CurrentInvoice. TAXABLE = 'Y')
  506. THEN
  507. Fill(ADR(Str),SIZE(Str)-2,' ');
  508. OverWrite('Tax ',Str,40);
  509. RealToStr(CurrentInvoice.INVTAX,2,8,TmpStr);
  510. OverWrite(TmpStr,Str,87);
  511. WriteEol(Prt,Str);
  512. END;
  513. IF CurrentInvoice.SHIPPING > 0.0
  514. THEN
  515. Fill(ADR(Str),SIZE(Str)-2,' ');
  516. OverWrite('Shipping/Handling',Str,40);
  517. RealToStr(CurrentInvoice.SHIPPING,2,8,TmpStr);
  518. OverWrite(TmpStr,Str,87);
  519. WriteEol(Prt,Str);
  520. END;
  521. WriteEol(Prt,'');
  522. Fill(ADR(Str),SIZE(Str)-2,' ');
  523. OverWrite('TOTAL DUE',Str,40);
  524. RealToStr(CurrentInvoice.TOTALAMT,2,8,TmpStr);
  525. OverWrite(TmpStr,Str,87);
  526. WriteEol(Prt,Str);
  527. END;
  528. WriteStr(Prt,12C); (* final form feed *)
  529. EM := CloseHandle(Prt);
  530. (* if freight = 0.0 and invoice charge freight = y Then prompt for frieght*)
  531. END PrintInvoice;
  532. END InvoicePrint.