Option for Logo on Reports.
[fa-stable.git] / reporting / includes / pdf_report.inc
index 414151bafa3c8501e34d382bcaf7f586d0c50bf6..c475a29be608bdeafbcc8807db72efac9d40190f 100644 (file)
@@ -20,6 +20,7 @@
 */
 include_once(dirname(__FILE__)."/class.pdf.inc");
 include_once(dirname(__FILE__)."/printer_class.inc");
+include_once($path_to_root . "/reporting/includes/reporting.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");
@@ -65,7 +66,8 @@ class FrontReport extends Cpdf
 
        var $rep_id;
        var $formData; // common data used for printing headers footers etc.
-
+       var $contactData; // contact data for sending emials/reportlanguage selection
+       
        var $dest;      // destination: email or printer
        
        function FrontReport($title, $filename, $size = 'A4', $fontsize = 9, $orientation = 'P', $margins = NULL, $excelColWidthFactor = NULL)
@@ -219,13 +221,8 @@ class FrontReport extends Cpdf
                $this->currency = '';
                $this->scaleLogoWidth = false; // if Logo, scale on width (else height).
                $this->SetHeaderType('Header'); // default
-               
-               $rtl = ($_SESSION['language']->dir === 'rtl' ? 'rtl' : 'ltr');
-               $code = $_SESSION['language']->code;
-               $enc = strtoupper($_SESSION['language']->encoding);
-               // for the language array in class.pdf.inc
-               $l = array('a_meta_charset' => $enc, 'a_meta_dir' => $rtl, 'a_meta_language' => $code, 'w_page' => 'page');
-               $this->Cpdf($size, $l, $orientation);
+
+               $this->Cpdf($size, $_SESSION['language']->code, $orientation);
        }
        
        /*
@@ -257,12 +254,12 @@ class FrontReport extends Cpdf
                $cols2 = null, $headers2 = null, $aligns2 = null,
                $companylogoenable = false, $footerenable = false, $footertext = '')
        {
-               global $app_title, $version, $power_by, $power_url;
+               global $SysPrefs, $version;
 
-               $this->addinfo('Title', $this->title);
-               $this->addinfo('Subject', $this->title);
-               $this->addinfo('Author', $app_title . ' ' . $version);
-               $this->addinfo('Creator',$power_by . ' - ' . $power_url);
+               $this->addInfo('Title', $this->title);
+               $this->addInfo('Subject', $this->title);
+               $this->addInfo('Author', $SysPrefs->app_title . ' ' . $version);
+               $this->addInfo('Creator',$SysPrefs->power_by . ' - ' . $SysPrefs->power_url);
                $year = get_current_fiscalyear();
                if ($year['closed'] == 0)
                        $how = _("Active");
@@ -299,6 +296,8 @@ class FrontReport extends Cpdf
        //
        function Header()
        {
+               global $SysPrefs;
+               
                $companyCol = $this->endLine - 150;
                $titleCol = $this->leftMargin + 100;
 
@@ -314,9 +313,18 @@ class FrontReport extends Cpdf
                $this->Text($this->leftMargin, $this->title, $companyCol);
                $this->Font();
                $this->fontSize -= 4;
-               $this->Text($companyCol, $this->company['coy_name']);
-               $this->row -= ($this->lineHeight + 4);
-
+               $logo = company_path() . "/images/" . $this->company['coy_logo'];
+               if (!empty($SysPrefs->show_company_logo_report) && $this->company['coy_logo'] != '' && file_exists($logo))
+               {
+                       $this->row -= ($this->lineHeight + 3);
+                       $this->AddImage($logo, $companyCol, $this->row, 0, 30);
+                       $this->row -= 6;
+               }
+               else
+               {
+                       $this->Text($companyCol, $this->company['coy_name']);
+                       $this->row -= ($this->lineHeight + 4);
+               }
                $str = _("Print Out Date") . ':';
                $this->Text($this->leftMargin, $str, $titleCol);
                $str = Today() . '   ' . Now();
@@ -377,10 +385,8 @@ class FrontReport extends Cpdf
        /*
                Transition function 
        */
-       function SetCommonData($myrow, $branch, $sales_order, $bankaccount, $doctype)
+       function SetCommonData($myrow, $branch, $sales_order, $bankaccount, $doctype, $contacts)
        {
-//             $this->formData = array_merge($myrow, $branch, $sales_order, 
-//                     $bank_account, array('doctype' => $doctype));
 
                $this->formData = array();
                $datnames = array( 
@@ -390,22 +396,31 @@ class FrontReport extends Cpdf
                        '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'),
+                       'ov_freight', 'ov_gst', 'ov_amount', 'prepaid', 'requisition_no', 'contact'),
                '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')
+               'bankaccount' => array('bank_name', 'bank_account_number', 'payment_service')
                );
-       
+
                foreach($datnames as $var => $fields) {
                        if (isset($$var)) {
                                foreach($fields as $locname) {
-                                       if (isset(${$var}[$locname])) {
+                                       if (isset(${$var}[$locname]) && (${$var}[$locname]!==null)) {
                                                $this->formData[$locname] = ${$var}[$locname];
                                        }
                                }
                        }
                }
                $this->formData['doctype'] = $doctype;
+               $this->formData['document_amount'] = @$this->formData['ov_amount']+@$this->formData['ov_freight']+@$this->formData['ov_gst'];
+               if (count($contacts)) {
+                       if (!is_array($contacts[0]))
+                               $contacts = array($contacts); // change to array when single contact passed
+                       $this->contactData = $contacts;
+                       // as report is currently generated once despite number of email recipients
+                       // we select language for the first recipient as report language
+                       $this->formData['rep_lang'] = $contacts[0]['lang'];
+               }
        }
        /*
                Set header handler
@@ -418,22 +433,19 @@ class FrontReport extends Cpdf
        */
        function Header2()
        {
-               global $comp_path, $path_to_root, $print_as_quote, $print_invoice_no, $packing_slip; // FIXME
+               global $dflt_lang; // FIXME should be passed as params
 
+               $this->SetLang(@$this->formData['rep_lang'] ? $this->formData['rep_lang'] : $dflt_lang);
                $doctype = $this->formData['doctype'];
                $header2type = true;
-               
+
+               $lang = user_language();
+               $this->SetLang(@$this->formData['rep_lang'] ? $this->formData['rep_lang']
+                       : ( $lang ? $lang : $dflt_lang));
+
                 // leave layout files names without path to enable including
-                // modified versions from comapny/x/reporting directory
-               if (isset($myrow['curr_code']) && $this->currency != $myrow['curr_code'])
-               {
-                       include("includes/doctext2.inc");
-               }
-               else
-               {
-                       include("includes/doctext.inc");
-               }
-               
+                // modified versions from company/x/reporting directory
+               include("includes/doctext.inc");
                include("includes/header2.inc");
 
                $this->row = $temp;
@@ -442,8 +454,6 @@ class FrontReport extends Cpdf
        // Alternate header style which also supports a simple footer
        function Header3()
        {
-               global $comp_path;
-
                // Turn off cell padding for the main report header, restoring the current setting later
                $oldcMargin = $this->cMargin;
                $this->SetCellPadding(0);
@@ -470,16 +480,6 @@ class FrontReport extends Cpdf
                $footerCol = $this->leftMargin + PAGE_NUM_WIDTH; 
                $footerRow = $this->bottomMargin - FOOTER_MARGIN;
 
-               // Calling this function generates a new PDF page after the first instance
-//             {
-//                     // 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->row = $this->pageHeight - $this->topMargin;
 
                // Set the color of dividing lines we'll draw
@@ -521,15 +521,14 @@ class FrontReport extends Cpdf
                $this->fontSize = HEADER1_FONT_SIZE;
 
                // Print company logo if present and requested, or else just print company name
-               if ($this->companyLogoEnable && ($this->company['coy_logo'] != ''))
+               // Build a string specifying the location of the company logo file
+               $logo = company_path() . "/images/" . $this->company['coy_logo'];
+               if ($this->companyLogoEnable && ($this->company['coy_logo'] != '') && file_exists($logo))
                {
-                       // Build a string specifying the location of the company logo file
-                       $logo = $comp_path .'/'. user_company() . "/images/" . $this->company['coy_logo'];
-
                        // Width being zero means that the image will be scaled to the specified height
                        // keeping its aspect ratio intact.
                        if ($this->scaleLogoWidth)
-                               $this->AddImage($logo, $companyCol, $this->row, COMPANY_WIDTH, 0);
+                               $this->AddImage($logo, $companyCol, $this->row + 15, COMPANY_WIDTH, 0);
                        else    
                                $this->AddImage($logo, $companyCol, $this->row - (LOGO_HEIGHT * LOGO_Y_POS_ADJ_FACTOR), 0, LOGO_HEIGHT);
                }
@@ -718,25 +717,6 @@ class FrontReport extends Cpdf
                return $drawColor;
        }
        
-       function SetDrawColor($r, $g, $b)
-       {
-               parent::SetDrawColor($r, $g, $b);
-       }
-
-       function SetTextColor($r, $g, $b)
-       {
-               parent::SetTextColor($r, $g, $b);
-       }
-
-       /**
-     * Set the fill color for table cells.
-     * @see reporting/includes/TCPDF#SetFillColor($col1, $col2, $col3, $col4)
-     */
-       function SetFillColor($r, $g, $b)
-       {
-               parent::SetFillColor($r, $g, $b);
-       }
-
        // Get current cell padding setting from TCPDF object
        function GetCellPadding()
        {
@@ -758,14 +738,16 @@ class FrontReport extends Cpdf
                return $this->TextWrap($c, $this->row - $r, $n - $c + $corr, $txt, $align, $border, $fill, $link, $stretch);
        }
 
-       function TextWrap($xpos, $ypos, $len, $str, $align = 'left', $border = 0, $fill = 0, $link = NULL, $stretch = 1)
+       function TextWrap($xpos, $ypos, $len, $str, $align = 'left', $border = 0, $fill = 0, $link = NULL, $stretch = 1, $spacebreak=false)
        {
+               $str = strtr($str, array("\r"=>''));
+
                if ($this->fontSize != $this->oldFontSize)
                {
                        $this->SetFontSize($this->fontSize);
                        $this->oldFontSize = $this->fontSize;
                }
-               return $this->addTextWrap($xpos, $ypos, $len, $this->fontSize, $str, $align, $border, $fill, $link, $stretch);
+               return $this->addTextWrap($xpos, $ypos, $len, $this->fontSize, $str, $align, $border, $fill, $link, $stretch, $spacebreak);
        }
 
        function TextCol($c, $n, $txt, $corr=0, $r=0, $border=0, $fill=0, $link=NULL, $stretch=1)
@@ -806,21 +788,22 @@ class FrontReport extends Cpdf
                return $this->TextWrap($this->cols2[$c], $this->row - $r, $this->cols2[$n] - $this->cols2[$c] + $corr, $txt, $this->aligns2[$c], $border, $fill, $link, $stretch);
        }
 
-       function TextColLines($c, $n, $txt, $corr=0, $r=0, $border=0, $fill=0, $link=NULL, $stretch=1)
+       function TextColLines($c, $n, $txt, $corr=0, $r=0, $border=0, $fill=0, $link=NULL, $stretch=0)
        {
                $this->row -= $r;
-               $this->TextWrapLines($this->cols[$c], $this->cols[$n] - $this->cols[$c] + $corr, $txt, $this->aligns[$c], $border, $fill, $link, $stretch);
+               $this->TextWrapLines($this->cols[$c], $this->cols[$n] - $this->cols[$c] + $corr, $txt, $this->aligns[$c], $border, $fill, $link, $stretch, true);
        }
 
-       function TextWrapLines($c, $width, $txt, $align='left', $border=0, $fill=0, $link=NULL, $stretch=1)
+       function TextWrapLines($c, $width, $txt, $align='left', $border=0, $fill=0, $link=NULL, $stretch=0, $spacebreak=true)
        {
-               $str = Explode("\n", $txt);
+               $str = explode("\n", $txt);
+
                for ($i = 0; $i < count($str); $i++)
                {
                        $l = $str[$i];
                        do
                        {
-                               $l = $this->TextWrap($c, $this->row , $width, $l, $align, $border, $fill, $link, $stretch);
+                               $l = $this->TextWrap($c, $this->row , $width, $l, $align, $border, $fill, $link, $stretch, $spacebreak);
                                $this->row -= $this->lineHeight;
                        }
                        while ($l != '');
@@ -870,7 +853,7 @@ class FrontReport extends Cpdf
                parent::line($from, $row, $to, $row2);
        }
 
-       function Line($row, $height = 0)
+       function Line($row, $height = 0, $dummy1=null, $dummy2=null, $dummy3=null)
        {
                $oldLineWidth = $this->GetLineWidth();
                $this->SetLineWidth($height + 1);
@@ -963,22 +946,21 @@ class FrontReport extends Cpdf
                        $this->{$this->headerTmpl}();
        }
 
-       function End($email=0, $subject=null, $myrow=null, $doctype = 0)
+       function End($email=0, $subject='')
        {
-               global $pdf_debug, $path_to_root, $comp_path;
+               global $SysPrefs, $path_to_root;
 
-               if ($pdf_debug == 1)
+               if ($SysPrefs->pdf_debug == 1)
                {
                        $pdfcode = $this->Output('','S');
-                       $pdfcode = str_replace("\n", "\n<br>", htmlspecialchars($pdfcode));
+                       $pdfcode = str_replace("\n", "\n<br>", html_specials_encode($pdfcode));
                        echo '<html><body>';
                        echo trim($pdfcode);
                        echo '</body></html>';
                }
                else
                {
-
-                       $dir =  $comp_path.'/'.user_company(). '/pdf_files';
+                       $dir =  company_path(). '/pdf_files';
                        //save the file
                        if (!file_exists($dir))
                        {
@@ -986,60 +968,81 @@ class FrontReport extends Cpdf
                        }
                        // do not use standard filenames or your sensitive company data 
                        // are world readable
-                       if ($email == 1)
-                               $fname = $dir.'/'.$this->filename;
-                       else    
-                               $fname = $dir.'/'.uniqid('').'.pdf';
+                       $fname = $dir.'/'.random_id().'.pdf';
                        $this->Output($fname, 'F');
+
                        if ($email == 1)
                        {
-                               $emailtype = true;
-                               if ($this->currency != $myrow['curr_code'])
-                               {
-                                       include("includes/doctext2.inc");
-                               }
-                               else
-                               {
-                                       include("includes/doctext.inc");
-                               }
-                               require_once($path_to_root . "/reporting/includes/class.mail.inc");
-                       $mail = new email(str_replace(",", "", $this->company['coy_name']), $this->company['email']);
-                               if (!isset($myrow['email']) || $myrow['email'] == '') 
-                                       $myrow['email'] = isset($myrow['contact_email']) ? $myrow['contact_email'] : '';
-                       $to = str_replace(",", "", $myrow['DebtorName']) . " <" . $myrow['email'] . ">";
-                       $msg = $doc_Dear_Sirs . " " . $myrow['DebtorName'] . ",\n\n" . $doc_AttachedFile . " " . $subject .
-                               "\n\n";
-                               if (isset($myrow['dimension_id']) && $myrow['dimension_id'] > 0 && $doctype == ST_SALESINVOICE) // helper for payment links
-                               {
-                                       if ($myrow['dimension_id'] == 1)
-                                       {
-                                               $amt = number_format($myrow["ov_freight"] + $myrow["ov_gst"] +  $myrow["ov_amount"], user_price_dec());
-                                               $txt = $doc_Payment_Link . " PayPal: ";
-                                               $nn = urlencode($this->title . " " . $myrow['reference']);
-                                               $url = "https://www.paypal.com/xclick/business=" . $this->company['email'] . "&item_name=" .
-                                                       $nn . "&amount=" . $amt . "&currency_code=" . $myrow['curr_code'];
-                                               $msg .= $txt . $url . "\n\n";
-                                       }
+                               $contactData = array();
+                               if ($this->contactData)
+                                       foreach($this->contactData as $contact)
+                                               if (!empty($contact['email']))
+                                                       $contactData[] = $contact;
+
+                               if(!count($contactData)) {
+                                       $this->SetLang(user_language());
+                                       display_warning(sprintf(_("You have no email contact defined for this type of document for '%s'."), $this->formData['recipient_name']));
+                               } else {
+                                       $sent = $try = 0;
+                                       $emails = "";
+                                       if(!$subject)
+                                               $subject = $this->formData['document_name'] . ' '. $this->formData['document_number'];
+                                       foreach($contactData as $contact) {
+                                               if (!isset($contact['email'])) 
+                                                       continue;
+                                               $emailtype = true;
+                                               $this->SetLang($contact['lang']);
+
+                                               require_once($path_to_root . "/reporting/includes/class.mail.inc");
+                                       $mail = new email(str_replace(",", "", $this->company['coy_name']),
+                                               $this->company['email']);
+                                               $mail->charset = $this->encoding;
+
+                                       $to = str_replace(",", "", $contact['name'].' '.$contact['name2'])
+                                               ." <" . $contact['email'] . ">";
+                                       $msg = _("Dear") . " " . $contact['name2'] . ",\n\n" 
+                                               . _("Attached you will find ") . " " . $subject ."\n\n";
+
+                                               if (isset($this->formData['payment_service']))
+                                               {
+                                                       $amt = number_format($this->formData['document_amount'], user_price_dec());
+                                                       $service = $this->formData['payment_service'];
+                                                       $url = payment_link($service, array(
+                                                                       'company_email' => $this->company['email'],
+                                                                       'amount' => $amt,
+                                                                       'currency' => $this->formData['curr_code'],
+                                                                       'comment' => $this->title . " " . $this->formData['document_number']
+                                                                       ));
+                                                       if ($url)
+                                                               $msg.= _("You can pay through"). " $service: $url\n\n";
+                                               }
+
+                                       $msg .= _("Kindest regards") . "\n\n";
+                                       $sender = $this->user . "\n" . $this->company['coy_name'] . "\n" . $this->company['postal_address'] . "\n" . $this->company['email'] . "\n" . $this->company['phone'];
+                                       $mail->to($to); $try++;
+                                       $mail->subject($subject);
+                                       $mail->text($msg . $sender);
+                                       $mail->attachment($fname, $this->filename);
+                                       $emails .= " " . $contact['email'];
+                                       if ($mail->send()) $sent++;
+                                       } // foreach contact
+                                       unlink($fname);
+                                       $this->SetLang(user_language());
+                                       if (!$try) {
+                                               display_warning(sprintf(_("You have no email contact defined for this type of document for '%s'."), $this->formData['recipient_name']));
+                                       } elseif (!$sent)
+                                               display_warning($this->title . " " . $this->formData['document_number'] . ". "
+                                                       . _("Sending document by email failed") . ". " . _("Email:") . $emails);
+                                       else
+                                               display_notification($this->title . " " . $this->formData['document_number'] . " " 
+                                                       . _("has been sent by email to destination.") . " " . _("Email:") . $emails);
                                }
-                       $msg .= $doc_Kindest_regards . "\n\n";
-                       $sender = $this->user . "\n" . $this->company['coy_name'] . "\n" . $this->company['postal_address'] . "\n" . $this->company['email'] . "\n" . $this->company['phone'];
-                       $mail->to($to);
-                       $mail->subject($subject);
-                       $mail->text($msg . $sender);
-                       $mail->attachment($fname);
-                       $ret = $mail->send();
-                               if (!$ret)
-                                       display_error(_("Sending document by email failed"));
-                               else
-                                       display_notification($this->title . " " . $myrow['reference'] . " " 
-                                               . _("has been sent by email."));
-                               unlink($fname);         
                        }
                        else
                        {
                                $printer = get_report_printer(user_print_profile(), $this->rep_id);
                                if ($printer == false) {
-                                       if(in_ajax()) {
+                                       if (in_ajax()) {
                                                global $Ajax;
 
                                                if (user_rep_popup()) 
@@ -1047,13 +1050,12 @@ class FrontReport extends Cpdf
                                                else
                                                        $Ajax->redirect($fname); // otherwise use faster method
                                        } else {
-                       header('Content-type: application/pdf');
-                   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->Stream();
+                                               header('Content-type: application/pdf');
+                                               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->Stream($this->filename);
                                        }
                                } else { // send report to network printer
                                        $prn = new remote_printer($printer['queue'],$printer['host'],
@@ -1083,4 +1085,3 @@ class FrontReport extends Cpdf
        }
 }
 
-?>
\ No newline at end of file