Created
January 19, 2020 17:35
-
-
Save 03balogun/6f274b637f3361ab4c55482b11adf810 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* | |
* SugarCRM Community Edition is a customer relationship management program developed by | |
* SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc. | |
* | |
* SuiteCRM is an extension to SugarCRM Community Edition developed by SalesAgility Ltd. | |
* Copyright (C) 2011 - 2018 SalesAgility Ltd. | |
* | |
* This program is free software; you can redistribute it and/or modify it under | |
* the terms of the GNU Affero General Public License version 3 as published by the | |
* Free Software Foundation with the addition of the following permission added | |
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK | |
* IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY | |
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. | |
* | |
* This program is distributed in the hope that it will be useful, but WITHOUT | |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more | |
* details. | |
* | |
* You should have received a copy of the GNU Affero General Public License along with | |
* this program; if not, see http://www.gnu.org/licenses or write to the Free | |
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
* 02110-1301 USA. | |
* | |
* You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, | |
* SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. | |
* | |
* The interactive user interfaces in modified source and object code versions | |
* of this program must display Appropriate Legal Notices, as required under | |
* Section 5 of the GNU Affero General Public License version 3. | |
* | |
* In accordance with Section 7(b) of the GNU Affero General Public License version 3, | |
* these Appropriate Legal Notices must retain the display of the "Powered by | |
* SugarCRM" logo and "Supercharged by SuiteCRM" logo. If the display of the logos is not | |
* reasonably feasible for technical reasons, the Appropriate Legal Notices must | |
* display the words "Powered by SugarCRM" and "Supercharged by SuiteCRM". | |
*/ | |
if (!isset($_REQUEST['uid']) || empty($_REQUEST['uid']) || !isset($_REQUEST['templateID']) || empty($_REQUEST['templateID'])) { | |
die('Error retrieving record. This record may be deleted or you may not be authorized to view it.'); | |
} | |
$level = error_reporting(); | |
$state = new \SuiteCRM\StateSaver(); | |
$state->pushErrorLevel(); | |
error_reporting(0); | |
require_once('modules/AOS_PDF_Templates/PDF_Lib/mpdf.php'); | |
require_once('modules/AOS_PDF_Templates/templateParser.php'); | |
require_once('modules/AOS_PDF_Templates/AOS_PDF_Templates.php'); | |
$state->popErrorLevel(); | |
if ($level !== error_reporting()) { | |
throw new Exception('Incorrect error reporting level'); | |
} | |
global $mod_strings, $sugar_config, $log; | |
$bean = BeanFactory::getBean($_REQUEST['module'], $_REQUEST['uid']); | |
if (!$bean) { | |
sugar_die("Invalid Record"); | |
} | |
$task = $_REQUEST['task']; | |
$variableName = strtolower($bean->module_dir); | |
$lineItemsGroups = array(); | |
$lineItems = array(); | |
$sql = "SELECT pg.id, pg.product_id, pg.group_id FROM aos_products_quotes pg LEFT JOIN aos_line_item_groups lig ON pg.group_id = lig.id WHERE pg.parent_type = '" . $bean->object_name . "' AND pg.parent_id = '" . $bean->id . "' AND pg.deleted = 0 ORDER BY lig.number ASC, pg.number ASC"; | |
$res = $bean->db->query($sql); | |
while ($row = $bean->db->fetchByAssoc($res)) { | |
$lineItemsGroups[$row['group_id']][$row['id']] = $row['product_id']; | |
$lineItems[$row['id']] = $row['product_id']; | |
} | |
$template = new AOS_PDF_Templates(); | |
$template->retrieve($_REQUEST['templateID']); | |
$object_arr = array(); | |
$object_arr[$bean->module_dir] = $bean->id; | |
//backward compatibility | |
$object_arr['Accounts'] = $bean->billing_account_id; | |
$object_arr['Contacts'] = $bean->billing_contact_id; | |
$object_arr['Users'] = $bean->assigned_user_id; | |
$object_arr['Currencies'] = $bean->currency_id; | |
$search = array('/<script[^>]*?>.*?<\/script>/si', // Strip out javascript | |
'/<[\/\!]*?[^<>]*?>/si', // Strip out HTML tags | |
'/([\r\n])[\s]+/', // Strip out white space | |
'/&(quot|#34);/i', // Replace HTML entities | |
'/&(amp|#38);/i', | |
'/&(lt|#60);/i', | |
'/&(gt|#62);/i', | |
'/&(nbsp|#160);/i', | |
'/&(iexcl|#161);/i', | |
'/<address[^>]*?>/si', | |
'/&(apos|#0*39);/', | |
'/&#(\d+);/' | |
); | |
$replace = array('', | |
'', | |
'\1', | |
'"', | |
'&', | |
'<', | |
'>', | |
' ', | |
chr(161), | |
'<br>', | |
"'", | |
'chr(%1)' | |
); | |
$header = preg_replace($search, $replace, $template->pdfheader); | |
$footer = preg_replace($search, $replace, $template->pdffooter); | |
$text = preg_replace($search, $replace, $template->description); | |
$text = str_replace("<p><pagebreak /></p>", "<pagebreak />", $text); | |
$text = preg_replace_callback( | |
'/\{DATE\s+(.*?)\}/', | |
function ($matches) { | |
return date($matches[1]); | |
}, | |
$text | |
); | |
$text = str_replace("\$aos_quotes", "\$" . $variableName, $text); | |
$text = str_replace("\$aos_invoices", "\$" . $variableName, $text); | |
$text = str_replace("\$total_amt", "\$" . $variableName . "_total_amt", $text); | |
$text = str_replace("\$discount_amount", "\$" . $variableName . "_discount_amount", $text); | |
$text = str_replace("\$subtotal_amount", "\$" . $variableName . "_subtotal_amount", $text); | |
$text = str_replace("\$tax_amount", "\$" . $variableName . "_tax_amount", $text); | |
$text = str_replace("\$shipping_amount", "\$" . $variableName . "_shipping_amount", $text); | |
$text = str_replace("\$total_amount", "\$" . $variableName . "_total_amount", $text); | |
$text = populate_group_lines($text, $lineItemsGroups, $lineItems); | |
$converted = templateParser::parse_template($text, $object_arr); | |
$header = templateParser::parse_template($header, $object_arr); | |
$footer = templateParser::parse_template($footer, $object_arr); | |
$printable = str_replace("\n", "<br />", $converted); | |
if ($task == 'pdf' || $task == 'emailpdf') { | |
$file_name = $mod_strings['LBL_PDF_NAME'] . "_" . str_replace(" ", "_", $bean->name) . ".pdf"; | |
ob_clean(); | |
try { | |
$orientation = ($template->orientation == "Landscape") ? "-L" : ""; | |
$pdf = new mPDF('en', $template->page_size . $orientation, '', 'DejaVuSansCondensed', $template->margin_left, $template->margin_right, $template->margin_top, $template->margin_bottom, $template->margin_header, $template->margin_footer); | |
$pdf->SetAutoFont(); | |
$pdf->SetHTMLHeader($header); | |
$pdf->SetHTMLFooter($footer); | |
$pdf->WriteHTML($printable); | |
if ($task == 'pdf') { | |
$pdf->Output($file_name, "D"); | |
} else { | |
$pdfPath = $sugar_config['upload_dir'] . 'attachfile.pdf'; | |
$fp = fopen($pdfPath, 'wb'); | |
fclose($fp); | |
$pdf->Output($pdfPath, 'F'); | |
$account = BeanFactory::getBean('Accounts', $bean->billing_account_id); | |
$primary_email = $account->emailAddress->getPrimaryAddress($account); | |
$mailSubject = "Invoice for ".$bean->name; | |
$mailBody = "<p>Hello customer, see attachment for your invoice</p>"; | |
/** | |
* Here are calling the function defined earlier our custom/include/custom_utils.php | |
* Passing all the required paramenters. | |
*/ | |
sendEmail($primary_email, $mailSubject, $mailBody, [ | |
'name' => $file_name, | |
'path' => $pdfPath, | |
]); | |
} | |
} catch (mPDF_exception $e) { | |
echo $e; | |
} | |
} else{ | |
$log->fatal("Error occurred sending mail"); | |
} | |
function populate_group_lines($text, $lineItemsGroups, $lineItems, $element = 'table') | |
{ | |
$firstValue = ''; | |
$firstNum = 0; | |
$lastValue = ''; | |
$lastNum = 0; | |
$startElement = '<' . $element; | |
$endElement = '</' . $element . '>'; | |
$groups = new AOS_Line_Item_Groups(); | |
foreach ($groups->field_defs as $name => $arr) { | |
if (!((isset($arr['dbType']) && strtolower($arr['dbType']) == 'id') || $arr['type'] == 'id' || $arr['type'] == 'link')) { | |
$curNum = strpos($text, '$aos_line_item_groups_' . $name); | |
if ($curNum) { | |
if ($curNum < $firstNum || $firstNum == 0) { | |
$firstValue = '$aos_line_item_groups_' . $name; | |
$firstNum = $curNum; | |
} | |
if ($curNum > $lastNum) { | |
$lastValue = '$aos_line_item_groups_' . $name; | |
$lastNum = $curNum; | |
} | |
} | |
} | |
} | |
if ($firstValue !== '' && $lastValue !== '') { | |
//Converting Text | |
$parts = explode($firstValue, $text); | |
$text = $parts[0]; | |
$parts = explode($lastValue, $parts[1]); | |
if ($lastValue == $firstValue) { | |
$groupPart = $firstValue . $parts[0]; | |
} else { | |
$groupPart = $firstValue . $parts[0] . $lastValue; | |
} | |
if (count($lineItemsGroups) != 0) { | |
//Read line start <tr> value | |
$tcount = strrpos($text, $startElement); | |
$lsValue = substr($text, $tcount); | |
$tcount = strpos($lsValue, ">") + 1; | |
$lsValue = substr($lsValue, 0, $tcount); | |
//Read line end values | |
$tcount = strpos($parts[1], $endElement) + strlen($endElement); | |
$leValue = substr($parts[1], 0, $tcount); | |
//Converting Line Items | |
$obb = array(); | |
$tdTemp = explode($lsValue, $text); | |
$groupPart = $lsValue . $tdTemp[count($tdTemp) - 1] . $groupPart . $leValue; | |
$text = $tdTemp[0]; | |
foreach ($lineItemsGroups as $group_id => $lineItemsArray) { | |
$groupPartTemp = populate_product_lines($groupPart, $lineItemsArray); | |
$groupPartTemp = populate_service_lines($groupPartTemp, $lineItemsArray); | |
$obb['AOS_Line_Item_Groups'] = $group_id; | |
$text .= templateParser::parse_template($groupPartTemp, $obb); | |
$text .= '<br />'; | |
} | |
$tcount = strpos($parts[1], $endElement) + strlen($endElement); | |
$parts[1] = substr($parts[1], $tcount); | |
} else { | |
$tcount = strrpos($text, $startElement); | |
$text = substr($text, 0, $tcount); | |
$tcount = strpos($parts[1], $endElement) + strlen($endElement); | |
$parts[1] = substr($parts[1], $tcount); | |
} | |
$text .= $parts[1]; | |
} else { | |
$text = populate_product_lines($text, $lineItems); | |
$text = populate_service_lines($text, $lineItems); | |
} | |
return $text; | |
} | |
function populate_product_lines($text, $lineItems, $element = 'tr') | |
{ | |
$firstValue = ''; | |
$firstNum = 0; | |
$lastValue = ''; | |
$lastNum = 0; | |
$startElement = '<' . $element; | |
$endElement = '</' . $element . '>'; | |
//Find first and last valid line values | |
$product_quote = new AOS_Products_Quotes(); | |
foreach ($product_quote->field_defs as $name => $arr) { | |
if (!((isset($arr['dbType']) && strtolower($arr['dbType']) == 'id') || $arr['type'] == 'id' || $arr['type'] == 'link')) { | |
$curNum = strpos($text, '$aos_products_quotes_' . $name); | |
if ($curNum) { | |
if ($curNum < $firstNum || $firstNum == 0) { | |
$firstValue = '$aos_products_quotes_' . $name; | |
$firstNum = $curNum; | |
} | |
if ($curNum > $lastNum) { | |
$lastValue = '$aos_products_quotes_' . $name; | |
$lastNum = $curNum; | |
} | |
} | |
} | |
} | |
$product = new AOS_Products(); | |
foreach ($product->field_defs as $name => $arr) { | |
if (!((isset($arr['dbType']) && strtolower($arr['dbType']) == 'id') || $arr['type'] == 'id' || $arr['type'] == 'link')) { | |
$curNum = strpos($text, '$aos_products_' . $name); | |
if ($curNum) { | |
if ($curNum < $firstNum || $firstNum == 0) { | |
$firstValue = '$aos_products_' . $name; | |
$firstNum = $curNum; | |
} | |
if ($curNum > $lastNum) { | |
$lastValue = '$aos_products_' . $name; | |
$lastNum = $curNum; | |
} | |
} | |
} | |
} | |
if ($firstValue !== '' && $lastValue !== '') { | |
//Converting Text | |
$tparts = explode($firstValue, $text); | |
$temp = $tparts[0]; | |
//check if there is only one line item | |
if ($firstNum == $lastNum) { | |
$linePart = $firstValue; | |
} else { | |
$tparts = explode($lastValue, $tparts[1]); | |
$linePart = $firstValue . $tparts[0] . $lastValue; | |
} | |
$tcount = strrpos($temp, $startElement); | |
$lsValue = substr($temp, $tcount); | |
$tcount = strpos($lsValue, ">") + 1; | |
$lsValue = substr($lsValue, 0, $tcount); | |
//Read line end values | |
$tcount = strpos($tparts[1], $endElement) + strlen($endElement); | |
$leValue = substr($tparts[1], 0, $tcount); | |
$tdTemp = explode($lsValue, $temp); | |
$linePart = $lsValue . $tdTemp[count($tdTemp) - 1] . $linePart . $leValue; | |
$parts = explode($linePart, $text); | |
$text = $parts[0]; | |
//Converting Line Items | |
if (count($lineItems) != 0) { | |
foreach ($lineItems as $id => $productId) { | |
if ($productId != null && $productId != '0') { | |
$obb['AOS_Products_Quotes'] = $id; | |
$obb['AOS_Products'] = $productId; | |
$text .= templateParser::parse_template($linePart, $obb); | |
} | |
} | |
} | |
for ($i = 1; $i < count($parts); $i++) { | |
$text .= $parts[$i]; | |
} | |
} | |
return $text; | |
} | |
function populate_service_lines($text, $lineItems, $element = 'tr') | |
{ | |
$firstValue = ''; | |
$firstNum = 0; | |
$lastValue = ''; | |
$lastNum = 0; | |
$startElement = '<' . $element; | |
$endElement = '</' . $element . '>'; | |
$text = str_replace("\$aos_services_quotes_service", "\$aos_services_quotes_product", $text); | |
//Find first and last valid line values | |
$product_quote = new AOS_Products_Quotes(); | |
foreach ($product_quote->field_defs as $name => $arr) { | |
if (!((isset($arr['dbType']) && strtolower($arr['dbType']) == 'id') || $arr['type'] == 'id' || $arr['type'] == 'link')) { | |
$curNum = strpos($text, '$aos_services_quotes_' . $name); | |
if ($curNum) { | |
if ($curNum < $firstNum || $firstNum == 0) { | |
$firstValue = '$aos_products_quotes_' . $name; | |
$firstNum = $curNum; | |
} | |
if ($curNum > $lastNum) { | |
$lastValue = '$aos_products_quotes_' . $name; | |
$lastNum = $curNum; | |
} | |
} | |
} | |
} | |
if ($firstValue !== '' && $lastValue !== '') { | |
$text = str_replace("\$aos_products", "\$aos_null", $text); | |
$text = str_replace("\$aos_services", "\$aos_products", $text); | |
//Converting Text | |
$tparts = explode($firstValue, $text); | |
$temp = $tparts[0]; | |
//check if there is only one line item | |
if ($firstNum == $lastNum) { | |
$linePart = $firstValue; | |
} else { | |
$tparts = explode($lastValue, $tparts[1]); | |
$linePart = $firstValue . $tparts[0] . $lastValue; | |
} | |
$tcount = strrpos($temp, $startElement); | |
$lsValue = substr($temp, $tcount); | |
$tcount = strpos($lsValue, ">") + 1; | |
$lsValue = substr($lsValue, 0, $tcount); | |
//Read line end values | |
$tcount = strpos($tparts[1], $endElement) + strlen($endElement); | |
$leValue = substr($tparts[1], 0, $tcount); | |
$tdTemp = explode($lsValue, $temp); | |
$linePart = $lsValue . $tdTemp[count($tdTemp) - 1] . $linePart . $leValue; | |
$parts = explode($linePart, $text); | |
$text = $parts[0]; | |
//Converting Line Items | |
if (count($lineItems) != 0) { | |
foreach ($lineItems as $id => $productId) { | |
if ($productId == null || $productId == '0') { | |
$obb['AOS_Products_Quotes'] = $id; | |
$text .= templateParser::parse_template($linePart, $obb); | |
} | |
} | |
} | |
for ($i = 1; $i < count($parts); $i++) { | |
$text .= $parts[$i]; | |
} | |
} | |
return $text; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment