add model, controller, and seeder

This commit is contained in:
LailaWulandarii 2025-12-27 02:28:41 +07:00
parent 9e085a79b4
commit 09eadb8a5a
22 changed files with 638 additions and 50 deletions

23
app/Models/Additional.php Normal file
View File

@ -0,0 +1,23 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Additional extends Model
{
use HasFactory;
protected $table = 'additionals';
protected $primaryKey = 'id_additional';
protected $fillable = [
'nama',
'harga',
];
public function detailAdditional()
{
return $this->hasMany(DetailAdditional::class, 'id_additional');
}
}

View File

@ -0,0 +1,41 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class BookingFoto extends Model
{
use HasFactory;
protected $table = 'booking_fotos';
protected $primaryKey = 'id_booking';
protected $fillable = [
'no_invoice',
'id_pelanggan',
'id_paket',
'tgl_booking',
'jam_mulai',
'jam_selesai',
'total_bayar',
'bukti_bayar',
'status_booking',
];
public function pelanggan()
{
return $this->belongsTo(Pelanggan::class, 'id_pelanggan');
}
public function paketFoto()
{
return $this->belongsTo(PaketFoto::class, 'id_paket');
}
public function detailAdditional()
{
return $this->hasMany(DetailAdditional::class, 'id_booking');
}
}

28
app/Models/Buket.php Normal file
View File

@ -0,0 +1,28 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Buket extends Model
{
use HasFactory;
protected $table = 'bukets';
protected $primaryKey = 'id_buket';
protected $fillable = [
'nama',
'deskripsi',
'harga',
'foto',
'kategori', // Enum
'ukuran', // Enum
];
public function transaksi()
{
return $this->hasMany(TransaksiBuket::class, 'id_buket');
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class DetailAdditional extends Model
{
use HasFactory;
protected $table = 'detail_additionals';
protected $primaryKey = 'id_detail_additional';
protected $fillable = [
'id_booking',
'id_additional',
'qty',
'subtotal',
];
public function bookingFoto()
{
return $this->belongsTo(BookingFoto::class, 'id_booking');
}
public function additional()
{
return $this->belongsTo(Additional::class, 'id_additional');
}
}

27
app/Models/PaketFoto.php Normal file
View File

@ -0,0 +1,27 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class PaketFoto extends Model
{
use HasFactory;
protected $table = 'paket_fotos';
protected $primaryKey = 'id_paket';
protected $fillable = [
'nama',
'deskripsi',
'harga',
'foto',
'durasi',
];
public function booking()
{
return $this->hasMany(BookingFoto::class, 'id_paket');
}
}

30
app/Models/Pelanggan.php Normal file
View File

@ -0,0 +1,30 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Pelanggan extends Model
{
use HasFactory;
protected $table = 'pelanggans';
protected $primaryKey = 'id_pelanggan';
protected $fillable = [
'nama',
'no_wa',
];
// Relasi
public function transaksiBuket()
{
return $this->hasMany(TransaksiBuket::class, 'id_pelanggan');
}
public function bookingFoto()
{
return $this->hasMany(BookingFoto::class, 'id_pelanggan');
}
}

View File

@ -0,0 +1,36 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class TransaksiBuket extends Model
{
use HasFactory;
protected $table = 'transaksi_bukets';
protected $primaryKey = 'id_transaksi';
protected $fillable = [
'no_invoice',
'id_pelanggan',
'id_buket',
'request',
'tgl_ambil',
'total_bayar',
'bukti_bayar',
'status_transaksi',
];
// Relasi Balik
public function pelanggan()
{
return $this->belongsTo(Pelanggan::class, 'id_pelanggan');
}
public function buket()
{
return $this->belongsTo(Buket::class, 'id_buket');
}
}

View File

@ -2,47 +2,29 @@
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
/** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var list<string>
*/
protected $table = 'users';
protected $primaryKey = 'id_user';
protected $fillable = [
'name',
'nama',
'username',
'email',
'password',
'no_wa',
'alamat',
'role',
];
/**
* The attributes that should be hidden for serialization.
*
* @var list<string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
}

View File

@ -12,21 +12,16 @@
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->id('id_user'); // Primary Key custom sesuai ERD
$table->string('nama');
$table->string('username')->unique();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->string('no_wa', 20)->nullable();
$table->text('alamat')->nullable();
$table->enum('role', ['admin', 'pemilik']); // Enum Role
$table->timestamps();
});
Schema::create('password_reset_tokens', function (Blueprint $table) {
$table->string('email')->primary();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignId('user_id')->nullable()->index();
@ -43,7 +38,6 @@ public function up(): void
public function down(): void
{
Schema::dropIfExists('users');
Schema::dropIfExists('password_reset_tokens');
Schema::dropIfExists('sessions');
}
};

View File

@ -0,0 +1,34 @@
<?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('bukets', function (Blueprint $table) {
$table->id('id_buket');
$table->string('nama');
$table->text('deskripsi')->nullable();
$table->decimal('harga', 10, 2); // Format uang
$table->string('foto')->nullable();
// Enum sesuai diskusi Wireframe & ERD
$table->enum('kategori', ['single', 'fresh', 'premium_fresh', 'artificial']);
$table->enum('ukuran', ['S', 'M', 'L']);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('bukets');
}
};

View File

@ -0,0 +1,32 @@
<?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('paket_fotos', function (Blueprint $table) {
$table->id('id_paket');
$table->string('nama');
$table->text('deskripsi')->nullable();
$table->decimal('harga', 10, 2);
$table->string('foto')->nullable();
$table->integer('durasi'); // Dalam menit
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('paket_fotos');
}
};

View File

@ -0,0 +1,29 @@
<?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('additionals', function (Blueprint $table) {
$table->id('id_additional');
$table->string('nama');
$table->decimal('harga', 10, 2);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('additionals');
}
};

View File

@ -0,0 +1,29 @@
<?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('pelanggans', function (Blueprint $table) {
$table->id('id_pelanggan');
$table->string('nama');
$table->string('no_wa', 20);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('pelanggans');
}
};

View File

@ -0,0 +1,41 @@
<?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('transaksi_bukets', function (Blueprint $table) {
$table->id('id_transaksi');
$table->string('no_invoice')->unique(); // Contoh: INV-BKT-001
// Foreign Keys
$table->foreignId('id_pelanggan')->constrained('pelanggans', 'id_pelanggan')->onDelete('cascade');
$table->foreignId('id_buket')->constrained('bukets', 'id_buket')->onDelete('cascade');
$table->text('request')->nullable(); // Catatan khusus
$table->dateTime('tgl_ambil');
$table->decimal('total_bayar', 12, 2);
$table->string('bukti_bayar')->nullable();
// Enum Status Final
$table->enum('status_transaksi', ['menunggu_verifikasi', 'diproses', 'selesai', 'dibatalkan'])->default('menunggu_verifikasi');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('transaksi_bukets');
}
};

View File

@ -0,0 +1,42 @@
<?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('booking_fotos', function (Blueprint $table) {
$table->id('id_booking');
$table->string('no_invoice')->unique(); // Contoh: INV-FOTO-001
// Foreign Keys
$table->foreignId('id_pelanggan')->constrained('pelanggans', 'id_pelanggan')->onDelete('cascade');
$table->foreignId('id_paket')->constrained('paket_fotos', 'id_paket')->onDelete('cascade');
$table->date('tgl_booking');
$table->time('jam_mulai');
$table->time('jam_selesai');
$table->decimal('total_bayar', 12, 2);
$table->string('bukti_bayar')->nullable();
// Enum Status Final
$table->enum('status_booking', ['menunggu_verifikasi', 'diproses', 'selesai', 'dibatalkan'])->default('menunggu_verifikasi');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('booking_fotos');
}
};

View File

@ -0,0 +1,34 @@
<?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('detail_additionals', function (Blueprint $table) {
$table->id('id_detail_additional');
// Foreign Keys
$table->foreignId('id_booking')->constrained('booking_fotos', 'id_booking')->onDelete('cascade');
$table->foreignId('id_additional')->constrained('additionals', 'id_additional')->onDelete('cascade');
$table->integer('qty');
$table->decimal('subtotal', 12, 2); // Harga Additional * Qty
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('detail_additionals');
}
};

View File

@ -0,0 +1,22 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class AdditionalSeeder extends Seeder
{
public function run(): void
{
$data = [
['nama' => 'Timer', 'harga' => 5000],
['nama' => 'Kostum boneka', 'harga' => 35000],
['nama' => 'Bando Kucing', 'harga' => 10000],
['nama' => 'Spotlight', 'harga' => 15000],
['nama' => 'Cetak', 'harga' => 5000],
];
DB::table('additionals')->insert($data);
}
}

View File

@ -0,0 +1,41 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class BuketSeeder extends Seeder
{
public function run(): void
{
$data = [
[
'nama' => 'Buket Mawar Merah Premium',
'harga' => 150000,
'deskripsi' => 'Buket mawar merah segar isi 10 tangkai dengan wrapping premium.',
'kategori' => 'fresh',
'ukuran' => 'S',
'foto' => 'img/buket/buket1.jpg',
],
[
'nama' => 'Snack Bouquet Choco',
'harga' => 75000,
'deskripsi' => 'Buket isi beng-beng, pocky, dan coklat silverqueen.',
'kategori' => 'single',
'ukuran' => 'M',
'foto' => 'img/buket/buket2.jpg',
],
[
'nama' => 'Money Bouquet 500k',
'harga' => 550000, // Harga jasa + uang
'deskripsi' => 'Buket uang pecahan 50rb total 500rb, jasa rangkai free kartu ucapan.',
'kategori' => 'artificial',
'ukuran' => 'L',
'foto' => 'img/buket/buket3.jpg',
],
];
DB::table('bukets')->insert($data);
}
}

View File

@ -2,24 +2,18 @@
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
/**
* Seed the application's database.
*/
public function run(): void
{
// User::factory(10)->create();
User::factory()->create([
'name' => 'Test User',
'email' => 'test@example.com',
$this->call([
UserSeeder::class, // Akun Admin
BuketSeeder::class, // Produk
PaketFotoSeeder::class, // Produk
AdditionalSeeder::class, // Tambahan
PelangganSeeder::class, // Customer Dummy
]);
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class PaketFotoSeeder extends Seeder
{
public function run(): void
{
$data = [
[
'nama' => 'Wisuda Basic',
'harga' => 250000,
'deskripsi' => 'Foto wisuda outdoor 1 jam, 10 edit file, all file mentah.',
'foto' => 'img/foto/foto1.jpeg',
'durasi' => '60',
],
[
'nama' => 'Couple Studio Session',
'harga' => 350000,
'deskripsi' => 'Foto studio couple 45 menit, 2 cetak 10R, 5 edit file.',
'foto' => 'img/foto/foto2.jpeg',
'durasi' => '45',
],
[
'nama' => 'Group Photoshoot (Max 10 Orang)',
'harga' => 500000,
'deskripsi' => 'Foto grup, cocok untuk angkatan atau keluarga besar. Durasi 2 jam.',
'foto' => 'img/foto/foto3.jpeg',
'durasi' => '120',
],
];
DB::table('paket_fotos')->insert($data);
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class PelangganSeeder extends Seeder
{
public function run(): void
{
$data = [
[
'nama' => 'Siti Aminah',
'no_wa' => '081234567890',
],
[
'nama' => 'Budi Santoso',
'no_wa' => '089876543210',
],
];
DB::table('pelanggans')->insert($data);
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class UserSeeder extends Seeder
{
public function run(): void
{
DB::table('users')->insert([
'nama' => 'Bilqis',
'username' => 'admin1',
'email' => 'admin@flodo.com',
'password' => Hash::make('password123'),
'no_wa' => '0893781263',
'alamat' => 'Kauman',
'role' => 'admin',
'created_at' => now(),
'updated_at' => now(),
], [
'nama' => 'Debby',
'username' => 'ownerdebby',
'email' => 'debby@flodo.com',
'password' => Hash::make('password123'),
'no_wa' => '0893781263',
'alamat' => 'Kauman',
'role' => 'owner',
'created_at' => now(),
'updated_at' => now(),
]);
}
}