From 8cfab74e1f9d6a13a8b8782dc1fc8a3c7456feb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Mon, 23 Feb 2026 15:43:21 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[receivables]=20=EB=AF=B8=EB=B6=84?= =?UTF-8?q?=EA=B0=9C=20=ED=99=88=ED=83=9D=EC=8A=A4=20=EB=A7=A4=EC=B6=9C?= =?UTF-8?q?=EC=84=B8=EA=B8=88=EA=B3=84=EC=82=B0=EC=84=9C=EB=8F=84=20?= =?UTF-8?q?=EC=99=B8=EC=83=81=EB=A7=A4=EC=B6=9C=EA=B8=88=20=EC=9B=90?= =?UTF-8?q?=EC=9E=A5=EC=97=90=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Finance/ReceivableController.php | 67 ++++++++++++++++++- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Finance/ReceivableController.php b/app/Http/Controllers/Finance/ReceivableController.php index 4d9da6fa..99b5c363 100644 --- a/app/Http/Controllers/Finance/ReceivableController.php +++ b/app/Http/Controllers/Finance/ReceivableController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Finance; use App\Http\Controllers\Controller; +use App\Models\Barobill\HometaxInvoice; use App\Models\Barobill\HometaxInvoiceJournal; use App\Models\Finance\JournalEntryLine; use App\Models\Finance\Receivable; @@ -195,8 +196,9 @@ public function ledger(Request $request): JsonResponse $items = collect(); - // 1) 홈택스 분개에서 외상매출금(108) 조회 + // 1) 홈택스 매출세금계산서에서 외상매출금 조회 if ($source !== 'journal') { + // 1-a) 분개 완료된 건: hometax_invoice_journals에서 계정코드 108 $hometaxQuery = HometaxInvoiceJournal::where('tenant_id', $tenantId) ->where('account_code', '108') ->where('invoice_type', 'sales'); @@ -211,6 +213,12 @@ public function ledger(Request $request): JsonResponse $hometaxQuery->where('trading_partner_name', 'like', "%{$partner}%"); } + $journaledInvoiceIds = HometaxInvoiceJournal::where('tenant_id', $tenantId) + ->where('invoice_type', 'sales') + ->distinct() + ->pluck('hometax_invoice_id') + ->toArray(); + $hometaxItems = $hometaxQuery->get()->map(fn ($j) => [ 'date' => $j->write_date?->format('Y-m-d'), 'source' => 'hometax', @@ -223,6 +231,34 @@ public function ledger(Request $request): JsonResponse ]); $items = $items->merge($hometaxItems); + + // 1-b) 미분개 매출세금계산서: total_amount를 차변(발생)으로 표시 + $unjournaledQuery = HometaxInvoice::where('tenant_id', $tenantId) + ->where('invoice_type', 'sales') + ->whereNotIn('id', $journaledInvoiceIds); + + if ($startDate) { + $unjournaledQuery->where('write_date', '>=', $startDate); + } + if ($endDate) { + $unjournaledQuery->where('write_date', '<=', $endDate); + } + if ($partner) { + $unjournaledQuery->where('invoicee_corp_name', 'like', "%{$partner}%"); + } + + $unjournaledItems = $unjournaledQuery->get()->map(fn ($inv) => [ + 'date' => $inv->write_date?->format('Y-m-d'), + 'source' => 'hometax', + 'sourceLabel' => '홈택스 매출 (미분개)', + 'refNo' => $inv->nts_confirm_num, + 'tradingPartnerName' => $inv->invoicee_corp_name, + 'description' => '매출세금계산서 (미분개)', + 'debitAmount' => (int) $inv->total_amount, + 'creditAmount' => 0, + ]); + + $items = $items->merge($unjournaledItems); } // 2) 일반전표에서 외상매출금(108) 조회 @@ -294,7 +330,8 @@ public function summary(Request $request): JsonResponse $items = collect(); - // 1) 홈택스 분개에서 외상매출금(108) + // 1) 홈택스 매출세금계산서에서 외상매출금 + // 1-a) 분개 완료된 건 $hometaxQuery = HometaxInvoiceJournal::where('tenant_id', $tenantId) ->where('account_code', '108') ->where('invoice_type', 'sales'); @@ -306,6 +343,12 @@ public function summary(Request $request): JsonResponse $hometaxQuery->where('write_date', '<=', $endDate); } + $journaledInvoiceIds = HometaxInvoiceJournal::where('tenant_id', $tenantId) + ->where('invoice_type', 'sales') + ->distinct() + ->pluck('hometax_invoice_id') + ->toArray(); + $hometaxItems = $hometaxQuery->get()->map(fn ($j) => [ 'tradingPartnerName' => $j->trading_partner_name, 'debitAmount' => $j->dc_type === 'debit' ? (int) $j->debit_amount : 0, @@ -314,6 +357,26 @@ public function summary(Request $request): JsonResponse ]); $items = $items->merge($hometaxItems); + // 1-b) 미분개 매출세금계산서 + $unjournaledQuery = HometaxInvoice::where('tenant_id', $tenantId) + ->where('invoice_type', 'sales') + ->whereNotIn('id', $journaledInvoiceIds); + + if ($startDate) { + $unjournaledQuery->where('write_date', '>=', $startDate); + } + if ($endDate) { + $unjournaledQuery->where('write_date', '<=', $endDate); + } + + $unjournaledItems = $unjournaledQuery->get()->map(fn ($inv) => [ + 'tradingPartnerName' => $inv->invoicee_corp_name, + 'debitAmount' => (int) $inv->total_amount, + 'creditAmount' => 0, + 'date' => $inv->write_date?->format('Y-m-d'), + ]); + $items = $items->merge($unjournaledItems); + // 2) 일반전표에서 외상매출금(108) $journalQuery = JournalEntryLine::where('journal_entry_lines.tenant_id', $tenantId) ->where('journal_entry_lines.account_code', '108')