/home/hamzarou/www/wp-content/plugins/sms-alert/handler/forms/class-ameliabooking.php
<?php
/**
* Amelia booking helper.
*
* PHP version 5
*
* @category Handler
* @package SMSAlert
* @author SMS Alert <support@cozyvision.com>
* @license URI: http://www.gnu.org/licenses/gpl-2.0.html
* @link https://www.smsalert.co.in/
*/
if (defined('ABSPATH') === false) {
exit;
}
if (is_plugin_active('ameliabooking/ameliabooking.php') === false) {
return;
}
use AmeliaBooking\Domain\ValueObjects\String\BookingStatus;
/**
* PHP version 5
*
* @category Handler
* @package SMSAlert
* @author SMS Alert <support@cozyvision.com>
* @license URI: http://www.gnu.org/licenses/gpl-2.0.html
* @link https://www.smsalert.co.in/
*
* SAameliabooking class
*/
class SAameliabooking extends FormInterface
{
/**
* Construct function.
*
* @return void
*/
public function handleForm()
{
add_action('AmeliaCustomerWPCreated', [$this, 'ameliaNewCustomer'], 10, 2);
add_action('AmeliaBookingAdded', [$this, 'sendsmsNewBooking'], 10, 3);
add_action('AmeliaBookingCanceled', [$this, 'sendsmsBookingCanceled'], 10, 3);
add_action('AmeliaBookingStatusUpdated', [$this, 'sendBookingUpdated'], 10, 3);
add_action('booking_reminder_sendsms_hook', [$this, 'sendReminderSms'], 10);
}//end handleForm()
/**
* Amelia New Customer.
*
* @param int $reservation reservation.
* @param int $booking booking.
*
* @return void
*/
public function ameliaNewCustomer($reservation, $booking)
{
$buyerNumber= $reservation['phone'];
$defaultSms = sprintf(__('Hello user, thank you for contacting with %1$s.', 'sms-alert'), '[store_name]');
do_action('sa_send_sms', $buyerNumber, $defaultSms);
}
/**
* Set booking reminder.
*
* @param int $reservation reservation.
*
* @return void
*/
public static function setBookingReminder($reservation)
{
if (empty($reservation) === true) {
return;
}
foreach ($reservation['bookings'] as $booking) {
$info = json_decode($booking['info']);
$bookingStatus = $booking['status'];
$buyer_mob = $info->phone;
}
$booking_id = $reservation['id'];
$booking_start = $reservation['bookingStart'];
$customerNotify = smsalert_get_option('customer_notify', 'smsalert_alb_general', 'on');
global $wpdb;
$tableName = $wpdb->prefix.'smsalert_booking_reminder';
$source = 'amelia-booking';
$booking_details = $wpdb->get_results("SELECT * FROM $tableName WHERE booking_id = $booking_id and source = '$source'");
if ($bookingStatus === 'approved' && $customerNotify === 'on') {
if ($booking_details) {
$wpdb->update(
$tableName,
[
'start_date' => $booking_start,
'phone' => $buyer_mob,
],
['booking_id' => $booking_id]
);
} else {
$wpdb->insert(
$tableName,
[
'booking_id' => $booking_id,
'phone' => $buyer_mob,
'source' => $source,
'start_date' => $booking_start,
]
);
}//end if
} else {
$wpdb->delete($tableName, ['booking_id' => $booking_id]);
}//end if
}//end setBookingReminder()
/**
* Send Reminder sms function.
*
* @return void
*/
function sendReminderSms()
{
if (smsalert_get_option('customer_notify', 'smsalert_alb_general') !== 'on') {
return;
}
global $wpdb;
$cronFrequency = BOOKING_REMINDER_CRON_INTERVAL;
// pick data from previous CART_CRON_INTERVAL min
$tableName = $wpdb->prefix.'smsalert_booking_reminder';
$source = 'amelia-booking';
$schedulerData = get_option('smsalert_alb_reminder_scheduler');
foreach ($schedulerData['cron'] as $sdata) {
$datetime = current_time('mysql');
$fromdate = date('Y-m-d H:i:s', strtotime('+'.($sdata['frequency'] * 60 - $cronFrequency).' minutes', strtotime($datetime)));
$todate = date('Y-m-d H:i:s', strtotime('+'.$cronFrequency.' minutes', strtotime($fromdate)));
$rowsToPhone = $wpdb->get_results(
'SELECT * FROM '.$tableName." WHERE start_date > '".$fromdate."' AND start_date <= '".$todate."' AND source = '$source' ",
ARRAY_A
);
if ($rowsToPhone) {
// If we have new rows in the database
$customerMessage = $sdata['message'];
$frequencyTime = $sdata['frequency'];
if ($customerMessage !== '' && $frequencyTime !== 0) {
$obj = [];
foreach ($rowsToPhone as $key => $data) {
$id = $data['booking_id'];
$obj[$key]['number'] = $data['phone'];
global $wpdb;
$table_name = $wpdb->prefix . 'amelia_customer_bookings';
$table_name1 = $wpdb->prefix . 'amelia_appointments';
$reservation = $wpdb->get_results("SELECT * FROM ".$table_name." INNER JOIN ".$table_name1." ON ".$table_name.".appointmentId = ".$table_name1.".id WHERE ".$table_name.".appointmentId= ".$id."");
$obj[$key]['sms_body'] = self::parseSmsReminder($reservation, $customerMessage);
}
$response = SmsAlertcURLOTP::sendSmsXml($obj);
$responseArr = json_decode($response, true);
if (!empty($responseArr['status']) && 'success' === $responseArr['status'] ) {
foreach ($rowsToPhone as $data) {
$lastMsgCount = $data['msg_sent'];
$totalMsgSent = ($lastMsgCount + 1);
$wpdb->update(
$tableName,
['msg_sent' => $totalMsgSent],
[
'booking_id' => $data['booking_id'],
'source' => $source,
]
);
}
}
}//end if
}//end if
}//end foreach
}//end sendReminderSms()
/**
* Add default settings to savesetting in setting-options.
*
* @param array $defaults defaults.
*
* @return array
*/
public static function add_default_setting($defaults=[])
{
$bookingStatuses = [
BookingStatus::CANCELED,
BookingStatus::APPROVED,
BookingStatus::PENDING,
BookingStatus::REJECTED,
];
foreach ($bookingStatuses as $ks => $vs) {
$defaults['smsalert_alb_general']['customer_alb_notify_'.$vs] = 'off';
$defaults['smsalert_alb_message']['customer_sms_alb_body_'.$vs] = '';
$defaults['smsalert_alb_general']['admin_alb_notify_'.$vs] = 'off';
$defaults['smsalert_alb_message']['admin_sms_alb_body_'.$vs] = '';
}
$defaults['smsalert_alb_reminder_scheduler']['cron'][0]['frequency'] = '1';
$defaults['smsalert_alb_reminder_scheduler']['cron'][0]['message'] = '';
return $defaults;
}//end add_default_setting()
/**
* Add tabs to smsalert settings at backend.
*
* @param array $tabs tabs.
*
* @return array
*/
public static function addTabs($tabs=[])
{
$customerParam = [
'checkTemplateFor' => 'alb_customer',
'templates' => self::getCustomerTemplates(),
];
$adminParam = [
'checkTemplateFor' => 'alb_admin',
'templates' => self::getAdminTemplates(),
];
$reminderParam = [
'checkTemplateFor' => 'wc_amelia_booking_reminder',
'templates' => self::getReminderTemplates(),
];
$tabs['amelia_booking']['nav'] = 'Amelia Booking';
$tabs['amelia_booking']['icon'] = 'dashicons-calendar-alt';
$tabs['amelia_booking']['inner_nav']['amelia_booking_cust']['title'] = 'Customer Notifications';
$tabs['amelia_booking']['inner_nav']['amelia_booking_cust']['tab_section'] = 'ameliabookingcusttemplates';
$tabs['amelia_booking']['inner_nav']['amelia_booking_cust']['first_active'] = true;
$tabs['amelia_booking']['inner_nav']['amelia_booking_cust']['tabContent'] = $customerParam;
$tabs['amelia_booking']['inner_nav']['amelia_booking_cust']['filePath'] = 'views/message-template.php';
$tabs['amelia_booking']['inner_nav']['amelia_booking_admin']['title'] = 'Admin Notifications';
$tabs['amelia_booking']['inner_nav']['amelia_booking_admin']['tab_section'] = 'ameliabookingadmintemplates';
$tabs['amelia_booking']['inner_nav']['amelia_booking_admin']['tabContent'] = $adminParam;
$tabs['amelia_booking']['inner_nav']['amelia_booking_admin']['filePath'] = 'views/message-template.php';
$tabs['amelia_booking']['inner_nav']['amelia_booking_reminder']['title'] = 'Booking Reminder';
$tabs['amelia_booking']['inner_nav']['amelia_booking_reminder']['tab_section'] = 'bookingremindertemplates';
$tabs['amelia_booking']['inner_nav']['amelia_booking_reminder']['tabContent'] = $reminderParam;
$tabs['amelia_booking']['inner_nav']['amelia_booking_reminder']['filePath'] = 'views/booking-reminder-template.php';
$tabs['amelia_booking']['help_links'] = array(
'kb_link' => array(
'href' => 'https://kb.smsalert.co.in/knowledgebase/amelia-booking-sms-integration/',
'target' => '_blank',
'alt' => 'Read how to integrate with Amelia Booking',
'class' => 'btn-outline',
'label' => 'Documentation',
'icon' => '<span class="dashicons dashicons-format-aside"></span>',
),
);
return $tabs;
}//end addTabs()
/**
* Get wc renewal templates function.
*
* @return array
* */
public static function getReminderTemplates()
{
$currentVal = smsalert_get_option('customer_notify', 'smsalert_alb_general', 'on');
$checkboxMameId = 'smsalert_alb_general[customer_notify]';
$schedulerData = get_option('smsalert_alb_reminder_scheduler');
$templates = [];
$count = 0;
if (empty($schedulerData) === true) {
$schedulerData = array();
$schedulerData['cron'][] = [
'frequency' => '1',
'message' => sprintf(__('Hello %1$s, your booking %2$s with %3$s is fixed on %4$s.%5$sPowered by%6$swww.smsalert.co.in', 'sms-alert'), '[firstName]', '#[appointmentId]', '[store_name]', '[bookingStart]', PHP_EOL, PHP_EOL),
];
}
foreach ($schedulerData['cron'] as $key => $data) {
$textAreaNameId = 'smsalert_alb_reminder_scheduler[cron]['.$count.'][message]';
$selectNameId = 'smsalert_alb_reminder_scheduler[cron]['.$count.'][frequency]';
$textBody = $data['message'];
$templates[$key]['notify_id'] = 'amelia-booking';
$templates[$key]['frequency'] = $data['frequency'];
$templates[$key]['enabled'] = $currentVal;
$templates[$key]['title'] = 'Send booking reminder to customer';
$templates[$key]['checkboxNameId'] = $checkboxMameId;
$templates[$key]['text-body'] = $textBody;
$templates[$key]['textareaNameId'] = $textAreaNameId;
$templates[$key]['selectNameId'] = $selectNameId;
$templates[$key]['token'] = self::getBookingvariables();
$count++;
}
return $templates;
}//end getReminderTemplates()
/**
* Get customer templates.
*
* @return array
*/
public static function getCustomerTemplates()
{
$bookingStatuses = [
'['.BookingStatus::CANCELED.']' => ucwords(BookingStatus::CANCELED),
'['.BookingStatus::APPROVED.']' => ucwords(BookingStatus::APPROVED),
'['.BookingStatus::PENDING.']' => ucwords(BookingStatus::PENDING),
'['.BookingStatus::REJECTED.']' => ucwords(BookingStatus::REJECTED)
];
$templates = [];
foreach ($bookingStatuses as $ks => $vs) {
$currentVal = smsalert_get_option('customer_alb_notify_'.strtolower($vs), 'smsalert_alb_general', 'on');
$checkboxMameId = 'smsalert_alb_general[customer_alb_notify_'.strtolower($vs).']';
$textareaNameId = 'smsalert_alb_message[customer_sms_alb_body_'.strtolower($vs).']';
$defaultTemplate = sprintf(__('Hello %1$s, status of your booking #%2$s with %3$s has been changed to %4$s.%5$sPowered by%6$swww.smsalert.co.in', 'sms-alert'), '[firstName]', '[appointmentId]', '[store_name]', strtolower($vs), PHP_EOL, PHP_EOL);
$textBody = smsalert_get_option('customer_sms_alb_body_'.strtolower($vs), 'smsalert_alb_message', $defaultTemplate);
$templates[$ks]['title'] = 'When customer booking is '.ucwords($vs);
$templates[$ks]['enabled'] = $currentVal;
$templates[$ks]['status'] = $vs;
$templates[$ks]['text-body'] = $textBody;
$templates[$ks]['checkboxNameId'] = $checkboxMameId;
$templates[$ks]['textareaNameId'] = $textareaNameId;
$templates[$ks]['token'] = self::getBookingvariables();
}//end foreach
return $templates;
}//end getCustomerTemplates()
/**
* Get admin templates.
*
* @return array
*/
public static function getAdminTemplates()
{
$bookingStatuses = [
'['.BookingStatus::CANCELED.']' => ucwords(BookingStatus::CANCELED),
'['.BookingStatus::APPROVED.']' => ucwords(BookingStatus::APPROVED),
'['.BookingStatus::PENDING.']' => ucwords(BookingStatus::PENDING),
'['.BookingStatus::REJECTED.']' => ucwords(BookingStatus::REJECTED)
];
$templates = [];
foreach ($bookingStatuses as $ks => $vs) {
$currentVal = smsalert_get_option('admin_alb_notify_'.strtolower($vs), 'smsalert_alb_general', 'on');
$checkboxMameId = 'smsalert_alb_general[admin_alb_notify_'.strtolower($vs).']';
$textareaNameId = 'smsalert_alb_message[admin_sms_alb_body_'.strtolower($vs).']';
$defaultTemplate = sprintf(__('Hello admin, status of your booking with %1$s has been changed to %2$s. %3$sPowered by%4$swww.smsalert.co.in', 'sms-alert'), '[store_name]', $vs, PHP_EOL, PHP_EOL);
$textBody = smsalert_get_option('admin_sms_alb_body_'.strtolower($vs), 'smsalert_alb_message', $defaultTemplate);
$templates[$ks]['title'] = 'When admin change status to '.ucwords($vs);
$templates[$ks]['enabled'] = $currentVal;
$templates[$ks]['status'] = $vs;
$templates[$ks]['text-body'] = $textBody;
$templates[$ks]['checkboxNameId'] = $checkboxMameId;
$templates[$ks]['textareaNameId'] = $textareaNameId;
$templates[$ks]['token'] = self::getBookingvariables();
}//end foreach
return $templates;
}//end getAdminTemplates()
/**
* Send sms new booking.
*
* @param int $reservation reservation
* @param int $bookings bookings
* @param int $container container
*
* @return void
*/
public function sendsmsNewBooking($reservation, $bookings, $container)
{
foreach ($reservation['bookings'] as $booking) {
$bookingStatus = $booking['status'];
}
$this->sendsms($reservation, $bookings, $bookingStatus);
}//end sendsmsNewBooking()
/**
* Send sms Bookin Canceled.
*
* @param int $reservation reservation
* @param int $bookings bookings
* @param int $container container
*
* @return void
*/
public function sendsmsBookingCanceled($reservation, $bookings, $container)
{
foreach ($reservation['bookings'] as $booking) {
$bookingStatus = $booking['status'];
}
$this->sendsms($reservation, $bookings, $bookingStatus);
}
/**
* Send sms Bookin Update.
*
* @param int $reservation reservation
* @param int $bookings bookings
* @param int $container container
*
* @return void
*/
public function sendBookingUpdated($reservation, $bookings, $container)
{
foreach ($reservation['bookings'] as $booking) {
$bookingStatus = $booking['status'];
}
$this->sendsms($reservation, $bookings, $bookingStatus);
}//end sendBookingUpdated()
/**
* Send sms booking.
*
* @param int $reservation reservation
* @param int $bookings bookings
* @param int $bookingStatus bookingStatus
*
* @return void
*/
public function sendsms($reservation, $bookings, $bookingStatus)
{
foreach ($reservation['bookings'] as $booking) {
$info = json_decode($booking['info']);
$buyerNumber = $info->phone;
}
$this->setBookingReminder($reservation);
$customerMessage = smsalert_get_option('customer_sms_alb_body_' . $bookingStatus, 'smsalert_alb_message', '');
$customerNotify = smsalert_get_option('customer_alb_notify_' . $bookingStatus, 'smsalert_alb_general', 'on');
if ($customerNotify === 'on' && $customerMessage !== '') {
$buyerMessage = $this->parseSmsBody($reservation, $customerMessage);
do_action('sa_send_sms', $buyerNumber, $buyerMessage);
}
// send msg to admin.
$adminPhoneNumber = smsalert_get_option('sms_admin_phone', 'smsalert_message', '');
$nos = explode(',', $adminPhoneNumber);
$adminPhoneNumber = array_diff($nos, ['postauthor', 'post_author']);
$adminPhoneNumber = implode(',', $adminPhoneNumber);
if (empty($adminPhoneNumber) === false) {
$adminNotify = smsalert_get_option('admin_alb_notify_' . $bookingStatus, 'smsalert_alb_general', 'on');
$adminMessage = smsalert_get_option('admin_sms_alb_body_' . $bookingStatus, 'smsalert_alb_message', '');
if ($adminNotify === 'on' && $adminMessage !== '') {
$adminMessage = $this->parseSmsBody($reservation, $adminMessage);
do_action('sa_send_sms', $adminPhoneNumber, $adminMessage);
}
}
}//end sendsms()
/**
* Parse Reminder sms body.
*
* @param array $reservation reservation.
* @param string $content content.
*
* @return string
*/
public function parseSmsReminder($reservation, $content=null)
{
foreach ($reservation as $booking) {
$info = json_decode($booking->info);
$firstName = $info->firstName;
$lastName = $info->lastName;
$buyerNumber = $info->phone;
$customerId = $booking->customerId;
$status = $booking->status;
$price = $booking->price;
$persons = $booking->persons;
$duration = $booking->duration;
$appointmentId = $booking->appointmentId;
$bookingStart = $booking->bookingStart;
$bookingEnd = $booking->bookingEnd;
$serviceId = $reservation->serviceId;
}
$table_name = $wpdb->prefix . 'amelia_services';
$service = $wpdb->get_results("SELECT `name` FROM " .$table_name. " WHERE id=".$serviceId);
foreach ($service as $servicenames) {
$servicename=$servicenames->name;
}
$find = [
'[firstName]',
'[lastName]',
'[phone]',
'[customerId]',
'[status]',
'[price]',
'[persons]',
'[duration]',
'[appointmentId]',
'[bookingStart]',
'[bookingEnd]',
'[serviceId]',
'[service_name]',
];
$replace = [
$firstName,
$lastName,
$buyerNumber,
$customerId,
$status,
$price,
$persons,
$duration,
$appointmentId,
$bookingStart,
$bookingEnd,
$serviceId,
$servicename
];
$content = str_replace($find, $replace, $content);
return $content;
}//end parseReminderSmsBody()
/**
* Parse sms body.
*
* @param array $reservation reservation.
* @param string $content content.
*
* @return string
*/
public function parseSmsBody($reservation, $content=null)
{
global $wpdb;
foreach ($reservation['bookings'] as $booking) {
$info = json_decode($booking['info']);
$firstName = $info->firstName;
$lastName = $info->lastName;
$buyerNumber = $info->phone;
$customerId = $booking['customerId'];
$status = $booking['status'];
$price = $booking['price'];
$persons = $booking['persons'];
$duration = $booking['duration'];
}
$appointmentId = $reservation['id'];
$bookingStart = $reservation['bookingStart'];
$bookingEnd = $reservation['bookingEnd'];
$serviceId = $reservation['serviceId'];
$table_name = $wpdb->prefix . 'amelia_services';
$service = $wpdb->get_results("SELECT `name` FROM " .$table_name. " WHERE id=".$serviceId);
foreach ($service as $servicenames) {
$servicename=$servicenames->name;
}
$find = [
'[firstName]',
'[lastName]',
'[phone]',
'[customerId]',
'[status]',
'[price]',
'[persons]',
'[duration]',
'[appointmentId]',
'[bookingStart]',
'[bookingEnd]',
'[serviceId]',
'[service_name]',
];
$replace = [
$firstName,
$lastName,
$buyerNumber,
$customerId,
$status,
$price,
$persons,
$duration,
$appointmentId,
$bookingStart,
$bookingEnd,
$serviceId,
$servicename
];
$content = str_replace($find, $replace, $content);
return $content;
}//end parseSmsBody()
/**
* Get booking variables.
*
* @return array
*/
public static function getBookingvariables()
{
$variable['[firstName]'] = 'First Name';
$variable['[lastName]'] = 'Last Name';
$variable['[phone]'] = 'Phone';
$variable['[customerId]'] = 'Customer Id';
$variable['[status]'] = 'Status';
$variable['[price]'] = 'Price';
$variable['[persons]'] = 'Persons';
$variable['[duration]'] = 'Duration';
$variable['[appointmentId]'] = 'Appointment Id';
$variable['[bookingStart]'] = 'Booking Start';
$variable['[bookingEnd]'] = 'Booking End';
$variable['[serviceId]'] = 'Service Id';
$variable['[service_name]'] = 'Service Name';
return $variable;
}//end getBookingvariables()
/**
* Handle form for WordPress backend
*
* @return void
*/
public function handleFormOptions()
{
if (is_plugin_active('ameliabooking/ameliabooking.php') === true) {
add_filter('sAlertDefaultSettings', __CLASS__.'::add_default_setting', 1);
add_action('sa_addTabs', [$this, 'addTabs'], 10);
}
}//end handleFormOptions()
/**
* Check your otp setting is enabled or not.
*
* @return bool
*/
public function isFormEnabled()
{
$userAuthorize = new smsalert_Setting_Options();
$islogged = $userAuthorize->is_user_authorised();
if ((is_plugin_active('ameliabooking/ameliabooking.php') === true) && ($islogged === true)) {
return true;
} else {
return false;
}
}//end isFormEnabled()
/**
* Handle after failed verification
*
* @param object $userLogin users object.
* @param string $userEmail user email.
* @param string $phoneNumber phone number.
*
* @return void
*/
public function handle_failed_verification($userLogin, $userEmail, $phoneNumber)
{
}//end handle_failed_verification()
/**
* Handle after post verification
*
* @param string $redirectTo redirect url.
* @param object $userLogin user object.
* @param string $userEmail user email.
* @param string $password user password.
* @param string $phoneNumber phone number.
* @param string $extraData extra hidden fields.
*
* @return void
*/
public function handle_post_verification($redirectTo, $userLogin, $userEmail, $password, $phoneNumber, $extraData)
{
}//end handle_post_verification()
/**
* Clear otp session variable
*
* @return void
*/
public function unsetOTPSessionVariables()
{
}//end unsetOTPSessionVariables()
/**
* Check current form submission is ajax or not
*
* @param bool $isAjax bool value for form type.
*
* @return bool
*/
public function is_ajax_form_in_play($isAjax)
{
return $isAjax;
}//end is_ajax_form_in_play()
}//end class
new SAameliabooking();