| @@ -103,11 +103,8 @@ class RouteListCsv extends BaseCommand | |||||
| "説明", | "説明", | ||||
| "メソッド", | "メソッド", | ||||
| "URI", | "URI", | ||||
| "S", | |||||
| "C", | |||||
| "A", | |||||
| "L", | |||||
| "N", | |||||
| "NONE", | |||||
| "NORMAL", | |||||
| "コントローラー", | "コントローラー", | ||||
| ], $this->separator); | ], $this->separator); | ||||
| } | } | ||||
| @@ -127,9 +124,8 @@ class RouteListCsv extends BaseCommand | |||||
| $this->getControllerDescription($controller), | $this->getControllerDescription($controller), | ||||
| $this->getMethods($route), | $this->getMethods($route), | ||||
| $route->uri(), | $route->uri(), | ||||
| $this->getRoleAuth($controller, UserRole::NORMAL_ADMIN), | |||||
| $this->getRoleAuth($controller, UserRole::CONTRACT_ADMIN), | |||||
| $this->getRoleAuth($controller, UserRole::SUPER_ADMIN), | |||||
| $this->getRoleAuth($controller, UserRole::NONE), | |||||
| $this->getRoleAuth($controller, UserRole::NORMAL), | |||||
| $controller::class, | $controller::class, | ||||
| ], $this->separator); | ], $this->separator); | ||||
| @@ -55,7 +55,7 @@ class SeasonTikcetContractSelectionFillCandidates extends BaseCommand | |||||
| $db = DBUtil::instance(); | $db = DBUtil::instance(); | ||||
| $db->beginTransaction(); | $db->beginTransaction(); | ||||
| $this->getName(); | |||||
| $targets = $this->getTargets(); | $targets = $this->getTargets(); | ||||
| $this->outputInfo(sprintf("取得対象 %d件", $targets->count())); | $this->outputInfo(sprintf("取得対象 %d件", $targets->count())); | ||||
| @@ -0,0 +1,94 @@ | |||||
| <?php | |||||
| namespace App\Console\Commands; | |||||
| use App\Jobs\SeasonTicketContract\Selection\SetResult; | |||||
| use App\Kintone\KintoneRecordQueryOperator; | |||||
| use App\Kintone\Models\DropDown\SeasonTicketContractSelection\SelectionStatus; | |||||
| use App\Kintone\Models\SeasonTicketContractSelection; | |||||
| use App\Util\DateUtil; | |||||
| use App\Util\DBUtil; | |||||
| use Exception; | |||||
| class SeasonTikcetContractSelectionSetResult extends BaseCommand | |||||
| { | |||||
| const COMMAND = "season-ticket-contract-selection:set-result"; | |||||
| /** | |||||
| * The name and signature of the console command. | |||||
| * | |||||
| * @var string | |||||
| */ | |||||
| protected $signature = self::COMMAND; | |||||
| /** | |||||
| * The console command description. | |||||
| * | |||||
| * @var string | |||||
| */ | |||||
| protected $description = '定期選考の選考者設定のジョブを登録する'; | |||||
| static public function getCommand() | |||||
| { | |||||
| return self::COMMAND; | |||||
| } | |||||
| /** | |||||
| * Create a new command instance. | |||||
| * | |||||
| * @return void | |||||
| */ | |||||
| public function __construct() | |||||
| { | |||||
| parent::__construct(); | |||||
| $this->managers = collect(); | |||||
| } | |||||
| /** | |||||
| * Execute the console command. | |||||
| * | |||||
| * @return int | |||||
| */ | |||||
| public function service(): int | |||||
| { | |||||
| try { | |||||
| $db = DBUtil::instance(); | |||||
| $db->beginTransaction(); | |||||
| $targets = $this->getTargets(); | |||||
| $this->outputInfo(sprintf("取得対象 %d件", $targets->count())); | |||||
| // データハンドリング | |||||
| foreach ($targets as $data) { | |||||
| $this->handleData($data); | |||||
| } | |||||
| $db->commit(); | |||||
| } catch (Exception $e) { | |||||
| $db->rollBack(); | |||||
| throw $e; | |||||
| } | |||||
| return self::RESULTCODE_SUCCESS; | |||||
| } | |||||
| private function getTargets() | |||||
| { | |||||
| $today = DateUtil::now(); | |||||
| $access = SeasonTicketContractSelection::getAccess(); | |||||
| $query = SeasonTicketContractSelection::getQuery() | |||||
| ->whereIn(SeasonTicketContractSelection::FIELD_STATUS, [SelectionStatus::ENTRY_ACCEPTING]) | |||||
| ->whereDate(SeasonTicketContractSelection::FIELD_SELECTION_FINAL_DATE, $today, KintoneRecordQueryOperator::LT); | |||||
| return $access->all($query); | |||||
| } | |||||
| private function handleData(SeasonTicketContractSelection $data) | |||||
| { | |||||
| SetResult::dispatch($data->getRecordId()); | |||||
| } | |||||
| } | |||||
| @@ -15,6 +15,8 @@ class Kernel extends ConsoleKernel | |||||
| Schedules\HeartBeat::register($schedule); | Schedules\HeartBeat::register($schedule); | ||||
| Schedules\SMBCPoll::register($schedule); | Schedules\SMBCPoll::register($schedule); | ||||
| Schedules\BankAccountRegisterRemaind::register($schedule); | Schedules\BankAccountRegisterRemaind::register($schedule); | ||||
| Schedules\SeasonTikcetContractSelectionFillCandidates::register($schedule); | |||||
| Schedules\SeasonTikcetContractSelectionSetResult::register($schedule); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -0,0 +1,17 @@ | |||||
| <?php | |||||
| namespace App\Console\Schedules; | |||||
| use App\Console\Commands\SeasonTikcetContractSelectionFillCandidates as Command; | |||||
| use Illuminate\Console\Scheduling\Schedule; | |||||
| class SeasonTikcetContractSelectionFillCandidates extends BaseSchedule | |||||
| { | |||||
| static public function register(Schedule $schedule) | |||||
| { | |||||
| $schedule->command(Command::class) | |||||
| ->everyFiveMinutes() | |||||
| ->description("定期選考申込者一覧設定"); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,17 @@ | |||||
| <?php | |||||
| namespace App\Console\Schedules; | |||||
| use App\Console\Commands\SeasonTikcetContractSelectionSetResult as Command; | |||||
| use Illuminate\Console\Scheduling\Schedule; | |||||
| class SeasonTikcetContractSelectionSetResult extends BaseSchedule | |||||
| { | |||||
| static public function register(Schedule $schedule) | |||||
| { | |||||
| $schedule->command(Command::class) | |||||
| ->at("00:05") | |||||
| ->description("定期選考結果設定"); | |||||
| } | |||||
| } | |||||
| @@ -178,7 +178,7 @@ abstract class BaseEmailer extends Mailable | |||||
| * @param array|string $path | * @param array|string $path | ||||
| * @return string | * @return string | ||||
| */ | */ | ||||
| protected function getAppUrl(array|string $path): string | |||||
| protected function getAppUrl(array|string $path, array $query = []): string | |||||
| { | { | ||||
| $elements = [config("app.url")]; | $elements = [config("app.url")]; | ||||
| if (is_array($path)) { | if (is_array($path)) { | ||||
| @@ -187,9 +187,17 @@ abstract class BaseEmailer extends Mailable | |||||
| $elements[] = $path; | $elements[] = $path; | ||||
| } | } | ||||
| return implode( | |||||
| "/", | |||||
| $elements, | |||||
| ); | |||||
| $url = implode("/", $elements); | |||||
| if (!!$query) { | |||||
| $url .= "?"; | |||||
| $queryStrList = []; | |||||
| foreach ($query as $key => $value) { | |||||
| $queryStrList[] = sprintf("%s=%s", $key, $value); | |||||
| } | |||||
| $url .= implode("&", $queryStrList); | |||||
| } | |||||
| return $url; | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,45 @@ | |||||
| <?php | |||||
| namespace App\Email\Members; | |||||
| use App\Kintone\Models\SeasonTicketContractEntry; | |||||
| use App\Kintone\Models\SeasonTicketContractSelection; | |||||
| use App\Logic\SeasonTicketContractSelectionManager; | |||||
| class SelectionNotice extends Members | |||||
| { | |||||
| public function __construct( | |||||
| private SeasonTicketContractSelection $selection, | |||||
| private SeasonTicketContractEntry $entry, | |||||
| ) { | |||||
| parent::__construct(null); | |||||
| } | |||||
| public function getTemplateName(): string | |||||
| { | |||||
| return 'emails.members.selection_notice'; | |||||
| } | |||||
| public function getSubject(): string | |||||
| { | |||||
| return "##TODO## 選考通知"; | |||||
| } | |||||
| public function getMemberParams(): array | |||||
| { | |||||
| $manager = new SeasonTicketContractSelectionManager($this->selection); | |||||
| return [ | |||||
| 'customer_name' => $this->entry->customerName, | |||||
| 'parking_name' => $this->entry->parkingName, | |||||
| 'url' => $this->getAppUrl([ | |||||
| 'season-ticket-contract', | |||||
| 'selection', 'entry', | |||||
| $this->selection->getRecordId(), | |||||
| $this->entry->getRecordId(), | |||||
| $manager->getHash($this->entry->getRecordId()) | |||||
| ]), | |||||
| ]; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,41 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract\Entry; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use App\Logic\SeasonTicketContractEntryManager; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| class EntryInfoController extends WebController | |||||
| { | |||||
| public function name(): string | |||||
| { | |||||
| return "申込キャンセル"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "申込をキャンセルする"; | |||||
| } | |||||
| public function __construct(protected CancelParams $param) | |||||
| { | |||||
| parent::__construct(); | |||||
| } | |||||
| protected function run(Request $request): JsonResponse | |||||
| { | |||||
| $param = $this->param; | |||||
| $manager = new SeasonTicketContractEntryManager($param->recordNo); | |||||
| if (!$manager->checkHash($param->fs)) { | |||||
| return $this->failedResponse(); | |||||
| } | |||||
| $entry = $manager->getEntry(); | |||||
| return $this->successResponse($entry->toArray()); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,20 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract\Entry; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| /** | |||||
| * @property int $recordNo | |||||
| * @property string $fs | |||||
| */ | |||||
| class CancelParams extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return [ | |||||
| 'record_no' => $this->numeric(), | |||||
| 'fs' => $this->str(), | |||||
| ]; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,42 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract\Entry; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use App\Logic\SeasonTicketContractEntryManager; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| class CancelController extends WebController | |||||
| { | |||||
| public function name(): string | |||||
| { | |||||
| return "申込内容取得"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "申込内容を取得する"; | |||||
| } | |||||
| public function __construct(protected EntryInfoParams $param) | |||||
| { | |||||
| parent::__construct(); | |||||
| } | |||||
| protected function run(Request $request): JsonResponse | |||||
| { | |||||
| $param = $this->param; | |||||
| $manager = new SeasonTicketContractEntryManager($param->recordNo); | |||||
| if (!$manager->checkHash($param->fs)) { | |||||
| return $this->failedResponse(); | |||||
| } | |||||
| $entry = $manager->getEntry(); | |||||
| return $this->successResponse($entry->toArray()); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,20 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract\Entry; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| /** | |||||
| * @property int $recordNo | |||||
| * @property string $fs | |||||
| */ | |||||
| class EntryInfoParams extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return [ | |||||
| 'record_no' => $this->numeric(), | |||||
| 'fs' => $this->str(), | |||||
| ]; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,53 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract\Selection; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use App\Logic\SeasonTicketContractEntryManager; | |||||
| use App\Logic\SeasonTicketContractSelectionManager; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| class EntryController extends WebController | |||||
| { | |||||
| public function name(): string | |||||
| { | |||||
| return "定期選考申込"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "定期選考に申込する"; | |||||
| } | |||||
| public function __construct(protected EntryParams $param) | |||||
| { | |||||
| parent::__construct(); | |||||
| } | |||||
| protected function run(Request $request): JsonResponse | |||||
| { | |||||
| $param = $this->param; | |||||
| $manager = new SeasonTicketContractSelectionManager($param->selectionRecordNo); | |||||
| if (!$manager->checkHash($param->entryRecordNo, $param->fs)) { | |||||
| return $this->failedResponse(); | |||||
| } | |||||
| $manager->entry($param->entryRecordNo, $param->fs); | |||||
| $entryManager = new SeasonTicketContractEntryManager($param->entryRecordNo); | |||||
| $entry = $entryManager->getEntry(); | |||||
| $entry->address = $param->address; | |||||
| $entry->phoneNo = $param->phoneNo; | |||||
| $entryManager->save(); | |||||
| $manager->save(); | |||||
| return $this->successResponse(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,28 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract\Selection; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| use App\Rules\PhoneNumber; | |||||
| use App\Rules\SimpleRegEx; | |||||
| /** | |||||
| * @property int selectionRecordNo | |||||
| * @property int entryRecordNo | |||||
| * @property string fs | |||||
| * @property string address | |||||
| * @property string phoneNo | |||||
| */ | |||||
| class EntryParams extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return [ | |||||
| 'selection_record_no' => $this->numeric(), | |||||
| 'entry_record_no' => $this->numeric(), | |||||
| 'fs' => $this->str(), | |||||
| 'address' => $this->str(), | |||||
| 'phone_no' => $this->str([new SimpleRegEx("/[^0-9-]+/", "不正な文字が含まれています", true)]), | |||||
| ]; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,37 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract\Selection; | |||||
| use App\Http\Controllers\Web\FromKintoneController; | |||||
| use App\Jobs\SeasonTicketContract\Selection\NoticeToCandidates; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| class NoticeToCandidatesController extends FromKintoneController | |||||
| { | |||||
| public function name(): string | |||||
| { | |||||
| return "定期選考メール一斉通知依頼"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "定期選考メール一斉通知を依頼する"; | |||||
| } | |||||
| public function __construct(protected NoticeToCandidatesParams $param) | |||||
| { | |||||
| parent::__construct(); | |||||
| } | |||||
| protected function run(Request $request): JsonResponse | |||||
| { | |||||
| $param = $this->param; | |||||
| NoticeToCandidates::dispatch($param->recordNo)->delay(5); | |||||
| return $this->successResponse(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,18 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract\Selection; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| /** | |||||
| * @property int $recordNo | |||||
| */ | |||||
| class NoticeToCandidatesParams extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return [ | |||||
| 'record_no' => $this->numeric(), | |||||
| ]; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,49 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract\Selection; | |||||
| use App\Exceptions\GeneralErrorMessageException; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use App\Kintone\Models\DropDown\SeasonTicketContractSelection\SelectionStatus; | |||||
| use App\Logic\SeasonTicketContractSelectionManager; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| class SelectionInfoController extends WebController | |||||
| { | |||||
| public function name(): string | |||||
| { | |||||
| return "申込内容取得"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "申込内容を取得する"; | |||||
| } | |||||
| public function __construct(protected SelectionInfoParams $param) | |||||
| { | |||||
| parent::__construct(); | |||||
| } | |||||
| protected function run(Request $request): JsonResponse | |||||
| { | |||||
| $param = $this->param; | |||||
| $manager = new SeasonTicketContractSelectionManager($param->selectionRecordNo); | |||||
| if (!$manager->checkHash($param->entryRecordNo, $param->fs)) { | |||||
| return $this->failedResponse(); | |||||
| } | |||||
| if ($manager->getSelection()->status !== SelectionStatus::ENTRY_ACCEPTING) { | |||||
| throw new GeneralErrorMessageException("募集期間が終了しています"); | |||||
| } | |||||
| $entry = $manager->getEntry($param->entryRecordNo); | |||||
| return $this->successResponse($entry->toArray()); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,22 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract\Selection; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| /** | |||||
| * @property int selectionRecordNo | |||||
| * @property int entryRecordNo | |||||
| * @property string fs | |||||
| */ | |||||
| class SelectionInfoParams extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return [ | |||||
| 'selection_record_no' => $this->numeric(), | |||||
| 'entry_record_no' => $this->numeric(), | |||||
| 'fs' => $this->str(), | |||||
| ]; | |||||
| } | |||||
| } | |||||
| @@ -2,6 +2,7 @@ | |||||
| namespace App\Jobs; | namespace App\Jobs; | ||||
| use App\Util\DBUtil; | |||||
| use Illuminate\Bus\Queueable; | use Illuminate\Bus\Queueable; | ||||
| use Illuminate\Contracts\Queue\ShouldQueue; | use Illuminate\Contracts\Queue\ShouldQueue; | ||||
| use Illuminate\Foundation\Bus\Dispatchable; | use Illuminate\Foundation\Bus\Dispatchable; | ||||
| @@ -13,10 +14,22 @@ abstract class BaseJob implements ShouldQueue | |||||
| { | { | ||||
| use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; | use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; | ||||
| protected DBUtil $db; | |||||
| public function handle() | public function handle() | ||||
| { | { | ||||
| $this->logConfig(); | |||||
| $this->handleJob(); | |||||
| $this->db = DBUtil::instance(); | |||||
| try { | |||||
| $this->db->beginTransaction(); | |||||
| $this->logConfig(); | |||||
| $this->handleJob(); | |||||
| $this->db->commit(); | |||||
| } catch (Exception $e) { | |||||
| $this->db->rollBack(); | |||||
| throw $e; | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -0,0 +1,38 @@ | |||||
| <?php | |||||
| namespace App\Jobs\SeasonTicketContract\Selection; | |||||
| use App\Codes\QueueName; | |||||
| use App\Jobs\BaseJob; | |||||
| use App\Logic\SeasonTicketContractSelectionManager; | |||||
| use App\Util\LoggingUtil; | |||||
| use Exception; | |||||
| use Illuminate\Database\Eloquent\ModelNotFoundException; | |||||
| class NoticeToCandidates extends BaseJob | |||||
| { | |||||
| /** | |||||
| * Create a new job instance. | |||||
| * | |||||
| * @return void | |||||
| */ | |||||
| public function __construct( | |||||
| private int $recordNo | |||||
| ) { | |||||
| $this->onQueue(QueueName::JOB->value); | |||||
| } | |||||
| protected function handleJob() | |||||
| { | |||||
| try { | |||||
| $manager = new SeasonTicketContractSelectionManager($this->recordNo); | |||||
| $manager->sendNotice() | |||||
| ->save(); | |||||
| } catch (ModelNotFoundException $e) { | |||||
| LoggingUtil::errorException($e, sprintf("データ存在なし削除 %s", self::class)); | |||||
| } catch (Exception $e) { | |||||
| LoggingUtil::errorException($e, sprintf("ジョブ失敗->削除 %s", self::class)); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,62 @@ | |||||
| <?php | |||||
| namespace App\Jobs\SeasonTicketContract\Selection; | |||||
| use App\Codes\QueueName; | |||||
| use App\Jobs\BaseJob; | |||||
| use App\Kintone\Models\DropDown\SeasonTicketContractSelection\SelectionStatus; | |||||
| use App\Logic\SeasonTicketContractSelectionManager; | |||||
| use App\Util\LoggingUtil; | |||||
| use Exception; | |||||
| use Illuminate\Database\Eloquent\ModelNotFoundException; | |||||
| class SetResult extends BaseJob | |||||
| { | |||||
| /** | |||||
| * Create a new job instance. | |||||
| * | |||||
| * @return void | |||||
| */ | |||||
| public function __construct( | |||||
| private int $recordNo | |||||
| ) { | |||||
| $this->onQueue(QueueName::JOB->value); | |||||
| } | |||||
| protected function handleJob() | |||||
| { | |||||
| try { | |||||
| $manager = new SeasonTicketContractSelectionManager($this->recordNo); | |||||
| $manager->makeResult() | |||||
| ->save(); | |||||
| $selection = $manager->getSelection(); | |||||
| // 以下ログ出力処理 | |||||
| if ($selection->status === SelectionStatus::RESULT_DECISION) { | |||||
| foreach ($selection->resultList as $result) { | |||||
| info(sprintf( | |||||
| "選考結果設定 駐車場:%s 選考レコード番号:%d 締日:%s 氏名:%s 申込番号:%s", | |||||
| $selection->parkingName, | |||||
| $selection->getRecordId(), | |||||
| $selection->selectionFinalDate ? $selection->selectionFinalDate->format('Y/m/d') : "-", | |||||
| $result->name, | |||||
| $result->entryNo, | |||||
| )); | |||||
| } | |||||
| } else if ($selection->status === SelectionStatus::FAILED) { | |||||
| info(sprintf( | |||||
| "選考不調 駐車場:%s 選考レコード番号:%d 締日:%s", | |||||
| $selection->parkingName, | |||||
| $selection->getRecordId(), | |||||
| $selection->selectionFinalDate ? $selection->selectionFinalDate->format('Y/m/d') : "-", | |||||
| )); | |||||
| } | |||||
| } catch (ModelNotFoundException $e) { | |||||
| LoggingUtil::errorException($e, sprintf("データ存在なし削除 %s", self::class)); | |||||
| } catch (Exception $e) { | |||||
| LoggingUtil::errorException($e, sprintf("ジョブ失敗->削除 %s", self::class)); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -6,4 +6,5 @@ abstract class Status | |||||
| { | { | ||||
| const RESERVE = "予約"; | const RESERVE = "予約"; | ||||
| const WAIT_EMPTY = "空き待ち"; | const WAIT_EMPTY = "空き待ち"; | ||||
| const CANCEL = "キャンセル"; | |||||
| } | } | ||||
| @@ -18,6 +18,7 @@ use Illuminate\Support\Carbon; | |||||
| * @property int carAmount | * @property int carAmount | ||||
| * @property string paymentMethod | * @property string paymentMethod | ||||
| * @property Carbon entryDatetime | * @property Carbon entryDatetime | ||||
| * @property string planName | |||||
| */ | */ | ||||
| class SeasonTicketContractEntry extends KintoneModel | class SeasonTicketContractEntry extends KintoneModel | ||||
| { | { | ||||
| @@ -35,6 +36,7 @@ class SeasonTicketContractEntry extends KintoneModel | |||||
| const FIELD_CAR_AMOUNT = "台数"; | const FIELD_CAR_AMOUNT = "台数"; | ||||
| const FIELD_PAYMENT_METHOD = "支払方法"; | const FIELD_PAYMENT_METHOD = "支払方法"; | ||||
| const FIELD_ENTRY_DATETIME = "受付日時"; | const FIELD_ENTRY_DATETIME = "受付日時"; | ||||
| const FIELD_PLAN_NAME = "ParkingNaviプラン"; | |||||
| protected const FIELDS = [ | protected const FIELDS = [ | ||||
| ...parent::FIELDS, | ...parent::FIELDS, | ||||
| @@ -48,12 +50,21 @@ class SeasonTicketContractEntry extends KintoneModel | |||||
| self::FIELD_VEHICLE_NO => FieldType::SINGLE_LINE_TEXT, | self::FIELD_VEHICLE_NO => FieldType::SINGLE_LINE_TEXT, | ||||
| self::FIELD_PAYMENT_METHOD => FieldType::DROP_DOWN, | self::FIELD_PAYMENT_METHOD => FieldType::DROP_DOWN, | ||||
| self::FIELD_ENTRY_DATETIME => FieldType::DATETIME, | self::FIELD_ENTRY_DATETIME => FieldType::DATETIME, | ||||
| self::FIELD_PLAN_NAME => FieldType::SINGLE_LINE_TEXT, | |||||
| ]; | ]; | ||||
| protected const FIELD_NAMES = [ | protected const FIELD_NAMES = [ | ||||
| ...parent::FIELD_NAMES, | ...parent::FIELD_NAMES, | ||||
| self::FIELD_PARKING_NAME => 'parking_name', | |||||
| self::FIELD_CUSTOMER_NAME => 'customer_name', | |||||
| self::FIELD_PLAN_NAME => 'plan_name', | |||||
| self::FIELD_ENTRY_DATETIME => 'entry_datetime', | |||||
| self::FIELD_PHONE_NO => 'phone_no', | |||||
| self::FIELD_ADDRESS => 'address', | |||||
| self::FIELD_CAR_AMOUNT => 'car_amount', | |||||
| ]; | ]; | ||||
| public function getParking(): Parking | public function getParking(): Parking | ||||
| { | { | ||||
| return Parking::findByParkingName($this->parkingName); | return Parking::findByParkingName($this->parkingName); | ||||
| @@ -0,0 +1,51 @@ | |||||
| <?php | |||||
| namespace App\Logic; | |||||
| use App\Kintone\Models\DropDown\SeasonTicketContractEntry\Status; | |||||
| use App\Kintone\Models\SeasonTicketContractEntry; | |||||
| class SeasonTicketContractEntryManager | |||||
| { | |||||
| private SeasonTicketContractEntry $entry; | |||||
| public function __construct(int|SeasonTicketContractEntry $recordNo = null) | |||||
| { | |||||
| if (is_int($recordNo)) { | |||||
| $this->entry = SeasonTicketContractEntry::find($recordNo); | |||||
| return; | |||||
| } else if ($recordNo instanceof SeasonTicketContractEntry) { | |||||
| $this->entry = $recordNo; | |||||
| return; | |||||
| } | |||||
| } | |||||
| public function getEntry() | |||||
| { | |||||
| return $this->entry; | |||||
| } | |||||
| public function cancel() | |||||
| { | |||||
| $this->entry->status = Status::CANCEL; | |||||
| return $this; | |||||
| } | |||||
| public function save() | |||||
| { | |||||
| $this->entry->save(); | |||||
| return $this; | |||||
| } | |||||
| public function getHash() | |||||
| { | |||||
| $source = sprintf("%010d-%s", $this->entry->getRecordId(), $this->entry->entryDatetime->format("YmdHi")); | |||||
| return hash('sha256', $source); | |||||
| } | |||||
| public function checkHash(string $hash): bool | |||||
| { | |||||
| $expect = $this->getHash(); | |||||
| return $expect === $hash; | |||||
| } | |||||
| } | |||||
| @@ -2,7 +2,9 @@ | |||||
| namespace App\Logic; | namespace App\Logic; | ||||
| use App\Email\Members\SelectionNotice; | |||||
| use App\Exceptions\AppCommonException; | use App\Exceptions\AppCommonException; | ||||
| use App\Exceptions\GeneralErrorMessageException; | |||||
| use App\Kintone\KintoneRecordQuery; | use App\Kintone\KintoneRecordQuery; | ||||
| use App\Kintone\KintoneRecordQueryOperator; | use App\Kintone\KintoneRecordQueryOperator; | ||||
| use App\Kintone\Models\DropDown\SeasonTicketContractEntry\Status; | use App\Kintone\Models\DropDown\SeasonTicketContractEntry\Status; | ||||
| @@ -10,6 +12,7 @@ use App\Kintone\Models\SeasonTicketContractEntry as EntryModel; | |||||
| use App\Kintone\Models\SeasonTicketContractSelection as SelectionModel; | use App\Kintone\Models\SeasonTicketContractSelection as SelectionModel; | ||||
| use App\Kintone\Models\SubTable\SeasonTicketContractSelection\Entry; | use App\Kintone\Models\SubTable\SeasonTicketContractSelection\Entry; | ||||
| use App\Kintone\Models\DropDown\SeasonTicketContractSelection\SelectionStatus; | use App\Kintone\Models\DropDown\SeasonTicketContractSelection\SelectionStatus; | ||||
| use App\Kintone\Models\SeasonTicketContractEntry; | |||||
| use App\Kintone\Models\SubTable\SeasonTicketContractSelection\Candidate; | use App\Kintone\Models\SubTable\SeasonTicketContractSelection\Candidate; | ||||
| use App\Kintone\Models\SubTable\SeasonTicketContractSelection\Result; | use App\Kintone\Models\SubTable\SeasonTicketContractSelection\Result; | ||||
| use App\Kintone\Models\SubTable\SeasonTicketContractSelection\TargetRoom; | use App\Kintone\Models\SubTable\SeasonTicketContractSelection\TargetRoom; | ||||
| @@ -21,10 +24,12 @@ class SeasonTicketContractSelectionManager | |||||
| private SelectionModel $selection; | private SelectionModel $selection; | ||||
| public function __construct(?int $recordNo = null) | |||||
| public function __construct(int|SelectionModel|null $recordNo = null) | |||||
| { | { | ||||
| if ($recordNo) { | |||||
| if (is_int($recordNo)) { | |||||
| $this->selection = SelectionModel::find($recordNo); | $this->selection = SelectionModel::find($recordNo); | ||||
| } else if ($recordNo instanceof SelectionModel) { | |||||
| $this->selection = $recordNo; | |||||
| } else { | } else { | ||||
| $this->selection = new SelectionModel(); | $this->selection = new SelectionModel(); | ||||
| $this->selection->status = SelectionStatus::START; | $this->selection->status = SelectionStatus::START; | ||||
| @@ -84,9 +89,26 @@ class SeasonTicketContractSelectionManager | |||||
| return $this; | return $this; | ||||
| } | } | ||||
| public function sendNotine() | |||||
| public function sendNotice() | |||||
| { | { | ||||
| // メール送信 | // メール送信 | ||||
| foreach ($this->selection->candidateList as $candidate) { | |||||
| if ($candidate->emailSendTarget) { | |||||
| $entry = SeasonTicketContractEntry::find($candidate->entryRecordNo); | |||||
| if (!in_array($entry->status, [Status::RESERVE, Status::WAIT_EMPTY])) { | |||||
| continue; | |||||
| } | |||||
| if (!$entry->email) { | |||||
| continue; | |||||
| } | |||||
| $email = new SelectionNotice($this->selection, $entry); | |||||
| (new EmailManager($email->setEmail($entry->email)))->confirm(); | |||||
| } | |||||
| } | |||||
| $this->selection->status = SelectionStatus::ENTRY_ACCEPTING; | |||||
| return $this; | return $this; | ||||
| } | } | ||||
| @@ -114,6 +136,10 @@ class SeasonTicketContractSelectionManager | |||||
| throw new AppCommonException("認証エラー"); | throw new AppCommonException("認証エラー"); | ||||
| } | } | ||||
| if ($this->selection->status !== SelectionStatus::ENTRY_ACCEPTING) { | |||||
| throw new GeneralErrorMessageException("募集期間が終了しています"); | |||||
| } | |||||
| $list = $this->selection->entryList; | $list = $this->selection->entryList; | ||||
| if ($this->hasAlreadyEnterd($recordNo)) { | if ($this->hasAlreadyEnterd($recordNo)) { | ||||
| @@ -144,13 +170,22 @@ class SeasonTicketContractSelectionManager | |||||
| return $this->selection; | return $this->selection; | ||||
| } | } | ||||
| public function getEntry(int $entryRecordNo) | |||||
| { | |||||
| return SeasonTicketContractEntry::find($entryRecordNo); | |||||
| } | |||||
| /** | |||||
| * @param integer $recordNo 申込レコード番号 | |||||
| * @return string | |||||
| */ | |||||
| public function getHash(int $recordNo): string | public function getHash(int $recordNo): string | ||||
| { | { | ||||
| $source = sprintf("%010d-%010d", $recordNo, intval($this->selection->getRecordId())); | $source = sprintf("%010d-%010d", $recordNo, intval($this->selection->getRecordId())); | ||||
| return hash('sha256', $source); | return hash('sha256', $source); | ||||
| } | } | ||||
| private function checkHash(int $recordNo, string $hash): bool | |||||
| public function checkHash(int $recordNo, string $hash): bool | |||||
| { | { | ||||
| $expect = $this->getHash($recordNo); | $expect = $this->getHash($recordNo); | ||||
| return $expect === $hash; | return $expect === $hash; | ||||
| @@ -192,6 +227,8 @@ class SeasonTicketContractSelectionManager | |||||
| $result = new Result(); | $result = new Result(); | ||||
| $result->entryRecordNo = $entry->entryRecordNo; | $result->entryRecordNo = $entry->entryRecordNo; | ||||
| $result->roomRecordNo = $room->roomRecordNo; | $result->roomRecordNo = $room->roomRecordNo; | ||||
| $result->name = $entry->name; | |||||
| $result->entryNo = $entry->entryNo; | |||||
| $totalRoomAmount += $entry->carAmount; | $totalRoomAmount += $entry->carAmount; | ||||
| $resultList->push($result); | $resultList->push($result); | ||||
| } | } | ||||
| @@ -203,7 +240,7 @@ class SeasonTicketContractSelectionManager | |||||
| $this->selection->status = $resultList->isNotEmpty() ? | $this->selection->status = $resultList->isNotEmpty() ? | ||||
| SelectionStatus::COMPLETE : SelectionStatus::FAILED; | |||||
| SelectionStatus::RESULT_DECISION : SelectionStatus::FAILED; | |||||
| $this->selection->resultList = $resultList; | $this->selection->resultList = $resultList; | ||||
| @@ -31,8 +31,8 @@ class RouteServiceProvider extends ServiceProvider | |||||
| ->prefix('api') | ->prefix('api') | ||||
| ->group(base_path('routes/api.php')); | ->group(base_path('routes/api.php')); | ||||
| Route::middleware('api') | Route::middleware('api') | ||||
| ->prefix('api-email') | |||||
| ->group(base_path('routes/api_email.php')); | |||||
| ->prefix('api-from-kintone') | |||||
| ->group(base_path('routes/apiFromKintone.php')); | |||||
| Route::middleware('web') | Route::middleware('web') | ||||
| ->group(base_path('routes/web.php')); | ->group(base_path('routes/web.php')); | ||||
| @@ -0,0 +1,33 @@ | |||||
| <?php | |||||
| namespace App\Rules; | |||||
| class SimpleRegEx extends BaseRule | |||||
| { | |||||
| /** | |||||
| * Create a new rule instance. | |||||
| * | |||||
| * @return void | |||||
| */ | |||||
| public function __construct(private $pattern, private $message, private $notMatch = false) | |||||
| { | |||||
| // | |||||
| } | |||||
| public function check($value): bool | |||||
| { | |||||
| $match = preg_match($this->pattern, $value); | |||||
| return $this->notMatch ? $match === 0 : $match !== 0; | |||||
| } | |||||
| /** | |||||
| * Get the validation error message. | |||||
| * | |||||
| * @return string | |||||
| */ | |||||
| public function message() | |||||
| { | |||||
| return $this->message; | |||||
| } | |||||
| } | |||||