Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

191 linhas
8.3KB

  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. * @property ?int icSeasonTicektContractId
  18. * @property ?string icSeasonTicektParkingManagementCode
  19. * @property ?int icSeasonTicektSeasonTicketSeqNo
  20. * @property ?string icSeasonTicektVehicleTypeName
  21. * @property ?string icSeasonTicektParkingUseTypeName
  22. * @property ?string icSeasonTicektContractorTypeName
  23. * @property ?Carbon icSeasonTicektStartDate
  24. * @property ?Carbon icSeasonTicektEndDate
  25. * @property ?string icSeasonTicektPositionMemo
  26. * @property ?string icSeasonTicektMemo
  27. * @property ?int icSeasonTicektSeasonTicketLabelCount
  28. * @property ?array<string> icSeasonTicektSeasonTicketLabelCountReleaseLimiterFlg
  29. */
  30. class SeasonTicketContract extends KintoneModel
  31. {
  32. const CONFIG_KEY = "KINTONE_APP_SEASON_TICKET_CONTRACT";
  33. const FIELD_CUSTOMER_CODE = "顧客コード";
  34. const FIELD_PARKING_NAME = "駐車場名";
  35. const FIELD_ROOM_NO = "車室番号";
  36. const FIELD_SEASON_TICKET_SEQ_NO = "定期券番号_0";
  37. const FIELD_VEHICLE_NO = "車両番号";
  38. const FIELD_REGISTER_NO = "防犯登録番号";
  39. const FIELD_CONTRACT_START_DATE = "契約日";
  40. const FIELD_CONTRACT_END_DATE = "解約日";
  41. const FIELD_CONTRACT_AMOUNT = "契約金額";
  42. const FIELD_PLAN_NAME = "契約駐車場_0";
  43. const FIELD_STUDENT_LICENSE_IMAGES = "学生証画像";
  44. const FIELD_OTHER_LICENSE_IMAGES = "障がい者手帳画像";
  45. const FIELD_STUDENT_LICENSE_IMAGES_UPLOAD_DATETIME = "学生証画像更新日時";
  46. const FIELD_OTHER_LICENSE_IMAGES_UPLOAD_DATETIME = "障がい者手帳画像更新日時";
  47. const FIELD_STUDENT_LICENSE_EXPIRES_DATE = "学生証有効期限";
  48. const FIELD_OTHER_LICENSE_EXPIRES_DATE = "障がい者手帳有効期限";
  49. const FIELD_IC_SEASON_TICEKT_CONTRACT_ID = "IC定期関連情報_契約ID";
  50. const FIELD_IC_SEASON_TICEKT_PARKING_MANAGEMENT_CODE = "IC定期関連情報_駐車場管理コード";
  51. const FIELD_IC_SEASON_TICEKT_SEASON_TICKET_SEQ_NO = "IC定期関連情報_定期券番号";
  52. const FIELD_IC_SEASON_TICEKT_VEHICLE_TYPE_NAME = "IC定期関連情報_車種";
  53. const FIELD_IC_SEASON_TICEKT_PARKING_USE_TYPE_NAME = "IC定期関連情報_駐車場利用方法";
  54. const FIELD_IC_SEASON_TICEKT_CONTRACTOR_TYPE_NAME = "IC定期関連情報_契約者種類";
  55. const FIELD_IC_SEASON_TICEKT_START_DATE = "IC定期関連情報_有効期限開始";
  56. const FIELD_IC_SEASON_TICEKT_END_DATE = "IC定期関連情報_有効期限終了";
  57. const FIELD_IC_SEASON_TICEKT_POSITION_MEMO = "IC定期関連情報_駐車位置情報";
  58. const FIELD_IC_SEASON_TICEKT_MEMO = "IC定期関連情報_備考";
  59. const FIELD_IC_SEASON_TICEKT_SEASON_TICKET_LABEL_COUNT = "IC定期関連情報_ラベル発行回数";
  60. const FIELD_IC_SEASON_TICEKT_SEASON_TICKET_LABEL_COUNT_RELEASE_LIMITER_FLG = "IC定期関連情報_ラベル再発行上限超え許可";
  61. protected const FIELDS = [
  62. ...parent::FIELDS,
  63. self::FIELD_CUSTOMER_CODE => FieldType::NUMBER,
  64. self::FIELD_PARKING_NAME => FieldType::SINGLE_LINE_TEXT,
  65. self::FIELD_ROOM_NO => FieldType::SINGLE_LINE_TEXT,
  66. self::FIELD_SEASON_TICKET_SEQ_NO => FieldType::SINGLE_LINE_TEXT,
  67. self::FIELD_VEHICLE_NO => FieldType::SINGLE_LINE_TEXT,
  68. self::FIELD_REGISTER_NO => FieldType::SINGLE_LINE_TEXT,
  69. self::FIELD_CONTRACT_START_DATE => FieldType::DATE,
  70. self::FIELD_CONTRACT_END_DATE => FieldType::DATE,
  71. self::FIELD_CONTRACT_AMOUNT => FieldType::NUMBER,
  72. self::FIELD_PLAN_NAME => FieldType::SINGLE_LINE_TEXT,
  73. self::FIELD_STUDENT_LICENSE_IMAGES => FieldType::FILE,
  74. self::FIELD_OTHER_LICENSE_IMAGES => FieldType::FILE,
  75. self::FIELD_STUDENT_LICENSE_IMAGES_UPLOAD_DATETIME => FieldType::DATETIME,
  76. self::FIELD_OTHER_LICENSE_IMAGES_UPLOAD_DATETIME => FieldType::DATETIME,
  77. self::FIELD_STUDENT_LICENSE_EXPIRES_DATE => FieldType::DATE,
  78. self::FIELD_OTHER_LICENSE_EXPIRES_DATE => FieldType::DATE,
  79. self::FIELD_IC_SEASON_TICEKT_PARKING_MANAGEMENT_CODE => FieldType::SINGLE_LINE_TEXT,
  80. self::FIELD_IC_SEASON_TICEKT_CONTRACT_ID => FieldType::NUMBER,
  81. self::FIELD_IC_SEASON_TICEKT_SEASON_TICKET_SEQ_NO => FieldType::NUMBER,
  82. self::FIELD_IC_SEASON_TICEKT_VEHICLE_TYPE_NAME => FieldType::SINGLE_LINE_TEXT,
  83. self::FIELD_IC_SEASON_TICEKT_PARKING_USE_TYPE_NAME => FieldType::SINGLE_LINE_TEXT,
  84. self::FIELD_IC_SEASON_TICEKT_CONTRACTOR_TYPE_NAME => FieldType::SINGLE_LINE_TEXT,
  85. self::FIELD_IC_SEASON_TICEKT_START_DATE => FieldType::DATE,
  86. self::FIELD_IC_SEASON_TICEKT_END_DATE => FieldType::DATE,
  87. self::FIELD_IC_SEASON_TICEKT_POSITION_MEMO => FieldType::SINGLE_LINE_TEXT,
  88. self::FIELD_IC_SEASON_TICEKT_SEASON_TICKET_LABEL_COUNT => FieldType::NUMBER,
  89. self::FIELD_IC_SEASON_TICEKT_SEASON_TICKET_LABEL_COUNT_RELEASE_LIMITER_FLG => FieldType::CHECK_BOX,
  90. ];
  91. protected const FIELD_NAMES = [
  92. ...parent::FIELD_NAMES,
  93. self::FIELD_SEASON_TICKET_SEQ_NO => 'season_ticekt_contract_record_no',
  94. self::FIELD_PARKING_NAME => 'parking_name',
  95. self::FIELD_ROOM_NO => 'room_no',
  96. self::FIELD_VEHICLE_NO => 'vehicle_no',
  97. self::FIELD_REGISTER_NO => 'register_no',
  98. self::FIELD_CONTRACT_START_DATE => 'contract_start_date',
  99. self::FIELD_CONTRACT_END_DATE => 'contract_end_date',
  100. self::FIELD_CONTRACT_AMOUNT => 'contract_amount',
  101. self::FIELD_STUDENT_LICENSE_IMAGES_UPLOAD_DATETIME => 'student_license_images_upload_datetime',
  102. self::FIELD_OTHER_LICENSE_IMAGES_UPLOAD_DATETIME => 'other_license_images_upload_datetime',
  103. ];
  104. private ?SeasonTicketContractPlan $plan = null;
  105. private ?Parking $parking = null;
  106. private ?Customer $customer = null;
  107. protected function toArrayCustom(): array
  108. {
  109. return [
  110. 'can_some_apply' => $this->canSomeApply(),
  111. 'can_parking_certificate_apply' => $this->canParkingCertificateApply(),
  112. 'can_change_plan_apply' => $this->canChangePlanApply(),
  113. 'is_terminated' => $this->isTerminated(),
  114. 'is_ic_season_ticket' => $this->isIcSeasonTicket(),
  115. ];
  116. }
  117. public function getParking(): Parking
  118. {
  119. if ($this->parking === null) {
  120. $this->parking = Parking::findByParkingName($this->parkingName);
  121. }
  122. return $this->parking;
  123. }
  124. public function getCustomer(): Customer
  125. {
  126. if ($this->customer === null) {
  127. $this->customer = Customer::findByCustomerCode($this->customerCode);
  128. }
  129. return $this->customer;
  130. }
  131. public function getPlan(): SeasonTicketContractPlan
  132. {
  133. if ($this->plan === null) {
  134. $this->plan = SeasonTicketContractPlan::findByName($this->planName);
  135. }
  136. return $this->plan;
  137. }
  138. /**
  139. * 各種申請を行うことができるか判定する
  140. *
  141. * @return boolean
  142. */
  143. public function canSomeApply(): bool
  144. {
  145. return !$this->isTerminated();
  146. }
  147. public function isTerminated(): bool
  148. {
  149. return $this->contractEndDate instanceof Carbon ? $this->contractEndDate <= DateUtil::now() : false;
  150. }
  151. public function isIcSeasonTicket(): bool
  152. {
  153. return !!$this->icSeasonTicektContractId;
  154. }
  155. public function canParkingCertificateApply(): bool
  156. {
  157. return !in_array($this->getPlan()->vehicleType, [
  158. VehicleType::V5_自転車,
  159. VehicleType::V6_原付,
  160. VehicleType::V7_バイク,
  161. VehicleType::V8_小型バイク,
  162. VehicleType::V9_中型バイク,
  163. VehicleType::V10_大型バイク,
  164. VehicleType::V11_小型中型バイク,
  165. VehicleType::V12_中型大型バイク,
  166. VehicleType::V13_ナイトカード,
  167. ]);
  168. }
  169. public function canChangePlanApply(): bool
  170. {
  171. return $this->getPlan()->canChangePlanNameList->isNotEmpty();
  172. }
  173. }