31+32 - Fix entries migration: nullable unit_price/total_cost, consolidate rename migration into source

This commit is contained in:
myrmidex 2026-05-04 21:54:51 +02:00
parent cdb1e268e4
commit 195e316da5
3 changed files with 30 additions and 83 deletions

View file

@ -1,33 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('purchases', function (Blueprint $table) {
$table->id();
$table->date('date');
$table->decimal('shares', 12, 6); // Supports fractional shares
$table->decimal('price_per_share', 8, 4); // Price in euros
$table->decimal('total_cost', 12, 2); // Total cost in euros
$table->timestamps();
$table->index('date');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('purchases');
}
};

View file

@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('entries', function (Blueprint $table): void {
$table->id();
$table->foreignId('tracker_id')->constrained()->cascadeOnDelete();
$table->date('date');
$table->decimal('quantity', 12, 6);
$table->decimal('unit_price', 12, 4)->nullable();
$table->decimal('total_cost', 12, 2)->nullable();
$table->timestamps();
$table->index(['tracker_id', 'date']);
});
}
public function down(): void
{
Schema::dropIfExists('entries');
}
};

View file

@ -1,50 +0,0 @@
<?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
{
// Rename table
Schema::rename('purchases', 'entries');
Schema::table('entries', function (Blueprint $table) {
// Rename columns
$table->renameColumn('shares', 'quantity');
$table->renameColumn('price_per_share', 'unit_price');
// Add tracker_id FK (nullable first so we can backfill)
$table->foreignId('tracker_id')->nullable()->after('id')->constrained()->cascadeOnDelete();
});
// Backfill tracker_id: assign all entries to the first tracker (single-user app)
$trackerId = DB::table('trackers')->value('id');
if ($trackerId) {
DB::table('entries')->update(['tracker_id' => $trackerId]);
}
// Make tracker_id non-nullable now that it's backfilled
Schema::table('entries', function (Blueprint $table) {
$table->unsignedBigInteger('tracker_id')->nullable(false)->change();
});
}
public function down(): void
{
Schema::table('entries', function (Blueprint $table) {
$table->dropForeign(['tracker_id']);
$table->dropColumn('tracker_id');
});
Schema::table('entries', function (Blueprint $table) {
$table->renameColumn('unit_price', 'price_per_share');
$table->renameColumn('quantity', 'shares');
});
Schema::rename('entries', 'purchases');
}
};