[Back] <?php
class OsConnectorHelper {
/**
*
* Returns an array of all the possible connections/resources combinations(between agent/service/location) available to satisfy a booking request
*
* @param \LatePoint\Misc\BookingRequest $booking_request
* @return OsConnectorModel[]
*/
public static function get_connections_that_satisfy_booking_request(\LatePoint\Misc\BookingRequest $booking_request, $filter_based_on_access = false): array{
$connection_model = new OsConnectorModel();
// agent
if($filter_based_on_access && !OsRolesHelper::are_all_records_allowed('agent')){
$allowed_ids = OsRolesHelper::get_allowed_records('agent');
// if nothing is allowed, or the requested ID is not part of allowed - return blank
if(empty($allowed_ids) || ($booking_request->agent_id && !in_array($booking_request->agent_id, $allowed_ids))) return [];
if($booking_request->agent_id){
$connection_model->where(['agent_id' => $booking_request->agent_id]);
}else{
// agent_id is 0, it means ANY is requested, filter based on what's allowed
$connection_model->where(['agent_id' => $allowed_ids]);
}
}else{
$active_agents = new OsAgentModel();
$active_agent_ids = array_column($active_agents->select('id')->should_be_active()->get_results(ARRAY_A), 'id');
if(empty($active_agent_ids)) return []; // no active agents
if(empty($booking_request->agent_id)){
// any agent requested, search in a list of active
$connection_model->where(['agent_id' => $active_agent_ids]);
}else{
// specific agent/or agents requested, check if it's in a list of active agents
if(is_array($booking_request->agent_id)){
// array of agents requested, intersect
if(array_intersect($booking_request->agent_id, $active_agent_ids)){
$connection_model->where(['agent_id' => array_intersect($booking_request->agent_id, $active_agent_ids)]);
}else{
return [];
}
}else{
if(in_array($booking_request->agent_id, $active_agent_ids)){
$connection_model->where(['agent_id' => $booking_request->agent_id]);
}else{
// requested agent not in a list of active agents
return [];
}
}
}
}
// location
if($filter_based_on_access && !OsRolesHelper::are_all_records_allowed('location')){
$allowed_ids = OsRolesHelper::get_allowed_records('location');
// if nothing is allowed, or the requested ID is not part of allowed - return blank
if(empty($allowed_ids) || ($booking_request->location_id && !in_array($booking_request->location_id, $allowed_ids))) return [];
if($booking_request->location_id){
$connection_model->where(['location_id' => $booking_request->location_id]);
}else{
// location_id is 0, it means ANY is requested, filter based on what's allowed
$connection_model->where(['location_id' => $allowed_ids]);
}
}else{
$active_locations = new OsLocationModel();
$active_location_ids = array_column($active_locations->select('id')->should_be_active()->get_results(ARRAY_A), 'id');
if(empty($active_location_ids)) return []; // no active locations
if(empty($booking_request->location_id)){
// any location requested, search in a list of active
$connection_model->where(['location_id' => $active_location_ids]);
}else{
// specific location/or locations requested, check if it's in a list of active locations
if(is_array($booking_request->location_id)){
// array of locations requested, intersect
if(array_intersect($booking_request->location_id, $active_location_ids)){
$connection_model->where(['location_id' => array_intersect($booking_request->location_id, $active_location_ids)]);
}else{
return [];
}
}else{
if(in_array($booking_request->location_id, $active_location_ids)){
$connection_model->where(['location_id' => $booking_request->location_id]);
}else{
// requested location not in a list of active locations
return [];
}
}
}
}
// service
if($filter_based_on_access && !OsRolesHelper::are_all_records_allowed('service')){
$allowed_ids = OsRolesHelper::get_allowed_records('service');
// if nothing is allowed, or the requested ID is not part of allowed - return blank
if(empty($allowed_ids) || ($booking_request->service_id && !in_array($booking_request->service_id, $allowed_ids))) return [];
if($booking_request->service_id){
$connection_model->where(['service_id' => $booking_request->service_id]);
}else{
// service_id is 0, it means ANY is requested, filter based on what's allowed
$connection_model->where(['service_id' => $allowed_ids]);
}
}else{
$active_services = new OsServiceModel();
$active_service_ids = array_column($active_services->select('id')->should_be_active()->get_results(ARRAY_A), 'id');
if(empty($active_service_ids)) return []; // no active services
if(empty($booking_request->service_id)){
// any service requested, search in a list of active
$connection_model->where(['service_id' => $active_service_ids]);
}else{
// specific service/or services requested, check if it's in a list of active services
if(is_array($booking_request->service_id)){
// array of services requested, intersect
if(array_intersect($booking_request->service_id, $active_service_ids)){
$connection_model->where(['service_id' => array_intersect($booking_request->service_id, $active_service_ids)]);
}else{
return [];
}
}else{
if(in_array($booking_request->service_id, $active_service_ids)){
$connection_model->where(['service_id' => $booking_request->service_id]);
}else{
// requested service not in a list of active services
return [];
}
}
}
}
return $connection_model->get_results_as_models();
}
// expects [agent_id, 'service_id', 'location_id']
public static function count_connections($connection_query_arr, $group_by = false){
$connection_model = new OsConnectorModel();
$connection_model->where($connection_query_arr);
if($group_by){
$results = $connection_model->select($group_by)->group_by($group_by)->get_results();
$total = count($results);
}else{
$total = $connection_model->count();
}
return $total;
}
public static function can_satisfy_booking_request(\LatePoint\Misc\BookingRequest $booking_request){
$connection_model = new OsConnectorModel();
return $connection_model->where(['agent_id' => $booking_request->agent_id, 'location_id' => $booking_request->location_id, 'service_id' => $booking_request->service_id])->set_limit(1)->get_results_as_models();
}
public static function has_connection($connection_arr){
$connection_model = new OsConnectorModel();
return $connection_model->where($connection_arr)->set_limit(1)->get_results_as_models();
}
// expects [agent_id, 'service_id', 'location_id']
public static function save_connection($connection_arr){
$connection_model = new OsConnectorModel();
$existing_connection = $connection_model->where($connection_arr)->set_limit(1)->get_results_as_models();
if($existing_connection){
// Update
}else{
// Insert
$connection_model->set_data($connection_arr);
return $connection_model->save();
}
}
// object type: agent_id, service_id, location_id
public static function get_connected_object_ids($object_type = 'agent_id', $connections = []){
if(!in_array($object_type, ['agent_id', 'service_id', 'location_id'])) return false;
$clean_connections = [];
if(isset($connections['agent_id']) && !empty($connections['agent_id']) && $connections['agent_id'] != LATEPOINT_ANY_AGENT) $clean_connections['agent_id'] = $connections['agent_id'];
if(isset($connections['service_id']) && !empty($connections['service_id'])) $clean_connections['service_id'] = $connections['service_id'];
if(isset($connections['location_id']) && !empty($connections['location_id']) && $connections['location_id'] != LATEPOINT_ANY_LOCATION) $clean_connections['location_id'] = $connections['location_id'];
$connection_model = new OsConnectorModel();
if(!empty($clean_connections)) $connection_model->where($clean_connections);
$objects = $connection_model->select($object_type)->group_by($object_type)->get_results();
$ids = [];
if($objects){
foreach($objects as $object){
if(isset($object->$object_type)) $ids[] = $object->$object_type;
}
}
return $ids;
}
// expects [agent_id, 'service_id', 'location_id']
public static function remove_connection($connection_arr){
$connection_model = new OsConnectorModel();
if(isset($connection_arr['agent_id']) && isset($connection_arr['service_id']) && isset($connection_arr['location_id'])){
$existing_connection = $connection_model->where($connection_arr)->set_limit(1)->get_results_as_models();
if($existing_connection){
$existing_connection->delete();
}
}
}
}