# Account dashbaord to-do in new environment ## To be fixed * Keycloak 兩個 instances 會有登入不了的問題 * ## Keycloak init script to-do but not * Token TTL * Console admin for get realm ## CAS to-do ### recaptcha * 新環境的 domain 申請 ## CICD 上版本流程 什麼 branch 什麼 tag 都要確定好條件觸發 cicd ## 確認該環境 config ### Environment default (prod/pa/dev) needed data ``` javascript { environment: 'production', maxConnection: 30, // server 允許 clients 最大同時連線數 companyGroup: { defaultAdminRole: 'account_dashboard_group_admin', }, // 對 go platform 的最大連線數 limiter: { goPlatform: { // 因為只有 forgot password 對外開放, 所以只提供 forgot password 的限制 forgotPassword: { maxConcurrent: 15, minTime: 333, }, }, }, preloadedState: { auth: { reCAPTCHA: true, reCAPTCHAKey: '6Le8qsIUAAAAALiTMP4ol0Fm1hQ0Nfzav1ENSG1v', }, }, profiling: { intervalEnable: false, }, swagger: { uiEnable: false, }, notifier: { enable: true, webhooks: { accountDashboard: 'https://hooks.slack.com/services/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', }, }, }; ``` ### Instance default (tw/polo/eu) needed data ``` javascript preloadedState: { app: { region: 'polo', }, }, login: { rule: 1, }, // slack and logger will show federation information when sending error message notifier: { region: 'polo', }, // DMS need information // 每一個 instance 都填寫空的 object // 只有 TW 會有資料 dpAndDMSCompanyCodeMap: {}, dpAndDMSCompanyCodeExceptions: {}, ``` ### Instance(tw/polo/eu) needed data ``` javascript // 每個環境都會不一樣 { // Default company group // 非 CAS 版本的時候, 所有 Resuqest 近來都會給這個 deafult 值 companyGroup: { defaultAdminRole: 'account_dashboard_group_admin', // 不會變 default: { id: 'l530jMO0', // default company group id dataCompanyId: '30RlKLmn',// default company group data company id realmName: 'gogoro', // default 的 company group 對應到的 realm 是什麼這個值就是什麼 }, }, // account service sdk 的 legacy code 需要使用的 service account // 會用這個 account 去對 keycloak 執行 user operation // 原本使用 account service service account 操作 // 但未來都不會有 account service service account // 所以填寫 account dashboard 的 service account 就好了 // 而且這個 account 所屬 company group 可以直接同上面 default company group // 因為 account service 不會有 multi realm 的存在 // 而且以後也不會有 client 使用到的 API 會用到 account service accountAdmin: { // only account service will use this data // the information in this no need to be 100 % correct // just not let these data not to be null or undefined is ok keycloak: { id: 'b269d26d-ad2a-4e53-991c-8bdaf3bef321', // service account guid // 原本的 account service service account 都會有一組對應的 employee account 在 go-platform, 這邊就是填寫那個 account 在 platform 的資料 // 但是現在都不會再另外建立 service account 到 platform 了 // 所以直接 attributes: { company_id: ['30RlKLmn'], department_id: ['30RlKLmn'], employee_id: ['30RlKLmn'], }, }, }, // 非 CAS 版本的 Account Dashbaord 才會使用的參數 // 因為還在使用 feature auth // 所以 feature auth 裡面的 express-session 會用到 redis 相關參數 // 啊之所以沒有 redis pass, 是因為 password 要從 ENV 來 // 有 CAS 版本的 Account Dashbaord 不需要用到這個值 redis: { session: { domain: 'huanhuan.cn', key: 'goauth-gogoro-solutions', }, }, // Account Service SDK 才會用到的參數 // 包含所有 Account Service SDK 會連線到的 go-platform service 相關 API 資訊 goPlatform: { globalService: { url: 'http://goplatform-global.ggr-goplatform.svc.cluster.local/v1', api: { companyGroupInit: '/company-groups/initializations', company: '/companies', department: '/departments', employee: '/companies/employees', }, }, keyService: { url: 'http:/goplatform-keyservice.ggr-goplatform.svc.cluster.local/v1', api: { resetPassword: '/auth/reset-password', }, }, }, // Account Dashbaord 連線 keycloak 會使用到的資料 // 而因為 keycloak 相關 conifg keycloak: { host: 'http://keycloak.keycloak.svc.cluster.local/auth', // 如果有 multi-federation 就填寫多組 realms: [ { name: 'gogoro', auth: { configInEnv: 'GOAUTH_CONFIG', }, accountDashboard: { nameInEnv: 'GOAUTH_SVC_CLIENT_ID', secretInEnv: 'GOAUTH_SVC_SECRET', }, }, ], }, // 以下為建立 roles 的時候要額外寫進去 token 的值 // attributes 資料要跟各個 role 所屬的 solutions owner 要, 都是 company code // 因為在 Account Service 裡面會幫忙轉成 hash id additional_attributes: [ { roles: [ 'cs_portal_admin', 'cs_portal_gds_cs_tech', 'cs_portal_gds_ggr_admin', ], attributes: { mechanic_authorized_by: [], }, }, { roles: ['cs_portal_gds_ggr_manager', 'cs_portal_gds_ggr_member'], attributes: { mechanic_authorized_by: [], }, }, { roles: [ 'cs_portal_gds_ar_manager', 'cs_portal_gds_ar_member', 'cs_portal_gds_external_pdi', 'cs_portal_gds_cs_manager', 'cs_portal_gds_cs_member', 'cs_portal_gds_es_bp', ], attributes: { mechanic_authorized_by: [], }, }, { roles: [ 'cs_portal_gdk_manager', 'cs_portal_gdk_member', 'cs_portal_gdk_pdi', 'cs_portal_myf_member', 'cs_portal_myf_pdi', 'partner_dashboard_sales_admin', 'partner_dashboard_sales_assistant', ], attributes: { mechanic_authorized_by: ['CHANGEITSELF'], }, }, { roles: ['cs_portal_gds_ar_manager', 'cs_portal_gds_ar_member'], attributes: { league: [], }, }, { roles: ['cs_portal_myf_member'], attributes: { extra_function: ['gtu'], }, }, ], // 以下為建立 roles 的時候要額外寫進去 token 的值 // attributes 資料要跟各個 role 所屬的 solutions owner 要, 都是 company Id (hash 後) additional_attributes_v2: [ { roles: [ 'cs_portal_admin', 'cs_portal_gds_cs_tech', 'cs_portal_gds_ggr_admin', ], attributes: { mechanic_authorized_by: [], }, }, { roles: ['cs_portal_gds_ggr_manager', 'cs_portal_gds_ggr_member'], attributes: { mechanic_authorized_by: [], }, }, { roles: [ 'cs_portal_gds_ar_manager', 'cs_portal_gds_ar_member', 'cs_portal_gds_external_pdi', 'cs_portal_gds_cs_manager', 'cs_portal_gds_cs_member', 'cs_portal_gds_es_bp', ], attributes: { mechanic_authorized_by: [], }, }, { roles: [ 'cs_portal_gdk_manager', 'cs_portal_gdk_member', 'cs_portal_gdk_pdi', 'cs_portal_myf_member', 'cs_portal_myf_pdi', 'partner_dashboard_sales_admin', 'partner_dashboard_sales_assistant', ], attributes: { mechanic_authorized_by: ['CHANGEITSELF'], }, }, { roles: ['cs_portal_gds_ar_manager', 'cs_portal_gds_ar_member'], attributes: { league: [], }, }, { roles: ['cs_portal_myf_member'], attributes: { extra_function: ['gtu'], }, }, ], // 大部分情況全部都會共用 // 如果有更動的話, 才會從 dev->pa->prod 慢慢近版 // 不過最終一定會一樣 // For keycloak roles config // 決定 clients 之間主從關係的資料 master_clients: ['account_dashboard'], pair_clients: { partner_dashboard: ['partner_portal', 'partner_dashboard'], gnop: ['bpms', 'gnop'], }, allow_clients: { account_dashboard: [ 'account_dashboard', 'billing', 'customer', 'partner_portal', 'bpms', 'vmms', 'sales_portal', 'gnop', 'cs_portal', 'scooter_model_profile', 'partner_dashboard', 'firmware_release', 'battery_book', 'messaging_dashboard', 'gopartner_portal', 'prospect', ], billing: ['billing'], customer: ['customer'], partner_portal: ['partner_portal'], bpms: ['bpms'], vmms: ['vmms'], sales_portal: ['sales_portal'], gnop: ['bpms', 'gnop'], cs_portal: ['cs_portal'], scooter_model_profile: ['scooter_model_profile'], partner_dashboard: ['partner_portal', 'partner_dashboard'], firmware_release: ['firmware_release'], battery_book: ['battery_book'], gopartner_portal: ['gopartner_portal '], prospect: ['prospect'], }, // 各個 solutions 之間角色的上下階層關係 // 由 permission 決定 roles: { account_dashboard: { account_dashboard_super_admin: { display_name: 'account_dashboard_super_admin', role_name: 'account_dashboard_super_admin', description: 'Super_admin in account_dashboard', permission: 9, }, account_dashboard_group_admin: { display_name: 'account_dashboard_group_admin', role_name: 'account_dashboard_group_admin', description: 'Group_admin in account_dashboard', permission: 8, }, account_dashboard_admin: { display_name: 'account_dashboard_admin', role_name: 'account_dashboard_admin', description: 'Admin in account_dashboard', permission: 3, }, account_dashboard_manager: { display_name: 'account_dashboard_manager', role_name: 'account_dashboard_manager', description: 'Manager in account_dashboard', permission: 2, }, account_dashboard_user: { display_name: 'account_dashboard_user', role_name: 'account_dashboard_user', description: 'User in account_dashboard', permission: 1, }, }, billing: { billing_admin: { display_name: 'billing_admin', role_name: 'billing_admin', description: 'Admin in billing', permission: 3, }, billing_manager: { display_name: 'billing_manager', role_name: 'billing_manager', description: 'Manager in billing', permission: 2, }, billing_user: { display_name: 'billing_user', role_name: 'billing_user', description: 'User in billing', permission: 1, }, }, customer: { customer_admin: { display_name: 'customer_admin', role_name: 'customer_admin', description: 'Admin in customer_dashboard', permission: 3, }, customer_manager: { display_name: 'customer_manager', role_name: 'customer_manager', description: 'Manager in customer_dashboard', permission: 2, }, customer_user: { display_name: 'customer_user', role_name: 'customer_user', description: 'User in customer_dashboard', permission: 1, }, }, partner_portal: { partner_portal_procurement_admin: { display_name: 'partner_portal_procurement_admin', role_name: 'partner_portal_procurement_admin', description: 'Procurement manager in Partner portal system', permission: 2, }, partner_portal_admin: { display_name: 'partner_portal_admin', role_name: 'partner_portal_admin', description: 'Admin in Partner portal system', permission: 3, }, }, bpms: { bpms_admin: { display_name: 'bpms_admin', role_name: 'bpms_admin', description: 'Admin in bpms', permission: 3, }, bpms_manager: { display_name: 'bpms_manager', role_name: 'bpms_manager', description: 'Manager in bpms', permission: 2, }, bpms_user: { display_name: 'bpms_user', role_name: 'bpms_user', description: 'User in bpms', permission: 1, }, bpms_outside_user: { display_name: 'bpms_outside_user', role_name: 'bpms_outside_user', description: 'FAE in bpms', permission: 1, }, }, vmms: { vmms_admin: { display_name: 'vmms_admin', role_name: 'vmms_admin', description: 'Admin in vmms', permission: 3, }, vmms_manager: { display_name: 'vmms_manager', role_name: 'vmms_manager', description: 'Manager in vmms', permission: 2, }, vmms_user: { display_name: 'vmms_user', role_name: 'vmms_user', description: 'User in vmms', permission: 1, }, }, sales_portal: { sales_portal_system_admin: { display_name: 'sales_portal_system_admin', role_name: 'sales_portal_system_admin', description: 'Admin in sales_portal', permission: 3, }, sales_portal_store_manager: { display_name: 'sales_portal_store_manager', role_name: 'sales_portal_store_manager', description: 'Store manager in sales_portal', permission: 2, }, sales_portal_store_sales: { display_name: 'sales_portal_store_sales', role_name: 'sales_portal_store_sales', description: 'Store sales in sales_portal', permission: 1, }, sales_portal_store_deliverer: { display_name: 'sales_portal_store_deliverer', role_name: 'sales_portal_store_deliverer', description: 'Scooter deliverer in sales_portal', permission: 1, }, sales_portal_exhibition_sales: { display_name: 'sales_portal_exhibition_sales', role_name: 'sales_portal_exhibition_sales', description: 'Exhibition sales in sales_portal', permission: 1, }, cs_portal_store_manager: { display_name: 'cs_portal_store_manager', role_name: 'cs_portal_store_manager', description: 'Cs manager in sales_portal', permission: 2, }, cs_portal_store_sales: { display_name: 'cs_portal_store_sales', role_name: 'cs_portal_store_sales', description: 'Cs sales in sales_portal', permission: 1, }, sales_portal_group_admin: { display_name: 'sales_portal_group_admin', role_name: 'sales_portal_group_admin', description: 'Group admin in sales_portal', permission: 4, }, sales_portal_store_assistant: { display_name: 'sales_portal_store_assistant', role_name: 'sales_portal_store_assistant', description: 'Store assistant in sales_portal', permission: 1, }, sales_portal_store_part_time: { display_name: 'sales_portal_store_part_time', role_name: 'sales_portal_store_part_time', description: 'Store part time in sales_portal', permission: 1, }, }, gnop: { gnop_operation_admin: { display_name: 'gnop_operation_admin', role_name: 'gnop_operation_admin', description: 'Operation_admin in gnop', permission: 3, }, gnop_om_technical_manager: { display_name: 'gnop_om_technical_manager', role_name: 'gnop_om_technical_manager', description: 'Om_technical_manager in gnop', permission: 2, }, gnop_asset_manager: { display_name: 'gnop_asset_manager', role_name: 'gnop_asset_manager', description: 'Asset_manager in gnop', permission: 1, }, gnop_enop_user: { display_name: 'gnop_enop_user', role_name: 'gnop_enop_user', description: 'ENOP user in gnop', permission: 1, }, gnop_network_monitor: { display_name: 'gnop_network_monitor', role_name: 'gnop_network_monitor', description: 'Network_monitor in gnop', permission: 1, }, gnop_network_fae: { display_name: 'gnop_network_fae', role_name: 'gnop_network_fae', description: 'Network_fae in gnop', permission: 1, }, gnop_ticket_viewer: { display_name: 'gnop_ticket_viewer', role_name: 'gnop_ticket_viewer', description: 'Ticket_viewer in gnop', permission: 1, }, gnop_fae_outsource: { display_name: 'gnop_fae_outsource', role_name: 'gnop_fae_outsource', description: 'FAE outsource in gnop', permission: 1, }, gnop_go_station_developer: { display_name: 'gnop_go_station_developer', role_name: 'gnop_go_station_developer', description: 'Go Station developer in gnop', permission: 1, }, gnop_gn_siteselect_operate: { display_name: 'gnop_gn_siteselect_operate', role_name: 'gnop_gn_siteselect_operate', description: 'Gn_siteselect_operate in gnop', permission: 2, }, gnop_network_fae_manager: { display_name: 'gnop_network_fae_manager', role_name: 'gnop_network_fae_manager', description: 'Network_fae_manager in gnop', permission: 1, }, gnop_local_admin: { display_name: 'gnop_local_admin', role_name: 'gnop_local_admin', description: 'local_admin in gnop', permission: 2, }, }, cs_portal: { cs_portal_admin: { display_name: 'cs_portal_admin', role_name: 'cs_portal_admin', description: 'cs_portal_admin in cs_portal', permission: 4, }, cs_portal_gds_ggr_admin: { display_name: 'cs_portal_gds_ggr_admin', role_name: 'cs_portal_gds_ggr_admin', description: 'gds_ggr_admin in cs_portal', permission: 3, }, cs_portal_gds_ggr_manager: { display_name: 'cs_portal_gds_ggr_manager', role_name: 'cs_portal_gds_ggr_manager', description: 'gds_ggr_manager in cs_portal', permission: 2, }, cs_portal_gds_ggr_member: { display_name: 'cs_portal_gds_ggr_member', role_name: 'cs_portal_gds_ggr_member', description: 'gds_ggr_member in cs_portal', permission: 1, }, cs_portal_gds_ggr_mf: { display_name: 'cs_portal_gds_ggr_mf', role_name: 'cs_portal_gds_ggr_mf', description: 'gds_ggr_mf in cs_portal', permission: 1, }, cs_portal_gds_cs_manager: { display_name: 'cs_portal_gds_cs_manager', role_name: 'cs_portal_gds_cs_manager', description: 'gds_cs_manager in cs_portal', permission: 2, }, cs_portal_gds_cs_member: { display_name: 'cs_portal_gds_cs_member', role_name: 'cs_portal_gds_cs_member', description: 'gds_cs_member in cs_portal', permission: 1, }, cs_portal_gds_cs_tech: { display_name: 'cs_portal_gds_cs_tech', role_name: 'cs_portal_gds_cs_tech', description: 'gds_cs_tech in cs_portal', permission: 1, }, cs_portal_gds_external_pdi: { display_name: 'cs_portal_gds_external_pdi', role_name: 'cs_portal_gds_external_pdi', description: 'gds_external_pdi in cs_portal', permission: 1, }, cs_portal_gds_es_bp: { display_name: 'cs_portal_gds_es_bp', role_name: 'cs_portal_gds_es_bp', description: 'gds_es_bp in cs_portal', permission: 1, }, cs_portal_gds_ar_manager: { display_name: 'cs_portal_gds_ar_manager', role_name: 'cs_portal_gds_ar_manager', description: 'gds_ar_manager in cs_portal', permission: 2, }, cs_portal_gds_ar_member: { display_name: 'cs_portal_gds_ar_member', role_name: 'cs_portal_gds_ar_member', description: 'gds_ar_member in cs_portal', permission: 1, }, cs_portal_gdk_admin: { display_name: 'cs_portal_gdk_admin', role_name: 'cs_portal_gdk_admin', description: 'gdk_admin in cs_portal', permission: 3, }, cs_portal_gdk_manager: { display_name: 'cs_portal_gdk_manager', role_name: 'cs_portal_gdk_manager', description: 'gdk_manager in cs_portal', permission: 2, }, cs_portal_gdk_member: { display_name: 'cs_portal_gdk_member', role_name: 'cs_portal_gdk_member', description: 'gdk_member in cs_portal', permission: 1, }, cs_portal_gdk_pdi: { display_name: 'cs_portal_gdk_pdi', role_name: 'cs_portal_gdk_pdi', description: 'gdk_pdi in cs_portal', permission: 1, }, cs_portal_gdk_mf: { display_name: 'cs_portal_gdk_mf', role_name: 'cs_portal_gdk_mf', description: 'gdk_mf in cs_portal', permission: 1, }, cs_portal_gdk_tech: { display_name: 'cs_portal_gdk_tech', role_name: 'cs_portal_gdk_tech', description: 'gdk_tech in cs_portal', permission: 1, }, cs_portal_myf_member: { display_name: 'cs_portal_myf_member', role_name: 'cs_portal_myf_member', description: 'myf_member in cs_portal', permission: 1, }, cs_portal_myf_pdi: { display_name: 'cs_portal_myf_pdi', role_name: 'cs_portal_myf_pdi', description: 'myf_pdi in cs_portal', permission: 1, }, }, scooter_model_profile: { scooter_model_profile_manager: { display_name: 'scooter_model_profile_manager', role_name: 'scooter_model_profile_manager', description: 'Manager in scooter_model_profile', permission: 2, }, scooter_model_profile_user: { display_name: 'scooter_model_profile_user', role_name: 'scooter_model_profile_user', description: 'User in scooter_model_profile', permission: 1, }, }, partner_dashboard: { partner_dashboard_sales_admin: { display_name: 'partner_dashboard_sales_admin', role_name: 'partner_dashboard_sales_admin', description: 'Sales admin in Partner dashboard', permission: 5, }, partner_dashboard_sales_assistant: { display_name: 'partner_dashboard_sales_assistant', role_name: 'partner_dashboard_sales_assistant', description: 'Sales assistant in Partner dashboard', permission: 4, }, }, firmware_release: { firmware_release_user: { display_name: 'firmware_release_user', role_name: 'firmware_release_user', description: 'User in Firmware release system', permission: 1, }, firmware_release_manager: { display_name: 'firmware_release_manager', role_name: 'firmware_release_manager', description: 'Manager in Firmware release system', permission: 2, }, }, battery_book: { battery_book_system_admin: { display_name: 'battery_book_system_admin', role_name: 'battery_book_system_admin', description: 'System admin in battery book system', permission: 4, }, }, messaging_dashboard: { messaging_dashboard_system_admin: { display_name: 'messaging_dashboard_system_admin', role_name: 'messaging_dashboard_system_admin', description: 'System admin in messaging dashboard', permission: 4, }, messaging_dashboard_user: { display_name: 'messaging_dashboard_user', role_name: 'messaging_dashboard_user', description: 'User in messaging dashboard', permission: 1, }, }, gopartner_portal: { gopartner_portal_system_admin: { display_name: 'gopartner_portal_system_admin', role_name: 'gopartner_portal_system_admin', description: 'System admin in franchise portal', permission: 4, }, gopartner_portal_hq_admin: { display_name: 'gopartner_portal_hq_admin', role_name: 'gopartner_portal_hq_admin', description: 'Headquarter admin in franchise portal', permission: 3, }, gopartner_portal_rs_division_manager: { display_name: 'gopartner_portal_rs_division_manager', role_name: 'gopartner_portal_rs_division_manager', description: 'RS division manager in franchise portal', permission: 2, }, gopartner_portal_hq_bp: { display_name: 'gopartner_portal_hq_bp', role_name: 'gopartner_portal_hq_bp', description: 'HQ BP in franchise portal', permission: 3, }, gopartner_portal_hq_oe: { display_name: 'gopartner_portal_hq_oe', role_name: 'gopartner_portal_hq_oe', description: 'HQ OE in franchise portal', permission: 3, }, gopartner_portal_hq_bos: { display_name: 'gopartner_portal_hq_bos', role_name: 'gopartner_portal_hq_bos', description: 'HQ BOS in franchise portal', permission: 3, }, gopartner_portal_hq_user: { display_name: 'gopartner_portal_hq_user', role_name: 'gopartner_portal_hq_user', description: 'HQ user in franchise portal', permission: 3, }, gopartner_portal_cs_division_manager: { display_name: 'gopartner_portal_cs_division_manager', role_name: 'gopartner_portal_cs_division_manager', description: 'CS division manager in franchise portal', permission: 2, }, gopartner_portal_franchise_admin: { display_name: 'gopartner_portal_franchise_admin', role_name: 'gopartner_portal_franchise_admin', description: 'Admin in franchise portal', permission: 3, }, gopartner_portal_franchise_fin: { display_name: 'gopartner_portal_franchise_fin', role_name: 'gopartner_portal_franchise_fin', description: 'Finance in franchise portal', permission: 3, }, }, prospect: { prospect_admin: { display_name: 'prospect_admin', role_name: 'prospect_admin', description: 'Admin in prospect_admin', permission: 3, }, prospect_exhibition_sales: { display_name: 'prospect_exhibition_sales', role_name: 'prospect_exhibition_sales', description: 'Exhibition sales in prospect', permission: 1, }, prospect_manager: { display_name: 'prospect_manager', role_name: 'prospect_manager', description: 'Manager in prospect', permission: 2, }, prospect_user: { display_name: 'prospect_user', role_name: 'prospect_user', description: 'User in prospect', permission: 1, }, }, }, // 控制 一個 solution 只能有一個角色的資料 // 目前只會使用在 account service mutex_role_groups: { account_dashboard: [ [ 'account_dashboard_super_admin', 'account_dashboard_group_admin', 'account_dashboard_admin', 'account_dashboard_manager', 'account_dashboard_user', ], ], billing: [['billing_admin', 'billing_manager', 'billing_user']], customer: [['customer_admin', 'customer_manager', 'customer_user']], partner_portal: [ ['partner_portal_procurement_admin', 'partner_portal_admin'], ], bpms: [['bpms_admin', 'bpms_manager', 'bpms_user', 'bpms_outside_user']], vmms: [['vmms_admin', 'vmms_manager', 'vmms_user']], sales_portal: [ [ 'sales_portal_group_admin', 'sales_portal_system_admin', 'sales_portal_store_manager', 'sales_portal_store_sales', 'sales_portal_store_deliverer', 'sales_portal_exhibition_sales', 'cs_portal_store_manager', 'cs_portal_store_sales', 'sales_portal_store_assistant', 'sales_portal_store_part_time', ], ], gnop: [ [ 'gnop_operation_admin', 'gnop_om_technical_manager', 'gnop_asset_manager', 'gnop_enop_user', 'gnop_network_monitor', 'gnop_network_fae', 'gnop_ticket_viewer', 'gnop_fae_outsource', 'gnop_go_station_developer', 'gnop_gn_siteselect_operate', 'gnop_network_fae_manager', 'gnop_local_admin', ], ], cs_portal: [ [ 'cs_portal_admin', 'cs_portal_gds_ggr_admin', 'cs_portal_gds_ggr_manager', 'cs_portal_gds_ggr_member', 'cs_portal_gds_ggr_mf', 'cs_portal_gds_cs_manager', 'cs_portal_gds_cs_member', 'cs_portal_gds_cs_tech', 'cs_portal_gds_external_pdi', 'cs_portal_gds_es_bp', 'cs_portal_gds_ar_manager', 'cs_portal_gds_ar_member', 'cs_portal_gdk_admin', 'cs_portal_gdk_manager', 'cs_portal_gdk_member', 'cs_portal_gdk_pdi', 'cs_portal_gdk_mf', 'cs_portal_gdk_tech', 'cs_portal_myf_member', 'cs_portal_myf_pdi', ], ], scooter_model_profile: [ ['scooter_model_profile_manager', 'scooter_model_profile_user'], ], partner_dashboard: [ ['partner_dashboard_sales_assistant', 'partner_dashboard_sales_admin'], ], firmware_release: [['firmware_release_user', 'firmware_release_manager']], battery_book: [['battery_book_system_admin']], messaging_dashboard: [ ['messaging_dashboard_system_admin', 'messaging_dashboard_user'], ], gopartner_portal: [ [ 'gopartner_portal_system_admin', 'gopartner_portal_hq_admin', 'gopartner_portal_rs_division_manager', 'gopartner_portal_hq_bp', 'gopartner_portal_hq_oe', 'gopartner_portal_hq_bos', 'gopartner_portal_hq_user', 'gopartner_portal_cs_division_manager', 'gopartner_portal_franchise_admin', 'gopartner_portal_franchise_fin', ], ], prospect: [ [ 'prospect_admin', 'prospect_exhibition_sales', 'prospect_manager', 'prospect_user', ], ], } } ```