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.

125 lines
3.8KB

  1. <?php
  2. namespace App\Kintone\Models;
  3. use App\Util\DateUtil;
  4. use Illuminate\Support\Carbon;
  5. use Illuminate\Support\Collection;
  6. /**
  7. * アプリ名 定期駐車場マスタ
  8. * @property string parkingName
  9. * @property array canTerminateDate
  10. * @property string canTerminateCurrentMonth
  11. * @property string untilCanTerminateCurrentMonth
  12. */
  13. class Parking extends KintoneModel
  14. {
  15. const CONFIG_KEY = "KINTONE_APP_PARKING";
  16. const FIELD_PARKING_NAME = "駐車場名";
  17. const FIELD_CAN_TERMINATE_DATE = "解約可能日";
  18. const FIELD_CAN_TERMINATE_CURRENT_MONTH = "当月解約申請";
  19. const FIELD_UNTIL_CAN_TERMINATE_CURRENT_MONTH = "当月解約いつまで可能";
  20. const ELEMENT_CAN_TERMINATE_DATE_END_OF_MONTH = "末日";
  21. const ELEMENT_CAN_TERMINATE_DATE_15 = "15日";
  22. const ELEMENT_CAN_TERMINATE_CURRENT_MONTH_OK = "可";
  23. const ELEMENT_CAN_TERMINATE_CURRENT_MONTH_NG = "不可";
  24. const ELEMENT_UNTIL_CAN_TERMINATE_CURRENT_MONTH_10 = "10日まで";
  25. const ELEMENT_UNTIL_CAN_TERMINATE_CURRENT_MONTH_TODAY = "当日";
  26. protected const FIELDS = [
  27. ...parent::FIELDS,
  28. self::FIELD_PARKING_NAME => FieldType::SINGLE_LINE_TEXT,
  29. self::FIELD_CAN_TERMINATE_DATE => FieldType::CHECK_BOX,
  30. self::FIELD_CAN_TERMINATE_CURRENT_MONTH => FieldType::RADIO_BUTTON,
  31. self::FIELD_UNTIL_CAN_TERMINATE_CURRENT_MONTH => FieldType::RADIO_BUTTON,
  32. ];
  33. protected const FIELD_NAMES = [
  34. ...parent::FIELD_NAMES,
  35. self::FIELD_PARKING_NAME => 'parking_name',
  36. ];
  37. static function findByParkingName(string $parkingName)
  38. {
  39. return static::getAccess()->first(static::getQuery()->where(static::FIELD_PARKING_NAME, $parkingName));
  40. }
  41. public function canTerminateDateEndOfMonth(): bool
  42. {
  43. return in_array(self::ELEMENT_CAN_TERMINATE_DATE_END_OF_MONTH, $this->canTerminateDate);
  44. }
  45. public function canTerminateDate15(): bool
  46. {
  47. return in_array(self::ELEMENT_CAN_TERMINATE_DATE_15, $this->canTerminateDate);
  48. }
  49. public function canTerminateCurrentMonth(): bool
  50. {
  51. return $this->canTerminateCurrentMonth == self::ELEMENT_CAN_TERMINATE_CURRENT_MONTH_OK;
  52. }
  53. public function isTerminateDay(Carbon $target, ?Carbon $now = null)
  54. {
  55. if ($now === null) {
  56. $now = DateUtil::now();
  57. }
  58. $currentMonthJadge = false;
  59. if ($now->format('Ym') === $target->format('Ym')) {
  60. if (!$this->canTerminateCurrentMonth()) {
  61. return false;
  62. }
  63. if ($this->untilCanTerminateCurrentMonth === self::ELEMENT_UNTIL_CAN_TERMINATE_CURRENT_MONTH_10) {
  64. if ($target->day <= 10) {
  65. $currentMonthJadge = true;
  66. }
  67. }
  68. if ($this->untilCanTerminateCurrentMonth === self::ELEMENT_UNTIL_CAN_TERMINATE_CURRENT_MONTH_TODAY) {
  69. // 当月ならいつでもOK
  70. $currentMonthJadge = true;
  71. }
  72. } else {
  73. $currentMonthJadge = true;
  74. }
  75. if ($currentMonthJadge === false) {
  76. return false;
  77. }
  78. if ($target->day === 15 && $this->canTerminateDate15()) {
  79. return true;
  80. }
  81. if ($target->isLastOfMonth() && $this->canTerminateDateEndOfMonth()) {
  82. return true;
  83. }
  84. return false;
  85. }
  86. /**
  87. * @param Carbon $from
  88. * @param Carbon $to
  89. * @param Carbon $now
  90. * @return Collection<int, Carbon>
  91. */
  92. public function getCanTerminateDateList(Carbon $from, Carbon $to, Carbon $now): Collection
  93. {
  94. $ret = collect();
  95. $target = $from->clone();
  96. while ($target->lessThanOrEqualTo($to)) {
  97. if ($this->isTerminateDay($target, $now)) {
  98. $ret->push($target->clone());
  99. }
  100. $target->addDay();
  101. }
  102. return $ret;
  103. }
  104. }