領収証発行サービス
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.2KB

  1. <?php
  2. namespace App\Jobs\ReceiptIssuingOrder;
  3. use App\Codes\QueueName;
  4. use App\Events\ReceiptIssuingOrder\EmailSendEvent;
  5. use App\Jobs\BaseJob;
  6. use App\Models\Email;
  7. use App\Models\ReceiptIssuingOrder;
  8. use App\Util\DateUtil;
  9. use Illuminate\Support\Carbon;
  10. use Illuminate\Support\Facades\Log;
  11. class PollEmailSendStatus extends BaseJob
  12. {
  13. private int $currentRetryCount;
  14. /**
  15. * Create a new job instance.
  16. *
  17. * @return void
  18. */
  19. public function __construct(
  20. private ReceiptIssuingOrder $order,
  21. ) {
  22. $this->onQueue(QueueName::JOB->value);
  23. }
  24. /**
  25. * Execute the job.
  26. *
  27. * @return void
  28. */
  29. public function handle()
  30. {
  31. info("領収証Emailポーリング:" . $this->order->receipt_pdf_email_id);
  32. $email = Email::findOrFail($this->order->receipt_pdf_email_id);
  33. $sendDatetime = $email->send_datetime;
  34. if ($email->send_datetime !== null) {
  35. // ポーリング終了
  36. $this->donePolling($sendDatetime);
  37. } else if ($email->is_failed) {
  38. // ポーリング終了
  39. $this->donePolling($sendDatetime);
  40. } else {
  41. $limit = $this->order->status_receipt_email_send_order_datetime->clone()->addDays(3);
  42. if (DateUtil::now()->gt($limit)) {
  43. // ポーリング終了(未完了)
  44. $this->donePolling($sendDatetime);
  45. Log::warning("領収証Email送信未完了検知 OrderID:%s", $this->order->id);
  46. } else {
  47. // ポーリング継続
  48. $this->continuePolling();
  49. }
  50. }
  51. }
  52. private function donePolling(?Carbon $sendDatetime)
  53. {
  54. $this->order->status_receipt_email_send_datetime = $sendDatetime;
  55. $this->order->save();
  56. EmailSendEvent::dispatch($this->order);
  57. info("領収証Emailポーリング完了:" . $this->order->receipt_pdf_email_id);
  58. }
  59. private function continuePolling()
  60. {
  61. static::dispatch($this->order)
  62. ->delay(DateUtil::now()->addMinutes(5));
  63. info("領収証Emailポーリング継続:" . $this->order->receipt_pdf_email_id);
  64. }
  65. }