# πŸ§™β€β™‚οΈ Π§ΠΈΠ½ΠΈΠ»Ρ‹Ρ‡ – интСграция с GLPI API Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π²Π΅Π±-интСрфСйс для создания ΠΈ отслСТивания заявок, ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с GLPI (вСрсия 11+), с собствСнной Π±Π°Π·ΠΎΠΉ Π·Π½Π°Π½ΠΈΠΉ, Ρ‚Ρ‘ΠΌΠ½ΠΎΠΉ Ρ‚Π΅ΠΌΠΎΠΉ ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΠ²Π½Ρ‹ΠΌ Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ. ## πŸ“Œ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности - **Авторизация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ** (Ρ€ΠΎΠ»ΠΈ: user, admin) - **Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ заявок**: - ИВ-заявка (с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ оборудования, ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ, автоматичСской подстановкой Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ) - Анонимная ΠΆΠ°Π»ΠΎΠ±Π° - **ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ своих заявок** с синхронизациСй статусов ΠΈΠ· GLPI - **Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ просмотр заявки** с коммСнтариями (ITILFollowup) - **Π‘Π°Π·Π° Π·Π½Π°Π½ΠΈΠΉ** (синхронизация статСй ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ· GLPI) - ΠŸΠΎΠ»Π½ΠΎΡ‚Π΅ΠΊΡΡ‚ΠΎΠ²Ρ‹ΠΉ поиск (FULLTEXT) - ЛСнивая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (скачиваниС ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ) - Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ Π΄Π°Ρ‚Π΅/названию - **Вёмная Ρ‚Π΅ΠΌΠ°** (сохраняСтся Π² localStorage) - **Адаптивный интСрфСйс** (ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ устройства) - **ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° прикрСплСния Ρ„Π°ΠΉΠ»ΠΎΠ²** (изобраТСния, PDF) ## πŸ›  Π’Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ - PHP 8.3+ - MySQL 8.0+ - GLPI API (REST) - HTML5 / CSS3 (CSS-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅) - JavaScript (Fetch API, динамичСскиС Ρ„ΠΎΡ€ΠΌΡ‹) ## πŸ“ Установка ΠΈ настройка ### 1. ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСпозитория ```bash git clone https://your-repo/service-desk.git cd service-desk ``` ### 2. Настройка Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ структуру: ```sql -- Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ SQL ΠΈΠ· Ρ„Π°ΠΉΠ»Π° my_database.sql -- Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ для Π·Π½Π°Π½ΠΈΠΉ ALTER TABLE knowledge_base ADD COLUMN glpi_updated_at DATETIME DEFAULT NULL; ALTER TABLE knowledge_base ADD FULLTEXT INDEX ft_title_content (title, content); -- Колонка для Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ… (исправлСниС ошибки) ALTER TABLE forms ADD COLUMN location_id INT DEFAULT NULL; ``` ### 3. Настройка ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠžΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ `config.php`: ```php // Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… define('DB_HOST', '-'); define('DB_NAME', 'my_database'); define('DB_USER', 'root'); define('DB_PASS', 'your_password'); // GLPI API define('GLPI_API_URL', '-'); define('GLPI_APP_TOKEN', 'your_app_token'); define('GLPI_USERNAME', 'api_user'); define('GLPI_PASSWORD', 'api_password'); // Папки для Ρ„Π°ΠΉΠ»ΠΎΠ² define('UPLOAD_DIR', __DIR__ . '/uploads/'); define('KB_CACHE_DIR', __DIR__ . '/uploads/kb/'); ``` Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΏΠΊΠΈ `uploads/` ΠΈ `uploads/kb/` созданы ΠΈ доступны для записи: ```bash mkdir -p uploads uploads/kb chmod 755 uploads uploads/kb ``` ### 4. Настройка Π²Π΅Π±-сСрвСра (Nginx/Apache) ΠŸΡ€ΠΈΠΌΠ΅Ρ€ для Nginx (корнСвая дирСктория `/var/www/html`): ```nginx server { listen 80; server_name service-desk.local; root /var/www/html; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~* \.(jpg|jpeg|png|gif|css|js|pdf)$ { expires 30d; } } ``` ### 5. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π² Π‘Π” администратора (ΠΏΠ°Ρ€ΠΎΠ»ΡŒ Ρ…Π΅ΡˆΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· `password_hash`): ```sql INSERT INTO users (username, password, email, role, last_name, first_name) VALUES ('admin', '$2y$10$...hash...', 'admin@example.com', 'superadmin', 'Admin', 'Администратор'); ``` Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ…Π΅ΡˆΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ скрипт: ```php ``` ## πŸš€ ИспользованиС ### ПанСль ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ - **Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ заявки**: Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏ, Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ поля, ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ». - **Бписок заявок**: ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ всС заявки Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ статусом. - **ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ**: ΠΊΠ½ΠΎΠΏΠΊΠ° Β«ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅Β» ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ модальноС ΠΎΠΊΠ½ΠΎ с ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΈ коммСнтариями. ### Π‘Π°Π·Π° Π·Π½Π°Π½ΠΈΠΉ - **Поиск статСй** (полнотСкстовый) - **Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°** (ΠΏΠΎ Π΄Π°Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΏΠΎ названию) - **ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΡΡ‚Π°Ρ‚ΡŒΠΈ** (с сохранённым HTML-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ) - **Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²** (ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² GLPI) ### Для администратора - Кнопка **Β«ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±Π°Π·ΡƒΒ»** Π½Π° страницС Π·Π½Π°Π½ΠΈΠΉ – выполняСт ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ статСй ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ· GLPI. - МоТно Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ cron для автоматичСской синхронизации: ```bash */30 * * * * php /var/www/html/admin_sync_kb.php ``` ## πŸ”„ Бинхронизация с GLPI - **Заявки**: статусы ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ· GLPI ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ просмотрС списка. - **Π‘Π°Π·Π° Π·Π½Π°Π½ΠΈΠΉ**: ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ (ΠΏΠΎ полю `date_mod`). Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΡΠΊΠ°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π»Π΅Π½ΠΈΠ²ΠΎ – ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запросС ΠΊ Ρ„Π°ΠΉΠ»Ρƒ. - Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρƒ API-ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ GLPI Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π°Π²Π° Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ `KnowbaseItem`, `Document`, `Ticket`, `ITILFollowup`. ## 🎨 Вёмная Ρ‚Π΅ΠΌΠ° ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ Π² шапкС сайта. Π’Ρ‹Π±ΠΎΡ€ сохраняСтся Π² `localStorage` ΠΈ автоматичСски примСняСтся ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²ΠΈΠ·ΠΈΡ‚Π΅. ## πŸ“± ΠΠ΄Π°ΠΏΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ отобраТаСтся Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… устройствах (ΡˆΠΈΡ€ΠΈΠ½Π° экрана < 640px): мСню сгибаСтся, Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΡƒ, ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΊΠ½Π° ΡΡƒΠΆΠ°ΡŽΡ‚ΡΡ. ## 🧩 Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ``` β”œβ”€β”€ config.php # Настройки Π‘Π”, GLPI, константы β”œβ”€β”€ functions.php # ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (аутСнтификация, Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ, Π·Π½Π°Π½ΠΈΠ΅) β”œβ”€β”€ glpi_api.php # Класс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с GLPI REST API β”œβ”€β”€ index.php # Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° Π²Ρ…ΠΎΠ΄Π° β”œβ”€β”€ dashboard.php # Главная панСль (заявки) β”œβ”€β”€ knowledge.php # Π‘Π°Π·Π° Π·Π½Π°Π½ΠΈΠΉ β”œβ”€β”€ search_knowledge.php # AJAX-поиск ΠΏΠΎ Π±Π°Π·Π΅ Π·Π½Π°Π½ΠΈΠΉ β”œβ”€β”€ get_article.php # AJAX-ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ β”œβ”€β”€ get_document.php # ЛСнивая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° β”œβ”€β”€ get_ticket_details.php # Π”Π΅Ρ‚Π°Π»ΠΈ заявки (AJAX) β”œβ”€β”€ get_glpi_data.php # Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹, ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ) β”œβ”€β”€ get_computer_location.php # ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΏΠΎ ID β”œβ”€β”€ logout.php # Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ сСссии β”œβ”€β”€ style.css # Π‘Ρ‚ΠΈΠ»ΠΈ (свСтлая/тёмная Ρ‚Π΅ΠΌΡ‹) β”œβ”€β”€ admin_sync_kb.php # Π‘ΠΊΡ€ΠΈΠΏΡ‚ для cron-синхронизации Π·Π½Π°Π½ΠΈΠΉ β”œβ”€β”€ uploads/ # Папка для Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ └── uploads/kb/ # КСш Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ· GLPI ``` ## ⚠️ Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ | ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° | РСшСниС | |----------|---------| | `Fatal error: Column not found 'glpi_updated_at'` | Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ `ALTER TABLE knowledge_base ADD COLUMN glpi_updated_at DATETIME` | | `Data truncated for column 'status'` | Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° Π² `functions.php` – ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ статусов GLPI Π² допустимыС значСния `pending/processing/completed/rejected` | | Π€Π°ΠΉΠ»Ρ‹ Π² Π±Π°Π·Π΅ Π·Π½Π°Π½ΠΈΠΉ Π½Π΅ ΡΠΊΠ°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ | ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²Π° Π½Π° ΠΏΠ°ΠΏΠΊΡƒ `uploads/kb/` (755) ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρƒ API-ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ доступа ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ GLPI | | НС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ автоподстановка Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ | Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π² GLPI Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΏΠΎΠ»Π΅ `locations_id` | | Бинхронизация долгая | УстановитС cron ΠΈ ΡƒΠ±Π΅Ρ€ΠΈΡ‚Π΅ автоматичСский Π²Ρ‹Π·ΠΎΠ² `syncKnowledgeBaseIncremental` ΠΈΠ· `knowledge.php` (сСйчас синхронизация Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅) |