sebelum membaca ini pastikan user telah melakukan context prompt gmenu dan dmenunya

berikut adalah cara bagaimana melakukan seeding untuk sys_table

context:

- seeder ini dibuat untuk Framework atau CMS like app yang menjadi base dari project kali ini.
- fungsinya adalah menyimpan data yang di butuhkan oleh sistem agar sistem bisa menampilkan menu add, edit, list, dan show pada data yang ada di database

untuk membuatnya:

1. dimulai dengan membuat seeder dengan tabel_<table_name>.php
2. di dalamnya kurang lebih, contoh pada tabel_users.php:

    <?php

        namespace Database\Seeders;

        use Illuminate\Database\Console\Seeds\WithoutModelEvents;
        use Illuminate\Database\Seeder;
        use Illuminate\Support\Facades\DB;

        class tabel_users extends Seeder
        {
            /**
            * Run the database seeds.
            */
            public function run(): void
            {
                DB::table('sys_table')->where(['gmenu' => 'system', 'dmenu' => 'usersx'])->delete();

                DB::table('sys_table')->insert([
                    'gmenu' => 'system',
                    'dmenu' => 'usersx',
                    'urut' => '1',
                    'field' => 'username',
                    'alias' => 'Username',
                    'type' => 'string',
                    'length' => '20',
                    'decimals' => '0',
                    'default' => '',
                    'validate' => 'required|max:255|min:2|unique:users,username',
                    'primary' => '1',
                    'filter' => '1',
                    'list' => '1',
                    'show' => '1',
                    'query' => '',
                    'class' => 'lower notspace',
                    'note' => 'Username hanya boleh mengandung huruf kecil dan tanpa spasi'
                ]);

                DB::table('sys_table')->insert([
                    'gmenu' => 'system',
                    'dmenu' => 'usersx',
                    'urut' => '2',
                    'field' => 'firstname',
                    'alias' => 'First Name',
                    'type' => 'string',
                    'length' => '255',
                    'decimals' => '0',
                    'default' => '',
                    'validate' => 'required|max:255|min:2',
                    'primary' => '0',
                    'filter' => '1',
                    'list' => '1',
                    'show' => '1',
                    'query' => '',
                    'class' => '',
                    'note' => 'Isi dengan nama depan user'
                ]);

                DB::table('sys_table')->insert([
                    'gmenu' => 'system',
                    'dmenu' => 'usersx',
                    'urut' => '3',
                    'field' => 'lastname',
                    'alias' => 'Last Name',
                    'type' => 'string',
                    'length' => '255',
                    'decimals' => '0',
                    'default' => '',
                    'validate' => 'required|max:255|min:2',
                    'primary' => '0',
                    'filter' => '1',
                    'list' => '1',
                    'show' => '1',
                    'query' => '',
                    'class' => '',
                    'note' => 'Isi dengan nama belakang user'
                ]);

                DB::table('sys_table')->insert([
                    'gmenu' => 'system',
                    'dmenu' => 'usersx',
                    'urut' => '4',
                    'field' => 'email',
                    'alias' => 'Email',
                    'type' => 'email',
                    'length' => '255',
                    'decimals' => '0',
                    'default' => '',
                    'validate' => 'required|email|max:255|unique:users,email',
                    'primary' => '2',
                    'filter' => '1',
                    'list' => '1',
                    'show' => '1',
                    'query' => '',
                    'class' => '',
                    'note' => 'Isi dengan email user'
                ]);

                DB::table('sys_table')->insert([
                    'gmenu' => 'system',
                    'dmenu' => 'usersx',
                    'urut' => '5',
                    'field' => 'idroles',
                    'alias' => 'ID Roles',
                    'type' => 'enum',
                    'length' => '6',
                    'decimals' => '0',
                    'default' => '',
                    'validate' => 'required',
                    'primary' => '0',
                    'filter' => '1',
                    'list' => '1',
                    'show' => '1',
                    'query' => "select idroles, name from sys_roles where isactive = '1'",
                    'class' => 'select-multiple custom-select',
                    'note' => 'Pilih satu atau lebih roles untuk user ini'
                ]);

                DB::table('sys_table')->insert([
                    'gmenu' => 'system',
                    'dmenu' => 'usersx',
                    'urut' => '7',
                    'field' => 'password',
                    'alias' => 'Password',
                    'type' => 'password',
                    'length' => '50',
                    'decimals' => '0',
                    'default' => 'MSJframework123!',
                    'validate' => 'required|max:50|min:6|regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).+$/',
                    'primary' => '0',
                    'filter' => '1',
                    'list' => '0',
                    'show' => '1',
                    'query' => "",
                    'class' => '',
                    'note' => 'Password harus mengandung minimal 1 huruf besar, 1 huruf kecil, 1 angka, dan 1 karakter spesial'
                ]);

                DB::table('sys_table')->insert([ // isactive wajib ada
                    'gmenu' => 'system',
                    'dmenu' => 'usersx',
                    'urut' => '8',
                    'field' => 'isactive',
                    'alias' => 'Status',
                    'type' => 'enum',
                    'length' => '1',
                    'decimals' => '0',
                    'default' => '1',
                    'validate' => '',
                    'primary' => '0',
                    'filter' => '1',
                    'list' => '1',
                    'show' => '0',
                    'query' => "select value, name from sys_enum where idenum = 'isactive' and isactive = '1'",
                    'class' => '',
                    'note' => 'Status aktif atau tidak aktif'
                ]);

                DB::table('sys_table')->insert([
                    'gmenu' => 'system',
                    'dmenu' => 'usersx',
                    'urut' => '9',
                    'field' => 'image',
                    'alias' => 'Foto Profil',
                    'type' => 'image',
                    'length' => '2048',
                    'decimals' => '0',
                    'default' => 'noimage.png',
                    'validate' => 'mimes:png,PNG,jpg,JPG,jpeg,JPEG|file|max:2048',
                    'primary' => '0',
                    'filter' => '1',
                    'list' => '1',
                    'show' => '1',
                    'query' => '',
                    'class' => '',
                    'note' => 'Upload foto profil user dalam format PNG atau JPG maksimal 2MB'
                ]);
            }
        }

2.1. nah di database nya itu struktur table usernya:

	#	Name	Type	Collation	Attributes	Null	Default	Comments	Extra	Action
	1	id Primary	bigint(20)		UNSIGNED	No	None		AUTO_INCREMENT	Change Change	Drop Drop	
	2	username Index	varchar(20)	utf8mb4_unicode_ci		No	None			Change Change	Drop Drop	
	3	firstname	varchar(255)	utf8mb4_unicode_ci		Yes	NULL			Change Change	Drop Drop	
	4	lastname	varchar(255)	utf8mb4_unicode_ci		Yes	NULL			Change Change	Drop Drop	
	5	email Index	varchar(255)	utf8mb4_unicode_ci		No	None			Change Change	Drop Drop	
	6	email_verified_at	timestamp			Yes	NULL			Change Change	Drop Drop	
	7	password	varchar(255)	utf8mb4_unicode_ci		No	None			Change Change	Drop Drop	
	8	address	varchar(255)	utf8mb4_unicode_ci		Yes	NULL			Change Change	Drop Drop	
	9	city	varchar(255)	utf8mb4_unicode_ci		Yes	NULL			Change Change	Drop Drop	
	10	country	varchar(255)	utf8mb4_unicode_ci		Yes	NULL			Change Change	Drop Drop	
	11	postal	varchar(255)	utf8mb4_unicode_ci		Yes	NULL			Change Change	Drop Drop	
	12	about	text	utf8mb4_unicode_ci		Yes	NULL			Change Change	Drop Drop	
	13	idroles	longtext	utf8mb4_unicode_ci		Yes	NULL			Change Change	Drop Drop	
	14	image	varchar(255)	utf8mb4_unicode_ci		No	noimage.png			Change Change	Drop Drop	
	15	isactive	enum('0', '1')	utf8mb4_unicode_ci		No	1			Change Change	Drop Drop	
	16	remember_token	varchar(100)	utf8mb4_unicode_ci		Yes	NULL			Change Change	Drop Drop	
	17	created_at	timestamp			No	current_timestamp()			Change Change	Drop Drop	
	18	updated_at	timestamp			No	current_timestamp()		ON UPDATE CURRENT_TIMESTAMP()	Change Change	Drop Drop	
	19	user_create	varchar(255)	utf8mb4_unicode_ci		Yes	NULL			Change Change	Drop Drop	
	20	user_update	varchar(255)	utf8mb4_unicode_ci		Yes	NULL			Change Change	Drop Drop	

    Memang ada beberapa kolom yang tidak di masukkan ke sys_table, itu karena kolom tsbt tidak di perlukan untuk di tampilkan di front end (seperti remember_token, created_at, updated_at, user_create, user_update)

3. bisa di lihat diatas, setiap kolom harus di define kan sehingga system tahu bahwa table tsbt memiliki data seperti apa, sehingga bisa di tampilkan

4. berikut detail perdata yang di masukkan:

                DB::table('sys_table')->insert([
                    'gmenu' => 'system', // sesuai id dari gmenu (harunya user prompting context ini)
                    'dmenu' => 'usersx', // sesuai id dari dmenu (harunya user prompting context ini)
                    'urut' => '7', // urutan ke berapa data ini di tampilkan
                    'field' => 'password', // nama field di database
                    'alias' => 'Password', // label yang di tampilkan di front end
                    'type' => 'password', // tipe data, contoh lain: 
                                                                        char - Character
                                                                        currency - Currency
                                                                        date - Date
                                                                        date2 - Date Between  (Masih under development, sebaiknya jangan di gunakan)
                                                                        email - Email
                                                                        enum - Select Option (Gunakan jika data optionnya sedikit dan statis)
                                                                        file - File Upload
                                                                        hidden - Hidden
                                                                        image - Image
                                                                        join - Join (Masih under development, sebaiknya jangan di gunakan)
                                                                        number - Number
                                                                        password - Password
                                                                        report - Report (Masih under development, sebaiknya jangan di gunakan)
                                                                        search - Modal Search (Gunakan jika anda rasa data optionnya terlalu banyak untuk di masukkan di enum)
                                                                        string - String
                                                                        sublink - Sub Link (Masih under development, sebaiknya jangan di gunakan)
                                                                        text - Text
                    'length' => '50', // panjang maksimal data
                    'decimals' => '0', // jumlah desimal (jika ada)
                    'default' => 'MSJframework123!', // nilai default jika tidak di isi
                    'validate' => 'required|max:50|min:6|regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).+$/', // aturan validasi laravel
                    'primary' => '0', // apakah field ini termasuk primary key (1 = ya, 0 = tidak)
                    'filter' => '1', // apakah field ini bisa di filter di front end (1 = ya, 0 = tidak)
                    'list' => '0', // apakah field ini bisa di tampilkan di list (1 = ya, 0 = tidak)
                    'show' => '1', // apakah field ini bisa di tampilkan di detail, add, dan edit (1 = ya, 0 = tidak)
                    'query' => "" // nah khusus query ini, hanya di gunakan jika tipe datanya enum atau search, isinya adalah query untuk mengambil data optionnya (Jika AI merasa bingung karena tidak tahu konteks data database, maka bisa di skip dan kasih comment aja, jadi nanti developer yang mengisi data ini),
                    'class' => '', // class tambahan better not to be used karena masih under development,
                    'note' => 'Password harus mengandung minimal 1 huruf besar, 1 huruf kecil, 1 angka, dan 1 karakter spesial' // catatan tambahan untuk field ini, recomended untuk di isi sesuai kebutuhan
                ]);

5. setelah seeder di buat, selesai, developer akan mengecek dan menjalankan seeder ini di projectnya (JANGAN menjalankan by default, dev harus melakukan review).

note: field isactive itu wajib ada jika di tabel database ada field isactive, karena di sistem itu ada pengecekan untuk field itu, kalau tidak ada akan terjadi error.
