- 문서양식관리 CRUD 기능 구현 (생산관리 > 문서양식관리) - 결재라인, 섹션, 컬럼 동적 관리 (Vanilla JS) - 섹션별 이미지 업로드 기능 - SortableJS 드래그앤드롭 순서 변경 - 문서 미리보기 모달 - document_type 글로벌 코드 추가 (품질, 생산, 영업, 구매, 일반, 기타) - 역할/부서 권한 토글 시 페이지 새로고침 방지 (hx-swap="none") Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
933 lines
37 KiB
PHP
933 lines
37 KiB
PHP
<?php
|
|
|
|
namespace Database\Seeders;
|
|
|
|
use App\Models\Commons\Menu;
|
|
use Illuminate\Database\Seeder;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
/**
|
|
* MNG 메뉴 시더
|
|
*
|
|
* 현재 sidebar.blade.php의 실제 메뉴 구조를 기반으로 생성합니다.
|
|
* tenant_id=1 (기본 테넌트)용 메뉴를 생성합니다.
|
|
*
|
|
* 사용법:
|
|
* php artisan db:seed --class=MngMenuSeeder
|
|
*/
|
|
class MngMenuSeeder extends Seeder
|
|
{
|
|
protected int $tenantId = 1;
|
|
|
|
public function run(): void
|
|
{
|
|
$this->command->info('MNG 메뉴 시딩 시작...');
|
|
|
|
DB::transaction(function () {
|
|
// 기존 메뉴 삭제 (tenant_id=1)
|
|
Menu::withoutGlobalScopes()
|
|
->where('tenant_id', $this->tenantId)
|
|
->forceDelete();
|
|
|
|
$this->seedMainMenus();
|
|
$this->seedLabsMenus();
|
|
$this->seedDevToolsMenus();
|
|
});
|
|
|
|
$count = Menu::withoutGlobalScopes()->where('tenant_id', $this->tenantId)->count();
|
|
$this->command->info("MNG 메뉴 시딩 완료! (총 {$count}개)");
|
|
}
|
|
|
|
protected function seedMainMenus(): void
|
|
{
|
|
$sortOrder = 0;
|
|
|
|
// ========================================
|
|
// 대시보드
|
|
// ========================================
|
|
$this->createMenu([
|
|
'name' => '대시보드',
|
|
'url' => '/dashboard',
|
|
'icon' => 'home',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'route_name' => 'dashboard',
|
|
'section' => 'main',
|
|
],
|
|
]);
|
|
|
|
// ========================================
|
|
// 프로젝트 관리 그룹
|
|
// ========================================
|
|
$pmGroup = $this->createMenu([
|
|
'name' => '프로젝트 관리',
|
|
'url' => '#',
|
|
'icon' => 'folder',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'section' => 'main',
|
|
'meta' => ['group_id' => 'pm-group'],
|
|
],
|
|
]);
|
|
|
|
$pmSubOrder = 0;
|
|
$this->createMenu([
|
|
'parent_id' => $pmGroup->id,
|
|
'name' => '프로젝트 대시보드',
|
|
'url' => '/pm',
|
|
'icon' => 'chart-bar',
|
|
'sort_order' => $pmSubOrder++,
|
|
'options' => ['route_name' => 'pm.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $pmGroup->id,
|
|
'name' => '프로젝트',
|
|
'url' => '/pm/projects',
|
|
'icon' => 'folder',
|
|
'sort_order' => $pmSubOrder++,
|
|
'options' => ['route_name' => 'pm.projects.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $pmGroup->id,
|
|
'name' => '일일 스크럼',
|
|
'url' => '/daily-logs',
|
|
'icon' => 'calendar',
|
|
'sort_order' => $pmSubOrder++,
|
|
'options' => ['route_name' => 'daily-logs.index', 'section' => 'main'],
|
|
]);
|
|
|
|
// ========================================
|
|
// 시스템 관리 그룹
|
|
// ========================================
|
|
$systemGroup = $this->createMenu([
|
|
'name' => '시스템 관리',
|
|
'url' => '#',
|
|
'icon' => 'cog',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'section' => 'main',
|
|
'meta' => ['group_id' => 'system-group'],
|
|
],
|
|
]);
|
|
|
|
$systemSubOrder = 0;
|
|
$this->createMenu([
|
|
'parent_id' => $systemGroup->id,
|
|
'name' => '테넌트 관리',
|
|
'url' => '/tenants',
|
|
'icon' => 'building',
|
|
'sort_order' => $systemSubOrder++,
|
|
'options' => ['route_name' => 'tenants.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $systemGroup->id,
|
|
'name' => '사용자 관리',
|
|
'url' => '/users',
|
|
'icon' => 'users',
|
|
'sort_order' => $systemSubOrder++,
|
|
'options' => ['route_name' => 'users.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $systemGroup->id,
|
|
'name' => '부서 관리',
|
|
'url' => '/departments',
|
|
'icon' => 'building',
|
|
'sort_order' => $systemSubOrder++,
|
|
'options' => ['route_name' => 'departments.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $systemGroup->id,
|
|
'name' => '메뉴 관리',
|
|
'url' => '/menus',
|
|
'icon' => 'menu',
|
|
'sort_order' => $systemSubOrder++,
|
|
'options' => ['route_name' => 'menus.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $systemGroup->id,
|
|
'name' => '메뉴 동기화',
|
|
'url' => '/menus/sync',
|
|
'icon' => 'refresh',
|
|
'sort_order' => $systemSubOrder++,
|
|
'options' => ['route_name' => 'menus.sync.index', 'section' => 'main'],
|
|
]);
|
|
|
|
// ========================================
|
|
// 권한 관리 그룹
|
|
// ========================================
|
|
$permGroup = $this->createMenu([
|
|
'name' => '권한 관리',
|
|
'url' => '#',
|
|
'icon' => 'shield',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'section' => 'main',
|
|
'meta' => ['group_id' => 'permission-group'],
|
|
],
|
|
]);
|
|
|
|
$permSubOrder = 0;
|
|
$this->createMenu([
|
|
'parent_id' => $permGroup->id,
|
|
'name' => '역할 관리',
|
|
'url' => '/roles',
|
|
'icon' => 'shield-check',
|
|
'sort_order' => $permSubOrder++,
|
|
'options' => ['route_name' => 'roles.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $permGroup->id,
|
|
'name' => '권한 관리',
|
|
'url' => '/permissions',
|
|
'icon' => 'lock',
|
|
'sort_order' => $permSubOrder++,
|
|
'options' => ['route_name' => 'permissions.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $permGroup->id,
|
|
'name' => '역할 권한 관리',
|
|
'url' => '/role-permissions',
|
|
'icon' => 'shield-check',
|
|
'sort_order' => $permSubOrder++,
|
|
'options' => ['route_name' => 'role-permissions.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $permGroup->id,
|
|
'name' => '부서 권한 관리',
|
|
'url' => '/department-permissions',
|
|
'icon' => 'building',
|
|
'sort_order' => $permSubOrder++,
|
|
'options' => ['route_name' => 'department-permissions.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $permGroup->id,
|
|
'name' => '개인 권한 관리',
|
|
'url' => '/user-permissions',
|
|
'icon' => 'user',
|
|
'sort_order' => $permSubOrder++,
|
|
'options' => ['route_name' => 'user-permissions.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $permGroup->id,
|
|
'name' => '권한 분석',
|
|
'url' => '/permission-analyze',
|
|
'icon' => 'chart-bar',
|
|
'sort_order' => $permSubOrder++,
|
|
'options' => ['route_name' => 'permission-analyze.index', 'section' => 'main'],
|
|
]);
|
|
|
|
// ========================================
|
|
// 생산 관리 그룹
|
|
// ========================================
|
|
$productionGroup = $this->createMenu([
|
|
'name' => '생산 관리',
|
|
'url' => '#',
|
|
'icon' => 'cube',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'section' => 'main',
|
|
'meta' => ['group_id' => 'production-group'],
|
|
],
|
|
]);
|
|
|
|
$prodSubOrder = 0;
|
|
$this->createMenu([
|
|
'parent_id' => $productionGroup->id,
|
|
'name' => '품목기준 필드 관리',
|
|
'url' => '/item-fields',
|
|
'icon' => 'list',
|
|
'sort_order' => $prodSubOrder++,
|
|
'options' => ['route_name' => 'item-fields.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $productionGroup->id,
|
|
'name' => '견적수식 관리',
|
|
'url' => '/quote-formulas',
|
|
'icon' => 'calculator',
|
|
'sort_order' => $prodSubOrder++,
|
|
'options' => ['route_name' => 'quote-formulas.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $productionGroup->id,
|
|
'name' => '재고 설정',
|
|
'url' => '/tenant-settings',
|
|
'icon' => 'cog',
|
|
'sort_order' => $prodSubOrder++,
|
|
'options' => ['route_name' => 'tenant-settings.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $productionGroup->id,
|
|
'name' => '공통코드 관리',
|
|
'url' => '/common-codes',
|
|
'icon' => 'collection',
|
|
'sort_order' => $prodSubOrder++,
|
|
'options' => ['route_name' => 'common-codes.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $productionGroup->id,
|
|
'name' => '제품 관리',
|
|
'url' => '/products',
|
|
'icon' => 'cube',
|
|
'sort_order' => $prodSubOrder++,
|
|
'hidden' => true,
|
|
'options' => ['route_name' => 'products.index', 'section' => 'main', 'meta' => ['status' => 'preparing']],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $productionGroup->id,
|
|
'name' => '자재 관리',
|
|
'url' => '/materials',
|
|
'icon' => 'archive',
|
|
'sort_order' => $prodSubOrder++,
|
|
'hidden' => true,
|
|
'options' => ['route_name' => 'materials.index', 'section' => 'main', 'meta' => ['status' => 'preparing']],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $productionGroup->id,
|
|
'name' => 'BOM 관리',
|
|
'url' => '/bom',
|
|
'icon' => 'clipboard-list',
|
|
'sort_order' => $prodSubOrder++,
|
|
'hidden' => true,
|
|
'options' => ['route_name' => 'bom.index', 'section' => 'main', 'meta' => ['status' => 'preparing']],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $productionGroup->id,
|
|
'name' => '카테고리 관리',
|
|
'url' => '/categories',
|
|
'icon' => 'tag',
|
|
'sort_order' => $prodSubOrder++,
|
|
'hidden' => true,
|
|
'options' => ['route_name' => 'categories.index', 'section' => 'main', 'meta' => ['status' => 'preparing']],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $productionGroup->id,
|
|
'name' => '문서양식관리',
|
|
'url' => '/document-templates',
|
|
'icon' => 'document-duplicate',
|
|
'sort_order' => $prodSubOrder++,
|
|
'options' => ['route_name' => 'document-templates.index', 'section' => 'main'],
|
|
]);
|
|
|
|
// ========================================
|
|
// 콘텐츠 관리 그룹
|
|
// ========================================
|
|
$contentGroup = $this->createMenu([
|
|
'name' => '콘텐츠 관리',
|
|
'url' => '#',
|
|
'icon' => 'document-text',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'section' => 'main',
|
|
'meta' => ['group_id' => 'content-group'],
|
|
],
|
|
]);
|
|
|
|
$this->createMenu([
|
|
'parent_id' => $contentGroup->id,
|
|
'name' => '게시판 관리',
|
|
'url' => '/boards',
|
|
'icon' => 'clipboard',
|
|
'sort_order' => 0,
|
|
'options' => ['route_name' => 'boards.index', 'section' => 'main'],
|
|
]);
|
|
|
|
// ========================================
|
|
// 재무관리 그룹
|
|
// ========================================
|
|
$financeGroup = $this->createMenu([
|
|
'name' => '재무관리',
|
|
'url' => '#',
|
|
'icon' => 'currency-dollar',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'section' => 'main',
|
|
'meta' => ['group_id' => 'finance-group'],
|
|
],
|
|
]);
|
|
|
|
$financeSubOrder = 0;
|
|
|
|
// 대시보드/일보
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '재무 대시보드',
|
|
'url' => '/finance/dashboard',
|
|
'icon' => 'chart-bar',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.dashboard', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '일일자금일보',
|
|
'url' => '/finance/daily-fund',
|
|
'icon' => 'newspaper',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.daily-fund', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '자금계획일정',
|
|
'url' => '/finance/fund-schedules',
|
|
'icon' => 'calendar',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.fund-schedules.index', 'section' => 'main'],
|
|
]);
|
|
|
|
// 계좌관리
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '계좌관리',
|
|
'url' => '/finance/accounts',
|
|
'icon' => 'credit-card',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.accounts.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '계좌거래내역',
|
|
'url' => '/finance/account-transactions',
|
|
'icon' => 'document-text',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.account-transactions', 'section' => 'main'],
|
|
]);
|
|
|
|
// 카드관리
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '법인카드관리',
|
|
'url' => '/finance/corporate-cards',
|
|
'icon' => 'credit-card',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.corporate-cards', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '카드사용내역',
|
|
'url' => '/finance/card-transactions',
|
|
'icon' => 'document-text',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.card-transactions', 'section' => 'main'],
|
|
]);
|
|
|
|
// 수입/지출
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '수입관리',
|
|
'url' => '/finance/income',
|
|
'icon' => 'arrow-down',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.income', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '지출관리',
|
|
'url' => '/finance/expense',
|
|
'icon' => 'arrow-up',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.expense', 'section' => 'main'],
|
|
]);
|
|
|
|
// 매출/매입
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '매출관리',
|
|
'url' => '/finance/sales',
|
|
'icon' => 'trending-up',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.sales', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '매입관리',
|
|
'url' => '/finance/purchase',
|
|
'icon' => 'shopping-cart',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.purchase', 'section' => 'main'],
|
|
]);
|
|
|
|
// 정산관리
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '영업수수료 정산',
|
|
'url' => '/finance/sales-commission',
|
|
'icon' => 'cash',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.sales-commission', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '컨설팅비용 정산',
|
|
'url' => '/finance/consulting-fee',
|
|
'icon' => 'briefcase',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.consulting-fee', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '고객사 정산',
|
|
'url' => '/finance/customer-settlement',
|
|
'icon' => 'users',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.customer-settlement', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '구독료 정산',
|
|
'url' => '/finance/subscription',
|
|
'icon' => 'refresh',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.subscription', 'section' => 'main'],
|
|
]);
|
|
|
|
// 차량관리
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '법인차량관리',
|
|
'url' => '/finance/corporate-vehicles',
|
|
'icon' => 'truck',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.corporate-vehicles', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '차량정비이력',
|
|
'url' => '/finance/vehicle-maintenance',
|
|
'icon' => 'wrench',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.vehicle-maintenance', 'section' => 'main'],
|
|
]);
|
|
|
|
// 거래처관리
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '고객사관리',
|
|
'url' => '/finance/customers',
|
|
'icon' => 'user-group',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.customers', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '협력사관리',
|
|
'url' => '/finance/partners',
|
|
'icon' => 'office-building',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.partners', 'section' => 'main'],
|
|
]);
|
|
|
|
// 채권/채무
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '채권관리',
|
|
'url' => '/finance/receivables',
|
|
'icon' => 'document-add',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.receivables', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '채무관리',
|
|
'url' => '/finance/payables',
|
|
'icon' => 'document-remove',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.payables', 'section' => 'main'],
|
|
]);
|
|
|
|
// 기타
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '환불관리',
|
|
'url' => '/finance/refunds',
|
|
'icon' => 'receipt-refund',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.refunds', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $financeGroup->id,
|
|
'name' => '부가세관리',
|
|
'url' => '/finance/vat',
|
|
'icon' => 'calculator',
|
|
'sort_order' => $financeSubOrder++,
|
|
'options' => ['route_name' => 'finance.vat', 'section' => 'main'],
|
|
]);
|
|
|
|
// ========================================
|
|
// 바로빌본사 그룹 (본사 관리용)
|
|
// ========================================
|
|
$barobillHqGroup = $this->createMenu([
|
|
'name' => '바로빌본사',
|
|
'url' => '#',
|
|
'icon' => 'office-building',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'section' => 'main',
|
|
'meta' => ['group_id' => 'barobill-hq-group'],
|
|
],
|
|
]);
|
|
|
|
$barobillHqSubOrder = 0;
|
|
$this->createMenu([
|
|
'parent_id' => $barobillHqGroup->id,
|
|
'name' => '바로빌설정',
|
|
'url' => '/barobill/config',
|
|
'icon' => 'cog',
|
|
'sort_order' => $barobillHqSubOrder++,
|
|
'options' => ['route_name' => 'barobill.config.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $barobillHqGroup->id,
|
|
'name' => '회원사관리',
|
|
'url' => '/barobill/members',
|
|
'icon' => 'building',
|
|
'sort_order' => $barobillHqSubOrder++,
|
|
'options' => ['route_name' => 'barobill.members.index', 'section' => 'main'],
|
|
]);
|
|
|
|
// ========================================
|
|
// 바로빌 그룹 (회원사용)
|
|
// ========================================
|
|
$barobillGroup = $this->createMenu([
|
|
'name' => '바로빌',
|
|
'url' => '#',
|
|
'icon' => 'receipt',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'section' => 'main',
|
|
'meta' => ['group_id' => 'barobill-group'],
|
|
],
|
|
]);
|
|
|
|
$barobillSubOrder = 0;
|
|
$this->createMenu([
|
|
'parent_id' => $barobillGroup->id,
|
|
'name' => '설정',
|
|
'url' => '/barobill/settings',
|
|
'icon' => 'cog',
|
|
'sort_order' => $barobillSubOrder++,
|
|
'options' => ['route_name' => 'barobill.settings.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $barobillGroup->id,
|
|
'name' => '전자세금계산서',
|
|
'url' => '/barobill/etax',
|
|
'icon' => 'document-text',
|
|
'sort_order' => $barobillSubOrder++,
|
|
'options' => ['route_name' => 'barobill.etax.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $barobillGroup->id,
|
|
'name' => '계좌 입출금내역',
|
|
'url' => '/barobill/eaccount',
|
|
'icon' => 'credit-card',
|
|
'sort_order' => $barobillSubOrder++,
|
|
'options' => ['route_name' => 'barobill.eaccount.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $barobillGroup->id,
|
|
'name' => '카드 사용내역',
|
|
'url' => '/barobill/ecard',
|
|
'icon' => 'credit-card',
|
|
'sort_order' => $barobillSubOrder++,
|
|
'options' => ['route_name' => 'barobill.ecard.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $barobillGroup->id,
|
|
'name' => '홈텍스매입/매출',
|
|
'url' => '/barobill/hometax',
|
|
'icon' => 'document-report',
|
|
'sort_order' => $barobillSubOrder++,
|
|
'options' => ['route_name' => 'barobill.hometax.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $barobillGroup->id,
|
|
'name' => '사용량조회',
|
|
'url' => '/barobill/usage',
|
|
'icon' => 'chart-bar',
|
|
'sort_order' => $barobillSubOrder++,
|
|
'options' => ['route_name' => 'barobill.usage.index', 'section' => 'main'],
|
|
]);
|
|
|
|
// ========================================
|
|
// 신용평가 그룹
|
|
// ========================================
|
|
$creditGroup = $this->createMenu([
|
|
'name' => '신용평가',
|
|
'url' => '#',
|
|
'icon' => 'shield-check',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'section' => 'main',
|
|
'meta' => ['group_id' => 'credit-group'],
|
|
],
|
|
]);
|
|
|
|
$creditSubOrder = 0;
|
|
$this->createMenu([
|
|
'parent_id' => $creditGroup->id,
|
|
'name' => '신용평가 조회',
|
|
'url' => '/credit/inquiry',
|
|
'icon' => 'search',
|
|
'sort_order' => $creditSubOrder++,
|
|
'options' => ['route_name' => 'credit.inquiry.index', 'section' => 'main'],
|
|
]);
|
|
|
|
// ========================================
|
|
// 영업관리 그룹
|
|
// ========================================
|
|
$salesGroup = $this->createMenu([
|
|
'name' => '영업관리',
|
|
'url' => '#',
|
|
'icon' => 'briefcase',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'section' => 'main',
|
|
'meta' => ['group_id' => 'sales-group'],
|
|
],
|
|
]);
|
|
|
|
$salesSubOrder = 0;
|
|
$this->createMenu([
|
|
'parent_id' => $salesGroup->id,
|
|
'name' => '영업담당자 관리',
|
|
'url' => '/sales/managers',
|
|
'icon' => 'users',
|
|
'sort_order' => $salesSubOrder++,
|
|
'options' => ['route_name' => 'sales.managers.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $salesGroup->id,
|
|
'name' => '가망고객 관리',
|
|
'url' => '/sales/prospects',
|
|
'icon' => 'user-group',
|
|
'sort_order' => $salesSubOrder++,
|
|
'options' => ['route_name' => 'sales.prospects.index', 'section' => 'main'],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $salesGroup->id,
|
|
'name' => '영업실적 관리',
|
|
'url' => '/sales/records',
|
|
'icon' => 'chart-bar',
|
|
'sort_order' => $salesSubOrder++,
|
|
'options' => ['route_name' => 'sales.records.index', 'section' => 'main'],
|
|
]);
|
|
|
|
// ========================================
|
|
// 시스템 그룹
|
|
// ========================================
|
|
$settingsGroup = $this->createMenu([
|
|
'name' => '시스템',
|
|
'url' => '#',
|
|
'icon' => 'cog',
|
|
'sort_order' => $sortOrder++,
|
|
'options' => [
|
|
'section' => 'main',
|
|
'meta' => ['group_id' => 'system-settings-group'],
|
|
],
|
|
]);
|
|
|
|
$settingsSubOrder = 0;
|
|
$this->createMenu([
|
|
'parent_id' => $settingsGroup->id,
|
|
'name' => '시스템 설정',
|
|
'url' => '/settings',
|
|
'icon' => 'cog',
|
|
'sort_order' => $settingsSubOrder++,
|
|
'hidden' => true,
|
|
'options' => ['route_name' => 'settings.index', 'section' => 'main', 'meta' => ['status' => 'preparing']],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $settingsGroup->id,
|
|
'name' => '감사 로그',
|
|
'url' => '/audit-logs',
|
|
'icon' => 'document-text',
|
|
'sort_order' => $settingsSubOrder++,
|
|
'hidden' => true,
|
|
'options' => ['route_name' => 'audit-logs.index', 'section' => 'main', 'meta' => ['status' => 'preparing']],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $settingsGroup->id,
|
|
'name' => '삭제된 데이터 백업',
|
|
'url' => '/archived-records',
|
|
'icon' => 'database',
|
|
'sort_order' => $settingsSubOrder++,
|
|
'options' => ['route_name' => 'archived-records.index', 'section' => 'main'],
|
|
]);
|
|
}
|
|
|
|
protected function seedLabsMenus(): void
|
|
{
|
|
// ========================================
|
|
// R&D Labs 그룹 (S/A/M 탭 구조)
|
|
// ========================================
|
|
$labsGroup = $this->createMenu([
|
|
'name' => 'R&D Labs',
|
|
'url' => '#',
|
|
'icon' => 'beaker',
|
|
'sort_order' => 100,
|
|
'options' => [
|
|
'section' => 'labs',
|
|
'menu_type' => 'lab',
|
|
'meta' => [
|
|
'group_id' => 'lab-group',
|
|
'tabs' => ['S', 'A', 'M'],
|
|
],
|
|
],
|
|
]);
|
|
|
|
// S 탭 메뉴들 (Strategy)
|
|
$sMenus = [
|
|
['name' => '세무 전략', 'url' => '/lab/strategy/tax', 'route' => 'lab.strategy.tax'],
|
|
['name' => '노무 전략', 'url' => '/lab/strategy/labor', 'route' => 'lab.strategy.labor'],
|
|
['name' => '채권추심 전략', 'url' => '/lab/strategy/debt', 'route' => 'lab.strategy.debt'],
|
|
['name' => '스테이블코인 보고서', 'url' => '/lab/strategy/stablecoin', 'route' => 'lab.strategy.stablecoin'],
|
|
['name' => 'MRP 해외사례', 'url' => '/lab/strategy/mrp-overseas', 'route' => 'lab.strategy.mrp-overseas'],
|
|
['name' => '상담용 챗봇 전략', 'url' => '/lab/strategy/chatbot', 'route' => 'lab.strategy.chatbot'],
|
|
['name' => 'KoDATA vs NICE API', 'url' => '/lab/strategy/kodata-vs-nice', 'route' => 'lab.strategy.kodata-vs-nice'],
|
|
['name' => '바로빌 vs 팝빌 API', 'url' => '/lab/strategy/barobill-vs-popbill', 'route' => 'lab.strategy.barobill-vs-popbill'],
|
|
['name' => '사내 지식 검색 시스템', 'url' => '/lab/strategy/knowledge-search', 'route' => 'lab.strategy.knowledge-search'],
|
|
['name' => '챗봇 솔루션 비교 분석', 'url' => '/lab/strategy/chatbot-compare', 'route' => 'lab.strategy.chatbot-compare'],
|
|
['name' => 'RAG 스타트업 현황', 'url' => '/lab/strategy/rag-startups', 'route' => 'lab.strategy.rag-startups'],
|
|
['name' => '더존비즈온 분석', 'url' => '/lab/strategy/douzone', 'route' => 'lab.strategy.douzone'],
|
|
['name' => 'Confluence vs Notion', 'url' => '/lab/strategy/confluence-vs-notion', 'route' => 'lab.strategy.confluence-vs-notion'],
|
|
['name' => '차세대 QA 솔루션', 'url' => '/lab/strategy/qa-solution', 'route' => 'lab.strategy.qa-solution'],
|
|
['name' => 'SAM 영업전략', 'url' => '/lab/strategy/sales-strategy', 'route' => 'lab.strategy.sales-strategy'],
|
|
];
|
|
|
|
foreach ($sMenus as $i => $menu) {
|
|
$this->createMenu([
|
|
'parent_id' => $labsGroup->id,
|
|
'name' => $menu['name'],
|
|
'url' => $menu['url'],
|
|
'icon' => 'document',
|
|
'sort_order' => $i,
|
|
'options' => [
|
|
'route_name' => $menu['route'],
|
|
'section' => 'labs',
|
|
'menu_type' => 'lab',
|
|
'meta' => ['tab' => 'S'],
|
|
],
|
|
]);
|
|
}
|
|
|
|
// A 탭 메뉴들 (AI/Automation)
|
|
$aMenus = [
|
|
['name' => '사업자등록증 OCR', 'url' => '/lab/ai/business-ocr', 'route' => 'lab.ai.business-ocr'],
|
|
['name' => '웹 녹음 AI 요약', 'url' => '/lab/ai/web-recording', 'route' => 'lab.ai.web-recording'],
|
|
['name' => '회의록 AI 요약', 'url' => '/lab/ai/meeting-summary', 'route' => 'lab.ai.meeting-summary'],
|
|
['name' => '업무협의록 AI 요약', 'url' => '/lab/ai/work-memo-summary', 'route' => 'lab.ai.work-memo-summary'],
|
|
['name' => '운영자용 챗봇', 'url' => '/lab/ai/operator-chatbot', 'route' => 'lab.ai.operator-chatbot'],
|
|
['name' => 'Vertex RAG 챗봇', 'url' => '/lab/ai/vertex-rag', 'route' => 'lab.ai.vertex-rag'],
|
|
['name' => '테넌트 지식 업로드', 'url' => '/lab/ai/tenant-knowledge', 'route' => 'lab.ai.tenant-knowledge'],
|
|
['name' => '테넌트 챗봇', 'url' => '/lab/ai/tenant-chatbot', 'route' => 'lab.ai.tenant-chatbot'],
|
|
['name' => 'SAM AI 메뉴 이동', 'url' => '/lab/ai/sam-ai-menu', 'route' => 'lab.ai.sam-ai-menu'],
|
|
['name' => 'SAM AI 알람음 제작', 'url' => '/lab/ai/sam-ai-alarm', 'route' => 'lab.ai.sam-ai-alarm'],
|
|
['name' => 'GPS 출퇴근 관리', 'url' => '/lab/ai/gps-attendance', 'route' => 'lab.ai.gps-attendance'],
|
|
['name' => '기업개황 조회', 'url' => '/lab/ai/company-overview', 'route' => 'lab.ai.company-overview'],
|
|
];
|
|
|
|
foreach ($aMenus as $i => $menu) {
|
|
$this->createMenu([
|
|
'parent_id' => $labsGroup->id,
|
|
'name' => $menu['name'],
|
|
'url' => $menu['url'],
|
|
'icon' => 'chip',
|
|
'sort_order' => 100 + $i,
|
|
'options' => [
|
|
'route_name' => $menu['route'],
|
|
'section' => 'labs',
|
|
'menu_type' => 'lab',
|
|
'meta' => ['tab' => 'A'],
|
|
],
|
|
]);
|
|
}
|
|
|
|
// M 탭 메뉴들 (Management)
|
|
$mMenus = [
|
|
['name' => '바로빌 테넌트 관리', 'url' => '/lab/management/barobill-tenant', 'route' => 'lab.management.barobill-tenant'],
|
|
['name' => '전자세금계산서 전략', 'url' => '/lab/management/tax-invoice-strategy', 'route' => 'lab.management.tax-invoice-strategy'],
|
|
['name' => '전자세금계산서', 'url' => '/lab/management/tax-invoice', 'route' => 'lab.management.tax-invoice'],
|
|
['name' => '사업자등록번호 진위 확인', 'url' => '/lab/management/business-verify', 'route' => 'lab.management.business-verify'],
|
|
['name' => '영업관리 & 매니저 미팅관리', 'url' => '/lab/management/sales-meeting', 'route' => 'lab.management.sales-meeting'],
|
|
['name' => '카드 세무항목 매칭 전략', 'url' => '/lab/management/card-tax-matching', 'route' => 'lab.management.card-tax-matching'],
|
|
['name' => '한국 카드사 API 보고서', 'url' => '/lab/management/card-api-report', 'route' => 'lab.management.card-api-report'],
|
|
['name' => '카드 사용내역 수집 후 매칭', 'url' => '/lab/management/card-usage-matching', 'route' => 'lab.management.card-usage-matching'],
|
|
['name' => '계좌입출금 내역 조회 API', 'url' => '/lab/management/account-api', 'route' => 'lab.management.account-api'],
|
|
['name' => '영업관리 시나리오', 'url' => '/lab/management/sales-scenario', 'route' => 'lab.management.sales-scenario'],
|
|
['name' => '매니저 시나리오', 'url' => '/lab/management/manager-scenario', 'route' => 'lab.management.manager-scenario'],
|
|
];
|
|
|
|
foreach ($mMenus as $i => $menu) {
|
|
$this->createMenu([
|
|
'parent_id' => $labsGroup->id,
|
|
'name' => $menu['name'],
|
|
'url' => $menu['url'],
|
|
'icon' => 'briefcase',
|
|
'sort_order' => 200 + $i,
|
|
'options' => [
|
|
'route_name' => $menu['route'],
|
|
'section' => 'labs',
|
|
'menu_type' => 'lab',
|
|
'meta' => ['tab' => 'M'],
|
|
],
|
|
]);
|
|
}
|
|
}
|
|
|
|
protected function seedDevToolsMenus(): void
|
|
{
|
|
// ========================================
|
|
// 개발 도구 그룹 (하단 고정)
|
|
// ========================================
|
|
$devToolsGroup = $this->createMenu([
|
|
'name' => '개발 도구',
|
|
'url' => '#',
|
|
'icon' => 'code',
|
|
'sort_order' => 900,
|
|
'options' => [
|
|
'section' => 'tools',
|
|
'menu_type' => 'tool',
|
|
'meta' => ['group_id' => 'dev-tools-group', 'position' => 'bottom'],
|
|
],
|
|
]);
|
|
|
|
$devSubOrder = 0;
|
|
$this->createMenu([
|
|
'parent_id' => $devToolsGroup->id,
|
|
'name' => 'API 플로우 테스터',
|
|
'url' => '/dev-tools/flow-tester',
|
|
'icon' => 'terminal',
|
|
'sort_order' => $devSubOrder++,
|
|
'options' => [
|
|
'route_name' => 'dev-tools.flow-tester.index',
|
|
'section' => 'tools',
|
|
'menu_type' => 'tool',
|
|
],
|
|
]);
|
|
$this->createMenu([
|
|
'parent_id' => $devToolsGroup->id,
|
|
'name' => 'API 요청 로그',
|
|
'url' => '/dev-tools/api-logs',
|
|
'icon' => 'document-text',
|
|
'sort_order' => $devSubOrder++,
|
|
'options' => [
|
|
'route_name' => 'dev-tools.api-logs.index',
|
|
'section' => 'tools',
|
|
'menu_type' => 'tool',
|
|
],
|
|
]);
|
|
}
|
|
|
|
protected function createMenu(array $data): Menu
|
|
{
|
|
$defaults = [
|
|
'tenant_id' => $this->tenantId,
|
|
'is_active' => true,
|
|
'hidden' => false,
|
|
'is_external' => false,
|
|
'is_customized' => false,
|
|
];
|
|
|
|
return Menu::create(array_merge($defaults, $data));
|
|
}
|
|
}
|