Files
crm.clientright.ru/modules/Workflow2/tasks/WfTaskPDFMaker.php
Fedor ac7467f0b4 Major CRM updates: AI Assistant, Court Status API, S3 integration improvements, and extensive file storage system
- Added comprehensive AI Assistant system (aiassist/ directory):
  * Vector search and embedding capabilities
  * Typebot proxy integration
  * Elastic search functionality
  * Message classification and chat history
  * MCP proxy for external integrations

- Implemented Court Status API (GetCourtStatus.php):
  * Real-time court document status checking
  * Integration with external court systems
  * Comprehensive error handling and logging

- Enhanced S3 integration:
  * Improved file backup system with metadata
  * Batch processing capabilities
  * Enhanced error logging and recovery
  * Copy operations with URL fixing

- Added Telegram contact creation API
- Improved error logging across all modules
- Enhanced callback system for AI responses
- Extensive backup file storage with timestamps
- Updated documentation and README files

- File storage improvements:
  * Thousands of backup files with proper metadata
  * Fix operations for broken file references
  * Project-specific backup and recovery systems
  * Comprehensive file integrity checking

Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
2025-10-16 11:17:21 +03:00

264 lines
8.9 KiB
PHP

<?php
require_once(realpath(dirname(__FILE__).'/../autoload_wf.php'));
class WfTaskPDFMaker extends \Workflow\Task
{
protected $_javascriptFile = 'WfTaskPdfmaker.js';
public function init() {
$record = $this->get('recordChooser');
if($record == 'current') {
$moduleName = $this->getModuleName();
}
if($_POST['changeModule'] == '1') {
$this->set('condition', array());
$this->set('templates', array());
}
if(-1 != $this->get("search_module") || !empty($_POST["task"]["search_module"])) {
$module = !empty($_POST["task"]["search_module"]) ? $_POST["task"]["search_module"] : $this->get("search_module");
$parts = explode('#~#', $module);
$moduleName = VtUtils::getModuleName($parts[1]);
} else {
$moduleName = $this->getModuleName();
}
$this->addPreset("Condition", "condition", array(
'toModule' => $moduleName,
'fromModule' => $this->getModuleName(),
'mode' => 'mysql',
));
$this->addPreset("FileActions", "resultaction", array(
'module' => $moduleName,
));
if($this->get('templateids') == -1 && $this->notEmpty('template')) {
$this->set('templateids', implode(',', $this->get('template')));
}
}
public function handleTask(&$context) {
$adb = \PearDatabase::getInstance();
if(!getTabid('PDFMaker') || !vtlib_isModuleActive('PDFMaker')) {
throw new \Exception('PDFMaker Extension not found!');
}
/* Insert here source code to execute the task */
$recordChooser = $this->get('recordChooser');
if(empty($recordChooser) || $recordChooser == -1) {
throw new \Exception('You need to configure the PDFMaker Integraion.');
}
$recordIds = array();
if($recordChooser === 'current') {
$recordIds = array($context->getId());
$moduleName = $this->getModuleName();
} else {
$currentTime = microtime(true);
$benchmark = array();
$parts = explode("#~#", $this->get("search_module"));
$related_module = VtUtils::getModuleName($parts[1]);
$moduleName = $related_module;
$objMySQL = new \Workflow\ConditionMysql($related_module, $context);
$main_module = \CRMEntity::getInstance($related_module);
$sqlCondition = $objMySQL->parse($this->get("condition"));
$newTime = microtime(true);
$benchmark[] = round(($newTime - $currentTime), 3);$currentTime = $newTime;
$sqlTables = $objMySQL->generateTables();
if(strlen($sqlCondition) > 3) {
$sqlCondition .= " AND vtiger_crmentity.deleted = 0";
} else {
$sqlCondition .= " vtiger_crmentity.deleted = 0";
}
$sqlCondition .= " GROUP BY vtiger_crmentity.crmid ";
$idColumn = $main_module->table_name.".".$main_module->table_index;
$sqlQuery = "SELECT $idColumn as `idCol` ".$sqlTables." WHERE ".(strlen($sqlCondition) > 3?$sqlCondition:"");
$sortField = $this->get("sort_field");
if(!empty($sortField) && $sortField != -1) {
$sortField = VtUtils::getColumnName($sortField);
$sortDirection = $this->get("sortDirection");
$sqlQuery .= " ORDER BY ".$sortField." ".$sortDirection;
}
$this->addStat("MySQL Query: ".$sqlQuery);
$result = $adb->query($sqlQuery, true);
$newTime = microtime(true);
$benchmark[] = round(($newTime - $currentTime), 3);
$this->addStat("num Rows: ".$adb->num_rows($result));
# If no records are found, fo other way
if($adb->num_rows($result) == 0) {
return "yes";
}
$this->addStat("Benchmark: " . implode("/", $benchmark));
while($row = $adb->fetchByAssoc($result)) {
$recordIds[] = $row['idcol'];
}
}
$context->save();
$useUser = Users::getActiveAdminUser();
$oldUser = vglobal('current_user'); vglobal('current_user', $useUser);
$PDFMaker = new PDFMaker_PDFMaker_Model();
$mpdf = "";
$copies = $this->get('copies');
if($copies == -1 || empty($copies)) {
$copies = 1;
}
$templateids = array();
for($i = 0; $i < $copies;$i++) {
$templateids = array_merge($templateids, explode(',', $this->get('templateids')));
}
if($moduleName == 'Events') $moduleName = 'Calendar';
// $filename = $PDFMaker->GetPreparedMPDF($mpdf, $recordIds, $templateids, $moduleName, $dl, '');
$language = '';
if($this->notEmpty('language')) {
$language = $this->get('language');
}
if(empty($language)) {
$language = Vtiger_Language_Handler::getLanguage();
}
if($PDFMaker->GetVersionType() == 'Free') {
$filename = $PDFMaker->GetPreparedMPDF($mpdf, $recordIds, $moduleName, $language, '');
} else {
$filename = $PDFMaker->GetPreparedMPDF($mpdf, $recordIds, $templateids, $moduleName, $language, '');
}
if(strpos($filename, '.pdf') === false) {
$filename .= '.pdf';
}
// $filename = $PDFMaker->generate_cool_uri($filename);
$tmpfile = tempnam(sys_get_temp_dir(), 'WfTmp');
@unlink($tmpfile);
$mpdf->Output($tmpfile);
$overwriteFilename = $this->get("filename", $context);
if($overwriteFilename != -1 && !empty($overwriteFilename)) {
$filename = $overwriteFilename;
}
\Workflow\FileAction::doActions($this->get('resultaction'), $tmpfile, $filename, $context, $recordIds, $this->getWorkflow());
vglobal('current_user', $oldUser);
return "yes";
}
public function beforeGetTaskform($viewer) {
global $adb, $current_language, $mod_strings;
if (!getTabid('PDFMaker') || !vtlib_isModuleActive('PDFMaker')) {
$viewer->assign('disable', true);
$this->addConfigHint(getTranslatedString('LBL_FOR_THIS_YOU_NEED_PDFMAKER','Settings:Workflow2'));
return;
}
$copies = $this->get('copies');
if($copies === -1 || empty($copies)) {
$this->set('copies', 1);
}
$viewer->assign("related_modules", VtUtils::getEntityModules(true));
$search_module = $this->get("search_module");
$parts = false;
if(!empty($_POST["task"]["search_module"])) {
$parts = explode("#~#", $_POST["task"]["search_module"]);
} elseif(!empty($search_module)) {
if($search_module != -1) {
$parts = explode("#~#", $search_module);
$tabid = $parts[1];
}
}
if(!empty($parts)) {
$moduleName = $parts[0];
$tabid = $parts[1];
} else {
$moduleName = $this->getModuleName();
$tabid = getTabid($moduleName);
}
$viewer->assign("related_tabid", $tabid);
$fields = VtUtils::getFieldsWithBlocksForModule($moduleName);
$viewer->assign("sort_fields", $fields);
require_once('modules/PDFMaker/helpers/Version.php');
$viewer->assign('PDFMAKER_VERSION', PDFMaker_Version_Helper::$version);
$sql = "SELECT folderid, foldername FROM vtiger_attachmentsfolder ORDER BY sequence";
$result = $adb->query($sql);
$folders = array();
while($row = $adb->fetch_array($result)) {
$folders[] = $row;
}
$viewer->assign("folders", $folders);
if($moduleName == 'Events') $moduleName = 'Calendar';
$sql = "SELECT templateid, filename, description FROM vtiger_pdfmaker WHERE module = '".$moduleName."'";
$result = $adb->query($sql);
$templates = array();
while($row = $adb->fetch_array($result)) {
$templates[] = array(
'id' => $row['templateid'],
'text' => $row['filename'],
);
$templateData[$row['templateid']] = $row['filename'];
}
$languages = array(
'' => 'default language'
);
$sql = 'SELECT prefix, label FROM vtiger_language ORDER BY label';
$result = VtUtils::query($sql);
while($row = VtUtils::fetchByAssoc($result)) {
$languages[$row['prefix']] = $row['label'];
}
$viewer->assign('LANGUAGES', $languages);
$viewer->assign("templates", $templates);
$viewer->assign("templateData", $templateData);
$workflows = \Workflow2::getWorkflowsForModule("Documents", 1);
$viewer->assign("workflows", $workflows);
}
public function beforeSave(&$values) {
/* Insert here source code to modify the values the user submit on configuration */
}
}