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; } } ?>