112 lines
6.2 KiB
PHP
112 lines
6.2 KiB
PHP
<?php
|
|
|
|
use Illuminate\Database\Migrations\Migration;
|
|
use Illuminate\Database\Schema\Blueprint;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Schema;
|
|
|
|
return new class extends Migration
|
|
{
|
|
public function up(): void
|
|
{
|
|
Schema::create('investment_reference_options', function (Blueprint $t) {
|
|
$t->id();
|
|
$t->string('group');
|
|
$t->string('code');
|
|
$t->string('label');
|
|
$t->boolean('active')->default(true);
|
|
$t->boolean('requires_description')->default(false);
|
|
$t->unsignedInteger('sort_order')->default(0);
|
|
$t->timestampsTz();
|
|
$t->unique(['group', 'code']);
|
|
});
|
|
Schema::create('opportunity_profiles', function (Blueprint $t) {
|
|
$t->foreignId('opportunity_id')->primary()->constrained('opportunities')->restrictOnDelete();
|
|
$t->boolean('is_education')->default(false)->index();
|
|
$t->unsignedInteger('version')->default(1);
|
|
$t->text('business_model')->nullable();
|
|
$t->text('requirements')->nullable();
|
|
$t->text('risks')->nullable();
|
|
$t->date('target_date')->nullable();
|
|
$t->text('source_reference')->nullable();
|
|
$t->timestampsTz();
|
|
});
|
|
foreach (['clusters' => ['cluster_id', 'economic_clusters'], 'corridors' => ['corridor_id', 'development_corridors'],
|
|
'projects' => ['project_id', 'projects'], 'locations' => ['geo_location_id', 'geo_locations']] as $name => [$foreign, $target]) {
|
|
Schema::create('opportunity_'.$name, function (Blueprint $t) use ($foreign, $target) {
|
|
$t->foreignId('opportunity_id')->constrained('opportunities')->restrictOnDelete();
|
|
$t->foreignUuid($foreign)->constrained($target)->restrictOnDelete();
|
|
$t->primary(['opportunity_id', $foreign]);
|
|
$t->index($foreign);
|
|
});
|
|
}
|
|
Schema::create('opportunity_facets', function (Blueprint $t) {
|
|
$t->foreignId('opportunity_id')->constrained('opportunities')->restrictOnDelete();
|
|
$t->foreignId('option_id')->constrained('investment_reference_options')->restrictOnDelete();
|
|
$t->primary(['opportunity_id', 'option_id']);
|
|
$t->index('option_id');
|
|
});
|
|
Schema::create('investment_submissions', function (Blueprint $t) {
|
|
$t->uuid('id')->primary();
|
|
$t->foreignId('user_id')->constrained('users')->restrictOnDelete();
|
|
$t->foreignId('opportunity_id')->nullable()->constrained('opportunities')->restrictOnDelete();
|
|
$t->foreignUuid('dossier_id')->nullable()->constrained('investment_dossiers')->restrictOnDelete();
|
|
$t->foreignId('interest_request_id')->nullable()->unique()->constrained('interest_requests')->restrictOnDelete();
|
|
$t->text('payload');
|
|
$t->string('status')->default('draft')->index();
|
|
$t->unsignedInteger('version')->default(1);
|
|
$t->timestampsTz();
|
|
$t->index(['user_id', 'status']);
|
|
});
|
|
DB::statement("ALTER TABLE investment_submissions ADD CONSTRAINT submission_status CHECK(status IN ('draft','submitted')), ADD CONSTRAINT submission_target CHECK(num_nonnulls(opportunity_id,dossier_id)<=1), ADD CONSTRAINT submission_receipt CHECK ((status='draft' AND interest_request_id IS NULL) OR (status='submitted' AND interest_request_id IS NOT NULL))");
|
|
Schema::create('investment_specific_needs', function (Blueprint $t) {
|
|
$t->id();
|
|
$t->foreignUuid('submission_id')->constrained('investment_submissions')->restrictOnDelete();
|
|
$t->foreignId('category_id')->constrained('investment_reference_options')->restrictOnDelete();
|
|
$t->foreignId('option_id')->constrained('investment_reference_options')->restrictOnDelete();
|
|
$t->foreignId('unit_id')->nullable()->constrained('investment_reference_options')->restrictOnDelete();
|
|
$t->foreignId('priority_id')->nullable()->constrained('investment_reference_options')->restrictOnDelete();
|
|
$t->decimal('quantity', 16, 2)->nullable();
|
|
$t->date('deadline')->nullable();
|
|
$t->text('details');
|
|
$t->timestampsTz();
|
|
});
|
|
DB::statement('ALTER TABLE investment_specific_needs ADD CONSTRAINT need_quantity CHECK(quantity IS NULL OR quantity>=0)');
|
|
Schema::create('investment_submission_attachments', function (Blueprint $t) {
|
|
$t->uuid('id')->primary();
|
|
$t->foreignUuid('submission_id')->constrained('investment_submissions')->restrictOnDelete();
|
|
$t->foreignUuid('document_id')->constrained('documents')->restrictOnDelete();
|
|
$t->timestampsTz();
|
|
});
|
|
Schema::create('investment_submission_events', function (Blueprint $t) {
|
|
$t->id();
|
|
$t->foreignUuid('submission_id')->constrained('investment_submissions')->restrictOnDelete();
|
|
$t->foreignId('actor_id')->constrained('users')->restrictOnDelete();
|
|
$t->string('action');
|
|
$t->unsignedInteger('version');
|
|
$t->timestampTz('created_at')->useCurrent();
|
|
});
|
|
Schema::create('opportunity_favourites', function (Blueprint $t) {
|
|
$t->foreignId('user_id')->constrained('users')->restrictOnDelete();
|
|
$t->foreignId('opportunity_id')->constrained('opportunities')->restrictOnDelete();
|
|
$t->timestampsTz();
|
|
$t->primary(['user_id', 'opportunity_id']);
|
|
});
|
|
}
|
|
|
|
public function down(): void
|
|
{
|
|
$tables = ['opportunity_favourites', 'investment_submission_events', 'investment_submission_attachments', 'investment_specific_needs',
|
|
'investment_submissions', 'opportunity_facets', 'opportunity_locations', 'opportunity_projects', 'opportunity_corridors', 'opportunity_clusters',
|
|
'opportunity_profiles', 'investment_reference_options'];
|
|
foreach ($tables as $table) {
|
|
if (DB::table($table)->exists()) {
|
|
throw new RuntimeException('Preserve investment unification data before rollback.');
|
|
}
|
|
}
|
|
foreach ($tables as $table) {
|
|
Schema::dropIfExists($table);
|
|
}
|
|
}
|
|
};
|