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']); + }); + } +};