SmsTemplateController.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. // Controller: SmsTemplateController.php
  3. namespace App\Http\Controllers;
  4. use App\Models\SmsTemplate;
  5. use App\Models\SmsScheduled;
  6. use App\Models\Category;
  7. use App\Models\User;
  8. use Illuminate\Http\Request;
  9. use Carbon\Carbon;
  10. use Illuminate\Support\Facades\Auth;
  11. use Illuminate\Support\Facades\Log;
  12. class SmsTemplateController extends Controller
  13. {
  14. public function index()
  15. {
  16. return view('sms.index');
  17. }
  18. public function getTemplatesJson(Request $request)
  19. {
  20. $templates = SmsTemplate::with('creator:id,name')->latest()->get();
  21. $data = $templates->map(function($template) {
  22. return [
  23. 'id' => $template->id,
  24. 'name' => $template->name,
  25. 'content' => $template->content,
  26. 'character_count' => strlen($template->content),
  27. 'created_at' => $template->created_at->format('d/m/Y H:i'),
  28. 'creator' => $template->creator->name ?? 'N/A'
  29. ];
  30. });
  31. return response()->json(['data' => $data]);
  32. }
  33. public function store(Request $request)
  34. {
  35. $request->validate([
  36. 'subject' => 'required|string|max:255',
  37. 'message' => 'required|string|max:160',
  38. 'recipients' => 'required|array|min:1',
  39. 'send_now' => 'required|boolean',
  40. 'scheduled_at' => 'required_if:send_now,false|date|after:now',
  41. ]);
  42. $template = SmsTemplate::create([
  43. 'name' => $request->subject,
  44. 'content' => $request->message,
  45. 'created_by' => Auth::id(),
  46. ]);
  47. $recipients = User::whereHas('categories', function ($query) use ($request) {
  48. $query->whereIn('categories.id', $request->recipients);
  49. })->get();
  50. if ($request->send_now) {
  51. $this->sendSmsNow($template, $recipients);
  52. $message = 'Template creato e SMS inviato a ' . $recipients->count() . ' destinatari!';
  53. } else {
  54. $this->scheduleSms($template, $recipients, $request->scheduled_at);
  55. $scheduledDate = Carbon::parse($request->scheduled_at)->format('d/m/Y H:i');
  56. $message = 'Template creato e SMS programmato per ' . $scheduledDate;
  57. }
  58. return response()->json([
  59. 'success' => true,
  60. 'message' => $message,
  61. 'template' => [
  62. 'id' => $template->id,
  63. 'name' => $template->name,
  64. 'content' => $template->content,
  65. 'character_count' => strlen($template->content),
  66. 'created_at' => $template->created_at->format('d/m/Y H:i'),
  67. 'creator' => Auth::user()->name
  68. ]
  69. ]);
  70. }
  71. public function destroy($id)
  72. {
  73. $template = SmsTemplate::findOrFail($id);
  74. $template->delete();
  75. return response()->json([
  76. 'success' => true,
  77. 'message' => 'Template eliminato con successo!'
  78. ]);
  79. }
  80. public function getCategories()
  81. {
  82. $categories = Category::with('users')->get()->map(function($category) {
  83. return [
  84. 'id' => $category->id,
  85. 'name' => $category->name,
  86. 'users_count' => $category->users->count()
  87. ];
  88. });
  89. return response()->json($categories);
  90. }
  91. public function getTemplate($id)
  92. {
  93. $template = SmsTemplate::findOrFail($id);
  94. return response()->json([
  95. 'id' => $template->id,
  96. 'name' => $template->name,
  97. 'content' => $template->content
  98. ]);
  99. }
  100. private function sendSmsNow($template, $recipients)
  101. {
  102. foreach ($recipients as $recipient) {
  103. if ($recipient->phone) {
  104. Log::info("SMS sent to {$recipient->name} ({$recipient->phone}): {$template->content}");
  105. }
  106. }
  107. }
  108. private function scheduleSms($template, $recipients, $scheduledAt)
  109. {
  110. $scheduled = SmsScheduled::create([
  111. 'template_id' => $template->id,
  112. 'content' => $template->content,
  113. 'scheduled_at' => Carbon::parse($scheduledAt),
  114. 'status' => 'scheduled',
  115. 'created_by' => Auth::id(),
  116. ]);
  117. $scheduled->recipients()->attach($recipients->pluck('id'));
  118. }
  119. }