- 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.
300 lines
13 KiB
PHP
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;
|
|
}
|
|
|
|
}
|