[Back] <?php
/*
* Copyright (c) 2022 LatePoint LLC. All rights reserved.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
if ( ! class_exists( 'OsProcessesController' ) ) :
class OsProcessesController extends OsController {
function __construct() {
parent::__construct();
$this->views_folder = LATEPOINT_VIEWS_ABSPATH . 'processes/';
$this->vars['page_header'] = OsMenuHelper::get_menu_items_by_id( 'processes' );
$this->vars['pre_page_header'] = OsMenuHelper::get_label_by_id( 'processes' );
$this->vars['breadcrumbs'][] = array( 'label' => __( 'Workflows', 'latepoint' ), 'link' => OsRouterHelper::build_link( OsRouterHelper::build_route_name( 'processes', 'index' ) ) );
}
public function new_form() {
$this->vars['process'] = new OsProcessModel();
$this->set_layout( 'none' );
$this->format_render( __FUNCTION__ );
}
public function reload_event_trigger_conditions() {
$event = new \LatePoint\Misc\ProcessEvent( [ 'type' => $this->params['event_type'] ] );
$trigger_conditions_form_section_html = OsProcessesHelper::trigger_conditions_html_for_event( $event );
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => $trigger_conditions_form_section_html ) );
}
}
public function available_properties_for_object_code() {
$object_code = $this->params['object_code'];
$properties_for_select = \LatePoint\Misc\ProcessEvent::get_properties_for_object_code( $object_code, true );
$html = '';
foreach ( $properties_for_select as $property ) {
$html .= '<option value="' . $property['value'] . '">' . $property['label'] . '</option>';
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => $html ) );
}
}
public function available_operators_for_trigger_condition_property() {
// example format: old_booking__agent_id
$property = $this->params['property'];
$operators = \LatePoint\Misc\ProcessEvent::trigger_condition_operators_for_property( $property );
$html = '';
foreach ( $operators as $value => $label ) {
$html .= '<option value="' . $value . '">' . $label . '</option>';
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => $html ) );
}
}
public function available_values_for_trigger_condition_property() {
$values = [];
$property = $this->params['property'];
$operator = $this->params['operator'];
$trigger_condition_id = $this->params['trigger_condition_id'];
$values = OsProcessesHelper::values_for_trigger_condition_property( $property );
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS,
'message' => OsFormHelper::multi_select_field( 'process[event][trigger_conditions][' . $trigger_condition_id . '][value]', false, $values, false, [] )
) );
}
}
function destroy() {
if ( filter_var( $this->params['id'], FILTER_VALIDATE_INT ) ) {
$this->check_nonce( 'destroy_process_' . $this->params['id'] );
$process = new OsProcessModel( $this->params['id'] );
if ( $process->delete() ) {
$status = LATEPOINT_STATUS_SUCCESS;
$response_html = __( 'Process Removed', 'latepoint' );
} else {
$status = LATEPOINT_STATUS_ERROR;
$response_html = __( 'Error Removing Workflow', 'latepoint' );
}
} else {
$status = LATEPOINT_STATUS_SUCCESS;
$response_html = __( 'Process Removed', 'latepoint' );
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => $status, 'message' => $response_html ) );
}
}
function save() {
$process_data = $this->params['process'];
if ( ! empty( $process_data['id'] ) ) {
$this->check_nonce( 'edit_process_' . $process_data['id'] );
$process = new OsProcessModel( $process_data['id'] );
$new_process = false;
} else {
$this->check_nonce( 'new_process' );
$process = new OsProcessModel();
$new_process = true;
}
$process->status = $process_data['status'] ?? 'active';
$process->name = $process_data['name'];
$process->event_type = $process_data['event']['type'];
$actions = [];
// check if conditions are turned ON and exist in params
$trigger_conditions = ( isset( $process_data['event']['conditional'] ) && $process_data['event']['conditional'] == LATEPOINT_VALUE_ON && isset( $process_data['event']['trigger_conditions'] ) && ! empty( $process_data['event']['trigger_conditions'] ) ) ? $process_data['event']['trigger_conditions'] : [];
if ( isset( $process_data['actions'] ) ) {
$actions = OsProcessesHelper::iterate_trigger_conditions( $trigger_conditions, $process_data['actions'] );
if ( $process_data['event']['has_time_offset'] == LATEPOINT_VALUE_ON ) {
$actions[0]['time_offset'] = $process_data['event']['time_offset'];
} else {
$actions[0]['time_offset'] = [];
}
} else {
$actions = [];
}
$process->actions_json = wp_json_encode( $actions );
$old_process = $process->is_new_record() ? [] : clone $process;
if ( $process->save() ) {
if ( ! $new_process ) {
// remove previously created jobs for this process that hasn't run yet
$jobs = new OsProcessJobModel();
$jobs->delete_where( [ 'process_id' => $process->id, 'status' => LATEPOINT_JOB_STATUS_SCHEDULED ] );
/**
* Process was updated
*
* @param {OsProcessModel} $process instance of process model that was updated
* @param {OsProcessModel} $old_process instance of process model before it was updated
*
* @since 4.7.0
* @hook latepoint_process_updated
*
*/
do_action( 'latepoint_process_updated', $process, $old_process );
} else {
/**
* Process was created
*
* @param {OsProcessModel} $process instance of process model that was created
*
* @since 4.7.0
* @hook latepoint_process_created
*
*/
do_action( 'latepoint_process_created', $process );
}
$process->build_from_json();
OsProcessJobsHelper::recreate_jobs_for_existing_records( $process );
$message = __( 'Process Saved', 'latepoint' );
$status = LATEPOINT_STATUS_SUCCESS;
} else {
$message = __( 'Error saving process', 'latepoint' );
$status = LATEPOINT_STATUS_ERROR;
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => $status, 'message' => $message ) );
}
}
function new_trigger_condition() {
$process_event = new \LatePoint\Misc\ProcessEvent( [ 'type' => $this->params['event_type'] ] );
$trigger_condition_html = $process_event->generate_trigger_condition_form_html();
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => $trigger_condition_html ) );
}
}
function new_action() {
$action = new \LatePoint\Misc\ProcessAction();
$process_id = !empty($this->params['process_id']) ? sanitize_text_field($this->params['process_id']) : '';
$response_html = \LatePoint\Misc\ProcessAction::generate_form( $action, $process_id );
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => $response_html ) );
}
}
function load_action_settings() {
$action = new \LatePoint\Misc\ProcessAction( [ 'type' => $this->params['action_type'], 'id' => $this->params['action_id'] ] );
$template_id = $this->params['template_id'] ?? false;
if ( $template_id ) {
$action->load_settings_from_template( $template_id );
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => \LatePoint\Misc\ProcessAction::generate_settings_fields( $action ) ) );
}
}
function index() {
$processes = new OsProcessModel();
$this->vars['processes'] = $processes->get_results_as_models();
$this->format_render( __FUNCTION__ );
}
function action_test_run() {
$action = new \LatePoint\Misc\ProcessAction();
$action->set_from_params( $this->params['action'] );
$available_data_sources = $action->event->get_available_data_sources();
foreach ( $available_data_sources as $data_source ) {
$action->selected_data_objects[] = [ 'model' => $data_source['model'], 'id' => $this->params['data_source'][ $data_source['name'] ] ];
}
$result = $action->run();
if ( $this->get_return_format() == 'json' ) {
$this->send_json( [ 'status' => $result['status'], 'message' => $result['message'] ] );
}
}
function test_run() {
$process = new OsProcessModel();
$process->set_from_params( $this->params['process'] );
$action_ids_to_run = isset( $this->params['action_ids'] ) ? explode( ',', $this->params['action_ids'] ) : [];
$data_sources = $this->params['data_source'];
$selected_data_objects = [];
foreach ( $data_sources as $source_id => $data_source_value ) {
$object_data = OsProcessesHelper::get_object_data_by_source( $source_id, $data_source_value );
if(!empty($object_data)){
$selected_data_objects[] = $object_data;
}
}
if ( $process->check_if_objects_satisfy_trigger_conditions( $selected_data_objects ) ) {
foreach ( $process->actions as $action ) {
if ( $action->status != LATEPOINT_STATUS_ACTIVE ) {
continue;
}
if ( ! in_array( $action->id, $action_ids_to_run ) ) {
continue;
}
$action->selected_data_objects = $selected_data_objects;
$action->run();
}
$status = LATEPOINT_STATUS_SUCCESS;
$message = __( 'Run complete', 'latepoint' ) . '. <a href="' . OsRouterHelper::build_link( [ 'activities', 'index' ] ) . '" target="_blank">' . __( 'view logs', 'latepoint' ) . '</a>';
} else {
$status = LATEPOINT_STATUS_ERROR;
$message = __( 'Trigger conditions not met', 'latepoint' );
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( [ 'status' => $status, 'message' => $message ] );
}
}
function test_preview() {
$process = new OsProcessModel();
$process->set_from_params( $this->params['process'] );
$action_settings_html = '';
$available_data_sources = $process->event->get_available_data_sources();
foreach ( $available_data_sources as $data_source ) {
$action_settings_html .= OsFormHelper::select_field( 'data_source[' . $data_source['name'] . ']', $data_source['label'], $data_source['values'], $data_source['values']['0']['value'], [ 'class' => 'process-test-data-source-selector',
'data-route' => OsRouterHelper::build_route_name( 'processes', 'reload_action_test_preview' )
] );
}
$this->vars['action_settings_html'] = $action_settings_html;
$this->vars['process'] = $process;
$this->format_render( __FUNCTION__ );
}
function action_test_preview() {
$action = new \LatePoint\Misc\ProcessAction();
// because this data is part of a bigger process form, we need to extract just the action params
$action->set_from_params( reset( $this->params['process']['actions'] ) );
$action->event = new \LatePoint\Misc\ProcessEvent( [ 'type' => $this->params['process_event_type'] ] );
$action_settings_html = '';
$available_data_sources = $action->event->get_available_data_sources();
foreach ( $available_data_sources as $data_source ) {
$action_settings_html .= OsFormHelper::select_field( 'data_source[' . $data_source['name'] . ']', $data_source['label'], $data_source['values'], $data_source['values']['0']['value'], [
'class' => 'process-action-test-data-source-selector',
'data-route' => OsRouterHelper::build_route_name( 'processes', 'reload_action_test_preview' )
] );
$action->selected_data_objects[] = [ 'model' => $data_source['model'], 'id' => $data_source['values'][0]['value'] ];
}
$action_settings_html .= OsFormHelper::hidden_field( 'action[type]', $action->type );
$action_settings_html .= OsFormHelper::hidden_field( 'action[event][type]', $action->event->type );
$action_settings_html.= OsFormHelper::get_hidden_fields_for_array($action->settings, 'action[settings]');
$preview_html = $action->generate_preview();
$this->vars['action'] = $action;
$this->vars['preview_html'] = $preview_html;
$this->vars['action_settings_html'] = $action_settings_html;
$this->format_render( __FUNCTION__ );
}
function reload_action_test_preview() {
$action = new \LatePoint\Misc\ProcessAction();
$action->set_from_params( $this->params['action'] );
$available_data_sources = $action->event->get_available_data_sources();
foreach ( $available_data_sources as $data_source ) {
$action->selected_data_objects[] = [ 'model' => $data_source['model'], 'id' => $this->params['data_source'][ $data_source['name'] ] ];
}
if ( $this->get_return_format() == 'json' ) {
$this->send_json( [ 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => $action->generate_preview() ] );
}
}
}
endif;