/home/edulekha/crm.edulekha.com/modules/appointly/views/history/index.php
<?php

defined('BASEPATH') or exit('No direct script access allowed');

$aColumns = [
    'id',
    'subject',
    'CAST(CONCAT(date, \' \', start_hour) AS DATETIME) as date',
    'firstname as creator_firstname',
    'description',
    'source'
];


$sIndexColumn = 'id';
$sTable = db_prefix() . 'appointly_appointments';

$where = [];

if (!staff_can('view', 'appointments')) {
    array_push($where, 'AND (' . db_prefix() . 'appointly_appointments.created_by=' . get_staff_user_id() . ')
    OR ' . db_prefix() . 'appointly_appointments.id
    IN (SELECT appointment_id FROM ' . db_prefix() . 'appointly_attendees WHERE staff_id=' . get_staff_user_id() . ')');
}


$join = [
    'LEFT JOIN ' . db_prefix() . 'staff ON ' . db_prefix() . 'staff.staffid = ' . db_prefix() . 'appointly_appointments.created_by',
];

$additionalSelect = [
    'created_by',
    'status',
    'lastname as creator_lastname',
    'firstname as creator_firstname',
    'name',
    db_prefix() . 'appointly_appointments.email as contact_email',
    db_prefix() . 'appointly_appointments.phone',
    'contact_id',
    'google_calendar_link',
    'google_added_by_id',
    'outlook_calendar_link',
    'outlook_added_by_id',
    'outlook_event_id',
    'feedback'
];
$where[] = "AND status = 'completed'";

$result = data_tables_init($aColumns, $sIndexColumn, $sTable, $join, $where, $additionalSelect);

$output = $result['output'];
$rResult = $result['rResult'];


foreach ($rResult as $aRow) {

    $label_class = 'primary';
    $tooltip = '';

    if (date('Y-m-d H:i', strtotime($aRow['date'])) < date('Y-m-d H:i')) {
        $label_class = 'danger';
        $tooltip = 'data-toggle="tooltip" title="' . _l('appointment_missed') . '"';
    }

    $row = [];

    $hrefAttr = 'data-toggle="tooltip" title="' . _l('appointment_view_meeting') . '" href="' . admin_url('appointly/appointments/view?appointment_id=' . $aRow['id']) . '"';
    $row[] = $aRow['id'];

    $nameRow = '<a href="' . admin_url('appointly/appointments/view?appointment_id=' . $aRow['id']) . '">' . $aRow['subject'] . '</a>';

    if ($aRow['status'] && $aRow['status'] == 'cancelled') {
        $nameRow .= '<p class="text-danger no-mbot">' . _l('appointment_cancelled') . '</p>';
    }

    $nameRow .= '<div class="row-options no-mtop">';

    $nameRow .= '<a ' . $hrefAttr . '>' . _l('view') . '</a>';

    if (staff_can('edit', 'appointments')) {
        $nameRow .= ' | <a data-toggle="tooltip" title="' . _l('appointment_edit_history_notes') . '" data-id="' . $aRow['id'] . '" onclick="editAppointmentNotes(this)" style="cursor:pointer;">' . _l('appointment_edit_history_notes') . '</a>';
    }

    $nameRow .= '</div>';

    $row[] = $nameRow;
    // the feedback needs to be shown in starts like in appointment.php
    $feedback = $aRow['feedback'] ?? 'N/A';
    $stars = '<div class="tw-flex tw-items-center tw-gap-3">';
    for ($i = 0; $i < 5; $i++) {
        $starColor = ($feedback > $i) ? 'tw-text-yellow-400' : 'tw-text-neutral-300';
        $stars .= '<i class="fa fa-star ' . $starColor . ' tw-text-black"></i>';
    }
    $stars .= '</div>';
    $row[] = $stars;

    $row[] = '<span  ' . $tooltip . ' class="label label-' . $label_class . '">' . _dt($aRow['date']) . '</span>';


    $initiatedBy = $aRow['creator_firstname'] . ' ' . $aRow['creator_lastname'];

    if ($aRow['source'] == 'external' && empty($aRow['created_by'])) {
        $initiatedBy .= '<span class="tw-text-xs tw-font-medium tw-text-neutral-500" data-toggle="tooltip" title="' . _l('appointment_externally_booked_info') . '">' . $aRow['name'] . '</span>';
        $row[] = '<div class="tw-flex tw-items-center">
        <span class="tw-text-sm">' . $initiatedBy . '</span>
      </div>';
    } else {
        $row[] = '<div class="tw-flex tw-items-center">
        <a target="_blank" href="' . admin_url('staff/profile/' . $aRow['created_by']) . '">
          <img src="' . staff_profile_image_url($aRow['created_by'], 'small') . '"
               class="tw-w-8 tw-h-8 tw-rounded-md tw-mr-2" alt="' . $initiatedBy . '"/>
          <span class="tw-text-sm tw-font-medium">' . $initiatedBy . '</span>
        </a>
      </div>';
    }

    $row[] = $aRow['description'];

    if ($aRow['source'] == 'external') {
        $row[] = _l('appointments_source_external_label');
    }
    if ($aRow['source'] == 'internal') {
        $row[] = _l('appointments_source_internal_label');
    }
    if ($aRow['source'] == 'lead_related') {
        $row[] = _l('lead');
    }

    $options = '';
    $_google_calendar_link = $aRow['google_calendar_link'] !== null && $aRow['google_added_by_id'] == get_staff_user_id();
    $_outlook_calendar_link = $aRow['outlook_calendar_link'] !== null && $aRow['outlook_added_by_id'] == get_staff_user_id();

    $options .= '<div class="text-center">';

    if ($_google_calendar_link) {
        $options .= '<a data-toggle="tooltip" title="' . _l('appointment_open_google_calendar') . '" href="' . $aRow['google_calendar_link'] . '" target="_blank" class="mleft10 calendar_list"><i class="fa-brands fa-google" aria-hidden="true"></i></a>';
    }

    if ($_outlook_calendar_link) {
        $options .= '<a data-outlook-id="' . $aRow['outlook_event_id'] . '" id="outlookLink_' . $aRow['id'] . '" data-toggle="tooltip" title="' . _l('appointment_open_outlook_calendar') . '" href="' . $aRow['outlook_calendar_link'] . '" target="_blank" class="mleft5 calendar_list float-right"><i class="fa-regular fa-envelope" aria-hidden="true"></i></a>';
    }
    if (!$_google_calendar_link && !$_outlook_calendar_link) {
        $options .= '<p class="text-muted">' . _l('appointment_not_added_to_calendars_yet') . '</p>'; #lang
    }

    $options .= '</div>';


    $row['DT_RowId'] = 'appointment_id' . $aRow['id'];

    if (isset($row['DT_RowClass'])) {
        $row['DT_RowClass'] .= ' has-row-options';
    } else {
        $row['DT_RowClass'] = 'has-row-options';
    }

    $row[] = $options;

    $output['aaData'][] = $row;
}