IMPLEMENTATION MODULE CustReports; (* * ModBase * Release 3.0 * (c) Copyright 1986 - 1991 PMI * P.O. Box 8402 * Green Bay Wi 53308 * All Rights Reserved * by Ed Ross *) FROM PosUtils IMPORT Equal; FROM PMIGlobals IMPORT Config,NormalTitle,OpenReportDevice,CloseReportDevice; FROM Customer IMPORT GetCustName,SetCustomerRec,GetCustAddr, AddressRec,AddressTypes; FROM DBFCustomer IMPORT OpenCustomerDBF,CloseCustomerDBF, CustomerRec,CustomerDBF,MoveCustomerFromDBF; FROM DBUtils IMPORT GetDateRange,PrintFrame,PrintTitle; FROM HandleIO IMPORT OpenFile,CloseHandle; FROM StringIO IMPORT WriteStr,WriteEol; FROM GenLists IMPORT GenList,ListInsert,DisposeList, GetElmt,GetElmtAdr,NewList,ListLength,SortList; FROM ListUtils IMPORT PrintList,TextFileToList; FROM Invoice IMPORT MakeInvoicePrintLine,GetOutstanding,InvoiceDaysLate; FROM DateFunctions IMPORT Comparison,CompareDates,Date,DateToStr, CardToDate,DaysSince1900; FROM StrConv IMPORT RealToStr,CardinalToStr; FROM StrEdit IMPORT CrunchBlanks,DeleteRightJustified,Append, CAPstr,OverWrite,RightJustify,Center,SetLength; FROM ModBase3 IMPORT ReadDBRec,CloseDBF,NumberRecords; FROM M2Strings IMPORT Concat,Length,CompareStr; FROM LowLevel IMPORT Fill; FROM NumTypes IMPORT Real8; FROM Numbers IMPORT Max; IMPORT VWindows; FROM ScrnUtl2 IMPORT CloseDisplayFrame; FROM ScrnUtl1 IMPORT GetFieldRec,PutFieldRec,FieldNum,FieldListTotal; FROM ScrnTypes IMPORT DisplayFrame,InitDisplayFrame,AFrameName, DispCode,ContinueInput,CancelInput,SubmitInput,InputFieldRecord; FROM FramePainter IMPORT ShowDisplayFrame,RedrawField; FROM ControlUtils IMPORT Control,AddStrField,AddMenuItem; FROM Prompts IMPORT Prompt,PromptStr,PromptYN; FROM ScrnTypes IMPORT AFrameName, InitDisplayFrame,DisplayFile; FROM SYSTEM IMPORT ADDRESS,ADR,SIZE; FROM VStorage IMPORT DosAlloc; VAR MinOut : Real8; PROCEDURE ReadCustFile(VAR TheList : GenList); VAR LI : LONGINT; Cust : CustomerRec; BEGIN OpenCustomerDBF(FALSE); NewList(TheList); FOR LI := 1 TO NumberRecords(CustomerDBF) DO ReadDBRec(CustomerDBF,LI); MoveCustomerFromDBF(Cust); IF Cust.YTDPURCH >= MinOut THEN ListInsert(Cust,1,TheList,1); END; END; END ReadCustFile; PROCEDURE SortByZipCode(C1 : ADDRESS; S1 : CARDINAL; C2 : ADDRESS; S2 : CARDINAL): INTEGER; VAR P1,P2 :POINTER TO CustomerRec; BEGIN P1 := C1; P2 := C2; RETURN CompareStr(P1^.BILLTOZP, P2^.BILLTOZP); END SortByZipCode; PROCEDURE SortByValue(C1 : ADDRESS; S1 : CARDINAL; C2 : ADDRESS; S2 : CARDINAL): INTEGER; VAR P1 : POINTER TO CustomerRec; P2 : POINTER TO CustomerRec; BEGIN P1 := C1; P2 := C2; IF P1^.YTDPURCH < P2^.YTDPURCH THEN RETURN -1; ELSIF P1^.YTDPURCH > P2^.YTDPURCH THEN RETURN 1; ELSE RETURN 0; END; END SortByValue; PROCEDURE CustMailLabels(); CONST FormFeed = 12C; VAR CustList : GenList; J,K : CARDINAL; Cust : CustomerRec; Code : CARDINAL; CustAddr : AddressRec; Handle : CARDINAL; BEGIN MinOut := 0.0; (* get everyone *) ReadCustFile(CustList); SortList(CustList,SortByZipCode); Handle := OpenReportDevice(); FOR J := 1 TO ListLength(CustList) DO GetElmt(CustList,J,Cust,Code); SetCustomerRec(Cust); GetCustAddr(CustAddr,Billing); FOR K := 0 TO 3 DO WriteEol(Handle,CustAddr.Line[K]); END; (* end for k *) WriteEol(Handle,''); WriteEol(Handle,''); END; CloseReportDevice(Handle); DisposeList(CustList); END CustMailLabels; PROCEDURE CustValue(); VAR CustList : GenList; J : CARDINAL; Cust : CustomerRec; Code : CARDINAL; CustAddr : AddressRec; Handle : CARDINAL; Str : ARRAY[0..10]OF CHAR; FieldRec : InputFieldRecord; DF : DisplayFrame; Line : ARRAY[0..80] OF CHAR; BEGIN MinOut := 1.0; (* get everyone that has purchased anything*) ReadCustFile(CustList); SortList(CustList,SortByValue); InitDisplayFrame(DF,VWindows.CurrentWindow); AddStrField(DF,2,2, ' Customer Name Sales Rep YTD Purchase',67); GetFieldRec(DF,1,FieldRec); FieldRec.typ := DispCode; (* headline = display code *) PutFieldRec(FieldRec,DF,1); DF^.headline := 2; FOR J := 1 TO ListLength(CustList) DO GetElmt(CustList,J,Cust,Code); Fill(ADR(Line),SIZE(Line),' '); Line[77] := 0C; OverWrite(Cust.NAME,Line,1); OverWrite(Cust.SALESREP,Line,45); RealToStr(Cust.YTDPURCH,2,8,Str); OverWrite(Str,Line,60); AddMenuItem(DF,2,J+2,Line,78,0,' '); END; DisposeList(CustList); ShowDisplayFrame(DF,1,1,80,24); Control(DF); IF PromptYN(' Print Report ',DF) THEN Line := 'Customer Sorted by YTD Purchases'; NormalTitle(Line); Handle := OpenReportDevice(); PrintFrame(DF,Handle); CloseReportDevice(Handle); END; CloseDisplayFrame(DF); DisposeList(CustList); END CustValue; PROCEDURE CustLateLetters(); VAR L10Pre, L10Suf, L30Pre, L30Suf, L60Pre, L60Suf : GenList; LI : LONGINT; DaysLate : CARDINAL; PrtStr : ARRAY[0..80] OF CHAR; InvList : GenList; J : CARDINAL; InvAddr : ADDRESS; Code,Size : CARDINAL; PtrHand : CARDINAL; EM : CARDINAL; Cust : CustomerRec; B : BOOLEAN; PROCEDURE PrintLetter(Prefix,Suffix ,Invoice : GenList); CONST (* FormLength : ARRAY OF CHAR = [027c,'C',66c]; *) FormFeed = 012C; VAR J : CARDINAL; Addr :AddressRec; Line : ARRAY [0..80] OF CHAR; FormLength : ARRAY[0..3] OF CHAR; BEGIN Concat(027C,'C',FormLength); Append(FormLength,66C); WriteStr( PtrHand,FormLength); Line := ''; NormalTitle(Line); FOR J := 0 TO 6 DO WriteEol(PtrHand,PrintTitle[J]); END; SetCustomerRec(Cust); GetCustAddr(Addr,Billing); FOR J := 0 TO 3 DO WriteEol(PtrHand,''); END; FOR J := 0 TO 3 DO WriteEol(PtrHand,Addr.Line[J]); WriteStr(PtrHand,' '); END; PrintList(PtrHand,Prefix,4,''); FOR J := 1 TO ListLength(InvList) DO GetElmtAdr(InvList,J,InvAddr,Code,Size); MakeInvoicePrintLine(InvAddr,Line); WriteEol(PtrHand,Line); END; PrintList(PtrHand,Suffix,4,''); WriteEol(PtrHand,FormFeed); END PrintLetter; BEGIN EM := OpenFile(PtrHand,Config.LabelPrt); NewList(L10Pre); NewList(L10Suf); NewList(L30Pre); NewList(L30Suf); NewList(L60Pre); NewList(L60Suf); PrtStr := 'l10pre.txt'; J := TextFileToList(PrtStr,L10Pre); PrtStr := 'l30pre.txt'; J := TextFileToList(PrtStr,L30Pre); PrtStr := 'l60pre.txt'; J := TextFileToList(PrtStr,L60Pre); PrtStr := 'l10Suf.txt'; J := TextFileToList(PrtStr,L10Suf); PrtStr := 'l30Suf.txt'; J := TextFileToList(PrtStr,L10Suf); PrtStr := 'l60Suf.txt'; J := TextFileToList(PrtStr,L10Suf); OpenCustomerDBF(FALSE); FOR LI := 1 TO NumberRecords(CustomerDBF) DO ReadDBRec(CustomerDBF,LI); MoveCustomerFromDBF(Cust); GetOutstanding(Cust.CIN,InvList); DaysLate := 0; FOR J := 1 TO ListLength(InvList) DO GetElmtAdr(InvList,J,InvAddr,Code,Size); DaysLate := Max(DaysLate,InvoiceDaysLate(InvAddr)); END; IF DaysLate >= 60 THEN PrintLetter(L60Pre,L60Suf,InvList); ELSIF DaysLate >= 30 THEN PrintLetter(L30Pre,L30Suf,InvList); ELSIF DaysLate >= 10 THEN PrintLetter(L10Pre,L10Suf,InvList); END; DisposeList(InvList); END; DisposeList(L10Pre); DisposeList(L30Pre); DisposeList(L60Pre); DisposeList(L10Suf); DisposeList(L30Suf); DisposeList(L60Suf); EM := CloseHandle(PtrHand); END CustLateLetters; END CustReports.