diff --git a/app/Console/Commands/PoolTransfer/MoveToPool.php b/app/Console/Commands/PoolTransfer/MoveToPool.php index 9592389..a4feb69 100644 --- a/app/Console/Commands/PoolTransfer/MoveToPool.php +++ b/app/Console/Commands/PoolTransfer/MoveToPool.php @@ -5,12 +5,14 @@ namespace App\Console\Commands\PoolTransfer; use App\Console\Commands\BaseCommand; use App\Exceptions\SkipException; use App\Kintone\KintoneRecordQueryOperator; +use App\Kintone\Models\BankCheckResult; use App\Kintone\Models\DropDown\SmbcPayment\SmbcPaymentStatus; use App\Kintone\Models\SmbcAccountTransferResult; use App\Kintone\Models\SmbcPayment; use App\Kintone\Models\YuchoPaymentResult; use App\Logic\PoolTransferManager; use App\Util\CollectionUtil; +use App\Util\DateUtil; use Illuminate\Support\Collection; class MoveToPool extends BaseCommand @@ -75,7 +77,7 @@ class MoveToPool extends BaseCommand return self::RESULTCODE_SUCCESS; } - public function handleData(YuchoPaymentResult|SmbcPayment|SmbcAccountTransferResult $payment) + public function handleData(YuchoPaymentResult|SmbcPayment|SmbcAccountTransferResult|BankCheckResult $payment) { $manager = new PoolTransferManager(); @@ -83,12 +85,12 @@ class MoveToPool extends BaseCommand } /** - * @return Collection + * @return Collection */ public function getTargets() { /** - * @var Collection + * @var Collection */ $ret = collect(); @@ -119,6 +121,22 @@ class MoveToPool extends BaseCommand CollectionUtil::pushAll($ret, $targets); $this->outputInfo(sprintf("口座振替:%d件", $targets->count())); + // バンクチェック + $query = BankCheckResult::getQuery()->whereNotIn(BankCheckResult::FIELD_POOL_DONE, ["済"]) + ->whereNotNull(BankCheckResult::FIELD_CUSTOMER_CODE) + ->where(BankCheckResult::FIELD_REMAINING_AMOUNT, 0, KintoneRecordQueryOperator::LE); + $targets = BankCheckResult::getAccess()->all($query); + CollectionUtil::pushAll($ret, $targets); + $this->outputInfo(sprintf("バンクチェック 支払完了:%d件", $targets->count())); + + $query = BankCheckResult::getQuery()->whereNotIn(BankCheckResult::FIELD_POOL_DONE, ["済"]) + ->whereNotNull(BankCheckResult::FIELD_CUSTOMER_CODE) + ->where(BankCheckResult::FIELD_REMAINING_AMOUNT, 0, KintoneRecordQueryOperator::NEQ) + ->whereDate(BankCheckResult::FIELD_PAYMENT_EXPIRES_DATE, DateUtil::now(), KintoneRecordQueryOperator::LT); + $targets = BankCheckResult::getAccess()->all($query); + CollectionUtil::pushAll($ret, $targets); + $this->outputInfo(sprintf("バンクチェック 支払期限切れ:%d件", $targets->count())); + return $ret; } } diff --git a/app/Http/Controllers/Web/BanckCheck/EntryController.php b/app/Http/Controllers/Web/BanckCheck/EntryController.php new file mode 100644 index 0000000..5ca27f8 --- /dev/null +++ b/app/Http/Controllers/Web/BanckCheck/EntryController.php @@ -0,0 +1,60 @@ +param; + + if ($param->token !== config('custom.bank-check.token')) { + abort(403); + } + + $model = new BankCheckResult(); + + $model->customerCode = $param->customerCode; + $model->entryRecordNo = $param->entryRecordNo; + $model->shopOrderNo = $param->cod; + $model->paymentNo = $param->gid; + $model->orderCode = $param->god; + $model->entryResult = $param->rst; + $model->entryErrorCode = $param->ec; + $model->paymentPlanAmount = intval($param->am); + $model->paymentExpiresDate = Carbon::createFromFormat("Ymd", $param->exp); + + $requestArr = $request->toArray(); + unset($requestArr["token"]); + $model->dataEntry = json_encode($requestArr); + + $model->save(); + + return response()->view('bank-check.ok'); + } +} diff --git a/app/Http/Controllers/Web/BanckCheck/EntryParam.php b/app/Http/Controllers/Web/BanckCheck/EntryParam.php new file mode 100644 index 0000000..224ba01 --- /dev/null +++ b/app/Http/Controllers/Web/BanckCheck/EntryParam.php @@ -0,0 +1,46 @@ + $this->str(), + 'rst' => $this->str(), + 'ap' => $this->str(), + 'ec' => $this->str(), + 'god' => $this->str(), + 'cod' => $this->str(), + 'am' => $this->numeric(), + 'tx' => $this->numeric(), + 'sf' => $this->numeric(), + 'ta' => $this->numeric(), + 'bank' => $this->str(), + 'exp' => $this->str(), + 'customer_code' => $this->str(), + 'entry_record_no' => $this->numeric(), + 'token' => $this->str(), + ]; + } +} diff --git a/app/Http/Controllers/Web/BanckCheck/PaymentInfoController.php b/app/Http/Controllers/Web/BanckCheck/PaymentInfoController.php new file mode 100644 index 0000000..c18069a --- /dev/null +++ b/app/Http/Controllers/Web/BanckCheck/PaymentInfoController.php @@ -0,0 +1,100 @@ +param; + logger("リクエスト受信 bankcheck"); + + if ($param->token !== config('custom.bank-check.token')) { + abort(403); + } + + if ($param->ap === "BANK") { + $this->handleEntry(); + } else if ($param->ap === "BAN_SAL") { + $this->handlePayment(); + } + + + return response()->view('bank-check.ok'); + } + + private function handleEntry() + { + $param = $this->param; + $model = new BankCheckResult(); + + $model->customerCode = $param->customerCode; + $model->entryRecordNo = $param->entryRecordNo; + $model->shopOrderNo = $param->cod; + $model->paymentNo = $param->gid; + $model->orderCode = $param->god; + $model->entryResult = $param->rst; + $model->entryErrorCode = $param->ec; + $model->paymentPlanAmount = intval($param->am); + $model->paymentExpiresDate = Carbon::createFromFormat("Ymd", $param->exp); + + $requestArr = request()->toArray(); + unset($requestArr["token"]); + $model->dataEntry = json_encode($requestArr); + + $model->save(); + } + + private function handlePayment() + { + $param = $this->param; + + $model = BankCheckResult::getAccess() + ->first(BankCheckResult::getQuery()->where( + BankCheckResult::FIELD_SHOP_ORDER_NO, + $param->cod + )); + + if ($model === null) { + throw new AppCommonException(sprintf( + "存在しない店舗側オーダー番号:[%s]", + $param->cod + )); + } + + $model->paymentResult = $param->rst; + $model->paymentErrorCode = $param->ec; + $model->paymentAmount = intval($param->nk); + $model->paymentDate = Carbon::createFromFormat("Ymd", $param->nkd); + + $requestArr = request()->toArray(); + unset($requestArr["token"]); + $model->dataResult = json_encode($requestArr); + + $model->save(); + } +} diff --git a/app/Http/Controllers/Web/BanckCheck/PaymentInfoParam.php b/app/Http/Controllers/Web/BanckCheck/PaymentInfoParam.php new file mode 100644 index 0000000..9a082de --- /dev/null +++ b/app/Http/Controllers/Web/BanckCheck/PaymentInfoParam.php @@ -0,0 +1,56 @@ + $this->str(), + 'rst' => $this->str(), + 'ap' => $this->str(), + 'ec' => $this->str(true), + 'god' => $this->str(), + 'cod' => $this->str(), + 'am' => $this->numeric(), + 'tx' => $this->numeric(), + 'sf' => $this->numeric(), + 'ta' => $this->numeric(), + 'id' => $this->str(true), + 'ps' => $this->str(true), + 'mf' => $this->str(true), + 'nk' => $this->str(true), + 'nkd' => $this->str(true), + 'bank' => $this->str(true), + 'exp' => $this->str(), + 'customer_code' => $this->str(), + 'entry_record_no' => $this->numeric(), + 'token' => $this->str(), + ]; + } +} diff --git a/app/Kintone/Models/BankCheckResult.php b/app/Kintone/Models/BankCheckResult.php new file mode 100644 index 0000000..27b29b4 --- /dev/null +++ b/app/Kintone/Models/BankCheckResult.php @@ -0,0 +1,82 @@ + FieldType::NUMBER, + self::FIELD_CUSTOMER_NAME => FieldType::SINGLE_LINE_TEXT, + self::FIELD_SHOP_ORDER_NO => FieldType::SINGLE_LINE_TEXT, + self::FIELD_ENTRY_RECORD_NO => FieldType::NUMBER, + self::FIELD_PAYMENT_NO => FieldType::SINGLE_LINE_TEXT, + self::FIELD_ORDER_CODE => FieldType::SINGLE_LINE_TEXT, + self::FIELD_ENTRY_RESULT => FieldType::SINGLE_LINE_TEXT, + self::FIELD_ENTRY_ERROR_CODE => FieldType::SINGLE_LINE_TEXT, + self::FIELD_PAYMENT_PLAN_AMOUNT => FieldType::NUMBER, + self::FIELD_PAYMENT_EXPIRES_DATE => FieldType::DATE, + self::FIELD_PAYMENT_RESULT => FieldType::SINGLE_LINE_TEXT, + self::FIELD_PAYMENT_ERROR_CODE => FieldType::SINGLE_LINE_TEXT, + self::FIELD_PAYMENT_DATE => FieldType::DATE, + self::FIELD_PAYMENT_AMOUNT => FieldType::NUMBER, + self::FIELD_REMAINING_AMOUNT => FieldType::NUMBER, + self::FIELD_POOL_DONE => FieldType::CHECK_BOX, + self::FIELD_DATA_ENTRY => FieldType::MULTI_LINE_TEXT, + self::FIELD_DATA_RESULT => FieldType::MULTI_LINE_TEXT, + ]; + + protected const FIELD_NAMES = [ + ...parent::FIELD_NAMES, + ]; + + protected const RELATIONS = [ + Customer::class, + SeasonTicketContractEntry::class, + ]; +} diff --git a/app/Kintone/Models/DropDown/PoolTransferHistory/TransferMethod.php b/app/Kintone/Models/DropDown/PoolTransferHistory/TransferMethod.php index f7da15d..2cbd27a 100644 --- a/app/Kintone/Models/DropDown/PoolTransferHistory/TransferMethod.php +++ b/app/Kintone/Models/DropDown/PoolTransferHistory/TransferMethod.php @@ -7,4 +7,5 @@ abstract class TransferMethod const ACCOUNT_TRANSFER = "口座振替"; const YUCHO = "ゆうちょ振込"; const CVS = "コンビニ支払"; + const BANK_CHECK = "バンクチェック"; } diff --git a/app/Kintone/Models/PoolTransferHistory.php b/app/Kintone/Models/PoolTransferHistory.php index be2c7a0..7026ddc 100644 --- a/app/Kintone/Models/PoolTransferHistory.php +++ b/app/Kintone/Models/PoolTransferHistory.php @@ -19,6 +19,7 @@ use Illuminate\Support\Carbon; * @property ?int incomeAccountTransferResultRecordNo * @property ?int incomeYuchoTransferRecordNo * @property ?int incomeCvsPaymentRecordNo + * @property ?int incomeBankCheckPaymentRecordNo * @property ?int paymentPlanRecordNo * @property ?int seasonContractRecordNo */ @@ -38,6 +39,7 @@ class PoolTransferHistory extends KintoneModel const FIELD_INCOME_ACCOUNT_TRANSFER_RESULT_RECORD_NO = "口座振替結果レコード番号"; const FIELD_INCOME_YUCHO_TRANSFER_RECORD_NO = "ゆうちょ振込レコード番号"; const FIELD_INCOME_CVS_PAYMENT_RECORD_NO = "コンビニ支払レコード番号"; + const FIELD_INCOME_BANK_CHECK_PAYMENT_RECORD_NO = "バンクチェック支払レコード番号"; const FIELD_PAYMENT_PLAN_RECORD_NO = "入金予定結果レコード番号"; const FIELD_SEASON_CONTRACT_RECORD_NO = "車室情報管理レコード番号"; @@ -56,6 +58,7 @@ class PoolTransferHistory extends KintoneModel self::FIELD_INCOME_ACCOUNT_TRANSFER_RESULT_RECORD_NO => FieldType::NUMBER, self::FIELD_INCOME_YUCHO_TRANSFER_RECORD_NO => FieldType::NUMBER, self::FIELD_INCOME_CVS_PAYMENT_RECORD_NO => FieldType::NUMBER, + self::FIELD_INCOME_BANK_CHECK_PAYMENT_RECORD_NO => FieldType::NUMBER, self::FIELD_PAYMENT_PLAN_RECORD_NO => FieldType::NUMBER, self::FIELD_SEASON_CONTRACT_RECORD_NO => FieldType::NUMBER, ]; @@ -71,5 +74,6 @@ class PoolTransferHistory extends KintoneModel SmbcAccountTransferResult::class, Pool::class, PaymentPlan::class, + BankCheckResult::class, ]; } diff --git a/app/Logic/PoolTransferManager.php b/app/Logic/PoolTransferManager.php index 254ecb3..99c60f5 100644 --- a/app/Logic/PoolTransferManager.php +++ b/app/Logic/PoolTransferManager.php @@ -3,6 +3,7 @@ namespace App\Logic; use App\Exceptions\SkipException; +use App\Kintone\Models\BankCheckResult; use App\Kintone\Models\DropDown\PoolTransferHistory\TransferMethod; use App\Kintone\Models\DropDown\PoolTransferHistory\TransgerType; use App\Kintone\Models\Pool; @@ -18,12 +19,12 @@ use App\Util\DateUtil; class PoolTransferManager { - private SmbcPayment|SmbcAccountTransferResult|YuchoPaymentResult|null $payment = null; + private SmbcPayment|SmbcAccountTransferResult|YuchoPaymentResult|BankCheckResult|null $payment = null; private Pool|null $pool = null; private PoolTransferHistory|null $history = null; - public function moveToPool(SmbcPayment|SmbcAccountTransferResult|YuchoPaymentResult $payment): Pool + public function moveToPool(SmbcPayment|SmbcAccountTransferResult|YuchoPaymentResult|BankCheckResult $payment): Pool { $this->clear(); @@ -89,6 +90,10 @@ class PoolTransferManager $history->incomeMethod = TransferMethod::YUCHO; $history->incomeYuchoTransferRecordNo = $this->payment->getRecordId(); } + if ($this->payment instanceof BankCheckResult) { + $history->incomeMethod = TransferMethod::BANK_CHECK; + $history->incomeBankCheckPaymentRecordNo = $this->payment->getRecordId(); + } $this->history = $history; } diff --git a/config/custom.php b/config/custom.php index 02cf31c..b7afcf2 100644 --- a/config/custom.php +++ b/config/custom.php @@ -4,5 +4,8 @@ return [ "ht-ic-web" => [ 'apiKey' => env("HT_IC_WEB_API_KEY", ""), 'url' => env("HT_IC_WEB_URL", ""), + ], + "bank-check" => [ + 'token' => env("BANK_CHECK_TOKEN", ""), ] ]; diff --git a/config/kintone.php b/config/kintone.php index a450440..34bd810 100644 --- a/config/kintone.php +++ b/config/kintone.php @@ -54,6 +54,7 @@ return [ ...App\Kintone\Models\YuchoPaymentResult::setConfig(), ...App\Kintone\Models\Pool::setConfig(), ...App\Kintone\Models\PoolTransferHistory::setConfig(), + ...App\Kintone\Models\BankCheckResult::setConfig(), ], ]; diff --git a/resources/views/bank-check/ok.blade.php b/resources/views/bank-check/ok.blade.php new file mode 100644 index 0000000..ae5720b --- /dev/null +++ b/resources/views/bank-check/ok.blade.php @@ -0,0 +1,5 @@ + + +ok + + \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 304e010..e72fe4d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -25,5 +25,9 @@ Route::get("/test/bank", function () { return view('bank-test'); }); +// BANK CHECK WEBHOOK +RouteHelper::get('/bank-check/info', App\Http\Controllers\Web\BanckCheck\PaymentInfoController::class); + + // ルーティングで適合しない場合はフロント側のRoutingにゆだねる RouteHelper::get('/{any?}', App\Http\Controllers\Web\IndexController::class)->where('any', '.*');