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() { } } ?>