From e9c0c7e6d2bfbe3fd0aa18906ff15a12df911249 Mon Sep 17 00:00:00 2001 From: "sosuke.iwabuchi" Date: Mon, 11 Sep 2023 15:19:13 +0900 Subject: [PATCH] =?UTF-8?q?=E5=A5=91=E7=B4=84=E9=96=A2=E9=80=A3=E3=81=AE?= =?UTF-8?q?=E7=94=B3=E8=AB=8B=E7=B3=BB=E3=80=80=E6=95=B4=E5=82=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ParkingCertificateOrderController.php | 33 ++++++++ .../ParkingCertificateOrderParams.php | 18 +++++ .../StickerReOrderController.php | 33 ++++++++ .../StickerReOrderParams.php | 19 +++++ .../TerminationOrderController.php | 50 ++++++++++++ .../TerminationOrderParams.php | 24 ++++++ .../UpdateVehicleInfoOrderController.php | 33 ++++++++ .../UpdateVehicleInfoOrderParams.php | 18 +++++ app/Kintone/KintoneAccess.php | 12 ++- app/Kintone/Models/Customer.php | 11 +++ app/Kintone/Models/GeneralApplication.php | 44 ++++++++++ app/Kintone/Models/KintoneModel.php | 22 ++++- app/Kintone/Models/Small.php | 27 ------- app/Logic/GeneralApplicationManager.php | 81 +++++++++++++++++++ config/kintone.php | 1 + routes/api.php | 4 + .../Logic/GeneralApplicationManagerTest.php | 31 +++++++ 17 files changed, 426 insertions(+), 35 deletions(-) create mode 100644 app/Http/Controllers/Web/SeasonTicketContract/ParkingCertificateOrderController.php create mode 100644 app/Http/Controllers/Web/SeasonTicketContract/ParkingCertificateOrderParams.php create mode 100644 app/Http/Controllers/Web/SeasonTicketContract/StickerReOrderController.php create mode 100644 app/Http/Controllers/Web/SeasonTicketContract/StickerReOrderParams.php create mode 100644 app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderController.php create mode 100644 app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderParams.php create mode 100644 app/Http/Controllers/Web/SeasonTicketContract/UpdateVehicleInfoOrderController.php create mode 100644 app/Http/Controllers/Web/SeasonTicketContract/UpdateVehicleInfoOrderParams.php create mode 100644 app/Kintone/Models/GeneralApplication.php delete mode 100644 app/Kintone/Models/Small.php create mode 100644 app/Logic/GeneralApplicationManager.php create mode 100644 tests/Feature/Logic/GeneralApplicationManagerTest.php diff --git a/app/Http/Controllers/Web/SeasonTicketContract/ParkingCertificateOrderController.php b/app/Http/Controllers/Web/SeasonTicketContract/ParkingCertificateOrderController.php new file mode 100644 index 0000000..d05619d --- /dev/null +++ b/app/Http/Controllers/Web/SeasonTicketContract/ParkingCertificateOrderController.php @@ -0,0 +1,33 @@ +middleware('auth:sanctum'); + } + + protected function run(Request $request): JsonResponse + { + return $this->successResponse(); + } +} diff --git a/app/Http/Controllers/Web/SeasonTicketContract/ParkingCertificateOrderParams.php b/app/Http/Controllers/Web/SeasonTicketContract/ParkingCertificateOrderParams.php new file mode 100644 index 0000000..2836081 --- /dev/null +++ b/app/Http/Controllers/Web/SeasonTicketContract/ParkingCertificateOrderParams.php @@ -0,0 +1,18 @@ + $this->str(), + ]; + } +} diff --git a/app/Http/Controllers/Web/SeasonTicketContract/StickerReOrderController.php b/app/Http/Controllers/Web/SeasonTicketContract/StickerReOrderController.php new file mode 100644 index 0000000..f4d3dcf --- /dev/null +++ b/app/Http/Controllers/Web/SeasonTicketContract/StickerReOrderController.php @@ -0,0 +1,33 @@ +middleware('auth:sanctum'); + } + + protected function run(Request $request): JsonResponse + { + return $this->successResponse(); + } +} diff --git a/app/Http/Controllers/Web/SeasonTicketContract/StickerReOrderParams.php b/app/Http/Controllers/Web/SeasonTicketContract/StickerReOrderParams.php new file mode 100644 index 0000000..e2e5189 --- /dev/null +++ b/app/Http/Controllers/Web/SeasonTicketContract/StickerReOrderParams.php @@ -0,0 +1,19 @@ + $this->str(), + ]; + } +} diff --git a/app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderController.php b/app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderController.php new file mode 100644 index 0000000..e9dff97 --- /dev/null +++ b/app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderController.php @@ -0,0 +1,50 @@ +middleware('auth:sanctum'); + } + + protected function run(Request $request): JsonResponse + { + $param = $this->param; + + $customer = Customer::getSelf(); + + $attr = [ + GeneralApplication::FIELD_SEASON_TICKET_CONTRACT_RECORD_NO => $param->seasonTicketContractRecordNo, + GeneralApplication::FIELD_TERMINATE_DATE => $param->date, + GeneralApplication::FIELD_MEMO => $param->memo, + ]; + $this->manager->forTerminate($attr) + ->setCustomer($customer) + ->register(); + + return $this->successResponse(); + } +} diff --git a/app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderParams.php b/app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderParams.php new file mode 100644 index 0000000..9f447c3 --- /dev/null +++ b/app/Http/Controllers/Web/SeasonTicketContract/TerminationOrderParams.php @@ -0,0 +1,24 @@ + $this->str(), + 'date' => $this->date(), + 'memo' => $this->str(true), + ]; + } +} diff --git a/app/Http/Controllers/Web/SeasonTicketContract/UpdateVehicleInfoOrderController.php b/app/Http/Controllers/Web/SeasonTicketContract/UpdateVehicleInfoOrderController.php new file mode 100644 index 0000000..23a68b7 --- /dev/null +++ b/app/Http/Controllers/Web/SeasonTicketContract/UpdateVehicleInfoOrderController.php @@ -0,0 +1,33 @@ +middleware('auth:sanctum'); + } + + protected function run(Request $request): JsonResponse + { + return $this->successResponse(); + } +} diff --git a/app/Http/Controllers/Web/SeasonTicketContract/UpdateVehicleInfoOrderParams.php b/app/Http/Controllers/Web/SeasonTicketContract/UpdateVehicleInfoOrderParams.php new file mode 100644 index 0000000..645d1f4 --- /dev/null +++ b/app/Http/Controllers/Web/SeasonTicketContract/UpdateVehicleInfoOrderParams.php @@ -0,0 +1,18 @@ + $this->str(), + ]; + } +} diff --git a/app/Kintone/KintoneAccess.php b/app/Kintone/KintoneAccess.php index fb1b4dc..75dc5a1 100644 --- a/app/Kintone/KintoneAccess.php +++ b/app/Kintone/KintoneAccess.php @@ -185,17 +185,21 @@ class KintoneAccess */ public function create(KintoneModel &$model) { - $response = Http::withHeaders([ - "X-Cybozu-API-Token" => $this->apiToken, - ])->post($this->getRecordUrl(), [ + + $sendData = [ "app" => $this->appId, "record" => $model->getApiLayout(), - ]); + ]; + $response = Http::withHeaders([ + "X-Cybozu-API-Token" => $this->apiToken, + ])->post($this->getRecordUrl(), $sendData); if ($response->failed()) { $e = $response->toException(); if ($e instanceof Exception) { Log::error($e->getMessage()); + Log::error($response->body()); + Log::error($sendData); throw $e; } } diff --git a/app/Kintone/Models/Customer.php b/app/Kintone/Models/Customer.php index bc56eb7..d9c635c 100644 --- a/app/Kintone/Models/Customer.php +++ b/app/Kintone/Models/Customer.php @@ -2,6 +2,8 @@ namespace App\Kintone\Models; +use Illuminate\Support\Facades\Auth; + /** * アプリ名 顧客マスタ */ @@ -11,13 +13,17 @@ class Customer extends KintoneModel const FIELD_CUSTOMER_CODE = "CustomerCode"; const FIELD_CUSTOMER_NAME = "CustomerName"; + const FIELD_CUSTOMER_NAME_KANA = "顧客名カナ"; const FIELD_EMAIL = "メールアドレス"; + const FIELD_PHONE_NUMBER = "電話番号"; protected const FIELDS = [ ...parent::FIELDS, self::FIELD_CUSTOMER_CODE => FieldType::NUMBER, self::FIELD_CUSTOMER_NAME => FieldType::SINGLE_LINE_TEXT, + self::FIELD_CUSTOMER_NAME_KANA => FieldType::SINGLE_LINE_TEXT, self::FIELD_EMAIL => FieldType::LINK, + self::FIELD_PHONE_NUMBER => FieldType::LINK, ]; protected const FIELD_NAMES = [ @@ -25,4 +31,9 @@ class Customer extends KintoneModel self::FIELD_CUSTOMER_NAME => 'customer_name', self::FIELD_EMAIL => 'email', ]; + + public static function getSelf(): static + { + return static::getAccess()->find(Auth::user()->kintone_id); + } } diff --git a/app/Kintone/Models/GeneralApplication.php b/app/Kintone/Models/GeneralApplication.php new file mode 100644 index 0000000..50da49e --- /dev/null +++ b/app/Kintone/Models/GeneralApplication.php @@ -0,0 +1,44 @@ + FieldType::DROP_DOWN, + self::FIELD_APPLICATIONJ_STATUS => FieldType::DROP_DOWN, + self::FIELD_SEASON_TICKET_CONTRACT_RECORD_NO => FieldType::SINGLE_LINE_TEXT, + self::FIELD_CUSTOMER_NAME => FieldType::SINGLE_LINE_TEXT, + self::FIELD_CUSTOMER_NAME_KANA => FieldType::SINGLE_LINE_TEXT, + self::FIELD_CUSTOMER_EMAIL => FieldType::SINGLE_LINE_TEXT, + self::FIELD_CUSTOMER_PHONE_NUMBER => FieldType::SINGLE_LINE_TEXT, + self::FIELD_TERMINATE_DATE => FieldType::DATE, + self::FIELD_VEHICLE_NO => FieldType::SINGLE_LINE_TEXT, + self::FIELD_REGISTER_NO => FieldType::SINGLE_LINE_TEXT, + self::FIELD_MEMO => FieldType::MULTI_LINE_TEXT, + self::FIELD_APPLICATION_DATETIME => FieldType::DATETIME, + ]; + + protected const FIELD_NAMES = [ + ...parent::FIELD_NAMES, + ]; +} diff --git a/app/Kintone/Models/KintoneModel.php b/app/Kintone/Models/KintoneModel.php index e21d8e9..023c43d 100644 --- a/app/Kintone/Models/KintoneModel.php +++ b/app/Kintone/Models/KintoneModel.php @@ -118,8 +118,7 @@ abstract class KintoneModel private function setData(string $path, FieldType $type, $value) { - - + data_set($this->data, $path, $value); return $this; // if ( @@ -224,7 +223,18 @@ abstract class KintoneModel $path = sprintf("%s.value", $fieldCode); if ($type === FieldType::DATETIME) { - data_set($ret, $path, $this->getDate($fieldCode)->toIso8601ZuluString()); + $data = $this->getDate($fieldCode); + if ($data) { + data_set($ret, $path, $data->toIso8601ZuluString()); + } + continue; + } + if ($type === FieldType::DATE) { + $data = $this->getDate($fieldCode); + if ($data) { + data_set($ret, $path, $data->format("Y-m-d")); + data_set($ret, $path, $data->toDateString()); + } continue; } data_set($ret, $path, data_get($this->data, $fieldCode)); @@ -235,7 +245,6 @@ abstract class KintoneModel public function get(string $key) { - $a = json_decode(json_encode($this->data), true); return data_get($this->data, $key); } @@ -259,6 +268,11 @@ abstract class KintoneModel return $this->get($key); } + public function setRecordId(string $id): static + { + $this->recordId = $id; + return $this; + } public function getRecordId(): ?string { return $this->recordId; diff --git a/app/Kintone/Models/Small.php b/app/Kintone/Models/Small.php deleted file mode 100644 index 4bf5f3d..0000000 --- a/app/Kintone/Models/Small.php +++ /dev/null @@ -1,27 +0,0 @@ - FieldType::STRING, - self::FIELD_AGE => FieldType::STRING, - ]; - - protected function setModelData(array $data): bool - { - return true; - } - - protected function toArrayModel(): array - { - return []; - } -} diff --git a/app/Logic/GeneralApplicationManager.php b/app/Logic/GeneralApplicationManager.php new file mode 100644 index 0000000..e0fba22 --- /dev/null +++ b/app/Logic/GeneralApplicationManager.php @@ -0,0 +1,81 @@ +customer = $customer; + return $this; + } + + public function forTerminate(array $attr): static + { + $terminateDate = data_get($attr, GeneralApplication::FIELD_TERMINATE_DATE); + if (!($terminateDate instanceof Carbon)) throw new LogicException("解約予定日不正"); + $this->model->set(GeneralApplication::FIELD_TERMINATE_DATE, $terminateDate); + + return $this->setType("解約申請") + ->setMemo($attr); + } + + public function forParkingCertificate(array $attr = []): static + { + return $this->setType("車庫証明発行申請") + ->setMemo($attr); + } + + public function register() + { + if ($this->customer === null) { + throw new LogicException("顧客NULL"); + } + + if (!$this->model->getStr(GeneralApplication::FIELD_APPLICATION_TYPE)) { + throw new LogicException("申請タイプ未設定"); + } + + $this->model->set(GeneralApplication::FIELD_APPLICATION_DATETIME, DateUtil::now()); + $this->model->set(GeneralApplication::FIELD_APPLICATIONJ_STATUS, "申込"); + $this->model->set(GeneralApplication::FIELD_CUSTOMER_EMAIL, $this->customer->get(Customer::FIELD_EMAIL)); + $this->model->set(GeneralApplication::FIELD_CUSTOMER_NAME, $this->customer->get(Customer::FIELD_CUSTOMER_NAME)); + $this->model->set(GeneralApplication::FIELD_CUSTOMER_NAME_KANA, $this->customer->get(Customer::FIELD_CUSTOMER_NAME_KANA)); + $this->model->set(GeneralApplication::FIELD_CUSTOMER_PHONE_NUMBER, $this->customer->get(Customer::FIELD_PHONE_NUMBER)); + + $access = $this->model->getAccess(); + $access->create($this->model); + } + + private function setType(string $type): static + { + $this->model->set(GeneralApplication::FIELD_APPLICATION_TYPE, $type); + return $this; + } + + private function setMemo(array $attr): static + { + $memo = data_get($attr, GeneralApplication::FIELD_MEMO); + if ($memo) { + $this->model->set(GeneralApplication::FIELD_MEMO, $memo); + } + return $this; + } +} diff --git a/config/kintone.php b/config/kintone.php index 4b2d612..083790a 100644 --- a/config/kintone.php +++ b/config/kintone.php @@ -30,6 +30,7 @@ return [ ...App\Kintone\Models\ParkingRoom::setConfig(), ...App\Kintone\Models\SeasonTicketContract::setConfig(), ...App\Kintone\Models\PaymentPlan::setConfig(), + ...App\Kintone\Models\GeneralApplication::setConfig(), ], ]; diff --git a/routes/api.php b/routes/api.php index b4a4bb5..5062b53 100644 --- a/routes/api.php +++ b/routes/api.php @@ -20,3 +20,7 @@ RouteHelper::get('/me', App\Http\Controllers\Web\Auth\MeController::class); RouteHelper::get('/season-ticket-contracts', App\Http\Controllers\Web\SeasonTicketContract\SeasonTicketContractsController::class); RouteHelper::get('/season-ticket-contract/payment-plans', App\Http\Controllers\Web\SeasonTicketContract\PaymentPlansController::class); +RouteHelper::post('/season-ticket-contract/sticker-re-order', App\Http\Controllers\Web\SeasonTicketContract\StickerReOrderController::class); +RouteHelper::post('/season-ticket-contract/parking-certificate-order', App\Http\Controllers\Web\SeasonTicketContract\ParkingCertificateOrderController::class); +RouteHelper::post('/season-ticket-contract/termination-order', App\Http\Controllers\Web\SeasonTicketContract\TerminationOrderController::class); +RouteHelper::post('/season-ticket-contract/update-vehicle-info-order', App\Http\Controllers\Web\SeasonTicketContract\UpdateVehicleInfoOrderController::class); diff --git a/tests/Feature/Logic/GeneralApplicationManagerTest.php b/tests/Feature/Logic/GeneralApplicationManagerTest.php new file mode 100644 index 0000000..3386795 --- /dev/null +++ b/tests/Feature/Logic/GeneralApplicationManagerTest.php @@ -0,0 +1,31 @@ +find(8689); + + $manager = GeneralApplicationManager::instance(); + + $attr = [ + GeneralApplication::FIELD_TERMINATE_DATE => DateUtil::parse("2050/12/31"), + GeneralApplication::FIELD_MEMO => "test data\nです", + ]; + + $manager->forTerminate($attr) + ->setCustomer($customer) + ->register(); + + $this->assertTrue(true); + } +}