compile function CUST_ACTIVITY_RPT1() begin condition pre: post: end condition declare function msg, set_property, send_event, dialog_box, utility, get_property declare function set_printer, fieldcount, key_sort, ex_vm_rem, Printer_Select declare subroutine rlist, or_view, activate_save_select, yield, extract_si_keys declare subroutine update_index, btree.extract $insert logical $insert rlist_equates $insert msg_equates $insert names_equates $insert quote_equ $insert quote_spec_equ $insert invoice_equ $insert order_equ $insert company_equ $insert annual_contracts_equ $insert oiprint_equates $insert prod_spec_equ Params = dialog_box( 'CUST_ACTIVITY_RPT1', @window, '*CENTER' ) if Params = 'CANCEL' or Params = '' then return 0 end Stat = utility( 'CURSOR', 'H' ) convert '*' to @fm in Params CustNo = Params<1> Time = Params<2> ;* prev mo, prev qtr, prev year if this param has a value then ;* ignore param 3 and 4 StartDate = Params<3> ;* they specified a certain date range start EndDate = Params<4> ;* " " " " " " end OrderStat = Params<5> ;* open, closed or all orders QuoteStat = Params<6> ;* orders only or all quotes DirToPrinter = Params<7> PrintSpecOnly= Params<8> Today = date() TodayOut = oconv( Today, 'D4/' ) if Time <> '' then * set StartDate and EndDate to actual dates if a Time was choosen Months = '1/2/3/4/5/6/7/8/9/10/11/12' DaysInMonth = '31/28/31/30/31/30/31/31/30/31/30/31' convert '/' to @fm in Months convert '/' to @fm in DaysInMonth * setup quarters CurYear = field(TodayOut,'/',3) Q1S = iconv( '1/1/':CurYear, 'D' ) Q1E = iconv( '3/31/':CurYear, 'D' ) Q2S = iconv( '4/1/':CurYear, 'D' ) Q2E = iconv( '6/30/':CurYear, 'D' ) Q3S = iconv( '7/1/':CurYear, 'D' ) Q3E = iconv( '9/30/':CurYear, 'D' ) Q4S = iconv( '10/1/':CurYear, 'D' ) Q4E = iconv( '12/31/':CurYear, 'D' ) begin case case Time = 'Previous Month' PrevMonth = ((field(TodayOut,'/',1)+0)-1) YrToUse = field(TodayOut,'/',3) if PrevMonth = 0 then * in other words it is january so the previous would be december * so also need to set to previous year PrevMonth = 12 YrToUse -=1 end StartDate = PrevMonth:'/1/':YrToUse if PrevMonth = 2 then * see if it is leap year if len(iconv(PrevMonth:'/29/':YrToUse, 'D')) then EndDate = PrevMonth:'/29/':YrToUse end else EndDate = PrevMonth:'/28/':YrToUse end end else MonthDays = DaysInMonth EndDate = PrevMonth:'/':MonthDays:'/':YrToUse end case Time = 'Previous Qtr' * what quarter are we in begin case case Today >= Q1S and Today <= Q1E * use previous year quarter StartDate = '10/1/':CurYear-1 EndDate = '12/31/':CurYear-1 case Today >= Q2S and Today <= Q2E StartDate = oconv( Q1S, 'D2/' ) EndDate = oconv( Q1E, 'D2/' ) case Today >= Q3S and Today <= Q3E StartDate = oconv( Q2S, 'D2/' ) EndDate = oconv( Q2E, 'D2/' ) case Today >= Q4S and Today <= Q4E StartDate = oconv( Q3S, 'D2/' ) EndDate = oconv( Q3E, 'D2/' ) end case case Time = 'Previous Year' PrevYear = (field(TodayOut,'/',3)-1) StartDate = '1/1/':PrevYear EndDate = '12/31/':PrevYear end case end gosub PrinterInit Font<2> = 12 Void = set_printer( 'FONT', Font ) ***************** program logic flow ******************************** *1) print customer information *2) retrieve all annual contracts and print info if none don't print *3) retrieve all quotes and loop through *4) with each quote find orders used in that time frame and print info *5) if order open print balance information ********************************************************************* *(1) STEP ONE CustRec = xlate( 'COMPANY', CustNo, '', 'X' ) Lout = 'Customer Information for ':CustRec Table = '' Table<-1> = Lout TableColInfo = '^+10973' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Table = 'Bill to Information':@vm:'Ship to Information' TableColInfo = '^+5486':@vm:'^+5486' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Table = '' BTAddr = CustRec swap @vm with ' ' in BTAddr STAddr = CustRec swap @vm with ' ' in STAddr Table<-1> = 'Attn:':@vm:CustRec:@vm:'Attn:':@vm:CustRec Table<-1> = 'Company:':@vm:CustRec:@vm:'Company:':@vm:CustRec Table<-1> = 'Address:':@vm:BTAddr:@vm:'Address:':@vm:STAddr Table<-1> = 'City:':@vm:CustRec:@vm:'City:':@vm:CustRec Table<-1> = 'State:':@vm:CustRec:@vm:'State:':@vm:CustRec Table<-1> = 'Zip:':@vm:CustRec:@vm:'Zip:':@vm:CustRec TableColInfo = '<+1440':@vm:'<+4046':@vm:'<+1440':@vm:'<+4046' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Void = set_printer( 'TEXT', '' ) *(2) STEP TWO open 'DICT.ANNUAL_CONTRACTS' to DictAnnConTable else MsgInfo = '' MsgInfo = -2 MsgInfo = -2 MsgInfo = 'Unable to open DICT.ANNUAL_CONTRACTS...' void = msg( '', MsgInfo ) return 0 end SearchStr = '' SearchStr<-1> = 'CUST_NO':@vm:CustNo SearchStr<-1> = 'STATUS':@vm:'O' ;* force to open talk to Ray Krummen SearchStr:= @fm Flag = '' btree.extract( SearchStr, 'ANNUAL_CONTRACTS', DictAnnConTable, ACKeys, '', Flag ) if Flag <> 0 then MsgInfo = '' MsgInfo = -2 MsgInfo = -2 MsgInfo = 'Error while extracting ANNUAL CONTRACT records...' Void = msg( '', MsgInfo ) return 0 end if ACKeys then convert @vm to @fm in ACKeys ACKeys = key_sort( ACKeys, 'ANNUAL_CONTRACTS', 'ENTRY_DATE', 1 ) * open annual contracts report on them ACCnt = fieldcount( ACKeys, @fm ) for i = 1 to ACCnt ThisACRec = xlate( 'ANNUAL_CONTRACTS', ACKeys, '', 'X' ) Table = '' Lout = 'B L A N K E T':fmt('','L#3'):'O R D E R # ':ACKeys Table<-1> = Lout TableColInfo = '<+10080' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Table = '' Lout = '' *Void = set_printer( 'TEXT', 'Contract Date from ':oconv(ThisACRec, 'D2/' ):' to ':oconv(ThisACRec, 'D2/' )) Table = '' Table<-1> = 'Contract Start ':oconv(ThisACRec,'D2/'):@vm:'Contract End ':oconv(ThisACRec,'D2/') Table<-1> = 'Cust PO# ':ThisACRec:@vm:'Quote# ':ThisACRec Table<-1> = 'Orig$ ':oconv( ThisACRec, 'MD2,$' ):@vm:'Balance ':oconv( xlate( 'ANNUAL_CONTRACTS', ACKeys, 'BALANCE', 'X' ), 'MD2,$' ) TableColInfo = '<+5040':@vm:'<+5040' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Table = '' if ThisACRec <> '' then TNote = ThisACRec convert @tm to ' ' in TNote TNote = trim(TNote) Table = 'Description: ':TNote TableColInfo = '<+10080' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_BOX) end next i Void = set_printer('TEXT', '') end *(3) STEP THREE QuoteKeys = xlate( 'COMPANY', CustNo, 'QUOTE_KEYS', 'X' ) convert @vm to @fm in QuoteKeys QuoteKeys = key_sort( QuoteKeys, 'QUOTE', 'ENTRY_DATE', 1 ) QKcnt = fieldcount( QuoteKeys, @fm ) open 'DICT.ORDER' to DictOrderTable else MsgInfo = '' MsgInfo = 'Unable to open DICT.ORDER...' MsgInfo = -2 MsgInfo = -2 void = msg( '', MsgInfo ) return 0 end OrdSearchAdd = '' if OrderStat = 'Open Orders' then OrdSearchAdd = 'STATUS':@vm:'O' end else if OrderStat = 'Closed Orders' then OrdSearchAdd = 'STATUS':@vm:'C' end * if not then it is set to all so no need for OrdSearchAdd end for i = 1 to QKcnt ThisQuote = QuoteKeys QuoteRec = xlate( 'QUOTE', ThisQuote, '', 'X' ) if PrintSpecOnly then gosub PrintQuoteSpec end else * show the order detail SearchStr = '' SearchStr<-1> = 'QUOTE_IDS':@vm:ThisQuote SearchStr<-1> = 'ENTRY_DATE':@vm:StartDate:'...':EndDate if OrdSearchAdd then SearchStr<-1> = OrdSearchAdd end * EXPLAIN TO RAY THAT WHEN CHOOSING QUOTED PRODUCTS IT WILL SHOW QUOTES THAT WERE NOT * ORDERED IN THAT TIME FRAME BUT MAY HAVE BEEN ORDERED IN SOME OTHER TIME FRAME SearchStr := @fm btree.extract( SearchStr, 'ORDER', DictOrderTable, OrderKeys, '', Flag ) if Flag <> 0 then MsgInfo = '' MsgInfo = 'Error while extracting ORDER records...' MsgInfo = -2 MsgInfo = -2 Void = msg( '', MsgInfo ) return 0 end if OrderKeys then if QuoteStat = 'Ordered Products' then * orders placed with this quote gosub PrintQuoteSpec convert @vm to @fm in OrderKeys OrderKeys = key_sort( OrderKeys, 'ORDER', 'ENTRY_DATE', 1 ) OKCnt = fieldcount( OrderKeys, @fm ) for j = 1 to OKCnt ThisOrder = OrderKeys OrderRec = xlate( 'ORDER', ThisOrder, '', 'X' ) * NEED TO LOOP THROUGH QUOTE_IDS AND GET ONLY THE CORRECT ONES * AND ADD UP QTY PRICE AND SRP * quote order vars OrderStatus = OrderRec PO = OrderRec oQty = 0 oPrice = '' oSRP = 0 oTot = 0 oSetup = 0 WO = '' PartNum = '' * total order vars OrderDate = oconv(OrderRec, 'D2/') TotOrdAmt = xlate( 'ORDER', OrderKeys, 'TOTAL_AMOUNT', 'X' ) InvAmt = 0 BalInvAmt = 0 NonInvAmt = 0 InvNos = '' * end total order vars * FOR WORK ORDER AND PART NUMBER WILL REPORT ON THE FIRST LINE ITEM THAT * USED THAT QUOTE QIdCnt = fieldcount( OrderRec, @vm ) for k = 1 to QIdCnt if OrderRec = ThisQuote then * this line item is using the current quote so add up qty, price, srp if WO = '' then WO = OrderRec end if PartNum = '' then PartNum = OrderRec end oQty += OrderRec TPrice = OrderRec if oPrice = '' then oPrice = TPrice ;* should always be the same price per wafer for same spec ;* if not we have some major concerns at Epitronics Silicon Division end oSRP += OrderRec oSetup += OrderRec end next k * NEED TO SHOW INVOICING INFO * NEED TO EXPLAIN THAT ORDER IS CLOSED WHEN PRODUCT IS SHIPPED * BUT INVOICE STAYS OPEN UNTIL PAID * NEED TO EXPLAIN TO RAY THAT THERE IS NO WAY OF TELLING ON A PARTIAL PAYMENT * OF A MULTIPLE QUOTE(PRODUCT) INVOICE WHICH PART IT WAS APPLIED TO. * SO I AM SIMPLY GOING TO SHOW THE TOTAL INVOICED AMOUNT FOR THIS ORDER * BALANCE OF THE INVOICED AMOUNT AND THE DIFFERECE IS THE NON INVOICED AMOUNT * MEANING THE PRODUCT HAS NOT RUN...USE THE PO TO GO AGAINST INVOICES extract_si_keys( 'INVOICE', 'PO', PO, TInvIds ) tIcnt = fieldcount( TInvIds, @vm ) if tIcnt then * we have invoices so show balance information InvNos = TInvIds swap @vm with '; ' in InvNos InvAmt = sum(xlate( 'INVOICE', TInvIds, 'INVOICE_AMOUNT', 'X' )) BalInvAmt = sum(xlate( 'INVOICE', TInvIds, 'BALANCE', 'X' )) NonInvAmt = (TotOrdAmt-InvAmt) end else * no invoices created so the balance is the original order amt BalInvAmt = TotOrdAmt NonInvAmt = TotOrdAmt end * print total order info Lout = 'TOTAL ORDER INFO FOR ORDER# ':ThisOrder Table = '' Table<-1> = Lout TableColInfo = '<+11073' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Table = '' Lout = '' Table<-1> = 'Date':@vm:'Order Amt':@vm:'Invoice Amt':@vm:'Non Invoice Amt':@vm:'Balance':@vm:'Invoice Nos' Lout = OrderDate:@vm Lout:= oconv(TotOrdAmt,'MD2,$'):@vm Lout:= oconv(InvAmt,'MD2,$'):@vm Lout:= oconv(NonInvAmt,'MD2,$'):@vm Lout:= oconv(BalInvAmt,'MD2,$'):@vm Lout:= InvNos Table<-1> = Lout TableColInfo = '<+1080':@vm:'<+1800':@vm:'<+1800':@vm:'<+1987':@vm:'<+1800':@vm:'<+2606' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Lout = 'ORDER INFO FOR QUOTE# ':ThisQuote Table = '' Table<-1> = Lout TableColInfo = '<+11073' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Table = '' Lout = '' Table<-1> = 'PO#':@vm:'WO#':@vm:'Part Num':@vm:'Qty':@vm:'Price':@vm:'SRP':@vm:'Setup':@vm:'Total' Lout = PO:@vm Lout:= WO:@vm Lout:= PartNum:@vm Lout:= oQty:@vm Lout:= oconv(oPrice,'MD2,$'):@vm Lout:= oconv(oSRP,'MD2,$'):@vm Lout:= oconv(oSetup,'MD2,$'):@vm Lout:= oconv( ((oQty*oPrice)+oSRP+oSetup), 'MD2,$' ) Table<-1> = Lout TableColInfo = '<+1714':@vm:'<+1440':@vm:'<+1440':@vm:'<+907':@vm:'<+1267':@vm:'<+1267':@vm:'<+1267':@vm:'<+1771' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Void = set_printer( 'TEXT', '' ) next j end else * the user choose 'Quoted Products' and we have orders so skip * this Quote ******************* SKIP THE QUOTE *************************** end end else * no orders against this Quote check to see if the user choose Quoted Products if QuoteStat = 'Quoted Products' then gosub PrintQuoteSpec end * only print the quote and specification there are no orders against this quote * so no need to print anything end end next i ;* looping through quotes Void = set_printer( 'TERM', 1 ) Stat = utility( 'CURSOR', 'A' ) return 0 *================================================================================================* PrinterInit: * initialize the printer and set the headings if DirToPrinter = 'Yes' then OutputParam = 0 end else OutputParam = 3 ;* maximized print preview end PrintPath = Printer_Select('',1) ;* Get default printer path Void = set_printer( 'INIT', '', '', '', '', OutputParam.PrintPath ) TheHeader = "C U S T O M E R":fmt('','L#3'):"A C T I V I T Y":fmt('','L#3'):"R E P O R T":fmt('','L#10'):"(":StartDate:" - ":EndDate:")":fmt('','L#10'):" Page #'P'" Font = 'Times New Roman,14,L,1' ;* 14 point, Left just, Bold convert ',' to @fm in font ;* Use @FM delimiter Void = set_printer( 'FONTHEADFOOT', font ) Void = set_printer( 'HEADER', TheHeader, '', '' ) return *================================================================================================* PrintQuoteSpec: * first prin quote specification information Lout = 'Q U O T A T I O N / S P E C I F I C A T I O N':fmt('','L#3'):'I N F O R M A T I O N' Table = '' Table<-1> = Lout TableColInfo = '<+11073' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Table = '' Table<-1> = 'Quote#':@vm:'Status':@vm:'Contact Name':@vm:'Contact Phone':@vm:'Contact Fax' Lout = '' Lout := ThisQuote:@vm Lout := oconv(QuoteRec,'[QUOTE_STATUS_CONV]'):@vm Lout := xlate( 'NAMES', QuoteRec, 'FIRST_LAST', 'X' ):@vm NameRec = xlate( 'NAMES', QuoteRec, '', 'X' ) Tphone = oconv( NameRec, '[PHONE_FORMAT]' ) TExtension = NameRec if TExtension then TPhone := ' X':Textension end Lout := TPhone:@vm Tfax = oconv( QuoteRec, '[PHONE_FORMAT]' ) if Tfax then * had a fax on quote so ok Lout := Tfax end else * no fax so set it to international fax if blank then it has neither Lout := QuoteRec end Table<-1> = Lout TableColInfo = '<+1440':@vm:'<+1440':@fm:'<+2434':@vm:'<+2880':@vm:'<+2880' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Lout = 'S U B S T R A T E':fmt('','L#3'):'I N F O R M A T I O N' Table = '' Table<-1> = Lout TableColInfo = '<+11073' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) PSNId = QuoteRec SpecSubstrate = xlate( 'PROD_SPEC', PSNId, prod_spec_spec_substrate$, 'X' ) Table = '' Table<-1> = 'Diameter':@vm:'Type':@vm:'Dopant':@vm:'Orientation':@vm:'Resistivity':@vm:'Bur Lay1':@vm:'Bur Lay2':@vm:'Bur Lay3' Lout = '' Lout := SpecSubstrate<1,QSSubWafersize$>:@vm Lout := SpecSubstrate<1,QSSubType$>:@vm Lout := SpecSubstrate<1,QSSubDopant$>:@vm Lout := SpecSubstrate<1,QSSubOrientation$>:@vm Lout := SpecSubstrate<1,QSSubResistivity$>:@vm Lout := SpecSubstrate<1,QSSubBl1Dopant$>:@vm Lout := SpecSubstrate<1,QSSubBl2Dopant$>:@vm Lout := SpecSubstrate<1,QSSubBl3Dopant$> Table<-1> = Lout TableColInfo = '<+1714':@vm:'<+720':@vm:'<+1440':@vm:'<+1440':@vm:'<+1440':@vm:'<+1440':@vm:'<+1440':@vm:'<+1440' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) Lout = 'E P I':fmt('','L#3'):'I N F O R M A T I O N' Table = '' Table<-1> = Lout TableColInfo = '<+11073' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) EpiLayers = xlate( 'PROD_SPEC', PSNId, prod_spec_spec_epi$, 'X' ) *convert char(247) to @fm in EpiLayers ;* each seperate layer *SepLCnt = fieldcount( EpiLayers, @fm) ******SEPERATE REACTOR LAYERS********************************* * NO MORE SEPARATE REACTOR LAYERS DEFINED IN SPEC * SO HAD TO MODIFY THIS CODE TO LOOK AT PRIOR psnids AS THESE * ARE CONSIDERED SEPARATE LAYERS PrevPSNs = QuoteRec PrevPSNs:= @vm:QuoteRec * TACK ON THE PROD_SPEC_ID PrevPSNs = ex_vm_rem( PrevPSNs ) SepLCnt = fieldcount( PrevPSNs, @vm) TrueLayer = 0 Table = '' Table<-1> = 'Layer':@vm:'Dopant':@vm:'Thick Min':@vm:'Thick Max':@vm:'Res Min':@vm:'Res Max' * print epi layer headings TableColInfo = '^+1440':@vm:'^+2880':@vm:'^+1699':@vm:'^+1684':@vm:'^+1684':@vm:'^+1684' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) for n = 1 to SepLCnt ******SEPERATE REACTOR LAYERS**************************** TrueLayer += 1 ThisSepLayer = xlate( 'PROD_SPEC', PrevPSNs<1,n>, prod_spec_spec_epi$, 'X' ) Table = '' Lout = TrueLayer:@vm Lout:= ThisSepLayer<1,QSEpiDopant$>:@vm Lout:= oconv(ThisSepLayer<1,QSEpiMinThick$>,'MD2'):@vm Lout:= oconv(ThisSepLayer<1,QSEpiMaxThick$>,'MD2'):@vm Lout:= oconv(ThisSepLayer<1,QSEpiResMinThick$>,'MD3'):@vm Lout:= oconv(ThisSepLayer<1,QSEpiResMaxThick$>,'MD3') Table<-1> = Lout TableColInfo = '^+1440':@vm:'^+2880':@vm:'^+1699':@vm:'^+1684':@vm:'^+1684':@vm:'^+1684' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) ******SAME REACTOR LAYERS********************************* convert char(248) to @fm in ThisSepLayer RestOfLayers = field( ThisSepLayer, @fm, 2, 9999 ) RolCnt = fieldcount( RestOfLayers, @fm ) for o = 1 to RolCnt TrueLayer += 1 ThisSameLayer = RestOfLayers Table = '' Lout = TrueLayer:@vm Lout:= ThisSepLayer<1,QSEpiDopant$>:@vm Lout:= oconv(ThisSameLayer<1,QSEpiMinThick$>,'MD2'):@vm Lout:= oconv(ThisSameLayer<1,QSEpiMaxThick$>,'MD2'):@vm Lout:= oconv(ThisSameLayer<1,QSEpiResMinThick$>,'MD3'):@vm Lout:= oconv(ThisSameLayer<1,QSEpiResMaxThick$>,'MD3') Table<-1> = Lout TableColInfo = '^+1440':@vm:'^+2880':@vm:'^+1699':@vm:'^+1684':@vm:'^+1684':@vm:'^+1684' x = Set_Printer("ADDTABLE", TableColInfo, '', Table, '', '', 1, TB_ALL) next o ;* same reactor layer ******END SAME REACTOR LAYERS***************************** next n ;* seperate reactor layer *******END SEPERATE REACTOR LAYERS*************************** * NOW PRINT THE QUOTE COMMENTS if QuoteRec <> '' then TNote = QuoteRec convert @tm to ' ' in TNote TNote = trim(TNote) Table = 'Comments: ':TNote TableColInfo = '<+11073' x = Set_Printer("ADDTABLE", TableColInfo, '', '', 1, TB_BOX) end Void = set_printer( 'TEXT', '' ) return *================================================================================================*