Files
crm.clientright.ru/modules/Workflow2/views/resources/js/FrontendWorkflows.js
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

319 lines
13 KiB
JavaScript

/**
* Created by Stefan on 14.11.2016.
*/
jQuery(function() {
var parentEleSrc = 'div#page';
var currentWorkflowFrontendParentEle = parentEleSrc;
window.WorkflowFrontendInitialize = true;
var FrontendWorkflowExecution = function(parentEle) {
this.record = {};
this._workflowIds = [];
this._execId = undefined;
this._blockID = undefined;
this._requestValues = {};
this._requestValuesKey = null;
this._extraEnvironment = {};
this._manager = null;
this.setManagerObject = function(manager) {
this._manager = manager;
};
this.setRecordData = function(recordData) {
this.record = recordData;
};
this.setWorkflowIds = function(workflowIDs) {
this._workflowIds = workflowIDs;
};
this.parseFrontendWorkflowResult = function(newRecord) {
if(typeof newRecord.env != 'undefined') {
this._manager.setLastEnvironment(newRecord.env);
}
/** Set Field Values from Result **/
jQuery.each(newRecord.record, $.proxy(function(field, value) {
var allFieldEleParent = RedooUtils('Workflow2').getFieldElement(field, this.parentEle);
if(allFieldEleParent.length > 0) {
allFieldEle = $(allFieldEleParent.find('[name="' + field + '"]'));
allFieldEle.each(function(index, fieldEle) {
fieldEle = $(fieldEle);
if(fieldEle.hasClass('autoComplete')) {
return;
}
if(fieldEle.hasClass('dateField')) {
fieldEle.datepicker('update', value);
}
if(fieldEle.hasClass('chzn-select')) {
fieldEle.val(value).trigger('liszt:updated');
}
if(fieldEle.attr('type') == 'checkbox') {
fieldEle.prop('checked', value == '1');
}
if(fieldEle.hasClass('sourceField')) {
var obj = Vtiger_Edit_Js.getInstance();
obj.setReferenceFieldValue(allFieldEleParent, {
id: value,
name: newRecord.record[field + '_display']
});
}
if(fieldEle.attr('type') == 'checkbox') {
fieldEle.prop('checked', value == '1');
}
if(fieldEle.attr('type') == 'text' || fieldEle.prop("tagName") == 'TEXTAREA') {
fieldEle.val(value);
}
});
}
}, this));
/** Set Field Values from Result FINISH **/
/** Execute Simple Actions **/
jQuery.each(newRecord.actions, $.proxy(function(index, action) {
var callback = $.proxy(function(extraEnvironment) {
this._execId = action.execid;
this._blockID = action.blockid;
jQuery.extend(true, this._extraEnvironment, extraEnvironment);
//console.log(this._extraEnvironment);
this.execute();
}, this);
if(typeof WorkflowFrontendActions[action.type] == 'function') {
$.proxy(WorkflowFrontendActions[action.type], this)(action.config, callback);
}
}, this));
/** Execute Simple Actions FINISH **/
/** Check UserQueue **/
if(typeof newRecord.userqueue != 'undefined' && newRecord.userqueue.length > 0) {
jQuery.each(newRecord.userqueue, $.proxy(function(index, response) {
switch(response.result) {
case 'reqvalues':
this._requestValuesKey = response['fields_key'];
this._execId = response['execId'];
this._blockID = response['blockId'];
if(typeof RequestValuesForm == 'undefined') {
jQuery.getScript('modules/Workflow2/views/resources/js/RequestValuesForm.js', jQuery.proxy(function() {
var requestForm = new RequestValuesForm();
requestForm.show(response, response['fields_key'], response['request_message'], $.proxy(this.SubmitRequestFields, this), response['stoppable'], response['pausable']);
}, this));
} else {
var requestForm = new RequestValuesForm();
requestForm.show(response, response['fields_key'], response['request_message'], $.proxy(this.SubmitRequestFields, this), response['stoppable'], response['pausable']);
}
break;
}
}, this));
}
/** Check UserQueue FINISH **/
};
this.SubmitRequestFields = function(key, values, value2, form) {
this._requestValues = {};
this._requestValuesKey = key;
var requestValues = {};
var html = '';
jQuery.each(values, function(index, value) {
requestValues[value.name] = value.value;
});
this._requestValues = requestValues;
if(jQuery('[type="file"]', form).length > 0) {
var html = '<form action="#" method="POST" onsubmit="return false;">';
jQuery('input, select, button', form).attr('disabled', 'disabled');
jQuery('[type="file"]', form).removeAttr('disabled').each(function(index, ele) {
var name = jQuery(ele).attr('name');
jQuery(ele).attr('name', 'fileUpload[' + name + ']');
requestValues[name] = jQuery(ele).data('filestoreid');
});
html += '</form>';
form = html;
if(typeof jQuery(form).ajaxSubmit == 'undefined') {
console.error('jquery.forms plugin requuired!');
return;
}
WorkflowRunning = true;
RedooUtils('Workflow2').blockUI({ message: '<h3 style="padding:5px 0;"><img src="modules/Workflow2/icons/sending.gif" /><br/>Please wait ...</h3>' });
jQuery(form).ajaxSubmit({
'url' : "index.php",
'type': 'post',
data: {
"module" : "Workflow2",
"action" : "FrontendWorkflowExec",
'crmid' : this._crmid,
'workflowID' : this._workflowId === null ? undefined : this._workflowId,
'allowParallel': this._allowParallel ? 1 : 0,
'continueExecId': this._execId === null ? undefined : this._execId,
'continueBlockId': this._blockID === null ? undefined : this._blockID,
'requestValues': this._requestValues === null ? undefined : this._requestValues,
'requestValuesKey': this._requestValuesKey === null ? undefined : this._requestValuesKey,
'extraEnvironment': this._extraEnvironment
},
success:jQuery.proxy(this.executionResponse, this),
error:jQuery.proxy(this.executionResponse, this)
});
this.executeWithForm(form);
return;
}
this.execute();
};
this.execute = function() {
var dfd = jQuery.Deferred();
var environment = {};
jQuery.extend(true, environment, this._manager.getLastEnvironment(), this._extraEnvironment);
RedooAjax('Workflow2').post('index.php', {
'module': 'Workflow2',
'action': 'FrontendWorkflowExec',
'workflow_ids': this._workflowIds,
'record': this.record,
'continueExecId': this._execId === null ? undefined : this._execId,
'continueBlockId': this._blockID === null ? undefined : this._blockID,
'requestValues': this._requestValues === null ? undefined : this._requestValues,
'requestValuesKey': this._requestValuesKey === null ? undefined : this._requestValuesKey,
'extraEnvironment': environment,
'dataType': 'json'
}).then($.proxy(function(data) {
this.parseFrontendWorkflowResult( data );
dfd.resolve( data );
}, this));
return dfd.promise();
};
/** Initialize **/
};
var FrontendWorkflowManager = function(parentEle) {
this.parentEle = parentEle;
this.FieldValueCache = {};
this.record = {};
this._lastEnvironment = {};
this.mainModule = RedooUtils('Workflow2').getMainModule(this.parentEle);
this.setLastEnvironment = function(envVars) {
this._lastEnvironment = envVars;
};
this.getLastEnvironment = function() {
return this._lastEnvironment;
};
this.checkFrontendWorkflows = function(e) {
if(typeof Inventory_Edit_Js != 'undefined') {
var inventoryInstance = Inventory_Edit_Js.getInstance();
inventoryInstance.updateLineItemElementByOrder();
var lineItemTable = inventoryInstance.getLineItemContentsContainer();
jQuery('.discountSave',lineItemTable).trigger('click');
inventoryInstance.lineItemToTalResultCalculations();
inventoryInstance.saveProductCount();
inventoryInstance.saveSubTotalValue();
inventoryInstance.saveTotalValue();
inventoryInstance.savePreTaxTotalValue();
}
var recordRAW = jQuery('#EditView', this.parentEle).serializeArray();
var record = {};
jQuery.each(recordRAW, $.proxy(function(index, value) {
record[value.name] = value.value;
}, this));
if(typeof record.record != 'undefined') {
record.crmid = record.record;
record.id = record.record;
}
var workflowIds = [];
jQuery.each(this.trigger, $.proxy(function(index, value) {
if(FrontendWorkflowData[value['function']](record) === true) {
workflowIds.push(value.workflow_id);
}
}, this));
if(workflowIds.length > 0) {
jQuery('[monitorchanges="1"]', this.parentEle).each($.proxy(function(index, ele) {
var name = jQuery(ele).attr('name');
this.manager.FieldValueCache[name] = record[name];
}, this));
var FrontendWorkflowExec = new FrontendWorkflowExecution(parentEleSrc);
FrontendWorkflowExec.setManagerObject(this.manager);
FrontendWorkflowExec.setRecordData(record);
FrontendWorkflowExec.setWorkflowIds(workflowIds);
FrontendWorkflowExec.execute();
}
};
/** Initialize **/
if (typeof FrontendWorkflowData == 'undefined') return;
var ViewMode = RedooUtils('Workflow2').getViewMode(this.parentEle);
if (ViewMode != 'editview') return;
if (typeof FrontendWorkflowData.Config[this.mainModule] == 'undefined') return;
jQuery.each(FrontendWorkflowData.Config[this.mainModule].fields, $.proxy(function (field, trigger) {
if(field == 'crmid') {
return;
}
var fieldParentEle = RedooUtils('Workflow2').getFieldElement(field, this.parentEle);
if(fieldParentEle.length > 0) {
var fieldEle = fieldParentEle.find('[name="' + field + '"]');
if($('.clearReferenceSelection', fieldParentEle).length > 0) {
$('.clearReferenceSelection', fieldParentEle).on(Vtiger_Edit_Js.referenceDeSelectionEvent, $.proxy(this.checkFrontendWorkflows, { trigger:trigger, manager:this }));
}
$(fieldEle).on(Vtiger_Edit_Js.referenceSelectionEvent, $.proxy(this.checkFrontendWorkflows, { trigger:trigger, manager:this }));
$(fieldEle).on('change', $.proxy(this.checkFrontendWorkflows, { trigger:trigger, manager:this }));
$.proxy(this.checkFrontendWorkflows, { trigger:trigger, manager:this })();
}
}, this));
};
jQuery(function() {
window.setTimeout(function() {
window.WorkflowFrontendInitialize = false;
}, 1000);
});
var FrontendWorkflow = new FrontendWorkflowManager(parentEleSrc);
window.currentFrontendWorkflowManager = FrontendWorkflow;
});