feat(menu): add label field to menu model and update related functionality

This commit is contained in:
2026-07-24 10:08:04 -03:00
parent 7889d747d9
commit 979ed428a2
9 changed files with 235 additions and 55 deletions

View File

@@ -22,24 +22,67 @@ return new class extends Migration
]
);
$routes = [
'profile' => '/mi-cuenta/datos-personales',
'purchases' => '/mi-cuenta/compras',
'tickets' => '/mi-cuenta/tickets',
$menus = [
'profile' => [
'code' => 'account.profile',
'route' => '/mi-cuenta/datos-personales',
],
'purchases' => [
'code' => 'account.purchases',
'route' => '/mi-cuenta/compras',
],
'tickets' => [
'code' => 'account.tickets',
'route' => '/mi-cuenta/tickets',
],
];
foreach ($routes as $code => $route) {
DB::table('menues')
->where('code', $code)
->update([
foreach ($menus as $legacyCode => $menuData) {
$legacyMenu = DB::table('menues')->where('code', $legacyCode)->first();
DB::table('menues')->updateOrInsert(
['code' => $menuData['code']],
[
'parent_menu_code' => 'account',
'route' => $route,
'content_type' => $legacyMenu?->content_type ?? Menu::CONTENT_TYPE_DYNAMIC,
'static_content_schema' => $legacyMenu?->static_content_schema,
'route' => $menuData['route'],
'created_at' => $legacyMenu?->created_at ?? $now,
'updated_at' => $now,
]);
]
);
if (! $legacyMenu) {
continue;
}
$assignments = DB::table('tenants_menues')
->where('menu_code', $legacyCode)
->get();
foreach ($assignments as $assignment) {
$alreadyAssigned = DB::table('tenants_menues')
->where('tenant_code', $assignment->tenant_code)
->where('menu_code', $menuData['code'])
->exists();
if (! $alreadyAssigned) {
DB::table('tenants_menues')->insert([
'tenant_code' => $assignment->tenant_code,
'menu_code' => $menuData['code'],
'static_content' => $assignment->static_content,
'created_at' => $assignment->created_at,
'updated_at' => $now,
]);
}
}
DB::table('tenants_menues')->where('menu_code', $legacyCode)->delete();
DB::table('menues')->where('code', $legacyCode)->delete();
}
$tenantCodes = DB::table('tenants_menues')
->whereIn('menu_code', array_keys($routes))
->whereIn('menu_code', array_column($menus, 'code'))
->distinct()
->pluck('tenant_code');
@@ -66,20 +109,63 @@ return new class extends Migration
public function down(): void
{
$now = now();
$routes = [
'profile' => '/profile',
'purchases' => '/purchases',
'tickets' => '/tickets',
$menus = [
'account.profile' => [
'code' => 'profile',
'route' => '/profile',
],
'account.purchases' => [
'code' => 'purchases',
'route' => '/purchases',
],
'account.tickets' => [
'code' => 'tickets',
'route' => '/tickets',
],
];
foreach ($routes as $code => $route) {
DB::table('menues')
->where('code', $code)
->update([
foreach ($menus as $accountCode => $menuData) {
$accountMenu = DB::table('menues')->where('code', $accountCode)->first();
DB::table('menues')->updateOrInsert(
['code' => $menuData['code']],
[
'parent_menu_code' => null,
'route' => $route,
'content_type' => $accountMenu?->content_type ?? Menu::CONTENT_TYPE_DYNAMIC,
'static_content_schema' => $accountMenu?->static_content_schema,
'route' => $menuData['route'],
'created_at' => $accountMenu?->created_at ?? $now,
'updated_at' => $now,
]);
]
);
if (! $accountMenu) {
continue;
}
$assignments = DB::table('tenants_menues')
->where('menu_code', $accountCode)
->get();
foreach ($assignments as $assignment) {
$alreadyAssigned = DB::table('tenants_menues')
->where('tenant_code', $assignment->tenant_code)
->where('menu_code', $menuData['code'])
->exists();
if (! $alreadyAssigned) {
DB::table('tenants_menues')->insert([
'tenant_code' => $assignment->tenant_code,
'menu_code' => $menuData['code'],
'static_content' => $assignment->static_content,
'created_at' => $assignment->created_at,
'updated_at' => $now,
]);
}
}
DB::table('tenants_menues')->where('menu_code', $accountCode)->delete();
DB::table('menues')->where('code', $accountCode)->delete();
}
DB::table('tenants_menues')->where('menu_code', 'account')->delete();

View File

@@ -0,0 +1,57 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Str;
return new class extends Migration
{
public function up(): void
{
Schema::table('menues', function (Blueprint $table) {
$table->string('label')->nullable()->after('code');
});
$labels = [
'index' => 'Inicio',
'product.detail' => 'Detalle de producto',
'checkout' => 'Finalizar compra',
'account' => 'Mi cuenta',
'account.profile' => 'Datos personales',
'account.purchases' => 'Mis compras',
'account.tickets' => 'Mis tickets',
'help' => 'Ayuda',
'help.faq' => 'Preguntas frecuentes',
'help.contact' => 'Contacto',
'help.payment-methods' => 'Medios de pago',
'help.shipping' => 'Envíos',
'help.terms-and-conditions' => 'Términos y condiciones',
];
DB::table('menues')
->select(['id', 'code'])
->orderBy('id')
->eachById(function ($menus) use ($labels): void {
foreach ($menus as $menu) {
$fallback = Str::headline(Str::afterLast($menu->code, '.'));
DB::table('menues')
->where('id', $menu->id)
->update(['label' => $labels[$menu->code] ?? $fallback]);
}
});
Schema::table('menues', function (Blueprint $table) {
$table->string('label')->nullable(false)->change();
});
}
public function down(): void
{
Schema::table('menues', function (Blueprint $table) {
$table->dropColumn('label');
});
}
};

View File

@@ -14,36 +14,46 @@ class MenuSeeder extends Seeder
public function run(): void
{
$menus = [
['code' => 'index', 'route' => '/'],
['code' => 'product.detail', 'route' => '/product/:id'],
['code' => 'checkout', 'route' => '/checkout'],
['code' => 'index', 'label' => 'Inicio', 'route' => '/'],
[
'code' => 'product.detail',
'label' => 'Detalle de producto',
'route' => '/product/:id',
],
['code' => 'checkout', 'label' => 'Finalizar compra', 'route' => '/checkout'],
[
'code' => 'account',
'label' => 'Mi cuenta',
'content_type' => Menu::CONTENT_TYPE_DYNAMIC,
'route' => '/mi-cuenta',
],
[
'code' => 'profile',
'code' => 'account.profile',
'label' => 'Datos personales',
'parent_menu_code' => 'account',
'route' => '/mi-cuenta/datos-personales',
],
[
'code' => 'purchases',
'code' => 'account.purchases',
'label' => 'Mis compras',
'parent_menu_code' => 'account',
'route' => '/mi-cuenta/compras',
],
[
'code' => 'tickets',
'code' => 'account.tickets',
'label' => 'Mis tickets',
'parent_menu_code' => 'account',
'route' => '/mi-cuenta/tickets',
],
[
'code' => 'help',
'label' => 'Ayuda',
'content_type' => Menu::CONTENT_TYPE_DYNAMIC,
'route' => '/ayuda',
],
[
'code' => 'help.faq',
'label' => 'Preguntas frecuentes',
'parent_menu_code' => 'help',
'content_type' => Menu::CONTENT_TYPE_STATIC,
'static_content_schema' => [
@@ -55,6 +65,7 @@ class MenuSeeder extends Seeder
],
[
'code' => 'help.contact',
'label' => 'Contacto',
'parent_menu_code' => 'help',
'content_type' => Menu::CONTENT_TYPE_STATIC,
'static_content_schema' => [
@@ -77,18 +88,21 @@ class MenuSeeder extends Seeder
],
[
'code' => 'help.payment-methods',
'label' => 'Medios de pago',
'parent_menu_code' => 'help',
'content_type' => Menu::CONTENT_TYPE_DYNAMIC,
'route' => '/ayuda/medios-de-pago',
],
[
'code' => 'help.shipping',
'label' => 'Envíos',
'parent_menu_code' => 'help',
'content_type' => Menu::CONTENT_TYPE_DYNAMIC,
'route' => '/ayuda/envios',
],
[
'code' => 'help.terms-and-conditions',
'label' => 'Términos y condiciones',
'parent_menu_code' => 'help',
'content_type' => Menu::CONTENT_TYPE_DYNAMIC,
'route' => '/ayuda/terminos-y-condiciones',
@@ -105,6 +119,10 @@ class MenuSeeder extends Seeder
Menu::updateOrCreate(['code' => $menuData['code']], $menuData);
}
Menu::query()
->whereIn('code', ['profile', 'purchases', 'tickets'])
->delete();
$tenants = Tenant::all();
$allMenus = Menu::pluck('code')->toArray();
@@ -167,7 +185,7 @@ class MenuSeeder extends Seeder
if ($tenant->codigo === 'sonder') {
// Sonder NO tiene tickets
$menuCodes = array_diff($menuCodes, ['tickets']);
$menuCodes = array_diff($menuCodes, ['account.tickets']);
} else {
// Los demás NO tienen product.detail
$menuCodes = array_diff($menuCodes, ['product.detail']);