| @@ -3,6 +3,12 @@ | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract; | namespace App\Http\Controllers\Web\SeasonTicketContract; | ||||
| use App\Http\Controllers\Web\WebController; | use App\Http\Controllers\Web\WebController; | ||||
| use App\Kintone\Models\Customer; | |||||
| use App\Kintone\Models\Parking; | |||||
| use App\Kintone\Models\SeasonTicketContract; | |||||
| use App\Kintone\Models\SeasonTicketReOrderApplication; | |||||
| use App\Kintone\Models\StickerReOrderApplication; | |||||
| use App\Logic\GeneralApplicationManager; | |||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | use Illuminate\Http\Request; | ||||
| @@ -28,6 +34,25 @@ class StickerReOrderController extends WebController | |||||
| protected function run(Request $request): JsonResponse | protected function run(Request $request): JsonResponse | ||||
| { | { | ||||
| $param = $this->param; | |||||
| $parking = Parking::findByParkingName($param->parkingName); | |||||
| $customer = Customer::getSelf(); | |||||
| $seasonTicketContract = SeasonTicketContract::find($param->seasonTicketContractRecordNo); | |||||
| $application = new StickerReOrderApplication(); | |||||
| $manager = new GeneralApplicationManager($application); | |||||
| $manager | |||||
| ->setCustomer($customer) | |||||
| ->setSeasonTicketContract($seasonTicketContract) | |||||
| ->setParking($parking) | |||||
| ->makeApplication(); | |||||
| $application->reason = $param->reason; | |||||
| $application->memo = $param->memo; | |||||
| $application->save(); | |||||
| return $this->successResponse(); | return $this->successResponse(); | ||||
| } | } | ||||
| } | } | ||||
| @@ -3,10 +3,12 @@ | |||||
| namespace App\Http\Controllers\Web\SeasonTicketContract; | namespace App\Http\Controllers\Web\SeasonTicketContract; | ||||
| use App\Http\Controllers\Web\BaseParam; | use App\Http\Controllers\Web\BaseParam; | ||||
| use App\Kintone\Models\GeneralApplication; | |||||
| /** | /** | ||||
| * @property string $seasonTicketContractRecordNo | * @property string $seasonTicketContractRecordNo | ||||
| * @property string $parkingName | |||||
| * @property string $reason | |||||
| * @property string $memo | |||||
| */ | */ | ||||
| class StickerReOrderParams extends BaseParam | class StickerReOrderParams extends BaseParam | ||||
| { | { | ||||
| @@ -14,6 +16,9 @@ class StickerReOrderParams extends BaseParam | |||||
| { | { | ||||
| return [ | return [ | ||||
| 'season_ticket_contract_record_no' => $this->str(), | 'season_ticket_contract_record_no' => $this->str(), | ||||
| 'parking_name' => $this->str(), | |||||
| 'reason' => $this->str(), | |||||
| 'memo' => $this->str(true), | |||||
| ]; | ]; | ||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,30 @@ | |||||
| <?php | |||||
| namespace App\Kintone; | |||||
| use App\Features\InstanceAble; | |||||
| use LogicException; | |||||
| class KintoneAccessStore | |||||
| { | |||||
| use InstanceAble; | |||||
| private array $store = []; | |||||
| public function set(string $modelName, KintoneAccess $access) | |||||
| { | |||||
| $this->store[$modelName] = $access; | |||||
| } | |||||
| public function has(string $modelName): bool | |||||
| { | |||||
| return data_get($this->store, $modelName) !== null; | |||||
| } | |||||
| public function get(string $modelName): KintoneAccess | |||||
| { | |||||
| $accesss = data_get($this->store, $modelName); | |||||
| if ($accesss === null) { | |||||
| throw new LogicException(sprintf("KintoneAccessStore 未登録 %s", $modelName)); | |||||
| } | |||||
| return $accesss; | |||||
| } | |||||
| } | |||||
| @@ -6,6 +6,11 @@ use Illuminate\Support\Facades\Auth; | |||||
| /** | /** | ||||
| * アプリ名 顧客マスタ | * アプリ名 顧客マスタ | ||||
| * @property string $customerCode | |||||
| * @property string $customerName | |||||
| * @property string $customerNameKana | |||||
| * @property string $email | |||||
| * @property string $phone_number | |||||
| */ | */ | ||||
| class Customer extends KintoneModel | class Customer extends KintoneModel | ||||
| { | { | ||||
| @@ -2,43 +2,52 @@ | |||||
| namespace App\Kintone\Models; | namespace App\Kintone\Models; | ||||
| use App\Kintone\KintoneAccess; | |||||
| use Illuminate\Support\Carbon; | |||||
| /** | /** | ||||
| * アプリ名 各種申請 | * アプリ名 各種申請 | ||||
| * @property string $applicationType | |||||
| * @property Carbon $applicationDatetime | |||||
| * @property string $status | |||||
| * @property string $applicationNo | |||||
| * @property string $customerCode | |||||
| * @property string seasonTicketContractRecordNo | |||||
| * @property string parkingName | |||||
| */ | */ | ||||
| class GeneralApplication extends KintoneModel | |||||
| abstract class GeneralApplication extends KintoneModel | |||||
| { | { | ||||
| const CONFIG_KEY = "KINTONE_APP_GENERAL_APPLICATION"; | const CONFIG_KEY = "KINTONE_APP_GENERAL_APPLICATION"; | ||||
| const FIELD_APPLICATION_TYPE = "申込内容"; | |||||
| const FIELD_APPLICATIONJ_STATUS = "status"; | |||||
| const FIELD_SEASON_TICKET_CONTRACT_RECORD_NO = "契約番号"; | |||||
| const FIELD_CUSTOMER_NAME = "氏名"; | |||||
| const FIELD_CUSTOMER_NAME_KANA = "フリガナ"; | |||||
| const FIELD_CUSTOMER_EMAIL = "メールアドレス"; | |||||
| const FIELD_CUSTOMER_PHONE_NUMBER = "電話番号"; | |||||
| const FIELD_TERMINATE_DATE = "解約希望日"; | |||||
| const FIELD_VEHICLE_NO = "変更後車両番号"; | |||||
| const FIELD_REGISTER_NO = "変更後防犯登録番号"; | |||||
| const FIELD_MEMO = "備考"; | |||||
| const FIELD_APPLICATION_DATETIME = "受付日時"; | |||||
| const BASE_MODEL = GeneralApplication::class; | |||||
| const FIELD_APPLICATION_TYPE = "申請種別"; | |||||
| const FIELD_APPLICATION_DATETIME = "申請日時"; | |||||
| const FIELD_STATUS = "状況"; | |||||
| const FIELD_APPLICATION_NO = "申請番号"; | |||||
| const FIELD_CUSTOMER_CODE = "顧客コード"; | |||||
| const FIELD_SEASON_TICKET_CONTRACT_RECORD_NO = "契約情報"; | |||||
| const FIELD_PARKING_NAME = "駐車場名"; | |||||
| protected const FIELDS = [ | protected const FIELDS = [ | ||||
| ...parent::FIELDS, | ...parent::FIELDS, | ||||
| self::FIELD_APPLICATION_TYPE => FieldType::DROP_DOWN, | self::FIELD_APPLICATION_TYPE => 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, | self::FIELD_APPLICATION_DATETIME => FieldType::DATETIME, | ||||
| self::FIELD_STATUS => FieldType::DROP_DOWN, | |||||
| self::FIELD_APPLICATION_NO => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_CUSTOMER_CODE => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_SEASON_TICKET_CONTRACT_RECORD_NO => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_PARKING_NAME => FieldType::SINGLE_LINE_TEXT, | |||||
| ]; | ]; | ||||
| protected const FIELD_NAMES = [ | protected const FIELD_NAMES = [ | ||||
| ...parent::FIELD_NAMES, | ...parent::FIELD_NAMES, | ||||
| ]; | ]; | ||||
| protected const RELATIONS = [ | |||||
| SeasonTicketContract::class, | |||||
| Parking::class, | |||||
| Customer::class, | |||||
| ]; | |||||
| } | } | ||||
| @@ -6,10 +6,12 @@ use App\Exceptions\AppCommonException; | |||||
| use App\Exceptions\ConfigException; | use App\Exceptions\ConfigException; | ||||
| use App\Kintone\File; | use App\Kintone\File; | ||||
| use App\Kintone\KintoneAccess; | use App\Kintone\KintoneAccess; | ||||
| use App\Kintone\KintoneAccessStore; | |||||
| use App\Kintone\KintoneRecordQuery; | use App\Kintone\KintoneRecordQuery; | ||||
| use App\Util\DateUtil; | use App\Util\DateUtil; | ||||
| use Illuminate\Support\Arr; | use Illuminate\Support\Arr; | ||||
| use Illuminate\Support\Carbon; | use Illuminate\Support\Carbon; | ||||
| use Illuminate\Support\Str; | |||||
| use LogicException; | use LogicException; | ||||
| use stdClass; | use stdClass; | ||||
| @@ -17,6 +19,8 @@ abstract class KintoneModel | |||||
| { | { | ||||
| const CONFIG_KEY = ""; | const CONFIG_KEY = ""; | ||||
| const BASE_MODEL = null; | |||||
| static public function configKey(): string | static public function configKey(): string | ||||
| { | { | ||||
| if (!static::CONFIG_KEY) { | if (!static::CONFIG_KEY) { | ||||
| @@ -51,8 +55,21 @@ abstract class KintoneModel | |||||
| */ | */ | ||||
| static public function getAccess(): KintoneAccess | static public function getAccess(): KintoneAccess | ||||
| { | { | ||||
| $access = new KintoneAccess(static::class); | |||||
| $target = static::BASE_MODEL ?? static::class; | |||||
| $store = KintoneAccessStore::instance(); | |||||
| if ($store->has($target)) { | |||||
| return $store->get($target); | |||||
| } | |||||
| $access = new KintoneAccess($target); | |||||
| $access->setFields(array_keys(static::FIELDS)); | $access->setFields(array_keys(static::FIELDS)); | ||||
| foreach (static::RELATIONS as $relation) { | |||||
| $access->addAppToken($relation); | |||||
| } | |||||
| $store->set($target, $access); | |||||
| return $access; | return $access; | ||||
| } | } | ||||
| @@ -61,8 +78,26 @@ abstract class KintoneModel | |||||
| */ | */ | ||||
| static public function getQuery(): KintoneRecordQuery | static public function getQuery(): KintoneRecordQuery | ||||
| { | { | ||||
| return new KintoneRecordQuery(static::class); | |||||
| $target = static::BASE_MODEL ?? static::class; | |||||
| return new KintoneRecordQuery($target); | |||||
| } | |||||
| public static function find(string $recordId) | |||||
| { | |||||
| return static::getAccess()->find($recordId); | |||||
| } | |||||
| public static function getDropDownOptions(string $fieldCode): array | |||||
| { | |||||
| $ret = []; | |||||
| $properties = static::getAccess()->getAppFormFields(); | |||||
| $options = Arr::get($properties, sprintf("%s.options", $fieldCode)); | |||||
| $ret = Arr::pluck(Arr::sort($options, function ($option) { | |||||
| return data_get($option, "index"); | |||||
| }), "label"); | |||||
| return $ret; | |||||
| } | } | ||||
| protected ?string $recordId = null; | protected ?string $recordId = null; | ||||
| protected ?int $revision = null; | protected ?int $revision = null; | ||||
| @@ -78,6 +113,8 @@ abstract class KintoneModel | |||||
| protected const FIELD_NAMES = []; | protected const FIELD_NAMES = []; | ||||
| protected const RELATIONS = []; | |||||
| private array $changed = []; | private array $changed = []; | ||||
| public function __construct() | public function __construct() | ||||
| @@ -85,6 +122,27 @@ abstract class KintoneModel | |||||
| $this->data = new stdClass(); | $this->data = new stdClass(); | ||||
| } | } | ||||
| public function __get($name) | |||||
| { | |||||
| $field = "FIELD_" . Str::of($name)->snake()->upper()->toString(); | |||||
| $constantPath = sprintf("%s::%s", static::class, $field); | |||||
| if (defined($constantPath)) { | |||||
| return $this->get(constant($constantPath)); | |||||
| } else { | |||||
| throw new LogicException(sprintf("未定義のメンバアクセス %s %s", static::class, $field)); | |||||
| } | |||||
| } | |||||
| public function __set($name, $value) | |||||
| { | |||||
| $field = "FIELD_" . Str::of($name)->snake()->upper()->toString(); | |||||
| $constantPath = sprintf("%s::%s", static::class, $field); | |||||
| if (defined($constantPath)) { | |||||
| return $this->set(constant($constantPath), $value); | |||||
| } else { | |||||
| throw new LogicException(sprintf("未定義のメンバアクセス %s %s", static::class, $field)); | |||||
| } | |||||
| } | |||||
| public function set(string $fieldCode, $value) | public function set(string $fieldCode, $value) | ||||
| { | { | ||||
| $field = Arr::get(static::FIELDS, $fieldCode); | $field = Arr::get(static::FIELDS, $fieldCode); | ||||
| @@ -197,21 +255,7 @@ abstract class KintoneModel | |||||
| return $ret; | return $ret; | ||||
| } | } | ||||
| public static function getDropDownOptions(string $fieldCode): array | |||||
| { | |||||
| $ret = []; | |||||
| $properties = static::getAccess()->getAppFormFields(); | |||||
| $options = Arr::get($properties, sprintf("%s.options", $fieldCode)); | |||||
| $ret = Arr::pluck(Arr::sort($options, function ($option) { | |||||
| return data_get($option, "index"); | |||||
| }), "label"); | |||||
| // foreach ($options as $option) { | |||||
| // $index = data_get($option, "index"); | |||||
| // $label = data_get($option, "label"); | |||||
| // $ret[$index] = $label; | |||||
| // } | |||||
| return $ret; | |||||
| } | |||||
| /** | /** | ||||
| * 変更前データを現在データで上書きする | * 変更前データを現在データで上書きする | ||||
| @@ -308,6 +352,16 @@ abstract class KintoneModel | |||||
| return $this->createdAt; | return $this->createdAt; | ||||
| } | } | ||||
| public function save() | |||||
| { | |||||
| $access = static::getAccess(); | |||||
| if ($this->recordId === null) { | |||||
| $access->create($this); | |||||
| } else { | |||||
| $access->update($this); | |||||
| } | |||||
| } | |||||
| public function toArray($column = ['*']): array | public function toArray($column = ['*']): array | ||||
| { | { | ||||
| if ($this->recordId === null) { | if ($this->recordId === null) { | ||||
| @@ -4,8 +4,9 @@ namespace App\Kintone\Models; | |||||
| /** | /** | ||||
| * アプリ名 駐車場マスタ | * アプリ名 駐車場マスタ | ||||
| * @property string $parkingName | |||||
| */ | */ | ||||
| class Paking extends KintoneModel | |||||
| class Parking extends KintoneModel | |||||
| { | { | ||||
| const CONFIG_KEY = "KINTONE_APP_PARKING"; | const CONFIG_KEY = "KINTONE_APP_PARKING"; | ||||
| @@ -20,4 +21,9 @@ class Paking extends KintoneModel | |||||
| ...parent::FIELD_NAMES, | ...parent::FIELD_NAMES, | ||||
| self::FIELD_PARKING_NAME => 'parking_name', | self::FIELD_PARKING_NAME => 'parking_name', | ||||
| ]; | ]; | ||||
| static function findByParkingName(string $parkingName) | |||||
| { | |||||
| return static::getAccess()->first(static::getQuery()->where(static::FIELD_PARKING_NAME, $parkingName)); | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,32 @@ | |||||
| <?php | |||||
| namespace App\Kintone\Models; | |||||
| /** | |||||
| * アプリ名 各種申請 [駐車証明発行申請] | |||||
| */ | |||||
| class ParkingCertificateApplication extends GeneralApplication | |||||
| { | |||||
| const FIELD_PAYMENT_METHOD = "車庫証明発行申請_支払方法"; | |||||
| const FIELD_VEHICLE_NO = "車庫証明発行申請_車両番号"; | |||||
| const FIELD_CHASSIS_NO = "車庫証明発行申請_車体番号"; | |||||
| const FIELD_MAIL_NAME = "車庫証明発行申請_宛名"; | |||||
| const FIELD_MAIL_ZIP_CODE = "車庫証明発行申請_郵便番号"; | |||||
| const FIELD_MAIL_ADDRESS = "車庫証明発行申請_住所"; | |||||
| const FIELD_MEMO = "車庫証明発行申請_備考"; | |||||
| protected const FIELDS = [ | |||||
| ...parent::FIELDS, | |||||
| self::FIELD_PAYMENT_METHOD => FieldType::DROP_DOWN, | |||||
| self::FIELD_VEHICLE_NO => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_CHASSIS_NO => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_MAIL_NAME => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_MAIL_ZIP_CODE => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_MAIL_ADDRESS => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_MEMO => FieldType::MULTI_LINE_TEXT, | |||||
| ]; | |||||
| protected const FIELD_NAMES = [ | |||||
| ...parent::FIELD_NAMES, | |||||
| ]; | |||||
| } | |||||
| @@ -6,6 +6,7 @@ use LogicException; | |||||
| /** | /** | ||||
| * アプリ名 車室情報管理 | * アプリ名 車室情報管理 | ||||
| * @property string seasonTicketSeqNo | |||||
| */ | */ | ||||
| class SeasonTicketContract extends KintoneModel | class SeasonTicketContract extends KintoneModel | ||||
| { | { | ||||
| @@ -0,0 +1,24 @@ | |||||
| <?php | |||||
| namespace App\Kintone\Models; | |||||
| /** | |||||
| * アプリ名 各種申請 [定期券再発行申請] | |||||
| * @property string $reason | |||||
| * @property string $memo | |||||
| */ | |||||
| class SeasonTicketReOrderApplication extends GeneralApplication | |||||
| { | |||||
| const FIELD_REASON = "定期券再発行申請_再発行理由"; | |||||
| const FIELD_MEMO = "定期券再発行申請_備考"; | |||||
| protected const FIELDS = [ | |||||
| ...parent::FIELDS, | |||||
| self::FIELD_REASON => FieldType::MULTI_LINE_TEXT, | |||||
| self::FIELD_MEMO => FieldType::MULTI_LINE_TEXT, | |||||
| ]; | |||||
| protected const FIELD_NAMES = [ | |||||
| ...parent::FIELD_NAMES, | |||||
| ]; | |||||
| } | |||||
| @@ -0,0 +1,22 @@ | |||||
| <?php | |||||
| namespace App\Kintone\Models; | |||||
| /** | |||||
| * アプリ名 各種申請 [シール再発行申請] | |||||
| */ | |||||
| class StickerReOrderApplication extends GeneralApplication | |||||
| { | |||||
| const FIELD_REASON = "シール再発行申請_再発行理由"; | |||||
| const FIELD_MEMO = "シール再発行申請_備考"; | |||||
| protected const FIELDS = [ | |||||
| ...parent::FIELDS, | |||||
| self::FIELD_REASON => FieldType::MULTI_LINE_TEXT, | |||||
| self::FIELD_MEMO => FieldType::MULTI_LINE_TEXT, | |||||
| ]; | |||||
| protected const FIELD_NAMES = [ | |||||
| ...parent::FIELD_NAMES, | |||||
| ]; | |||||
| } | |||||
| @@ -0,0 +1,28 @@ | |||||
| <?php | |||||
| namespace App\Kintone\Models; | |||||
| /** | |||||
| * アプリ名 各種申請 [解約申請] | |||||
| */ | |||||
| class TerminateApplication extends GeneralApplication | |||||
| { | |||||
| const FIELD_TERMINATE_DATE = "解約申請_解約希望日"; | |||||
| const FIELD_REASON = "解約申請_解約理由"; | |||||
| const FIELD_REASON_DETAIL = "解約申請_解約理由_詳細"; | |||||
| const FIELD_OPINION = "解約申請_意見"; | |||||
| const FIELD_MEMO = "解約申請_備考"; | |||||
| protected const FIELDS = [ | |||||
| ...parent::FIELDS, | |||||
| self::FIELD_TERMINATE_DATE => FieldType::DATETIME, | |||||
| self::FIELD_REASON => FieldType::CHECK_BOX, | |||||
| self::FIELD_REASON_DETAIL => FieldType::MULTI_LINE_TEXT, | |||||
| self::FIELD_OPINION => FieldType::MULTI_LINE_TEXT, | |||||
| self::FIELD_MEMO => FieldType::MULTI_LINE_TEXT, | |||||
| ]; | |||||
| protected const FIELD_NAMES = [ | |||||
| ...parent::FIELD_NAMES, | |||||
| ]; | |||||
| } | |||||
| @@ -0,0 +1,36 @@ | |||||
| <?php | |||||
| namespace App\Kintone\Models; | |||||
| /** | |||||
| * アプリ名 各種申請 [利用者情報変更申請] | |||||
| */ | |||||
| class UserInfoUpdateApplication extends GeneralApplication | |||||
| { | |||||
| const FIELD_NAME_BEFORE = "利用者情報変更申請_変更前_氏名"; | |||||
| const FIELD_NAME_AFTER = "利用者情報変更申請_変更後_氏名"; | |||||
| const FIELD_ZIP_CODE_BEFORE = "利用者情報変更申請_変更前_郵便番号"; | |||||
| const FIELD_ZIP_CODE_AFTER = "利用者情報変更申請_変更後_郵便番号"; | |||||
| const FIELD_ADDRESS_BEFORE = "利用者情報変更申請_変更前_住所"; | |||||
| const FIELD_ADDRESS_AFTER = "利用者情報変更申請_変更後_住所"; | |||||
| const FIELD_PHONE_NO_BEFORE = "利用者情報変更申請_変更前_電話番号"; | |||||
| const FIELD_PHONE_NO_AFTER = "利用者情報変更申請_変更後_電話番号"; | |||||
| const FIELD_MEMO = "利用者情報変更申請_備考"; | |||||
| protected const FIELDS = [ | |||||
| ...parent::FIELDS, | |||||
| self::FIELD_NAME_BEFORE => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_NAME_BEFORE => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_ZIP_CODE_BEFORE => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_ZIP_CODE_AFTER => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_ADDRESS_BEFORE => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_ADDRESS_AFTER => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_PHONE_NO_BEFORE => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_PHONE_NO_AFTER => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_MEMO => FieldType::MULTI_LINE_TEXT, | |||||
| ]; | |||||
| protected const FIELD_NAMES = [ | |||||
| ...parent::FIELD_NAMES, | |||||
| ]; | |||||
| } | |||||
| @@ -0,0 +1,30 @@ | |||||
| <?php | |||||
| namespace App\Kintone\Models; | |||||
| /** | |||||
| * アプリ名 各種申請 [車両番号・防犯番号変更申請] | |||||
| */ | |||||
| class VehicleInfoUpdateApplication extends GeneralApplication | |||||
| { | |||||
| const FIELD_CHANGE_DATE = "車両番号_防犯番号変更申請_変更日"; | |||||
| const FIELD_VEHICLE_NO_BEFORE = "車両番号_防犯番号変更申請_変更前_車両番号"; | |||||
| const FIELD_VEHICLE_NO_AFTER = "車両番号_防犯番号変更申請_変更後_車両番号"; | |||||
| const FIELD_REGISTER_NO_BEFORE = "車両番号_防犯番号変更申請_変更前_防犯登録番号"; | |||||
| const FIELD_REGISTER_NO_AFTER = "車両番号_防犯番号変更申請_変更後_防犯登録番号"; | |||||
| const FIELD_MEMO = "車両番号_防犯番号変更申請_備考"; | |||||
| protected const FIELDS = [ | |||||
| ...parent::FIELDS, | |||||
| self::FIELD_CHANGE_DATE => FieldType::DATE, | |||||
| self::FIELD_VEHICLE_NO_BEFORE => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_VEHICLE_NO_AFTER => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_REGISTER_NO_BEFORE => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_REGISTER_NO_AFTER => FieldType::SINGLE_LINE_TEXT, | |||||
| self::FIELD_MEMO => FieldType::MULTI_LINE_TEXT, | |||||
| ]; | |||||
| protected const FIELD_NAMES = [ | |||||
| ...parent::FIELD_NAMES, | |||||
| ]; | |||||
| } | |||||
| @@ -2,80 +2,116 @@ | |||||
| namespace App\Logic; | namespace App\Logic; | ||||
| use App\Features\InstanceAble; | |||||
| use App\Kintone\Models\Customer; | use App\Kintone\Models\Customer; | ||||
| use App\Kintone\Models\GeneralApplication; | use App\Kintone\Models\GeneralApplication; | ||||
| use App\Kintone\Models\Parking; | |||||
| use App\Kintone\Models\ParkingCertificateApplication; | |||||
| use App\Kintone\Models\SeasonTicketContract; | |||||
| use App\Kintone\Models\SeasonTicketReOrderApplication; | |||||
| use App\Kintone\Models\StickerReOrderApplication; | |||||
| use App\Kintone\Models\TerminateApplication; | |||||
| use App\Kintone\Models\UserInfoUpdateApplication; | |||||
| use App\Kintone\Models\VehicleInfoUpdateApplication; | |||||
| use App\Util\DateUtil; | use App\Util\DateUtil; | ||||
| use Illuminate\Support\Carbon; | |||||
| use LogicException; | use LogicException; | ||||
| /** | |||||
| * @template T of GeneralApplication | |||||
| */ | |||||
| class GeneralApplicationManager | class GeneralApplicationManager | ||||
| { | { | ||||
| private ?Customer $customer = null; | |||||
| use InstanceAble; | |||||
| private ?SeasonTicketContract $seasonTicketContract = null; | |||||
| private Customer|null $customer = null; | |||||
| private ?Parking $parking = null; | |||||
| /** | |||||
| * @param T $model | |||||
| */ | |||||
| public function __construct(private GeneralApplication $model) | public function __construct(private GeneralApplication $model) | ||||
| { | { | ||||
| if ($model instanceof TerminateApplication) { | |||||
| $this->setType("解約申請"); | |||||
| return; | |||||
| } | |||||
| if ($model instanceof ParkingCertificateApplication) { | |||||
| $this->setType("車庫証明発行申請"); | |||||
| return; | |||||
| } | |||||
| if ($model instanceof StickerReOrderApplication) { | |||||
| $this->setType("シール再発行申請"); | |||||
| return; | |||||
| } | |||||
| if ($model instanceof SeasonTicketReOrderApplication) { | |||||
| $this->setType("定期券再発行申請"); | |||||
| return; | |||||
| } | |||||
| if ($model instanceof VehicleInfoUpdateApplication) { | |||||
| $this->setType("車両番号・防犯登録番号変更"); | |||||
| return; | |||||
| } | |||||
| if ($model instanceof UserInfoUpdateApplication) { | |||||
| $this->setType("利用者情報変更"); | |||||
| return; | |||||
| } | |||||
| if ($model instanceof UserInfoUpdateApplication) { | |||||
| $this->setType("振替頻度変更"); | |||||
| return; | |||||
| } | |||||
| } | } | ||||
| public function setCustomer(Customer $customer): static | public function setCustomer(Customer $customer): static | ||||
| { | { | ||||
| $this->customer = $customer; | $this->customer = $customer; | ||||
| return $this; | return $this; | ||||
| } | } | ||||
| public function forTerminate(array $attr): static | |||||
| public function setSeasonTicketContract(SeasonTicketContract $seasonTicketContract): 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); | |||||
| $this->seasonTicketContract = $seasonTicketContract; | |||||
| return $this; | |||||
| } | } | ||||
| public function forParkingCertificate(array $attr = []): static | |||||
| public function setParking(Parking $parking): static | |||||
| { | { | ||||
| return $this->setType("車庫証明発行申請") | |||||
| ->setMemo($attr); | |||||
| $this->parking = $parking; | |||||
| return $this; | |||||
| } | } | ||||
| public function register() | |||||
| /** | |||||
| * @return T | |||||
| */ | |||||
| public function makeApplication() | |||||
| { | { | ||||
| $this->model->applicationDatetime = DateUtil::now(); | |||||
| $this->model->status = "新規登録"; | |||||
| $this->model->applicationNo = $this->getApplicationNo(); | |||||
| if ($this->customer === null) { | if ($this->customer === null) { | ||||
| throw new LogicException("顧客NULL"); | |||||
| throw new LogicException("顧客未設定のため失敗"); | |||||
| } | } | ||||
| if (!$this->model->getStr(GeneralApplication::FIELD_APPLICATION_TYPE)) { | |||||
| throw new LogicException("申請タイプ未設定"); | |||||
| $this->model->customerCode = $this->customer->customerCode; | |||||
| if ($this->seasonTicketContract !== null) { | |||||
| $this->model->seasonTicketContractRecordNo = $this->seasonTicketContract->seasonTicketSeqNo; | |||||
| } | } | ||||
| $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)); | |||||
| if ($this->parking !== null) { | |||||
| $this->model->parkingName = $this->parking->parkingName; | |||||
| } | |||||
| $access = $this->model->getAccess(); | |||||
| $access->create($this->model); | |||||
| return $this->model; | |||||
| } | } | ||||
| private function setType(string $type): static | private function setType(string $type): static | ||||
| { | { | ||||
| $this->model->set(GeneralApplication::FIELD_APPLICATION_TYPE, $type); | |||||
| $this->model->applicationType = $type; | |||||
| return $this; | return $this; | ||||
| } | } | ||||
| private function setMemo(array $attr): static | |||||
| private function getApplicationNo(): string | |||||
| { | { | ||||
| $memo = data_get($attr, GeneralApplication::FIELD_MEMO); | |||||
| if ($memo) { | |||||
| $this->model->set(GeneralApplication::FIELD_MEMO, $memo); | |||||
| } | |||||
| return $this; | |||||
| return sprintf("%s-%06d", DateUtil::now()->format('Ymd'), rand(1, 999999)); | |||||
| } | } | ||||
| } | } | ||||
| @@ -44,5 +44,8 @@ class AppServiceProvider extends ServiceProvider | |||||
| // DB関連 | // DB関連 | ||||
| $this->app->singleton(\App\Util\DBUtil::class); | $this->app->singleton(\App\Util\DBUtil::class); | ||||
| // KINTONE関連 | |||||
| $this->app->singleton(\App\Kintone\KintoneAccessStore::class); | |||||
| } | } | ||||
| } | } | ||||