Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

141 řádky
4.1KB

  1. <?php
  2. namespace App\Logic;
  3. use App\Exceptions\AppCommonException;
  4. use App\Kintone\Models\BankAccountUpdateApplication;
  5. use App\Kintone\Models\Customer;
  6. use App\Kintone\Models\GeneralApplication;
  7. use App\Kintone\Models\Parking;
  8. use App\Kintone\Models\ParkingCertificateApplication;
  9. use App\Kintone\Models\SeasonTicketContract;
  10. use App\Kintone\Models\SeasonTicketReOrderApplication;
  11. use App\Kintone\Models\StickerReOrderApplication;
  12. use App\Kintone\Models\TerminateApplication;
  13. use App\Kintone\Models\UserInfoUpdateApplication;
  14. use App\Kintone\Models\VehicleInfoUpdateApplication;
  15. use App\Util\DateUtil;
  16. use LogicException;
  17. /**
  18. * @template T of GeneralApplication
  19. */
  20. class GeneralApplicationManager
  21. {
  22. private ?Customer $customer = null;
  23. private ?SeasonTicketContract $seasonTicketContract = null;
  24. private ?Parking $parking = null;
  25. /**
  26. * @param T $model
  27. */
  28. public function __construct(private GeneralApplication $model)
  29. {
  30. if ($model instanceof TerminateApplication) {
  31. $this->setType("解約申請");
  32. return;
  33. }
  34. if ($model instanceof ParkingCertificateApplication) {
  35. $this->setType("車庫証明発行申請");
  36. return;
  37. }
  38. if ($model instanceof StickerReOrderApplication) {
  39. $this->setType("シール再発行申請");
  40. return;
  41. }
  42. if ($model instanceof SeasonTicketReOrderApplication) {
  43. $this->setType("定期券再発行申請");
  44. return;
  45. }
  46. if ($model instanceof VehicleInfoUpdateApplication) {
  47. $this->setType("車両番号・防犯登録番号変更");
  48. return;
  49. }
  50. if ($model instanceof UserInfoUpdateApplication) {
  51. $this->setType("利用者情報変更");
  52. return;
  53. }
  54. if ($model instanceof UserInfoUpdateApplication) {
  55. $this->setType("振替頻度変更");
  56. return;
  57. }
  58. if ($model instanceof BankAccountUpdateApplication) {
  59. $this->setType("口座変更申請");
  60. return;
  61. }
  62. }
  63. public function setCustomer(Customer $customer): static
  64. {
  65. $this->customer = $customer;
  66. return $this;
  67. }
  68. public function setSeasonTicketContract(SeasonTicketContract $seasonTicketContract): static
  69. {
  70. $this->seasonTicketContract = $seasonTicketContract;
  71. return $this;
  72. }
  73. public function setParking(Parking $parking): static
  74. {
  75. $this->parking = $parking;
  76. return $this;
  77. }
  78. /**
  79. * @return T
  80. */
  81. public function makeApplication()
  82. {
  83. $this->model->applicationDatetime = DateUtil::now();
  84. $this->model->status = "新規登録";
  85. $this->model->applicationNo = $this->getApplicationNo();
  86. if ($this->customer === null) {
  87. throw new LogicException("顧客未設定のため失敗");
  88. }
  89. $this->model->customerCode = $this->customer->customerCode;
  90. if ($this->seasonTicketContract !== null) {
  91. $this->model->seasonTicketContractRecordNo = $this->seasonTicketContract->getRecordId();
  92. }
  93. if ($this->parking !== null) {
  94. $this->model->parkingName = $this->parking->parkingName;
  95. }
  96. if ($this->model instanceof BankAccountUpdateApplication) {
  97. $this->model->applicationCustomerCode = $this->customer->customerCode;
  98. }
  99. return $this->model;
  100. }
  101. private function setType(string $type): static
  102. {
  103. $this->model->applicationType = $type;
  104. return $this;
  105. }
  106. private function getApplicationNo(): string
  107. {
  108. /**
  109. * 申請番号を発番する。重複チェックを一定回数行う。
  110. */
  111. for ($i = 0; $i < 10; $i++) {
  112. $no = sprintf("%s-%06d", DateUtil::now()->format('Ymd'), rand(1, 999999));
  113. $check = GeneralApplication::getAccess()->some(GeneralApplication::getQuery()->where(GeneralApplication::FIELD_APPLICATION_NO, $no));
  114. if ($check->isEmpty()) {
  115. return $no;
  116. }
  117. }
  118. throw new AppCommonException('申請番号取得失敗');
  119. }
  120. }