vtigerossez/include/InventoryPDFController.php

417 lines
16 KiB
PHP

<?php
/*********************************************************************************
** The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
*
********************************************************************************/
include_once 'vtlib/Vtiger/PDF/models/Model.php';
include_once 'vtlib/Vtiger/PDF/inventory/HeaderViewer.php';
include_once 'vtlib/Vtiger/PDF/inventory/FooterViewer.php';
include_once 'vtlib/Vtiger/PDF/inventory/ContentViewer.php';
include_once 'vtlib/Vtiger/PDF/inventory/ContentViewer2.php';
include_once 'vtlib/Vtiger/PDF/viewers/PagerViewer.php';
include_once 'vtlib/Vtiger/PDF/PDFGenerator.php';
include_once 'data/CRMEntity.php';
class Vtiger_InventoryPDFController {
protected $module;
protected $focus = null;
function __construct($module) {
$this->moduleName = $module;
}
function loadRecord($id) {
global $current_user;
$this->focus = $focus = CRMEntity::getInstance($this->moduleName);
$focus->retrieve_entity_info($id,$this->moduleName);
$focus->apply_field_security();
$focus->id = $id;
$this->associated_products = getAssociatedProducts($this->moduleName,$focus);
}
function getPDFGenerator() {
return new Vtiger_PDF_Generator();
}
function getContentViewer() {
if($this->focusColumnValue('hdnTaxType') == "individual") {
$contentViewer = new Vtiger_PDF_InventoryContentViewer();
} else {
$contentViewer = new Vtiger_PDF_InventoryTaxGroupContentViewer();
}
$contentViewer->setContentModels($this->buildContentModels());
$contentViewer->setSummaryModel($this->buildSummaryModel());
$contentViewer->setLabelModel($this->buildContentLabelModel());
$contentViewer->setWatermarkModel($this->buildWatermarkModel());
return $contentViewer;
}
function getHeaderViewer() {
$headerViewer = new Vtiger_PDF_InventoryHeaderViewer();
$headerViewer->setModel($this->buildHeaderModel());
return $headerViewer;
}
function getFooterViewer() {
$footerViewer = new Vtiger_PDF_InventoryFooterViewer();
$footerViewer->setModel($this->buildFooterModel());
$footerViewer->setLabelModel($this->buildFooterLabelModel());
$footerViewer->setOnLastPage();
return $footerViewer;
}
function getPagerViewer() {
$pagerViewer = new Vtiger_PDF_PagerViewer();
$pagerViewer->setModel($this->buildPagermodel());
return $pagerViewer;
}
function Output($filename, $type) {
if(is_null($this->focus)) return;
$pdfgenerator = $this->getPDFGenerator();
$pdfgenerator->setPagerViewer($this->getPagerViewer());
$pdfgenerator->setHeaderViewer($this->getHeaderViewer());
$pdfgenerator->setFooterViewer($this->getFooterViewer());
$pdfgenerator->setContentViewer($this->getContentViewer());
$pdfgenerator->generate($filename, $type);
}
// Helper methods
function buildContentModels() {
$associated_products = $this->associated_products;
$contentModels = array();
$productLineItemIndex = 0;
$totaltaxes = 0;
foreach($associated_products as $productLineItem) {
++$productLineItemIndex;
$contentModel = new Vtiger_PDF_Model();
$discountPercentage = 0.00;
$total_tax_percent = 0.00;
$producttotal_taxes = 0.00;
$quantity = ''; $listPrice = ''; $discount = ''; $taxable_total = '';
$tax_amount = ''; $producttotal = '';
$quantity = $productLineItem["qty{$productLineItemIndex}"];
$listPrice = $productLineItem["listPrice{$productLineItemIndex}"];
$discount = $productLineItem["discountTotal{$productLineItemIndex}"];
$taxable_total = $quantity * $listPrice - $discount;
$taxable_total = number_format($taxable_total, 2,'.',''); //Convert to 2 decimals
$producttotal = $taxable_total;
if($this->focus->column_fields["hdnTaxType"] == "individual") {
for($tax_count=0;$tax_count<count($productLineItem['taxes']);$tax_count++) {
$tax_percent = $productLineItem['taxes'][$tax_count]['percentage'];
$total_tax_percent += $tax_percent;
$tax_amount = (($taxable_total*$tax_percent)/100);
$producttotal_taxes += $tax_amount;
}
}
$producttotal_taxes = number_format($producttotal_taxes, 2,'.',''); //Convert to 2 decimals
$producttotal = $taxable_total+$producttotal_taxes;
$producttotal = number_format($producttotal, 2,'.',''); //Convert to 2 decimals
$tax = $producttotal_taxes;
$totaltaxes += $tax;
$totaltaxes = number_format($totaltaxes, 2,'.',''); //Convert to 2 decimals
$discountPercentage = $productLineItem["discount_percent{$productLineItemIndex}"];
$productName = $productLineItem["productName{$productLineItemIndex}"];
//get the sub product
$subProducts = $productLineItem["subProductArray{$productLineItemIndex}"];
if($subProducts != ''){
foreach($subProducts as $subProduct) {
$productName .="\n"." - ".decode_html($subProduct);
}
}
$contentModel->set('Name', $productName);
$contentModel->set('Code', $productLineItem["hdnProductcode{$productLineItemIndex}"]);
$contentModel->set('Quantity', $quantity);
$contentModel->set('Price', $this->formatPrice($listPrice));
$contentModel->set('Discount', $this->formatPrice($discount)."\n ($discountPercentage%)");
$contentModel->set('Tax', $this->formatPrice($tax)."\n ($total_tax_percent%)");
$contentModel->set('Total', $this->formatPrice($producttotal));
$contentModel->set('Comment', $productLineItem["comment{$productLineItemIndex}"]);
$contentModels[] = $contentModel;
}
$this->totaltaxes = $totaltaxes; //will be used to add it to the net total
return $contentModels;
}
function buildContentLabelModel() {
$labelModel = new Vtiger_PDF_Model();
$labelModel->set('Code', getTranslatedString('Product Code',$this->moduleName));
$labelModel->set('Name', getTranslatedString('Product Name',$this->moduleName));
$labelModel->set('Quantity', getTranslatedString('Quantity',$this->moduleName));
$labelModel->set('Price', getTranslatedString('Price',$this->moduleName));
$labelModel->set('Discount', getTranslatedString('Discount',$this->moduleName));
$labelModel->set('Tax', getTranslatedString('Tax',$this->moduleName));
$labelModel->set('Total', getTranslatedString('Total',$this->moduleName));
$labelModel->set('Comment', getTranslatedString('Comment'),$this->moduleName);
return $labelModel;
}
function buildSummaryModel() {
$associated_products = $this->associated_products;
$final_details = $associated_products[1]['final_details'];
$summaryModel = new Vtiger_PDF_Model();
$netTotal = $discount = $handlingCharges = $handlingTaxes = 0;
$adjustment = $grandTotal = 0;
$productLineItemIndex = 0;
$sh_tax_percent = 0;
foreach($associated_products as $productLineItem) {
++$productLineItemIndex;
$netTotal += $productLineItem["netPrice{$productLineItemIndex}"];
}
$netTotal = number_format(($netTotal + $this->totaltaxes), 2,'.', '');
$summaryModel->set(getTranslatedString("Net Total", $this->moduleName), $this->formatPrice($netTotal));
$discount_amount = $final_details["discount_amount_final"];
$discount_percent = $final_details["discount_percentage_final"];
$discount = 0.0;
if(!empty($discount_amount)) {
$discount = $discount_amount;
} else if(!empty($discount_percent)) {
$discount = (($discount_percent*$final_details["hdnSubTotal"])/100);
}
$summaryModel->set(getTranslatedString("Discount", $this->moduleName), $this->formatPrice($discount));
$group_total_tax_percent = '0.00';
//To calculate the group tax amount
if($final_details['taxtype'] == 'group') {
$group_tax_details = $final_details['taxes'];
for($i=0;$i<count($group_tax_details);$i++) {
$group_total_tax_percent += $group_tax_details[$i]['percentage'];
}
$summaryModel->set(getTranslatedString("Tax:", $this->moduleName)."($group_total_tax_percent%)", $this->formatPrice($final_details['tax_totalamount']));
}
//Shipping & Handling taxes
$sh_tax_details = $final_details['sh_taxes'];
for($i=0;$i<count($sh_tax_details);$i++) {
$sh_tax_percent = $sh_tax_percent + $sh_tax_details[$i]['percentage'];
}
//obtain the Currency Symbol
$currencySymbol = $this->buildCurrencySymbol();
$summaryModel->set(getTranslatedString("Shipping & Handling Charges", $this->moduleName), $this->formatPrice($final_details['shipping_handling_charge']));
$summaryModel->set(getTranslatedString("Shipping & Handling Tax:", $this->moduleName)."($sh_tax_percent%)", $this->formatPrice($final_details['shtax_totalamount']));
$summaryModel->set(getTranslatedString("Adjustment", $this->moduleName), $this->formatPrice($final_details['adjustment']));
$summaryModel->set(getTranslatedString("Grand Total : (in $currencySymbol)", $this->moduleName), $this->formatPrice($final_details['grandTotal'])); // TODO add currency string
return $summaryModel;
}
function buildHeaderModel() {
$headerModel = new Vtiger_PDF_Model();
$headerModel->set('title', $this->buildHeaderModelTitle());
$modelColumns = array($this->buildHeaderModelColumnLeft(), $this->buildHeaderModelColumnCenter(), $this->buildHeaderModelColumnRight());
$headerModel->set('columns', $modelColumns);
return $headerModel;
}
function buildHeaderModelTitle() {
return $this->moduleName;
}
function buildHeaderModelColumnLeft() {
global $adb;
// Company information
$result = $adb->pquery("SELECT * FROM vtiger_organizationdetails", array());
$num_rows = $adb->num_rows($result);
if($num_rows) {
$resultrow = $adb->fetch_array($result);
$addressValues = array();
$addressValues[] = $resultrow['address'];
if(!empty($resultrow['city'])) $addressValues[]= "\n".$resultrow['city'];
if(!empty($resultrow['state'])) $addressValues[]= ",".$resultrow['state'];
if(!empty($resultrow['code'])) $addressValues[]= $resultrow['code'];
if(!empty($resultrow['country'])) $addressValues[]= "\n".$resultrow['country'];
if(!empty($resultrow['phone'])) $additionalCompanyInfo[]= "\n".getTranslatedString("Phone: ", $this->moduleName). $resultrow['phone'];
if(!empty($resultrow['fax'])) $additionalCompanyInfo[]= "\n".getTranslatedString("Fax: ", $this->moduleName). $resultrow['fax'];
if(!empty($resultrow['website'])) $additionalCompanyInfo[]= "\n".getTranslatedString("Website: ", $this->moduleName). $resultrow['website'];
$modelColumnLeft = array(
'logo' => "test/logo/".$resultrow['logoname'],
'summary' => decode_html($resultrow['organizationname']),
'content' => $this->joinValues($addressValues, ' '). $this->joinValues($additionalCompanyInfo, ' ')
);
}
return $modelColumnLeft;
}
function buildHeaderModelColumnCenter() {
$customerName = $this->resolveReferenceLabel($this->focusColumnValue('account_id'), 'Accounts');
$contactName = $this->resolveReferenceLabel($this->focusColumnValue('contact_id'), 'Contacts');
$customerNameLabel = getTranslatedString('Customer Name', $this->moduleName);
$contactNameLabel = getTranslatedString('Contact Name', $this->moduleName);
$modelColumnCenter = array(
$customerNameLabel => $customerName,
$contactNameLabel => $contactName,
);
return $modelColumnCenter;
}
function buildHeaderModelColumnRight() {
$issueDateLabel = getTranslatedString('Issued Date', $this->moduleName);
$validDateLabel = getTranslatedString('Valid Date', $this->moduleName);
$billingAddressLabel = getTranslatedString('Billing Address', $this->moduleName);
$shippingAddressLabel = getTranslatedString('Shipping Address', $this->moduleName);
$modelColumnRight = array(
'dates' => array(
$issueDateLabel => $this->formatDate(date("Y-m-d")),
$validDateLabel => $this->formatDate($this->focusColumnValue('validtill')),
),
$billingAddressLabel => $this->buildHeaderBillingAddress(),
$shippingAddressLabel => $this->buildHeaderShippingAddress()
);
return $modelColumnRight;
}
function buildFooterModel() {
$footerModel = new Vtiger_PDF_Model();
$footerModel->set(Vtiger_PDF_InventoryFooterViewer::$DESCRIPTION_DATA_KEY, from_html($this->focusColumnValue('description')));
$footerModel->set(Vtiger_PDF_InventoryFooterViewer::$TERMSANDCONDITION_DATA_KEY, from_html($this->focusColumnValue('terms_conditions')));
return $footerModel;
}
function buildFooterLabelModel() {
$labelModel = new Vtiger_PDF_Model();
$labelModel->set(Vtiger_PDF_InventoryFooterViewer::$DESCRIPTION_LABEL_KEY, getTranslatedString('Description',$this->moduleName));
$labelModel->set(Vtiger_PDF_InventoryFooterViewer::$TERMSANDCONDITION_LABEL_KEY, getTranslatedString('Terms & Conditions',$this->moduleName));
return $labelModel;
}
function buildPagerModel() {
$footerModel = new Vtiger_PDF_Model();
$footerModel->set('format', '-%s-');
return $footerModel;
}
function getWatermarkContent() {
return '';
}
function buildWatermarkModel() {
$watermarkModel = new Vtiger_PDF_Model();
$watermarkModel->set('content', $this->getWatermarkContent());
return $watermarkModel;
}
function buildHeaderBillingAddress() {
$billPoBox = $this->focusColumnValues(array('bill_pobox'));
$billStreet = $this->focusColumnValues(array('bill_street'));
$billCity = $this->focusColumnValues(array('bill_city'));
$billState = $this->focusColumnValues(array('bill_state'));
$billCountry = $this->focusColumnValues(array('bill_country'));
$billCode = $this->focusColumnValues(array('bill_code'));
$address = $this->joinValues(array($billPoBox, $billStreet), ' ');
$address .= "\n".$this->joinValues(array($billCity, $billState), ',')." ".$billCode;
$address .= "\n".$billCountry;
return $address;
}
function buildHeaderShippingAddress() {
$shipPoBox = $this->focusColumnValues(array('ship_pobox'));
$shipStreet = $this->focusColumnValues(array('ship_street'));
$shipCity = $this->focusColumnValues(array('ship_city'));
$shipState = $this->focusColumnValues(array('ship_state'));
$shipCountry = $this->focusColumnValues(array('ship_country'));
$shipCode = $this->focusColumnValues(array('ship_code'));
$address = $this->joinValues(array($shipPoBox, $shipStreet), ' ');
$address .= "\n".$this->joinValues(array($shipCity, $shipState), ',')." ".$shipCode;
$address .= "\n".$shipCountry;
return $address;
}
function buildCurrencySymbol() {
global $adb;
$currencyId = $this->focus->column_fields['currency_id'];
if(!empty($currencyId)) {
$result = $adb->pquery("SELECT currency_symbol FROM vtiger_currency_info WHERE id=?", array($currencyId));
return decode_html($adb->query_result($result,0,'currency_symbol'));
}
return false;
}
function focusColumnValues($names, $delimeter="\n") {
if(!is_array($names)) {
$names = array($names);
}
$values = array();
foreach($names as $name) {
$value = $this->focusColumnValue($name, false);
if($value !== false) {
$values[] = $value;
}
}
return $this->joinValues($values, $delimeter);
}
function focusColumnValue($key, $defvalue='') {
$focus = $this->focus;
if(isset($focus->column_fields[$key])) {
return $focus->column_fields[$key];
}
return $defvalue;
}
function resolveReferenceLabel($id, $module=false) {
if(empty($id)) {
return '';
}
if($module === false) {
$module = getSalesEntityType($id);
}
$label = getEntityName($module, array($id));
return decode_html($label[$id]);
}
function joinValues($values, $delimeter= "\n") {
$valueString = '';
foreach($values as $value) {
if(empty($value)) continue;
$valueString .= $value . $delimeter;
}
return rtrim($valueString, $delimeter);
}
function formatNumber($value) {
return number_format($value);
}
function formatPrice($value, $decimal=2) {
$currencyField = new CurrencyField($value);
return $currencyField->getDisplayValue(null, true);
}
function formatDate($value) {
return DateTimeField::convertToUserFormat($value);
}
}
?>