xheadertext = 'YOUR ORGANIZATION';
* set the fill color in the view using
* $fpdf->xheadercolor = array(0,0,100); (r, g, b)
* set the font in the view using
* $fpdf->setHeaderFont(array('YourFont','',fontsize));
*/
function Page1Header() {
list($r, $b, $g) = $this->xheadercolor;
//$this->setY(10); // shouldn't be needed due to page margin, but helas, otherwise it's at the page top
$this->SetFillColor(255, 255, 255);
$this->SetTextColor(0 , 0, 152); //Set the Text Color to Blue
// $this->Image($file, $x, $y, $w, $h, $type, $link, $align, $resize, $dpi, $palign, $ismask, $imgmask, $border, $fitbox, $hidden)
$this->Image(K_PATH_IMAGES.'cmclogosmall.jpg', 10, 10, 30, 0, null, 'http://www.cmctechnologies.com.au', null, false, null, 'L');
$this->Cell(30);
$this->SetFont('times', 'B');
$this->SetFontSize(30);
$this->Cell(0,0, $this->xheadertext, 0,1,'C', 1);
$this->SetFontSize(10);
$this->SetY(22);
$this->Cell(30);
$this->Cell(0,0, "PTY LIMITED ACN: 47 085 991 224 ABN: 47 085 991 224", 0, 1, 'C', 1);
$this->Rect($this->GetX()+33, $this->GetY()+2, 157, 2, 'DF', array('width'=>0), array(0, 0, 0));
/* Start the contact details */
$this->SetTextColor(0); //Set the Text Color to Black
$this->MultiCell(18, 0, "Phone:\nFax:\nEmail:\nWeb Site:\n", 0, 'L', 0, 0, 45, 32);
$this->MultiCell(50, 0, "+61 2 9669 4000
+61 2 9669 4111
sales@cmctechnologies.com.au
www.cmctechnologies.com.au
", 0, 'L', 0, 0, 65, null, true, 0, true);
$this->MultiCell(50, 0, "Unit 19, 77 Bourke Rd\nAlexandria\nNSW 2015\nAUSTRALIA\n", 0, 'L', 0, 0, 150, null);
$this->SetTextColor(0 , 0, 152); //Set the Text Color to Blue
$this->SetFont('times', 'B');
$this->MultiCell(30, 20, "Engineering &\nIndustrial\nInstrumentation", 0, 'L', 0, 1, 10,37);
}
/**
* Overwrites the default footer
* set the text in the view using
* $fpdf->xfootertext = 'Copyright © %d YOUR ORGANIZATION. All rights reserved.';
*/
function Page1Footer() {
$this->SetY(-20);
$this->Image(K_PATH_IMAGES.'cmcfooter.jpg', null, 255, 200, 0, null, 'http://www.cmctechnologies.com.au', null, false, null, 'C');
}
/**
* For Quotes and (hopefully) Invoices. Identifies who the document is for, date, reference number, etc.
*/
function DetailsBox($companyName, $emailTo, $attention, $fromName, $fromEmail, $enquiryNumber, $your_reference) {
$this->SetTextColor(0); //Black Text
$boxYstart = 45;
$boxXstart = 10;
$firstColWidth = 40;
$secondColWidth = 70;
$thirdColWidth = 30;
$fourthColWidth = -10;
$pageNo = $this->PageNoFormatted();
$this->SetXY($boxXstart, 55);
$heightNeeded = $this->getNumLines($companyName, $secondColWidth);
$lineHeight = 6.40997; //Size of a single line of text. If the company name is more, multiply this by the number of lines it needs.
$this->MultiCell($firstColWidth, $lineHeight*$heightNeeded, "QUOTATION TO:", 'LTR', 'L', 0, 0);
$this->MultiCell($secondColWidth, $lineHeight*$heightNeeded, $companyName, 'LTR', 'L', 0, 0);
$this->MultiCell($thirdColWidth, $lineHeight*$heightNeeded, "FROM:", 'LT', 'L', 0, 0);
$this->MultiCell($fourthColWidth, $lineHeight*$heightNeeded, "$fromName", 'TR', 'L', 0, 1, null,null, true,0,true); //Start a new line after this.
$this->MultiCell($firstColWidth, 0, "EMAIL TO:", 'LR', 'L', 0, 0);
$this->MultiCell($secondColWidth, 0, "$emailTo", 'LR','L', 0, 0, null, null, true, 0, true);
$this->MultiCell($thirdColWidth, 0, "CMC REF#:", 'L', 'L', 0, 0);
$this->MultiCell($fourthColWidth, 0, $enquiryNumber, 'R', 'L', 0, 1); //Start a new line after thi
$this->MultiCell($firstColWidth, 0, "ATTENTION:", 'LRB', 'L', 0, 0);
$this->MultiCell($secondColWidth, 0, $attention, 'LRB', 'L', 0, 0);
$this->MultiCell($thirdColWidth, 0, "PAGE: ", 'LB', 'L', 0, 0);
$this->MultiCell($fourthColWidth, 0, "$pageNo of {nb}", 'BR', 'L', 0, 1);
$todaysDateString = date('l, j F Y');
$this->MultiCell($firstColWidth + $secondColWidth, 0, "DATE: $todaysDateString", 'LRB', 'L', 0, 0);
$this->MultiCell($thirdColWidth, 0, "YOUR REF: ", 'LB', 'L', 0, 0);
$this->MultiCell($fourthColWidth, 0, $your_reference, 'BR', 'L', 0, 1);
$this->SetFontSize(6);
//Kinda lame that I cant seem to wrap this text nicer. But Whatever.
$this->MultiCell(0, 0, 'The information in this document is confidential and may be privileged. If you are not the indended recipient then access, disclosure, copying or other dissemination of the contents of t his message is unauthorised and may be unlawful. Please inform the sender immediately if you are not the intended addressee.',
'', 'L'
);
}
function continuedHeader($cmcRef) {
$this->Image(K_PATH_IMAGES.'cmclogosmall.jpg', 10, 10, 15, 13.6, null, 'http://www.cmctechnologies.com.au', null, false, null, 'L');
$this->SetFontSize(10);
$pageNo = $this->PageNoFormatted();
$currentX = $this->GetX();
$this->SetX($currentX + 40);
$this->MultiCell(100, 13.6, $cmcRef." CONTINUES", '','C', 0, 0);
$this->MultiCell(0,13.6, "PAGE $pageNo OF {nb}", '', 'R');
//$this->MultiCell($w, $h, $txt, $border, $align, $fill, $ln, $x, $y, $reseth, $stretch, $ishtml)
//$this->Image($file, $x, $y, $w, $h, $type, $link, $align, $resize, $dpi)
}
/**
*
* @param $principleName
* @param $currency
* @param int $gst - 0 or 1 if GST is applicable.
* @param $products
* @param String $docType - the model name of the Products we want to put in the table. ie. QuoteProduct, or InvoiceProduct, etc
* @param Map $commercialDetails - the details array/map - passed to commercialComments()
*/
function productPage($principleName, $currency,$gst, $products ,$docType, $commercialDetails) {
$this->SetFontSize(10);
$lineHeight = 5; //Size of a single line of text. If the company name is more, multiply this by the number of lines it needs
$itemColwidth = 12;
$qtyColwidth = 10;
$descColwidth = 120;
$unitpriceColwidth = 25;
$totalPricColwidth = -10;
$this->SetFillColor(240);
//$heightNeeded = $this->getNumLines("ITEM\NO.", $itemColwidth);
//echo "HEADER ROW HEIGHT IS $heightNeeded";
/* Need to work out how many Pages the Product Table will need to be split over */
//echo "Product Page height is: ".$this->getPageHeight();
$availableHeight = 253; //Figured out experimentally. Approx 253mm of space left for the actual table data after the header rows.
// echo "Remaining space on the page is: $availableHeight
";
$pagesRequired = 1;
$theseProductsHeight = 0;
$remainingHeight = $availableHeight;
$pageProducts = array(); //Array in the form $pageProducts[$pageNumber] = NUMBER_OF_ITEMS_ON_THIS_PAGE
foreach ($products as $product) {
$fullDesc = "".$product[$docType]['title'].'
'.$product[$docType]['description'];
$linesNeeded = $this->getNumLines($fullDesc, $descColwidth);
$mmNeeded = $linesNeeded*$lineHeight;
if($remainingHeight - $mmNeeded <= 0) {
$pagesRequired++;
$remainingHeight = $availableHeight; //Start checking the next page;
$remainingHeight -= $mmNeeded;
$pageProducts[$pagesRequired][] = $product;
}
else {
$remainingHeight -= $mmNeeded;
$pageProducts[$pagesRequired][] = $product;
}
/* Reached the last product in this Product Table.
* Need to see if we still have enough room to print the totals, if not will need to put the last item on a new page.
*/
if(end($products) == $product) {
}
}
//print_r($pageProducts[1]);
//echo "We need to make $pagesRequired product pages
";
$subTotal = 0;
for($i=1; $i<=$pagesRequired; $i++) {
$this->AddPage();
//Draw Header Rows
$pageNo = $this->PageNoFormatted();
$this->MultiCell(0, 0, "PAGE $pageNo OF {nb}", 0, "R", 0, 1);
$this->MultiCell(0, 0, "PRICING & SPECIFICATIONS", 0, "C", 0, 1);
$this->MultiCell($itemColwidth, 0, "ITEM\nNO.", 1, "C", 1, 0);
$heightNeeded = $this->getLastH();
/**
* @todo this seems like a cleaner way of doing it than I did in the detailsBox(). Revise at some point
*/
$this->MultiCell($qtyColwidth, $heightNeeded, "QTY", 1, "C", 1, 0);
$this->MultiCell($descColwidth, $heightNeeded, "DESCRIPTION", 1, "C", 1, 0);
$this->MultiCell($unitpriceColwidth, $heightNeeded, "UNIT\nPRICE", 1, "C", 1, 0);
$this->MultiCell($totalPricColwidth, $heightNeeded, "TOTAL\nPRICE", 1, "C", 1, 1);
//Header Line 2
$this->MultiCell($itemColwidth, 0, "", 1, "C", 1, 0);
$heightNeeded = $this->getLastH();
$this->MultiCell($qtyColwidth, $heightNeeded, "", 1, "C", 1, 0);
$this->MultiCell($descColwidth, $heightNeeded, $principleName, 1, "C", 1, 0);
$this->MultiCell($unitpriceColwidth, $heightNeeded, $currency['iso4217'], 1, "C", 1, 0);
$this->MultiCell($totalPricColwidth, $heightNeeded, $currency['iso4217'], 1, "C", 1, 1);
//Start Printing Product cells, until we run out of room. Then continue on the next page
foreach($pageProducts[$i] as $product) {
$fullDesc = "".$product[$docType]['title'].'
'.$product[$docType]['description'];
$currentX = $this->GetX();
$currentY = $this->GetY();
$this->SetX($currentX + $itemColwidth + $qtyColwidth);
$this->MultiCell($descColwidth, 0, $fullDesc, 1, "L", 0, 0, null, null, true, 0, true);
$endOfDesc = $this->GetX();
$heightNeeded = $this->getLastH();
$this->SetX($currentX);
$this->MultiCell($itemColwidth, $heightNeeded, number_format($product[$docType]['item_number'], 1, '.', ''), 1, "C", 0, 0);
$this->MultiCell($qtyColwidth, $heightNeeded, $product[$docType]['quantity'], 1, "C", 0, 0);
$this->SetX($endOfDesc);
$this->MultiCell($unitpriceColwidth, $heightNeeded, $this->formatCurrency($currency['symbol'], $product[$docType]['unit_price']), 1, "C", 0, 0);
$thisTotalPrice = $product[$docType]['quantity']*$product[$docType]['unit_price'];
$this->MultiCell($totalPricColwidth, $heightNeeded, $this->formatCurrency($currency['symbol'],$thisTotalPrice), 1, "C", 0, 1);
$subTotal += $thisTotalPrice;
$lastY = $this->GetY();
$lastX = $this->GetX();
//echo $product[$docType]['item_number']." Last X is $lastX, Last Y is $lastY
";
if(end($pageProducts[$pagesRequired]) == $product) {
//$this->MultiCell($w, $h, $txt, $border, $align, $fill, $ln, $x, $y, $reseth, $stretch, $ishtml, $autopadding);
$this->MultiCell($itemColwidth, 6, "", 1, 'C', 0, 0);
$this->MultiCell($qtyColwidth, 6, "", 1, 'C', 0, 0);
$this->MultiCell($descColwidth, 6, "SUB-TOTAL (EXCLUDING GST)", 1, 'L', 0, 0);
$this->MultiCell($unitpriceColwidth, 6, "", 1, 'C', 0, 0);
$this->MultiCell($totalPricColwidth, 6, $this->formatCurrency($currency['symbol'], $subTotal), 1, 'C', 0, 1);
$this->MultiCell($itemColwidth, 6, "", 1, 'C', 0, 0);
$this->MultiCell($qtyColwidth, 6, "", 1, 'C', 0, 0);
$this->MultiCell($descColwidth, 6, "GST (10%)", 1, 'L', 0, 0);
$this->MultiCell($unitpriceColwidth, 6, "", 1, 'C', 0, 0);
if($gst == 1) {
$gstAmount = 0.1*$subTotal;
$this->MultiCell($totalPricColwidth, 6, $this->formatCurrency($currency['symbol'], $gstAmount), 1 , 'C', 0, 1);
}
else {
$this->MultiCell($totalPricColwidth, 6, "N/A", 1 , 'C', 0, 1);
}
$this->MultiCell($itemColwidth, 6, "", 1, 'C', 0, 0);
$this->MultiCell($qtyColwidth, 6, "", 1, 'C', 0, 0);
$this->MultiCell($descColwidth, 6, "TOTAL PAYABLE", 1, 'L', 0, 0);
$this->MultiCell($unitpriceColwidth, 6, "", 1, 'C', 0, 0);
if($gst == 1) {
$totalPrice = $subTotal * 1.1;
}
else {
$totalPrice = $subTotal;
}
$this->MultiCell($totalPricColwidth, 6, $this->formatCurrency($currency['symbol'], $totalPrice), 1, 'C', 0, 1);
}
}
//End Page For
}
/**
* Call the commercial Comments. Need to have already figured out what page to do this on..
*
* * Passing a data structure in the following format.
*
* $details = array(
* 'deliveryTime' => (String) eg. 2-3
* 'timeScale' => (String) eg. WORKING DAYS || WEEKS || MONTHS
* 'paymentTerms => (String) eg. 100% PAYMENT WITH ORDER || NET 30 DAYS FOR APPROVED ACCOUNTS
* 'validFor' => (String) eg. 30 Days
* 'deliveryPoint' => (String) eg. EX-CMC Technologies, NSW. || EX-SUPPLIER NAME
* 'exchangeRate' => (String) eg. FIXED
* 'customsDuty' => (String) eg. NIL || 5%
* 'gst' => (String) eg. 10% EXTRA || Not Applicable for Export
* 'salesEngineer' => (String) eg. Karl Cordes || Con Carpis || Kenan Fernandes etc
* );
*
*
*/
$this->commercialComments($commercialDetails);
$this->AliasNbPages();
$this->lastPage();
}
/**
* Helper method to format currency in an attractive human-viewable way. Australian style. Returns the formatted string.
* @param String $symbol
*
* @param $number
*/
function formatCurrency($symbol, $number) {
list($int, $dec) = explode('.', $number); //Creates an Undefined Offset notice. Fix eventually.
if($dec > 0) {
return $symbol.number_format($number, 2, '.', ',');
}
else {
return $symbol.number_format($number, 0, '.', ',');
}
}
/**
*
* Print out the commercial comments in a CMC Quotation.
*
*
* Receives a data structure in the following format.
*
* $details = array(
* 'deliveryTime' => (String) eg. 2-3
* 'paymentTerms => (String) eg. 100% PAYMENT WITH ORDER || NET 30 DAYS FOR APPROVED ACCOUNTS
* 'validFor' => (String) eg. 30 Days
* 'deliveryPoint' => (String) eg. EX-CMC Technologies, NSW. || EX-SUPPLIER NAME
* 'exchangeRate' => (String) eg. FIXED
* 'customsDuty' => (String) eg. NIL || 5%
* 'gst' => (String) eg. 10% EXTRA || Not Applicable for Export
* 'salesEngineer' => (String) eg. Karl Cordes || Con Carpis || Kenan Fernandes etc
* );
*/
function commercialComments($details) {
//$this->MultiCell($w, $h, $txt, $border, $align, $fill, $ln, $x, $y, $reseth, $stretch, $ishtml)
$this->MultiCell(0, 0, "Commercial Comments:", 0, 'L', 0, 1, null, null, 1, null, true);
$validUntilDate = strtotime('now + '.$details["validFor"].' days');
$niceValidUntilDate = strtoupper(date('l j F Y',$validUntilDate));
$listHtmlContents = <<
DELIVERY IS ESTIMATED AT {$details["deliveryTime"]} ({$details["deliveryPoint"]}) FROM RECEIPT OF YOUR TECHNICALLY AND COMMERCIALLY CLEAR ORDER.
PAYMENT TERMS: {$details["paymentTerms"]}.
QUOTATION IS VALID FOR: {$details["validFor"]} DAYS (UNTIL {$niceValidUntilDate}).
ALL PRICES ARE {$details["deliveryPoint"]}.
EXCHANGE RATE: {$details["exchangeRate"]}.
CUSTOMS DUTY INCLUDED AT: {$details["customsDuty"]}%.
GST: {$details["gst"]}.
WHEN PAYMENTS ARE MADE INTO OUR BANK ACCOUNT, BANK CHARGES ARE YOUR RESPONSIBILITY.
ANY VARIATIONS ON ITEMS 5. TO 7. WILL BE TO YOUR ACCOUNT. THIS QUOTATION IS BASED ON QUANTITIES STATED AND
IS SUBJECT TO CHANGE IF QUANTITIES VARY.
ENDHTMLCONTENTS;
$this->MultiCell(0, 0, $listHtmlContents, 0, 'L', 0, 1, null, null, 1, null, true);
$this->MultiCell(0, 0, "Signed: ____________________________", 0, 'L');
$this->MultiCell(0, 0, " ".$details["salesEngineer"], 0, 'L');
}
function termsAndConditions() {
}
}
?>