HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: /var/www/html/appointmentbook.me/wp-content/plugins/booknetic/app/Backend/Staff/Ajax.php
<?php

namespace BookneticApp\Backend\Staff;

use BookneticApp\Providers\Core\CapabilitiesException;
use BookneticApp\Providers\UI\TabUI;
use BookneticApp\Providers\Core\Capabilities;
use BookneticApp\Providers\DB\Collection;
use BookneticApp\Models\Holiday;
use BookneticApp\Models\SpecialDay;
use BookneticApp\Models\Location;
use BookneticApp\Models\Service;
use BookneticApp\Models\ServiceStaff;
use BookneticApp\Models\Staff;
use BookneticApp\Providers\Helpers\Date;
use BookneticApp\Providers\DB\DB;
use BookneticApp\Providers\Helpers\Helper;
use BookneticApp\Providers\Core\Permission;
use Exception;

class Ajax extends \BookneticApp\Providers\Core\Controller
{

	public function add_new()
	{
		$cid = Helper::_post('id', '0', 'integer');

		$selectedServices = [];
		if( $cid > 0 )
		{
			Capabilities::must( 'staff_edit' );

			$staffInfo = Staff::get( $cid );
			if( !$staffInfo )
			{
				return $this->response(false, bkntc__('Staff not found!'));
			}

			$getSelectedServices = ServiceStaff::where('staff_id', $cid)->fetchAll();
			foreach ( $getSelectedServices AS $selected_service )
			{
				$selectedServices[] = (string)$selected_service->service_id;
			}
		}
		else
		{
			Capabilities::must( 'staff_add' );
			$allowedLimit = Capabilities::getLimit( 'staff_allowed_max_number' );

			if( $allowedLimit > -1 && Staff::count() >= $allowedLimit )
			{
				$view = Helper::renderView('Base.view.modal.permission_denied', [
					'text' => bkntc__('You can\'t add more than %d Staff. Please upgrade your plan to add more Staff.', [ $allowedLimit ] )
				]);

				return $this->response( true, [ 'html' => $view ] );
			}

			$staffInfo = new Collection();
		}

		if( !( Permission::isAdministrator() || Capabilities::userCan('staff_add') ) && ($cid == 0 || !in_array( $cid, Permission::myStaffId() )) )
		{
			return $this->response(false, bkntc__('You do not have sufficient permissions to perform this action'));
		}

		$timesheet = DB::DB()->get_row(
			DB::DB()->prepare( 'SELECT staff_id, timesheet FROM '.DB::table('timesheet').' WHERE ((service_id IS NULL AND staff_id IS NULL) OR (staff_id=%d)) '.DB::tenantFilter().' ORDER BY staff_id DESC LIMIT 0,1', [ $cid ] ),
			ARRAY_A
		);

		$specialDays = SpecialDay::where('staff_id', $cid)->fetchAll();
		$holidays = Holiday::where('staff_id', $cid)->fetchAll();

		$holidaysArr = [];
		foreach( $holidays AS $holiday )
		{
			$holidaysArr[ Date::dateSQL( $holiday['date'] ) ] = $holiday['id'];
		}

		$locations  = Location::fetchAll();
		$services   = Service::fetchAll();

		$users = DB::DB()->get_results('SELECT * FROM `'.DB::DB()->base_prefix.'users`', ARRAY_A);

        TabUI::get( 'staff_add' )
             ->item( 'details' )
             ->setTitle( bkntc__( 'STAFF DETAILS' ) )
             ->addView( __DIR__ . '/view/tab/details.php', [], 1 )
             ->setPriority( 1 );

        TabUI::get( 'staff_add' )
             ->item( 'timesheet' )
             ->setTitle( bkntc__( 'WEEKLY SCHEDULE' ) )
             ->addView( __DIR__ . '/view/tab/timesheet.php', [], 1 )
             ->setPriority( 2 );

        TabUI::get( 'staff_add' )
             ->item( 'special_days' )
             ->setTitle( bkntc__( 'SPECIAL DAYS' ) )
             ->addView( __DIR__ . '/view/tab/special_days.php', [], 1 )
             ->setPriority( 3 );

        TabUI::get( 'staff_add' )
             ->item( 'holidays' )
             ->setTitle( bkntc__( 'HOLIDAYS' ) )
             ->addView( __DIR__ . '/view/tab/holidays.php', [], 1 )
             ->setPriority( 4 );

        $timeS = empty($timesheet['timesheet']) ? [
            ["day_off" => 0, "start" => "00:00", "end" => "24:00", "breaks" =>[]],
            ["day_off" => 0, "start" => "00:00", "end" => "24:00", "breaks" =>[]],
            ["day_off" => 0, "start" => "00:00", "end" => "24:00", "breaks" =>[]],
            ["day_off" => 0, "start" => "00:00", "end" => "24:00", "breaks" =>[]],
            ["day_off" => 0, "start" => "00:00", "end" => "24:00", "breaks" =>[]],
            ["day_off" => 0, "start" => "00:00", "end" => "24:00", "breaks" =>[]],
            ["day_off" => 0, "start" => "00:00", "end" => "24:00", "breaks" =>[]] ] : json_decode($timesheet['timesheet'], true);

        $data = [
            'users'                     => $users,
            'locations'                 => $locations,
            'services'                  => $services,
            'selected_services'         => $selectedServices,
            'id'                        => $cid,
            'staff'                     => $staffInfo,
            'special_days'              => $specialDays,
            'timesheet'                 => $timeS,
            'has_specific_timesheet'    => ! empty($timesheet['staff_id']) && $timesheet['staff_id'] > 0,
            'holidays'                  => json_encode( $holidaysArr ),
        ];

		return $this->modalView( 'add_new', $data );
	}

    /**
     * @throws CapabilitiesException|Exception
     */
    public function save_staff()
	{
        $staff = new StaffObject();

        $staff->hasCapability();
        $staff->validate();

        $staff->checkIfUserCanCreateNewStaff();
        $staff->fetchOldStaffInfo();
        $staff->fetchLocations();
        $staff->fetchServices();
        $staff->checkAllowedStaffLimit();
        $staff->parseWeeklySchedule();
        $staff->handleStaffLogin();
        $staff->handleProfileImage();

        $staff->applySqlDataFilters();

        $staff->save();
        $staff->saveServiceStaff();
        $staff->saveWeeklySchedule();
        $staff->saveSpecialDays();
        $staff->saveHolidays();
        $staff->saveTranslations();

		return $this->response(true, [
            'is_edit' => $staff->isEdit(),
            'staff_id' => $staff->getId()
        ] );
	}

	public function hide_staff()
	{
		Capabilities::must( 'staff_edit' );

		$staff_id	= Helper::_post('staff_id', '', 'int');

		if( !( $staff_id > 0 ) )
		{
			return $this->response(false);
		}

		$staff = Staff::get( $staff_id );

		if( !$staff )
		{
			return $this->response( false );
		}

		$new_status = $staff['is_active'] == 1 ? 0 : 1;

		Staff::where('id', $staff_id)->update([ 'is_active' => $new_status ]);

		return $this->response( true );
	}

    public function get_available_times_all()
    {
        $search		    = Helper::_post('q', '', 'string');

        $timeslotLength = Helper::getOption('timeslot_length', 5);

        $tEnd = Date::epoch('00:00:00', '+1 days');
        $timeCursor = Date::epoch('00:00:00');
        $data = [];
        while( $timeCursor <= $tEnd )
        {
            $timeId = Date::timeSQL( $timeCursor );
            $timeText = Date::time( $timeCursor );

            if( $timeCursor == $tEnd && $timeId = "00:00" )
            {
                $timeText = "24:00";
                $timeId = "24:00";
            }

            $timeCursor += $timeslotLength * 60;

            // search...
            if( !empty( $search ) && strpos( $timeText, $search ) === false )
            {
                continue;
            }

            $data[] = [
                'id'	=>	$timeId,
                'text'	=>	$timeText
            ];
        }

        return $this->response(true, [ 'results' => $data ]);
    }
}