From 31ca58aeb7443265c5b204fa5f570292c94e202a Mon Sep 17 00:00:00 2001 From: "sosuke.iwabuchi" Date: Thu, 26 Oct 2023 11:44:47 +0900 Subject: [PATCH] =?UTF-8?q?=E5=A5=91=E7=B4=84=E6=9C=88=E3=81=AE=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E3=82=92=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TerminationOrderOptionsController.php | 17 ++-- app/Kintone/Models/Parking.php | 82 +++++++++++++++++-- 2 files changed, 85 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderOptionsController.php b/app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderOptionsController.php index 544b3ec..602cd4a 100644 --- a/app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderOptionsController.php +++ b/app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderOptionsController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Web\SeasonTicketContract; use App\Http\Controllers\Web\WebController; +use App\Kintone\Models\Parking; use App\Kintone\Models\SeasonTicketContract; use App\Util\DateUtil; use Illuminate\Http\JsonResponse; @@ -34,18 +35,18 @@ class TerminationOrderOptionsController extends WebController $monthes = []; - // $seasonTicketContract = SeasonTicketContract::find($param->seasonTicketContractRecordNo); + $seasonTicketContract = SeasonTicketContract::find($param->seasonTicketContractRecordNo); - // $parking = $seasonTicketContract->getParking(); + $parking = $seasonTicketContract->getParking(); - // $today = DateUtil::now(); + $now = DateUtil::now(); + $from = $now->clone(); + $to = $now->clone()->addMonths(3)->endOfMonth(); - // $canEndOfMonth = $parking-> + $list = $parking->getCanTerminateDateList($from, $to, $now); - - foreach (range(0, 3) as $m) { - $target = DateUtil::now()->addMonth($m)->endOfMonth(); - $monthes[] = $target->format('Y/m/d'); + foreach ($list as $date) { + $monthes[] = $date->format('Y/m/d'); } return $this->successResponse(['monthes' => $monthes]); diff --git a/app/Kintone/Models/Parking.php b/app/Kintone/Models/Parking.php index d1def00..ebc9177 100644 --- a/app/Kintone/Models/Parking.php +++ b/app/Kintone/Models/Parking.php @@ -4,12 +4,14 @@ namespace App\Kintone\Models; use App\Util\DateUtil; use Illuminate\Support\Carbon; +use Illuminate\Support\Collection; /** * アプリ名 定期駐車場マスタ * @property string parkingName * @property array canTerminateDate - * @property array canTerminateRule + * @property string canTerminateCurrentMonth + * @property string untilCanTerminateCurrentMonth */ class Parking extends KintoneModel { @@ -17,20 +19,24 @@ class Parking extends KintoneModel const FIELD_PARKING_NAME = "駐車場名"; const FIELD_CAN_TERMINATE_DATE = "解約可能日"; - const FIELD_CAN_TERMINATE_RULE = "解約ルール"; - + const FIELD_CAN_TERMINATE_CURRENT_MONTH = "当月解約申請"; + const FIELD_UNTIL_CAN_TERMINATE_CURRENT_MONTH = "当月解約いつまで可能"; const ELEMENT_CAN_TERMINATE_DATE_END_OF_MONTH = "末日"; const ELEMENT_CAN_TERMINATE_DATE_15 = "15日"; - const ELEMENT_CAN_TERMINATE_RULE_UNTIL_10 = "10日まで申込は当月可"; - const ELEMENT_CAN_TERMINATE_RULE_TODAY = "当日解約可"; + const ELEMENT_CAN_TERMINATE_CURRENT_MONTH_OK = "可"; + const ELEMENT_CAN_TERMINATE_CURRENT_MONTH_NG = "不可"; + + const ELEMENT_UNTIL_CAN_TERMINATE_CURRENT_MONTH_10 = "10日まで"; + const ELEMENT_UNTIL_CAN_TERMINATE_CURRENT_MONTH_TODAY = "当日"; protected const FIELDS = [ ...parent::FIELDS, self::FIELD_PARKING_NAME => FieldType::SINGLE_LINE_TEXT, self::FIELD_CAN_TERMINATE_DATE => FieldType::CHECK_BOX, - self::FIELD_CAN_TERMINATE_RULE => FieldType::CHECK_BOX, + self::FIELD_CAN_TERMINATE_CURRENT_MONTH => FieldType::RADIO_BUTTON, + self::FIELD_UNTIL_CAN_TERMINATE_CURRENT_MONTH => FieldType::RADIO_BUTTON, ]; protected const FIELD_NAMES = [ @@ -51,4 +57,68 @@ class Parking extends KintoneModel { return in_array(self::ELEMENT_CAN_TERMINATE_DATE_15, $this->canTerminateDate); } + + public function canTerminateCurrentMonth(): bool + { + return $this->canTerminateCurrentMonth == self::ELEMENT_CAN_TERMINATE_CURRENT_MONTH_OK; + } + + public function isTerminateDay(Carbon $target, ?Carbon $now = null) + { + if ($now === null) { + $now = DateUtil::now(); + } + + $currentMonthJadge = false; + if ($now->format('Ym') === $target->format('Ym')) { + if (!$this->canTerminateCurrentMonth()) { + return false; + } + if ($this->untilCanTerminateCurrentMonth === self::ELEMENT_UNTIL_CAN_TERMINATE_CURRENT_MONTH_10) { + if ($target->day <= 10) { + $currentMonthJadge = true; + } + } + if ($this->untilCanTerminateCurrentMonth === self::ELEMENT_UNTIL_CAN_TERMINATE_CURRENT_MONTH_TODAY) { + // 当月ならいつでもOK + $currentMonthJadge = true; + } + } else { + $currentMonthJadge = true; + } + + if ($currentMonthJadge === false) { + return false; + } + + if ($target->day === 15 && $this->canTerminateDate15()) { + return true; + } + if ($target->isLastOfMonth() && $this->canTerminateDateEndOfMonth()) { + return true; + } + return false; + } + + /** + * @param Carbon $from + * @param Carbon $to + * @param Carbon $now + * @return Collection + */ + public function getCanTerminateDateList(Carbon $from, Carbon $to, Carbon $now): Collection + { + $ret = collect(); + $target = $from->clone(); + + while ($target->lessThanOrEqualTo($to)) { + + if ($this->isTerminateDay($target, $now)) { + $ret->push($target->clone()); + } + + $target->addDay(); + } + return $ret; + } }