- 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.
200 lines
7.7 KiB
PHP
200 lines
7.7 KiB
PHP
<?php
|
|
/**
|
|
This File was developed by Stefan Warnat <vtiger@stefanwarnat.de>
|
|
|
|
It belongs to the Workflow Designer and must not be distributed without complete extension
|
|
|
|
* Last Change: 2012-12-06 1.6 swarnat
|
|
**/
|
|
|
|
require_once(realpath(dirname(__FILE__).'/../autoload_wf.php'));
|
|
|
|
require_once('WfTaskCreateInventory.php');
|
|
/* vt6 read */
|
|
class WfTaskReverseInventory extends \Workflow\Task
|
|
{
|
|
protected $_envSettings = array("new_record_id");
|
|
protected $_javascriptFile = array("WfTaskSetter.js");
|
|
protected $_fields = array();
|
|
protected $_customModule = "Invoice";
|
|
protected $_hiddenValues = array();
|
|
|
|
protected $fieldSetter = false;
|
|
|
|
public function init() {
|
|
|
|
$this->_productchooser = $this->addPreset("ProductChooser", "product", array(
|
|
'module' => $this->getModuleName()
|
|
));
|
|
|
|
$this->fieldSetter = $this->addPreset("FieldSetter", "setter", array(
|
|
'fromModule' => $this->getModuleName(),
|
|
'toModule' => $this->getModuleName(),
|
|
'refFields' => false
|
|
));
|
|
}
|
|
|
|
public function handleTask(&$context) {
|
|
/** Copied from WfTaskDuplicateRecord */
|
|
/**
|
|
* @var $contextRecord VTInventoryEntity
|
|
*/
|
|
$contextRecord = $context;
|
|
|
|
$newObj = \Workflow\VTEntity::create($contextRecord->getModuleName());
|
|
|
|
$oldData = $contextRecord->getData();
|
|
//var_dump($oldData);
|
|
foreach($oldData as $key => $value) {
|
|
$newObj->set($key, $value);
|
|
}
|
|
//$newObj->set('hdnDiscountPercent', -1 * $oldData['hdnDiscountPercent']);
|
|
$newObj->set('hdnDiscountAmount', -1 * $oldData['hdnDiscountAmount']);
|
|
/** Copied from WfTaskDuplicateRecord ENDE */
|
|
|
|
$products = $contextRecord->exportInventory();
|
|
foreach($products["listitems"] as $index => $listitem) {
|
|
$listitem["quantity"] *= -1;
|
|
|
|
$listitem['discount_amount'] *= -1;
|
|
$products["listitems"][$index] = $listitem;
|
|
}
|
|
$products["shippingCost"] *= -1;
|
|
$newObj->importInventory($products);
|
|
|
|
/* After this line, copy from Creator */
|
|
$setterMap = $this->get("setter");
|
|
|
|
$this->fieldSetter->apply($newObj, $setterMap, $contextRecord, $this);
|
|
|
|
$products = $this->get("product");
|
|
/* INSERT PRODUCT */
|
|
if(is_array($products) && count($products) > 0) {
|
|
$availTaxes = getAllTaxes("available");
|
|
foreach($products as $index => $value) {
|
|
if(!empty($value["productid_individual"])) {
|
|
$productid = VTTemplate::parse($value["productid_individual"], $context);
|
|
} else {
|
|
$productid = $value["productid"];
|
|
}
|
|
|
|
if(strpos($productid, "x") !== false) {
|
|
$parts = explode("x", $productid);
|
|
$productid = $parts[1];
|
|
}
|
|
$crmProduct = CRMEntity::getInstance("Products");
|
|
$crmProduct->id = $productid;
|
|
$crmProduct->retrieve_entity_info($productid, "Products");
|
|
|
|
$context->setEnvironment("product", $crmProduct->column_fields);
|
|
|
|
foreach($value as $key => $template) {
|
|
$value[$key] = VTTemplate::parse($template, $context);
|
|
}
|
|
|
|
|
|
$tax = array();
|
|
foreach($availTaxes as $aTax) {
|
|
if($value["tax".$aTax["taxid"]."_enable"] == 1) {
|
|
$tax[$aTax["taxid"]] = VTTemplate::parse($value["tax".$aTax["taxid"]], $context);
|
|
}
|
|
}
|
|
|
|
$this->addStat("AddProduct ".$value["quantity"]." x ".$productid." (".$value["unitprice"].")");
|
|
$newObj->addProduct($productid, $value["description"], $value["comment"], $value["quantity"], $value["unitprice"], ($value["discount_mode"]=="percentage"?$value["discount_value"]:0), ($value["discount_mode"]=="amount"?$value["discount_value"]:0), $tax);
|
|
}
|
|
|
|
try {
|
|
$newObj->save();
|
|
} catch(WebServiceException $exp) {
|
|
// Somethink is wrong with the values. missing mandatory fields?
|
|
}
|
|
}
|
|
|
|
try {
|
|
$newObj->save();
|
|
} catch(WebServiceException $exp) {
|
|
// Somethink is wrong with the values. missing mandatory fields?
|
|
}
|
|
|
|
$context->setEnvironment("new_record_id", $newObj->getId(), $this);
|
|
|
|
if($this->get("redirectAfter") == "1") {
|
|
$this->getWorkflow()->setSuccessRedirection($newObj->getDetailUrl(), 'same');
|
|
}
|
|
|
|
if($this->get("exec_workflow") !== "" && $this->get("exec_workflow") != -1) {
|
|
$newContext = \Workflow\VTEntity::getForId($newObj->getId(), $newObj->getModuleName());
|
|
$objWorkflow = new \Workflow\Main($this->get("exec_workflow"), false, $context->getUser());
|
|
|
|
$objWorkflow->setContext($newContext);
|
|
$objWorkflow->isSubWorkflow(true);
|
|
|
|
$objWorkflow->start();
|
|
}
|
|
|
|
return "yes";
|
|
}
|
|
|
|
public function beforeGetTaskform($viewer) {
|
|
global $adb;
|
|
|
|
$new_module = $this->getWorkflow()->getSettings();
|
|
$new_module = $new_module["module_name"];
|
|
|
|
if(!empty($new_module) && $new_module != -1) {
|
|
|
|
$viewer->assign("new_module", $new_module);
|
|
}
|
|
|
|
$sql = "SELECT
|
|
vtiger_crmentity.crmid, vtiger_crmentity.smownerid, vtiger_crmentity.description,
|
|
vtiger_products.*,
|
|
vtiger_productcf.*
|
|
FROM vtiger_products
|
|
INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_products.productid
|
|
INNER JOIN vtiger_productcf ON vtiger_products.productid = vtiger_productcf.productid
|
|
LEFT JOIN vtiger_vendor ON vtiger_vendor.vendorid = vtiger_products.vendor_id
|
|
LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid
|
|
LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid
|
|
WHERE
|
|
vtiger_products.productid > 0 AND
|
|
vtiger_crmentity.deleted = 0 and
|
|
vtiger_products.discontinued <> 0 AND
|
|
(vtiger_products.productid NOT IN (
|
|
SELECT crmid FROM vtiger_seproductsrel WHERE vtiger_products.productid > 0 AND setype='Products'
|
|
)
|
|
)";
|
|
$result = $adb->query($sql);
|
|
$products = array();
|
|
$taxes = array();
|
|
while($row = $adb->fetchByAssoc($result)) {
|
|
$products[$row["productid"]] = $row;
|
|
$taxes[$row["productid"]] = getTaxDetailsForProduct($row["productid"], 'all');
|
|
if(empty($taxes[$row["productid"]])) {
|
|
$taxes[$row["productid"]] = array("a" => "b");
|
|
}
|
|
}
|
|
$viewer->assign("taxlist", $taxes);
|
|
$viewer->assign("productlist", $products);
|
|
|
|
$workflows = Workflow2::getWorkflowsForModule($new_module, 1);
|
|
$viewer->assign("extern_workflows", $workflows);
|
|
|
|
$module = array();
|
|
$module["Invoice"] = getTranslatedString("Invoice","Invoice");
|
|
$module["Quotes"] = getTranslatedString("Quotes", "Quotes");
|
|
$module["PurchaseOrder"] = getTranslatedString("PurchaseOrder","PurchaseOrder");
|
|
$module["SalesOrder"] = getTranslatedString("SalesOrder","SalesOrder");
|
|
|
|
asort($module);
|
|
|
|
$viewer->assign("avail_module", $module);
|
|
$viewer->assign("orig_module_name", $this->getModuleName());
|
|
$viewer->assign("availCurrency", getAllCurrencies());
|
|
$viewer->assign("availTaxes", getAllTaxes("available"));
|
|
|
|
}
|
|
|
|
}
|