diff --git a/app/Console/Commands/DataPatch/FillPaymentPlan.php b/app/Console/Commands/DataPatch/FillPaymentPlan.php index 379d666..75a4c81 100644 --- a/app/Console/Commands/DataPatch/FillPaymentPlan.php +++ b/app/Console/Commands/DataPatch/FillPaymentPlan.php @@ -74,6 +74,7 @@ class FillPaymentPlan extends BaseCommand // プランの取得 $plans = $this->getPlans(); + foreach ($plans as $plan) { // 契約の取得 diff --git a/app/Console/Commands/PoolTransfer/AttachToPaymentPlan.php b/app/Console/Commands/PoolTransfer/AttachToPaymentPlan.php new file mode 100644 index 0000000..4686a1a --- /dev/null +++ b/app/Console/Commands/PoolTransfer/AttachToPaymentPlan.php @@ -0,0 +1,129 @@ +getTargets(); + + + $this->outputInfo(sprintf("総件数:%d件", $targets->count())); + + + + foreach ($targets as $index => $target) { + + // 100件ごとに経過を出力 + if ($index % 100 === 0) { + $this->outputInfo(sprintf("処理中:%d件目", $index + 1)); + } + try { + $this->handleData($target); + } catch (SkipException $e) { + $this->outputWarn($e->getMessage()); + } + } + + + return self::RESULTCODE_SUCCESS; + } + + public function handleData(Pool $pool) + { + $manager = new PoolAttachManager(); + $manager->attach($pool) + ->save(); + + // 初回振り込み完了処理 + if ($manager->getFirstPaymnetEntryRecordIds()->isNotEmpty()) { + foreach ($manager->getFirstPaymnetEntryRecordIds() as $entryRecordId) { + $this->handleFirstPaymentDone($entryRecordId); + } + } + } + + public function handleFirstPaymentDone(int $entryRecordNo) + { + // 未払いチェック + $query = PaymentPlan::getQuery()->where(PaymentPlan::FIELD_FIRST_PAYMENT_ENTRY_RECORD_NO, $entryRecordNo); + $plans = PaymentPlan::getAccess()->all($query); + if ($plans->isEmpty()) { + return; + } + + // 未払い検索 + $未払い = $plans->first((function (PaymentPlan $plan) { + return !$plan->appropriationDate || $plan->appropriationAmount !== $plan->paymentPlanAmount; + })); + if ($未払い) { + return; + } + + + // 承認メール送信 + $entry = SeasonTicketContractEntry::find($entryRecordNo); + $parking = $entry->getParking(); + $plan = $entry->getPlan(); + $email = new EntryPaymentComplete($parking, $entry, $plan); + (new EmailManager($email))->confirm(); + } + + public function getTargets() + { + $query = Pool::getQuery()->where(Pool::FIELD_POOL_AMOUNT, 0, KintoneRecordQueryOperator::GT); + $ret = Pool::getAccess()->all($query); + return $ret; + } +} diff --git a/app/Console/Commands/PoolTransfer/MoveToPool.php b/app/Console/Commands/PoolTransfer/MoveToPool.php new file mode 100644 index 0000000..9592389 --- /dev/null +++ b/app/Console/Commands/PoolTransfer/MoveToPool.php @@ -0,0 +1,124 @@ +getTargets(); + + + $this->outputInfo(sprintf("総件数:%d件", $targets->count())); + + foreach ($targets as $target) { + + try { + $this->handleData($target); + } catch (SkipException $e) { + $this->outputWarn($e->getMessage()); + } + } + + + return self::RESULTCODE_SUCCESS; + } + + public function handleData(YuchoPaymentResult|SmbcPayment|SmbcAccountTransferResult $payment) + { + + $manager = new PoolTransferManager(); + $manager->moveToPool($payment); + } + + /** + * @return Collection + */ + public function getTargets() + { + /** + * @var Collection + */ + $ret = collect(); + + // ゆうちょ振込 + $query = YuchoPaymentResult::getQuery()->whereNotIn(YuchoPaymentResult::FIELD_POOL_DONE, ["済"]) + ->whereNotNull(YuchoPaymentResult::FIELD_CUSTOMER_CODE) + ->where(YuchoPaymentResult::FIELD_PAYMENT_AMOUNT, 0, KintoneRecordQueryOperator::GT); + + $targets = YuchoPaymentResult::getAccess()->all($query); + $ret->concat($targets); + CollectionUtil::pushAll($ret, $targets); + $this->outputInfo(sprintf("ゆうちょ件数:%d件", $targets->count())); + + // コンビニ支払 + $query = SmbcPayment::getQuery()->whereNotIn(SmbcPayment::FIELD_POOL_DONE, ["済"]) + ->whereNotNull(SmbcPayment::FIELD_CUSTOMER_CODE) + ->where(SmbcPayment::FIELD_PAYMENT_AMOUNT, 0, KintoneRecordQueryOperator::GT) + ->whereIn(SmbcPayment::FIELD_STATUS, [SmbcPaymentStatus::S002_決済結果待ち]); + $targets = SmbcPayment::getAccess()->all($query); + CollectionUtil::pushAll($ret, $targets); + $this->outputInfo(sprintf("コンビニ支払:%d件", $targets->count())); + + // 口座振替 + $query = SmbcAccountTransferResult::getQuery()->whereNotIn(SmbcAccountTransferResult::FIELD_POOL_DONE, ["済"]) + ->whereNotNull(SmbcAccountTransferResult::FIELD_CUSTOMER_CODE) + ->where(SmbcAccountTransferResult::FIELD_PAYMENT_AMOUNT, 0, KintoneRecordQueryOperator::GT); + $targets = SmbcAccountTransferResult::getAccess()->all($query); + CollectionUtil::pushAll($ret, $targets); + $this->outputInfo(sprintf("口座振替:%d件", $targets->count())); + + return $ret; + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 04c151c..3793f1c 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -18,6 +18,7 @@ class Kernel extends ConsoleKernel Schedules\BankAccountRegisterRemaind::register($schedule); Schedules\SeasonTikcetContractSelectionSetResult::register($schedule); Schedules\SeasonTicketContractTerminateComplete::register($schedule); + Schedules\PoolTransfer::register($schedule); } /** diff --git a/app/Console/Schedules/PoolTransfer.php b/app/Console/Schedules/PoolTransfer.php new file mode 100644 index 0000000..1a5db0f --- /dev/null +++ b/app/Console/Schedules/PoolTransfer.php @@ -0,0 +1,22 @@ +command(MoveToPool::class) + ->twiceDaily(10, 16) + ->description("プール金異動") + ->onSuccess(function () { + Artisan::call(AttachToPaymentPlan::class); + }); + } +} diff --git a/app/Console/Schedules/SMBCBankAccountRegisterPoll.php b/app/Console/Schedules/SMBCBankAccountRegisterPoll.php index eb37c11..72518c9 100644 --- a/app/Console/Schedules/SMBCBankAccountRegisterPoll.php +++ b/app/Console/Schedules/SMBCBankAccountRegisterPoll.php @@ -11,7 +11,7 @@ class SMBCBankAccountRegisterPoll extends BaseSchedule static public function register(Schedule $schedule) { $schedule->command(Command::class) - ->everyThreeMinutes() + ->everyOddHour() ->unlessBetween('1:00', '6:00') ->description("SMBC口座振替申請結果取得"); } diff --git a/app/Console/Schedules/SMBCPaymentPoll.php b/app/Console/Schedules/SMBCPaymentPoll.php index 01ec020..21f3970 100644 --- a/app/Console/Schedules/SMBCPaymentPoll.php +++ b/app/Console/Schedules/SMBCPaymentPoll.php @@ -11,8 +11,8 @@ class SMBCPaymentPoll extends BaseSchedule static public function register(Schedule $schedule) { $schedule->command(Command::class) - ->everyTwoHours() + ->twiceDailyAt(9, 15, 30) ->unlessBetween('1:00', '6:00') - ->description("SMBC支払結果取得"); + ->description("SMBC支払結果取得(コンビニ)"); } } diff --git a/app/Email/Members/EntryPaymentComplete.php b/app/Email/Members/EntryPaymentComplete.php index 835bab7..ba60132 100644 --- a/app/Email/Members/EntryPaymentComplete.php +++ b/app/Email/Members/EntryPaymentComplete.php @@ -43,7 +43,6 @@ class EntryPaymentComplete extends Members 'use_start_date' => $entry->useStartDate ? $entry->useStartDate->format('Y/m/d') : "-", 'payment_method' => $entry->paymentMethod ?? "-", 'amount' => number_format($entry->amount ?? 0), - 'paymentExplain' => EntryMessageBuilder::getPaymentExplainStr($this->entry), 'taxExplain' => EntryMessageBuilder::getTaxExplain($this->plan), 'can_terminate_15' => in_array(Parking::ELEMENT_CAN_TERMINATE_DATE_15, $this->parking->canTerminateDate), 'can_terminate_end_of_month' => in_array(Parking::ELEMENT_CAN_TERMINATE_DATE_END_OF_MONTH, $this->parking->canTerminateDate), diff --git a/app/Exceptions/SkipException.php b/app/Exceptions/SkipException.php new file mode 100644 index 0000000..ffbc8bf --- /dev/null +++ b/app/Exceptions/SkipException.php @@ -0,0 +1,9 @@ +changed) === 0) { + return; + } + $access = static::getAccess(); if ($this->recordId === null) { $access->create($this); diff --git a/app/Kintone/Models/PaymentPlan.php b/app/Kintone/Models/PaymentPlan.php index 25b219d..498c794 100644 --- a/app/Kintone/Models/PaymentPlan.php +++ b/app/Kintone/Models/PaymentPlan.php @@ -23,7 +23,9 @@ use Illuminate\Support\Collection; * @property Carbon appropriationDate * @property int appropriationAmount * @property int remainingAmount + * @property int firstPaymentEntryRecordNo * @property Collection depositList + * @property string[] partialFee */ class PaymentPlan extends KintoneModel { @@ -42,9 +44,11 @@ class PaymentPlan extends KintoneModel const FIELD_APPROPRIATION_DATE = "appropriation_date"; const FIELD_APPROPRIATION_AMOUNT = "appropriation_amount"; const FIELD_REMAINING_AMOUNT = "remaining_amount"; + const FIELD_FIRST_PAYMENT_ENTRY_RECORD_NO = "first_payment_entry_record_no"; const FIELD_DEPOSIT_LIST = "保証金明細"; const FIELD_DEPOSIT_LIST_NAME = "保証金明細_名称"; const FIELD_DEPOSIT_LIST_AMOUNT = "保証金明細_金額"; + const FIELD_PARTIAL_FEE = "定期料金日割り分"; protected const FIELDS = [ ...parent::FIELDS, @@ -61,7 +65,9 @@ class PaymentPlan extends KintoneModel self::FIELD_APPROPRIATION_DATE => FieldType::DATE, self::FIELD_APPROPRIATION_AMOUNT => FieldType::NUMBER, self::FIELD_REMAINING_AMOUNT => FieldType::NUMBER, + self::FIELD_FIRST_PAYMENT_ENTRY_RECORD_NO => FieldType::NUMBER, self::FIELD_DEPOSIT_LIST => FieldType::SUBTABLE, + self::FIELD_PARTIAL_FEE => FieldType::CHECK_BOX, ]; protected const SUB_TABLES = [ @@ -87,14 +93,37 @@ class PaymentPlan extends KintoneModel ]; } + /** + * 支払い済みか判定 + * + * @return boolean + */ public function donePayment(): bool { $paymentDate = $this->getDate(self::FIELD_APPROPRIATION_DATE); $remainingAmount = $this->getNumber(self::FIELD_REMAINING_AMOUNT); + $paymentPlanAmount = $this->getNumber(self::FIELD_PAYMENT_PLAN_AMOUNT); + $paymentAmount = $this->getNumber(self::FIELD_APPROPRIATION_AMOUNT); - return !!$paymentDate && $remainingAmount === 0; + return !!$paymentDate && $remainingAmount === 0 && $paymentPlanAmount === $paymentAmount; } + /** + * 日割り分の請求データか判定 + * + * @return boolean + */ + public function isPartialFee(): bool + { + $target = $this->partialFee; + if (is_array($target) && !!count($target)) { + return true; + } + return false; + } + + + private function getViewName(): string { diff --git a/app/Kintone/Models/Pool.php b/app/Kintone/Models/Pool.php new file mode 100644 index 0000000..68da001 --- /dev/null +++ b/app/Kintone/Models/Pool.php @@ -0,0 +1,36 @@ + FieldType::NUMBER, + self::FIELD_CUSTOMER_NAME => FieldType::SINGLE_LINE_TEXT, + self::FIELD_POOL_AMOUNT => FieldType::NUMBER, + ]; + + protected const FIELD_NAMES = [ + ...parent::FIELD_NAMES, + ]; + + protected const RELATIONS = [ + Customer::class, + ]; +} diff --git a/app/Kintone/Models/PoolTransferHistory.php b/app/Kintone/Models/PoolTransferHistory.php new file mode 100644 index 0000000..be2c7a0 --- /dev/null +++ b/app/Kintone/Models/PoolTransferHistory.php @@ -0,0 +1,75 @@ + FieldType::NUMBER, + self::FIELD_CUSTOMER_CODE => FieldType::NUMBER, + self::FIELD_CUSTOMER_NAME => FieldType::SINGLE_LINE_TEXT, + self::FIELD_TRANSFER_DATETIME => FieldType::DATETIME, + self::FIELD_TRANSFER_TYPE => FieldType::DROP_DOWN, + self::FIELD_TRANSFER_AMOUNT => FieldType::NUMBER, + self::FIELD_POOL_AMOUNT_BEFORE => FieldType::NUMBER, + self::FIELD_POOL_AMOUNT_AFTER => FieldType::NUMBER, + self::FIELD_INCOME_METHOD => FieldType::SINGLE_LINE_TEXT, + 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_PAYMENT_PLAN_RECORD_NO => FieldType::NUMBER, + self::FIELD_SEASON_CONTRACT_RECORD_NO => FieldType::NUMBER, + ]; + + protected const FIELD_NAMES = [ + ...parent::FIELD_NAMES, + ]; + + protected const RELATIONS = [ + Customer::class, + YuchoPaymentResult::class, + SmbcPayment::class, + SmbcAccountTransferResult::class, + Pool::class, + PaymentPlan::class, + ]; +} diff --git a/app/Kintone/Models/SmbcAccountTransferResult.php b/app/Kintone/Models/SmbcAccountTransferResult.php new file mode 100644 index 0000000..f402dc8 --- /dev/null +++ b/app/Kintone/Models/SmbcAccountTransferResult.php @@ -0,0 +1,40 @@ + FieldType::NUMBER, + self::FIELD_CUSTOMER_NAME => FieldType::SINGLE_LINE_TEXT, + self::FIELD_PAYMENT_DATE => FieldType::DATE, + self::FIELD_PAYMENT_AMOUNT => FieldType::NUMBER, + self::FIELD_POOL_DONE => FieldType::CHECK_BOX, + self::FIELD_RESULT_CODE => FieldType::SINGLE_LINE_TEXT, + ]; + + protected const FIELD_NAMES = [ + ...parent::FIELD_NAMES, + ]; +} diff --git a/app/Kintone/Models/SmbcPayment.php b/app/Kintone/Models/SmbcPayment.php index ef4f8a2..d6a3885 100644 --- a/app/Kintone/Models/SmbcPayment.php +++ b/app/Kintone/Models/SmbcPayment.php @@ -12,6 +12,7 @@ use Illuminate\Support\Carbon; * @property string orderNo * @property int customerCode * @property int claimAmount + * @property string[] poolDone * @property string acceptNo * @property string paymentStatus * @property ?Carbon paymentStatusUpdateDatetime @@ -30,6 +31,8 @@ class SmbcPayment extends KintoneModel const FIELD_ORDER_NO = "請求_補助_番号"; const FIELD_CUSTOMER_CODE = "顧客コード"; const FIELD_CLAIM_AMOUNT = "請求金額"; + const FIELD_POOL_DONE = "プール済み"; + const FIELD_ACCEPT_NO = "決済受付番号"; const FIELD_PAYMENT_STATUS = "決済ステータス"; diff --git a/app/Kintone/Models/YuchoPaymentResult.php b/app/Kintone/Models/YuchoPaymentResult.php new file mode 100644 index 0000000..6341f68 --- /dev/null +++ b/app/Kintone/Models/YuchoPaymentResult.php @@ -0,0 +1,38 @@ + FieldType::NUMBER, + self::FIELD_CUSTOMER_NAME => FieldType::SINGLE_LINE_TEXT, + self::FIELD_PAYMENT_DATE => FieldType::DATE, + self::FIELD_PAYMENT_AMOUNT => FieldType::NUMBER, + self::FIELD_POOL_DONE => FieldType::CHECK_BOX, + ]; + + protected const FIELD_NAMES = [ + ...parent::FIELD_NAMES, + ]; +} diff --git a/app/Logic/PoolAttachManager.php b/app/Logic/PoolAttachManager.php new file mode 100644 index 0000000..fe234d0 --- /dev/null +++ b/app/Logic/PoolAttachManager.php @@ -0,0 +1,192 @@ + + */ + private Collection $histories; + /** + * @var Collection + */ + private Collection $plans; + /** + * @var Collection + */ + private Collection $completePlans; + + + /** + * @var Collection + */ + private Collection $firstPaymnetEntryRecordIds; + + + public function attach(Pool $pool) + { + $this->clear(); + + if ($pool->poolAmount === 0) { + throw new SkipException(sprintf("プール金なし 顧客コード:%d", $pool->customerCode)); + } + $this->pool = $pool; + + $this->plans = $this->getPaymentPlans(); + + foreach ($this->plans as $plan) { + try { + if (!$this->canAttach($plan)) { + throw new AttachStop(sprintf("残高不足のため充当途中停止 顧客コード:%d", $this->pool->customerCode)); + } + $this->makeHistory($plan); + $this->setPoolAmount($plan); + $this->setPaymentPlanDone($plan); + } catch (AttachStop $e) { + logs()->warning($e->getMessage()); + break; + } + } + + return $this; + } + + public function getFirstPaymnetEntryRecordIds() + { + return $this->firstPaymnetEntryRecordIds->keys(); + } + + private function getPaymentPlans() + { + $query = PaymentPlan::getQuery() + ->where(PaymentPlan::FIELD_CUSTOMER_CODE, $this->pool->customerCode) + ->whereNull(PaymentPlan::FIELD_APPROPRIATION_DATE) + ->where(function (KintoneRecordQuery $q) { + $q->whereNull(PaymentPlan::FIELD_APPROPRIATION_AMOUNT) + ->orWhere(PaymentPlan::FIELD_APPROPRIATION_AMOUNT, 0); + }) + ->orderByAsc(PaymentPlan::FIELD_PAYMENT_PLAN_DATE); + + $plans = PaymentPlan::getAccess()->all($query); + return $plans; + } + + private function canAttach(PaymentPlan $plan) + { + $afterPool = $this->pool->poolAmount - $plan->paymentPlanAmount; + return 0 <= $afterPool; + } + + + private function makeHistory(PaymentPlan $plan) + { + $history = new PoolTransferHistory(); + $history->poolRecordNo = $this->pool->getRecordId(); + $history->customerCode = $this->pool->customerCode; + $history->transferDatetime = DateUtil::now(); + $history->transferType = TransgerType::ATTACH; + $history->transferAmount = $plan->paymentPlanAmount; + $history->poolAmountBefore = $this->pool->poolAmount; + $history->poolAmountAfter = $this->pool->poolAmount - $plan->paymentPlanAmount; + $history->paymentPlanRecordNo = $plan->getRecordId(); + + $this->histories->push($history); + } + + private function setPoolAmount(PaymentPlan $plan) + { + + $afterPool = $this->pool->poolAmount - $plan->paymentPlanAmount; + $this->pool->poolAmount = $afterPool; + } + + private function setPaymentPlanDone(PaymentPlan $plan) + { + $plan->appropriationDate = DateUtil::now(); + $plan->appropriationAmount = $plan->paymentPlanAmount; + $plan->remainingAmount = 0; + + if (!!$plan->firstPaymentEntryRecordNo) { + $this->firstPaymnetEntryRecordIds->put($plan->firstPaymentEntryRecordNo, true); + } + + $this->completePlans->push($plan); + } + + public function save() + { + foreach ($this->histories as $history) { + $history->save(); + } + foreach ($this->completePlans as $plan) { + $plan->save(); + } + $this->pool->save(); + + $this->makeReceipt(); + + return $this; + } + + private function makeReceipt() + { + + if ($this->completePlans->isEmpty()) { + return; + } + + // 支払い種別ごとにグルーピング + $ids = []; + foreach ($this->completePlans as $plan) { + + // 保証金は領収証を発行しない + if ($plan->paymentType === PaymentType::A保証金) { + continue; + } + + $ids[$plan->paymentType][] = $plan; + } + + // 領収証作成 + foreach ($ids as $targets) { + $manager = new ReceiptManager(); + + $manager->setPaymentPlans(collect($targets)) + ->create($targets); + } + + return $this; + } + + private function clear() + { + $this->pool = null; + $this->histories = collect(); + $this->firstPaymnetEntryRecordIds = collect(); + $this->plans = collect(); + $this->completePlans = collect(); + } +} + + +class AttachStop extends Exception +{ +} diff --git a/app/Logic/PoolTransferManager.php b/app/Logic/PoolTransferManager.php new file mode 100644 index 0000000..254ecb3 --- /dev/null +++ b/app/Logic/PoolTransferManager.php @@ -0,0 +1,119 @@ +clear(); + + if (!$payment->customerCode) { + throw new SkipException(sprintf("顧客コード未割当 レコード番号:%d", $payment->getRecordId())); + } + $this->payment = $payment; + + $this->getPool(); + + $this->setPoolDone(); + + $this->makeHistory(); + + $this->setPoolAmount(); + + $this->save(); + + return $this->pool; + } + + + private function getPool() + { + $access = Pool::getAccess(); + $query = Pool::getQuery()->where(Pool::FIELD_CUSTOMER_CODE, $this->payment->customerCode); + $list = $access->some($query); + if ($list->isNotEmpty()) { + if ($list->count() !== 1) { + throw new SkipException(sprintf("データ不正 入金プール一意制約違反 顧客コード%d", $this->payment->customerCode)); + } + $this->pool = $list->first(); + return; + } + $pool = new Pool(); + $pool->customerCode = $this->payment->customerCode; + $pool->poolAmount = 0; + $pool->save(); + + $this->pool = $pool; + } + + private function makeHistory() + { + $history = new PoolTransferHistory(); + $history->poolRecordNo = $this->pool->getRecordId(); + $history->customerCode = $this->payment->customerCode; + $history->transferDatetime = DateUtil::now(); + $history->transferType = TransgerType::INCOME; + $history->transferAmount = $this->payment->paymentAmount; + $history->poolAmountBefore = $this->pool->poolAmount; + $history->poolAmountAfter = $this->pool->poolAmount + $this->payment->paymentAmount; + + if ($this->payment instanceof SmbcPayment) { + $history->incomeMethod = TransferMethod::CVS; + $history->incomeCvsPaymentRecordNo = $this->payment->getRecordId(); + } + if ($this->payment instanceof SmbcAccountTransferResult) { + $history->incomeMethod = TransferMethod::ACCOUNT_TRANSFER; + $history->incomeAccountTransferResultRecordNo = $this->payment->getRecordId(); + } + if ($this->payment instanceof YuchoPaymentResult) { + $history->incomeMethod = TransferMethod::YUCHO; + $history->incomeYuchoTransferRecordNo = $this->payment->getRecordId(); + } + + $this->history = $history; + } + + private function setPoolDone() + { + $this->payment->poolDone = ["済"]; + } + + private function setPoolAmount() + { + $this->pool->poolAmount += $this->payment->paymentAmount; + } + + private function save() + { + $this->history->save(); + $this->pool->save(); + $this->payment->save(); + } + + private function clear() + { + $this->payment = null; + $this->pool = null; + $this->history = null; + } +} diff --git a/app/Logic/ReceiptManager.php b/app/Logic/ReceiptManager.php index 2d167d5..d44817e 100644 --- a/app/Logic/ReceiptManager.php +++ b/app/Logic/ReceiptManager.php @@ -22,6 +22,8 @@ class ReceiptManager { private ?Receipt $receipt = null; + private $paymentPlans = null; + public function __construct(?int $recordNo = null) { if ($recordNo) { @@ -36,6 +38,12 @@ class ReceiptManager return $this->receipt; } + public function setPaymentPlans(Collection $paymentPlans) + { + $this->paymentPlans = $paymentPlans; + return $this; + } + public function create(array $paymentPlanRecordNoList) { @@ -67,7 +75,7 @@ class ReceiptManager $detail->amount = $detail->unitPrice * $detail->quantity; $detail->targetMonth = $payment->targetMonth ? sprintf("%d月分", $payment->targetMonth) : ""; $detail->taxRate = config("business.taxRate.normal", 0); - $detail->memo = "memo"; + $detail->memo = $this->getMemoContents($payment); $receipt->receiptDetail->push($detail); $receipt->receiptTotalAmount += $payment->appropriationAmount; } @@ -112,6 +120,9 @@ class ReceiptManager private function getPayments(array $paymentPlanRecordNoList) { + if (!!$this->paymentPlans) { + return $this->paymentPlans; + } $query = PaymentPlan::getQuery()->whereIn(PaymentPlan::FIELD_RECORD_NO, $paymentPlanRecordNoList); $ret = PaymentPlan::getAccess()->all($query); @@ -286,4 +297,13 @@ class ReceiptManager } throw new AppCommonException('申請番号取得失敗'); } + + private function getMemoContents(PaymentPlan $plan): string + { + if ($plan->isPartialFee()) { + return "日割り分"; + } + + return ""; + } } diff --git a/app/Util/CollectionUtil.php b/app/Util/CollectionUtil.php new file mode 100644 index 0000000..5a52af5 --- /dev/null +++ b/app/Util/CollectionUtil.php @@ -0,0 +1,15 @@ +push($ele); + } + } +} diff --git a/config/kintone.php b/config/kintone.php index 2e7d72c..a450440 100644 --- a/config/kintone.php +++ b/config/kintone.php @@ -50,6 +50,10 @@ return [ ...App\Kintone\Models\Ask::setConfig(), ...App\Kintone\Models\Receipt::setConfig(), ...App\Kintone\Models\SmbcPayment::setConfig(), + ...App\Kintone\Models\SmbcAccountTransferResult::setConfig(), + ...App\Kintone\Models\YuchoPaymentResult::setConfig(), + ...App\Kintone\Models\Pool::setConfig(), + ...App\Kintone\Models\PoolTransferHistory::setConfig(), ], ];