feat(companies): add kvk_number column for B2B identity binding (WS-6)

WS-6 binding-target registry references company.kvk_number as a B2B
identity-key candidate. The column needed to exist on the model
before the registry could legitimately reference it. Nullable
because not every Company has a registered KvK (foreign companies,
partners, agencies); identity-key publish guards enforce presence
where required, not at schema level.

Changes:
- New migration `2026_04_28_140000_add_kvk_number_to_companies_table`
  adds nullable string column + index after `type`.
- Company::$fillable expanded.
- CompanyFactory generates an 8-digit KvK by default.
- CompanyKvkNumberTest covers attribute persistence, nullability,
  and information_schema-verified index existence.
- SCHEMA.md → v2.8 with the new column row + indexes line.
- Schema dump regenerated (CI fast-path).

Migration step counts in 5 backfill tests bumped +1 (the new
migration sits at the top of the migration stack):
  - FormFieldBindingMigrationTest:           18→19, 16→17
  - ConditionalLogicBackfillTest:             7→8
  - FormFieldConfigBackfillAndDropTest:      13→14
  - FormFieldOptionsBackfillTest:             3→4
  - FormFieldValidationRuleBackfillTest:     16→17

Refs: WS-6 sessie 3a binding-target drift audit

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-28 20:17:56 +02:00
parent ccc9dc905b
commit 383b4fc5a3
11 changed files with 116 additions and 29 deletions

View File

@@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
namespace Tests\Unit\Models;
use App\Models\Company;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
use Tests\TestCase;
final class CompanyKvkNumberTest extends TestCase
{
use RefreshDatabase;
public function test_company_has_kvk_number_attribute(): void
{
$company = Company::factory()->create(['kvk_number' => '12345678']);
$this->assertSame('12345678', $company->fresh()->kvk_number);
}
public function test_kvk_number_is_nullable(): void
{
$company = Company::factory()->create(['kvk_number' => null]);
$this->assertNull($company->fresh()->kvk_number);
}
public function test_kvk_number_is_indexed(): void
{
$row = DB::selectOne(
'SELECT INDEX_NAME FROM information_schema.STATISTICS '
."WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'companies' AND COLUMN_NAME = 'kvk_number'"
);
$this->assertNotNull($row, 'Expected index on companies.kvk_number');
}
}