IMPLEMENTATION MODULE InvReports; (* * ModBase * Release 3.0 * (c) Copyright 1986 - 1991 PMI * P.O. Box 8402 * Green Bay Wi 53308 * All Rights Reserved * by Ed Ross *) FROM DBFInvoice IMPORT InvoiceRec,MoveInvoiceFromDBF, OpenInvoiceDBF,CloseInvoiceDBF,InvoiceDBF; FROM Invoice IMPORT MakeInvoicePrintLine,FInvoice; FROM PosUtils IMPORT Equal; FROM PMIGlobals IMPORT Today,TodayDays,NormalTitle,PMIScreens, OpenReportDevice,CloseReportDevice; FROM Customer IMPORT GetCustName; FROM DBFCustomer IMPORT OpenCustomerDBF,CloseCustomerDBF; FROM DBUtils IMPORT GetDateRange,PrintFrame; FROM GenLists IMPORT GenList,ListInsert,DisposeList, GetElmt,GetElmtAdr,NewList,ListLength,SortList; 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 Length,CompareStr,Assign; FROM LowLevel IMPORT Fill; FROM NumTypes IMPORT Real8; 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; TYPE InvCust = RECORD Invoice : InvoiceRec; CustName : ARRAY[0..40] OF CHAR; END; VAR IncludeSet : SET OF CHAR; StartDate, EndDate : Date; PROCEDURE MakeInvoiceList(VAR InvList : GenList); VAR LI : LONGINT; InvRec : InvCust; D : CARDINAL; BEGIN D := DaysSince1900(StartDate); (* adjust to days so I get =>, <=*) CardToDate(D,StartDate); D := DaysSince1900(EndDate); INC(D); CardToDate(D,EndDate); NewList(InvList); OpenInvoiceDBF(FALSE); (* Dont need the index *) OpenCustomerDBF(TRUE); FOR LI := 1 TO NumberRecords(InvoiceDBF) DO ReadDBRec(InvoiceDBF,LI); MoveInvoiceFromDBF(InvRec.Invoice); CrunchBlanks(InvRec.Invoice.INVOICE); IF (InvRec.Invoice.INVPRNT IN IncludeSet) AND (CompareDates(InvRec.Invoice.INVDATE,StartDate) = DateGreater) AND (CompareDates(InvRec.Invoice.INVDATE,EndDate) = DateLess) THEN GetCustName(InvRec.Invoice.CUSTID,InvRec.CustName); ListInsert(InvRec,3,InvList,30000); END; END; CloseDBF(InvoiceDBF); CloseCustomerDBF(); END MakeInvoiceList; PROCEDURE SortByCustName(Item1 : ADDRESS; Size1 : CARDINAL; Item2 : ADDRESS; Size2 : CARDINAL): INTEGER; (* sort by name here becase want an alpha sort rather than CIN sort*) VAR P1, P2 : POINTER TO InvCust; BEGIN P1 := Item1; P2 := Item2; IF NOT Equal(P1^.CustName,P2^.CustName) THEN RETURN CompareStr(P1^.CustName,P2^.CustName); ELSE RETURN CompareStr(P1^.Invoice.INVOICE,P2^.Invoice.INVOICE); END; END SortByCustName; PROCEDURE SortByInvoiceNbr(Item1 : ADDRESS; Size1 : CARDINAL; Item2 : ADDRESS; Size2 : CARDINAL): INTEGER; (* sort by name here becase want an alpha sort rather than CIN sort*) VAR P1, P2 : POINTER TO InvCust; BEGIN P1 := Item1; P2 := Item2; RETURN CompareStr(P1^.Invoice.INVOICE,P2^.Invoice.INVOICE); END SortByInvoiceNbr; PROCEDURE InvHistory(); VAR J : CARDINAL; InvTotal : Real8; InvRec : InvCust; InvList : GenList; Code : CARDINAL; FieldRec : InputFieldRecord; DF : DisplayFrame; DF2 : DisplayFrame; B : BOOLEAN; Str : ARRAY[0..12] OF CHAR; Line : ARRAY[0..80] OF CHAR; NbrO,NbrP,NbrC : CARDINAL; InvTotP,InvTotO,InvTotC : Real8; InvNetP,InvNetO,InvNetC : Real8; Handle : CARDINAL; PROCEDURE DisplayTotals(); BEGIN ShowDisplayFrame(DF,1,1,80,24); DF2^.startcol := 5; DF2^.endcol := 75; DF2^.startrow := 5; DF2^.endrow := 20; AddStrField(DF,2,2, ' Num Net Total',50); Fill(ADR(Line),SIZE(Line),' '); OverWrite(' Outstanding ',Line,3); CardinalToStr(NbrO,3,Str); OverWrite(Str,Line,13); RealToStr(InvNetO,2,8,Str); OverWrite(Str,Line,22); RealToStr(InvTotO,2,8,Str); OverWrite(Str,Line,34); AddStrField(DF2,2,4,Line,50); Fill(ADR(Line),SIZE(Line),' '); OverWrite(' Posted ',Line,3); CardinalToStr(NbrP,3,Str); OverWrite(Str,Line,13); RealToStr(InvNetP,2,8,Str); OverWrite(Str,Line,22); RealToStr(InvTotP,2,8,Str); OverWrite(Str,Line,32); AddStrField(DF2,2,5,Line,50); Fill(ADR(Line),SIZE(Line),' '); OverWrite(' Closed ',Line,3); CardinalToStr(NbrC,3,Str); OverWrite(Str,Line,13); RealToStr(InvNetC,2,8,Str); OverWrite(Str,Line,22); RealToStr(InvTotC,2,8,Str); OverWrite(Str,Line,32); AddStrField(DF2,2,6,Line,50); ShowDisplayFrame(DF2,0,0,0,0); Control(DF2); END DisplayTotals; BEGIN GetDateRange(StartDate,EndDate,PMIScreens); IncludeSet := IncludeSet / IncludeSet; (* clear the set *) INCL(IncludeSet,'P'); INCL(IncludeSet,'O'); INCL(IncludeSet,'C'); MakeInvoiceList(InvList); NbrO := 0; NbrP := 0; NbrC := 0; InvTotP := 0.0; InvTotO := 0.0; InvTotC := 0.0; InvNetO := 0.0; InvNetP := 0.0; InvNetC := 0.0; InitDisplayFrame(DF,VWindows.CurrentWindow); InitDisplayFrame(DF2,VWindows.CurrentWindow); AddStrField(DF,2,2, 'Inv Nbr Customer Name Date Inv Total OutStd Stat',79); GetFieldRec(DF,1,FieldRec); FieldRec.typ := DispCode; (* headline = display code *) PutFieldRec(FieldRec,DF,1); DF^.headline := 2; FOR J := 1 TO ListLength(InvList) DO GetElmt(InvList,J,InvRec,Code); Fill(ADR(Line),80,' '); Line[77] := 0C; CASE InvRec.Invoice.INVPRNT OF 'O' :INC(NbrO); InvTotO := InvTotO + InvRec.Invoice.TOTALAMT; InvNetO := InvNetO + InvRec.Invoice.INVNET; |'P' :INC(NbrP); InvTotP := InvTotP + InvRec.Invoice.TOTALAMT; InvNetP := InvNetP + InvRec.Invoice.INVNET; |'C' :INC(NbrC); InvTotC := InvTotC + InvRec.Invoice.TOTALAMT; InvNetC := InvNetC + InvRec.Invoice.INVNET; END; OverWrite(InvRec.Invoice.INVOICE,Line,1); SetLength(InvRec.CustName,25); OverWrite(InvRec.CustName,Line,11); DateToStr(InvRec.Invoice.INVDATE,Str,B); OverWrite(Str,Line,40); RealToStr(InvRec.Invoice.TOTALAMT,2,9,Str); OverWrite(Str,Line,49); RealToStr(InvRec.Invoice.AMTOUT,2,9,Str); OverWrite(Str,Line,58); OverWrite(InvRec.Invoice.INVPRNT,Line,75); AddMenuItem(DF,2,J+2,Line,78,0,' '); END; DisposeList(InvList); (* DisplayTotals(); *) Control(DF); DisplayTotals(); IF PromptYN(' Print Report ',DF) THEN Line := 'INVOICE HISTORY'; NormalTitle(Line); Handle := OpenReportDevice (); PrintFrame(DF,Handle); Line := 'Invoice Totals '; NormalTitle(Line); PrintFrame(DF2,Handle); CloseReportDevice(Handle); END; CloseDisplayFrame(DF); CloseDisplayFrame(DF2); END InvHistory; PROCEDURE InvOutstanding(); VAR J : CARDINAL; InvTotal : Real8; InvRec : InvCust; InvList : GenList; Code : CARDINAL; FieldRec : InputFieldRecord; DF : DisplayFrame; B : BOOLEAN; Str : ARRAY[0..12] OF CHAR; Line : ARRAY[0..80] OF CHAR; LastCust : ARRAY[0..40] OF CHAR; CustTotal: Real8; TotalOut : Real8; LineCnt : CARDINAL; Handle : CARDINAL; PROCEDURE MakeLine(); BEGIN OverWrite(InvRec.Invoice.INVOICE,Line,30); DateToStr(InvRec.Invoice.INVDATE,Str,B); OverWrite(Str,Line,40); RealToStr(InvRec.Invoice.TOTALAMT,2,9,Str); OverWrite(Str,Line,49); RealToStr(InvRec.Invoice.AMTOUT,2,9,Str); OverWrite(Str,Line,58); OverWrite(InvRec.Invoice.INVPRNT,Line,75); END MakeLine; BEGIN GetDateRange(StartDate,EndDate,PMIScreens); IncludeSet := IncludeSet / IncludeSet; (* clear the set *) INCL(IncludeSet,'P'); MakeInvoiceList(InvList); SortList(InvList,SortByCustName); InitDisplayFrame(DF,VWindows.CurrentWindow); AddStrField(DF,2,2, ' Customer Name Invoice Date Inv Total OutStd Stat',79); GetFieldRec(DF,1,FieldRec); FieldRec.typ := DispCode; (* headline = display code *) PutFieldRec(FieldRec,DF,1); DF^.headline := 2; LastCust := ''; CustTotal := 0.0; TotalOut := 0.0; LineCnt := 2; FOR J := 1 TO ListLength(InvList) DO INC(LineCnt); GetElmt(InvList,J,InvRec,Code); SetLength(InvRec.CustName,25); Fill(ADR(Line),80,' '); Line[78] := 0C; IF LastCust[0] = 0C (* first time *) THEN Assign( InvRec.CustName,LastCust ); OverWrite(InvRec.CustName,Line,1); END; TotalOut := TotalOut + InvRec.Invoice.AMTOUT; IF Equal(LastCust,InvRec.CustName) THEN CustTotal := CustTotal + InvRec.Invoice.AMTOUT; MakeLine(); AddMenuItem(DF,2,LineCnt,Line,78,0,' '); ELSE OverWrite('===========',Line,58); AddMenuItem(DF,2,LineCnt,Line,78,0,' '); Fill(ADR(Line),80,' '); Line[78] := 0C; RealToStr(CustTotal,2,9,Str); OverWrite(Str,Line,58); AddMenuItem(DF,2,LineCnt+1,Line,78,0,' '); Fill(ADR(Line),80,' '); Line[78] := 0C; AddMenuItem(DF,2,LineCnt+2,Line,78,0,' '); (* add blank line *) Assign( InvRec.CustName,LastCust); SetLength(InvRec.CustName,25); OverWrite(InvRec.CustName,Line,1); CustTotal := InvRec.Invoice.AMTOUT; MakeLine(); AddMenuItem(DF,2,LineCnt+3,Line,78,0,' '); INC(LineCnt,3); END; END; Fill(ADR(Line),80,' '); Line[78] := 0C; OverWrite('===========',Line,58); AddMenuItem(DF,2,LineCnt+1,Line,78,0,' '); Fill(ADR(Line),80,' '); Line[78] := 0C; RealToStr(CustTotal,2,9,Str); OverWrite(Str,Line,58); AddMenuItem(DF,2,LineCnt+2,Line,78,0,' '); OverWrite('===========',Line,58); AddMenuItem(DF,2,LineCnt+3,Line,78,0,' '); Fill(ADR(Line),80,' '); Line[78] := 0C; OverWrite(' Total outstanding ',Line,2); RealToStr(TotalOut,2,9,Str); OverWrite(Str,Line,58); AddMenuItem(DF,2,LineCnt+4,Line,78,0,' '); DisposeList(InvList); ShowDisplayFrame(DF,1,1,80,24); Control(DF); IF PromptYN(' Print Report ',DF) THEN Line := 'INVOICE HISTORY'; NormalTitle(Line); Handle := OpenReportDevice(); PrintFrame(DF,Handle); CloseReportDevice(Handle); END; CloseDisplayFrame(DF); END InvOutstanding; PROCEDURE InvOutByDate(); VAR J : CARDINAL; InvTotal : Real8; InvRec : InvCust; InvList : GenList; Code : CARDINAL; FieldRec : InputFieldRecord; DF : DisplayFrame; B : BOOLEAN; Str : ARRAY[0..12] OF CHAR; Line : ARRAY[0..80] OF CHAR; Days : CARDINAL; Handle : CARDINAL; BEGIN GetDateRange(StartDate,EndDate,PMIScreens); IncludeSet := IncludeSet / IncludeSet; (* clear the set *) INCL(IncludeSet,'P'); MakeInvoiceList(InvList); SortList(InvList,SortByInvoiceNbr); InitDisplayFrame(DF,VWindows.CurrentWindow); AddStrField(DF,2,2, 'Inv Nbr Customer Name Date Inv Total OutStd Late',79); GetFieldRec(DF,1,FieldRec); FieldRec.typ := DispCode; (* headline = display code *) PutFieldRec(FieldRec,DF,1); DF^.headline := 2; FOR J := 1 TO ListLength(InvList) DO GetElmt(InvList,J,InvRec,Code); Fill(ADR(Line),80,' '); Line[77] := 0C; OverWrite(InvRec.Invoice.INVOICE,Line,1); SetLength(InvRec.CustName,25); OverWrite(InvRec.CustName,Line,11); DateToStr(InvRec.Invoice.INVDATE,Str,B); OverWrite(Str,Line,40); RealToStr(InvRec.Invoice.TOTALAMT,2,9,Str); OverWrite(Str,Line,49); RealToStr(InvRec.Invoice.AMTOUT,2,9,Str); OverWrite(Str,Line,58); CardinalToStr(TodayDays -DaysSince1900(InvRec.Invoice.INVDATE),3,Str); OverWrite(Str,Line,72); AddMenuItem(DF,2,J+2,Line,78,0,' '); END; DisposeList(InvList); ShowDisplayFrame(DF,1,1,80,24); Control(DF); IF PromptYN(' Print Report ',DF) THEN Line := 'INVOICE HISTORY'; NormalTitle(Line); Handle := OpenReportDevice(); PrintFrame(DF,Handle); CloseReportDevice(Handle); END; CloseDisplayFrame(DF); END InvOutByDate; END InvReports.