Schema::create('roles', function (Blueprint $table) { $table->id(); $table->enum('nombre', ['administrador', 'representante', 'publico']); $table->timestamps(); }); chema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email') ->unique(); $table->timestamp('email_verified_at') ->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); Schema::create('role_user', function (Blueprint $table) { $table->id(); $table->foreignId('user_id') ->constrained() ->onDelete('cascade'); $table->foreignId('role_id') ->constrained() ->onDelete('cascade'); $table->unique(['user_id', 'role_id']); $table->timestamps(); }); Schema::create('clubs', function (Blueprint $table) { $table->id(); $table->string('nombre')->unique(); $table->string('representante_nombre'); $table->string('email')->unique(); $table->string('direccion')->nullable(); $table->foreignId('user_id')->nullable()->constrained()->onDelete('set null'); $table->timestamps(); }); Schema::create('categorias', function (Blueprint $table) { $table->id(); $table->string('nombre')->unique(); $table->integer('edad_minima'); $table->integer('edad_maxima'); $table->timestamps(); }); Schema::create('disciplinas', function (Blueprint $table) { $table->id(); $table->string('nombre')->unique(); $table->string('descripcion')->nullable(); $table->string('tipo_estadistica_principal')->default('Punto'); $table->timestamps(); }); Schema::create('campeonatos', function (Blueprint $table) { $table->id(); $table->string('nombre')->unique(); $table->year('ano_referencia'); $table->date('fecha_inicio')->nullable(); $table->date('fecha_fin')->nullable(); $table->enum('estado', ['inscripcion', 'en_proceso', 'finalizado', 'cancelado']) ->default('inscripcion'); $table->timestamps(); }); Schema::create('campeonato_reglas', function (Blueprint $table) { $table->id(); $table->foreignId('campeonato_id')->constrained('campeonatos')->onDelete('cascade'); $table->foreignId('disciplina_id')->constrained('disciplinas')->onDelete('cascade'); $table->foreignId('categoria_id')->constrained('categorias')->onDelete('cascade'); $table->integer('max_equipos_club')->default(1); $table->unique(['campeonato_id', 'disciplina_id', 'categoria_id'], 'unique_campeonato_regla'); $table->timestamps(); }); Schema::create('jugadors', function (Blueprint $table) { $table->id(); $table->foreignId('club_id')->constrained('clubs')->onDelete('cascade'); $table->string('nombre'); $table->string('apellido'); $table->date('fecha_nacimiento'); $table->string('identificacion'); $table->string('genero'); $table->string('telefono'); $table->string('foto_path')->nullable(); $table->decimal('peso', 5, 2)->nullable(); $table->decimal('estatura', 5, 2)->nullable(); $table->integer('numero')->nullable(); $table->string('posicion')->nullable(); $table->timestamps(); }); Schema::create('inscripcions', function (Blueprint $table) { $table->id(); // Clave foránea al jugador (quien se inscribe) $table->foreignId('jugador_id')->constrained('jugadors')->onDelete('cascade'); // Clave foránea a la regla (en qué se inscribe) $table->foreignId('campeonato_regla_id')->constrained('campeonato_reglas')->onDelete('cascade'); // Fecha y estado de la inscripción $table->date('fecha_inscripcion'); $table->string('estado')->default('pendiente'); // 'pendiente', 'aprobada', 'rechazada' // Un jugador solo puede inscribirse una vez en la misma regla $table->unique(['jugador_id', 'campeonato_regla_id']); $table->timestamps(); }); Schema::create('equipos', function (Blueprint $table) { $table->id(); $table->foreignId('campeonato_regla_id') ->constrained('campeonato_reglas') ->onDelete('cascade'); $table->foreignId('club_id') ->constrained('clubs') ->onDelete('cascade'); $table->string('nombre', 150); $table->foreignId('capitan_id') ->nullable() ->constrained('jugadors') ->onDelete('set null'); $table->timestamps(); $table->unique(['campeonato_regla_id', 'club_id'], 'club_regla_unique'); }); Schema::create('partidos', function (Blueprint $table) { $table->id(); $table->foreignId('campeonato_regla_id') ->constrained('campeonato_reglas') ->onDelete('cascade'); $table->unsignedInteger('jornada_numero'); $table->foreignId('equipo_local_id') ->constrained('equipos') ->onDelete('cascade'); $table->foreignId('equipo_visitante_id') ->constrained('equipos') ->onDelete('cascade'); $table->dateTime('fecha_hora') ->nullable(); $table->unsignedInteger('goles_local') ->nullable(); $table->unsignedInteger('goles_visitante') ->nullable(); $table->enum('estado', ['PROGRAMADO', 'JUGADO', 'POSTERGADO', 'CANCELADO']) ->default('PROGRAMADO'); $table->timestamps(); $table->unique(['jornada_numero', 'equipo_local_id']); $table->unique(['jornada_numero', 'equipo_visitante_id']); }); Schema::create('asignacion_jugadors', function (Blueprint $table) { $table->id(); $table->foreignId('jugador_id')->constrained('jugadors')->onDelete('cascade'); $table->foreignId('equipo_id')->constrained('equipos')->onDelete('cascade'); $table->boolean('activo')->default(true); $table->timestamps(); $table->unique(['jugador_id', 'equipo_id']); });