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(-30);
/*//$this->Image(K_PATH_IMAGES.'cmcfooter.jpg', null, 255, 200, 0, null, 'http://www.cmctechnologies.com.au', null, false, null, 'C');
$this->MultiCell(0, 2, "
", 0, 'C', null, 1, null, null, true, 0, true, false);
// $this->MultiCell(0, 2, "PROVIDING SOLUTIONS IN", 0, 'C', null, 1, null, null, true, 0, true, false);
//$this->ln();
//$this->ln();
$this->SetFontSize(10);
$this->MultiCell(120, 2, "EXPLOSION PREVENTION", 0, 'L', null, 0, null, null, true, 0, true, false);
$this->MultiCell(0, 2, "PRESSURE RELIEF", 0, 'R', null, 1, null, null, true, 0, true, false);
$this->MultiCell(120, 2, "EXPLOSION PROTECTION", 0, 'L', null, 0, null, null, true, 0, true, false);
$this->MultiCell(0, 2, "VISION IN THE PROCESS", 0, 'R', null, 1, null, null, true, 0, true, false);
// $this->ln();
$this->MultiCell(80, 2, "FLOW MEASUREMENT", 0, 'L', null, 0, null, null, true, 0, true, false);
$this->MultiCell(0, 2, "PROCESS INSTRUMENTATION", 0, 'R', null, 1, null, null, true, 0, true, false);
*/
}
/**
* 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, $issuedate) {
$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);
$todayPHPdate = strtotime($issuedate);
$todaysDateString = date('l, j F Y', $todayPHPdate);
$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)
}
/**
* Start a TCPDF transaction and do the calculations for the product table.
* @param $principleName
* @param $currency
* @param $gst
* @param $products
* @param $docType
* @param $commercialDetails
*/
function calculateProductPage($currency,$gst, $products, $commercialDetails) {
$itemColwidth = 12;
$qtyColwidth = 10;
$descColwidth = 120;
$unitpriceColwidth = 25;
$totalPricColwidth = -10;
//$availableHeight = 253;
$availableHeight = 230;
$heightLeft = $availableHeight; //height left on this particular page.
$pagesRequired = 1;
foreach ($products as $product) {
$this->startTransaction();
$fullDesc = "".$product['title'].'
'.$product['description'];
//$this->MultiCell($descColwidth, 0, $fullDesc, 1, "L", 0, 0, null, null, true, 0, true, true, 0, 'T', false);
// die($fullDesc);
//$this->MultiCell($descColwidth, 0, $fullDesc, 1, 'L', false, 1, 0, 0, true, 0, true, true);
$lasth = $this->getLastH();
$this->rollbackTransaction($this);
//echo "Last height needed for item: ".$product[$docType]['item_number']." was: ".$lasth."
";
//echo $product[$docType]['id']." needs ".$lasth." has $heightLeft left
";
$itemno = $product['item_number'];
if($heightLeft - $lasth <= 0) {
// echo "
OUT OF SPACE ON PAGE $pagesRequired making a new one
";
$pagesRequired++;
$heightLeft = $availableHeight; //Start checking the next page;
// echo "
remaining height on new one = ".$heightLeft."
";
$heightLeft -= $lasth;
$itemno = $product['item_number'];
// echo "
Using $lasth for $itemno so now have $heightLeft left
";
$pageProducts[$pagesRequired][] = $product['id'];
}
else {
$heightLeft -= $lasth;
$pageProducts[$pagesRequired][] = $product['id'];
}
}
/* 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.
*/
$this->startTransaction();
$subtotal = 0;
//$totalsHeight = $this->totals($currency, $subtotal, 1);
$commDetailsHeight = $this->commercialComments($commercialDetails);
echo "WOTOTOTO1111T";
$this->rollbackTransaction($this);
//echo "Currently have $heightLeft Comm details height is ".$commDetailsHeight." totals height is: ".$totalsHeight."
";
$heightLeft -= $totalsHeight;
if($heightLeft <= 0) {
// echo "
Need a new page for last item and totals";
//array_pop($pageProducts[$pagesRequired]);
$pagesRequired++;
$heightLeft = $availableHeight;
$heightLeft -= $totalsHeight;
//$pageProducts[$pagesRequired][] = $product[$docType]['id'];
}
echo "Height left before commDetails is:".$heightLeft;
echo "Comm Details Height is:".$commDetailsHeight;
$heightLeft -= $commDetailsHeight;
echo "Heigh Left is now:".$heightLeft;
if($heightLeft <= 0) {
$pagesRequired++;
}
debug($pageProducts);
print_r($pageProducts);
return $pageProducts;
}
/**
*
* @param Map $principles - list of principles. A hack so we can show a products principle name on it, without rewriting
* lots of code.
* @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($currency,$gst, $products ,$docType, $commercialDetails, $pageProducts) {
$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);
$subTotal = 0;
$options = 0; //Toggled to 1 when we encounter an Optional product. Stops the totals being printed.
foreach ($pageProducts as $page) {
$this->AddPage();
//Draw Header Rows
$this->setFontSize(12);
$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->setFontSize(10);
$this->MultiCell($itemColwidth, 0, "ITEM NO.", 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, "", 1, "C", 1, 0); //Principle Name used to go here.
$this->MultiCell($unitpriceColwidth, $heightNeeded, $currency['iso4217'], 1, "C", 1, 0);
$this->MultiCell($totalPricColwidth, $heightNeeded, $currency['iso4217'], 1, "C", 1, 1);
// echo "$pageNo
";
// print_r($page);
//Start Printing Product cells, until we run out of room. Then continue on the next page
foreach($page as $productID) {
$product = array_shift($products);
if($product['Principle']['id'] != null) {
$fullDesc = "".$product['Principle']['name']."
"."".$product[$docType]['title'].'
'.$product[$docType]['description'];
}
else {
$fullDesc = "".$product[$docType]['title'].'
'.$product[$docType]['description'];
}
if($product[$docType]['option'] == 1) {
$options = 1;
}
$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);
if($product[$docType]['discount_percent'] != 0) {
$percentage = number_format($product[$docType]['discount_percent'], 2);
$unitPriceString = $this->formatCurrency($currency['symbol'], $product[$docType]['unit_price']);
$unitPriceString .= "
less ".$percentage."% discount
(-"
.$this->formatCurrency($currency['symbol'], $product[$docType]['discount_amount_each']).")
=
";
$unitPriceString .= $this->formatCurrency($currency['symbol'], $product[$docType]['net_price_each']);
$totalPriceString = $this->formatCurrency($currency['symbol'], $product[$docType]['gross_price']);
$totalPriceString .= "
less ".$percentage."% discount
(-"
.$this->formatCurrency($currency['symbol'], $product[$docType]['total_discount_amount']).")
=
";
$totalPriceString .= $this->formatCurrency($currency['symbol'], $product[$docType]['net_price']);
}
else {
$unitPriceString = $this->formatCurrency($currency['symbol'], $product[$docType]['unit_price']);
$totalPriceString = $this->formatCurrency($currency['symbol'], $product[$docType]['net_price']);
}
//Unit Price Column
$this->MultiCell($unitpriceColwidth, $heightNeeded, $unitPriceString , 1, "C", 0, 0, null, null, true, 0, true);
//Net Price Column
$this->MultiCell($totalPricColwidth, $heightNeeded, $totalPriceString, 1, "C", 0, 1, null, null, true, 0, true);
$subTotal += $product[$docType]['net_price'];
$lastY = $this->GetY();
$lastX = $this->GetX();
//echo $product[$docType]['item_number']." Last X is $lastX, Last Y is $lastY
";
}
//debug($products);
//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->totals($currency, $subTotal, $gst, $options);
$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
* 'dateIssued' => (String) eg. 2009-05-10
* '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) {
$totalHeight = 0;
//$this->MultiCell(0, 0, "Commercial Comments:", 0, 'L', 0, 1, null, null, 1, null, true);
$totalHeight += $this->getLastH();
$validUntilDate = strtotime($details["dateIssued"]. ' + '.$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;
//$commlines = $this->getNumLines($listHtmlContents);
//echo "lines required for commercial comments: ".$commlines;
//$this->MultiCell(0, 0, $listHtmlContents, 0, 'L', 0, 1, null, null, 1, null, true);
$totalHeight += $this->getLastH();
//$this->MultiCell(0, 0, "Signed: ____________________________", 0, 'L');
$totalHeight += $this->getLastH();
//$this->MultiCell(0, 0, " ".$details["salesEngineer"], 0, 'L');
$totalHeight += $this->getLastH();
return $totalHeight;
}
function totals($currency, $subTotal, $gst, $options) {
$itemColwidth = 12;
$qtyColwidth = 10;
$descColwidth = 120;
$unitpriceColwidth = 25;
$totalPricColwidth = -10;
$totalHeight = 0;
// echo "desc col wdith : ".$descColwidth;
$this->MultiCell($itemColwidth, 6, "", 1, 'C', 0, 0);
$totalHeight += $this->getLastH();
$this->MultiCell($qtyColwidth, 6, "", 1, 'C', 0, 0);
$totalHeight += $this->getLastH();
$this->MultiCell($descColwidth, 6, "SUB-TOTAL (EXCLUDING GST)", 1, 'L', 0, 0);
$totalHeight += $this->getLastH();
$this->MultiCell($unitpriceColwidth, 6, "", 1, 'C', 0, 0);
$totalHeight += $this->getLastH();
if($options == 1) {
$this->MultiCell($totalPricColwidth, 6, $currency['symbol']. "TBA", 1, 'C', 0, 1);
}
else {
$this->MultiCell($totalPricColwidth, 6, $this->formatCurrency($currency['symbol'], $subTotal), 1, 'C', 0, 1);
}
$totalHeight += $this->getLastH();
$this->MultiCell($itemColwidth, 6, "", 1, 'C', 0, 0);
$totalHeight += $this->getLastH();
$this->MultiCell($qtyColwidth, 6, "", 1, 'C', 0, 0);
$totalHeight += $this->getLastH();
$this->MultiCell($descColwidth, 6, "GST (10%)", 1, 'L', 0, 0);
$totalHeight += $this->getLastH();
$this->MultiCell($unitpriceColwidth, 6, "", 1, 'C', 0, 0);
$totalHeight += $this->getLastH();
if($options == 1) {
$this->MultiCell($totalPricColwidth, 6, $currency['symbol']. "TBA", 1, 'C', 0, 1);
}
else {
if($gst == 1) {
$gstAmount = 0.1*$subTotal;
$this->MultiCell($totalPricColwidth, 6, $this->formatCurrency($currency['symbol'], $gstAmount), 1 , 'C', 0, 1);
$totalHeight += $this->getLastH();
}
else {
$this->MultiCell($totalPricColwidth, 6, "N/A", 1 , 'C', 0, 1);
$totalHeight += $this->getLastH();
}
}
$this->MultiCell($itemColwidth, 6, "", 1, 'C', 0, 0);
$totalHeight += $this->getLastH();
$this->MultiCell($qtyColwidth, 6, "", 1, 'C', 0, 0);
$totalHeight += $this->getLastH();
$this->MultiCell($descColwidth, 6, "TOTAL PAYABLE", 1, 'L', 0, 0);
$totalHeight += $this->getLastH();
$this->MultiCell($unitpriceColwidth, 6, "", 1, 'C', 0, 0);
$totalHeight += $this->getLastH();
if($options == 1) {
$this->MultiCell($totalPricColwidth, 6, $currency['symbol']. "TBA", 1, 'C', 0, 1);
}
else {
if($gst == 1) {
$totalPrice = $subTotal * 1.1;
}
else {
$totalPrice = $subTotal;
}
$this->MultiCell($totalPricColwidth, 6, $this->formatCurrency($currency['symbol'], $totalPrice), 1, 'C', 0, 1);
}
$totalHeight += $this->getLastH();
return $totalHeight;
}
}
?>