Files
Jobhero_back/app/Services/PushNotificationService.php
Carlos b34622b289 Fix búsqueda en tiempo real, paginación, OneSignal, bancos/categorías y vistas auth
- ajaxcrud.js: fix race condition en búsqueda, abort de requests en vuelo
- Layout: mover @yield('js') después de app.js para corregir orden de carga
- Paginación: useBootstrapFour() + eliminar wrappers <ul> duplicados en 17 vistas
- OneSignal: migrar de UserTag iChamba_ID a ExternalId en controladores
- API: agregar endpoint GET /api/banks y campos rfc/bank/bank_account/fee en hero()
- Seeders: BanksSeeder (239 bancos) y CategoriesSeeder (100 categorías)
- Auth views: corregir padding/scroll en register, login, password reset

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 21:21:44 -06:00

170 lines
4.7 KiB
PHP

<?php
namespace App\Services;
use OneSignal;
class PushNotificationService
{
/**
* Send notification to a specific user by their ID
*
* @param int $userId
* @param string $message
* @param string $heading
* @param array $data
* @return mixed
*/
public function sendToUser(int $userId, string $message, string $heading = 'JobHero', array $data = [])
{
return OneSignal::sendNotificationToExternalUser(
$message,
(string) $userId,
null,
$data ?: null,
null,
null,
$heading
);
}
/**
* Send notification to multiple users
*
* @param array $userIds
* @param string $message
* @param string $heading
* @param array $data
* @return array
*/
public function sendToUsers(array $userIds, string $message, string $heading = 'JobHero', array $data = [])
{
$results = [];
foreach ($userIds as $userId) {
$results[$userId] = $this->sendToUser($userId, $message, $heading, $data);
}
return $results;
}
/**
* Send scheduled notification to a user
*
* @param int $userId
* @param string $message
* @param string $sendAt UTC datetime string
* @param string $heading
* @param array $data
* @return mixed
*/
public function sendScheduledToUser(int $userId, string $message, string $sendAt, string $heading = 'JobHero', array $data = [])
{
return OneSignal::sendNotificationToExternalUser(
$message,
(string) $userId,
null,
$data ?: null,
null,
$sendAt,
$heading
);
}
/**
* Send notification to all users with a specific role
*
* @param int $roleId
* @param string $message
* @param string $heading
* @param array $data
* @return mixed
*/
public function sendToRole(int $roleId, string $message, string $heading = 'JobHero', array $data = [])
{
return OneSignal::sendNotificationUsingTags(
$message,
[
['field' => 'tag', 'key' => 'iChamba_Role', 'relation' => '=', 'value' => (string) $roleId]
],
null,
null,
null,
null,
$heading,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
$data
);
}
/**
* Notification types for contracts
*/
public function notifyContractHired(int $supplierId, string $address)
{
return $this->sendToUser(
$supplierId,
"Has sido contratado para un servicio. Dirígete a la sección de postulaciones contratadas para más detalles.",
"¡Nuevo Contrato!"
);
}
public function notifyContractStarted(int $userId, string $address, string $date)
{
return $this->sendToUser(
$userId,
"El servicio en {$address} el día {$date} ha sido iniciado. Dirígete a la sección de servicios contratados para más detalles.",
"Servicio Iniciado"
);
}
public function notifyContractCancelled(int $supplierId, string $address, string $date)
{
return $this->sendToUser(
$supplierId,
"El servicio en {$address} el día {$date} ha sido cancelado. Dirígete a la sección de servicios contratados para más detalles.",
"Servicio Cancelado"
);
}
public function notifySupplierArrived(int $clientId, string $address)
{
return $this->sendToUser(
$clientId,
"El proveedor para el servicio en {$address} ha llegado. Dirígete a la sección de contratos confirmados para más detalles.",
"Proveedor ha llegado"
);
}
public function notifyAppointmentReminder(int $userId, string $address, int $minutesBefore = 30)
{
return $this->sendToUser(
$userId,
"Tienes un servicio agendado hoy en {$address} en {$minutesBefore} minutos. Dirígete a la sección de contratos confirmados para más detalles.",
"Recordatorio de Cita"
);
}
public function notifyNewPostulation(int $supplierId)
{
return $this->sendToUser(
$supplierId,
"Hay una nueva postulación disponible en tu área. Dirígete a la sección de postulaciones para ver más detalles.",
"Nueva Postulación"
);
}
}