From a92ebdde7985571d5ce5e9777b5b436ec3cec110 Mon Sep 17 00:00:00 2001 From: Janusz Dobrowolski Date: Mon, 1 Mar 2010 09:58:01 +0000 Subject: [PATCH] Rewrte of FrontReport header API to accept external layouts in pdf and php files. --- reporting/includes/class.pdf.inc | 5 +- reporting/includes/excel_report.inc | 7 +- reporting/includes/header2.inc | 119 +++++++++++----------- reporting/includes/pdf_report.inc | 152 ++++++++++++++++++++-------- 4 files changed, 176 insertions(+), 107 deletions(-) diff --git a/reporting/includes/class.pdf.inc b/reporting/includes/class.pdf.inc index 778459dc..71ba2783 100644 --- a/reporting/includes/class.pdf.inc +++ b/reporting/includes/class.pdf.inc @@ -59,8 +59,9 @@ define("K_RE_PATTERN_ARABIC", "/( )/x"); include_once (dirname(__FILE__).'/tcpdf.php'); +include_once (dirname(__FILE__).'/fpdi/fpdi.php'); -class Cpdf extends TCPDF { +class Cpdf extends FPDI { function Cpdf($pageSize='A4', $l=array(), $pageOrientation='P') { @@ -76,8 +77,6 @@ class Cpdf extends TCPDF { $this->setPrintFooter(false); $this->setPDFVersion("1.3"); $this->setAutoPageBreak(0); - $this->AddPage(); - $this->SetLineWidth(1); $this->cMargin = 0; } diff --git a/reporting/includes/excel_report.inc b/reporting/includes/excel_report.inc index 4fd129b7..aca0e2c7 100644 --- a/reporting/includes/excel_report.inc +++ b/reporting/includes/excel_report.inc @@ -630,7 +630,12 @@ class FrontReport extends Spreadsheet_Excel_Writer_Workbook { $this->y += $l; } - + + function NewPage() + { + return; + } + function ymd2Date($year, $mon, $day) // XLS internal date representation is a number between 1900-01-01 and 2078-12-31 { // if we need the time part too, we have to add this value after a decimalpoint. $mo = array(0,31,28,31,30,31,30,31,31,30,31,30,31); diff --git a/reporting/includes/header2.inc b/reporting/includes/header2.inc index 5602afee..42d99bac 100644 --- a/reporting/includes/header2.inc +++ b/reporting/includes/header2.inc @@ -122,28 +122,28 @@ $this->NewLine(3); $this->Text($mcol + 100, $doc_Date); if ($doctype == ST_SALESQUOTE || $doctype == ST_PURCHORDER || $doctype == ST_SALESORDER) - $this->Text($mcol + 180, sql2date($myrow['ord_date'])); + $this->Text($mcol + 180, sql2date($this->formData['ord_date'])); elseif ($doctype == ST_WORKORDER) - $this->Text($mcol + 180, sql2date($myrow['date_'])); + $this->Text($mcol + 180, sql2date($this->formData['date_'])); else - $this->Text($mcol + 180, sql2date($myrow['tran_date'])); + $this->Text($mcol + 180, sql2date($this->formData['tran_date'])); $this->NewLine(); $this->Text($mcol + 100, $doc_Invoice_no); if ($doctype == ST_SALESQUOTE || $doctype == ST_PURCHORDER || $doctype == ST_SALESORDER) // QUOTE, PO or SO { if ($print_invoice_no == 1) - $this->Text($mcol + 180, $myrow['order_no']); + $this->Text($mcol + 180, $this->formData['order_no']); else - $this->Text($mcol + 180, $myrow['reference']); + $this->Text($mcol + 180, $this->formData['reference']); } elseif ($doctype == ST_WORKORDER) - $this->Text($mcol + 180, $myrow['id']); - else if (isset($myrow['trans_no']) && isset($myrow['reference'])) // INV/CRE/STA + $this->Text($mcol + 180, $this->formData['id']); + else if (isset($this->formData['trans_no']) && isset($this->formData['reference'])) // INV/CRE/STA { if ($print_invoice_no == 1) - $this->Text($mcol + 180, $myrow['trans_no']); + $this->Text($mcol + 180, $this->formData['trans_no']); else - $this->Text($mcol + 180, $myrow['reference']); + $this->Text($mcol + 180, $this->formData['reference']); } if ($this->pageNumber > 1 && !strstr($this->filename, "Bulk")) @@ -159,42 +159,43 @@ $temp = $this->row; if ($doctype == ST_SALESQUOTE || $doctype == ST_SALESORDER) { - $this->Text($ccol, $myrow['name'], $icol); + $this->Text($ccol, $this->formData['name'], $icol); } elseif ($doctype == ST_WORKORDER) { - $this->Text($ccol, $myrow['location_name'], $icol); + $this->Text($ccol, $this->formData['location_name'], $icol); $this->NewLine(); - $this->TextWrapLines($ccol, $icol - $ccol, $myrow['delivery_address']); + $this->TextWrapLines($ccol, $icol - $ccol, $this->formData['delivery_address']); } else { if ($doctype == ST_PURCHORDER || $doctype == ST_SUPPAYMENT) { - $name = $myrow['supp_name']; - $addr = $myrow['address']; + $name = $this->formData['supp_name']; + $addr = $this->formData['address']; } else { - if (trim($branch['br_address']) != '') { - $name = $branch['br_name']; - $addr = $branch['br_address']; + if (isset($this->formData['br_address']) && + trim($this->formData['br_address']) != '') { + $name = $this->formData['br_name']; + $addr = $this->formData['br_address']; } else { - $name = $myrow['DebtorName']; - $addr = $myrow['address']; + $name = $this->formData['DebtorName']; + $addr = $this->formData['address']; } } $this->Text($ccol, $name, $icol); $this->NewLine(); $this->TextWrapLines($ccol, $icol - $ccol, $addr); } - if ($sales_order != NULL) + if (isset($this->formData['deliver_to'])) { $this->row = $temp; if ($doctype == ST_PURCHORDER) $this->Text($mcol, $this->company['coy_name']); - elseif ($doctype != ST_SUPPAYMENT && isset($sales_order['deliver_to'])) - $this->Text($mcol, $sales_order['deliver_to']); + elseif ($doctype != ST_SUPPAYMENT && isset($this->formData['deliver_to'])) + $this->Text($mcol, $this->formData['deliver_to']); $this->NewLine(); - if ($doctype != ST_SUPPAYMENT && isset($sales_order['deliver_to'])) - $this->TextWrapLines($mcol, $this->rightMargin - $mcol, $sales_order['delivery_address']); + if ($doctype != ST_SUPPAYMENT && isset($this->formData['deliver_to'])) + $this->TextWrapLines($mcol, $this->rightMargin - $mcol, $this->formData['delivery_address']); } $this->row = $iline2 - $this->lineHeight - 1; $col = $this->leftMargin; @@ -213,17 +214,17 @@ $this->row = $iline3 - $this->lineHeight - 1; $col = $this->leftMargin; if ($doctype == ST_PURCHORDER || $doctype == ST_SUPPAYMENT) - $this->TextWrap($col, $this->row, $width, $myrow['supp_account_no'], 'C'); + $this->TextWrap($col, $this->row, $width, $this->formData['supp_account_no'], 'C'); elseif ($doctype == ST_WORKORDER) - $this->TextWrap($col, $this->row, $width, $myrow['wo_ref'], 'C'); - elseif (isset($sales_order["customer_ref"])) - $this->TextWrap($col, $this->row, $width, $sales_order["customer_ref"], 'C'); - elseif (isset($myrow["debtor_ref"])) - $this->TextWrap($col, $this->row, $width, $myrow["debtor_ref"], 'C'); + $this->TextWrap($col, $this->row, $width, $this->formData['wo_ref'], 'C'); + elseif (isset($this->formData["customer_ref"])) + $this->TextWrap($col, $this->row, $width, $this->formData["customer_ref"], 'C'); + elseif (isset($this->formData["debtor_ref"])) + $this->TextWrap($col, $this->row, $width, $this->formData["debtor_ref"], 'C'); $col += $width; - if ($branch != null) + if (isset($this->formData['salesman'])) { - $id = $branch['salesman']; + $id = $this->formData['salesman']; //$sql = "SELECT salesman_name FROM ".TB_PREF."salesman WHERE salesman_code='$id'"; //$result = db_query($sql,"could not get sales person"); //$row = db_fetch($result); @@ -231,18 +232,18 @@ $this->TextWrap($col, $this->row, $width, get_salesman_name($id), 'C'); } elseif ($doctype == ST_SUPPAYMENT || $doctype == ST_CUSTPAYMENT) - $this->TextWrap($col, $this->row, $width, $systypes_array[$myrow["type"]], 'C'); + $this->TextWrap($col, $this->row, $width, $systypes_array[$this->formData["type"]], 'C'); elseif ($doctype == ST_WORKORDER) - $this->TextWrap($col, $this->row, $width, $wo_types_array[$myrow["type"]], 'C'); + $this->TextWrap($col, $this->row, $width, $wo_types_array[$this->formData["type"]], 'C'); $col += $width; if ($doctype == ST_WORKORDER) - $this->TextWrap($col, $this->row, $width, $myrow["StockItemName"], 'C'); - elseif ($doctype != ST_PURCHORDER && isset($myrow['tax_id'])) - $this->TextWrap($col, $this->row, $width, $myrow['tax_id'], 'C'); + $this->TextWrap($col, $this->row, $width, $this->formData["StockItemName"], 'C'); + elseif ($doctype != ST_PURCHORDER && isset($this->formData['tax_id'])) + $this->TextWrap($col, $this->row, $width, $this->formData['tax_id'], 'C'); $col += $width; if ($doctype == ST_SALESINVOICE) { - $deliveries = get_parent_trans(ST_SALESINVOICE, $myrow['trans_no']); + $deliveries = get_parent_trans(ST_SALESINVOICE, $this->formData['trans_no']); $line = ""; foreach ($deliveries as $delivery) { @@ -261,35 +262,35 @@ } elseif ($doctype == ST_CUSTDELIVERY) { - $ref = $myrow['order_']; + $ref = $this->formData['order_']; if ($print_invoice_no == 0) { - $ref = get_reference(ST_SALESORDER, $myrow['order_']); + $ref = get_reference(ST_SALESORDER, $this->formData['order_']); if (!$ref) - $ref = $myrow['order_']; + $ref = $this->formData['order_']; } $this->TextWrap($col, $this->row, $width, $ref, 'C'); } elseif ($doctype == ST_WORKORDER) - $this->TextWrap($col, $this->row, $width, $myrow["location_name"], 'C'); - elseif (isset($myrow['order_']) && $myrow['order_'] != 0) - $this->TextWrap($col, $this->row, $width, $myrow['order_'], 'C'); + $this->TextWrap($col, $this->row, $width, $this->formData["location_name"], 'C'); + elseif (isset($this->formData['order_']) && $this->formData['order_'] != 0) + $this->TextWrap($col, $this->row, $width, $this->formData['order_'], 'C'); $col += $width; if ($doctype == ST_SALESORDER || $doctype == ST_SALESQUOTE) - $this->TextWrap($col, $this->row, $width, sql2date($myrow['delivery_date']), 'C'); + $this->TextWrap($col, $this->row, $width, sql2date($this->formData['delivery_date']), 'C'); elseif ($doctype == ST_WORKORDER) - $this->TextWrap($col, $this->row, $width, $myrow["units_issued"], 'C'); + $this->TextWrap($col, $this->row, $width, $this->formData["units_issued"], 'C'); elseif ($doctype != ST_PURCHORDER && $doctype != ST_CUSTCREDIT && $doctype != ST_CUSTPAYMENT && - $doctype != ST_SUPPAYMENT && isset($myrow['due_date'])) - $this->TextWrap($col, $this->row, $width, sql2date($myrow['due_date']), 'C'); - if (!isset($packing_slip) || $packing_slip == 0) + $doctype != ST_SUPPAYMENT && isset($this->formData['due_date'])) + $this->TextWrap($col, $this->row, $width, sql2date($this->formData['due_date']), 'C'); + if ((!isset($packing_slip) || $packing_slip == 0) && ($doctype != ST_STATEMENT)) //! { $this->row -= (2 * $this->lineHeight); if ($doctype == ST_WORKORDER) - $str = sql2date($myrow["required_by"]); + $str = sql2date($this->formData["required_by"]); else { - $id = $myrow['payment_terms']; + $id = $this->formData['payment_terms']; $sql = "SELECT terms FROM ".TB_PREF."payment_terms WHERE terms_indicator='$id'"; $result = db_query($sql,"could not get paymentterms"); $row = db_fetch($result); @@ -309,24 +310,24 @@ $this->Font('italic'); $this->row = $iline7 - $this->lineHeight - 6; if ($doctype != ST_WORKORDER) - $this->TextWrap($ccol, $this->row, $right - $ccol, $doc_Please_Quote . " - " . $myrow['curr_code'], 'C'); + $this->TextWrap($ccol, $this->row, $right - $ccol, $doc_Please_Quote . " - " . $this->formData['curr_code'], 'C'); $this->row -= $this->lineHeight; - if (isset($bankaccount['bank_name'])) + if (isset($this->formData['bank_name'])) { - $txt = $doc_Bank . ": ".$bankaccount['bank_name']. ", " . $doc_Bank_Account . ": " . $bankaccount['bank_account_number']; + $txt = $doc_Bank . ": ".$this->formData['bank_name']. ", " . $doc_Bank_Account . ": " . $this->formData['bank_account_number']; $this->TextWrap($ccol, $this->row, $right - $ccol, $txt, 'C'); $this->row -= $this->lineHeight; } - if ($doctype == ST_SALESINVOICE && $branch['disable_branch'] > 0) // payment links + if ($doctype == ST_SALESINVOICE && $this->formData['disable_branch'] > 0) // payment links { - if ($branch['disable_branch'] == 1) + if ($this->formData['disable_branch'] == 1) { - $amt = number_format($myrow["ov_freight"] + $myrow["ov_gst"] + $myrow["ov_amount"], user_price_dec()); + $amt = number_format($this->formData["ov_freight"] + $this->formData["ov_gst"] + $this->formData["ov_amount"], user_price_dec()); $txt = $doc_Payment_Link . " PayPal: "; - $name = urlencode($this->title . " " . $myrow['reference']); + $name = urlencode($this->title . " " . $this->formData['reference']); $url = "https://www.paypal.com/xclick/business=" . $this->company['email'] . "&item_name=" . - $name . "&amount=" . $amt . "¤cy_code=" . $myrow['curr_code']; + $name . "&amount=" . $amt . "¤cy_code=" . $this->formData['curr_code']; $this->fontSize -= 2; $this->TextWrap($ccol, $this->row, $right - $ccol, $txt, 'C'); $this->row -= $this->lineHeight; diff --git a/reporting/includes/pdf_report.inc b/reporting/includes/pdf_report.inc index 9bb1d33a..b6962add 100644 --- a/reporting/includes/pdf_report.inc +++ b/reporting/includes/pdf_report.inc @@ -9,13 +9,22 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License here . ***********************************************************************/ -//include_once($path_to_root . "reporting/includes/class.pdf.inc"); +/* + TODO: + . add StartReport/EndReport handlers for better bulk report support, with + . email/printer destination option should be selected on class creation instead + of End() + . add/use setter function for Header2 parameters (currently passed globally) + . in report files pass already prepared options to SetCommonData() to avoid need for + selection inside FrontReport generic class. +*/ include_once(dirname(__FILE__)."/class.pdf.inc"); include_once(dirname(__FILE__)."/printer_class.inc"); include_once($path_to_root . "/admin/db/company_db.inc"); include_once($path_to_root . "/admin/db/fiscalyears_db.inc"); include_once($path_to_root . "/admin/db/printers_db.inc"); include_once($path_to_root . "/config.php"); + class FrontReport extends Cpdf { var $size; @@ -51,11 +60,20 @@ class FrontReport extends Cpdf var $scaleLogoWidth; var $footerEnable; // select whether to print a page footer or not var $footerText; // store user-generated footer text - var $headerFunc; // store the name of the currently selected header function + var $headerTmpl; // store the name of the currently selected header template + var $tmplSize; // pdf header template size in pages + + var $rep_id; + var $formData; // common data used for printing headers footers etc. + var $dest; // destination: email or printer + function FrontReport($title, $filename, $size = 'A4', $fontsize = 9, $orientation = 'P', $margins = NULL, $excelColWidthFactor = NULL) { global $page_security; + + $this->rep_id = $_POST['REP_ID']; // FIXME + if (!$_SESSION["wa_current_user"]->can_access_page($page_security)) { display_error(_("The security settings on your account do not permit you to print this report")); @@ -200,8 +218,8 @@ class FrontReport extends Cpdf $this->row = $this->pageHeight - $this->topMargin; $this->currency = ''; $this->scaleLogoWidth = false; // if Logo, scale on width (else height). - $this->headerFunc = 'Header'; // default to the original header template - + $this->SetHeaderType('Header'); // default + $rtl = ($_SESSION['language']->dir === 'rtl' ? 'rtl' : 'ltr'); $code = $_SESSION['language']->code; $enc = strtoupper($_SESSION['language']->encoding); @@ -209,7 +227,7 @@ class FrontReport extends Cpdf $l = array('a_meta_charset' => $enc, 'a_meta_dir' => $rtl, 'a_meta_language' => $code, 'w_page' => 'page'); $this->Cpdf($size, $l, $orientation); } - + /* * Select the font and style to use for following output until * it's changed again. @@ -276,16 +294,14 @@ class FrontReport extends Cpdf $this->footerEnable = $footerenable; $this->footerText = $footertext; } - + // + // Header for listings + // function Header() { $companyCol = $this->endLine - 150; $titleCol = $this->leftMargin + 100; - $this->pageNumber++; - if ($this->pageNumber > 1) - $this->newPage(); - $this->row = $this->pageHeight - $this->topMargin; $this->SetDrawColor(128, 128, 128); @@ -358,14 +374,53 @@ class FrontReport extends Cpdf $this->NewLine(2); } - - function Header2($myrow, $branch, $sales_order, $bankaccount, $doctype) + /* + Transition function + */ + function SetCommonData($myrow, $branch, $sales_order, $bankaccount, $doctype) + { +// $this->formData = array_merge($myrow, $branch, $sales_order, +// $bank_account, array('doctype' => $doctype)); + + $this->formData = array(); + $datnames = array( + 'myrow' => array('ord_date', 'date_', 'tran_date', + 'order_no','reference', 'id', 'trans_no', 'name', 'location_name', + 'delivery_address', 'supp_name', 'address', + 'DebtorName', 'supp_account_no', 'wo_ref', 'debtor_ref','type', 'trans_no', + 'StockItemName', 'tax_id', 'order_', 'delivery_date', 'units_issued', + 'due_date', 'required_by', 'payment_terms', 'curr_code', + 'ov_freight', 'ov_gst', 'ov_amount'), + 'branch' => array('br_address', 'br_name', 'salesman', 'disable_branch'), + 'sales_order' => array('deliver_to', 'delivery_address', 'customer_ref'), + 'bankaccount' => array('bank_name', 'bank_account_number') + ); + + foreach($datnames as $var => $fields) { + if (isset($$var)) { + foreach($fields as $locname) { + if (isset(${$var}[$locname])) { + $this->formData[$locname] = ${$var}[$locname]; + } + } + } + } + $this->formData['doctype'] = $doctype; + } + /* + Set header handler + */ + function SetHeaderType($name) { + $this->headerTmpl = $name; + } + /* + Header for sales/purchase documents + */ + function Header2() { - global $comp_path, $path_to_root, $print_as_quote, $print_invoice_no, $packing_slip; + global $comp_path, $path_to_root, $print_as_quote, $print_invoice_no, $packing_slip; // FIXME - $this->pageNumber++; - if ($this->pageNumber > 1) - $this->newPage(); + $doctype = $this->formData['doctype']; $header2type = true; // leave layout files names without path to enable including @@ -389,16 +444,13 @@ class FrontReport extends Cpdf { global $comp_path; - // Make this header the default for the current report ( used by NewLine() ) - $this->headerFunc = 'Header3'; - // Turn off cell padding for the main report header, restoring the current setting later $oldcMargin = $this->cMargin; $this->SetCellPadding(0); // Set some constants which control header item layout // only set them once or the PHP interpreter gets angry - if ($this->pageNumber == 0) + if ($this->pageNumber == 1) { define('COMPANY_WIDTH', 150); define('LOGO_HEIGHT', 50); @@ -419,17 +471,15 @@ class FrontReport extends Cpdf $footerRow = $this->bottomMargin - FOOTER_MARGIN; // Calling this function generates a new PDF page after the first instance - $this->pageNumber++; - if ($this->pageNumber > 1) - { +// { // // TODO: experimenting with line drawing to highlight current period // $this->SetLineWidth(1); // $this->LineTo($this->cols[3], 33, $this->cols[3], 534); // $this->LineTo($this->cols[4], 33, $this->cols[4], 534); // $this->SetLineWidth(0.1); - $this->newPage(); - } +// $this->newPage(); +// } $this->row = $this->pageHeight - $this->topMargin; // Set the color of dividing lines we'll draw @@ -879,7 +929,38 @@ class FrontReport extends Cpdf // Check to see if we're at the bottom and should insert a page break if ($this->row < $this->bottomMargin + ($np * $h)) - $this->{$this->headerFunc}(); // call header template chosen by current report + $this->NewPage(); + } + + function NewPage() + { + if ($this->pageNumber==0) + { + // check if there is pdf header template for this report + // and set if it is found + $tmpl_pdf = find_custom_file("/reporting/forms/".$this->headerTmpl.".pdf"); + if ($tmpl_pdf) { + $this->tmplSize = $this->setSourceFile($tmpl_pdf); + } + } + + $this->pageNumber++; + parent::newPage(); + + if ($this->tmplSize) { + $this->row = $this->pageHeight - $this->topMargin; // reset row + $id = $this->importPage(min($this->pageNumber, $this->tmplSize)); + $this->useTemplate($id); + } + + // include related php file if any + $tmpl_php = find_custom_file("/reporting/forms/".$this->headerTmpl.".php"); + if ($tmpl_php) { + include($tmpl_php); + } + + if (method_exists($this, $this->headerTmpl)) // draw predefined page layout if any + $this->{$this->headerTmpl}(); } function End($email=0, $subject=null, $myrow=null, $doctype = 0) @@ -893,13 +974,6 @@ class FrontReport extends Cpdf echo ''; echo trim($pdfcode); echo ''; - //header("Content-Length: $len"); - //header("Content-Disposition: inline; filename=" . $this->filename); - //header('Expires: 0'); - //header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); - //header('Pragma: public'); - - //$this->pdf->stream(); } else { @@ -963,7 +1037,7 @@ class FrontReport extends Cpdf } else { - $printer = get_report_printer(user_print_profile(), $_POST['REP_ID']); + $printer = get_report_printer(user_print_profile(), $this->rep_id); if ($printer == false) { if(in_ajax()) { global $Ajax; @@ -973,16 +1047,6 @@ class FrontReport extends Cpdf else $Ajax->redirect($fname); // otherwise use faster method } else { - //echo ' - // - // - // - // - // click here if you are not re-directed. - // - // '; header('Content-type: application/pdf'); header("Content-Disposition: inline; filename=$this->filename"); header('Expires: 0'); -- 2.30.2