|
- <?php
-
- namespace App\Console\Commands;
-
- use App\Email\Members\FailedRegisterBankAccountNotice;
- use App\Http\API\SMBC\PollResultRecord;
- use App\Http\API\SMBC\SMBC;
- use App\Http\API\SMBC\SMBCStatus;
- use App\Kintone\Models\BankAccountUpdateApplication;
- use App\Kintone\Models\Customer;
- use App\Logic\EmailManager;
- use App\Logic\GeneralApplicationManager;
- use App\Models\SmbcPollStatus;
- use App\Util\DateUtil;
- use App\Util\DBUtil;
- use Exception;
- use Illuminate\Support\Carbon;
- use Illuminate\Support\Collection;
- use Illuminate\Support\Facades\DB;
-
- class SMBCPoll extends BaseCommand
- {
-
- const COMMAND = "smbc:poll";
-
-
- /**
- * The name and signature of the console command.
- *
- * @var string
- */
- protected $signature = self::COMMAND;
-
- /**
- * The console command description.
- *
- * @var string
- */
- protected $description = 'SMBCへ口座振替登録申請結果を取得する';
-
- static public function getCommand()
- {
- return self::COMMAND;
- }
-
-
- /**
- * @var Collection<int, BankAccountUpdateApplication>
- */
- private Collection $applications;
-
-
- /**
- * Create a new command instance.
- *
- * @return void
- */
- public function __construct()
- {
- parent::__construct();
- $this->applications = collect();
- }
-
- /**
- * Execute the console command.
- *
- * @return int
- */
- public function service(): int
- {
- try {
- $db = DBUtil::instance();
- $db->beginTransaction();
-
- // 検索範囲の取得
- [$from, $to] = $this->getFromTo();
- $this->outputInfo(sprintf("検索範囲 %s-%s", $from->format('Y/m/d H:i:s'), $to->format('Y/m/d H:i:s')));
-
- // 検索実行
- $result = SMBC::poll($from, $to);
-
- // 検索結果の確認
- if (!$result->ok()) {
- $this->outputError($result->getMessage());
- return self::RESULTCODE_FAILED;
- }
- $this->outputInfo(sprintf("取得対象 %d件", $result->getCount()));
-
- // データハンドリング
- foreach ($result->getRecord() as $data) {
- $this->handleData($data);
- }
-
- // 検索実績の登録
- $this->saveFromTo($from, $to);
-
- // キントーンへ各種申請登録
- foreach ($this->applications as $app) {
- $this->outputInfo(sprintf("申請登録 顧客コード:%s 申請番号:%s", $app->customerCode, $app->applicationNo));
- $app->save();
- }
- $this->outputInfo(sprintf("申請登録件数:%d件", $this->applications->count()));
-
- $db->commit();
- } catch (Exception $e) {
- $db->rollBack();
- throw $e;
- }
-
- return self::RESULTCODE_SUCCESS;
- }
-
- /**
- * @return Carbon[]
- */
- private function getFromTo()
- {
-
- $status = SmbcPollStatus::all()->first();
- $now = DateUtil::now();
- if ($status === null) {
- $this->outputInfo("検索範囲初期化");
- return [
- $now->clone()->addDays(-5),
- $now->clone(),
- ];
- }
-
- return [
- $status->condition_datetime_to->clone()->addSecond(),
- $now->clone(),
- ];
- }
-
- private function handleData(PollResultRecord $data)
- {
- if ($data->status === SMBCStatus::SUCCESS) {
- $customer = Customer::findByCustomerCode($data->getCustomerCode());
-
- $application = new BankAccountUpdateApplication();
- $manager = new GeneralApplicationManager($application);
- $manager
- ->setCustomer($customer)
- ->makeApplication();
-
- $application->bankBranchIdBefore = $customer->bankBranchId;
-
- $application->bankBranchIdAfter = $data->bankBranchCode;
- $application->bankCodeAfter = $data->bankCode;
- $application->bankNameAfter = $data->bankName;
- $application->branchCodeAfter = $data->branchCode;
- $application->branchNameAfter = $data->branchName;
- $application->accountTypeAfter = $data->accountType;
- $application->accountNameKanaAfter = $data->accountName;
- $application->accountNoAfter = $data->accountNo;
- $application->accountYuchoSignAfter = $data->yuchoSign;
- $application->accountYuchoNoAfter = $data->yuchoAccountNo;
- $application->smbcApplicationDatetime = $data->applicationDatetime;
- $application->smbcAcceptNo = $data->acceptNo;
- $application->smbcResult = $data->all;
-
- $this->applications->push($application);
- return;
- }
- if ($data->status === SMBCStatus::ERROR || $data->status === SMBCStatus::CANCEL) {
- // エラーメール送信
- $customer = Customer::findByCustomerCode($data->getCustomerCode());
- $this->outputWarn(sprintf("申請失敗のためエラーメール送信 受付番号%s 顧客コード:%d 氏名:%s", $data->acceptNo, $customer->customerCode, $customer->customerName));
- $email = new FailedRegisterBankAccountNotice($customer);
- $emailMmanager = new EmailManager($email);
- $emailMmanager->confirm();
- return;
- }
- if ($data->status === SMBCStatus::PROCESSING) {
- $this->outputInfo(sprintf("処理中のためスキップ 受付番号%s", $data->acceptNo));
- return;
- }
- if ($data->address5 !== SMBC::CONDITION_ADDR5_FROM_MY_PAGE) {
- $this->outputInfo(sprintf("MyPage以外からの申請のためスキップ 受付番号%s", $data->acceptNo));
- return;
- }
- }
-
- private function saveFromTo(Carbon $from, Carbon $to)
- {
- DB::table(SmbcPollStatus::getTableName())->delete();
-
- $status = new SmbcPollStatus();
- $status->condition_datetime_to = $to;
- $status->save();
- }
- }
|