*/ 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(); } }