<?php if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } if ( ! class_exists( 'OsActivitiesController' ) ) : class OsActivitiesController extends OsController { function __construct() { parent::__construct(); $this->views_folder = LATEPOINT_VIEWS_ABSPATH . 'activities/'; $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' => __( 'Activities', 'latepoint' ), 'link' => OsRouterHelper::build_link( OsRouterHelper::build_route_name( 'activities', 'index' ) ) ); } public function clear_all() { $this->check_nonce( 'clear_activities' ); global $wpdb; $wpdb->query( $wpdb->prepare("TRUNCATE TABLE %i", esc_sql(LATEPOINT_TABLE_ACTIVITIES) )); if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => LATEPOINT_STATUS_SUCCESS, 'message' => __( 'Activities log cleared', 'latepoint' ) ) ); } } public function export() { $csv_filename = 'activities_log_' . OsUtilHelper::random_text() . '.csv'; header( "Content-Type: text/csv" ); header( "Content-Disposition: attachment; filename={$csv_filename}" ); $labels_row = [ __( 'Type', 'latepoint' ), __( 'Agent ID', 'latepoint' ), __( 'Booking ID', 'latepoint' ), __( 'Service ID', 'latepoint' ), __( 'Customer ID', 'latepoint' ), __( 'Location ID', 'latepoint' ), __( 'Action By User Type', 'latepoint' ), __( 'Action By User ID', 'latepoint' ), __( 'Date, Time', 'latepoint' ), __( 'Description', 'latepoint' ) ]; $activities_data = []; $activities_data[] = $labels_row; $activities = new OsActivityModel(); $activities_arr = $activities->order_by( 'created_at' )->get_results( ARRAY_A ); if ( $activities_arr ) { foreach ( $activities_arr as $activity ) { $values_row = [ $activity['code'], $activity['agent_id'], $activity['booking_id'], $activity['service_id'], $activity['customer_id'], $activity['location_id'], $activity['initiated_by'], $activity['initiated_by_id'], $activity['created_at'], $activity['description'], ]; $activities_data[] = $values_row; } } OsCSVHelper::array_to_csv( $activities_data ); return; } /* Index of activities */ public function index() { $per_page = OsSettingsHelper::get_number_of_records_per_page(); $page_number = isset( $this->params['page_number'] ) ? $this->params['page_number'] : 1; $activities = new OsActivityModel(); $count_activities = new OsActivityModel(); // TABLE SEARCH FILTERS $filter = isset( $this->params['filter'] ) ? $this->params['filter'] : false; $query_args = []; if ( $filter ) { if ( ! empty( $filter['code'] ) ) { $query_args['code'] = $filter['code']; } if ( ! empty( $filter['initiated_by_id'] ) ) { $query_args['initiated_by_id'] = $filter['initiated_by_id']; } if ( ! empty( $filter['created_at_from'] ) && ! empty( $filter['created_at_to'] ) ) { $query_args['created_at >='] = $filter['created_at_from']; $query_args['created_at <='] = $filter['created_at_to']; } } $total_activities = $count_activities->where( $query_args )->count(); $activities = $activities->where( $query_args )->order_by( 'id desc' )->set_limit( $per_page ); if ( $page_number > 1 ) { $activities = $activities->set_offset( ( $page_number - 1 ) * $per_page ); } $this->vars['activities'] = $activities->get_results_as_models(); $this->vars['total_activities'] = $total_activities; $this->vars['current_page_number'] = $page_number; $this->vars['per_page'] = $per_page; $total_pages = ceil( $total_activities / $per_page ); $this->vars['total_pages'] = $total_pages; $this->vars['showing_from'] = ( ( $page_number - 1 ) * $per_page ) ? ( ( $page_number - 1 ) * $per_page ) : 1; $this->vars['showing_to'] = min( $page_number * $per_page, $total_activities ); $this->vars['breadcrumbs'][] = array( 'label' => __( 'Index', 'latepoint' ), 'link' => false ); $this->format_render( [ 'json_view_name' => '_table_body', 'html_view_name' => __FUNCTION__ ], [], [ 'total_pages' => $total_pages, 'showing_from' => $this->vars['showing_from'], 'showing_to' => $this->vars['showing_to'], 'total_records' => $total_activities ] ); } public function destroy() { if ( filter_var( $this->params['id'], FILTER_VALIDATE_INT ) ) { $this->check_nonce( 'destroy_activity_' . $this->params['id'] ); $activity = new OsActivityModel( $this->params['id'] ); if ( $activity->delete() ) { $status = LATEPOINT_STATUS_SUCCESS; $response_html = __( 'Activity Removed', 'latepoint' ); } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Error Removing Activity', 'latepoint' ); } } else { $status = LATEPOINT_STATUS_ERROR; $response_html = __( 'Error Removing Activity', 'latepoint' ); } if ( $this->get_return_format() == 'json' ) { $this->send_json( array( 'status' => $status, 'message' => $response_html ) ); } } public function view() { $activity = new OsActivityModel( $this->params['id'] ); $data = json_decode( $activity->description, true ); $this->vars['activity_id'] = $activity->id; $this->vars['activity_name'] = $activity->name; $this->vars['activity_type'] = $activity->code; $this->vars['status'] = $data['status'] ?? ''; $status_html = ''; if ( ! empty( $data['status'] ) ) { $status_html = '<div class="status-item">' . __( 'Status:', 'latepoint' ) . ' <strong>' . $data['status'] . '</strong></div>'; $status_html .= '<div class="status-item">' . __( 'Processed on:', 'latepoint' ) . ' <strong>' . $data['processed_datetime'] . '</strong></div>'; if ( ! empty( $data['errors'] ) ) { $status_html .= '<div class="status-item">' . __( 'Errors:', 'latepoint' ) . '<strong>' . ( is_array( $data['errors'] ) ? implode( ', ', $data['errors'] ) : $data['errors'] ) . '</strong></div>'; } } switch ( $activity->code ) { // orders case 'order_intent_updated': $link_to_order = $activity->order_id ? '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>' : ''; $meta_html = '<div class="activity-preview-to">' . ( $link_to_order ? ( '<span class="os-value">' . $link_to_order . '</span>' ) : '' ) . '<span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span></div>'; $content_html = '<pre class="format-json">' . wp_json_encode( $data['order_data_vars'], JSON_PRETTY_PRINT ) . '</pre>'; break; case 'order_intent_created': $link_to_order = $activity->order_id ? '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>' : ''; $meta_html = '<div class="activity-preview-to">' . ( $link_to_order ? ( '<span class="os-value">' . $link_to_order . '</span>' ) : '' ) . '<span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span></div>'; $content_html = '<pre class="format-json">' . wp_json_encode( $data['order_data_vars'], JSON_PRETTY_PRINT ) . '</pre>'; break; case 'order_intent_converted': $link_to_order = '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>'; $meta_html = '<div class="activity-preview-to"><span class="os-value">' . $link_to_order . '</span><span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span></div>'; $content_html = '<pre class="format-json">' . wp_json_encode( $data['order_data_vars'], JSON_PRETTY_PRINT ) . '</pre>'; break; case 'order_created': $link_to_order = '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>'; $meta_html = '<div class="activity-preview-to"><span class="os-value">' . $link_to_order . '</span><span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__('by:','latepoint') . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>'; $content_html = '<pre class="format-json">' . wp_json_encode( $data['order_data_vars'], JSON_PRETTY_PRINT ) . '</pre>'; break; case 'order_updated': $link_to_order = '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>'; $meta_html = '<div class="activity-preview-to"><span class="os-value">' . $link_to_order . '</span><span class="os-label">' . __( 'Updated On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__('by:','latepoint') . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>'; $changes = OsUtilHelper::compare_model_data_vars( $data['order_data_vars']['new'], $data['order_data_vars']['old'] ); $content_html = '<pre class="format-json">' . wp_json_encode( $changes, JSON_PRETTY_PRINT ) . '</pre>'; break; case 'customer_created': $link_to_customer = '<a href="#" ' . OsCustomerHelper::quick_customer_btn_html( $activity->customer_id ) . '>' . __( 'View Customer', 'latepoint' ) . '</a>'; $meta_html = '<div class="activity-preview-to"><span class="os-value">' . $link_to_customer . '</span><span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__('by:','latepoint') . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>'; $content_html = '<pre class="format-json">' . wp_json_encode( $data['customer_data_vars'], JSON_PRETTY_PRINT ) . '</pre>'; break; case 'customer_updated': $link_to_customer = '<a href="#" ' . OsCustomerHelper::quick_customer_btn_html( $activity->customer_id ) . '>' . __( 'View Customer', 'latepoint' ) . '</a>'; $meta_html = '<div class="activity-preview-to"><span class="os-value">' . $link_to_customer . '</span><span class="os-label">' . __( 'Updated On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__('by:','latepoint') . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>'; $changes = OsUtilHelper::compare_model_data_vars( $data['customer_data_vars']['new'], $data['customer_data_vars']['old'] ); $content_html = '<pre class="format-json">' . wp_json_encode( $changes, JSON_PRETTY_PRINT ) . '</pre>'; break; case 'payment_request_created': $link_to_order = '<a href="#" ' . OsOrdersHelper::quick_order_btn_html( $activity->order_id ) . '>' . __( 'View Order', 'latepoint' ) . '</a>'; $meta_html = '<div class="activity-preview-to"><span class="os-value">' . $link_to_order . '</span><span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span></div>'; $content_html = '<pre class="format-json">' . wp_json_encode( $data['payment_request_data_vars'], JSON_PRETTY_PRINT ) . '</pre>'; break; // bookings case 'booking_change_status': $link_to_order = $activity->order_id ? '<a href="#" ' . OsBookingHelper::quick_booking_btn_html( $activity->booking_id ) . '>' . __( 'View Booking', 'latepoint' ) . '</a>' : ''; $meta_html = '<div class="activity-preview-to">' . ( $link_to_order ? ( '<span class="os-value">' . $link_to_order . '</span>' ) : '' ) . '<span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__('by:','latepoint') . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>'; $content_html = '<div class="activity-preview-content">' . $activity->description . '</div>'; break; case 'booking_created': $link_to_booking = '<a href="#" ' . OsBookingHelper::quick_booking_btn_html( $activity->booking_id ) . '>' . __( 'View Booking', 'latepoint' ) . '</a>'; $meta_html = '<div class="activity-preview-to"><span class="os-value">' . $link_to_booking . '</span><span class="os-label">' . __( 'Created On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__('by:','latepoint') . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>'; $content_html = '<pre class="format-json">' . wp_json_encode( $data['booking_data_vars'], JSON_PRETTY_PRINT ) . '</pre>'; break; case 'booking_updated': $link_to_booking = '<a href="#" ' . OsBookingHelper::quick_booking_btn_html( $activity->booking_id ) . '>' . __( 'View Booking', 'latepoint' ) . '</a>'; $meta_html = '<div class="activity-preview-to"><span class="os-value">' . $link_to_booking . '</span><span class="os-label">' . __( 'Updated On:', 'latepoint' ) . '</span><span class="os-value">' . $activity->nice_created_at . '</span><span class="os-label">' . esc_html__('by:','latepoint') . '</span><span class="os-value">' . $activity->get_user_link() . '</span></div>'; $changes = OsUtilHelper::compare_model_data_vars( $data['booking_data_vars']['new'], $data['booking_data_vars']['old'] ); $content_html = '<pre class="format-json">' . wp_json_encode( $changes, JSON_PRETTY_PRINT ) . '</pre>'; break; case 'email_sent': $meta_html = '<div class="activity-preview-subject">' . esc_html( $data['extra_data']['subject'] ) . '</div>'; $meta_html .= '<div class="activity-preview-to"><span class="os-label">' . __( 'To:', 'latepoint' ) . '</span><span class="os-value">' . esc_html( $data['to'] ) . '</span></div>'; $content_html = '<div class="activity-preview-content">' . $data['content'] . '</div>'; break; case 'sms_sent': $meta_html = '<div class="activity-preview-to"><span class="os-label">' . __( 'To:', 'latepoint' ) . '</span><span class="os-value">' . esc_html( $data['to'] ) . '</span></div>'; $content_html = '<div class="activity-preview-content">' . $data['content'] . '</div>'; break; case 'http_request': $meta_html = '<div class="activity-preview-to"><span class="os-label">' . __( 'URL:', 'latepoint' ) . '</span><span class="os-value"><a href="#" target="_blank">' . esc_html( $data['to'] ) . '</a></span></div>'; $content_html = '<pre class="format-json">' . wp_json_encode( $data['content'], JSON_PRETTY_PRINT ) . '</pre>'; break; case 'process_job_run': $job = new OsProcessJobModel( $data['job_id'] ); $name = $job->process->name . ', ID: ' . $job->process->id; $meta_html = '<div class="activity-preview-to"><span class="os-label">' . __( 'Process:', 'latepoint' ) . '</span><span class="os-value">' . esc_html( $name ) . '</span></div>'; $content_html = '<pre class="format-json">' . $data['run_result'] . '</pre>'; break; case 'error': $meta_html = '<div class="activity-preview-to"><span class="os-label">' . __( 'Error Message:', 'latepoint' ) . '</span><span class="os-value">' . esc_html( $data['message'] ) . ' | ' . esc_html( $data['error_code'] ) . '</span></div>'; $content_html = '<pre class="format-json">' . wp_json_encode( $data['extra_description'], JSON_PRETTY_PRINT ) . '</pre>'; break; default: /** * Allow to add custom activity * * @since 5.1.8 * @hook latepoint_custom_activity_html * * @param {OsActivityModel} $activity * @param {array} $data * * @returns {array} The array of meta and content HTML */ $custom_activity_html = apply_filters('latepoint_custom_activity_html', false, $activity, $data); if ($custom_activity_html !== false) { $meta_html = $custom_activity_html['meta_html'] ?? ''; $content_html = $custom_activity_html['content_html'] ?? ''; break; } break; } $this->vars['content_html'] = $content_html ?? ''; $this->vars['meta_html'] = $meta_html ?? ''; $this->vars['status_html'] = $status_html ?? ''; $this->vars = apply_filters( 'latepoint_activity_view_vars', $this->vars, $activity ); $this->format_render( __FUNCTION__ ); } } endif;