                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   VERSION =   3.00      dataenvironment      dataenvironment      Dataenvironment      JLeft = 1
Top = 220
Width = 520
Height = 200
Name = "Dataenvironment"
      1      1      t_form      ..\libs\t_base.vcx      form      frmInvoicing     -Height = 329
Width = 375
DoCreate = .T.
AutoCenter = .T.
Caption = "Invoicing"
ccompanytoinvoice = 
dinvoicemonth = {}
ninvoicemonth = 1
dinvoicemonthplus2 = {}
lfirstinvoice = .T.
dinvoicedate = {}
dinvoicedateplus2 = {}
lcheckforproductupdates = .T.
cinvcode = 
Name = "frmInvoicing"
     jPROCEDURE formatinvoicedate
LOCAL temp1, temp2

* Change starting invoice date to first of the selected month in the YYYYMMDD format
temp1  = ALLTRIM(STR(YEAR(DATE()))) + ',' + ALLTRIM(STR(thisform.nInvoiceMonth)) + ',01'

* Change invoice dates to correct Y2K format and add 2 months
thisform.dInvoiceDate = DATE(&Temp1)
thisform.dInvoiceDatePlus2 = GOMONTH(DATE(&temp1), + 2)

* get the first 3 letters of the billing months.  1 = JAN, 2 = FEB
thisform.cInvoicemonth = LEFT(CMONTH(thisform.dInvoiceDate), 3)
thisform.cInvoiceMonthPlus2 = LEFT(CMONTH(thisform.dInvoiceDatePlus2), 3)

* Change date formats to MM/YY format
thisform.dInvoiceMonth   = thisform.mth_yr_format(thisform.dInvoiceDate)
thisform.dInvoiceMonthPlus2 = thisform.mth_yr_format(thisform.dInvoiceDatePlus2)

* get current system date and change to MM/YY format
thisform.cCurrentSystemDate = thisform.mth_yr_format(DATE())

* format string for date comparison when selecting invoice line items
thisform.sInvoiceMonth   = "InvoicableSales.sa_b" + thisform.cInvoicemonth
thisform.sInvoiceMonthPlus2 = "InvoicableSales.sa_b" + thisform.cInvoiceMonthPlus2
ENDPROC
PROCEDURE doinvoicing
IF ThisForm.chkCheckForProductUpdates.value
	DO PR_DOCHG.PRG
ENDIF
thisform.FormatInvoiceDate
thisform.GetInvoicableSalesRecords
IF thisform.lContinue
	thisform.OpenDatabases
	thisform.GetInvoiceLineItems
	IF thisform.lContinue
		thisform.GetInvoiceHeaderInfo
		thisform.GetRemittoInfo
		thisform.GetServiceCharges
		thisform.GetTotalExtended
		thisform.GetTaxTotals
		thisform.GetTotalInvoiceAmount
		thisform.CloseDatabases
	ELSE
		MESSAGEBOX("Of the potential invoiceable records, none were eligible.",64,"Invoicing")
	ENDIF
ELSE
	MESSAGEBOX("No records were found to Invoice.",64,"Invoicing")
ENDIF

THISFORM.RELEASE()
ENDPROC
PROCEDURE mth_yr_format
PARAMETER tempdate

PRIVATE tmonth, tyear, rvalue

tmonth = MONTH(tempdate)
tyear  = YEAR(tempdate)

rvalue = ALLTRIM(STR(tmonth)) + '/' + ALLTRIM(STR(tyear))

RETURN(rvalue)

ENDPROC
PROCEDURE getinvoicablesalesrecords
* Get Sales records for appropriate months
PRIVATE SQLMonth, SQLMonth_2, cCompany, nPosition, cCompanyCode
set dele on

SQLcurmth   = "sales.sa_b" + thisform.cInvoiceMonth
SQLcurmth_2 = "sales.sa_b" + thisform.cInvoiceMonthPlus2

* This is used to convert the company name to the company code
nPosition = ASCAN(thisform.aCompanyCode, ThisForm.cboCompanyCode.value) && Search for company
IF nPosition != 0
	nPosition = nPosition + 2
   *** Company found, get company code ***
   cCompanyCode = thisform.aCompanyCode[nPosition]
ENDIF

* Select appropriate sales records
	SELECT *;
	 FROM trackerdb!sales;
	 WHERE Sales.sa_status = 'A';
	   AND Sales.sa_company = cCompanyCode;
	   AND (&SQLcurmth = .T. OR &SQLcurmth_2 = .T.);
	   AND inlist(LEFT(Sales.sa_pr_id, 1),'A','S') ;
	 INTO TABLE tmp\InvoicableSales.dbf

* If the there are no records found then we should stop	 
 	IF RECCOUNT() > 0
		thisform.lContinue = .T.
		INDEX ON sa_cu_id TAG sa_cu_id
	ELSE
		thisform.lContinue = .F.
	ENDIF

	USE
	
	SELECT sales
	USE

ENDPROC
PROCEDURE opendatabases
OPEN DATABASE trackerdb

IF USED("InvoicableSales.dbf")
	SELECT InvoicableSales.dbf
	SET ORDER TO sa_cu_id
ELSE
	SELECT 0
	USE (LOCFILE("tmp\InvoicableSales.dbf","DBF","Where is InvoicableSales ?"));
		AGAIN ALIAS InvoicableSales
	SET ORDER TO sa_cu_id
ENDIF

IF USED("products")
	SELECT products
	SET ORDER TO TAG prodnum
ELSE
	SELECT 0
	USE (LOCFILE("products.dbf","DBF","Where is products ?"));
		AGAIN ALIAS PRODUCTS
	SET ORDER TO TAG prodnum
ENDIF

IF USED("customer")
	SELECT customer
	SET ORDER TO TAG cu_id
ELSE
	SELECT 0
	USE (LOCFILE("customer.dbf","DBF","Where is customer ?"));
		AGAIN ALIAS customer
	SET ORDER TO TAG cu_id
ENDIF

IF USED("convert")
	SELECT CONVERT
	SET ORDER TO TAG co_code
ELSE
	SELECT 0
	USE (LOCFILE("convert.dbf","DBF","Where is convert ?"));
		AGAIN ALIAS CONVERT
	SET ORDER TO TAG co_code
ENDIF

IF USED("remitto")
	SELECT remitto
	SET ORDER TO TAG re_id
ELSE
	SELECT 0
	USE (LOCFILE("remitto.dbf","DBF","Where is remitto ?"));
		AGAIN ALIAS remitto
	SET ORDER TO TAG re_id
ENDIF

SELECT InvoicableSales
SET RELATION TO InvoicableSales.sa_pr_id INTO PRODUCTS ADDITIVE
SET RELATION TO InvoicableSales.sa_cu_id INTO CUSTOMER ADDITIVE
SELECT customer
SET RELATION TO customer.cu_convrat INTO CONVERT ADDITIVE
SET RELATION TO customer.cu_remitto INTO remitto ADDITIVE

*!* Changes made 04/07/2005
*!*
*!* Check to see if inv_data and inv_head are open,
*!* if so, close them.
If Used("inv_data")
	Use In inv_data
EndIf

IF USED("inv_head")
	Use In inv_head
EndIf

*!* Open inv_data exclusive in order to delete and pack table
*!* Then reopen inv_data in shared mode.
Select 0
Use (LocFile("inv_data.dbf","DBF","Where is inv_data ?")) Exclusive ;
	AGAIN ALIAS inv_data
Wait Window "Deleting and Packing inv_data file" Nowait
Delete All
Pack
Wait Clear
Use In inv_data
Select 0
Use (LocFile("inv_data.dbf","DBF","Where is inv_data ?")) Share ;
	AGAIN ALIAS inv_data

*!* Open inv_head exclusive in order to delete and pack table
*!* Then reopen inv_head in shared mode.
Select 0
Use (LocFile("inv_head.dbf","DBF","Where is inv_data ?")) Exclusive ;
	AGAIN ALIAS inv_head
Wait Window "Deleting and Packing inv_head file" Nowait
Delete All
Pack
Wait Clear
Use In inv_head
Select 0
Use (LocFile("inv_head.dbf","DBF","Where is inv_data ?")) Share ;
	AGAIN ALIAS inv_head
*!*
*!* End of changes made 04/07/2005

*!*********************************************************************************************
*!* Old code replace on 04/07/2005
*!*
*!*	IF USED("inv_data")
*!*		SELECT inv_data
*!*	ELSE
*!*		SELECT 0
*!*		USE (LOCFILE("inv_data.dbf","DBF","Where is inv_data ?")) EXCLUSIVE ;
*!*			AGAIN ALIAS inv_data
*!*	ENDIF
*!*	WAIT WINDOW "Deleting and Packing inv_data file" NOWAIT
*!*	DELETE ALL
*!*	PACK
*!*	WAIT CLEAR

*!*	IF USED("inv_head")
*!*		SELECT inv_head
*!*	ELSE
*!*		SELECT 0
*!*		USE (LOCFILE("inv_head.dbf","DBF","Where is inv_head ?")) EXCLUSIVE ;
*!*			AGAIN ALIAS inv_head
*!*	ENDIF
*!*	WAIT WINDOW "Deleting and Packing inv_head file" NOWAIT
*!*	DELETE ALL
*!*	PACK
*!*	WAIT CLEAR
*!*
*!* End of old code

SET CONSOLE OFF
ENDPROC
PROCEDURE getinvoicelineitems
PRIVATE nRecordsRead, nInvoiceCount, cPrev_cu_id
nRecordsRead = 0
nInvoiceCount = 0
cPrev_cu_id = ''


* For progress thermometer
#DEFINE c_thermtitle 'Invoice Extract'
#DEFINE c_thermmssg 'Processing Sales file'
_elibarcon = -1
_runmancon = 3
_iconpostion = 5


	SELECT InvoicableSales
	GOTO TOP
	DO therm WITH RECCOUNT(), nRecordsRead, 'Invoicing', 'Processing Sales file', ''

	DO WHILE NOT EOF("InvoicableSales") AND LASTKEY() <> 27

		***< SelectInvoiceLineItem() figures out if it should be billed
		invwhatmth = thisform.SelectInvoiceLineItem()

		IF NOT EMPTY(invwhatmth)
			SELECT inv_data
				SCATTER MEMVAR BLANK
			
			* If it's a new customer, get a new invoice number
			IF cPrev_cu_id <> InvoicableSales.sa_cu_id
				thisform.GetInvoiceNumber
				cPrev_cu_id = InvoicableSales.sa_cu_id
			ELSE
				thisform.cDetailInvoiceNumber = thisform.cPreviousInvoiceNumber
			ENDIF
			
			thisform.GetSubscriptionPeriod(invwhatmth)
			thisform.PrintInvoiceLineItem()

			SELECT inv_data
			APPEND BLANK
			m.d_invnum = thisform.cDetailInvoiceNumber
			GATHER MEMVAR

			thisform.cPreviousInvoiceNumber = thisform.cDetailInvoiceNumber
			SELECT InvoicableSales
			nInvoiceCount = nInvoiceCount + 1
		ENDIF

		SKIP 1 IN InvoicableSales
		nRecordsRead = nRecordsRead + 1
		DO therm WITH RECCOUNT(), nRecordsRead, 'Invoicing', 'Processing Sales file', ''
	ENDDO

	DO therm WITH RECCOUNT(), nRecordsRead, 'Invoicing', 'Processing Sales file', ''
	
	SELECT InvoicableSales
	USE
	SELECT Products
	USE
	
	IF RECCOUNT("inv_data") > 0
		thisform.lContinue = .T.
	ELSE
		thisform.lContinue = .F.
	ENDIF
	
RETURN


ENDPROC
PROCEDURE getinvoiceheaderinfo
PRIVATE recs_read
recs_read = 0
_elibarcon = -1
_runmancon = 3
_iconpostion = 5

set exact on

* 	Get a list of distinct customer IDs from the invoice data file and put them in
* 	a temporary database
	SELECT Inv_data
	GOTO TOP
	SELECT DISTINCT Inv_data.d_cuid, Inv_data.d_invnum;
 		FROM Inv_data;
 		INTO TABLE tmp\tmp_cust.dbf

* 	Use the list of distinct customer IDs and look them up in the customer file.
* 	Copy the information need to create an invoice from the customer file to the
* 	invoice header file.
	SELECT Customer
		SET ORDER TO TAG Customer_I
	SELECT tmp_cust
		GOTO TOP

	DO therm WITH RECCOUNT('tmp_cust'), recs_read, 'Invoicing', 'Matching sales and customer information', ''

	DO WHILE NOT EOF('tmp_cust')
		SELECT inv_head
			SCATTER MEMVAR BLANK
		SELECT customer
		SEEK tmp_cust.d_cuid
		
		IF FOUND()
*			MESSAGEBOX(tmp_cust.d_cuid + " Customer detail data found", 48 ,"Error")
			m.h_bname 		= customer.cu_bname
			m.h_sname 		= customer.cu_sname
			m.h_baddr1 		= customer.cu_baddr1
			m.h_saddr1 		= customer.cu_saddr1
			m.h_baddr2 		= customer.cu_baddr2
			m.h_saddr2 		= customer.cu_saddr2
			m.h_baddr3 		= customer.cu_baddr3
			m.h_saddr3 		= customer.cu_saddr3
			m.h_bcity 		= customer.cu_bcity
			m.h_scity 		= customer.cu_scity
			m.h_bstate 		= customer.cu_bstate
			m.h_sstate	 	= customer.cu_sstate
			m.h_bcounty 	= customer.cu_bcounty
			m.h_scounty 	= customer.cu_scounty
			m.h_bzip 		= customer.cu_bzip
			m.h_szip 		= customer.cu_szip
			m.h_cu_id 		= customer.customer_id
			m.h_linvdt		= DATE()
			m.h_acctno 		= customer.cu_acctno
			m.h_region  	= customer.cu_region
			m.h_market      = customer.cu_market
			m.h_convrat 	= thisform.GetConversionRate()
			m.h_convcty		= customer.cu_convrat
			m.h_taxrate 	= customer.cu_taxrate
			m.h_shipchg 	= customer.cu_shipchg
			m.h_remitto		= customer.cu_remitto
			m.h_invcode		= thisform.cInvCode
			m.h_invnum		= tmp_cust.d_invnum

			IF NOT EMPTY(customer.cu_remitto)
				m.h_rname		= remitto.re_name
				m.h_raddr1 		= remitto.re_addr1
				m.h_raddr2 		= remitto.re_addr2
				m.h_raddr3 		= remitto.re_addr3
				m.h_rcity		= remitto.re_city
				m.h_rstate 		= remitto.re_state
				m.h_rcounty		= remitto.re_country
				m.h_rzip		= remitto.re_zip
			ENDIF

			SELECT inv_head
			APPEND BLANK
			GATHER MEMVAR
		ELSE
			MESSAGEBOX(tmp_cust.d_cuid + " Customer detail data not found", 48 ,"Error")
		ENDIF
		
		SKIP 1 IN tmp_cust
		recs_read = recs_read + 1
		
		DO therm WITH RECCOUNT('tmp_cust'), recs_read, c_thermtitle, 'Matching sales and customer information', ''
	ENDDO

	DO therm WITH RECCOUNT('tmp_cust'), recs_read, c_thermtitle, 'Matching sales and customer information', ''

ENDPROC
PROCEDURE getservicecharges
	WAIT WINDOW "Getting Service Charges" NOWAIT
	SELECT DISTINCT Inv_data.d_cuid, Inv_data.d_invnum, Inv_data.d_invfee ;
 		FROM Inv_data;
		WHERE Inv_data.d_invfee > 0;
 		INTO TABLE tmp\tmp_serv.dbf
	
	IF RECCOUNT('tmp_serv') > 0
 		
		INDEX ON d_invnum TAG D_invnum ADDITIVE
	
		SELECT inv_head
		SET ORDER TO TAG D_invnum OF tmp\tmp_serv.cdx IN Tmp_serv
		SET RELATION TO Inv_head.h_invnum INTO Tmp_serv ADDITIVE

		REPLACE ALL inv_head.h_serchg WITH Tmp_serv.d_invfee ;
			FOR Inv_head.h_invnum =  Tmp_serv.d_invnum
	ENDIF
	WAIT CLEAR
	

ENDPROC
PROCEDURE getinvoicecodes
	WAIT WINDOW "Getting Invoice Codes" NOWAIT
	SELECT DISTINCT Inv_data.d_cuid, Inv_data.d_invnum, Inv_data.d_invcode, Inv_data.d_linvdt;
 		FROM Inv_data;
 		INTO TABLE tmp\tmp_code.dbf
	
	IF RECCOUNT('tmp_code') > 0
 		
		INDEX ON d_invnum TAG D_invnum ADDITIVE
	
		SELECT inv_head
		SET ORDER TO TAG D_invnum OF tmp\tmp_code.cdx IN Tmp_Code
		SET RELATION TO Inv_head.h_invnum INTO Tmp_code ADDITIVE

		REPLACE ALL inv_head.h_Invcode WITH Tmp_code.d_Invcode ;
			FOR Inv_head.h_invnum =  Tmp_code.d_invnum
			
		REPLACE ALL inv_head.h_linvdt WITH Tmp_code.d_linvdt ;
			FOR Inv_head.h_invnum =  Tmp_code.d_invnum
			
	ENDIF
	WAIT CLEAR
	
RETURN
ENDPROC
PROCEDURE countbillingperiods
	PRIVATE period_cnt

	period_cnt = 0

	IF InvoicableSales.sa_bjan = .T.
		period_cnt = period_cnt + 1
	ENDIF
	IF InvoicableSales.sa_bfeb = .T.
		period_cnt = period_cnt + 1
	ENDIF
	IF InvoicableSales.sa_bmar = .T.
		period_cnt = period_cnt + 1
	ENDIF
	IF InvoicableSales.sa_bapr = .T.
		period_cnt = period_cnt + 1
	ENDIF
	IF InvoicableSales.sa_bmay = .T.
		period_cnt = period_cnt + 1
	ENDIF
	IF InvoicableSales.sa_bjun = .T.
		period_cnt = period_cnt + 1
	ENDIF
	IF InvoicableSales.sa_bjul = .T.
		period_cnt = period_cnt + 1
	ENDIF
	IF InvoicableSales.sa_baug = .T.
		period_cnt = period_cnt + 1
	ENDIF
	IF InvoicableSales.sa_bsep = .T.
		period_cnt = period_cnt + 1
	ENDIF
	IF InvoicableSales.sa_boct = .T.
		period_cnt = period_cnt + 1
	ENDIF
	IF InvoicableSales.sa_bnov = .T.
		period_cnt = period_cnt + 1
	ENDIF
	IF InvoicableSales.sa_bdec = .T.
		period_cnt = period_cnt + 1
	ENDIF
	RETURN(period_cnt)


ENDPROC
PROCEDURE getinvoicenumber
	PRIVATE v_invpre, v_invnum
	IF EMPTY(thisform.cCurrentInvoiceNumber)
		DEFINE WINDOW invnum ;
			AT  0.000, 0.000  ;
			SIZE 3.538,48.200 ;
			FONT "MS Sans Serif", 8 ;
			NOFLOAT ;
			NOCLOSE ;
			NOMINIMIZE ;
			NONE ;
			COLOR RGB(,,,255,0,0)
		MOVE WINDOW invnum CENTER

		ACTIVATE WINDOW invnum

		@ 1.154,2.500 SAY "Invoice Number:" ;
			FONT "MS Sans Serif", 10 ;
			STYLE "BT"
		@ 1.154,26.700 GET v_invname ;
			SIZE 1.000,10.500 ;
			DEFAULT " " ;
			VALID NOT EMPTY(v_invname) AND LEN(ALLTRIM(v_invname)) = 9 ;
			ERROR "Invoice Number Cannot Contain Blanks" ;
			FONT "MS Sans Serif", 10 ;
			STYLE "B" ;
			PICTURE "@K! A99AA9999" ;
			MESSAGE 'Enter starting invoice number.'
		@ 0.308,1.000 TO 3.231,47.000 ;
			PEN 2, 8
		@ 3.077,1.200 TO 3.077,46.800 ;
			PEN 2, 8 ;
			STYLE "1" ;
			COLOR RGB(255,255,255,255,255,255)
		@ 0.385,46.600 TO 3.231,46.600 ;
			PEN 2, 8 ;
			COLOR RGB(255,255,255,255,255,255)

		READ MODAL

		CLEAR READ
		v_invpre = LEFT(v_invname, 5)
		v_invnum = VAL(SUBSTR(v_invname, 6, 4))
		v_invnum = TRANSFORM(v_invnum,"@L ####")
		thisform.cCurrentInvoiceNumber = v_invpre + v_invnum
		prev_cu_id = InvoicableSales.sa_cu_id
	ELSE
		thisform.lFirstInvoice = .F.
		v_invpre = LEFT(thisform.cCurrentInvoiceNumber, 5)
		v_invnum = VAL(SUBSTR(thisform.cCurrentInvoiceNumber, 6, 4)) + 1
		v_invnum = TRANSFORM(v_invnum,"@L ####")
		thisform.cCurrentInvoiceNumber = v_invpre + v_invnum
	ENDIF

	thisform.cCurrentInvoiceNumber = v_invpre + v_invnum
	thisform.cHeaderInvoiceNumber = thisform.cCurrentInvoiceNumber
	thisform.cDetailInvoiceNumber = thisform.cCurrentInvoiceNumber
	IF thisform.lFirstInvoice
		thisform.cPreviousInvoiceNumber = thisform.cCurrentInvoiceNumber
	ENDIF

	DEACTIVATE WINDOW invnum

	RETURN

ENDPROC
PROCEDURE selectinvoicelineitem
	PRIVATE rvalue, sInvoiceMonth, sInvoiceMonthPlus2, BillPdCt, BillPdLen
	
	rvalue = ""
	sInvoiceMonth = thisform.sInvoiceMonth	&& "InvoicableSales.sa_b" + thisform.cInvoicemonth = "InvoicableSales.sa_bJune"
	sInvoiceMonthPlus2 = thisform.sInvoiceMonthPlus2 && Same as above but add 2 months to it
	lastinvdt = thisform.mth_yr_format(InvoicableSales.sa_linvdt)
	
	BillPdCt = thisform.CountBillingPeriods()
		
	***< Use the number of billing periods to figure out how often it should be billed
	do case
	case BillPdCt = 1
		BillPdLen = 360

	case BillPdCt = 2
		BillPdLen = 180

	case BillPdCt = 4
		BillPdLen = 90

	case BillPdCt = 12
		BillPdLen = 28

	otherwise
		BillPdLen = 0
	endcase

	do case

		***< Never been billed before and it's marked to be billed
		case &sInvoiceMonth and empty(sa_finvdt)
			rvalue = thisform.dInvoiceDate
		

		***< Annual billing, it's time for the 2nd billing, 10 months out from the first billing
		case &sInvoiceMonth and LEFT(sa_pr_id, 1) = "A" and lastinvdt <> thisform.cCurrentSystemDate ;
				and sa_linvdt = sa_finvdt and ;
				between(date()-sa_linvdt, 290,330)
			rvalue = thisform.dInvoiceDate


		***< Marked to bill this month, product type=A and not already billed this month and it's due
		***< This gets all other Annual billing
		case &sInvoiceMonth and LEFT(sa_pr_id, 1) = "A" and lastinvdt <> thisform.cCurrentSystemDate ;
				and sa_linvdt <> sa_finvdt ;
				and (date()- sa_linvdt) > BillPdLen
			rvalue = thisform.dInvoiceDate
		

		***< Billmonth = This month + 2, product type=A and not already billed this month 
		case &sInvoiceMonthPlus2 and LEFT(sa_pr_id, 1) = "A" and lastinvdt <> thisform.cCurrentSystemDate
			rvalue = thisform.dInvoiceDatePlus2


		**< Billmonth = This Month + 2, product type=S and NEVER billed before
		case &sInvoiceMonthPlus2 and LEFT(sa_pr_id, 1) = "S" and EMPTY(sa_finvdt)
			rvalue = thisform.dInvoiceDatePlus2
	endcase



	**< The code below is commented out. cps 6-4-2000
	if .f.
	IF &sInvoiceMonth && If it is marked to be invoiced in this month
		IF LEFT(InvoicableSales.sa_pr_id, 1) = "A"  && 						<<<If it is product type A>>>
			lastinvdt = thisform.mth_yr_format(InvoicableSales.sa_linvdt)

			IF lastinvdt <> thisform.cCurrentSystemDate
				rvalue = thisform.dInvoiceDate
			ENDIF (lastinvdt <> thisform.cCurrentSystemDate)

		ELSE
			IF LEFT(InvoicableSales.sa_pr_id, 1) = "S"
				IF EMPTY(InvoicableSales.sa_linvdt)
					rvalue = thisform.dInvoiceDate
				ENDIF
			ENDIF
		ENDIF

	ELSE
		IF &sInvoiceMonthPlus2 = .T.
			IF LEFT(InvoicableSales.sa_pr_id, 1) = "A"
				lastinvdt = thisform.mth_yr_format(InvoicableSales.sa_linvdt)
				IF lastinvdt <> thisform.cCurrentSystemDate
					rvalue = thisform.dInvoiceDatePlus2
				ENDIF
			ELSE
				IF LEFT(InvoicableSales.sa_pr_id, 1) = "S"
					IF EMPTY(InvoicableSales.sa_linvdt)
						rvalue = thisform.dInvoiceDatePlus2
					ENDIF
				ENDIF
			ENDIF (LEFT(InvoicableSales.sa_pr_id, 1) = "A")
		ENDIF (&sInvoiceMonthPlus2 = .T.)

	ENDIF (&sInvoiceMonth if this month is the invoice month)
	endif (.f.)

RETURN(rvalue)


ENDPROC
PROCEDURE printinvoicelineitem
PRIVATE discount

num_months = thisform.CountBillingPeriods()

discount =  ROUND(InvoicableSales.sa_disc / 100, 6)
m.d_disc = discount

m.d_descrip	= products.description
m.d_qty		= InvoicableSales.sa_qty

&&  This IF was added 06/24/97 to account for multiple year subscriptions
IF products.SubLength > 1
*!*			m.d_list 	= products.pr_list / num_months / products.pr_years
	m.d_list 	= InvoicableSales.sa_SalesPr / num_months / products.SubLength
ELSE
*!*			m.d_list	= products.pr_list / num_months
	m.d_list	= InvoicableSales.sa_SalesPr / num_months
ENDIF

IF discount > 0
	m.d_netprice 	= m.d_list * (1 - discount)
ELSE 
	m.d_netprice	= m.d_list
ENDIF

m.d_linettl = ROUND(m.d_qty * m.d_netprice, 2)


&& Does a service charge need to be added
&& These lines were commented out 09/03/97 to add new code for the addition of the 
&& sa_invfee field.
&&IF num_months > 1 AND ;
&&		((MONTH(DATE()) <> MONTH(sales.sa_finvdt)) OR sales.sa_date >= {05/01/94})
&&	m.in_serchg = serchrg()
&&ELSE
&&	m.in_serchg = 0
&&ENDIF

&& The memory variable m.srvcchrg is used to catch any line item in an invoice with a service
&& charge.  That charge will be applied to the invoice.   
IF NOT EMPTY(InvoicableSales.sa_invfee)
*		m.prev_srvcchrg = m.srvcchrg
*		m.srvcchrg = sales.sa_invfee
	m.d_invfee = InvoicableSales.sa_invfee
ENDIF


mdate = DTOC(InvoicableSales.sa_date)

IF (VAL(SYS(1)) - VAL(SYS(11, mdate))) > 360
	m.d_renewal = '--- RENEWAL ---'
ENDIF

m.d_cuid	= InvoicableSales.sa_cu_id
m.d_prid 	= InvoicableSales.sa_pr_id
m.d_salesid	= InvoicableSales.sales_id
m.d_startdt	= InvoicableSales.sa_date
m.d_enddt	= InvoicableSales.sa_enddt
m.d_linvdt 	= DATE()
m.d_linvnum	= InvoicableSales.sa_linvnum
m.d_invcode = products.invcode
thisform.cInvCode = products.invcode

IF EMPTY(InvoicableSales.sa_finvdt)
	m.d_finvdt = DATE()
ENDIF
ENDPROC
PROCEDURE getsubscriptionperiod
PARAMETER billingmonth
PRIVATE periods, begindate, enddate, billingmonth

periods = thisform.CountBillingPeriods()
*	begindate = CTOD(ALLTRIM(STR(MONTH(billingmonth))) + "/01/" + ALLTRIM(STR(YEAR(billingmonth))))
begindate = DATE(YEAR(billingmonth), MONTH(billingmonth), 01)

periods = (12/periods) - 1
enddate = GOMONTH(begindate, periods)

m.d_subdate = ALLTRIM(CMONTH(begindate))  + " " + ALLTRIM(STR(YEAR(begindate))) + ;
	" - " + ALLTRIM(CMONTH(enddate)) + " " + ALLTRIM(STR(YEAR(enddate)))

ENDPROC
PROCEDURE getconversionrate
PRIVATE rvalue
rvalue = 1

IF NOT EMPTY(customer.cu_convrat)
	rvalue = convert.co_rate
ENDIF

RETURN(rvalue)


ENDPROC
PROCEDURE getremittoinfo
PRIVATE cTmpInvNum, cInvSuffix, nRecordsRead

* For progress thermometer
_elibarcon = -1
_runmancon = 3
_iconpostion = 5
nRecordsRead = 0

cTmpInvNum = ''
cInvSuffix = ''

IF USED("inv_data")
	SELECT inv_data
ELSE
	SELECT 0
	USE (LOCFILE("inv_data.dbf","DBF","Where is inv_data ?")) EXCLUSIVE ;
		AGAIN ALIAS inv_data
ENDIF

IF USED("inv_head")
	SELECT inv_head
ELSE
	SELECT 0
	USE (LOCFILE("inv_head.dbf","DBF","Where is inv_head ?")) EXCLUSIVE ;
		AGAIN ALIAS inv_head
ENDIF

*Intialize progress thermometer
DO therm WITH RECCOUNT(), nRecordsRead, 'Invoicing', 'Creating Invoice Number', ''

SELECT inv_head
GOTO TOP

DO WHILE !EOF('inv_head')
	DO CASE
		CASE inv_head.h_remitto = "COM"
			cInvSuffix = "A"

		CASE inv_head.h_remitto = "REN"
			cInvSuffix = "R"

		CASE inv_head.h_remitto = "SOM"
			cInvSuffix = "S"

		CASE inv_head.h_remitto = 'MOM' OR ;
				inv_head.h_remitto = 'ENG' OR ;
				inv_head.h_remitto = 'AUD' OR ;
				inv_head.h_remitto = 'AUS'
			cInvSuffix = 'M'
		OTHERWISE
			cInvSuffix = 'Z'
	ENDCASE

	IF LEFT(inv_head.h_acctno, 1) = 'U'
		cInvSuffix = 'M'
	ENDIF

	cTmpInvNum = ALLTRIM(inv_head.h_invnum)

	REPLACE Inv_Head.h_invnum WITH cTmpInvNum + cInvSuffix

	nRecordsRead = nRecordsRead + 1
	DO therm WITH RECCOUNT(), nRecordsRead, 'Invoicing', 'Creating Invoice Number', ''
	
	SELECT inv_data
	REPLACE ALL inv_data.d_invnum WITH cTmpInvNum + cInvSuffix FOR Inv_data.d_invnum = cTmpInvNum

	SELECT inv_head
	SKIP 1 IN inv_head
	
ENDDO

DO therm WITH RECCOUNT(), nRecordsRead, 'Invoicing', 'Creating Invoice Number', ''

RETURN
ENDPROC
PROCEDURE closedatabases
IF USED("InvoicableSales.dbf")
	SELECT InvoicableSales.dbf
	USE
ENDIF

IF USED("products")
	SELECT products
	USE
ENDIF

IF USED("customer")
	SELECT customer
	USE
ENDIF

IF USED("convert")
	SELECT CONVERT
	USE
ENDIF

IF USED("remitto")
	SELECT remitto
	USE
ENDIF

IF USED("inv_data")
	SELECT inv_data
	USE
ENDIF

IF USED("inv_head")
	SELECT inv_head
	USE
ENDIF

IF USED("sysinfo")
	SELECT sysinfo
	USE
ENDIF

IF USED("tmp_cust")
	SELECT tmp_cust
	USE
ENDIF

IF USED("tmp_serv")
	SELECT tmp_serv
	USE
ENDIF

ENDPROC
PROCEDURE gettaxtotals
* Calculate tax amount
Private nTaxAmount, nRecordsRead, nTotalRecords

nTaxAmount = 0
nTotalRecords = 0
nRecordsRead = 0
_elibarcon = -1
_runmancon = 3
_iconpostion = 5

SELECT Inv_head
nTotalRecords = RECCOUNT()
GOTO TOP

DO therm WITH nTotalRecords, nRecordsRead, 'Invoicing', 'Calculating Tax Amount', ''

DO WHILE NOT EOF('Inv_head')
	IF inv_head.h_taxrate > 0
		nTaxAmount = ROUND((Inv_head.h_taxrate / 100) * Inv_head.h_TTLInv, 2)
	ELSE
		nTaxAmount = 0
	ENDIF
	
	REPLACE Inv_head.h_TaxAmount WITH nTaxAmount
	
	SKIP 1 IN 'Inv_head'
	nRecordsRead = nRecordsRead + 1
	DO therm WITH nTotalRecords, nRecordsRead, 'Invoicing', 'Calculating Tax Amount', ''

ENDDO
DO therm WITH nTotalRecords, nRecordsRead, 'Invoicing', 'Calculating Tax Amount', ''



ENDPROC
PROCEDURE gettotalextended
* This procedure sums the line item $ amounts in inv_data.  Processing the Inv_data file
* is the slow way to do this since you could sum the same invoice multiple times.(Once
* for each line item) But, it does check that all line items have a coresponding header record.

PRIVATE nTotalLineAmount, cCurrentInvoiceNumber, nCurrentRecordNumber, nRecordsRead, nTotalRecords

nTotalLineAmount = 0
cCurrentInvoiceAmount = ''
nCurrentRecordNumber = 0
nTotalRecords = 0
nRecordsRead = 0
_elibarcon = -1
_runmancon = 3
_iconpostion = 5

SELECT Inv_head
SET ORDER TO TAG h_invnum

SELECT Inv_data
nTotalRecords = RECCOUNT()
GOTO TOP
nCurrentRecordNumber = RECNO()

DO therm WITH nTotalRecords, nRecordsRead, 'Invoicing', 'Totaling Invoice Line Items', ''

DO WHILE NOT EOF('Inv_data')
		cCurrentInvoiceNumber = Inv_data.d_invnum
		SUM Inv_data.d_linettl FOR cCurrentInvoiceNumber = Inv_data.d_invnum TO nTotalLineAmount
		SELECT Inv_head
		SEEK cCurrentInvoiceNumber
		IF FOUND()
			REPLACE Inv_head.h_ttlinv WITH  nTotalLineAMount
		ELSE
			MESSAGEBOX("No Invoice Header record was found for " + cCurrentInvoiceNumber,64,"Invoicing")
		ENDIF
		
		* This is because the sum function moves the record pointer to the EOF
		SELECT Inv_data
		GOTO nCurrentRecordNumber
		SKIP 1 IN 'Inv_data'
		nCurrentRecordNumber = RECNO()
		nRecordsRead = nRecordsRead + 1
		DO therm WITH nTotalRecords, nRecordsRead, 'Invoicing', 'Totaling Invoice Line Items', ''

ENDDO
DO therm WITH nTotalRecords, nRecordsRead, 'Invoicing', 'Totaling Invoice Line Items', ''


ENDPROC
PROCEDURE gettotalinvoiceamount
* Calculate total invoice amount
Private nTotalInvoiceAmount, nTotalConvertAmount, nRecordsRead, nTotalRecords

nTotalInvoiceAmount = 0
nTotalConvertAmount = 0
nTotalRecords = 0
nRecordsRead = 0
_elibarcon = -1
_runmancon = 3
_iconpostion = 5

SELECT Inv_head
nTotalRecords = RECCOUNT()
GOTO TOP

DO therm WITH nTotalRecords, nRecordsRead, 'Invoicing', 'Calculating Total Invoice Amount', ''

DO WHILE NOT EOF('Inv_head')

	nTotalInvoiceAmount = Inv_head.h_ttlinv + Inv_head.h_TaxAmount + Inv_head.h_ShipChg + Inv_head.h_SerChg
	nTotalCovertAmount = ROUND((nTotalInvoiceAmount * Inv_head.h_convrat), 4)
	
	REPLACE Inv_head.h_TotalExtended WITH nTotalInvoiceAmount
	Replace Inv_head.h_TTLConvertAmount WITH nTotalCovertAmount 
	
	SKIP 1 IN 'Inv_head'
	nRecordsRead = nRecordsRead + 1
	DO therm WITH nTotalRecords, nRecordsRead, 'Invoicing', 'Calculating Total Invoice Amount', ''

ENDDO
DO therm WITH nTotalRecords, nRecordsRead, 'Invoicing', 'Calculating Total Invoice Amount', ''

ENDPROC
PROCEDURE Init
SET PATH TO PROGS, FORMS, LIBS, MENUS, DATA, ;
        REPORTS, INCLUDES, HELP, BITMAPS

* ON ERROR DO progs\errhand WITH ;
*   ERROR( ), MESSAGE( ), MESSAGE(1), PROGRAM( ), LINENO( ), SELECT(), RECNO()

* Build array for company codes

* this.lIgnoreErrors = .t.

SELECT Company.co_name, Company.company_id, Company.co_code;
 FROM trackerdb!company;
 ORDER BY Company.co_name;
 INTO ARRAY thisform.aCompanyCode
 
USE

ThisForm.cboCompanyCode.NumberOfElements = ALEN(thisform.aCompanyCode)

ThisForm.chkCheckForProductUpdates.value = .T.

ThisForm.cboCompanyCode.value = 'Baker & Taylor'
ENDPROC
                                         %   S       h      b             U    C    U  THISFORM RELEASE Click,     1  1                       #       )                                                         '   %                             U  F  %C   
 
     ?  R, Company is empty  U  THISFORM CCOMPANYTOINVOICE DOINVOICING Click,     1 1  A 1                       {       )                           !Arial, 0, 9, 5, 15, 12, 32, 3, 0
      Top = 89
Left = 24
AutoSize = .T.
Caption = "Check for product updates"
Value = 0
ControlSource = "lCheckForProductUpdates"
Name = "chkCheckForProductUpdates"
      frmInvoicing      chkCheckForProductUpdates      checkbox      ..\libs\t_base.vcx      
t_checkbox      eCaption = "Invoice What Company"
Height = 16
Left = 60
Top = 209
Width = 144
Name = "T_label2"
      frmInvoicing      T_label2      label      ..\libs\t_base.vcx      t_label      qAlignment = 2
Caption = "Invoice What Month"
Height = 16
Left = 204
Top = 7
Width = 162
Name = "T_label1"
      frmInvoicing      T_label1      label      ..\libs\t_base.vcx      t_label     ColumnCount = (ALEN(aCompanyCode,2))
RowSourceType = 5
RowSource = "thisform.aCompanyCode"
DisplayValue = 
ControlSource = "thisform.cCompanyToInvoice"
FirstElement = 1
Height = 24
Left = 60
NumberOfElements = 0
Style = 2
Top = 228
Width = 228
Name = "cboCompanyCode"
      frmInvoicing      cboCompanyCode      combobox      ..\libs\t_base.vcx      
t_combobox      .PROCEDURE Click
thisform.release()
ENDPROC
      VTop = 288
Left = 168
Height = 24
Width = 75
Caption = "\<Quit"
Name = "cmdQuit"
      frmInvoicing      cmdQuit      commandbutton      ..\libs\t_base.vcx      t_commandbutton      PROCEDURE Click
IF !EMPTY(ThisForm.cCompanyToInvoice)
	thisform.DoInvoicing
ELSE
	wait window "Company is empty"
ENDIF
ENDPROC
      ]Top = 288
Left = 60
Height = 24
Width = 75
Caption = "\<Continue"
Name = "cmdContinue"
      frmInvoicing      cmdContinue      commandbutton      ..\libs\t_base.vcx      t_commandbutton     bAutoSize = .F.
ButtonCount = 12
Value = 1
ControlSource = "thisform.nInvoiceMonth"
Height = 154
Left = 204
Top = 24
Width = 162
Name = "cmgMonth"
Command1.AutoSize = .F.
Command1.Top = 5
Command1.Left = 5
Command1.Height = 24
Command1.Width = 75
Command1.Caption = "January"
Command1.Name = "Command1"
Command2.AutoSize = .F.
Command2.Top = 29
Command2.Left = 5
Command2.Height = 24
Command2.Width = 75
Command2.Caption = "February"
Command2.Name = "Command2"
Command3.AutoSize = .F.
Command3.Top = 53
Command3.Left = 5
Command3.Height = 24
Command3.Width = 75
Command3.Caption = "March"
Command3.Name = "Command3"
Command4.AutoSize = .F.
Command4.Top = 77
Command4.Left = 5
Command4.Height = 24
Command4.Width = 75
Command4.Caption = "April"
Command4.Name = "Command4"
Command5.AutoSize = .F.
Command5.Top = 101
Command5.Left = 5
Command5.Height = 24
Command5.Width = 75
Command5.Caption = "May"
Command5.Name = "Command5"
Command6.AutoSize = .F.
Command6.Top = 125
Command6.Left = 5
Command6.Height = 24
Command6.Width = 75
Command6.Caption = "June"
Command6.Name = "Command6"
Command7.AutoSize = .F.
Command7.Top = 5
Command7.Left = 82
Command7.Height = 24
Command7.Width = 75
Command7.Caption = "July"
Command7.Name = "Command7"
Command8.AutoSize = .F.
Command8.Top = 29
Command8.Left = 82
Command8.Height = 24
Command8.Width = 75
Command8.Caption = "August"
Command8.Name = "Command8"
Command9.AutoSize = .F.
Command9.Top = 53
Command9.Left = 82
Command9.Height = 24
Command9.Width = 75
Command9.Caption = "Septemeber"
Command9.Name = "Command9"
Command10.AutoSize = .F.
Command10.Top = 77
Command10.Left = 82
Command10.Height = 24
Command10.Width = 75
Command10.Caption = "October"
Command10.Name = "Command10"
Command11.AutoSize = .F.
Command11.Top = 101
Command11.Left = 82
Command11.Height = 24
Command11.Width = 75
Command11.Caption = "November"
Command11.Name = "Command11"
Command12.AutoSize = .F.
Command12.Top = 125
Command12.Left = 82
Command12.Height = 24
Command12.Width = 75
Command12.Caption = "December"
Command12.Name = "Command12"
      frmInvoicing      cmgMonth      commandgroup      ..\libs\t_base.vcx      t_commandgroup     "ccompanytoinvoice
dinvoicemonth
ninvoicemonth
dinvoicemonthplus2
cinvoicemonth
cinvoicemonthplus2
sinvoicemonth
sinvoicemonthplus2
lfirstinvoice
ccurrentsystemdate
dinvoicedate
dinvoicedateplus2
ccurrentinvoicenumber
cpreviousinvoicenumber
cheaderinvoicenumber
cdetailinvoicenumber
lcheckforproductupdates
lcontinue
cinvcode
^acompanycode[1,0] 
*formatinvoicedate 
*doinvoicing 
*mth_yr_format 
*getinvoicablesalesrecords 
*opendatabases 
*getinvoicelineitems 
*getinvoiceheaderinfo 
*getservicecharges 
*getinvoicecodes 
*countbillingperiods 
*getinvoicenumber 
*selectinvoicelineitem 
*printinvoicelineitem 
*getsubscriptionperiod 
*getconversionrate 
*getremittoinfo 
*closedatabases 
*gettaxtotals 
*gettotalextended 
*gettotalinvoiceamount 
*getbillpdlen 
     J[    BJ  BJ                        X'   %   A      H    C            U  n    ) T  CCCC$iZ ,CC  Z ,01( thisform.dInvoiceDate = DATE(&Temp1)
; thisform.dInvoiceDatePlus2 = GOMONTH(DATE(&temp1), + 2)
 T  CC  != T  CC  != T  C   	  T 
 C   	  T  CC$ 	 + T   InvoicableSales.sa_b  + T   InvoicableSales.sa_b   U  TEMP1 TEMP2 THISFORM NINVOICEMONTH CINVOICEMONTH DINVOICEDATE CINVOICEMONTHPLUS2 DINVOICEDATEPLUS2 DINVOICEMONTH MTH_YR_FORMAT DINVOICEMONTHPLUS2 CCURRENTSYSTEMDATE SINVOICEMONTH SINVOICEMONTHPLUS2p %    &   PR_DOCHG.PRG 
    
     %   
    
   	  %    
   
 
    
    
    
    
    
     T C9 Of the potential invoiceable records, none were eligible.@	 Invoicingx  \< C! No records were found to Invoice.@	 Invoicingx  C    U  THISFORM CHKCHECKFORPRODUCTUPDATES VALUE PR_DOCHG PRG FORMATINVOICEDATE GETINVOICABLESALESRECORDS	 LCONTINUE OPENDATABASES GETINVOICELINEITEMS GETINVOICEHEADERINFO GETREMITTOINFO GETSERVICECHARGES GETTOTALEXTENDED GETTAXTOTALS GETTOTALINVOICEAMOUNT CLOSEDATABASES RELEASE_  4   5    T C  H T C  i T CC Z /CC Z
 B  U  TEMPDATE TMONTH TYEAR RVALUE 5       G  T 
 sales.sa_b   T 
 sales.sa_b 	  T C 
     %    T   T C   
   SELECT * FROM trackerdb!sales WHERE Sales.sa_status = 'A' AND Sales.sa_company = cCompanyCode AND (&SQLcurmth = .T. OR &SQLcurmth_2 = .T.) AND inlist(LEFT(Sales.sa_pr_id, 1),'A','S')  INTO TABLE tmp\InvoicableSales.dbf
 %CN  T  a &     T  -  Q F  Q U  SQLMONTH
 SQLMONTH_2 CCOMPANY	 NPOSITION CCOMPANYCODE	 SQLCURMTH THISFORM CINVOICEMONTH SQLCURMTH_2 CINVOICEMONTHPLUS2 ACOMPANYCODE CBOCOMPANYCODE VALUE	 LCONTINUE SA_CU_ID SALES 	 trackerdb" %C InvoicableSales.dbfN 
 F   G(( sa_cu_id   F  L QC tmp\InvoicableSales.dbf DBF Where is InvoicableSales ?  G(( sa_cu_id  %C products  F  G(( prodnum G F  : QC products.dbf DBF Where is products ?  G(( prodnum  %C customerw F  G(( cu_id  F  : QC customer.dbf DBF Where is customer ?  G(( cu_id  %C convert  F  G(( co_code X F  8 QC convert.dbf DBF Where is convert ?  G(( co_code  %C remitto F
  G(( re_id  F  8 QC remitto.dbf DBF Where is remitto ?
  G(( re_id  F  G-(    G-(    F  G-(    G-(  
  %C inv_dataZ Q   %C inv_head} Q   F  ; QC inv_data.dbf DBF Where is inv_data ? - R,:" Deleting and Packing inv_data file  3 R Q  F  ; QC inv_data.dbf DBF Where is inv_data ?  F  ; QC inv_head.dbf DBF Where is inv_data ? - R,:" Deleting and Packing inv_head file  3 R Q  F  ; QC inv_head.dbf DBF Where is inv_data ?  G
 U 	 TRACKERDB INVOICABLESALES DBF SA_CU_ID PRODUCTS PRODNUM CUSTOMER CU_ID CONVERT CO_CODE REMITTO RE_ID SA_PR_ID
 CU_CONVRAT
 CU_REMITTO INV_DATA INV_HEAD ALL 5     T    T   T    T  T  T  F  #)@  CN  	 Invoicing Processing Sales file  * +C InvoicableSales+
 C|	 T C	 
  %C 
 F  ^ %   0
 	   T    K T	  	    C  	   C	   F   T 	   _ T	  	   F  T    H  T    @  CN  	 Invoicing Processing Sales file   @  CN  	 Invoicing Processing Sales file   F  Q F  Q %C inv_dataN  T	  a  T	  -  B U  NRECORDSREAD NINVOICECOUNT CPREV_CU_ID
 _ELIBARCON
 _RUNMANCON _ICONPOSTION INVOICABLESALES THERM
 INVWHATMTH THISFORM SELECTINVOICELINEITEM INV_DATA SA_CU_ID GETINVOICENUMBER CDETAILINVOICENUMBER CPREVIOUSINVOICENUMBER GETSUBSCRIPTIONPERIOD PRINTINVOICELINEITEM D_INVNUM PRODUCTS	 LCONTINUE. 5   T    T  T  T  G  F  #)7 o Inv_data    1 tmp\tmp_cust.dbf F	  G((
 Customer_I F  #)]  C tmp_custN  	 Invoicing' Matching sales and customer information   +C tmp_cust+
 F  ^ F	  E   %C4 T 	   T 	   T 	   T 	   T 	   T 	   T 	   T 	   T 	   T  	 !  T" 	 #  T$ 	 %  T& 	 '  T( 	 )  T* 	 +  T, 	 -  T. 	 /  T0 C$ T1 	 2  T3 	 4  T5 	 6  T7 C8 9  T: 	 ;  T< 	 =  T> 	 ?  T@ 	 A  TB 8 C  TD    %C	 A 
 TE F G  TH F I  TJ F K  TL F M  TN F O  TP F Q  TR F S  TT F U   F   _ ?= C    Customer detail data not found0 Errorx  H  T    c  C tmp_custN   Invoice Extract' Matching sales and customer information   c  C tmp_custN   Invoice Extract' Matching sales and customer information   UV 	 RECS_READ
 _ELIBARCON
 _RUNMANCON _ICONPOSTION INV_DATA DISTINCT D_CUID D_INVNUM TMP CUSTOMER
 CUSTOMER_I TMP_CUST THERM INV_HEAD H_BNAME CU_BNAME H_SNAME CU_SNAME H_BADDR1	 CU_BADDR1 H_SADDR1	 CU_SADDR1 H_BADDR2	 CU_BADDR2 H_SADDR2	 CU_SADDR2 H_BADDR3	 CU_BADDR3 H_SADDR3	 CU_SADDR3 H_BCITY CU_BCITY H_SCITY CU_SCITY H_BSTATE	 CU_BSTATE H_SSTATE	 CU_SSTATE	 H_BCOUNTY
 CU_BCOUNTY	 H_SCOUNTY
 CU_SCOUNTY H_BZIP CU_BZIP H_SZIP CU_SZIP H_CU_ID CUSTOMER_ID H_LINVDT H_ACCTNO	 CU_ACCTNO H_REGION	 CU_REGION H_MARKET	 CU_MARKET	 H_CONVRAT THISFORM GETCONVERSIONRATE	 H_CONVCTY
 CU_CONVRAT	 H_TAXRATE
 CU_TAXRATE	 H_SHIPCHG
 CU_SHIPCHG	 H_REMITTO
 CU_REMITTO	 H_INVCODE CINVCODE H_INVNUM H_RNAME REMITTO RE_NAME H_RADDR1 RE_ADDR1 H_RADDR2 RE_ADDR2 H_RADDR3 RE_ADDR3 H_RCITY RE_CITY H_RSTATE RE_STATE	 H_RCOUNTY
 RE_COUNTRY H_RZIP RE_ZIP" R,: Getting Service ChargesM o Inv_data         1 tmp\tmp_serv.dbf %C tmp_servN   &    F ) G( ( D_invnum tmp\tmp_serv.cdx G-(   $ > 
         R U  DISTINCT INV_DATA D_CUID D_INVNUM D_INVFEE TMP INV_HEAD TMP_SERV H_INVNUM ALL H_SERCHG FOR.  R,: Getting Invoice CodesI o Inv_data        1 tmp\tmp_code.dbf %C tmp_codeN  &    F ) G( ( D_invnum tmp\tmp_code.cdx G-( 	  $ >     	   $ >     	     R B U  DISTINCT INV_DATA D_CUID D_INVNUM	 D_INVCODE D_LINVDT TMP INV_HEAD TMP_CODE H_INVNUM ALL	 H_INVCODE FOR H_LINVDT 5   T    %  a7  T      %  a^  T      %  a  T      %  a  T      %  a  T      %  a  T      %  a! T      % 	 aH T      % 
 ao T      %  a T      %  a T      %  a T     
 B   U 
 PERIOD_CNT INVOICABLESALES SA_BJAN SA_BFEB SA_BMAR SA_BAPR SA_BMAY SA_BJUN SA_BJUL SA_BAUG SA_BSEP SA_BOCT SA_BNOV SA_BDEC 5    %C  S s,         纉 330 @ MS Sans SerifB  	 z,  t, E l'    Invoice Number:@ MS Sans Serif
A BT l' 3    @ MS Sans Serif
A B      ?      %@ @K! A99AA9999*C 
 CC >		 Enter starting invoice number.$ Invoice Number Cannot Contain Blanks' N     (";   / CS  33 B( . A 1CL b  癙. B("; 癙. C 9  T  C = T CC \g T C  @L ####_ T      T    A T 	 - T  C  = T CC  \g T C  @L ####_ T       T      T 
    T     % 	  T      u,  B U  V_INVPRE V_INVNUM THISFORM CCURRENTINVOICENUMBER INVNUM	 V_INVNAME
 PREV_CU_ID INVOICABLESALES SA_CU_ID LFIRSTINVOICE CHEADERINVOICENUMBER CDETAILINVOICENUMBER CPREVIOUSINVOICENUMBER 5       T     T    T    T C 	    T C 
  Hy     T h    T     T Z    T  2 T    H0 case &sInvoiceMonth and empty(sa_finvdt)X T     case &sInvoiceMonth and LEFT(sa_pr_id, 1) = "A" and lastinvdt <> thisform.cCurrentSystemDate  and sa_linvdt = sa_finvdt and  between(date()-sa_linvdt, 290,330) T     case &sInvoiceMonth and LEFT(sa_pr_id, 1) = "A" and lastinvdt <> thisform.cCurrentSystemDate  and sa_linvdt <> sa_finvdt  and (date()- sa_linvdt) > BillPdLen T    i case &sInvoiceMonthPlus2 and LEFT(sa_pr_id, 1) = "A" and lastinvdt <> thisform.cCurrentSystemDate= T    Q case &sInvoiceMonthPlus2 and LEFT(sa_pr_id, 1) = "S" and EMPTY(sa_finvdt) T      %- IF &sInvoiceMonth p %C  = A  T C 	    %    T      l %C  = Sh %C 	 d T        j$ IF &sInvoiceMonthPlus2 = .T.E %C  = A T C 	    %    T      A %C  = S= %C 	 9 T       % ENDIF (&sInvoiceMonthPlus2 = .T.)
= ENDIF (&sInvoiceMonth if this month is the invoice month)
 
 B   U  RVALUE SINVOICEMONTH SINVOICEMONTHPLUS2 BILLPDCT	 BILLPDLEN THISFORM	 LASTINVDT MTH_YR_FORMAT INVOICABLESALES	 SA_LINVDT COUNTBILLINGPERIODS DINVOICEDATE DINVOICEDATEPLUS2 SA_PR_ID CCURRENTSYSTEMDATE` 5   T C   T  C  dT T    T  	  T
    %    T         T      %     T       T    T C
  T %C  
@ T     T C  *" %CC]gCC ]gh T  --- RENEWAL ---  T    T    T    T    T    T C$ T   !  T"  #  T $  #  %C % Y T& C$  U'  DISCOUNT
 NUM_MONTHS THISFORM COUNTBILLINGPERIODS INVOICABLESALES SA_DISC D_DISC	 D_DESCRIP PRODUCTS DESCRIPTION D_QTY SA_QTY	 SUBLENGTH D_LIST
 SA_SALESPR
 D_NETPRICE	 D_LINETTL	 SA_INVFEE D_INVFEE MDATE SA_DATE	 D_RENEWAL D_CUID SA_CU_ID D_PRID SA_PR_ID	 D_SALESID SALES_ID	 D_STARTDT D_ENDDT SA_ENDDT D_LINVDT	 D_LINVNUM
 SA_LINVNUM	 D_INVCODE INVCODE CINVCODE	 SA_FINVDT D_FINVDT  4   5      T C   T CC  iC  H$ T   T C  @ T CC !  CCC iZ  - CC !  CCC iZ U  BILLINGMONTH PERIODS	 BEGINDATE ENDDATE THISFORM COUNTBILLINGPERIODS	 D_SUBDATEH  5   T   %C  
7  T     
 B   U  RVALUE CUSTOMER
 CU_CONVRAT CONVERT CO_RATE 5     T  T  T  T   T     T    %C inv_data|  F    F  ; QC inv_data.dbf DBF Where is inv_data ?   %C inv_head  F  4 F  ; QC inv_head.dbf DBF Where is inv_head ?  B  CN 	 Invoicing Creating Invoice Number   F  #) +C inv_head+
o H  	  COM T  A  	  REN T  R  	  SOM T  SJ  	  MOM  	  ENG  	  AUD  	  AUSs T  M 2 T  Z  %C 
 = U T  M  T  C   >      T  B  CN 	 Invoicing Creating Invoice Number   F " >          F  H  B  CN 	 Invoicing Creating Invoice Number   B U 
 CTMPINVNUM
 CINVSUFFIX NRECORDSREAD
 _ELIBARCON
 _RUNMANCON _ICONPOSTION INV_DATA INV_HEAD THERM	 H_REMITTO H_ACCTNO H_INVNUM ALL D_INVNUM FOR" %C InvoicableSales.dbf0 
 F    Q  %C productsV  F  Q  %C customer|  F  Q  %C convert  F  Q  %C remitto  F  Q  %C inv_data  F  Q  %C inv_head F  Q  %C sysinfo7 F  Q  %C tmp_cust] F	  Q  %C tmp_serv F
  Q  U  INVOICABLESALES DBF PRODUCTS CUSTOMER CONVERT REMITTO INV_DATA INV_HEAD SYSINFO TMP_CUST TMP_SERV 5     T    T   T   T  T  T  F  T CN #)@    	 Invoicing Calculating Tax Amount   +C Inv_head+
 %   ! T  C  d 	 T  T     > 
    H Inv_head T  @    	 Invoicing Calculating Tax Amount   @    	 Invoicing Calculating Tax Amount   U 
 NTAXAMOUNT NRECORDSREAD NTOTALRECORDS
 _ELIBARCON
 _RUNMANCON _ICONPOSTION INV_HEAD THERM	 H_TAXRATE H_TTLINV H_TAXAMOUNT 5       T    T    T   T   T   T  T  T  F	  G(( h_invnum F  T CN #) T COE    	 Invoicing Totaling Invoice Line Items   +C Inv_data+
N T    K   (     F	 	 E  %C4s >	     F C' No Invoice Header record was found for  @	 Invoicingx  F 	 #  H Inv_data T CO T  E    	 Invoicing Totaling Invoice Line Items   E    	 Invoicing Totaling Invoice Line Items   U  NTOTALLINEAMOUNT CCURRENTINVOICENUMBER NCURRENTRECORDNUMBER NRECORDSREAD NTOTALRECORDS CCURRENTINVOICEAMOUNT
 _ELIBARCON
 _RUNMANCON _ICONPOSTION INV_HEAD H_INVNUM INV_DATA THERM D_INVNUM	 D_LINETTL H_TTLINV 5      T    T   T   T   T  T  T  F  T CN #)J    	 Invoicing  Calculating Total Invoice Amount   +C Inv_head+
% T   	  
      T C    T >     >    H Inv_head T  J    	 Invoicing  Calculating Total Invoice Amount   J    	 Invoicing  Calculating Total Invoice Amount   U  NTOTALINVOICEAMOUNT NTOTALCONVERTAMOUNT NRECORDSREAD NTOTALRECORDS
 _ELIBARCON
 _RUNMANCON _ICONPOSTION INV_HEAD THERM H_TTLINV H_TAXAMOUNT	 H_SHIPCHG H_SERCHG NTOTALCOVERTAMOUNT	 H_CONVRAT H_TOTALEXTENDED H_TTLCONVERTAMOUNT K G)(B PROGS, FORMS, LIBS, MENUS, DATA,  REPORTS, INCLUDES, HELP, BITMAPSD o trackerdb!company           Q T  	 C   T 
  a! T    Baker & Taylor U  PROGS COMPANY CO_NAME
 COMPANY_ID CO_CODE	 TRACKERDB THISFORM ACOMPANYCODE CBOCOMPANYCODE NUMBEROFELEMENTS CHKCHECKFORPRODUCTUPDATES VALUE formatinvoicedate,      doinvoicingr     mth_yr_format     getinvoicablesalesrecords     opendatabases4     getinvoicelineitems      getinvoiceheaderinfo     getservicecharges     getinvoicecodes     countbillingperiods     getinvoicenumberK      selectinvoicelineitem$     printinvoicelineitemV+     getsubscriptionperiodS/     getconversionrate[0     getremittoinfo0     closedatabases15     gettaxtotals,7     gettotalextended9     gettotalinvoiceamount	=     Init@    1  c2 11A             AA  A  2 q     3 ra RA     A B r A 3 "   A rq   A rq     A bq   A bq     A r 11q 11v A r A  Q A Q    Q A Q    a 2        s Q q a C  1A  r Q !Q 2q A  A r A q A    A B 4 q     b t Q su 1q Q q a q   "!!!!!!!!!!!!!!!! !!!1!!!!!!2!!!!!!!!A r Q Q  A  2A 23 ! r 1CA Q 4  r 1CCB Q B 2 q  "A !A !A !A !A !A !A !A !A !A !A !A  4  !9  Tr4R R !qA  QAA B111A  B 3 q q       A  v
W
A  qBA  !A A A  AqAA  !A A A QA  4 q  "!C bA  A ?#A #"A "!!!! !!1" A 2 q 1b!3 q  2A  4        rq   A rq   A #r Q  q r r    A  A "B!r !r  B "B 2 ! A A rq A A rq A A bq A A bq A A rq A A rq A A bq A A rq A A rq A A 3        r  Q A  A rB 5 u        r r  Q  Rq    aA s  q QB Q4 2       r  Q RrB 3 LB 1                       w               %   B    4   ,   +  I  A   @   m    h                  *  4     *  ,    
  -  /      /  3    ?  3  :    `  ;  ^G  -    G  N      O  Q      =Q  Q      Q  6X      [X  Z  @  .  Z  ]  t  F  ]  d    i  =d  1h      Lh  j     )   BJ                  
