From 1e161c16b0950979353bd829181ba770adfc6fe3 Mon Sep 17 00:00:00 2001 From: hskwon Date: Wed, 24 Dec 2025 15:46:09 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A7=A4=EC=B6=9C=20=EC=84=B8=EA=B8=88?= =?UTF-8?q?=EA=B3=84=EC=82=B0=EC=84=9C/=EA=B1=B0=EB=9E=98=EB=AA=85?= =?UTF-8?q?=EC=84=B8=EC=84=9C=20=ED=86=A0=EA=B8=80=20API=20=EC=97=B0?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - UpdateSaleRequest: tax_invoice_issued, transaction_statement_issued 필드 추가 - SaleService: 토글 필드 업데이트 로직 추가 (canEdit 우회) - Sale 모델: fillable에 토글 필드 추가 - 마이그레이션: sales 테이블에 토글 컬럼 추가 --- .../Requests/V1/Sale/UpdateSaleRequest.php | 2 ++ app/Models/Tenants/Sale.php | 6 +++- app/Services/SaleService.php | 14 +++++++-- ...51437_add_invoice_flags_to_sales_table.php | 29 +++++++++++++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 database/migrations/2025_12_24_151437_add_invoice_flags_to_sales_table.php diff --git a/app/Http/Requests/V1/Sale/UpdateSaleRequest.php b/app/Http/Requests/V1/Sale/UpdateSaleRequest.php index 565632a..11d69b8 100644 --- a/app/Http/Requests/V1/Sale/UpdateSaleRequest.php +++ b/app/Http/Requests/V1/Sale/UpdateSaleRequest.php @@ -21,6 +21,8 @@ public function rules(): array 'total_amount' => ['sometimes', 'numeric', 'min:0'], 'description' => ['nullable', 'string', 'max:1000'], 'deposit_id' => ['nullable', 'integer', 'exists:deposits,id'], + 'tax_invoice_issued' => ['sometimes', 'boolean'], + 'transaction_statement_issued' => ['sometimes', 'boolean'], ]; } diff --git a/app/Models/Tenants/Sale.php b/app/Models/Tenants/Sale.php index d285973..0520579 100644 --- a/app/Models/Tenants/Sale.php +++ b/app/Models/Tenants/Sale.php @@ -21,6 +21,8 @@ class Sale extends Model 'total_amount', 'description', 'status', + 'tax_invoice_issued', + 'transaction_statement_issued', 'tax_invoice_id', 'deposit_id', 'created_by', @@ -29,11 +31,13 @@ class Sale extends Model ]; protected $casts = [ - 'sale_date' => 'date', + 'sale_date' => 'date:Y-m-d', 'supply_amount' => 'decimal:2', 'tax_amount' => 'decimal:2', 'total_amount' => 'decimal:2', 'client_id' => 'integer', + 'tax_invoice_issued' => 'boolean', + 'transaction_statement_issued' => 'boolean', 'tax_invoice_id' => 'integer', 'deposit_id' => 'integer', ]; diff --git a/app/Services/SaleService.php b/app/Services/SaleService.php index 985a3da..3f3f77a 100644 --- a/app/Services/SaleService.php +++ b/app/Services/SaleService.php @@ -117,8 +117,12 @@ public function update(int $id, array $data): Sale ->where('tenant_id', $tenantId) ->findOrFail($id); - // 확정 후에는 수정 불가 - if (! $sale->canEdit()) { + // 토글 필드만 업데이트하는 경우는 canEdit 체크 건너뛰기 + $toggleOnlyFields = ['tax_invoice_issued', 'transaction_statement_issued']; + $isToggleOnly = count(array_diff(array_keys($data), $toggleOnlyFields)) === 0; + + // 확정 후에는 수정 불가 (토글 필드만 업데이트하는 경우 제외) + if (! $isToggleOnly && ! $sale->canEdit()) { throw new \Exception(__('error.sale.cannot_edit')); } @@ -143,6 +147,12 @@ public function update(int $id, array $data): Sale if (array_key_exists('deposit_id', $data)) { $sale->deposit_id = $data['deposit_id']; } + if (array_key_exists('tax_invoice_issued', $data)) { + $sale->tax_invoice_issued = $data['tax_invoice_issued']; + } + if (array_key_exists('transaction_statement_issued', $data)) { + $sale->transaction_statement_issued = $data['transaction_statement_issued']; + } $sale->updated_by = $userId; $sale->save(); diff --git a/database/migrations/2025_12_24_151437_add_invoice_flags_to_sales_table.php b/database/migrations/2025_12_24_151437_add_invoice_flags_to_sales_table.php new file mode 100644 index 0000000..78e9793 --- /dev/null +++ b/database/migrations/2025_12_24_151437_add_invoice_flags_to_sales_table.php @@ -0,0 +1,29 @@ +boolean('tax_invoice_issued')->default(false)->after('status')->comment('세금계산서 발행완료'); + $table->boolean('transaction_statement_issued')->default(false)->after('tax_invoice_issued')->comment('거래명세서 발행완료'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('sales', function (Blueprint $table) { + $table->dropColumn(['tax_invoice_issued', 'transaction_statement_issued']); + }); + } +};