Initial commit: Struktur aplikasi ilycats

This commit is contained in:
Dwi F Sukmana
2026-02-08 15:16:35 +07:00
commit 0921901aed
235 changed files with 29016 additions and 0 deletions
+70
View File
@@ -0,0 +1,70 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Cat;
use App\Models\User;
use Illuminate\Support\Carbon;
class CatSeeder extends Seeder
{
public function run(): void
{
$user = User::first() ?? User::create([
'name' => 'Staff Cattery',
'email' => 'staff@earrincats.com',
'password' => bcrypt('password'),
'role' => 'admin'
]);
$cats = [
[
'nama_kucing' => 'Kenzo',
'ras' => 'Persian',
'jenis_kelamin' => 'Jantan',
'tanggal_lahir' => Carbon::parse('2023-01-15'),
'lokasi_kandang' => 'A1', // FIX: Hapus akhiran 'an'
'pic_id' => $user->id,
'berat_badan' => 5.2,
'riwayat_sakit_terakhir' => 'Sehat',
],
[
'nama_kucing' => 'Mochi',
'ras' => 'Persian',
'jenis_kelamin' => 'Betina',
'tanggal_lahir' => Carbon::parse('2023-03-10'),
'lokasi_kandang' => 'A2', // FIX: Hapus akhiran 'an'
'pic_id' => $user->id,
'berat_badan' => 4.1,
'riwayat_sakit_terakhir' => 'Sehat',
],
[
'nama_kucing' => 'Bruno',
'ras' => 'British Shorthair',
'jenis_kelamin' => 'Jantan',
'tanggal_lahir' => Carbon::parse('2022-11-20'),
'lokasi_kandang' => 'B1', // FIX: Hapus akhiran 'an'
'pic_id' => $user->id,
'berat_badan' => 6.5,
'riwayat_sakit_terakhir' => 'Flu Ringan',
],
[
'nama_kucing' => 'Luna',
'ras' => 'British Shorthair',
'jenis_kelamin' => 'Betina',
'tanggal_lahir' => Carbon::parse('2023-05-05'),
'lokasi_kandang' => 'B2', // FIX: Hapus akhiran 'an'
'pic_id' => $user->id,
'berat_badan' => 3.8,
'riwayat_sakit_terakhir' => 'Sembuh',
],
];
foreach ($cats as $cat) {
Cat::create($cat);
}
$this->command->info('Data dummy kucing berhasil diperbarui dan dibuat!');
}
}
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class CategorySeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$data = [
['name' => 'Antibiotik', 'keywords' => 'amoxicillin, clavamox, doxycycline, antibiotic'],
['name' => 'Antiparasit', 'keywords' => 'worm, cacing, flea, kutu, revolution, drontal'],
['name' => 'Vitamin', 'keywords' => 'stimuno, nutriplus, fish oil, minyak ikan, calcium'],
['name' => 'Vaksin', 'keywords' => 'tricat, felocell, rabies, purevax'],
['name' => 'Flu & Batuk', 'keywords' => 'flu, batuk, contracold, iliadin'],
];
foreach ($data as $item) {
\App\Models\Category::updateOrCreate(['name' => $item['name']], $item);
}
}
}
+24
View File
@@ -0,0 +1,24 @@
<?php
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
{
$this->call([
CatSeeder::class,
InventorySeeder::class,
TreatmentSeeder::class,
]);
}
}
+49
View File
@@ -0,0 +1,49 @@
<?php
namespace Database\Seeders;
use App\Models\Medicine;
use App\Models\Food;
use Illuminate\Database\Seeder;
use Illuminate\Support\Str;
class InventorySeeder extends Seeder
{
public function run(): void
{
// 1. Data Obat
// Pastikan Model Medicine juga memiliki logic slug yang sama dengan Food
Medicine::create([
'nama_obat' => 'Iliadin Drop',
'slug' => Str::slug('Iliadin Drop') . '-' . Str::random(5),
'kategori' => 'Flu & Pilek',
'qty' => 3,
'unit' => 'Botol',
'expired_date' => '2026-12-01',
]);
Medicine::create([
'nama_obat' => 'Vet-Otic',
'slug' => Str::slug('Vet-Otic') . '-' . Str::random(5),
'kategori' => 'Obat Telinga',
'qty' => 10,
'unit' => 'Pcs',
]);
// 2. Data Makanan
// Logika saving di Model Food akan tetap berjalan sebagai pengaman ganda
Food::create([
'nama_makanan' => 'Royal Canin Mother & Baby',
'slug' => Str::slug('Royal Canin Mother & Baby') . '-' . Str::random(5),
'qty' => 2,
'unit' => 'Zak',
]);
Food::create([
'nama_makanan' => 'Equilibrio Kitten',
'slug' => Str::slug('Equilibrio Kitten') . '-' . Str::random(5),
'qty' => 15,
'unit' => 'Kg',
]);
}
}
+72
View File
@@ -0,0 +1,72 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Cat;
use App\Models\Matting;
use App\Models\Kitten;
use Illuminate\Support\Carbon;
class MattingSeeder extends Seeder
{
public function run(): void
{
// Ambil data kucing untuk indukan
$sires = Cat::where('jenis_kelamin', 'Jantan')->get();
$dams = Cat::where('jenis_kelamin', 'Betina')->get();
if ($sires->isEmpty() || $dams->isEmpty()) {
$this->command->warn("Data kucing jantan/betina belum ada. Jalankan CatSeeder dulu!");
return;
}
// SCENARIO 1: Breeding Baru (Countdown Indigo)
// Estimasi lahir masih sekitar 50 hari lagi
Matting::create([
'sire_id' => $sires->first()->id,
'dam_id' => $dams->first()->id,
'ems_bapak' => 'BSH a',
'ems_ibu' => 'BSH a',
'tgl_kawin_awal' => Carbon::now()->subDays(10),
'tgl_kawin_akhir' => Carbon::now()->subDays(7),
'jumlah_anak_hidup' => 0,
]);
// SCENARIO 2: Breeding Urgent (Countdown Merah + Pulse)
// Sisa 3 hari lagi menuju HPL (H+63)
Matting::create([
'sire_id' => $sires->last()->id,
'dam_id' => $dams->last()->id,
'ems_bapak' => 'PER n 03',
'ems_ibu' => 'PER f 03',
'tgl_kawin_awal' => Carbon::now()->subDays(60),
'tgl_kawin_akhir' => Carbon::now()->subDays(57),
'jumlah_anak_hidup' => 0,
]);
// SCENARIO 3: Breeding Selesai (Menampilkan Jumlah Anak)
$m3 = Matting::create([
'sire_id' => $sires->random()->id,
'dam_id' => $dams->random()->id,
'ems_bapak' => 'BSH ns 11',
'ems_ibu' => 'BSH ns 11',
'tgl_kawin_awal' => Carbon::now()->subMonths(4),
'tgl_kawin_akhir' => Carbon::now()->subMonths(4)->addDays(3),
'jumlah_anak_hidup' => 3,
]);
// Tambahkan data anak kucing untuk Matting ke-3
for ($i = 1; $i <= 3; $i++) {
Kitten::create([
'matting_id' => $m3->id,
'nama' => 'Earrin ' . ['Shadow', 'Snowy', 'Ginger'][$i-1],
'jenis_kelamin' => $i % 2 == 0 ? 'Betina' : 'Jantan',
'tgl_lahir' => Carbon::now()->subMonths(2),
'kode_ems' => 'BSH ns 11',
]);
}
$this->command->info("Dummy Matting Cattery berhasil dibuat!");
}
}
+74
View File
@@ -0,0 +1,74 @@
<?php
namespace Database\Seeders;
use App\Models\Role;
use App\Models\User;
use App\Models\RolePermission;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\DB;
class RoleAndUserSeeder extends Seeder
{
public function run(): void
{
// 1. Definisikan Modul yang ada di aplikasi ilycats
$modules = [
'cats' => 'Manajemen Kucing',
'matting' => 'Breeding & Matting',
'treatments'=> 'Rekam Medis',
'inventory' => 'Logistik & Stok',
'users' => 'Manajemen User',
'roles' => 'Hak Akses',
'logs' => 'Audit Trail',
'settings' => 'Pengaturan Sistem'
];
DB::transaction(function () use ($modules) {
// 2. Buat Role Admin
$adminRole = Role::updateOrCreate(
['slug' => 'admin'],
['name' => 'Administrator']
);
// Berikan Admin akses FULL ke semua modul
foreach ($modules as $slug => $label) {
RolePermission::updateOrCreate([
'role_id' => $adminRole->id,
'module_slug' => $slug,
], [
'can_read' => 1, 'can_create' => 1, 'can_update' => 1, 'can_delete' => 1
]);
}
// 3. Buat Role Staff
$staffRole = Role::updateOrCreate(
['slug' => 'staff'],
['name' => 'Staff Operasional']
);
// Berikan Staff akses terbatas (Hanya Operasional & Tanpa Delete)
$staffModules = ['cats', 'matting', 'treatments', 'inventory'];
foreach ($staffModules as $slug) {
RolePermission::updateOrCreate([
'role_id' => $staffRole->id,
'module_slug' => $slug,
], [
'can_read' => 1, 'can_create' => 1, 'can_update' => 1, 'can_delete' => 0
]);
}
// 4. Buat User Admin Pertama (Agar bisa login)
User::updateOrCreate(
['email' => 'admin@ilycats.com'],
[
'name' => 'Super Admin',
'password' => Hash::make('password123'), // Silakan ganti nanti
'role_id' => $adminRole->id,
'role' => 'admin', // Menjaga kompatibilitas kode lama Anda
]
);
});
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace Database\Seeders;
use App\Models\Supply;
use Illuminate\Database\Seeder;
class SupplySeeder extends Seeder
{
/**
* Jalankan database seeds untuk perlengkapan Ily Cattery.
*/
public function run(): void
{
// HAPUS $this->call dari sini!
$supplies = [
['nama_perlengkapan' => 'Pasir Gumpal Bento 10L Lavender', 'qty' => 15, 'unit' => 'bag'],
['nama_perlengkapan' => 'Kandang Alumunium Besar 3 Pintu', 'qty' => 2, 'unit' => 'unit'],
['nama_perlengkapan' => 'Sisir Grooming Stainless Steel', 'qty' => 5, 'unit' => 'pcs'],
['nama_perlengkapan' => 'Mainan Stick Bulu Interaktif', 'qty' => 12, 'unit' => 'pcs'],
['nama_perlengkapan' => 'Bowl Makan Keramik Anti-Semut', 'qty' => 20, 'unit' => 'pcs'],
['nama_perlengkapan' => 'Pet Cargo Transporter Hitam', 'qty' => 4, 'unit' => 'unit'],
['nama_perlengkapan' => 'Gunting Kuku Kucing Ergonomis', 'qty' => 3, 'unit' => 'pcs'],
['nama_perlengkapan' => 'Handuk Microfiber Khusus Mandi', 'qty' => 10, 'unit' => 'pcs'],
];
foreach ($supplies as $item) {
/**
* Menggunakan Model::create agar event 'saving' di booted() terpanggil.
* Ini penting agar kategori terisi otomatis.
*/
Supply::create($item);
}
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace Database\Seeders;
use App\Models\Cat;
use App\Models\Treatment;
use Illuminate\Database\Seeder;
class TreatmentSeeder extends Seeder
{
public function run(): void
{
$milo = Cat::where('nama_kucing', 'Milo')->first();
$oliver = Cat::where('nama_kucing', 'Oliver')->first();
if ($milo) {
Treatment::create([
'cat_id' => $milo->id,
'tanggal' => now()->subDays(2),
'keluhan' => 'Bersin terus menerus',
'nama_obat' => 'Flu-Cat Syrup',
'dosis' => '0.5ml / 2x sehari',
]);
}
if ($oliver) {
Treatment::create([
'cat_id' => $oliver->id,
'tanggal' => now()->subDay(),
'keluhan' => 'Gatal di telinga',
'nama_obat' => 'Salep Scabies',
'dosis' => 'Oles tipis pagi/malam',
]);
}
}
}