diff --git a/Modules/Countries/Config/config.php b/Modules/Countries/Config/config.php index cbb563c5..8bdf3d1d 100644 --- a/Modules/Countries/Config/config.php +++ b/Modules/Countries/Config/config.php @@ -2,7 +2,7 @@ return [ 'name' => 'Countries', - 'features' => - [ - ], + 'allow_manual_create' => false, + 'allow_delete' => false, + 'default_active' => true, ]; diff --git a/Modules/Countries/Database/Migrations/2026_06_15_000000_create_countries_table.php b/Modules/Countries/Database/Migrations/2026_06_15_000000_create_countries_table.php new file mode 100644 index 00000000..11b8e856 --- /dev/null +++ b/Modules/Countries/Database/Migrations/2026_06_15_000000_create_countries_table.php @@ -0,0 +1,34 @@ +id(); + $table->char('alpha2', 2)->unique()->comment('ISO 3166-1 alpha-2 country code.'); + $table->char('alpha3', 3)->unique()->comment('ISO 3166-1 alpha-3 country code.'); + $table->char('numeric', 3)->nullable()->unique()->comment('ISO 3166-1 numeric country code.'); + $table->string('name')->comment('Canonical ISO country name.'); + $table->string('official_name')->nullable()->comment('Official ISO country name where available.'); + $table->string('common_name')->nullable()->comment('Common country name where available.'); + $table->string('display_name')->nullable()->comment('Application-specific display name override.'); + $table->string('flag_emoji', 16)->nullable()->comment('Regional indicator flag emoji derived from alpha-2 code.'); + $table->boolean('is_active')->default(true)->index()->comment('Whether this country is available for selection in business workflows.'); + $table->unsignedInteger('sort_order')->default(0)->index()->comment('Optional UI ordering override.'); + $table->timestamp('last_synced_at')->nullable()->comment('Last time this row was synced from bundled ISO data.'); + $table->timestamps(); + $table->index(['is_active', 'sort_order', 'name']); + $table->index(['name']); + }); + } + + public function down(): void + { + Schema::dropIfExists('countries'); + } +}; diff --git a/Modules/Countries/Database/Seeders/CountriesDatabaseSeeder.php b/Modules/Countries/Database/Seeders/CountriesDatabaseSeeder.php index 96cd4662..4bb03801 100644 --- a/Modules/Countries/Database/Seeders/CountriesDatabaseSeeder.php +++ b/Modules/Countries/Database/Seeders/CountriesDatabaseSeeder.php @@ -3,19 +3,11 @@ namespace Modules\Countries\Database\Seeders; use Illuminate\Database\Seeder; -use Illuminate\Database\Eloquent\Model; class CountriesDatabaseSeeder extends Seeder { - /** - * Run the database seeds. - * - * @return void - */ - public function run() + public function run(): void { - Model::unguard(); - - // $this->call("OthersTableSeeder"); + $this->call(IsoCountriesSeeder::class); } } diff --git a/Modules/Countries/Database/Seeders/IsoCountriesSeeder.php b/Modules/Countries/Database/Seeders/IsoCountriesSeeder.php new file mode 100644 index 00000000..2f836829 --- /dev/null +++ b/Modules/Countries/Database/Seeders/IsoCountriesSeeder.php @@ -0,0 +1,277 @@ + 'AD', 'alpha3' => 'AND', 'numeric' => '020', 'name' => 'Andorra', 'official_name' => 'Principality of Andorra', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ฉ'], + ['alpha2' => 'AE', 'alpha3' => 'ARE', 'numeric' => '784', 'name' => 'United Arab Emirates', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ช'], + ['alpha2' => 'AF', 'alpha3' => 'AFG', 'numeric' => '004', 'name' => 'Afghanistan', 'official_name' => 'Islamic Republic of Afghanistan', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ซ'], + ['alpha2' => 'AG', 'alpha3' => 'ATG', 'numeric' => '028', 'name' => 'Antigua and Barbuda', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ฌ'], + ['alpha2' => 'AI', 'alpha3' => 'AIA', 'numeric' => '660', 'name' => 'Anguilla', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ฎ'], + ['alpha2' => 'AL', 'alpha3' => 'ALB', 'numeric' => '008', 'name' => 'Albania', 'official_name' => 'Republic of Albania', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ฑ'], + ['alpha2' => 'AM', 'alpha3' => 'ARM', 'numeric' => '051', 'name' => 'Armenia', 'official_name' => 'Republic of Armenia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ฒ'], + ['alpha2' => 'AO', 'alpha3' => 'AGO', 'numeric' => '024', 'name' => 'Angola', 'official_name' => 'Republic of Angola', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ด'], + ['alpha2' => 'AQ', 'alpha3' => 'ATA', 'numeric' => '010', 'name' => 'Antarctica', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ถ'], + ['alpha2' => 'AR', 'alpha3' => 'ARG', 'numeric' => '032', 'name' => 'Argentina', 'official_name' => 'Argentine Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ท'], + ['alpha2' => 'AS', 'alpha3' => 'ASM', 'numeric' => '016', 'name' => 'American Samoa', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ธ'], + ['alpha2' => 'AT', 'alpha3' => 'AUT', 'numeric' => '040', 'name' => 'Austria', 'official_name' => 'Republic of Austria', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡น'], + ['alpha2' => 'AU', 'alpha3' => 'AUS', 'numeric' => '036', 'name' => 'Australia', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡บ'], + ['alpha2' => 'AW', 'alpha3' => 'ABW', 'numeric' => '533', 'name' => 'Aruba', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ผ'], + ['alpha2' => 'AX', 'alpha3' => 'ALA', 'numeric' => '248', 'name' => 'ร…land Islands', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ฝ'], + ['alpha2' => 'AZ', 'alpha3' => 'AZE', 'numeric' => '031', 'name' => 'Azerbaijan', 'official_name' => 'Republic of Azerbaijan', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฆ๐Ÿ‡ฟ'], + ['alpha2' => 'BA', 'alpha3' => 'BIH', 'numeric' => '070', 'name' => 'Bosnia and Herzegovina', 'official_name' => 'Republic of Bosnia and Herzegovina', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ฆ'], + ['alpha2' => 'BB', 'alpha3' => 'BRB', 'numeric' => '052', 'name' => 'Barbados', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ง'], + ['alpha2' => 'BD', 'alpha3' => 'BGD', 'numeric' => '050', 'name' => 'Bangladesh', 'official_name' => 'People\'s Republic of Bangladesh', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ฉ'], + ['alpha2' => 'BE', 'alpha3' => 'BEL', 'numeric' => '056', 'name' => 'Belgium', 'official_name' => 'Kingdom of Belgium', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ช'], + ['alpha2' => 'BF', 'alpha3' => 'BFA', 'numeric' => '854', 'name' => 'Burkina Faso', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ซ'], + ['alpha2' => 'BG', 'alpha3' => 'BGR', 'numeric' => '100', 'name' => 'Bulgaria', 'official_name' => 'Republic of Bulgaria', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ฌ'], + ['alpha2' => 'BH', 'alpha3' => 'BHR', 'numeric' => '048', 'name' => 'Bahrain', 'official_name' => 'Kingdom of Bahrain', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ญ'], + ['alpha2' => 'BI', 'alpha3' => 'BDI', 'numeric' => '108', 'name' => 'Burundi', 'official_name' => 'Republic of Burundi', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ฎ'], + ['alpha2' => 'BJ', 'alpha3' => 'BEN', 'numeric' => '204', 'name' => 'Benin', 'official_name' => 'Republic of Benin', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ฏ'], + ['alpha2' => 'BL', 'alpha3' => 'BLM', 'numeric' => '652', 'name' => 'Saint Barthรฉlemy', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ฑ'], + ['alpha2' => 'BM', 'alpha3' => 'BMU', 'numeric' => '060', 'name' => 'Bermuda', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ฒ'], + ['alpha2' => 'BN', 'alpha3' => 'BRN', 'numeric' => '096', 'name' => 'Brunei Darussalam', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ณ'], + ['alpha2' => 'BO', 'alpha3' => 'BOL', 'numeric' => '068', 'name' => 'Bolivia, Plurinational State of', 'official_name' => 'Plurinational State of Bolivia', 'common_name' => 'Bolivia', 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ด'], + ['alpha2' => 'BQ', 'alpha3' => 'BES', 'numeric' => '535', 'name' => 'Bonaire, Sint Eustatius and Saba', 'official_name' => 'Bonaire, Sint Eustatius and Saba', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ถ'], + ['alpha2' => 'BR', 'alpha3' => 'BRA', 'numeric' => '076', 'name' => 'Brazil', 'official_name' => 'Federative Republic of Brazil', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ท'], + ['alpha2' => 'BS', 'alpha3' => 'BHS', 'numeric' => '044', 'name' => 'Bahamas', 'official_name' => 'Commonwealth of the Bahamas', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ธ'], + ['alpha2' => 'BT', 'alpha3' => 'BTN', 'numeric' => '064', 'name' => 'Bhutan', 'official_name' => 'Kingdom of Bhutan', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡น'], + ['alpha2' => 'BV', 'alpha3' => 'BVT', 'numeric' => '074', 'name' => 'Bouvet Island', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ป'], + ['alpha2' => 'BW', 'alpha3' => 'BWA', 'numeric' => '072', 'name' => 'Botswana', 'official_name' => 'Republic of Botswana', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ผ'], + ['alpha2' => 'BY', 'alpha3' => 'BLR', 'numeric' => '112', 'name' => 'Belarus', 'official_name' => 'Republic of Belarus', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡พ'], + ['alpha2' => 'BZ', 'alpha3' => 'BLZ', 'numeric' => '084', 'name' => 'Belize', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ง๐Ÿ‡ฟ'], + ['alpha2' => 'CA', 'alpha3' => 'CAN', 'numeric' => '124', 'name' => 'Canada', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ฆ'], + ['alpha2' => 'CC', 'alpha3' => 'CCK', 'numeric' => '166', 'name' => 'Cocos (Keeling) Islands', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡จ'], + ['alpha2' => 'CD', 'alpha3' => 'COD', 'numeric' => '180', 'name' => 'Congo, The Democratic Republic of the', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ฉ'], + ['alpha2' => 'CF', 'alpha3' => 'CAF', 'numeric' => '140', 'name' => 'Central African Republic', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ซ'], + ['alpha2' => 'CG', 'alpha3' => 'COG', 'numeric' => '178', 'name' => 'Congo', 'official_name' => 'Republic of the Congo', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ฌ'], + ['alpha2' => 'CH', 'alpha3' => 'CHE', 'numeric' => '756', 'name' => 'Switzerland', 'official_name' => 'Swiss Confederation', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ญ'], + ['alpha2' => 'CI', 'alpha3' => 'CIV', 'numeric' => '384', 'name' => 'Cรดte d\'Ivoire', 'official_name' => 'Republic of Cรดte d\'Ivoire', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ฎ'], + ['alpha2' => 'CK', 'alpha3' => 'COK', 'numeric' => '184', 'name' => 'Cook Islands', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ฐ'], + ['alpha2' => 'CL', 'alpha3' => 'CHL', 'numeric' => '152', 'name' => 'Chile', 'official_name' => 'Republic of Chile', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ฑ'], + ['alpha2' => 'CM', 'alpha3' => 'CMR', 'numeric' => '120', 'name' => 'Cameroon', 'official_name' => 'Republic of Cameroon', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ฒ'], + ['alpha2' => 'CN', 'alpha3' => 'CHN', 'numeric' => '156', 'name' => 'China', 'official_name' => 'People\'s Republic of China', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ณ'], + ['alpha2' => 'CO', 'alpha3' => 'COL', 'numeric' => '170', 'name' => 'Colombia', 'official_name' => 'Republic of Colombia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ด'], + ['alpha2' => 'CR', 'alpha3' => 'CRI', 'numeric' => '188', 'name' => 'Costa Rica', 'official_name' => 'Republic of Costa Rica', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ท'], + ['alpha2' => 'CU', 'alpha3' => 'CUB', 'numeric' => '192', 'name' => 'Cuba', 'official_name' => 'Republic of Cuba', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡บ'], + ['alpha2' => 'CV', 'alpha3' => 'CPV', 'numeric' => '132', 'name' => 'Cabo Verde', 'official_name' => 'Republic of Cabo Verde', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ป'], + ['alpha2' => 'CW', 'alpha3' => 'CUW', 'numeric' => '531', 'name' => 'Curaรงao', 'official_name' => 'Curaรงao', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ผ'], + ['alpha2' => 'CX', 'alpha3' => 'CXR', 'numeric' => '162', 'name' => 'Christmas Island', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ฝ'], + ['alpha2' => 'CY', 'alpha3' => 'CYP', 'numeric' => '196', 'name' => 'Cyprus', 'official_name' => 'Republic of Cyprus', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡พ'], + ['alpha2' => 'CZ', 'alpha3' => 'CZE', 'numeric' => '203', 'name' => 'Czechia', 'official_name' => 'Czech Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡จ๐Ÿ‡ฟ'], + ['alpha2' => 'DE', 'alpha3' => 'DEU', 'numeric' => '276', 'name' => 'Germany', 'official_name' => 'Federal Republic of Germany', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฉ๐Ÿ‡ช'], + ['alpha2' => 'DJ', 'alpha3' => 'DJI', 'numeric' => '262', 'name' => 'Djibouti', 'official_name' => 'Republic of Djibouti', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฉ๐Ÿ‡ฏ'], + ['alpha2' => 'DK', 'alpha3' => 'DNK', 'numeric' => '208', 'name' => 'Denmark', 'official_name' => 'Kingdom of Denmark', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฉ๐Ÿ‡ฐ'], + ['alpha2' => 'DM', 'alpha3' => 'DMA', 'numeric' => '212', 'name' => 'Dominica', 'official_name' => 'Commonwealth of Dominica', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฉ๐Ÿ‡ฒ'], + ['alpha2' => 'DO', 'alpha3' => 'DOM', 'numeric' => '214', 'name' => 'Dominican Republic', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฉ๐Ÿ‡ด'], + ['alpha2' => 'DZ', 'alpha3' => 'DZA', 'numeric' => '012', 'name' => 'Algeria', 'official_name' => 'People\'s Democratic Republic of Algeria', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฉ๐Ÿ‡ฟ'], + ['alpha2' => 'EC', 'alpha3' => 'ECU', 'numeric' => '218', 'name' => 'Ecuador', 'official_name' => 'Republic of Ecuador', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ช๐Ÿ‡จ'], + ['alpha2' => 'EE', 'alpha3' => 'EST', 'numeric' => '233', 'name' => 'Estonia', 'official_name' => 'Republic of Estonia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ช๐Ÿ‡ช'], + ['alpha2' => 'EG', 'alpha3' => 'EGY', 'numeric' => '818', 'name' => 'Egypt', 'official_name' => 'Arab Republic of Egypt', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ช๐Ÿ‡ฌ'], + ['alpha2' => 'EH', 'alpha3' => 'ESH', 'numeric' => '732', 'name' => 'Western Sahara', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ช๐Ÿ‡ญ'], + ['alpha2' => 'ER', 'alpha3' => 'ERI', 'numeric' => '232', 'name' => 'Eritrea', 'official_name' => 'the State of Eritrea', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ช๐Ÿ‡ท'], + ['alpha2' => 'ES', 'alpha3' => 'ESP', 'numeric' => '724', 'name' => 'Spain', 'official_name' => 'Kingdom of Spain', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ช๐Ÿ‡ธ'], + ['alpha2' => 'ET', 'alpha3' => 'ETH', 'numeric' => '231', 'name' => 'Ethiopia', 'official_name' => 'Federal Democratic Republic of Ethiopia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ช๐Ÿ‡น'], + ['alpha2' => 'FI', 'alpha3' => 'FIN', 'numeric' => '246', 'name' => 'Finland', 'official_name' => 'Republic of Finland', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ซ๐Ÿ‡ฎ'], + ['alpha2' => 'FJ', 'alpha3' => 'FJI', 'numeric' => '242', 'name' => 'Fiji', 'official_name' => 'Republic of Fiji', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ซ๐Ÿ‡ฏ'], + ['alpha2' => 'FK', 'alpha3' => 'FLK', 'numeric' => '238', 'name' => 'Falkland Islands (Malvinas)', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ซ๐Ÿ‡ฐ'], + ['alpha2' => 'FM', 'alpha3' => 'FSM', 'numeric' => '583', 'name' => 'Micronesia, Federated States of', 'official_name' => 'Federated States of Micronesia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ซ๐Ÿ‡ฒ'], + ['alpha2' => 'FO', 'alpha3' => 'FRO', 'numeric' => '234', 'name' => 'Faroe Islands', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ซ๐Ÿ‡ด'], + ['alpha2' => 'FR', 'alpha3' => 'FRA', 'numeric' => '250', 'name' => 'France', 'official_name' => 'French Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ซ๐Ÿ‡ท'], + ['alpha2' => 'GA', 'alpha3' => 'GAB', 'numeric' => '266', 'name' => 'Gabon', 'official_name' => 'Gabonese Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ฆ'], + ['alpha2' => 'GB', 'alpha3' => 'GBR', 'numeric' => '826', 'name' => 'United Kingdom', 'official_name' => 'United Kingdom of Great Britain and Northern Ireland', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ง'], + ['alpha2' => 'GD', 'alpha3' => 'GRD', 'numeric' => '308', 'name' => 'Grenada', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ฉ'], + ['alpha2' => 'GE', 'alpha3' => 'GEO', 'numeric' => '268', 'name' => 'Georgia', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ช'], + ['alpha2' => 'GF', 'alpha3' => 'GUF', 'numeric' => '254', 'name' => 'French Guiana', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ซ'], + ['alpha2' => 'GG', 'alpha3' => 'GGY', 'numeric' => '831', 'name' => 'Guernsey', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ฌ'], + ['alpha2' => 'GH', 'alpha3' => 'GHA', 'numeric' => '288', 'name' => 'Ghana', 'official_name' => 'Republic of Ghana', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ญ'], + ['alpha2' => 'GI', 'alpha3' => 'GIB', 'numeric' => '292', 'name' => 'Gibraltar', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ฎ'], + ['alpha2' => 'GL', 'alpha3' => 'GRL', 'numeric' => '304', 'name' => 'Greenland', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ฑ'], + ['alpha2' => 'GM', 'alpha3' => 'GMB', 'numeric' => '270', 'name' => 'Gambia', 'official_name' => 'Republic of the Gambia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ฒ'], + ['alpha2' => 'GN', 'alpha3' => 'GIN', 'numeric' => '324', 'name' => 'Guinea', 'official_name' => 'Republic of Guinea', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ณ'], + ['alpha2' => 'GP', 'alpha3' => 'GLP', 'numeric' => '312', 'name' => 'Guadeloupe', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ต'], + ['alpha2' => 'GQ', 'alpha3' => 'GNQ', 'numeric' => '226', 'name' => 'Equatorial Guinea', 'official_name' => 'Republic of Equatorial Guinea', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ถ'], + ['alpha2' => 'GR', 'alpha3' => 'GRC', 'numeric' => '300', 'name' => 'Greece', 'official_name' => 'Hellenic Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ท'], + ['alpha2' => 'GS', 'alpha3' => 'SGS', 'numeric' => '239', 'name' => 'South Georgia and the South Sandwich Islands', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ธ'], + ['alpha2' => 'GT', 'alpha3' => 'GTM', 'numeric' => '320', 'name' => 'Guatemala', 'official_name' => 'Republic of Guatemala', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡น'], + ['alpha2' => 'GU', 'alpha3' => 'GUM', 'numeric' => '316', 'name' => 'Guam', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡บ'], + ['alpha2' => 'GW', 'alpha3' => 'GNB', 'numeric' => '624', 'name' => 'Guinea-Bissau', 'official_name' => 'Republic of Guinea-Bissau', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡ผ'], + ['alpha2' => 'GY', 'alpha3' => 'GUY', 'numeric' => '328', 'name' => 'Guyana', 'official_name' => 'Republic of Guyana', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฌ๐Ÿ‡พ'], + ['alpha2' => 'HK', 'alpha3' => 'HKG', 'numeric' => '344', 'name' => 'Hong Kong', 'official_name' => 'Hong Kong Special Administrative Region of China', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ญ๐Ÿ‡ฐ'], + ['alpha2' => 'HM', 'alpha3' => 'HMD', 'numeric' => '334', 'name' => 'Heard Island and McDonald Islands', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ญ๐Ÿ‡ฒ'], + ['alpha2' => 'HN', 'alpha3' => 'HND', 'numeric' => '340', 'name' => 'Honduras', 'official_name' => 'Republic of Honduras', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ญ๐Ÿ‡ณ'], + ['alpha2' => 'HR', 'alpha3' => 'HRV', 'numeric' => '191', 'name' => 'Croatia', 'official_name' => 'Republic of Croatia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ญ๐Ÿ‡ท'], + ['alpha2' => 'HT', 'alpha3' => 'HTI', 'numeric' => '332', 'name' => 'Haiti', 'official_name' => 'Republic of Haiti', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ญ๐Ÿ‡น'], + ['alpha2' => 'HU', 'alpha3' => 'HUN', 'numeric' => '348', 'name' => 'Hungary', 'official_name' => 'Hungary', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ญ๐Ÿ‡บ'], + ['alpha2' => 'ID', 'alpha3' => 'IDN', 'numeric' => '360', 'name' => 'Indonesia', 'official_name' => 'Republic of Indonesia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฎ๐Ÿ‡ฉ'], + ['alpha2' => 'IE', 'alpha3' => 'IRL', 'numeric' => '372', 'name' => 'Ireland', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฎ๐Ÿ‡ช'], + ['alpha2' => 'IL', 'alpha3' => 'ISR', 'numeric' => '376', 'name' => 'Israel', 'official_name' => 'State of Israel', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฎ๐Ÿ‡ฑ'], + ['alpha2' => 'IM', 'alpha3' => 'IMN', 'numeric' => '833', 'name' => 'Isle of Man', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฎ๐Ÿ‡ฒ'], + ['alpha2' => 'IN', 'alpha3' => 'IND', 'numeric' => '356', 'name' => 'India', 'official_name' => 'Republic of India', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฎ๐Ÿ‡ณ'], + ['alpha2' => 'IO', 'alpha3' => 'IOT', 'numeric' => '086', 'name' => 'British Indian Ocean Territory', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฎ๐Ÿ‡ด'], + ['alpha2' => 'IQ', 'alpha3' => 'IRQ', 'numeric' => '368', 'name' => 'Iraq', 'official_name' => 'Republic of Iraq', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฎ๐Ÿ‡ถ'], + ['alpha2' => 'IR', 'alpha3' => 'IRN', 'numeric' => '364', 'name' => 'Iran, Islamic Republic of', 'official_name' => 'Islamic Republic of Iran', 'common_name' => 'Iran', 'flag_emoji' => '๐Ÿ‡ฎ๐Ÿ‡ท'], + ['alpha2' => 'IS', 'alpha3' => 'ISL', 'numeric' => '352', 'name' => 'Iceland', 'official_name' => 'Republic of Iceland', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฎ๐Ÿ‡ธ'], + ['alpha2' => 'IT', 'alpha3' => 'ITA', 'numeric' => '380', 'name' => 'Italy', 'official_name' => 'Italian Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฎ๐Ÿ‡น'], + ['alpha2' => 'JE', 'alpha3' => 'JEY', 'numeric' => '832', 'name' => 'Jersey', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฏ๐Ÿ‡ช'], + ['alpha2' => 'JM', 'alpha3' => 'JAM', 'numeric' => '388', 'name' => 'Jamaica', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฏ๐Ÿ‡ฒ'], + ['alpha2' => 'JO', 'alpha3' => 'JOR', 'numeric' => '400', 'name' => 'Jordan', 'official_name' => 'Hashemite Kingdom of Jordan', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฏ๐Ÿ‡ด'], + ['alpha2' => 'JP', 'alpha3' => 'JPN', 'numeric' => '392', 'name' => 'Japan', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฏ๐Ÿ‡ต'], + ['alpha2' => 'KE', 'alpha3' => 'KEN', 'numeric' => '404', 'name' => 'Kenya', 'official_name' => 'Republic of Kenya', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฐ๐Ÿ‡ช'], + ['alpha2' => 'KG', 'alpha3' => 'KGZ', 'numeric' => '417', 'name' => 'Kyrgyzstan', 'official_name' => 'Kyrgyz Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฐ๐Ÿ‡ฌ'], + ['alpha2' => 'KH', 'alpha3' => 'KHM', 'numeric' => '116', 'name' => 'Cambodia', 'official_name' => 'Kingdom of Cambodia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฐ๐Ÿ‡ญ'], + ['alpha2' => 'KI', 'alpha3' => 'KIR', 'numeric' => '296', 'name' => 'Kiribati', 'official_name' => 'Republic of Kiribati', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฐ๐Ÿ‡ฎ'], + ['alpha2' => 'KM', 'alpha3' => 'COM', 'numeric' => '174', 'name' => 'Comoros', 'official_name' => 'Union of the Comoros', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฐ๐Ÿ‡ฒ'], + ['alpha2' => 'KN', 'alpha3' => 'KNA', 'numeric' => '659', 'name' => 'Saint Kitts and Nevis', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฐ๐Ÿ‡ณ'], + ['alpha2' => 'KP', 'alpha3' => 'PRK', 'numeric' => '408', 'name' => 'Korea, Democratic People\'s Republic of', 'official_name' => 'Democratic People\'s Republic of Korea', 'common_name' => 'North Korea', 'flag_emoji' => '๐Ÿ‡ฐ๐Ÿ‡ต'], + ['alpha2' => 'KR', 'alpha3' => 'KOR', 'numeric' => '410', 'name' => 'Korea, Republic of', 'official_name' => null, 'common_name' => 'South Korea', 'flag_emoji' => '๐Ÿ‡ฐ๐Ÿ‡ท'], + ['alpha2' => 'KW', 'alpha3' => 'KWT', 'numeric' => '414', 'name' => 'Kuwait', 'official_name' => 'State of Kuwait', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฐ๐Ÿ‡ผ'], + ['alpha2' => 'KY', 'alpha3' => 'CYM', 'numeric' => '136', 'name' => 'Cayman Islands', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฐ๐Ÿ‡พ'], + ['alpha2' => 'KZ', 'alpha3' => 'KAZ', 'numeric' => '398', 'name' => 'Kazakhstan', 'official_name' => 'Republic of Kazakhstan', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฐ๐Ÿ‡ฟ'], + ['alpha2' => 'LA', 'alpha3' => 'LAO', 'numeric' => '418', 'name' => 'Lao People\'s Democratic Republic', 'official_name' => null, 'common_name' => 'Laos', 'flag_emoji' => '๐Ÿ‡ฑ๐Ÿ‡ฆ'], + ['alpha2' => 'LB', 'alpha3' => 'LBN', 'numeric' => '422', 'name' => 'Lebanon', 'official_name' => 'Lebanese Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฑ๐Ÿ‡ง'], + ['alpha2' => 'LC', 'alpha3' => 'LCA', 'numeric' => '662', 'name' => 'Saint Lucia', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฑ๐Ÿ‡จ'], + ['alpha2' => 'LI', 'alpha3' => 'LIE', 'numeric' => '438', 'name' => 'Liechtenstein', 'official_name' => 'Principality of Liechtenstein', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฑ๐Ÿ‡ฎ'], + ['alpha2' => 'LK', 'alpha3' => 'LKA', 'numeric' => '144', 'name' => 'Sri Lanka', 'official_name' => 'Democratic Socialist Republic of Sri Lanka', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฑ๐Ÿ‡ฐ'], + ['alpha2' => 'LR', 'alpha3' => 'LBR', 'numeric' => '430', 'name' => 'Liberia', 'official_name' => 'Republic of Liberia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฑ๐Ÿ‡ท'], + ['alpha2' => 'LS', 'alpha3' => 'LSO', 'numeric' => '426', 'name' => 'Lesotho', 'official_name' => 'Kingdom of Lesotho', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฑ๐Ÿ‡ธ'], + ['alpha2' => 'LT', 'alpha3' => 'LTU', 'numeric' => '440', 'name' => 'Lithuania', 'official_name' => 'Republic of Lithuania', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฑ๐Ÿ‡น'], + ['alpha2' => 'LU', 'alpha3' => 'LUX', 'numeric' => '442', 'name' => 'Luxembourg', 'official_name' => 'Grand Duchy of Luxembourg', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฑ๐Ÿ‡บ'], + ['alpha2' => 'LV', 'alpha3' => 'LVA', 'numeric' => '428', 'name' => 'Latvia', 'official_name' => 'Republic of Latvia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฑ๐Ÿ‡ป'], + ['alpha2' => 'LY', 'alpha3' => 'LBY', 'numeric' => '434', 'name' => 'Libya', 'official_name' => 'Libya', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฑ๐Ÿ‡พ'], + ['alpha2' => 'MA', 'alpha3' => 'MAR', 'numeric' => '504', 'name' => 'Morocco', 'official_name' => 'Kingdom of Morocco', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ฆ'], + ['alpha2' => 'MC', 'alpha3' => 'MCO', 'numeric' => '492', 'name' => 'Monaco', 'official_name' => 'Principality of Monaco', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡จ'], + ['alpha2' => 'MD', 'alpha3' => 'MDA', 'numeric' => '498', 'name' => 'Moldova, Republic of', 'official_name' => 'Republic of Moldova', 'common_name' => 'Moldova', 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ฉ'], + ['alpha2' => 'ME', 'alpha3' => 'MNE', 'numeric' => '499', 'name' => 'Montenegro', 'official_name' => 'Montenegro', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ช'], + ['alpha2' => 'MF', 'alpha3' => 'MAF', 'numeric' => '663', 'name' => 'Saint Martin (French part)', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ซ'], + ['alpha2' => 'MG', 'alpha3' => 'MDG', 'numeric' => '450', 'name' => 'Madagascar', 'official_name' => 'Republic of Madagascar', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ฌ'], + ['alpha2' => 'MH', 'alpha3' => 'MHL', 'numeric' => '584', 'name' => 'Marshall Islands', 'official_name' => 'Republic of the Marshall Islands', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ญ'], + ['alpha2' => 'MK', 'alpha3' => 'MKD', 'numeric' => '807', 'name' => 'North Macedonia', 'official_name' => 'Republic of North Macedonia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ฐ'], + ['alpha2' => 'ML', 'alpha3' => 'MLI', 'numeric' => '466', 'name' => 'Mali', 'official_name' => 'Republic of Mali', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ฑ'], + ['alpha2' => 'MM', 'alpha3' => 'MMR', 'numeric' => '104', 'name' => 'Myanmar', 'official_name' => 'Republic of Myanmar', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ฒ'], + ['alpha2' => 'MN', 'alpha3' => 'MNG', 'numeric' => '496', 'name' => 'Mongolia', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ณ'], + ['alpha2' => 'MO', 'alpha3' => 'MAC', 'numeric' => '446', 'name' => 'Macao', 'official_name' => 'Macao Special Administrative Region of China', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ด'], + ['alpha2' => 'MP', 'alpha3' => 'MNP', 'numeric' => '580', 'name' => 'Northern Mariana Islands', 'official_name' => 'Commonwealth of the Northern Mariana Islands', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ต'], + ['alpha2' => 'MQ', 'alpha3' => 'MTQ', 'numeric' => '474', 'name' => 'Martinique', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ถ'], + ['alpha2' => 'MR', 'alpha3' => 'MRT', 'numeric' => '478', 'name' => 'Mauritania', 'official_name' => 'Islamic Republic of Mauritania', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ท'], + ['alpha2' => 'MS', 'alpha3' => 'MSR', 'numeric' => '500', 'name' => 'Montserrat', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ธ'], + ['alpha2' => 'MT', 'alpha3' => 'MLT', 'numeric' => '470', 'name' => 'Malta', 'official_name' => 'Republic of Malta', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡น'], + ['alpha2' => 'MU', 'alpha3' => 'MUS', 'numeric' => '480', 'name' => 'Mauritius', 'official_name' => 'Republic of Mauritius', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡บ'], + ['alpha2' => 'MV', 'alpha3' => 'MDV', 'numeric' => '462', 'name' => 'Maldives', 'official_name' => 'Republic of Maldives', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ป'], + ['alpha2' => 'MW', 'alpha3' => 'MWI', 'numeric' => '454', 'name' => 'Malawi', 'official_name' => 'Republic of Malawi', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ผ'], + ['alpha2' => 'MX', 'alpha3' => 'MEX', 'numeric' => '484', 'name' => 'Mexico', 'official_name' => 'United Mexican States', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ฝ'], + ['alpha2' => 'MY', 'alpha3' => 'MYS', 'numeric' => '458', 'name' => 'Malaysia', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡พ'], + ['alpha2' => 'MZ', 'alpha3' => 'MOZ', 'numeric' => '508', 'name' => 'Mozambique', 'official_name' => 'Republic of Mozambique', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฒ๐Ÿ‡ฟ'], + ['alpha2' => 'NA', 'alpha3' => 'NAM', 'numeric' => '516', 'name' => 'Namibia', 'official_name' => 'Republic of Namibia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡ฆ'], + ['alpha2' => 'NC', 'alpha3' => 'NCL', 'numeric' => '540', 'name' => 'New Caledonia', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡จ'], + ['alpha2' => 'NE', 'alpha3' => 'NER', 'numeric' => '562', 'name' => 'Niger', 'official_name' => 'Republic of the Niger', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡ช'], + ['alpha2' => 'NF', 'alpha3' => 'NFK', 'numeric' => '574', 'name' => 'Norfolk Island', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡ซ'], + ['alpha2' => 'NG', 'alpha3' => 'NGA', 'numeric' => '566', 'name' => 'Nigeria', 'official_name' => 'Federal Republic of Nigeria', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡ฌ'], + ['alpha2' => 'NI', 'alpha3' => 'NIC', 'numeric' => '558', 'name' => 'Nicaragua', 'official_name' => 'Republic of Nicaragua', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡ฎ'], + ['alpha2' => 'NL', 'alpha3' => 'NLD', 'numeric' => '528', 'name' => 'Netherlands', 'official_name' => 'Kingdom of the Netherlands', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡ฑ'], + ['alpha2' => 'NO', 'alpha3' => 'NOR', 'numeric' => '578', 'name' => 'Norway', 'official_name' => 'Kingdom of Norway', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡ด'], + ['alpha2' => 'NP', 'alpha3' => 'NPL', 'numeric' => '524', 'name' => 'Nepal', 'official_name' => 'Federal Democratic Republic of Nepal', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡ต'], + ['alpha2' => 'NR', 'alpha3' => 'NRU', 'numeric' => '520', 'name' => 'Nauru', 'official_name' => 'Republic of Nauru', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡ท'], + ['alpha2' => 'NU', 'alpha3' => 'NIU', 'numeric' => '570', 'name' => 'Niue', 'official_name' => 'Niue', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡บ'], + ['alpha2' => 'NZ', 'alpha3' => 'NZL', 'numeric' => '554', 'name' => 'New Zealand', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ณ๐Ÿ‡ฟ'], + ['alpha2' => 'OM', 'alpha3' => 'OMN', 'numeric' => '512', 'name' => 'Oman', 'official_name' => 'Sultanate of Oman', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ด๐Ÿ‡ฒ'], + ['alpha2' => 'PA', 'alpha3' => 'PAN', 'numeric' => '591', 'name' => 'Panama', 'official_name' => 'Republic of Panama', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ฆ'], + ['alpha2' => 'PE', 'alpha3' => 'PER', 'numeric' => '604', 'name' => 'Peru', 'official_name' => 'Republic of Peru', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ช'], + ['alpha2' => 'PF', 'alpha3' => 'PYF', 'numeric' => '258', 'name' => 'French Polynesia', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ซ'], + ['alpha2' => 'PG', 'alpha3' => 'PNG', 'numeric' => '598', 'name' => 'Papua New Guinea', 'official_name' => 'Independent State of Papua New Guinea', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ฌ'], + ['alpha2' => 'PH', 'alpha3' => 'PHL', 'numeric' => '608', 'name' => 'Philippines', 'official_name' => 'Republic of the Philippines', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ญ'], + ['alpha2' => 'PK', 'alpha3' => 'PAK', 'numeric' => '586', 'name' => 'Pakistan', 'official_name' => 'Islamic Republic of Pakistan', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ฐ'], + ['alpha2' => 'PL', 'alpha3' => 'POL', 'numeric' => '616', 'name' => 'Poland', 'official_name' => 'Republic of Poland', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ฑ'], + ['alpha2' => 'PM', 'alpha3' => 'SPM', 'numeric' => '666', 'name' => 'Saint Pierre and Miquelon', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ฒ'], + ['alpha2' => 'PN', 'alpha3' => 'PCN', 'numeric' => '612', 'name' => 'Pitcairn', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ณ'], + ['alpha2' => 'PR', 'alpha3' => 'PRI', 'numeric' => '630', 'name' => 'Puerto Rico', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ท'], + ['alpha2' => 'PS', 'alpha3' => 'PSE', 'numeric' => '275', 'name' => 'Palestine, State of', 'official_name' => 'the State of Palestine', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ธ'], + ['alpha2' => 'PT', 'alpha3' => 'PRT', 'numeric' => '620', 'name' => 'Portugal', 'official_name' => 'Portuguese Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡น'], + ['alpha2' => 'PW', 'alpha3' => 'PLW', 'numeric' => '585', 'name' => 'Palau', 'official_name' => 'Republic of Palau', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡ผ'], + ['alpha2' => 'PY', 'alpha3' => 'PRY', 'numeric' => '600', 'name' => 'Paraguay', 'official_name' => 'Republic of Paraguay', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ต๐Ÿ‡พ'], + ['alpha2' => 'QA', 'alpha3' => 'QAT', 'numeric' => '634', 'name' => 'Qatar', 'official_name' => 'State of Qatar', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ถ๐Ÿ‡ฆ'], + ['alpha2' => 'RE', 'alpha3' => 'REU', 'numeric' => '638', 'name' => 'Rรฉunion', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ท๐Ÿ‡ช'], + ['alpha2' => 'RO', 'alpha3' => 'ROU', 'numeric' => '642', 'name' => 'Romania', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ท๐Ÿ‡ด'], + ['alpha2' => 'RS', 'alpha3' => 'SRB', 'numeric' => '688', 'name' => 'Serbia', 'official_name' => 'Republic of Serbia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ท๐Ÿ‡ธ'], + ['alpha2' => 'RU', 'alpha3' => 'RUS', 'numeric' => '643', 'name' => 'Russian Federation', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ท๐Ÿ‡บ'], + ['alpha2' => 'RW', 'alpha3' => 'RWA', 'numeric' => '646', 'name' => 'Rwanda', 'official_name' => 'Rwandese Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ท๐Ÿ‡ผ'], + ['alpha2' => 'SA', 'alpha3' => 'SAU', 'numeric' => '682', 'name' => 'Saudi Arabia', 'official_name' => 'Kingdom of Saudi Arabia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ฆ'], + ['alpha2' => 'SB', 'alpha3' => 'SLB', 'numeric' => '090', 'name' => 'Solomon Islands', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ง'], + ['alpha2' => 'SC', 'alpha3' => 'SYC', 'numeric' => '690', 'name' => 'Seychelles', 'official_name' => 'Republic of Seychelles', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡จ'], + ['alpha2' => 'SD', 'alpha3' => 'SDN', 'numeric' => '729', 'name' => 'Sudan', 'official_name' => 'Republic of the Sudan', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ฉ'], + ['alpha2' => 'SE', 'alpha3' => 'SWE', 'numeric' => '752', 'name' => 'Sweden', 'official_name' => 'Kingdom of Sweden', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ช'], + ['alpha2' => 'SG', 'alpha3' => 'SGP', 'numeric' => '702', 'name' => 'Singapore', 'official_name' => 'Republic of Singapore', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ฌ'], + ['alpha2' => 'SH', 'alpha3' => 'SHN', 'numeric' => '654', 'name' => 'Saint Helena, Ascension and Tristan da Cunha', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ญ'], + ['alpha2' => 'SI', 'alpha3' => 'SVN', 'numeric' => '705', 'name' => 'Slovenia', 'official_name' => 'Republic of Slovenia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ฎ'], + ['alpha2' => 'SJ', 'alpha3' => 'SJM', 'numeric' => '744', 'name' => 'Svalbard and Jan Mayen', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ฏ'], + ['alpha2' => 'SK', 'alpha3' => 'SVK', 'numeric' => '703', 'name' => 'Slovakia', 'official_name' => 'Slovak Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ฐ'], + ['alpha2' => 'SL', 'alpha3' => 'SLE', 'numeric' => '694', 'name' => 'Sierra Leone', 'official_name' => 'Republic of Sierra Leone', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ฑ'], + ['alpha2' => 'SM', 'alpha3' => 'SMR', 'numeric' => '674', 'name' => 'San Marino', 'official_name' => 'Republic of San Marino', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ฒ'], + ['alpha2' => 'SN', 'alpha3' => 'SEN', 'numeric' => '686', 'name' => 'Senegal', 'official_name' => 'Republic of Senegal', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ณ'], + ['alpha2' => 'SO', 'alpha3' => 'SOM', 'numeric' => '706', 'name' => 'Somalia', 'official_name' => 'Federal Republic of Somalia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ด'], + ['alpha2' => 'SR', 'alpha3' => 'SUR', 'numeric' => '740', 'name' => 'Suriname', 'official_name' => 'Republic of Suriname', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ท'], + ['alpha2' => 'SS', 'alpha3' => 'SSD', 'numeric' => '728', 'name' => 'South Sudan', 'official_name' => 'Republic of South Sudan', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ธ'], + ['alpha2' => 'ST', 'alpha3' => 'STP', 'numeric' => '678', 'name' => 'Sao Tome and Principe', 'official_name' => 'Democratic Republic of Sao Tome and Principe', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡น'], + ['alpha2' => 'SV', 'alpha3' => 'SLV', 'numeric' => '222', 'name' => 'El Salvador', 'official_name' => 'Republic of El Salvador', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ป'], + ['alpha2' => 'SX', 'alpha3' => 'SXM', 'numeric' => '534', 'name' => 'Sint Maarten (Dutch part)', 'official_name' => 'Sint Maarten (Dutch part)', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ฝ'], + ['alpha2' => 'SY', 'alpha3' => 'SYR', 'numeric' => '760', 'name' => 'Syrian Arab Republic', 'official_name' => null, 'common_name' => 'Syria', 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡พ'], + ['alpha2' => 'SZ', 'alpha3' => 'SWZ', 'numeric' => '748', 'name' => 'Eswatini', 'official_name' => 'Kingdom of Eswatini', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ธ๐Ÿ‡ฟ'], + ['alpha2' => 'TC', 'alpha3' => 'TCA', 'numeric' => '796', 'name' => 'Turks and Caicos Islands', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡จ'], + ['alpha2' => 'TD', 'alpha3' => 'TCD', 'numeric' => '148', 'name' => 'Chad', 'official_name' => 'Republic of Chad', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ฉ'], + ['alpha2' => 'TF', 'alpha3' => 'ATF', 'numeric' => '260', 'name' => 'French Southern Territories', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ซ'], + ['alpha2' => 'TG', 'alpha3' => 'TGO', 'numeric' => '768', 'name' => 'Togo', 'official_name' => 'Togolese Republic', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ฌ'], + ['alpha2' => 'TH', 'alpha3' => 'THA', 'numeric' => '764', 'name' => 'Thailand', 'official_name' => 'Kingdom of Thailand', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ญ'], + ['alpha2' => 'TJ', 'alpha3' => 'TJK', 'numeric' => '762', 'name' => 'Tajikistan', 'official_name' => 'Republic of Tajikistan', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ฏ'], + ['alpha2' => 'TK', 'alpha3' => 'TKL', 'numeric' => '772', 'name' => 'Tokelau', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ฐ'], + ['alpha2' => 'TL', 'alpha3' => 'TLS', 'numeric' => '626', 'name' => 'Timor-Leste', 'official_name' => 'Democratic Republic of Timor-Leste', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ฑ'], + ['alpha2' => 'TM', 'alpha3' => 'TKM', 'numeric' => '795', 'name' => 'Turkmenistan', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ฒ'], + ['alpha2' => 'TN', 'alpha3' => 'TUN', 'numeric' => '788', 'name' => 'Tunisia', 'official_name' => 'Republic of Tunisia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ณ'], + ['alpha2' => 'TO', 'alpha3' => 'TON', 'numeric' => '776', 'name' => 'Tonga', 'official_name' => 'Kingdom of Tonga', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ด'], + ['alpha2' => 'TR', 'alpha3' => 'TUR', 'numeric' => '792', 'name' => 'Tรผrkiye', 'official_name' => 'Republic of Tรผrkiye', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ท'], + ['alpha2' => 'TT', 'alpha3' => 'TTO', 'numeric' => '780', 'name' => 'Trinidad and Tobago', 'official_name' => 'Republic of Trinidad and Tobago', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡น'], + ['alpha2' => 'TV', 'alpha3' => 'TUV', 'numeric' => '798', 'name' => 'Tuvalu', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ป'], + ['alpha2' => 'TW', 'alpha3' => 'TWN', 'numeric' => '158', 'name' => 'Taiwan, Province of China', 'official_name' => 'Taiwan, Province of China', 'common_name' => 'Taiwan', 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ผ'], + ['alpha2' => 'TZ', 'alpha3' => 'TZA', 'numeric' => '834', 'name' => 'Tanzania, United Republic of', 'official_name' => 'United Republic of Tanzania', 'common_name' => 'Tanzania', 'flag_emoji' => '๐Ÿ‡น๐Ÿ‡ฟ'], + ['alpha2' => 'UA', 'alpha3' => 'UKR', 'numeric' => '804', 'name' => 'Ukraine', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡บ๐Ÿ‡ฆ'], + ['alpha2' => 'UG', 'alpha3' => 'UGA', 'numeric' => '800', 'name' => 'Uganda', 'official_name' => 'Republic of Uganda', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡บ๐Ÿ‡ฌ'], + ['alpha2' => 'UM', 'alpha3' => 'UMI', 'numeric' => '581', 'name' => 'United States Minor Outlying Islands', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡บ๐Ÿ‡ฒ'], + ['alpha2' => 'US', 'alpha3' => 'USA', 'numeric' => '840', 'name' => 'United States', 'official_name' => 'United States of America', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡บ๐Ÿ‡ธ'], + ['alpha2' => 'UY', 'alpha3' => 'URY', 'numeric' => '858', 'name' => 'Uruguay', 'official_name' => 'Eastern Republic of Uruguay', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡บ๐Ÿ‡พ'], + ['alpha2' => 'UZ', 'alpha3' => 'UZB', 'numeric' => '860', 'name' => 'Uzbekistan', 'official_name' => 'Republic of Uzbekistan', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡บ๐Ÿ‡ฟ'], + ['alpha2' => 'VA', 'alpha3' => 'VAT', 'numeric' => '336', 'name' => 'Holy See (Vatican City State)', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ป๐Ÿ‡ฆ'], + ['alpha2' => 'VC', 'alpha3' => 'VCT', 'numeric' => '670', 'name' => 'Saint Vincent and the Grenadines', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ป๐Ÿ‡จ'], + ['alpha2' => 'VE', 'alpha3' => 'VEN', 'numeric' => '862', 'name' => 'Venezuela, Bolivarian Republic of', 'official_name' => 'Bolivarian Republic of Venezuela', 'common_name' => 'Venezuela', 'flag_emoji' => '๐Ÿ‡ป๐Ÿ‡ช'], + ['alpha2' => 'VG', 'alpha3' => 'VGB', 'numeric' => '092', 'name' => 'Virgin Islands, British', 'official_name' => 'British Virgin Islands', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ป๐Ÿ‡ฌ'], + ['alpha2' => 'VI', 'alpha3' => 'VIR', 'numeric' => '850', 'name' => 'Virgin Islands, U.S.', 'official_name' => 'Virgin Islands of the United States', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ป๐Ÿ‡ฎ'], + ['alpha2' => 'VN', 'alpha3' => 'VNM', 'numeric' => '704', 'name' => 'Viet Nam', 'official_name' => 'Socialist Republic of Viet Nam', 'common_name' => 'Vietnam', 'flag_emoji' => '๐Ÿ‡ป๐Ÿ‡ณ'], + ['alpha2' => 'VU', 'alpha3' => 'VUT', 'numeric' => '548', 'name' => 'Vanuatu', 'official_name' => 'Republic of Vanuatu', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ป๐Ÿ‡บ'], + ['alpha2' => 'WF', 'alpha3' => 'WLF', 'numeric' => '876', 'name' => 'Wallis and Futuna', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ผ๐Ÿ‡ซ'], + ['alpha2' => 'WS', 'alpha3' => 'WSM', 'numeric' => '882', 'name' => 'Samoa', 'official_name' => 'Independent State of Samoa', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ผ๐Ÿ‡ธ'], + ['alpha2' => 'YE', 'alpha3' => 'YEM', 'numeric' => '887', 'name' => 'Yemen', 'official_name' => 'Republic of Yemen', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡พ๐Ÿ‡ช'], + ['alpha2' => 'YT', 'alpha3' => 'MYT', 'numeric' => '175', 'name' => 'Mayotte', 'official_name' => null, 'common_name' => null, 'flag_emoji' => '๐Ÿ‡พ๐Ÿ‡น'], + ['alpha2' => 'ZA', 'alpha3' => 'ZAF', 'numeric' => '710', 'name' => 'South Africa', 'official_name' => 'Republic of South Africa', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฟ๐Ÿ‡ฆ'], + ['alpha2' => 'ZM', 'alpha3' => 'ZMB', 'numeric' => '894', 'name' => 'Zambia', 'official_name' => 'Republic of Zambia', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฟ๐Ÿ‡ฒ'], + ['alpha2' => 'ZW', 'alpha3' => 'ZWE', 'numeric' => '716', 'name' => 'Zimbabwe', 'official_name' => 'Republic of Zimbabwe', 'common_name' => null, 'flag_emoji' => '๐Ÿ‡ฟ๐Ÿ‡ผ'], + ]; + + foreach ($countries as $index => $country) { + Country::query()->updateOrCreate( + ['alpha2' => $country['alpha2']], + array_merge($country, [ + 'is_active' => true, + 'sort_order' => $index + 1, + 'last_synced_at' => $now, + ]) + ); + } + } +} diff --git a/Modules/Countries/Http/Controllers/Api/CountriesApiController.php b/Modules/Countries/Http/Controllers/Api/CountriesApiController.php new file mode 100644 index 00000000..331ff58e --- /dev/null +++ b/Modules/Countries/Http/Controllers/Api/CountriesApiController.php @@ -0,0 +1,31 @@ +boolean('active_only', false); + $countries = Country::query()->when($activeOnly, fn ($query) => $query->where('is_active', true))->ordered() + ->get(['alpha2', 'alpha3', 'numeric', 'name', 'official_name', 'common_name', 'display_name', 'flag_emoji', 'is_active']); + return response()->json(['data' => $countries]); + } + + public function active(): JsonResponse + { + $countries = Country::query()->active()->ordered() + ->get(['alpha2', 'alpha3', 'numeric', 'name', 'display_name', 'common_name', 'flag_emoji']); + return response()->json(['data' => $countries]); + } + + public function show(Country $country): JsonResponse + { + return response()->json(['data' => $country]); + } +} diff --git a/Modules/Countries/Http/Controllers/CountriesController.php b/Modules/Countries/Http/Controllers/CountriesController.php index c0b0c3c1..bfbd46f4 100644 --- a/Modules/Countries/Http/Controllers/CountriesController.php +++ b/Modules/Countries/Http/Controllers/CountriesController.php @@ -2,78 +2,63 @@ namespace Modules\Countries\Http\Controllers; -use Illuminate\Contracts\Support\Renderable; +use Illuminate\Contracts\View\View; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Modules\Countries\Http\Requests\UpdateCountryRequest; +use Modules\Countries\Models\Country; class CountriesController extends Controller { - /** - * Display a listing of the resource. - * @return Renderable - */ - public function index() + public function index(Request $request): View { - return view('countries::index'); + $search = trim((string) $request->query('search', '')); + $status = (string) $request->query('status', 'all'); + + $countries = Country::query() + ->when($search !== '', function ($query) use ($search): void { + $query->where(function ($nested) use ($search): void { + $nested->where('name', 'ilike', "%{$search}%") + ->orWhere('official_name', 'ilike', "%{$search}%") + ->orWhere('common_name', 'ilike', "%{$search}%") + ->orWhere('display_name', 'ilike', "%{$search}%") + ->orWhere('alpha2', 'ilike', "%{$search}%") + ->orWhere('alpha3', 'ilike', "%{$search}%") + ->orWhere('numeric', 'ilike', "%{$search}%"); + }); + }) + ->when($status === 'active', fn ($query) => $query->where('is_active', true)) + ->when($status === 'inactive', fn ($query) => $query->where('is_active', false)) + ->ordered() + ->paginate(50) + ->withQueryString(); + + $activeCount = Country::query()->where('is_active', true)->count(); + $inactiveCount = Country::query()->where('is_active', false)->count(); + $totalCount = Country::query()->count(); + + return view('countries::index', compact('countries', 'activeCount', 'inactiveCount', 'totalCount', 'search', 'status')); } - /** - * Show the form for creating a new resource. - * @return Renderable - */ - public function create() + public function show(Country $country): View { - return view('countries::create'); + return view('countries::show', compact('country')); } - /** - * Store a newly created resource in storage. - * @param Request $request - * @return Renderable - */ - public function store(Request $request) + public function edit(Country $country): View { - // + return view('countries::edit', compact('country')); } - /** - * Show the specified resource. - * @param int $id - * @return Renderable - */ - public function show($id) + public function update(UpdateCountryRequest $request, Country $country): RedirectResponse { - return view('countries::show'); - } + $country->update([ + 'display_name' => $request->validated('display_name'), + 'is_active' => $request->boolean('is_active'), + 'sort_order' => (int) ($request->validated('sort_order') ?? 0), + ]); - /** - * Show the form for editing the specified resource. - * @param int $id - * @return Renderable - */ - public function edit($id) - { - return view('countries::edit'); - } - - /** - * Update the specified resource in storage. - * @param Request $request - * @param int $id - * @return Renderable - */ - public function update(Request $request, $id) - { - // - } - - /** - * Remove the specified resource from storage. - * @param int $id - * @return Renderable - */ - public function destroy($id) - { - // + return redirect()->route('countries.show', $country)->with('success', 'Country settings updated.'); } } diff --git a/Modules/Countries/Http/Requests/UpdateCountryRequest.php b/Modules/Countries/Http/Requests/UpdateCountryRequest.php new file mode 100644 index 00000000..1600c071 --- /dev/null +++ b/Modules/Countries/Http/Requests/UpdateCountryRequest.php @@ -0,0 +1,22 @@ +user(); + } + + public function rules(): array + { + return [ + 'display_name' => ['nullable', 'string', 'max:255'], + 'is_active' => ['nullable', 'boolean'], + 'sort_order' => ['nullable', 'integer', 'min:0', 'max:999999'], + ]; + } +} diff --git a/Modules/Countries/Models/Country.php b/Modules/Countries/Models/Country.php new file mode 100644 index 00000000..65311275 --- /dev/null +++ b/Modules/Countries/Models/Country.php @@ -0,0 +1,43 @@ + 'boolean', + 'sort_order' => 'integer', + 'last_synced_at' => 'datetime', + ]; + + public function getRouteKeyName(): string + { + return 'alpha2'; + } + + public function getEffectiveNameAttribute(): string + { + return $this->display_name ?: $this->common_name ?: $this->name; + } + + public function scopeActive(Builder $query): Builder + { + return $query->where('is_active', true); + } + + public function scopeOrdered(Builder $query): Builder + { + return $query->orderBy('sort_order')->orderBy('name'); + } +} diff --git a/Modules/Countries/Providers/CountriesServiceProvider.php b/Modules/Countries/Providers/CountriesServiceProvider.php index 43e27bd5..7557c11a 100644 --- a/Modules/Countries/Providers/CountriesServiceProvider.php +++ b/Modules/Countries/Providers/CountriesServiceProvider.php @@ -2,41 +2,22 @@ namespace Modules\Countries\Providers; -use Illuminate\Support\ServiceProvider; -use Illuminate\Database\Eloquent\Factory; +use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\File; +use Illuminate\Support\ServiceProvider; use Modules\Countries\Support\ModuleInfo; -use Config; class CountriesServiceProvider extends ServiceProvider { - /** - * @var string $moduleName - */ protected string $moduleName = 'Countries'; - - /** - * @var string $moduleNameLower - */ protected string $moduleNameLower = 'countries'; - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides():array + public function register(): void { - return []; + $this->app->register(RouteServiceProvider::class); } - /** - * Boot the application events. - * - * @return void - */ - public function boot() : void + public function boot(): void { $this->registerTranslations(); $this->registerConfig(); @@ -46,108 +27,67 @@ class CountriesServiceProvider extends ServiceProvider $this->loadMigrationsFrom(module_path(ModuleInfo::name(), 'Database/Migrations')); } - /** - * Register the service provider. - * - * @return void - */ - public function register(): void + public function provides(): array { - $this->app->register(RouteServiceProvider::class); + return []; } - /** - * Register the helpers. - * - * @return void - */ protected function registerHelpers(): void { - foreach (glob(__DIR__.'/../Helpers/*.php') as $filename) { + foreach (glob(__DIR__.'/../Helpers/*.php') ?: [] as $filename) { require_once $filename; } } - /** - * Dynamically Register Commands. - * - * @return void - */ - public function registerCommands(): void - { - if (!$this->app->runningInConsole()) { - return; - } - $commandPath = __DIR__ . '/../Console'; - $commands = collect(File::allFiles($commandPath)) - ->map(function ($file) { - $class = 'Modules\\' . $this->moduleName . '\\Console\\' . $file->getFilenameWithoutExtension(); - return $class; - }) - ->filter(function ($class) { - return class_exists($class); - }) - ->values() - ->all(); - $this->commands($commands); + protected function registerCommands(): void + { + if (! $this->app->runningInConsole()) { + return; } + $commandPath = __DIR__.'/../Console'; + if (! is_dir($commandPath)) { + return; + } + $commands = collect(File::allFiles($commandPath)) + ->map(fn ($file): string => 'Modules\\'.$this->moduleName.'\\Console\\'.$file->getFilenameWithoutExtension()) + ->filter(fn (string $class): bool => class_exists($class)) + ->values() + ->all(); + $this->commands($commands); + } - /** - * Register config. - * - * @return void - */ protected function registerConfig(): void { $this->publishes([ - module_path(ModuleInfo::name(), 'Config/config.php') => config_path( ModuleInfo::nameLower(). '.php'), + module_path(ModuleInfo::name(), 'Config/config.php') => config_path(ModuleInfo::nameLower().'.php'), ], 'config'); - $this->mergeConfigFrom( - module_path(ModuleInfo::name(), 'Config/config.php'), ModuleInfo::nameLower() - ); + $this->mergeConfigFrom(module_path(ModuleInfo::name(), 'Config/config.php'), ModuleInfo::nameLower()); } - /** - * Register views. - * - * @return void - */ - public function registerViews(): void + protected function registerViews(): void { - $viewPath = resource_path('views/modules/' . ModuleInfo::nameLower()); + $viewPath = resource_path('views/modules/'.ModuleInfo::nameLower()); $sourcePath = module_path(ModuleInfo::name(), 'Resources/views'); - $this->publishes([ - $sourcePath => $viewPath - ], ['views', ModuleInfo::nameLower() . '-module-views']); - $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), ModuleInfo::nameLower()); + $this->publishes([$sourcePath => $viewPath], ['views', ModuleInfo::nameLower().'-module-views']); + $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), ModuleInfo::nameLower()); } - /** - * Register translations. - * - * @return void - */ - public function registerTranslations(): void + protected function registerTranslations(): void { - $langPath = resource_path('lang/modules/' . ModuleInfo::nameLower()); - + $langPath = resource_path('lang/modules/'.ModuleInfo::nameLower()); if (is_dir($langPath)) { - $this->loadTranslationsFrom($langPath, ModuleInfo::nameLower()); - } else { - $this->loadTranslationsFrom(module_path(ModuleInfo::name(), 'Resources/lang'), ModuleInfo::nameLower()); + $this->loadTranslationsFrom($langPath, ModuleInfo::nameLower()); + return; } + $this->loadTranslationsFrom(module_path(ModuleInfo::name(), 'Resources/lang'), ModuleInfo::nameLower()); } - /** - * Regsiter View Paths - * @return array - */ private function getPublishableViewPaths(): array { $paths = []; foreach (Config::get('view.paths') as $path) { - if (is_dir($path . '/modules/' . ModuleInfo::nameLower())) { - $paths[] = $path . '/modules/' . ModuleInfo::nameLower(); + if (is_dir($path.'/modules/'.ModuleInfo::nameLower())) { + $paths[] = $path.'/modules/'.ModuleInfo::nameLower(); } } return $paths; diff --git a/Modules/Countries/Providers/RouteServiceProvider.php b/Modules/Countries/Providers/RouteServiceProvider.php index 6c229aa3..43427bbd 100644 --- a/Modules/Countries/Providers/RouteServiceProvider.php +++ b/Modules/Countries/Providers/RouteServiceProvider.php @@ -2,68 +2,24 @@ namespace Modules\Countries\Providers; -use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; +use Illuminate\Support\Facades\Route; class RouteServiceProvider extends ServiceProvider { - /** - * The module namespace to assume when generating URLs to actions. - * - * @var string - */ - protected $moduleNamespace = 'Modules\Countries\Http\Controllers'; - - /** - * Called before routes are registered. - * - * Register any model bindings or pattern based filters. - * - * @return void - */ - public function boot() - { - parent::boot(); - } - - /** - * Define the routes for the application. - * - * @return void - */ - public function map() + public function map(): void { $this->mapApiRoutes(); - $this->mapWebRoutes(); } - /** - * Define the "web" routes for the application. - * - * These routes all receive session state, CSRF protection, etc. - * - * @return void - */ - protected function mapWebRoutes() + protected function mapWebRoutes(): void { - Route::middleware('web') - ->namespace($this->moduleNamespace) - ->group(module_path('Countries', '/Routes/web.php')); + Route::middleware(['web', 'auth'])->group(module_path('Countries', 'Routes/web.php')); } - /** - * Define the "api" routes for the application. - * - * These routes are typically stateless. - * - * @return void - */ - protected function mapApiRoutes() + protected function mapApiRoutes(): void { - Route::prefix('api') - ->middleware('api') - ->namespace($this->moduleNamespace) - ->group(module_path('Countries', '/Routes/api.php')); + Route::prefix('api/v1')->middleware(['api', 'auth:sanctum'])->group(module_path('Countries', 'Routes/api.php')); } } diff --git a/Modules/Countries/Resources/views/edit.blade.php b/Modules/Countries/Resources/views/edit.blade.php new file mode 100644 index 00000000..a6b4ab20 --- /dev/null +++ b/Modules/Countries/Resources/views/edit.blade.php @@ -0,0 +1,9 @@ + +
+

Country support

Edit {{ $country->flag_emoji }} {{ $country->effective_name }}

ISO codes are locked. Only support status, display name and sort order can be changed.

+
@csrf @method('PUT') +
@error('display_name')

{{ $message }}

@enderror
@error('sort_order')

{{ $message }}

@enderror
+
Cancel
+
+
+
diff --git a/Modules/Countries/Resources/views/index.blade.php b/Modules/Countries/Resources/views/index.blade.php index 99a67ea3..9c5ad0f8 100644 --- a/Modules/Countries/Resources/views/index.blade.php +++ b/Modules/Countries/Resources/views/index.blade.php @@ -1,9 +1,25 @@ -@extends('countries::layouts.master') - -@section('content') -

Hello World

- -

- This view is loaded from module: {!! config('countries.name') !!} -

-@endsection + +
+
+
+

Reference data

+

Countries

+

ISO 3166 country records used by addresses, tenants, billing, carriers, customs and integrations.

+
+
+ @if (session('success'))
{{ session('success') }}
@endif +
+
Total countries
{{ number_format($totalCount) }}
+
Active
{{ number_format($activeCount) }}
+
Inactive
{{ number_format($inactiveCount) }}
+
+
+ + + +
+
+ @forelse ($countries as $country)@empty@endforelse +
CountryAlpha-2Alpha-3NumericStatusActions
{{ $country->flag_emoji }}
{{ $country->effective_name }}
{{ $country->official_name ?: $country->name }}
{{ $country->alpha2 }}{{ $country->alpha3 }}{{ $country->numeric }}@if ($country->is_active)Active@elseInactive@endifOpen Edit
No countries matched your search.
{{ $countries->links() }}
+
+
diff --git a/Modules/Countries/Resources/views/show.blade.php b/Modules/Countries/Resources/views/show.blade.php new file mode 100644 index 00000000..bcfb78c4 --- /dev/null +++ b/Modules/Countries/Resources/views/show.blade.php @@ -0,0 +1,7 @@ + +
+

ISO country

{{ $country->flag_emoji }} {{ $country->effective_name }}

{{ $country->official_name ?: $country->name }}

+ @if (session('success'))
{{ session('success') }}
@endif +
@foreach (['Alpha-2' => $country->alpha2, 'Alpha-3' => $country->alpha3, 'Numeric' => $country->numeric, 'Canonical name' => $country->name, 'Official name' => $country->official_name ?: 'โ€”', 'Common name' => $country->common_name ?: 'โ€”', 'Display override' => $country->display_name ?: 'โ€”', 'Active' => $country->is_active ? 'Yes' : 'No'] as $label => $value)
{{ $label }}
{{ $value }}
@endforeach
+
+
diff --git a/Modules/Countries/Routes/api.php b/Modules/Countries/Routes/api.php index 9823c92e..66208067 100644 --- a/Modules/Countries/Routes/api.php +++ b/Modules/Countries/Routes/api.php @@ -1,18 +1,10 @@ get('/countries', function (Request $request) { - return $request->user(); -}); \ No newline at end of file +Route::prefix('countries')->name('api.countries.')->group(function (): void { + Route::get('/', [CountriesApiController::class, 'index'])->name('index'); + Route::get('/active', [CountriesApiController::class, 'active'])->name('active'); + Route::get('/{country:alpha2}', [CountriesApiController::class, 'show'])->name('show'); +}); diff --git a/Modules/Countries/Routes/web.php b/Modules/Countries/Routes/web.php index 80d616a9..798b8a61 100644 --- a/Modules/Countries/Routes/web.php +++ b/Modules/Countries/Routes/web.php @@ -1,16 +1,11 @@ group(function() { - Route::get('/', 'CountriesController@index'); +Route::prefix('countries')->name('countries.')->group(function (): void { + Route::get('/', [CountriesController::class, 'index'])->name('index'); + Route::get('/{country:alpha2}', [CountriesController::class, 'show'])->name('show'); + Route::get('/{country:alpha2}/edit', [CountriesController::class, 'edit'])->name('edit'); + Route::put('/{country:alpha2}', [CountriesController::class, 'update'])->name('update'); }); diff --git a/Modules/Countries/Rules/ValidCountryCode.php b/Modules/Countries/Rules/ValidCountryCode.php new file mode 100644 index 00000000..f80f2248 --- /dev/null +++ b/Modules/Countries/Rules/ValidCountryCode.php @@ -0,0 +1,32 @@ +where('alpha2', strtoupper($value)); + + if ($this->activeOnly) { + $query->where('is_active', true); + } + + if (! $query->exists()) { + $fail('The :attribute must be a supported country.'); + } + } +} diff --git a/Modules/Countries/Support/CountryRepository.php b/Modules/Countries/Support/CountryRepository.php new file mode 100644 index 00000000..6bb45030 --- /dev/null +++ b/Modules/Countries/Support/CountryRepository.php @@ -0,0 +1,20 @@ +active()->ordered() + ->get(['id', 'alpha2', 'alpha3', 'numeric', 'name', 'display_name', 'common_name', 'flag_emoji']); + } + + public function findByAlpha2(string $alpha2): ?Country + { + return Country::query()->where('alpha2', strtoupper($alpha2))->first(); + } +} diff --git a/Modules/Countries/Tests/Feature/CountriesModuleTest.php b/Modules/Countries/Tests/Feature/CountriesModuleTest.php new file mode 100644 index 00000000..be1c0358 --- /dev/null +++ b/Modules/Countries/Tests/Feature/CountriesModuleTest.php @@ -0,0 +1,29 @@ +seed(IsoCountriesSeeder::class); + $this->assertDatabaseHas('countries', ['alpha2' => 'GB', 'alpha3' => 'GBR', 'numeric' => '826']); + } + + /** @test */ + public function it_can_update_country_support_settings(): void + { + $this->seed(IsoCountriesSeeder::class); + $country = Country::query()->where('alpha2', 'GB')->firstOrFail(); + $country->update(['display_name' => 'United Kingdom', 'is_active' => false, 'sort_order' => 1]); + $this->assertDatabaseHas('countries', ['alpha2' => 'GB', 'display_name' => 'United Kingdom', 'is_active' => false, 'sort_order' => 1]); + } +} diff --git a/Modules/Countries/changelog.yaml b/Modules/Countries/changelog.yaml new file mode 100644 index 00000000..fc421e1c --- /dev/null +++ b/Modules/Countries/changelog.yaml @@ -0,0 +1,11 @@ +module: Countries +current_version: 1.1.0 +entries: + - version: 1.1.0 + date: 2026-06-15 + type: feature + summary: "Completed ISO 3166 countries reference module with seeded country data, professional WMS UI, admin activation controls, API lookup endpoints, validation rule, and tests." + - version: 1.0.0 + date: 2026-06-15 + type: initial + summary: "Initial module skeleton." diff --git a/Modules/Countries/composer.json b/Modules/Countries/composer.json index f9ed04a7..8bab8035 100644 --- a/Modules/Countries/composer.json +++ b/Modules/Countries/composer.json @@ -1,29 +1,9 @@ { "name": "mpba/countries", - "description": "", - "authors": [ - { - "name": "Mark Gregory", - "email": "mark.gregory@mpba.co.uk" - } - ], - "extra": { - "laravel": { - "providers": [], - "aliases": { - - } - } - }, - "autoload": { - "psr-4": { - "Modules\\Countries\\": "" - }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests/", - "Modules\\Countries\\Tests\\": "modules/Countries/Tests/" - } - } - } + "description": "ISO 3166 country reference module for the WMS platform.", + "type": "laravel-module", + "authors": [{"name": "Mark Gregory", "email": "mark.gregory@mpba.co.uk"}], + "autoload": {"psr-4": {"Modules\\Countries\\": ""}}, + "autoload-dev": {"psr-4": {"Modules\\Countries\\Tests\\": "Tests/"}}, + "extra": {"laravel": {"providers": []}} } diff --git a/Modules/Countries/module.json b/Modules/Countries/module.json index e0abb645..bd6739e9 100644 --- a/Modules/Countries/module.json +++ b/Modules/Countries/module.json @@ -1,13 +1,11 @@ { "name": "Countries", "alias": "countries", - "version": "1.0.0", - "description": "", - "keywords": [], + "version": "1.1.0", + "description": "ISO 3166 country reference module with active-country support for WMS and SaaS workflows.", + "keywords": ["countries", "iso-3166", "reference-data", "localisation"], "priority": 0, - "providers": [ - "Modules\\Countries\\Providers\\CountriesServiceProvider" - ], + "providers": ["Modules\\Countries\\Providers\\CountriesServiceProvider"], "aliases": {}, "files": [], "requires": []