Files
sam-api/database/seeders/Dummy/DummyBillSeeder.php
hskwon 71123128ff feat: 어음 관리(Bill Management) API 추가
- BillController: 어음 CRUD + 상태변경 + 요약 API
- BillService: 비즈니스 로직 (멀티테넌트 지원)
- Bill, BillInstallment 모델: 날짜 포맷(Y-m-d) toArray 오버라이드
- FormRequest: Store/Update/UpdateStatus 유효성 검사
- Swagger 문서: BillApi.php
- 마이그레이션: bills, bill_installments 테이블
- DummyBillSeeder: 테스트 데이터 30건 + 차수 12건
- API Routes: /api/v1/bills 엔드포인트 7개
2025-12-23 23:42:02 +09:00

168 lines
11 KiB
PHP

<?php
namespace Database\Seeders\Dummy;
use App\Models\Orders\Client;
use App\Models\Tenants\BankAccount;
use App\Models\Tenants\Bill;
use App\Models\Tenants\BillInstallment;
use Database\Seeders\DummyDataSeeder;
use Illuminate\Database\Seeder;
class DummyBillSeeder extends Seeder
{
public function run(): void
{
$tenantId = DummyDataSeeder::TENANT_ID;
$userId = DummyDataSeeder::USER_ID;
// 거래처 매핑
$clients = Client::where('tenant_id', $tenantId)->get()->keyBy('name');
// 은행계좌 (대표계좌)
$primaryBankId = BankAccount::where('tenant_id', $tenantId)
->where('is_primary', true)
->value('id');
// 수취 어음 데이터 (received) - 15건
$receivedBills = [
['bill_number' => '202501000001', 'client' => '삼성전자', 'amount' => 50000000, 'issue_date' => '2025-01-15', 'maturity_date' => '2025-04-15', 'status' => 'paymentComplete'],
['bill_number' => '202501000002', 'client' => 'LG전자', 'amount' => 35000000, 'issue_date' => '2025-02-10', 'maturity_date' => '2025-05-10', 'status' => 'paymentComplete'],
['bill_number' => '202502000001', 'client' => 'SK하이닉스', 'amount' => 80000000, 'issue_date' => '2025-02-20', 'maturity_date' => '2025-05-20', 'status' => 'paymentComplete'],
['bill_number' => '202503000001', 'client' => '현대자동차', 'amount' => 45000000, 'issue_date' => '2025-03-05', 'maturity_date' => '2025-06-05', 'status' => 'maturityResult'],
['bill_number' => '202504000001', 'client' => '네이버', 'amount' => 25000000, 'issue_date' => '2025-04-12', 'maturity_date' => '2025-07-12', 'status' => 'maturityResult'],
['bill_number' => '202505000001', 'client' => '카카오', 'amount' => 18000000, 'issue_date' => '2025-05-08', 'maturity_date' => '2025-08-08', 'status' => 'stored'],
['bill_number' => '202506000001', 'client' => '쿠팡', 'amount' => 32000000, 'issue_date' => '2025-06-15', 'maturity_date' => '2025-09-15', 'status' => 'stored'],
['bill_number' => '202507000001', 'client' => '삼성SDS', 'amount' => 65000000, 'issue_date' => '2025-07-20', 'maturity_date' => '2025-10-20', 'status' => 'stored'],
['bill_number' => '202508000001', 'client' => '토스', 'amount' => 15000000, 'issue_date' => '2025-08-10', 'maturity_date' => '2025-11-10', 'status' => 'stored'],
['bill_number' => '202509000001', 'client' => '두산에너빌리티', 'amount' => 55000000, 'issue_date' => '2025-09-05', 'maturity_date' => '2025-12-05', 'status' => 'maturityAlert'],
['bill_number' => '202510000001', 'client' => '삼성전자', 'amount' => 42000000, 'issue_date' => '2025-10-15', 'maturity_date' => '2026-01-15', 'status' => 'stored'],
['bill_number' => '202511000001', 'client' => 'LG전자', 'amount' => 28000000, 'issue_date' => '2025-11-08', 'maturity_date' => '2026-02-08', 'status' => 'stored'],
['bill_number' => '202511000002', 'client' => '네이버', 'amount' => 38000000, 'issue_date' => '2025-11-20', 'maturity_date' => '2026-02-20', 'status' => 'stored'],
['bill_number' => '202512000001', 'client' => '현대자동차', 'amount' => 52000000, 'issue_date' => '2025-12-10', 'maturity_date' => '2026-03-10', 'status' => 'stored'],
['bill_number' => '202512000002', 'client' => 'SK하이닉스', 'amount' => 70000000, 'issue_date' => '2025-12-18', 'maturity_date' => '2026-03-18', 'status' => 'stored'],
];
// 발행 어음 데이터 (issued) - 15건
$issuedBills = [
['bill_number' => '202501100001', 'client' => '한화솔루션', 'amount' => 40000000, 'issue_date' => '2025-01-20', 'maturity_date' => '2025-04-20', 'status' => 'collectionComplete'],
['bill_number' => '202502100001', 'client' => '포스코', 'amount' => 55000000, 'issue_date' => '2025-02-15', 'maturity_date' => '2025-05-15', 'status' => 'collectionComplete'],
['bill_number' => '202503100001', 'client' => '롯데케미칼', 'amount' => 30000000, 'issue_date' => '2025-03-10', 'maturity_date' => '2025-06-10', 'status' => 'collectionComplete'],
['bill_number' => '202504100001', 'client' => 'GS칼텍스', 'amount' => 22000000, 'issue_date' => '2025-04-18', 'maturity_date' => '2025-07-18', 'status' => 'collectionComplete'],
['bill_number' => '202505100001', 'client' => '대한항공', 'amount' => 18000000, 'issue_date' => '2025-05-12', 'maturity_date' => '2025-08-12', 'status' => 'collectionRequest'],
['bill_number' => '202506100001', 'client' => '현대제철', 'amount' => 48000000, 'issue_date' => '2025-06-20', 'maturity_date' => '2025-09-20', 'status' => 'collectionRequest'],
['bill_number' => '202507100001', 'client' => 'SK이노베이션', 'amount' => 35000000, 'issue_date' => '2025-07-15', 'maturity_date' => '2025-10-15', 'status' => 'stored'],
['bill_number' => '202508100001', 'client' => 'CJ대한통운', 'amount' => 25000000, 'issue_date' => '2025-08-22', 'maturity_date' => '2025-11-22', 'status' => 'stored'],
['bill_number' => '202509100001', 'client' => '두산에너빌리티', 'amount' => 60000000, 'issue_date' => '2025-09-10', 'maturity_date' => '2025-12-10', 'status' => 'maturityAlert'],
['bill_number' => '202510100001', 'client' => '한화솔루션', 'amount' => 45000000, 'issue_date' => '2025-10-08', 'maturity_date' => '2026-01-08', 'status' => 'stored'],
['bill_number' => '202511100001', 'client' => '포스코', 'amount' => 58000000, 'issue_date' => '2025-11-05', 'maturity_date' => '2026-02-05', 'status' => 'stored'],
['bill_number' => '202511100002', 'client' => '롯데케미칼', 'amount' => 32000000, 'issue_date' => '2025-11-18', 'maturity_date' => '2026-02-18', 'status' => 'stored'],
['bill_number' => '202512100001', 'client' => 'GS칼텍스', 'amount' => 28000000, 'issue_date' => '2025-12-05', 'maturity_date' => '2026-03-05', 'status' => 'stored'],
['bill_number' => '202512100002', 'client' => '현대제철', 'amount' => 42000000, 'issue_date' => '2025-12-15', 'maturity_date' => '2026-03-15', 'status' => 'stored'],
['bill_number' => '202512100003', 'client' => 'SK이노베이션', 'amount' => 38000000, 'issue_date' => '2025-12-22', 'maturity_date' => '2026-03-22', 'status' => 'stored'],
];
// 차수 관리 데이터
$installmentsData = [
'202501000001' => [
['date' => '2025-02-15', 'amount' => 25000000, 'note' => '1차 분할 입금'],
['date' => '2025-03-15', 'amount' => 25000000, 'note' => '2차 분할 입금'],
],
'202502000001' => [
['date' => '2025-03-20', 'amount' => 40000000, 'note' => '1차 분할 입금'],
['date' => '2025-04-20', 'amount' => 40000000, 'note' => '2차 분할 입금'],
],
'202507000001' => [
['date' => '2025-08-20', 'amount' => 30000000, 'note' => '1차 분할 입금'],
['date' => '2025-09-20', 'amount' => 35000000, 'note' => '2차 분할 입금'],
],
'202501100001' => [
['date' => '2025-02-20', 'amount' => 20000000, 'note' => '1차 분할 지급'],
['date' => '2025-03-20', 'amount' => 20000000, 'note' => '2차 분할 지급'],
],
'202502100001' => [
['date' => '2025-03-15', 'amount' => 27500000, 'note' => '1차 분할 지급'],
['date' => '2025-04-15', 'amount' => 27500000, 'note' => '2차 분할 지급'],
],
'202506100001' => [
['date' => '2025-07-20', 'amount' => 24000000, 'note' => '1차 분할 지급'],
['date' => '2025-08-20', 'amount' => 24000000, 'note' => '2차 분할 지급'],
],
];
$billCount = 0;
$installmentCount = 0;
// 수취 어음 생성
foreach ($receivedBills as $data) {
$client = $clients->get($data['client']);
$bill = Bill::create([
'tenant_id' => $tenantId,
'bill_number' => $data['bill_number'],
'bill_type' => 'received',
'client_id' => $client?->id,
'client_name' => $client ? null : $data['client'],
'amount' => $data['amount'],
'issue_date' => $data['issue_date'],
'maturity_date' => $data['maturity_date'],
'status' => $data['status'],
'is_electronic' => rand(0, 1) === 1,
'bank_account_id' => $primaryBankId,
'installment_count' => isset($installmentsData[$data['bill_number']]) ? count($installmentsData[$data['bill_number']]) : 0,
'created_by' => $userId,
]);
$billCount++;
// 차수 관리 데이터 추가
if (isset($installmentsData[$data['bill_number']])) {
foreach ($installmentsData[$data['bill_number']] as $instData) {
BillInstallment::create([
'bill_id' => $bill->id,
'installment_date' => $instData['date'],
'amount' => $instData['amount'],
'note' => $instData['note'],
]);
$installmentCount++;
}
}
}
// 발행 어음 생성
foreach ($issuedBills as $data) {
$client = $clients->get($data['client']);
$bill = Bill::create([
'tenant_id' => $tenantId,
'bill_number' => $data['bill_number'],
'bill_type' => 'issued',
'client_id' => $client?->id,
'client_name' => $client ? null : $data['client'],
'amount' => $data['amount'],
'issue_date' => $data['issue_date'],
'maturity_date' => $data['maturity_date'],
'status' => $data['status'],
'is_electronic' => rand(0, 1) === 1,
'bank_account_id' => $primaryBankId,
'installment_count' => isset($installmentsData[$data['bill_number']]) ? count($installmentsData[$data['bill_number']]) : 0,
'created_by' => $userId,
]);
$billCount++;
// 차수 관리 데이터 추가
if (isset($installmentsData[$data['bill_number']])) {
foreach ($installmentsData[$data['bill_number']] as $instData) {
BillInstallment::create([
'bill_id' => $bill->id,
'installment_date' => $instData['date'],
'amount' => $instData['amount'],
'note' => $instData['note'],
]);
$installmentCount++;
}
}
}
$this->command->info(' ✓ bills: '.$billCount.'건 생성');
$this->command->info(' ✓ bill_installments: '.$installmentCount.'건 생성');
}
}