dial_code.$this->phone; $to_phone = alexr_clean_phone_number($to_phone); if (!alexr_is_valid_phone($to_phone)) return false; $smsTemplate = SmsTemplate::where('restaurant_id', $this->restaurant_id)->first(); // If no SMS template exists, create a default one if (!$smsTemplate) { $smsTemplate = new SmsTemplate(); $smsTemplate->restaurant_id = $this->restaurant_id; // Load default values $defaultValues = $smsTemplate->defaultValue(); foreach ($defaultValues as $key => $value) { $smsTemplate->{$key} = $value; } } // Check if enabled $enable = $smsTemplate->{$template.'_enable'}; if ($enable !== 1) return false; $content_b64 = $smsTemplate->{$template}['content_'.$lang]; $content = base64_decode($content_b64); $content = $this->parseSmsTags($content); return $this->sendSmsAndStore($to_phone, $content); } public function parseSmsTags($message) { $language = $this->language; if (!$language) { $language = $this->restaurant->language; } // Date formatted $date_format = $this->getDateFormat(); /*$date_formatted = Carbon::createFromFormat('Y-m-d', $this->date) ->locale($language) ->translatedFormat($date_format);*/ $date_formatted = evavel_date_createFromFormatTranslate('Y-m-d', $this->date, $language, $date_format); $day_formatted = evavel_day_translate($this->date, $language); // Current date formatted //$current_date_formatted = evavel_now_timezone($this->restaurant->timezone) // ->locale($language) // ->translatedFormat($date_format); $current_date_formatted = evavel_date_translate( evavel_now_timezone_formatted($this->restaurant->timezone, $date_format) , $language ); $mybooking_link = evavel_view_booking_url($this->uuid); $site_link = evavel_site_url(); $restaurant_link = $this->restaurant->link_web; $restaurant_facebook = $this->restaurant->link_facebook; $restaurant_instagram = $this->restaurant->link_instagram; $tags = [ '{restaurant}' => $this->restaurant->name, '{restaurant_phone}' => $this->restaurant->dial_code.' '.$this->restaurant->phone, '{name}' => $this->name, '{email}' => $this->email, '{phone}' => '('.$this->dial_code . ')' . $this->phone, '{party}' => $this->party, '{time}' => $this->getTimeFormatted(), '{end_time}' => $this->getEndTimeFormatted(), '{duration}' => $this->toDuration($this->duration), '{date}' => $date_formatted, '{day}' => $day_formatted, '{current_date}'=> $current_date_formatted, '{reservation_number}' => $this->uuid, '{mybooking}' => $mybooking_link, '{site_link}' => $site_link, '{restaurant_link}' => $restaurant_link, '{restaurant_facebook}' => $restaurant_facebook, '{restaurant_instagram}' => $restaurant_instagram, ]; foreach ($tags as $tag => $replace) { if ($replace == null) $replace = ''; $message = str_replace($tag, $replace, $message); } return $message; } /*public function sendSmsAndStore_OLD($to_phone, $content, $type = 'sms', $type_id = null) { if (!$this->smsManager){ $this->smsManager = new SmsManager($this->restaurant_id); } try { $result = $this->smsManager->send_message($to_phone, 'sms', $content); } catch (\Exception $e) { $result = $e->getMessage(); } $this->storeSmsSent($to_phone, 'SMS', $content, $result, $type, $type_id); return $result; }*/ public function sendSmsAndStore($to_phone, $content, $type = 'sms', $type_id = null) { if (!$this->smsManager){ $this->smsManager = new SmsManager($this->restaurant_id); } // SI no esta configurado no envia nada if (!$this->smsManager->is_configured()) { return false; } try { // 1. CREAR el registro ANTES de enviar (con un estado temporal) $notification = new BookingNotification(); $notification->restaurant_id = $this->restaurant_id; $notification->booking_id = $this->id; $notification->type = $type; $notification->type_id = $type_id; $notification->payload = [ 'status' => 'sending', // Estado temporal 'to' => $to_phone, 'content' => $content ]; $notification->save(); // 2. Intentar enviar el SMS $result = $this->smsManager->send_message($to_phone, 'sms', $content); // 3. Actualizar el registro con el resultado $notification->payload = array_merge($notification->payload, [ 'status' => 'sent', 'result' => $result, 'sent_at' => current_time('mysql') ]); $notification->save(); return $result; } catch (\Exception $e) { // 4. Si falla, actualizar con el error $notification->payload = array_merge($notification->payload, [ 'status' => 'failed', 'error' => $e->getMessage(), 'failed_at' => current_time('mysql') ]); $notification->save(); return false; } } // General funcion used after payment succeed //----------------------------------------------------------------------- public function sendSmsNotification() { $booking = $this; if ($booking->agree_receive_sms != 1) return; $lang = $booking->language; if (!$lang) { $lang = $booking->restaurant->language; } if ($booking->status == BookingStatus::PENDING) { //ray('Send SMS PENDING'); $booking->sendSmsPending($lang); } else if ($booking->status == BookingStatus::BOOKED) { //ray("Send SMS BOOKED"); $booking->sendSmsBooked($lang); } else if ($booking->status == BookingStatus::FINISHED) { $booking->sendSmsFinished($lang); } else if ($booking->status == BookingStatus::DENIED) { $booking->sendSmsDenied($lang); } else if ($booking->status == BookingStatus::CANCELLED) { $booking->sendSmsCancelled($lang); } else if ($booking->status == BookingStatus::NO_SHOW) { $booking->sendSmsNoShow($lang); } } // Customer SMS public function sendSmsPending($lang = 'en') { $this->sendSmsTemplate('booking_pending', $lang); } public function sendSmsPendingPayment($lang = 'en') { $this->sendSmsTemplate('booking_pending_payment', $lang, 'sms_pending_payment'); } public function sendSmsBooked($lang = 'en') { return $this->sendSmsTemplate('booking_booked', $lang); } public function sendSmsDenied($lang = 'en') { $this->sendSmsTemplate('booking_denied', $lang); } public function sendSmsCancelled($lang = 'en') { $this->sendSmsTemplate('booking_cancelled', $lang); } public function sendSmsNoShow($lang = 'en') { $this->sendSmsTemplate('booking_no_show', $lang); } public function sendSmsFinished($lang = 'en') { $this->sendSmsTemplate('booking_finished', $lang); } public function sendSmsCustom($content) { $to_phone = $this->dial_code.$this->phone; $to_phone = alexr_clean_phone_number($to_phone); if (!alexr_is_valid_phone($to_phone)) return false; return $this->sendSmsAndStore($to_phone, $content); } // Admin SMS public function sendSmsTemplateToAdmin($template = 'booking_pending_admin', $lang = 'en', $type = 'sms', $type_id = null) { // Get admin phone from restaurant settings $admin_phone = $this->restaurant->dial_code . $this->restaurant->phone; // o el campo donde tengas el teléfono del admin if (!$admin_phone) return false; $admin_phone = alexr_clean_phone_number($admin_phone); if (!alexr_is_valid_phone($admin_phone)) return false; $smsTemplate = SmsTemplate::where('restaurant_id', $this->restaurant_id)->first(); if (!$smsTemplate) { $smsTemplate = new SmsTemplate(); $smsTemplate->restaurant_id = $this->restaurant_id; $defaultValues = $smsTemplate->defaultValue(); foreach ($defaultValues as $key => $value) { $smsTemplate->{$key} = $value; } } // Check if enabled $enable = $smsTemplate->{$template.'_enable'}; if ($enable !== 1) return false; $content_b64 = $smsTemplate->{$template}['content_'.$lang]; $content = base64_decode($content_b64); $content = $this->parseSmsTags($content); return $this->sendSmsAndStore($admin_phone, $content); } public function sendSmsPendingAdmin($lang = null) { // Language del restaurante if ($lang == null) { $lang = $this->restaurant->language; } return $this->sendSmsTemplateToAdmin('booking_pending_admin', $lang); } public function sendSmsBookedAdmin($lang = null) { // Language del restaurante if ($lang == null) { $lang = $this->restaurant->language; } return $this->sendSmsTemplateToAdmin('booking_booked_admin', $lang); } }