<?php /* * Copyright (c) 2023 LatePoint LLC. All rights reserved. */ class OsBundleModel extends OsModel { var $services; var $id, $name, $short_description, $charge_amount, $deposit_amount, $status, $visibility, $order_number, $updated_at, $created_at; function __construct($id = false) { parent::__construct(); $this->table_name = LATEPOINT_TABLE_BUNDLES; $this->join_table_name_bundles_services = LATEPOINT_TABLE_JOIN_BUNDLES_SERVICES; if ($id) { $this->load_by_id($id); } } public function generate_data_vars(): array { $vars = [ 'id' => $this->id, 'name' => $this->name ]; return $vars; } function has_service($service_id): bool{ $services = $this->get_services(); foreach($services as $service){ if($service->id == $service_id) return true; } return false; } function quantity_for_service($service_id): int{ $services = $this->get_services(); foreach($services as $service){ if($service->id == $service_id) return (!empty($service->join_attributes['quantity']) ? $service->join_attributes['quantity'] : 0); } return 0; } function duration_for_service($service_id): int{ $services = $this->get_services(); foreach($services as $service){ if($service->id == $service_id) return (!empty($service->join_attributes['duration']) ? $service->join_attributes['duration'] : $service->duration); } return 0; } function total_attendees_for_service($service_id): int{ $services = $this->get_services(); foreach($services as $service){ if($service->id == $service_id) return (!empty($service->join_attributes['total_attendees']) ? $service->join_attributes['total_attendees'] : 1); } return 0; } public function generate_params_for_booking_form(){ $params = [ "bundle_id" => $this->id ]; /** * Returns an array of params generated from OsBundleModel to be used in a booking form * * @since 5.0.0 * @hook latepoint_generated_bundle_params_for_booking_form * * @param {array} $params Array of booking params * @param {OsBundleModel} $bundle Instance of <code>OsBundleModel</code> that params are being generated for * * @returns {array} Filtered array of booking params */ return apply_filters('latepoint_generated_bundle_params_for_booking_form', $params, $this); } /** * @return mixed|void * * Returns full amount to charge in database format 1999.0000 * */ public function full_amount_to_charge(){ return OsBundlesHelper::calculate_full_amount_for_bundle($this); } /** * @return mixed|void * * Returns deposit amount to charge in database format 1999.0000 * */ public function deposit_amount_to_charge(){ return OsBundlesHelper::calculate_deposit_amount_for_bundle($this); } public function save_services($services){ if(!$services) return true; $connections_to_save = []; $connections_to_remove = []; foreach($services as $service_key => $service){ $service_id = str_replace('service_', '', $service_key); $connection = [ 'bundle_id' => $this->id, 'service_id' => $service_id, 'quantity' => $service['quantity'], 'total_attendees' => $service['total_attendees'], 'duration' => $service['duration'], ]; if($service['connected'] == 'yes'){ $connections_to_save[] = $connection; }else{ $connections_to_remove[] = $connection; } } if(!empty($connections_to_save)){ foreach($connections_to_save as $connection_to_save){ $join_bundle_service = new OsJoinBundlesServicesModel(); $existing = $join_bundle_service->where(['bundle_id' => $connection_to_save['bundle_id'], 'service_id' => $connection_to_save['service_id']])->set_limit(1)->get_results_as_models(); if($existing){ $existing->quantity = $connection_to_save['quantity']; $existing->total_attendees = $connection_to_save['total_attendees']; $existing->duration = $connection_to_save['duration']; $existing->save(); }else{ $join_bundle_service->set_data($connection_to_save); $join_bundle_service->save(); } } } if(!empty($connections_to_remove)){ foreach($connections_to_remove as $connection_to_remove){ $join_bundle_service = new OsJoinBundlesServicesModel(); $join_bundle_service->delete_where(['bundle_id' => $connection_to_remove['bundle_id'], 'service_id' => $connection_to_remove['service_id']]); } } return true; } public function get_formatted_charge_amount(){ if($this->charge_amount > 0){ return OsMoneyHelper::format_price($this->charge_amount); }else{ return 0; } } public function get_service_and_quantity_descriptions(): array{ $bundle_services = $this->get_services(); $bundle_services_descriptions = []; foreach ($bundle_services as $service) { $qty = $service->join_attributes['quantity']; $qty_html = $qty > 1 ? ' [' . $qty . ']' : ''; $bundle_services_descriptions[] = $service->name . $qty_html; } return $bundle_services_descriptions; } public function get_services($order_item_id = false) : array{ if (!isset($this->services)) { $bundle_services = new OsJoinBundlesServicesModel(); $bundle_services = $bundle_services->get_services_for_bundle_id($this->id); $this->services = []; if ($bundle_services) { foreach ($bundle_services as $bundle_service) { $service = new OsServiceModel($bundle_service->service_id); $service->join_attributes['quantity'] = $bundle_service->quantity; $service->join_attributes['total_attendees'] = $bundle_service->total_attendees; $service->join_attributes['duration'] = $bundle_service->duration; if($order_item_id){ $bookings = new OsBookingModel(); $service->join_attributes['total_scheduled_bookings'] = $bookings->where(['order_item_id' => $order_item_id, 'service_id' => $service->id])->should_not_be_cancelled()->count(); } $this->services[] = $service; } } } return $this->services; } public function is_hidden(){ return ($this->visibility == LATEPOINT_BUNDLE_VISIBILITY_HIDDEN); } public function should_be_active(){ return $this->where(['status' => LATEPOINT_BUNDLE_STATUS_ACTIVE]); } public function should_not_be_hidden(){ return $this->where(['visibility !=' => LATEPOINT_BUNDLE_VISIBILITY_HIDDEN]); } public function is_active(){ return ($this->status == LATEPOINT_BUNDLE_STATUS_ACTIVE); } public function delete_meta_by_key($meta_key){ if($this->is_new_record()) return false; $meta = new OsBundleMetaModel(); return $meta->delete_by_key($meta_key, $this->id); } public function get_meta_by_key($meta_key, $default = false){ if($this->is_new_record()) return $default; $meta = new OsBundleMetaModel(); return $meta->get_by_key($meta_key, $this->id, $default); } public function save_meta_by_key($meta_key, $meta_value){ if($this->is_new_record()) return false; $meta = new OsBundleMetaModel(); return $meta->save_by_key($meta_key, $meta_value, $this->id); } public function delete($id = false){ if(!$id && isset($this->id)){ $id = $this->id; } if($id && $this->db->delete( $this->table_name, array('id' => $id), array( '%d' ))){ $this->db->delete(LATEPOINT_TABLE_BUNDLE_META, array('object_id' => $id), array( '%d' ) ); do_action('latepoint_bundle_deleted', $id); return true; } return false; } protected function properties_to_validate(){ $validations = array( 'name' => array('presence'), ); return $validations; } protected function params_to_sanitize(){ return ['charge_amount' => 'money', 'deposit_amount' => 'money' ]; } protected function allowed_params($role = 'admin'){ $allowed_params = array('id', 'name', 'short_description', 'charge_amount', 'deposit_amount', 'status', 'visibility', 'order_number', 'updated_at', 'created_at'); return $allowed_params; } protected function params_to_save($role = 'admin'){ $params_to_save = array('id', 'name', 'short_description', 'charge_amount', 'deposit_amount', 'status', 'visibility', 'order_number', 'updated_at', 'created_at'); return $params_to_save; } }