Files
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

300 lines
13 KiB
PHP

<?php
/*+***********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
*************************************************************************************/
Class Inventory_Edit_View extends Vtiger_Edit_View {
public function process(Vtiger_Request $request) {
$viewer = $this->getViewer($request);
$moduleName = $request->getModule();
$record = $request->get('record');
$sourceRecord = $request->get('sourceRecord');
$sourceModule = $request->get('sourceModule');
if(empty($sourceRecord) && empty($sourceModule)) {
$sourceRecord = $request->get('returnrecord');
$sourceModule = $request->get('returnmodule');
}
$viewer->assign('MODE', '');
$viewer->assign('IS_DUPLICATE', false);
if ($request->has('totalProductCount')) {
if($record) {
$recordModel = Vtiger_Record_Model::getInstanceById($record);
} else {
$recordModel = Vtiger_Record_Model::getCleanInstance($moduleName);
}
$relatedProducts = $recordModel->convertRequestToProducts($request);
$taxes = $relatedProducts[1]['final_details']['taxes'];
} else if(!empty($record) && $request->get('isDuplicate') == true) {
$recordModel = Inventory_Record_Model::getInstanceById($record, $moduleName);
$currencyInfo = $recordModel->getCurrencyInfo();
$taxes = $recordModel->getProductTaxes();
$relatedProducts = $recordModel->getProducts();
//While Duplicating record, If the related record is deleted then we are removing related record info in record model
$mandatoryFieldModels = $recordModel->getModule()->getMandatoryFieldModels();
foreach ($mandatoryFieldModels as $fieldModel) {
if ($fieldModel->isReferenceField()) {
$fieldName = $fieldModel->get('name');
if (Vtiger_Util_Helper::checkRecordExistance($recordModel->get($fieldName))) {
$recordModel->set($fieldName, '');
}
}
}
$viewer->assign('IS_DUPLICATE', true);
} elseif (!empty($record)) {
$recordModel = Inventory_Record_Model::getInstanceById($record, $moduleName);
$currencyInfo = $recordModel->getCurrencyInfo();
$taxes = $recordModel->getProductTaxes();
$relatedProducts = $recordModel->getProducts();
$viewer->assign('RECORD_ID', $record);
$viewer->assign('MODE', 'edit');
} elseif (($request->get('salesorder_id') || $request->get('quote_id') || $request->get('invoice_id')) && ($moduleName == 'PurchaseOrder')) {
if ($request->get('salesorder_id')) {
$referenceId = $request->get('salesorder_id');
} elseif ($request->get('invoice_id')) {
$referenceId = $request->get('invoice_id');
} else{
$referenceId = $request->get('quote_id');
}
$parentRecordModel = Inventory_Record_Model::getInstanceById($referenceId);
$currencyInfo = $parentRecordModel->getCurrencyInfo();
$relatedProducts = $parentRecordModel->getProductsForPurchaseOrder();
$taxes = $parentRecordModel->getProductTaxes();
$recordModel = Vtiger_Record_Model::getCleanInstance($moduleName);
$recordModel->setRecordFieldValues($parentRecordModel);
//SalesPaltform.ru begin
} elseif ($request->get('salesorder_id') || $request->get('quote_id') || $request->get('invoice_id')) {
//} elseif ($request->get('salesorder_id') || $request->get('quote_id')) {
//SalesPaltform.ru end
if ($request->get('salesorder_id')) {
$referenceId = $request->get('salesorder_id');
}
//SalesPlatform.ru begin
else if ($request->get('invoice_id')){
$referenceId = $request->get('invoice_id');
}
//SalesPlatform.ru end
else {
$referenceId = $request->get('quote_id');
}
$parentRecordModel = Inventory_Record_Model::getInstanceById($referenceId);
$currencyInfo = $parentRecordModel->getCurrencyInfo();
$taxes = $parentRecordModel->getProductTaxes();
$relatedProducts = $parentRecordModel->getProducts();
$recordModel = Vtiger_Record_Model::getCleanInstance($moduleName);
$recordModel->setRecordFieldValues($parentRecordModel);
} else {
$taxes = Inventory_Module_Model::getAllProductTaxes();
$recordModel = Vtiger_Record_Model::getCleanInstance($moduleName);
//The creation of Inventory record from action and Related list of product/service detailview the product/service details will calculated by following code
if ($request->get('product_id') || $sourceModule === 'Products' || $request->get('productid')) {
if($sourceRecord) {
$productRecordModel = Products_Record_Model::getInstanceById($sourceRecord);
} else if($request->get('product_id')) {
$productRecordModel = Products_Record_Model::getInstanceById($request->get('product_id'));
} else if($request->get('productid')) {
$productRecordModel = Products_Record_Model::getInstanceById($request->get('productid'));
}
$relatedProducts = $productRecordModel->getDetailsForInventoryModule($recordModel);
} elseif ($request->get('service_id') || $sourceModule === 'Services') {
if($sourceRecord) {
$serviceRecordModel = Services_Record_Model::getInstanceById($sourceRecord);
} else {
$serviceRecordModel = Services_Record_Model::getInstanceById($request->get('service_id'));
}
$relatedProducts = $serviceRecordModel->getDetailsForInventoryModule($recordModel);
} elseif ($sourceRecord && in_array($sourceModule, array('Accounts', 'Contacts', 'Potentials', 'Vendors', 'PurchaseOrder'))) {
$parentRecordModel = Vtiger_Record_Model::getInstanceById($sourceRecord, $sourceModule);
$recordModel->setParentRecordData($parentRecordModel);
if ($sourceModule !== 'PurchaseOrder') {
$relatedProducts = $recordModel->getParentRecordRelatedLineItems($parentRecordModel);
}
} elseif ($sourceRecord && in_array($sourceModule, array('HelpDesk', 'Leads'))) {
$parentRecordModel = Vtiger_Record_Model::getInstanceById($sourceRecord, $sourceModule);
$relatedProducts = $recordModel->getParentRecordRelatedLineItems($parentRecordModel);
}
}
$deductTaxes = $relatedProducts[1]['final_details']['deductTaxes'];
if (!$deductTaxes) {
$deductTaxes = Inventory_TaxRecord_Model::getDeductTaxesList();
}
$taxType = $relatedProducts[1]['final_details']['taxtype'];
$moduleModel = $recordModel->getModule();
$fieldList = $moduleModel->getFields();
$requestFieldList = array_intersect_key($request->getAllPurified(), $fieldList);
//get the inventory terms and conditions
$inventoryRecordModel = Inventory_Record_Model::getCleanInstance($moduleName);
$termsAndConditions = $inventoryRecordModel->getInventoryTermsAndConditions();
foreach($requestFieldList as $fieldName=>$fieldValue) {
$fieldModel = $fieldList[$fieldName];
if($fieldModel->isEditable()) {
$recordModel->set($fieldName, $fieldModel->getDBInsertValue($fieldValue));
}
}
// SalesPlatform.ru begin Set default invoice status for SalesOrder
if($moduleName == "SalesOrder") {
if(empty($record)) {
$recordModel->set("invoicestatus", "AutoCreated");
} else {
$checkbox = $recordModel->get("enable_recurring");
if($checkbox != 1) {
$recordModel->set("invoicestatus", "AutoCreated");
}
}
}
// SalesPlatform.ru end
// SalesPlatform.ru begin Unifying method for EditView preparing
$recordModel = prepareEditView($recordModel, $_REQUEST, $viewer);
// SalesPlatform.ru end
$recordStructureInstance = Vtiger_RecordStructure_Model::getInstanceFromRecordModel($recordModel, Vtiger_RecordStructure_Model::RECORD_STRUCTURE_MODE_EDIT);
// SalesPlatform.ru begin Field Validation Information
$tabid = getTabid($moduleName);
$validationData = getDBValidationData($recordModel->get('tab_name'),$tabid);
$validationArray = split_validationdataArray($validationData);
$viewer->assign("VALIDATION_DATA_FIELDNAME",$validationArray['fieldname']);
$viewer->assign("VALIDATION_DATA_FIELDDATATYPE",$validationArray['datatype']);
$viewer->assign("VALIDATION_DATA_FIELDLABEL",$validationArray['fieldlabel']);
$viewer->assign('ID', $record);
// SalesPlatform.ru end
$viewer->assign('VIEW_MODE', "fullForm");
$isRelationOperation = $request->get('relationOperation');
//if it is relation edit
$viewer->assign('IS_RELATION_OPERATION', $isRelationOperation);
if($isRelationOperation) {
$viewer->assign('SOURCE_MODULE', $sourceModule);
$viewer->assign('SOURCE_RECORD', $sourceRecord);
}
// SalesPlatform.ru begin Set company
if($isRelationOperation) {
$sourceRecordModel = Vtiger_Record_Model::getInstanceById($sourceRecord);
if($sourceRecordModel->get('spcompany') != null && $sourceRecordModel->get('spcompany') != '') {
if($recordModel->getField('spcompany')) {
$recordModel->set('spcompany', $sourceRecordModel->get('spcompany'));
}
}
}
// SalesPlatform.ru end
if(!empty($record) && $request->get('isDuplicate') == true) {
$viewer->assign('IS_DUPLICATE',true);
} else {
$viewer->assign('IS_DUPLICATE',false);
}
$currencies = Inventory_Module_Model::getAllCurrencies();
$picklistDependencyDatasource = Vtiger_DependencyPicklist::getPicklistDependencyDatasource($moduleName);
$recordStructure = $recordStructureInstance->getStructure();
$viewer->assign('PICKIST_DEPENDENCY_DATASOURCE',Vtiger_Functions::jsonEncode($picklistDependencyDatasource));
$viewer->assign('RECORD',$recordModel);
$viewer->assign('RECORD_STRUCTURE_MODEL', $recordStructureInstance);
$viewer->assign('RECORD_STRUCTURE', $recordStructure);
$viewer->assign('MODULE', $moduleName);
$viewer->assign('CURRENTDATE', date('Y-n-j'));
$viewer->assign('USER_MODEL', Users_Record_Model::getCurrentUserModel());
$taxRegions = $recordModel->getRegionsList();
$defaultRegionInfo = $taxRegions[0];
unset($taxRegions[0]);
$viewer->assign('TAX_REGIONS', $taxRegions);
$viewer->assign('DEFAULT_TAX_REGION_INFO', $defaultRegionInfo);
$viewer->assign('INVENTORY_CHARGES', Inventory_Charges_Model::getInventoryCharges());
$viewer->assign('RELATED_PRODUCTS', $relatedProducts);
$viewer->assign('DEDUCTED_TAXES', $deductTaxes);
$viewer->assign('TAXES', $taxes);
$viewer->assign('TAX_TYPE', $taxType);
$viewer->assign('CURRENCINFO', $currencyInfo);
$viewer->assign('CURRENCIES', $currencies);
$viewer->assign('TERMSANDCONDITIONS', $termsAndConditions);
$productModuleModel = Vtiger_Module_Model::getInstance('Products');
$viewer->assign('PRODUCT_ACTIVE', $productModuleModel->isActive());
$serviceModuleModel = Vtiger_Module_Model::getInstance('Services');
$viewer->assign('SERVICE_ACTIVE', $serviceModuleModel->isActive());
// added to set the return values
if ($request->get('returnview')) {
$request->setViewerReturnValues($viewer);
}
if ($request->get('displayMode') == 'overlay') {
$viewer->assign('SCRIPTS', $this->getOverlayHeaderScripts($request));
echo $viewer->view('OverlayEditView.tpl', $moduleName);
} else {
$viewer->view('EditView.tpl', 'Inventory');
}
}
/**
* Function to get the list of Script models to be included
* @param Vtiger_Request $request
* @return <Array> - List of Vtiger_JsScript_Model instances
*/
function getHeaderScripts(Vtiger_Request $request) {
$headerScriptInstances = parent::getHeaderScripts($request);
$moduleName = $request->getModule();
$modulePopUpFile = 'modules.'.$moduleName.'.resources.Popup';
$moduleEditFile = 'modules.'.$moduleName.'.resources.Edit';
unset($headerScriptInstances[$modulePopUpFile]);
unset($headerScriptInstances[$moduleEditFile]);
$jsFileNames = array(
'modules.Inventory.resources.Edit',
'modules.Inventory.resources.Popup',
'modules.PriceBooks.resources.Popup',
);
$jsFileNames[] = $moduleEditFile;
$jsFileNames[] = $modulePopUpFile;
$jsScriptInstances = $this->checkAndConvertJsScripts($jsFileNames);
$headerScriptInstances = array_merge($headerScriptInstances, $jsScriptInstances);
return $headerScriptInstances;
}
public function getOverlayHeaderScripts(Vtiger_Request $request) {
$moduleName = $request->getModule();
$modulePopUpFile = 'modules.'.$moduleName.'.resources.Popup';
$moduleEditFile = 'modules.'.$moduleName.'.resources.Edit';
$jsFileNames = array(
'modules.Inventory.resources.Popup',
'modules.PriceBooks.resources.Popup',
//SalesPlatform.ru begin
'modules.Inventory.resources.Edit'
//SalesPlatform.ru end
);
$jsFileNames[] = $moduleEditFile;
$jsFileNames[] = $modulePopUpFile;
$jsScriptInstances = $this->checkAndConvertJsScripts($jsFileNames);
return $jsScriptInstances;
}
}