領収証発行サービス
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.

79 lines
2.3KB

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