| @@ -61,4 +61,6 @@ SAIL_XDEBUG_MODE=debug,develop | |||||
| SMS_PROVIDER=log | SMS_PROVIDER=log | ||||
| SMS_FOURS_MESSAGE_USER=null | SMS_FOURS_MESSAGE_USER=null | ||||
| SMS_FOURS_MESSAGE_PASSWORD=null | |||||
| SMS_FOURS_MESSAGE_PASSWORD=null | |||||
| CUSTOM_HELLOTECHNO_API_HOST="http://localhost" | |||||
| @@ -0,0 +1,9 @@ | |||||
| <?php | |||||
| namespace App\Codes; | |||||
| enum Custom: string | |||||
| { | |||||
| case NONE = "NONE"; | |||||
| case HELLO_TECHNO = "HELLO_TECHNO"; | |||||
| } | |||||
| @@ -0,0 +1,15 @@ | |||||
| <?php | |||||
| namespace App\Codes; | |||||
| /** | |||||
| * 領収証発行依頼ステータス | |||||
| */ | |||||
| enum ReceiptIssuingOrderType: string | |||||
| { | |||||
| case NONE = ""; | |||||
| case NORMAL = "NORMAL"; | |||||
| case HT_CUSTOM_PARKING_RECEIPT = "HT_CUSTOM_PARKING_RECEIPT"; | |||||
| } | |||||
| @@ -1,18 +1,17 @@ | |||||
| <?php | <?php | ||||
| namespace App\Http\Controllers\Web\Login; | |||||
| namespace App\Http\Controllers\Web\Auth; | |||||
| use App\Codes\UserRole; | |||||
| use App\Http\Controllers\Web\WebController; | use App\Http\Controllers\Web\WebController; | ||||
| use App\Models\User; | use App\Models\User; | ||||
| use App\Repositories\MeRepository; | |||||
| use Illuminate\Foundation\Auth\AuthenticatesUsers; | |||||
| use Illuminate\Http\JsonResponse; | use Illuminate\Http\JsonResponse; | ||||
| use Illuminate\Http\Request; | use Illuminate\Http\Request; | ||||
| use Illuminate\Support\Facades\Auth; | use Illuminate\Support\Facades\Auth; | ||||
| class LoginController extends WebController | class LoginController extends WebController | ||||
| { | { | ||||
| use Me; | |||||
| public function name(): string | public function name(): string | ||||
| { | { | ||||
| return "ログイン"; | return "ログイン"; | ||||
| @@ -23,23 +22,15 @@ class LoginController extends WebController | |||||
| return "ログインを行う"; | return "ログインを行う"; | ||||
| } | } | ||||
| use AuthenticatesUsers; | |||||
| public function __construct(LoginParam $param) | |||||
| { | |||||
| $this->param = $param; | |||||
| } | |||||
| public function param(): LoginParam | |||||
| public function __construct(protected LoginParam $param) | |||||
| { | { | ||||
| return $this->param; | |||||
| } | } | ||||
| protected function run(Request $request): JsonResponse | protected function run(Request $request): JsonResponse | ||||
| { | { | ||||
| // 取得したユーザ情報を登録しログインを行う | // 取得したユーザ情報を登録しログインを行う | ||||
| $param = $this->param(); | |||||
| $param = $this->param; | |||||
| $user = User::whereEmail($param->email)->first(); | $user = User::whereEmail($param->email)->first(); | ||||
| if ($user === null) { | if ($user === null) { | ||||
| @@ -47,15 +38,17 @@ class LoginController extends WebController | |||||
| } | } | ||||
| if (Auth::attempt([ | if (Auth::attempt([ | ||||
| $this->username() => $param->email, | |||||
| 'email' => $param->email, | |||||
| 'password' => $param->password, | 'password' => $param->password, | ||||
| ])) { | ])) { | ||||
| $user = Auth::user(); | |||||
| $me = $this->me(); | |||||
| return $this->successResponse(); | |||||
| } else { | |||||
| return $this->failedResponse([], '認証失敗'); | |||||
| if ($me !== null) { | |||||
| return $this->successResponse($me); | |||||
| } | |||||
| } | } | ||||
| return $this->failedResponse([], '認証失敗'); | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,6 +1,6 @@ | |||||
| <?php | <?php | ||||
| namespace App\Http\Controllers\Web\Login; | |||||
| namespace App\Http\Controllers\Web\Auth; | |||||
| use App\Http\Controllers\Web\BaseParam; | use App\Http\Controllers\Web\BaseParam; | ||||
| @@ -0,0 +1,32 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\Auth; | |||||
| use App\Http\Controllers\Web\Auth\LogoutParam; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| use Illuminate\Support\Facades\Auth; | |||||
| class LogoutController extends WebController | |||||
| { | |||||
| public function name(): string | |||||
| { | |||||
| return "ログアウト"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "ログアウトを行う"; | |||||
| } | |||||
| public function __construct(protected LogoutParam $param) | |||||
| { | |||||
| } | |||||
| protected function run(Request $request): JsonResponse | |||||
| { | |||||
| Auth::logout(); | |||||
| return $this->successResponse(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,13 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\Auth; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| class LogoutParam extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return []; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\Auth; | |||||
| use App\Models\User; | |||||
| use App\Codes\UserRole; | |||||
| use Illuminate\Support\Facades\Auth; | |||||
| trait Me | |||||
| { | |||||
| protected function me() | |||||
| { | |||||
| if (Auth::check()) { | |||||
| $user = Auth::user()->toArray(); | |||||
| return array_intersect_key($user, array_flip([ | |||||
| User::COL_NAME_ID, | |||||
| User::COL_NAME_CONTRACT_ID, | |||||
| User::COL_NAME_ROLE, | |||||
| ])); | |||||
| } | |||||
| return null; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,50 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\Auth; | |||||
| use App\Http\Controllers\Web\IParam; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use App\Models\User; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| use Illuminate\Support\Facades\Auth; | |||||
| class MeController extends WebController | |||||
| { | |||||
| use Me; | |||||
| public function name(): string | |||||
| { | |||||
| return "自身参照"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "自身情報を参照する"; | |||||
| } | |||||
| public function __construct(protected MeParam $param) | |||||
| { | |||||
| } | |||||
| protected function run(Request $request): JsonResponse | |||||
| { | |||||
| $me = $this->me(); | |||||
| if ($me !== null) { | |||||
| return $this->successResponse($me); | |||||
| } | |||||
| return $this->failedResponse(); | |||||
| // if (Auth::check()) { | |||||
| // $user = Auth::user(); | |||||
| // $ret = $user->get([ | |||||
| // User::COL_NAME_CONTRACT_ID, | |||||
| // User::COL_NAME_ROLE, | |||||
| // ]); | |||||
| // } else { | |||||
| // } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,13 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\Auth; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| class MeParam extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return []; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,73 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||||
| use App\Codes\UserRole; | |||||
| use App\Http\Controllers\Web\IParam; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use App\Logic\ReceiptIssuingOrder\Custom\HelloTechno\CreateManager; | |||||
| use App\Models\ReceiptIssuingOrder as Order; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| use Illuminate\Support\Facades\Auth; | |||||
| class CreateReceiptIssuingOrderController extends WebController | |||||
| { | |||||
| public function name(): string | |||||
| { | |||||
| return "[HelloTechno専用]領収証発行依頼作成"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "[HelloTechno専用]領収証発行依頼を作成する"; | |||||
| } | |||||
| public function __construct( | |||||
| protected CreateReceiptIssuingOrderParam $param, | |||||
| private CreateManager $manager | |||||
| ) { | |||||
| $this->middleware('auth:sanctum'); | |||||
| $this->roleAllow(UserRole::NORMAL_ADMIN); | |||||
| } | |||||
| protected function getParam(): IParam | |||||
| { | |||||
| return $this->param; | |||||
| } | |||||
| protected function run(Request $request): JsonResponse | |||||
| { | |||||
| $param = $this->param; | |||||
| // TODO 顧客情報取得 | |||||
| // TODO 駐車場情報取得 | |||||
| $orderData = [ | |||||
| ...$param->toArray(), | |||||
| Order::COL_NAME_HANDLER_ID => Auth::id(), | |||||
| Order::COL_NAME_SUMMARY_KEY1 => $param->customerCode, | |||||
| Order::COL_NAME_SUMMARY_KEY2 => $param->parkingManagementCode, | |||||
| Order::COL_NAME_RECEIPT_PURPOSE => "駐車領収証", | |||||
| Order::COL_NAME_RECEIPT_INVOICE_NO => "##TODO インボイス登録番号##", | |||||
| Order::COL_NAME_RECEIPT_PURPOSE => "駐車料金", | |||||
| Order::COL_NAME_RECEIPT_ISSUER => "##TODO 発行者名##", | |||||
| Order::COL_NAME_RECEIPT_SHOP_NAME => "##TODO 駐車場名##", | |||||
| Order::COL_NAME_RECEIPT_PURPOSE => "駐車料金", | |||||
| Order::COL_NAME_MEMO => "駐車料金", | |||||
| ]; | |||||
| logger($orderData); | |||||
| $messages = $this->manager->init() | |||||
| ->fill($orderData) | |||||
| ->create(); | |||||
| if (count($messages) !== 0) { | |||||
| return $this->failedResponse([], $messages); | |||||
| } | |||||
| return $this->successResponse(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,38 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| use App\Models\ReceiptIssuingOrder; | |||||
| use App\Models\ReceiptIssuingHTParkingCustomOrder as HT; | |||||
| use App\Rules\PhoneNumber; | |||||
| use Carbon\Carbon; | |||||
| /** | |||||
| * @property string $customerCode | |||||
| * @property string $parkingManagementCode | |||||
| * @property int $adjustSeqNo | |||||
| * @property string $receiptName | |||||
| * @property Carbon $receiptUseDatetime | |||||
| * @property int $receiptAmount | |||||
| * @property ?string $memo | |||||
| * @property string $smsPhoneNumber | |||||
| */ | |||||
| class CreateReceiptIssuingOrderParam extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return [ | |||||
| HT::COL_NAME_CUSTOMER_CODE => $this->str(), | |||||
| HT::COL_NAME_PARKING_MANAGEMENT_CODE => $this->str(), | |||||
| HT::COL_NAME_ADJUST_SEQ_NO => $this->numeric(true), | |||||
| ReceiptIssuingOrder::COL_NAME_RECEIPT_USE_DATETIME => $this->date(), | |||||
| ReceiptIssuingOrder::COL_NAME_RECEIPT_NAME => $this->str(), | |||||
| ReceiptIssuingOrder::COL_NAME_RECEIPT_AMOUNT => $this->numeric(['min:0', 'max:999999']), | |||||
| ReceiptIssuingOrder::COL_NAME_MEMO => $this->text(true), | |||||
| ReceiptIssuingOrder::COL_NAME_SMS_PHONE_NUMBER => $this->str([new PhoneNumber()]), | |||||
| ]; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,46 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||||
| use App\Codes\Custom; | |||||
| use App\Codes\UserRole; | |||||
| use App\Http\Controllers\Web\IParam; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use App\Util\Custom\HelloTechno\API; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| class CustomersController extends WebController | |||||
| { | |||||
| public function name(): string | |||||
| { | |||||
| return "[HelloTechno専用]顧客情報取得"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "[HelloTechno専用]顧客情報を取得する"; | |||||
| } | |||||
| public function __construct( | |||||
| protected CustomersParam $param, | |||||
| ) { | |||||
| $this->middleware('auth:sanctum'); | |||||
| $this->roleAllow(UserRole::NORMAL_ADMIN); | |||||
| $this->customAllow = [Custom::HELLO_TECHNO]; | |||||
| } | |||||
| protected function getParam(): IParam | |||||
| { | |||||
| return $this->param; | |||||
| } | |||||
| protected function run(Request $request): JsonResponse | |||||
| { | |||||
| $param = $this->param; | |||||
| $list = API::getCustomers($param->customerCode); | |||||
| return $this->successResponse(['records' => $list]); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,19 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| /** | |||||
| * @property ?string $customerCode | |||||
| */ | |||||
| class CustomersParam extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return [ | |||||
| 'customer_code' => $this->str(true), | |||||
| ]; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,49 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||||
| use App\Codes\Custom; | |||||
| use App\Codes\UserRole; | |||||
| use App\Http\Controllers\Web\IParam; | |||||
| use App\Http\Controllers\Web\WebController; | |||||
| use App\Logic\ReceiptIssuingOrder\CreateManager; | |||||
| use App\Util\Custom\HelloTechno\API; | |||||
| use Illuminate\Http\JsonResponse; | |||||
| use Illuminate\Http\Request; | |||||
| use Illuminate\Support\Facades\Http; | |||||
| use Illuminate\Support\Facades\Log; | |||||
| class ParkingsController extends WebController | |||||
| { | |||||
| public function name(): string | |||||
| { | |||||
| return "[HelloTechno専用]駐車場情報取得"; | |||||
| } | |||||
| public function description(): string | |||||
| { | |||||
| return "[HelloTechno専用]駐車場情報を取得する"; | |||||
| } | |||||
| public function __construct( | |||||
| protected ParkingsParam $param, | |||||
| ) { | |||||
| $this->middleware('auth:sanctum'); | |||||
| $this->roleAllow(UserRole::NORMAL_ADMIN); | |||||
| $this->customAllow = [Custom::HELLO_TECHNO]; | |||||
| } | |||||
| protected function getParam(): IParam | |||||
| { | |||||
| return $this->param; | |||||
| } | |||||
| protected function run(Request $request): JsonResponse | |||||
| { | |||||
| $param = $this->param; | |||||
| $list = API::getParkings($param->customerCode, $param->parkingManagementCode); | |||||
| return $this->successResponse(['records' => $list]); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,20 @@ | |||||
| <?php | |||||
| namespace App\Http\Controllers\Web\Custom\HelloTechno; | |||||
| use App\Http\Controllers\Web\BaseParam; | |||||
| /** | |||||
| * @property string $customerCode | |||||
| * @property ?string $parkingManagementCode | |||||
| */ | |||||
| class ParkingsParam extends BaseParam | |||||
| { | |||||
| public function rules(): array | |||||
| { | |||||
| return [ | |||||
| 'customer_code' => $this->str(), | |||||
| 'parking_management_code' => $this->str(true) | |||||
| ]; | |||||
| } | |||||
| } | |||||
| @@ -84,7 +84,10 @@ abstract class WebController extends BaseController | |||||
| /** | /** | ||||
| * パラメータオブジェクト | * パラメータオブジェクト | ||||
| */ | */ | ||||
| abstract protected function getParam(): IParam; | |||||
| protected function getParam(): IParam | |||||
| { | |||||
| return $this->param; | |||||
| } | |||||
| /** | /** | ||||
| @@ -281,6 +284,7 @@ abstract class WebController extends BaseController | |||||
| // 以下 認可関係 | // 以下 認可関係 | ||||
| protected array|null $roleAllow = null; | protected array|null $roleAllow = null; | ||||
| protected array|null $roleDisallow = null; | protected array|null $roleDisallow = null; | ||||
| protected array|null $customAllow = null; | |||||
| protected function roleAllow(UserRole $role) | protected function roleAllow(UserRole $role) | ||||
| { | { | ||||
| @@ -314,7 +318,33 @@ abstract class WebController extends BaseController | |||||
| if (is_array($this->roleDisallow) && in_array($role, $this->roleDisallow)) { | if (is_array($this->roleDisallow) && in_array($role, $this->roleDisallow)) { | ||||
| return false; | return false; | ||||
| } | } | ||||
| return true; | |||||
| return $this->canCustomAccess(); | |||||
| } | |||||
| public function canCustomAccess(): bool | |||||
| { | |||||
| if (Auth::user()->role === UserRole::SUPER_ADMIN) { | |||||
| return true; | |||||
| } | |||||
| if ($this->customAllow === null) { | |||||
| return true; | |||||
| } | |||||
| $myCustoms = Auth::user()->contract->custom(); | |||||
| foreach ($this->customAllow as $targetCustom) { | |||||
| logger(['myCustoms' => $myCustoms, 'target' => $targetCustom]); | |||||
| if (in_array($targetCustom, $myCustoms, true)) { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } | } | ||||
| // 返却用データの登録 | // 返却用データの登録 | ||||
| @@ -27,6 +27,11 @@ class CreateManager extends ReceiptIssuingOrderManager | |||||
| return $this; | return $this; | ||||
| } | } | ||||
| public function id(): string | |||||
| { | |||||
| return $this->order->id ?? ""; | |||||
| } | |||||
| public function fill(array $attr) | public function fill(array $attr) | ||||
| { | { | ||||
| $this->order->fill($attr); | $this->order->fill($attr); | ||||
| @@ -0,0 +1,50 @@ | |||||
| <?php | |||||
| namespace App\Logic\ReceiptIssuingOrder\Custom\HelloTechno; | |||||
| use App\Codes\ReceiptIssuingOrderStatus; | |||||
| use App\Codes\SMSSendPurpose; | |||||
| use App\Logic\ReceiptIssuingOrder\CreateManager as BaseManager; | |||||
| use App\Logic\SMS\SMSManager; | |||||
| use App\Models\ReceiptIssuingHTParkingCustomOrder; | |||||
| use App\Models\ReceiptIssuingOrder; | |||||
| use Illuminate\Support\Facades\View; | |||||
| use LogicException; | |||||
| class CreateManager | |||||
| { | |||||
| public function __construct( | |||||
| protected BaseManager $manager, | |||||
| private ReceiptIssuingHTParkingCustomOrder $customOrder, | |||||
| ) { | |||||
| } | |||||
| public function init(): static | |||||
| { | |||||
| $this->manager->init(); | |||||
| return $this; | |||||
| } | |||||
| public function fill(array $attr): static | |||||
| { | |||||
| $this->manager->fill($attr); | |||||
| $this->customOrder->fill($attr); | |||||
| return $this; | |||||
| } | |||||
| public function create(): array | |||||
| { | |||||
| $messages = $this->manager->create(); | |||||
| if (count($messages) !== 0) { | |||||
| return $messages; | |||||
| } | |||||
| $this->customOrder->setReceiptIssuingOrder($this->manager->id()); | |||||
| $this->customOrder->save(); | |||||
| return []; | |||||
| } | |||||
| } | |||||
| @@ -48,8 +48,8 @@ class FourSMessageManager implements SMSManager | |||||
| $order->receipt_issuing_order_id = $receiptIssuingOrder->id; | $order->receipt_issuing_order_id = $receiptIssuingOrder->id; | ||||
| $order->contract_id = $receiptIssuingOrder->contract_id; | $order->contract_id = $receiptIssuingOrder->contract_id; | ||||
| $order->phone_number = $receiptIssuingOrder->sms_phone_number; | $order->phone_number = $receiptIssuingOrder->sms_phone_number; | ||||
| $order->sumamry_key1 = $receiptIssuingOrder->sumamry_key1; | |||||
| $order->sumamry_key2 = $receiptIssuingOrder->sumamry_key2; | |||||
| $order->summary_key1 = $receiptIssuingOrder->summary_key1; | |||||
| $order->summary_key2 = $receiptIssuingOrder->summary_key2; | |||||
| $order->purpose = $purpose; | $order->purpose = $purpose; | ||||
| $order->content = $contents; | $order->content = $contents; | ||||
| @@ -21,8 +21,8 @@ class LogManager implements SMSManager | |||||
| $order->receipt_issuing_order_id = $receiptIssuingOrder->id; | $order->receipt_issuing_order_id = $receiptIssuingOrder->id; | ||||
| $order->contract_id = $receiptIssuingOrder->contract_id; | $order->contract_id = $receiptIssuingOrder->contract_id; | ||||
| $order->phone_number = $receiptIssuingOrder->sms_phone_number; | $order->phone_number = $receiptIssuingOrder->sms_phone_number; | ||||
| $order->sumamry_key1 = $receiptIssuingOrder->sumamry_key1; | |||||
| $order->sumamry_key2 = $receiptIssuingOrder->sumamry_key2; | |||||
| $order->summary_key1 = $receiptIssuingOrder->summary_key1; | |||||
| $order->summary_key2 = $receiptIssuingOrder->summary_key2; | |||||
| $order->purpose = $purpose; | $order->purpose = $purpose; | ||||
| $order->content = $contents; | $order->content = $contents; | ||||
| @@ -9,7 +9,9 @@ use App\Models\Feature\IModelFeature; | |||||
| use Illuminate\Database\Eloquent\Factories\HasFactory; | use Illuminate\Database\Eloquent\Factories\HasFactory; | ||||
| use Illuminate\Database\Eloquent\Model; | use Illuminate\Database\Eloquent\Model; | ||||
| use Illuminate\Database\Query\Builder; | use Illuminate\Database\Query\Builder; | ||||
| use Illuminate\Support\Arr; | |||||
| use Illuminate\Support\Facades\DB; | use Illuminate\Support\Facades\DB; | ||||
| use Illuminate\Support\Str; | |||||
| abstract class BaseModel extends Model implements IModelFeature | abstract class BaseModel extends Model implements IModelFeature | ||||
| { | { | ||||
| @@ -41,6 +43,17 @@ abstract class BaseModel extends Model implements IModelFeature | |||||
| return (new static)->getTable(); | return (new static)->getTable(); | ||||
| } | } | ||||
| public static function hasColumn(string $columnName): bool | |||||
| { | |||||
| $target = sprintf("%s::COL_NAME_%s", static::class, Str::upper($columnName)); | |||||
| $ret = defined($target); | |||||
| if (!$ret) { | |||||
| logger(sprintf("does not have column [%s] on [%s] [%s]", Str::upper($columnName), static::getTableName(), $target)); | |||||
| } | |||||
| return $ret; | |||||
| } | |||||
| public function copy(IModelFeature $from): static | public function copy(IModelFeature $from): static | ||||
| { | { | ||||
| $data = $from->getAttributeKeys(); | $data = $from->getAttributeKeys(); | ||||
| @@ -66,4 +79,15 @@ abstract class BaseModel extends Model implements IModelFeature | |||||
| 'updating' => UpdatingEvent::class, | 'updating' => UpdatingEvent::class, | ||||
| 'deleted' => DeletedEvent::class, | 'deleted' => DeletedEvent::class, | ||||
| ]; | ]; | ||||
| // カラムが存在する項目のみfillするようオーバーライド | |||||
| public function fill(array $atr) | |||||
| { | |||||
| $filterd = array_filter($atr, function ($value, $key) { | |||||
| return static::hasColumn($key); | |||||
| }, ARRAY_FILTER_USE_BOTH); | |||||
| return parent::fill($filterd); | |||||
| } | |||||
| } | } | ||||
| @@ -3,6 +3,7 @@ | |||||
| namespace App\Models; | namespace App\Models; | ||||
| use Illuminate\Support\Str; | use Illuminate\Support\Str; | ||||
| use App\Codes\Custom; | |||||
| class Contract extends AppModel | class Contract extends AppModel | ||||
| { | { | ||||
| @@ -20,11 +21,24 @@ class Contract extends AppModel | |||||
| return in_array($target, $this->custom(), true); | return in_array($target, $this->custom(), true); | ||||
| } | } | ||||
| /** | |||||
| * @return Custom[] | |||||
| */ | |||||
| public function custom(): array | public function custom(): array | ||||
| { | { | ||||
| $custom = data_get($this, self::COL_NAME_CUSTOM); | $custom = data_get($this, self::COL_NAME_CUSTOM); | ||||
| if ($custom) { | if ($custom) { | ||||
| return explode(',', $custom); | |||||
| $strList = explode(',', $custom); | |||||
| $ret = []; | |||||
| foreach ($strList as $str) { | |||||
| $c = Custom::tryFrom($str); | |||||
| if ($c !== null) { | |||||
| $ret[] = $c; | |||||
| } | |||||
| } | |||||
| return $ret; | |||||
| } else { | } else { | ||||
| return []; | return []; | ||||
| } | } | ||||
| @@ -8,6 +8,10 @@ class ReceiptIssuingHTParkingCustomOrder extends AppModel | |||||
| { | { | ||||
| use ReceiptIssuingOrderFeature; | use ReceiptIssuingOrderFeature; | ||||
| const COL_NAME_CUSTOMER_CODE = "customer_code"; | |||||
| const COL_NAME_PARKING_MANAGEMENT_CODE = "parking_management_code"; | |||||
| const COL_NAME_ADJUST_SEQ_NO = "adjust_seq_no"; | |||||
| public function getModelName(): string | public function getModelName(): string | ||||
| { | { | ||||
| return "領収証発行依頼(HT駐車場カスタム)"; | return "領収証発行依頼(HT駐車場カスタム)"; | ||||
| @@ -12,8 +12,8 @@ class ReceiptIssuingOrder extends AppModel | |||||
| const COL_NAME_HANDLER_ID = "handler_id"; | const COL_NAME_HANDLER_ID = "handler_id"; | ||||
| const COL_NAME_ORDER_DATETIME = "order_datetime"; | const COL_NAME_ORDER_DATETIME = "order_datetime"; | ||||
| const COL_NAME_STATUS = "status"; | const COL_NAME_STATUS = "status"; | ||||
| const COL_NAME_SUMMARY_KEY1 = "sumamry_key1"; | |||||
| const COL_NAME_SUMMARY_KEY2 = "sumamry_key2"; | |||||
| const COL_NAME_SUMMARY_KEY1 = "summary_key1"; | |||||
| const COL_NAME_SUMMARY_KEY2 = "summary_key2"; | |||||
| const COL_NAME_ACCESS_TOKEN = "access_token"; | const COL_NAME_ACCESS_TOKEN = "access_token"; | ||||
| const COL_NAME_ACCESS_TOKEN_EXPIRES_AT = "access_token_expires_at"; | const COL_NAME_ACCESS_TOKEN_EXPIRES_AT = "access_token_expires_at"; | ||||
| const COL_NAME_SMS_PHONE_NUMBER = "sms_phone_number"; | const COL_NAME_SMS_PHONE_NUMBER = "sms_phone_number"; | ||||
| @@ -22,6 +22,7 @@ class ReceiptIssuingOrder extends AppModel | |||||
| const COL_NAME_RECEIPT_USE_DATETIME = "receipt_use_datetime"; | const COL_NAME_RECEIPT_USE_DATETIME = "receipt_use_datetime"; | ||||
| const COL_NAME_RECEIPT_SHOP_NAME = "receipt_shop_name"; | const COL_NAME_RECEIPT_SHOP_NAME = "receipt_shop_name"; | ||||
| const COL_NAME_RECEIPT_ISSUER = "receipt_issuer"; | const COL_NAME_RECEIPT_ISSUER = "receipt_issuer"; | ||||
| const COL_NAME_RECEIPT_NAME = "receipt_name"; | |||||
| const COL_NAME_RECEIPT_PURPOSE = "receipt_purpose"; | const COL_NAME_RECEIPT_PURPOSE = "receipt_purpose"; | ||||
| const COL_NAME_RECEIPT_INVOICE_NO = "receipt_invoice_no"; | const COL_NAME_RECEIPT_INVOICE_NO = "receipt_invoice_no"; | ||||
| const COL_NAME_RECEIPT_AMOUNT = "receipt_amount"; | const COL_NAME_RECEIPT_AMOUNT = "receipt_amount"; | ||||
| @@ -19,22 +19,9 @@ class User extends Authenticatable implements IModelFeature | |||||
| { | { | ||||
| use HasApiTokens, HasFactory, Notifiable, HasUuids, ContractFeature; | use HasApiTokens, HasFactory, Notifiable, HasUuids, ContractFeature; | ||||
| const COL_NAME_ID = 'id'; | |||||
| const COL_NAME_ROLE = 'role'; | const COL_NAME_ROLE = 'role'; | ||||
| // public function __construct(...$params) | |||||
| // { | |||||
| // $this->dispatchesEvents = [ | |||||
| // 'created' => CreatedListener::class, | |||||
| // 'updating' => UpdatingListener::class, | |||||
| // 'deleting' => DeletingListener::class, | |||||
| // ]; | |||||
| // protected $dispatchesEvents = [ | |||||
| // 'created' => CreatedEvent::class, | |||||
| // 'updating' => UpdatingEvent::class, | |||||
| // 'deleted' => DeletedEvent::class, | |||||
| // ]; | |||||
| // parent::__construct(...$params); | |||||
| // } | |||||
| const COL_NAME_EMAIL = 'email'; | |||||
| /** | /** | ||||
| * The attributes that should be hidden for serialization. | * The attributes that should be hidden for serialization. | ||||
| @@ -0,0 +1,86 @@ | |||||
| <?php | |||||
| namespace App\Util\Custom\HelloTechno; | |||||
| use App\Exceptions\AppCommonException; | |||||
| use Illuminate\Http\Client\Response; | |||||
| use Illuminate\Support\Facades\Http; | |||||
| use Illuminate\Support\Facades\Log; | |||||
| class API | |||||
| { | |||||
| private const RESULT_CODE = 'result_code'; | |||||
| private const RESULT_CODE_SUCCESS = 'SUCCESS'; | |||||
| private const FIELD_DATA = 'data'; | |||||
| private const URL_CUSTOMERS = 'customers'; | |||||
| private const URL_PARKINGS = 'parkings'; | |||||
| private const URL_ADJUST_DATA = 'adjust-data'; | |||||
| private const CONFIG_KEY_API_HOST = "logic.custom.hellotechno.host"; | |||||
| public static function getCustomers(?string $customerCde = null) | |||||
| { | |||||
| $res = Http::get(static::getCustomersUrl($customerCde)); | |||||
| return static::handleResponse($res); | |||||
| } | |||||
| public static function getParkings(string $customerCode, ?string $parkingManagementCode = null) | |||||
| { | |||||
| $res = Http::get(static::getParkingsUrl($customerCode, $parkingManagementCode)); | |||||
| return static::handleResponse($res); | |||||
| } | |||||
| public static function getAdjustData(string $customerCode, string $parkingManagementCode, int $adjustSeqNo) | |||||
| { | |||||
| $res = Http::get(static::getAdjustDataUrl($customerCode, $parkingManagementCode, $adjustSeqNo)); | |||||
| return static::handleResponse($res); | |||||
| } | |||||
| private static function getHost(): string | |||||
| { | |||||
| return config(static::CONFIG_KEY_API_HOST, "http://localhost"); | |||||
| } | |||||
| private static function getCustomersUrl(?string $customerCode) | |||||
| { | |||||
| $condition = [static::getHost(), static::URL_CUSTOMERS]; | |||||
| if ($customerCode) { | |||||
| $condition[] = $customerCode; | |||||
| } | |||||
| return implode('/', $condition); | |||||
| } | |||||
| private static function getParkingsUrl(string $customerCode, ?string $parkingManagementCode) | |||||
| { | |||||
| $condition = [static::getHost(), static::URL_PARKINGS, $customerCode]; | |||||
| if ($parkingManagementCode) { | |||||
| $condition[] = $parkingManagementCode; | |||||
| } | |||||
| return implode('/', $condition); | |||||
| } | |||||
| private static function getAdjustDataUrl(string $customerCode, string $parkingManagementCode, int $adjustSeqNo) | |||||
| { | |||||
| $condition = [static::getHost(), static::URL_ADJUST_DATA, $customerCode, $parkingManagementCode, $adjustSeqNo]; | |||||
| return implode('/', $condition); | |||||
| } | |||||
| private static function handleResponse(Response $res): array | |||||
| { | |||||
| if ($res->failed()) { | |||||
| throw $res->throw(); | |||||
| } | |||||
| $data = $res->json(); | |||||
| if (data_get($data, static::RESULT_CODE) !== static::RESULT_CODE_SUCCESS) { | |||||
| Log::error("HT RESPONSE ERROR"); | |||||
| Log::error($data); | |||||
| throw new AppCommonException('HT API 失敗'); | |||||
| } | |||||
| return data_get($data, static::FIELD_DATA, []); | |||||
| } | |||||
| } | |||||
| @@ -18,5 +18,12 @@ return [ | |||||
| 'userId' => env("SMS_FOURS_MESSAGE_USER"), | 'userId' => env("SMS_FOURS_MESSAGE_USER"), | ||||
| 'password' => env("SMS_FOURS_MESSAGE_PASSWORD"), | 'password' => env("SMS_FOURS_MESSAGE_PASSWORD"), | ||||
| ] | ] | ||||
| ] | |||||
| ], | |||||
| 'custom' => [ | |||||
| 'hellotechno' => [ | |||||
| 'host' => env('CUSTOM_HELLOTECHNO_API_HOST', 'http://localhost') | |||||
| ], | |||||
| ], | |||||
| ]; | ]; | ||||
| @@ -37,8 +37,8 @@ return new class extends Migration | |||||
| $table->string("handler_id")->comment("担当者ID")->nullable(); | $table->string("handler_id")->comment("担当者ID")->nullable(); | ||||
| $table->datetime("order_datetime")->comment("依頼日時")->nullable(); | $table->datetime("order_datetime")->comment("依頼日時")->nullable(); | ||||
| $table->string("status")->comment("ステータス")->nullable(); | $table->string("status")->comment("ステータス")->nullable(); | ||||
| $table->string("sumamry_key1")->comment("集計キー1")->nullable(); | |||||
| $table->string("sumamry_key2")->comment("集計キー2")->nullable(); | |||||
| $table->string("summary_key1")->comment("集計キー1")->nullable(); | |||||
| $table->string("summary_key2")->comment("集計キー2")->nullable(); | |||||
| $table->string("access_token")->comment("アクセストークン")->nullable(); | $table->string("access_token")->comment("アクセストークン")->nullable(); | ||||
| $table->datetime("access_token_expires_at")->comment("アクセストークン有効期限日時")->nullable(); | $table->datetime("access_token_expires_at")->comment("アクセストークン有効期限日時")->nullable(); | ||||
| @@ -53,6 +53,7 @@ return new class extends Migration | |||||
| $table->string("receipt_shop_name")->comment("領収証_発行店名")->nullable(); | $table->string("receipt_shop_name")->comment("領収証_発行店名")->nullable(); | ||||
| $table->string("receipt_issuer")->comment("領収証_発行者名")->nullable(); | $table->string("receipt_issuer")->comment("領収証_発行者名")->nullable(); | ||||
| $table->string("receipt_purpose")->comment("領収証_但書き")->nullable(); | $table->string("receipt_purpose")->comment("領収証_但書き")->nullable(); | ||||
| $table->string("receipt_name")->comment("領収証_宛名")->nullable(); | |||||
| $table->string("receipt_invoice_no")->comment("領収証_インボイス登録番号")->nullable(); | $table->string("receipt_invoice_no")->comment("領収証_インボイス登録番号")->nullable(); | ||||
| $table->string("receipt_amount")->comment("領収証_金額")->nullable(); | $table->string("receipt_amount")->comment("領収証_金額")->nullable(); | ||||
| $table->string("receipt_how_to_receive")->comment("領収証_取得希望方法")->nullable(); | $table->string("receipt_how_to_receive")->comment("領収証_取得希望方法")->nullable(); | ||||
| @@ -47,13 +47,13 @@ return new class extends Migration | |||||
| $table->text('content')->comment("本文")->nullable(); | $table->text('content')->comment("本文")->nullable(); | ||||
| $table->text('phone_number')->comment("送信先電話番号")->nullable(); | $table->text('phone_number')->comment("送信先電話番号")->nullable(); | ||||
| $table->string("sumamry_key1")->comment("集計キー1")->nullable(); | |||||
| $table->string("sumamry_key2")->comment("集計キー2")->nullable(); | |||||
| $table->string("summary_key1")->comment("集計キー1")->nullable(); | |||||
| $table->string("summary_key2")->comment("集計キー2")->nullable(); | |||||
| $helper->index(1, [ColumnName::CONTRACT_ID, 'send_datetime']); | $helper->index(1, [ColumnName::CONTRACT_ID, 'send_datetime']); | ||||
| $helper->index(2, [ColumnName::CONTRACT_ID, 'done']); | $helper->index(2, [ColumnName::CONTRACT_ID, 'done']); | ||||
| $helper->index(3, [ColumnName::CONTRACT_ID, 'sumamry_key1', 'sumamry_key2']); | |||||
| $helper->index(3, [ColumnName::CONTRACT_ID, 'summary_key1', 'summary_key2']); | |||||
| $helper->index(4, [ColumnName::CONTRACT_ID, 'done']); | $helper->index(4, [ColumnName::CONTRACT_ID, 'done']); | ||||
| }; | }; | ||||
| @@ -0,0 +1,54 @@ | |||||
| <?php | |||||
| namespace Database\Seeders; | |||||
| use App\Codes\Custom; | |||||
| use App\Codes\SMSProviderName; | |||||
| use App\Codes\UserRole; | |||||
| use App\Models\Contract; | |||||
| use App\Models\SMSProvider; | |||||
| use App\Models\User; | |||||
| use Illuminate\Database\Console\Seeds\WithoutModelEvents; | |||||
| use Illuminate\Database\Seeder; | |||||
| class TestUserSeeder extends Seeder | |||||
| { | |||||
| /** | |||||
| * Run the database seeds. | |||||
| */ | |||||
| public function run(): void | |||||
| { | |||||
| $contract = Contract::factory()->create([ | |||||
| Contract::COL_NAME_NAME => 'テスト用契約' | |||||
| ]); | |||||
| $emails = [ | |||||
| ['normal@aa.com', UserRole::NORMAL_ADMIN], | |||||
| ['contract@aa.com', UserRole::CONTRACT_ADMIN], | |||||
| ['admin@aa.com', UserRole::SUPER_ADMIN], | |||||
| ]; | |||||
| foreach ($emails as [$email, $role]) { | |||||
| if (!User::whereEmail($email)->exists()) { | |||||
| User::factory()->for($contract)->create([ | |||||
| User::COL_NAME_EMAIL => $email, | |||||
| User::COL_NAME_ROLE => $role, | |||||
| ]); | |||||
| } | |||||
| } | |||||
| $contract = Contract::factory()->create([ | |||||
| Contract::COL_NAME_NAME => 'テスト用契約 HT', | |||||
| Contract::COL_NAME_CUSTOM => Custom::HELLO_TECHNO, | |||||
| ]); | |||||
| $email = 'hello@aa.com'; | |||||
| if (!User::whereEmail($email)->exists()) { | |||||
| User::factory()->for($contract)->create([ | |||||
| User::COL_NAME_EMAIL => $email, | |||||
| User::COL_NAME_ROLE => UserRole::NORMAL_ADMIN, | |||||
| ]); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -5,3 +5,6 @@ variables_order = EGPCS | |||||
| [opcache] | [opcache] | ||||
| opcache.enable_cli=1 | opcache.enable_cli=1 | ||||
| [xdebug] | |||||
| xdebug.start_with_request=yes | |||||
| @@ -10,3 +10,15 @@ | |||||
| | be assigned to the "api" middleware group. Make something great! | | be assigned to the "api" middleware group. Make something great! | ||||
| | | | | ||||
| */ | */ | ||||
| use App\Util\RouteHelper; | |||||
| RouteHelper::get('/me', App\Http\Controllers\Web\Auth\MeController::class); | |||||
| RouteHelper::post('/login', App\Http\Controllers\Web\Auth\LoginController::class); | |||||
| RouteHelper::get('/logout', App\Http\Controllers\Web\Auth\LogoutController::class); | |||||
| // Custom for HelloTechno | |||||
| RouteHelper::get('/custom/hello-techno/customers', App\Http\Controllers\Web\Custom\HelloTechno\CustomersController::class); | |||||
| RouteHelper::get('/custom/hello-techno/parkings', App\Http\Controllers\Web\Custom\HelloTechno\ParkingsController::class); | |||||
| // RouteHelper::get('/custom/hello-techno/adjust-data', App\Http\Controllers\Web\Custom\HelloTechno\CustomersController::class); | |||||
| RouteHelper::post('/custom/hello-techno/receipt-issuing-order/create', App\Http\Controllers\Web\Custom\HelloTechno\CreateReceiptIssuingOrderController::class); | |||||
| @@ -33,8 +33,8 @@ class SMSTest extends TestCase | |||||
| $receiptIssuingOurder->contract_id = $contract->id; | $receiptIssuingOurder->contract_id = $contract->id; | ||||
| $receiptIssuingOurder->status = "NEW"; | $receiptIssuingOurder->status = "NEW"; | ||||
| $receiptIssuingOurder->sumamry_key1 = "京都"; | |||||
| $receiptIssuingOurder->sumamry_key2 = "駅前駐車場"; | |||||
| $receiptIssuingOurder->summary_key1 = "京都"; | |||||
| $receiptIssuingOurder->summary_key2 = "駅前駐車場"; | |||||
| $receiptIssuingOurder->sms_phone_number = "09093604589"; | $receiptIssuingOurder->sms_phone_number = "09093604589"; | ||||
| $receiptIssuingOurder->save(); | $receiptIssuingOurder->save(); | ||||