feat(menus): separate shopit and onticket admin menus
This commit is contained in:
@@ -0,0 +1,236 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
private const ONTICKET_MENUS = [
|
||||
'adminapp.event' => ['onticket.adminapp.event', 'Eventos', '/admin/event'],
|
||||
'adminapp.inicio' => ['onticket.adminapp.inicio', 'Inicio', '/admin/inicio'],
|
||||
'adminapp.catalog' => ['onticket.adminapp.catalog', 'Catálogo', '/admin/catalog'],
|
||||
'adminapp.combos' => ['onticket.adminapp.combos', 'Combos', '/admin/combos'],
|
||||
'adminapp.categories' => ['onticket.adminapp.categories', 'Categorías', '/admin/categories'],
|
||||
'adminapp.ventas' => ['onticket.adminapp.ventas', 'Ventas', '/admin/ventas'],
|
||||
'adminapp.staff' => ['onticket.adminapp.staff', 'Usuarios', '/admin/staff'],
|
||||
'adminapp.tickets' => ['onticket.adminapp.tickets', 'Tickets', '/admin/tickets'],
|
||||
'adminapp.fiesta-futbol-infantil.entradas' => [
|
||||
'onticket.adminapp.fiesta-futbol-infantil.entradas',
|
||||
'Entradas',
|
||||
'/admin/entradas',
|
||||
],
|
||||
'adminapp.fiesta-futbol-infantil.alojamientos' => [
|
||||
'onticket.adminapp.fiesta-futbol-infantil.alojamientos',
|
||||
'Alojamientos',
|
||||
'/admin/alojamientos',
|
||||
],
|
||||
'adminapp.fiesta-futbol-infantil.merchandising' => [
|
||||
'onticket.adminapp.fiesta-futbol-infantil.merchandising',
|
||||
'Merchandising',
|
||||
'/admin/merchandising',
|
||||
],
|
||||
'adminapp.fiesta-futbol-infantil.comida' => [
|
||||
'onticket.adminapp.fiesta-futbol-infantil.comida',
|
||||
'Comida',
|
||||
'/admin/comidas',
|
||||
],
|
||||
'adminapp.desfile.entradas' => [
|
||||
'onticket.adminapp.desfile.entradas',
|
||||
'Entradas',
|
||||
'/admin/desfile/entradas',
|
||||
],
|
||||
'adminapp.desfile.reservas' => [
|
||||
'onticket.adminapp.desfile.reservas',
|
||||
'Reserva de Tickets',
|
||||
'/admin/desfile/reservas',
|
||||
],
|
||||
];
|
||||
|
||||
private const SHOPIT_MENUS = [
|
||||
'shopit.adminapp.marca' => ['Marca', '/admin/marca'],
|
||||
'shopit.adminapp.contacto' => ['Contacto', '/admin/contacto'],
|
||||
'shopit.adminapp.productos' => ['Productos', '/admin/productos'],
|
||||
'shopit.adminapp.categorias' => ['Categorías', '/admin/categorias'],
|
||||
'shopit.adminapp.transacciones' => ['Transacciones', '/admin/transacciones'],
|
||||
'shopit.adminapp.reportes' => ['Reportes', '/admin/reportes'],
|
||||
'shopit.adminapp.usuarios_roles' => ['Usuarios y roles', '/admin/usuarios-roles'],
|
||||
];
|
||||
|
||||
private const LEGACY_SHOPIT_ADMIN_MENUS = [
|
||||
'adminapp.event',
|
||||
'adminapp.inicio',
|
||||
'adminapp.catalog',
|
||||
'adminapp.combos',
|
||||
'adminapp.categories',
|
||||
'adminapp.ventas',
|
||||
'adminapp.staff',
|
||||
];
|
||||
|
||||
public function up(): void
|
||||
{
|
||||
DB::transaction(function (): void {
|
||||
if (! DB::table('menues')->where('code', 'main.adminapp')->exists()) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (self::ONTICKET_MENUS as $legacyCode => [$code, $label, $route]) {
|
||||
$this->replaceMenuCode($legacyCode, $code, $label, $route);
|
||||
$this->assignMenuToAdminRoles($code);
|
||||
}
|
||||
|
||||
foreach (self::SHOPIT_MENUS as $code => [$label, $route]) {
|
||||
$this->upsertMenu($code, $label, $route);
|
||||
$this->assignMenuToAdminRoles($code);
|
||||
}
|
||||
|
||||
$shopItTenantCodes = DB::table('tenants')
|
||||
->where('admin_website_type_code', 'shopit')
|
||||
->pluck('codigo');
|
||||
|
||||
if ($shopItTenantCodes->isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$adminMenuCodes = DB::table('menues')
|
||||
->where('parent_menu_code', 'main.adminapp')
|
||||
->pluck('code');
|
||||
|
||||
DB::table('tenants_menues')
|
||||
->whereIn('tenant_code', $shopItTenantCodes)
|
||||
->whereIn('menu_code', $adminMenuCodes)
|
||||
->delete();
|
||||
|
||||
foreach ($shopItTenantCodes as $tenantCode) {
|
||||
$this->assignMenuToTenant($tenantCode, 'main.adminapp');
|
||||
|
||||
foreach (array_keys(self::SHOPIT_MENUS) as $menuCode) {
|
||||
$this->assignMenuToTenant($tenantCode, $menuCode);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
DB::transaction(function (): void {
|
||||
if (! DB::table('menues')->where('code', 'main.adminapp')->exists()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$shopItTenantCodes = DB::table('tenants')
|
||||
->where('admin_website_type_code', 'shopit')
|
||||
->pluck('codigo');
|
||||
|
||||
DB::table('tenants_menues')
|
||||
->whereIn('tenant_code', $shopItTenantCodes)
|
||||
->whereIn('menu_code', array_keys(self::SHOPIT_MENUS))
|
||||
->delete();
|
||||
DB::table('roles_menues')
|
||||
->whereIn('menu_codigo', array_keys(self::SHOPIT_MENUS))
|
||||
->delete();
|
||||
DB::table('menues')
|
||||
->whereIn('code', array_keys(self::SHOPIT_MENUS))
|
||||
->delete();
|
||||
|
||||
foreach (self::ONTICKET_MENUS as $legacyCode => [$code, $label, $route]) {
|
||||
$this->replaceMenuCode($code, $legacyCode, $label, $route);
|
||||
}
|
||||
|
||||
foreach ($shopItTenantCodes as $tenantCode) {
|
||||
foreach (self::LEGACY_SHOPIT_ADMIN_MENUS as $menuCode) {
|
||||
$this->assignMenuToTenant($tenantCode, $menuCode);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private function replaceMenuCode(
|
||||
string $sourceCode,
|
||||
string $targetCode,
|
||||
string $label,
|
||||
string $route,
|
||||
): void {
|
||||
$source = DB::table('menues')->where('code', $sourceCode)->first();
|
||||
|
||||
$this->upsertMenu($targetCode, $label, $route, $source);
|
||||
|
||||
if ($source === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
DB::table('tenants_menues')
|
||||
->where('menu_code', $sourceCode)
|
||||
->get()
|
||||
->each(function (object $assignment) use ($targetCode): void {
|
||||
DB::table('tenants_menues')->updateOrInsert(
|
||||
[
|
||||
'tenant_code' => $assignment->tenant_code,
|
||||
'menu_code' => $targetCode,
|
||||
],
|
||||
[
|
||||
'static_content' => $assignment->static_content,
|
||||
'created_at' => $assignment->created_at ?? now(),
|
||||
'updated_at' => now(),
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
DB::table('roles_menues')
|
||||
->where('menu_codigo', $sourceCode)
|
||||
->pluck('rol_codigo')
|
||||
->each(fn (string $roleCode) => DB::table('roles_menues')->updateOrInsert([
|
||||
'rol_codigo' => $roleCode,
|
||||
'menu_codigo' => $targetCode,
|
||||
]));
|
||||
|
||||
DB::table('tenants_menues')->where('menu_code', $sourceCode)->delete();
|
||||
DB::table('roles_menues')->where('menu_codigo', $sourceCode)->delete();
|
||||
DB::table('menues')->where('code', $sourceCode)->delete();
|
||||
}
|
||||
|
||||
private function upsertMenu(
|
||||
string $code,
|
||||
string $label,
|
||||
string $route,
|
||||
?object $source = null,
|
||||
): void {
|
||||
DB::table('menues')->updateOrInsert(
|
||||
['code' => $code],
|
||||
[
|
||||
'label' => $source->label ?? $label,
|
||||
'parent_menu_code' => 'main.adminapp',
|
||||
'content_type' => $source->content_type ?? 'dynamic',
|
||||
'static_content_schema' => $source->static_content_schema ?? null,
|
||||
'route' => $source->route ?? $route,
|
||||
'created_at' => $source->created_at ?? now(),
|
||||
'updated_at' => now(),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
private function assignMenuToAdminRoles(string $menuCode): void
|
||||
{
|
||||
DB::table('roles')
|
||||
->whereIn('codigo', ['admin', 'adminapp'])
|
||||
->pluck('codigo')
|
||||
->each(fn (string $roleCode) => DB::table('roles_menues')->updateOrInsert([
|
||||
'rol_codigo' => $roleCode,
|
||||
'menu_codigo' => $menuCode,
|
||||
]));
|
||||
}
|
||||
|
||||
private function assignMenuToTenant(string $tenantCode, string $menuCode): void
|
||||
{
|
||||
DB::table('tenants_menues')->updateOrInsert(
|
||||
[
|
||||
'tenant_code' => $tenantCode,
|
||||
'menu_code' => $menuCode,
|
||||
],
|
||||
[
|
||||
'static_content' => null,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
],
|
||||
);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user