#!/usr/local/qddb/bin/qtclsh

#
# print_invoice.tcl --
#     print_invoice is exec'd from invoices.tcl immediately
#     after processing an invoice.  print_invoice simply
#     searches the Invoices relation and then dumps the
#     resulting invoice form to stdout(should be piped to 
#     DEFAULT_PRINT_COMMAND
#     
#     This program can be launched from the command line.
#     Synopsis:  launch print_invoice <invoice #>
#
#

set ISPUTIL /var/lib/ISPutil
set ISPDBS $ISPUTIL/qdDBs

lappend auto_path . $qddb_library/fx $ISPUTIL/bin/library

global gv_myattr        ;# array to hold the invoice data
global gv_page          ;# page number displayed on invoice printout
global gv_fd            ;# always stdout, should be piped to lpr
global gv_max_items     ;# number of items charged on the invoice
global gv_v             ;# qddb view used to view the invoice data

#
# print_header --
#     fd is always stdout
#
set tcl_precision 17
proc print_header {fd} {
    global gv_myattr gv_page gv_fd

    incr gv_page
    puts $gv_fd ""
    puts $gv_fd [format "Invoice#: %s%40s %8s        Page: %3d" \
	    [string trim $gv_myattr(InvoiceNumber) " "] \
	    "Date: " \
	    [qddb_util formatdate "%m/%d/%y" today] \
	    $gv_page]
    puts $gv_fd "\n"
    puts $gv_fd [format "      %-28s               %-28s" \
	    "Bill To:" "Ship To:"]
    puts $gv_fd [format "      %-28s               %-28s" \
	    "$gv_myattr(Name.First) $gv_myattr(Name.Last)" \
	    "$gv_myattr(Name.First) $gv_myattr(Name.Last)"]
    puts $gv_fd [format "      %-28s               %-28s" \
	    $gv_myattr(Company) $gv_myattr(Company)]
    puts $gv_fd [format "      %-28s               %-28s" \
	    $gv_myattr(AddressBill.Street) \
	    $gv_myattr(AddressShip.Street)]
    puts $gv_fd [format "      %-28s               %-28s" \
	    "$gv_myattr(AddressBill.City), $gv_myattr(AddressBill.State) \
	    $gv_myattr(AddressBill.Zip)" \
	    "$gv_myattr(AddressShip.City), $gv_myattr(AddressShip.State) \
	    $gv_myattr(AddressShip.Zip)"]
    puts $gv_fd "\n"
    puts $gv_fd [format "Date of Invoice:   %8s" $gv_myattr(DateOfInvoice)]
    puts $gv_fd [format "Customer ID:   %5s" \
	    [string range $gv_myattr(Name.ID) 0 5]]
    puts $gv_fd [format "Sales Rep:         %3s" \
	    [string range $gv_myattr(SalesRep) 0 2]]
    puts $gv_fd [format "Method of Payment: %s" \
	    [string trim [string range $gv_myattr(MethodOfPayment) 0 9] " "]]
    puts $gv_fd "\n\n Qty   Ship   B/O        Part#              Description       Price       Total"
}

#
# print_driver --
#     Initialize housekeeping thingies like page#, lines,....bletch
#     Then, after printing the header, loop through all the
#     items printing away as you go.
#     (nice how the qddb_instance switch command works, huh :-)
#     You might have to change some constants to suit your printer,
#     such as the lines per page(30)...
#
proc print_driver {} { 
    global gv_myattr gv_page gv_max_items gv_fd gv_v

    set gv_page 0
    print_header $gv_fd
    set lines 0
    for {set i 1} {$i <= $gv_max_items} {incr i} {
	if {$i % 30 == 0} {
	    puts $gv_fd "\f"
	    print_header $gv_fd
	    set lines 0
	    incr lines
	}
	qddb_instance switch $gv_v Items $i
	puts $gv_fd [format "%5d %5d %5d %12s %24s    %8.2f    %8.2f" \
		$gv_myattr(Items.Qty) \
		$gv_myattr(Items.Ship) \
		$gv_myattr(Items.BackOrder) \
		$gv_myattr(Items.Part) \
		[string range $gv_myattr(Items.Desc) 0 19] \
		$gv_myattr(Items.UnitPrice) \
		$gv_myattr(Items.Total)]
    }
    set extra ""
    for {set i $lines} {$i <= 30} {incr i} {
	append extra "\n"
    }
    puts -nonewline $gv_fd $extra
    puts $gv_fd [format "\n%62s %10.2f" "Subtotal: " $gv_myattr(Subtotal)]
    puts $gv_fd [format "%62s %10.2f" "Tax: " $gv_myattr(Tax)]
    puts $gv_fd [format "%62s %10.2f" "Freight: " $gv_myattr(Freight)]
    puts $gv_fd [format "%62s %10.2f" "Total Charge: " $gv_myattr(TotalCharge)]
    close $gv_fd
}

#
# print_invoice --
#     Search the Invoice relation for given invoice_number
#     and set up the view to store the results.
#
proc print_invoice { invoice_number } {
    global gv_myattr gv_max_items gv_v ISPDBS

    set tmp_s [qddb_schema open $ISPDBS/Invoices]
    set k [qddb_search $tmp_s -prunebyattr InvoiceNumber word $invoice_number]
    set k1 [qddb_keylist get $k]
    set t [isUniqueTuple $k1 $tmp_s]
    if { $t == "" } {
	puts "Invoice # $invoice_number not found."
	exit
    }
    set gv_v [qddb_view define $t {
	{ InvoiceNumber        gv_myattr(InvoiceNumber) }
	{ DateOfInvoice        gv_myattr(DateOfInvoice) }
	{ Clock                gv_myattr(Clock) }
	{ Company              gv_myattr(Company) }
	{ Name.First           gv_myattr(Name.First) }
	{ Name.Last            gv_myattr(Name.Last) }
	{ Name.ID              gv_myattr(Name.ID) }
	{ Phone.Desc           gv_myattr(Phone.Desc) }
	{ Phone.Area           gv_myattr(Phone.Area) }
	{ Phone.Number         gv_myattr(Phone.Number) }
	{ AddressBill.Street   gv_myattr(AddressBill.Street) }
	{ AddressBill.City     gv_myattr(AddressBill.City) }
	{ AddressBill.State    gv_myattr(AddressBill.State) }
	{ AddressBill.Zip      gv_myattr(AddressBill.Zip) }
	{ AddressShip.Street   gv_myattr(AddressShip.Street) }
	{ AddressShip.City     gv_myattr(AddressShip.City) }
	{ AddressShip.State    gv_myattr(AddressShip.State) }
	{ AddressShip.Zip      gv_myattr(AddressShip.Zip) }
	{ Items.ItemNumber     gv_myattr(Items.ItemNumber) }
	{ Items.BackOrder      gv_myattr(Items.BackOrder) }
	{ Items.Ship           gv_myattr(Items.Ship) }
	{ Items.Qty            gv_myattr(Items.Qty) }
	{ Items.Part           gv_myattr(Items.Part) }
	{ Items.Desc           gv_myattr(Items.Desc) }
	{ Items.UnitPrice      gv_myattr(Items.UnitPrice) }
	{ Items.DiscountRate   gv_myattr(Items.DiscountRate) }
	{ Items.Tax            gv_myattr(Items.Tax) }
	{ Items.Total          gv_myattr(Items.Total) }
	{ SalesRep             gv_myattr(SalesRep) }
	{ MethodOfPayment      gv_myattr(MethodOfPayment) }
	{ SSN                  gv_myattr(ssn) }
	{ CreditCard           gv_myattr(CreditCard) }
	{ DateOfExp            gv_myattr(DateOfExp) }
	{ PurchaseOrder        gv_myattr(PurchaseOrder) }
	{ Subtotal             gv_myattr(Subtotal) }
	{ Tax                  gv_myattr(Tax) }
	{ AfterTax             gv_myattr(AfterTax) }
	{ Freight              gv_myattr(Freight) }
	{ TotalCharge          gv_myattr(TotalCharge) }
	{ Payment              gv_myattr(Payment) }
	{ Reseller             gv_myattr(Reseller) }
	{ Comments             gv_myattr(Comments) }}]
    set gv_max_items [qddb_instance maxnum $gv_v Items]
    print_driver
    qddb_tuple delete $t
    qddb_keylist delete $k
    qddb_keylist delete $k1
    qddb_schema close $tmp_s
}

#
# Append the necessary utils libraries
#
if {$argc != 1} {
    puts "Usage: launch print_invoice <invoice number>"
    exit
}
set gv_fd stdout
print_invoice [lindex $argv 0]
