1
0
Files
breadcrumb-the-shire/modules/helpdesk/module.php
fs ef4473de64 feat(helpdesk): add Software Products page with BC contract type sync
Add a new Software-Produkte feature to the helpdesk module that syncs
contract types (Create_SaaS_License=true) from BC OData into a local
database table with a nightly scheduler job, providing a Grid.js list
page and detail/edit page for managing custom product names.

- DB migration 003: helpdesk_software_products table (code UNIQUE key)
- BcODataGateway: FS_Contract_Types entity with SaaS filter + fallback
- SoftwareProductRepository: upsert, listPaged, softDelete, updateName
- SoftwareProductSyncService: fetch → upsert → soft-delete lifecycle
- SoftwareProductSyncJobHandler: daily at 02:00 via scheduler platform
- SoftwareProductService: web UI business logic with validation
- Permission: helpdesk.software-products.manage (nav-gated)
- List page: Grid.js with Code, BC Description, Name, Status columns
- Detail page: Code/BC Description read-only, Name editable, PRG pattern
- i18n: de + en translation keys

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 22:16:21 +02:00

137 lines
6.0 KiB
PHP

<?php
/**
* Helpdesk module manifest.
*
* Internal employee lookup for BC debtors, contacts and tickets
* via OData V4. Read-only V1 with Basic Auth (OAuth2 optional).
*/
return [
'id' => 'helpdesk',
'version' => '1.0.0',
'enabled_by_default' => false,
'load_order' => 50,
'requires' => [],
'routes' => [
['path' => 'helpdesk/search-data', 'target' => 'helpdesk/search-data'],
['path' => 'helpdesk/domains', 'target' => 'helpdesk/domains'],
['path' => 'helpdesk/domains-data', 'target' => 'helpdesk/domains-data'],
['path' => 'helpdesk/debitor/{id}', 'target' => 'helpdesk/debitor'],
['path' => 'helpdesk/ticket/{id}', 'target' => 'helpdesk/ticket'],
['path' => 'helpdesk/settings', 'target' => 'helpdesk/settings'],
['path' => 'helpdesk/settings/test-connection-data', 'target' => 'helpdesk/settings/test-connection-data'],
['path' => 'helpdesk/settings/diagnose-data', 'target' => 'helpdesk/settings/diagnose-data'],
['path' => 'helpdesk/debitor-support-dashboard-data', 'target' => 'helpdesk/debitor-support-dashboard-data'],
['path' => 'helpdesk/debitor-overview-data', 'target' => 'helpdesk/debitor-overview-data'],
['path' => 'helpdesk/debitor-summary-data', 'target' => 'helpdesk/debitor-summary-data'],
['path' => 'helpdesk/debitor-contacts-data', 'target' => 'helpdesk/debitor-contacts-data'],
['path' => 'helpdesk/debitor-tickets-data', 'target' => 'helpdesk/debitor-tickets-data'],
['path' => 'helpdesk/debitor-ticket-categories-data', 'target' => 'helpdesk/debitor-ticket-categories-data'],
['path' => 'helpdesk/ticket-log-data', 'target' => 'helpdesk/ticket-log-data'],
['path' => 'helpdesk/ticket-communication-data', 'target' => 'helpdesk/ticket-communication-data'],
['path' => 'helpdesk/ticket-file-data', 'target' => 'helpdesk/ticket-file-data'],
['path' => 'helpdesk/debitor-communication-data', 'target' => 'helpdesk/debitor-communication-data'],
['path' => 'helpdesk/debitor-sales-dashboard-data', 'target' => 'helpdesk/debitor-sales-dashboard-data'],
['path' => 'helpdesk/debitor-meetings-data', 'target' => 'helpdesk/debitor-meetings-data'],
['path' => 'helpdesk/debitor-controlling-dashboard-data', 'target' => 'helpdesk/debitor-controlling-dashboard-data'],
['path' => 'helpdesk/team', 'target' => 'helpdesk/team'],
['path' => 'helpdesk/team-workload-data', 'target' => 'helpdesk/team-workload-data'],
['path' => 'helpdesk/risk-radar', 'target' => 'helpdesk/risk-radar'],
['path' => 'helpdesk/risk-radar-data', 'target' => 'helpdesk/risk-radar-data'],
['path' => 'helpdesk/software-products', 'target' => 'helpdesk/software-products'],
['path' => 'helpdesk/software-products-data', 'target' => 'helpdesk/software-products-data'],
['path' => 'helpdesk/software-products/edit/{code}', 'target' => 'helpdesk/software-products/edit'],
],
'public_paths' => [],
'container_registrars' => [
\MintyPHP\Module\Helpdesk\HelpdeskContainerRegistrar::class,
],
'ui_slots' => [
'aside.tab_panel' => [
[
'key' => 'helpdesk',
'label' => 'Helpdesk',
'icon' => 'bi-headset',
'icon_fill' => 'bi-headset',
'href' => '',
'permission' => 'helpdesk.access',
'panel_template' => 'templates/aside-helpdesk-panel.phtml',
'details_storage' => 'aside-helpdesk-sections-v1',
'details_open_active' => true,
'order' => 800,
],
],
],
'authorization_policies' => [
\MintyPHP\Module\Helpdesk\HelpdeskAuthorizationPolicy::class,
],
'permissions' => [
[
'key' => 'helpdesk.access',
'description' => 'Access helpdesk debtor search and detail views',
'active' => true,
'is_system' => true,
],
[
'key' => 'helpdesk.settings.manage',
'description' => 'Manage helpdesk BC connection settings',
'active' => true,
'is_system' => true,
],
[
'key' => 'helpdesk.team-workload.view',
'description' => 'View helpdesk team workload dashboard',
'active' => true,
'is_system' => true,
],
[
'key' => 'helpdesk.risk-radar.view',
'description' => 'View helpdesk risk radar dashboard',
'active' => true,
'is_system' => true,
],
[
'key' => 'helpdesk.software-products.manage',
'description' => 'Manage helpdesk software products (view and edit product names)',
'active' => true,
'is_system' => true,
],
],
'search_resources' => [],
'asset_groups' => [
'helpdesk' => [
'modules/helpdesk/css/helpdesk.css',
],
],
'scheduler_jobs' => [
[
'job_key' => 'helpdesk_software_product_sync',
'handler' => \MintyPHP\Module\Helpdesk\Handler\SoftwareProductSyncJobHandler::class,
'label' => 'Software product sync',
'description' => 'Syncs contract types with Create_SaaS_License from Business Central to local database',
'default_enabled' => 1,
'default_timezone' => 'Europe/Berlin',
'default_schedule_type' => 'daily',
'default_schedule_interval' => 1,
'default_schedule_time' => '02:00',
'default_schedule_weekdays_csv' => null,
'default_catchup_once' => 1,
'allowed_schedule_types' => ['daily', 'weekly'],
],
],
'layout_context_providers' => [
\MintyPHP\Module\Helpdesk\Providers\HelpdeskLayoutProvider::class,
],
'session_providers' => [],
'event_listeners' => [],
'deactivation_handler' => null,
'migrations_path' => 'migrations',
'i18n_path' => 'i18n',
];