No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

150 líneas
5.5KB

  1. <?php
  2. namespace App\Kintone\Models;
  3. use App\Kintone\Models\DropDown\SeasonTicketContractPlan\VehicleType;
  4. use App\Util\DateUtil;
  5. use Illuminate\Support\Carbon;
  6. /**
  7. * アプリ名 車室情報管理
  8. * @property string customerCode
  9. * @property string seasonTicketSeqNo
  10. * @property string parkingName
  11. * @property string roomNo
  12. * @property string planName
  13. * @property string vehicleNo
  14. * @property string registerNo
  15. * @property ?Carbon contractStartDate
  16. * @property ?Carbon contractEndDate
  17. */
  18. class SeasonTicketContract extends KintoneModel
  19. {
  20. const CONFIG_KEY = "KINTONE_APP_SEASON_TICKET_CONTRACT";
  21. const FIELD_CUSTOMER_CODE = "顧客コード";
  22. const FIELD_PARKING_NAME = "駐車場名";
  23. const FIELD_ROOM_NO = "車室番号";
  24. const FIELD_SEASON_TICKET_SEQ_NO = "定期券番号_0";
  25. const FIELD_VEHICLE_NO = "車両番号";
  26. const FIELD_REGISTER_NO = "防犯登録番号";
  27. const FIELD_CONTRACT_START_DATE = "契約日";
  28. const FIELD_CONTRACT_END_DATE = "解約日";
  29. const FIELD_CONTRACT_AMOUNT = "契約金額";
  30. const FIELD_PLAN_NAME = "契約駐車場_0";
  31. const FIELD_STUDENT_LICENSE_IMAGES = "学生証画像";
  32. const FIELD_OTHER_LICENSE_IMAGES = "障がい者手帳画像";
  33. const FIELD_STUDENT_LICENSE_IMAGES_UPLOAD_DATETIME = "学生証画像更新日時";
  34. const FIELD_OTHER_LICENSE_IMAGES_UPLOAD_DATETIME = "障がい者手帳画像更新日時";
  35. const FIELD_STUDENT_LICENSE_EXPIRES_DATE = "学生証有効期限";
  36. const FIELD_OTHER_LICENSE_EXPIRES_DATE = "障がい者手帳有効期限";
  37. protected const FIELDS = [
  38. ...parent::FIELDS,
  39. self::FIELD_CUSTOMER_CODE => FieldType::NUMBER,
  40. self::FIELD_PARKING_NAME => FieldType::SINGLE_LINE_TEXT,
  41. self::FIELD_ROOM_NO => FieldType::SINGLE_LINE_TEXT,
  42. self::FIELD_SEASON_TICKET_SEQ_NO => FieldType::SINGLE_LINE_TEXT,
  43. self::FIELD_VEHICLE_NO => FieldType::SINGLE_LINE_TEXT,
  44. self::FIELD_REGISTER_NO => FieldType::SINGLE_LINE_TEXT,
  45. self::FIELD_CONTRACT_START_DATE => FieldType::DATE,
  46. self::FIELD_CONTRACT_END_DATE => FieldType::DATE,
  47. self::FIELD_CONTRACT_AMOUNT => FieldType::NUMBER,
  48. self::FIELD_PLAN_NAME => FieldType::SINGLE_LINE_TEXT,
  49. self::FIELD_STUDENT_LICENSE_IMAGES => FieldType::FILE,
  50. self::FIELD_OTHER_LICENSE_IMAGES => FieldType::FILE,
  51. self::FIELD_STUDENT_LICENSE_IMAGES_UPLOAD_DATETIME => FieldType::DATETIME,
  52. self::FIELD_OTHER_LICENSE_IMAGES_UPLOAD_DATETIME => FieldType::DATETIME,
  53. self::FIELD_STUDENT_LICENSE_EXPIRES_DATE => FieldType::DATE,
  54. self::FIELD_OTHER_LICENSE_EXPIRES_DATE => FieldType::DATE,
  55. ];
  56. protected const FIELD_NAMES = [
  57. ...parent::FIELD_NAMES,
  58. self::FIELD_SEASON_TICKET_SEQ_NO => 'season_ticekt_contract_record_no',
  59. self::FIELD_PARKING_NAME => 'parking_name',
  60. self::FIELD_ROOM_NO => 'room_no',
  61. self::FIELD_VEHICLE_NO => 'vehicle_no',
  62. self::FIELD_REGISTER_NO => 'register_no',
  63. self::FIELD_CONTRACT_START_DATE => 'contract_start_date',
  64. self::FIELD_CONTRACT_END_DATE => 'contract_end_date',
  65. self::FIELD_CONTRACT_AMOUNT => 'contract_amount',
  66. self::FIELD_STUDENT_LICENSE_IMAGES_UPLOAD_DATETIME => 'student_license_images_upload_datetime',
  67. self::FIELD_OTHER_LICENSE_IMAGES_UPLOAD_DATETIME => 'other_license_images_upload_datetime',
  68. ];
  69. private ?SeasonTicketContractPlan $plan = null;
  70. private ?Parking $parking = null;
  71. private ?Customer $customer = null;
  72. protected function toArrayCustom(): array
  73. {
  74. return [
  75. 'can_some_apply' => $this->canSomeApply(),
  76. 'can_parking_certificate_apply' => $this->canParkingCertificateApply(),
  77. 'can_change_plan_apply' => $this->canChangePlanApply(),
  78. 'is_terminated' => $this->isTerminated(),
  79. ];
  80. }
  81. public function getParking(): Parking
  82. {
  83. if ($this->parking === null) {
  84. $this->parking = Parking::findByParkingName($this->parkingName);
  85. }
  86. return $this->parking;
  87. }
  88. public function getCustomer(): Customer
  89. {
  90. if ($this->customer === null) {
  91. $this->customer = Customer::findByCustomerCode($this->customerCode);
  92. }
  93. return $this->customer;
  94. }
  95. public function getPlan(): SeasonTicketContractPlan
  96. {
  97. if ($this->plan === null) {
  98. $this->plan = SeasonTicketContractPlan::findByName($this->planName);
  99. }
  100. return $this->plan;
  101. }
  102. /**
  103. * 各種申請を行うことができるか判定する
  104. *
  105. * @return boolean
  106. */
  107. public function canSomeApply(): bool
  108. {
  109. return !$this->isTerminated();
  110. }
  111. public function isTerminated(): bool
  112. {
  113. return $this->contractEndDate instanceof Carbon ? $this->contractEndDate <= DateUtil::now() : false;
  114. }
  115. public function canParkingCertificateApply(): bool
  116. {
  117. return !in_array($this->getPlan()->vehicleType, [
  118. VehicleType::V5_自転車,
  119. VehicleType::V6_原付,
  120. VehicleType::V7_バイク,
  121. VehicleType::V8_小型バイク,
  122. VehicleType::V9_中型バイク,
  123. VehicleType::V10_大型バイク,
  124. VehicleType::V11_小型中型バイク,
  125. VehicleType::V12_中型大型バイク,
  126. VehicleType::V13_ナイトカード,
  127. ]);
  128. }
  129. public function canChangePlanApply(): bool
  130. {
  131. return $this->getPlan()->canChangePlanNameList->isNotEmpty();
  132. }
  133. }