Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

193 linhas
5.9KB

  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Email\Members\FailedRegisterBankAccountNotice;
  4. use App\Http\API\SMBC\PollResultRecord;
  5. use App\Http\API\SMBC\SMBC;
  6. use App\Http\API\SMBC\SMBCStatus;
  7. use App\Kintone\Models\BankAccountUpdateApplication;
  8. use App\Kintone\Models\Customer;
  9. use App\Logic\EmailManager;
  10. use App\Logic\GeneralApplicationManager;
  11. use App\Models\SmbcPollStatus;
  12. use App\Util\DateUtil;
  13. use App\Util\DBUtil;
  14. use Exception;
  15. use Illuminate\Support\Carbon;
  16. use Illuminate\Support\Collection;
  17. use Illuminate\Support\Facades\DB;
  18. class SMBCPoll extends BaseCommand
  19. {
  20. const COMMAND = "smbc:poll";
  21. /**
  22. * The name and signature of the console command.
  23. *
  24. * @var string
  25. */
  26. protected $signature = self::COMMAND;
  27. /**
  28. * The console command description.
  29. *
  30. * @var string
  31. */
  32. protected $description = 'SMBCへ口座振替登録申請結果を取得する';
  33. static public function getCommand()
  34. {
  35. return self::COMMAND;
  36. }
  37. /**
  38. * @var Collection<int, BankAccountUpdateApplication>
  39. */
  40. private Collection $applications;
  41. /**
  42. * Create a new command instance.
  43. *
  44. * @return void
  45. */
  46. public function __construct()
  47. {
  48. parent::__construct();
  49. $this->applications = collect();
  50. }
  51. /**
  52. * Execute the console command.
  53. *
  54. * @return int
  55. */
  56. public function service(): int
  57. {
  58. try {
  59. $db = DBUtil::instance();
  60. $db->beginTransaction();
  61. // 検索範囲の取得
  62. [$from, $to] = $this->getFromTo();
  63. $this->outputInfo(sprintf("検索範囲 %s-%s", $from->format('Y/m/d H:i:s'), $to->format('Y/m/d H:i:s')));
  64. // 検索実行
  65. $result = SMBC::poll($from, $to);
  66. // 検索結果の確認
  67. if (!$result->ok()) {
  68. $this->outputError($result->getMessage());
  69. return self::RESULTCODE_FAILED;
  70. }
  71. $this->outputInfo(sprintf("取得対象 %d件", $result->getCount()));
  72. // データハンドリング
  73. foreach ($result->getRecord() as $data) {
  74. $this->handleData($data);
  75. }
  76. // 検索実績の登録
  77. $this->saveFromTo($from, $to);
  78. // キントーンへ各種申請登録
  79. foreach ($this->applications as $app) {
  80. $this->outputInfo(sprintf("申請登録 顧客コード:%s 申請番号:%s", $app->customerCode, $app->applicationNo));
  81. $app->save();
  82. }
  83. $this->outputInfo(sprintf("申請登録件数:%d件", $this->applications->count()));
  84. $db->commit();
  85. } catch (Exception $e) {
  86. $db->rollBack();
  87. throw $e;
  88. }
  89. return self::RESULTCODE_SUCCESS;
  90. }
  91. /**
  92. * @return Carbon[]
  93. */
  94. private function getFromTo()
  95. {
  96. $status = SmbcPollStatus::all()->first();
  97. $now = DateUtil::now();
  98. if ($status === null) {
  99. $this->outputInfo("検索範囲初期化");
  100. return [
  101. $now->clone()->addDays(-5),
  102. $now->clone(),
  103. ];
  104. }
  105. return [
  106. $status->condition_datetime_to->clone()->addSecond(),
  107. $now->clone(),
  108. ];
  109. }
  110. private function handleData(PollResultRecord $data)
  111. {
  112. if ($data->status === SMBCStatus::SUCCESS) {
  113. $customer = Customer::findByCustomerCode($data->getCustomerCode());
  114. $application = new BankAccountUpdateApplication();
  115. $manager = new GeneralApplicationManager($application);
  116. $manager
  117. ->setCustomer($customer)
  118. ->makeApplication();
  119. $application->bankBranchIdBefore = $customer->bankBranchId;
  120. $application->bankBranchIdAfter = $data->bankBranchCode;
  121. $application->bankCodeAfter = $data->bankCode;
  122. $application->bankNameAfter = $data->bankName;
  123. $application->branchCodeAfter = $data->branchCode;
  124. $application->branchNameAfter = $data->branchName;
  125. $application->accountTypeAfter = $data->accountType;
  126. $application->accountNameKanaAfter = $data->accountName;
  127. $application->accountNoAfter = $data->accountNo;
  128. $application->accountYuchoSignAfter = $data->yuchoSign;
  129. $application->accountYuchoNoAfter = $data->yuchoAccountNo;
  130. $application->smbcApplicationDatetime = $data->applicationDatetime;
  131. $application->smbcAcceptNo = $data->acceptNo;
  132. $application->smbcResult = $data->all;
  133. $this->applications->push($application);
  134. return;
  135. }
  136. if ($data->status === SMBCStatus::ERROR || $data->status === SMBCStatus::CANCEL) {
  137. // エラーメール送信
  138. $customer = Customer::findByCustomerCode($data->getCustomerCode());
  139. $this->outputWarn(sprintf("申請失敗のためエラーメール送信 受付番号%s 顧客コード:%d 氏名:%s", $data->acceptNo, $customer->customerCode, $customer->customerName));
  140. $email = new FailedRegisterBankAccountNotice($customer);
  141. $emailMmanager = new EmailManager($email);
  142. $emailMmanager->confirm();
  143. return;
  144. }
  145. if ($data->status === SMBCStatus::PROCESSING) {
  146. $this->outputInfo(sprintf("処理中のためスキップ 受付番号%s", $data->acceptNo));
  147. return;
  148. }
  149. if ($data->address5 !== SMBC::CONDITION_ADDR5_FROM_MY_PAGE) {
  150. $this->outputInfo(sprintf("MyPage以外からの申請のためスキップ 受付番号%s", $data->acceptNo));
  151. return;
  152. }
  153. }
  154. private function saveFromTo(Carbon $from, Carbon $to)
  155. {
  156. DB::table(SmbcPollStatus::getTableName())->delete();
  157. $status = new SmbcPollStatus();
  158. $status->condition_datetime_to = $to;
  159. $status->save();
  160. }
  161. }