Mise à jour : 2026-05-29 (v0.7 — exclusions durables champ/poste, refonte onglet Ignorés ; v0.6 — matching utilisateur intelligent, auto-résolution entité/adresse, fallback Office)
| OCS Isi-Inventaire | OCS Inventory — Custom | |
|---|---|---|
| Code | ocs_isi_inventaire |
ocs_custom |
| Type connexion | Database (MySQL direct) | Database (MySQL direct) |
| Managé | Oui — config et mapping read-only | Non — tout configurable |
| Abonnement requis | it-ocs |
it-ocs |
| Disponible | Oui | Non (badge "Bientôt disponible") |
| Cas d'usage | Client abonné ISI, serveur OCS mutualisé ISI | Client avec son propre serveur OCS OnPremise |
| Installation | 1-clic, auto-provisioning, actif immédiatement | Manuelle (credentials + mapping + flux) |
ocs_custométait initialement nomméocs_inventory. Renommé par migration2026_04_03_000002pour refléter son usage OnPremise configurable. Les instances existantes (FK surstore_connector_id) ne sont pas affectées.
ocs_isi_inventaire) — Connecteur managéPOST /store/connecteur/ocs_isi_inventaire/install
└── StoreController::install()
├── isInstallableBy($_id) → vérifie abonnement it-ocs
└── installManaged()
├── StoreInstance::create([..., is_active: true, auth_params: $connector->default_auth_params])
└── provisionManagedFlows()
├── MappingConfigService::initializeHardwareFluxPair() → flows: hardware + hardware_vm
└── MappingConfigService::initializeFluxFromDefaults() → flow: software
L'instance est créée active immédiatement (is_active = true).
Les credentials du serveur OCS mutualisé ISI sont stockés dans StoreConnector.default_auth_params (chiffrés via Crypt::encryptString). Ils sont initialisés à la création du connecteur depuis config('database.connections.ocs.*').
À l'installation, ils sont copiés sans décryptage dans StoreInstance.auth_params — aucune exposition en mémoire ou logs.
Déchiffrement à l'usage : StoreInstance::getDecryptedParams() → ['db_host', 'db_port', 'db_database', 'db_username', 'db_password'].
Définis dans StoreConnector.default_flow_config :
{
"flows": [
{"code": "hardware"},
{"code": "software", "sort_order": 3}
]
}
hardware déclenche initializeHardwareFluxPair() qui crée deux flows (sort_order 1 et 2) :
hardware — matériels physiques → dsi_hwhardware_vm — machines virtuelles → dsi_hwvmsoftware crée le flow logiciels (sort_order 3).
Les StoreMappingField sont lus depuis les fichiers JSON de configuration : config/store/mappings/ocs_isi_inventaire/{hardware,hardware_vm,software}.json.
| Action | Autorisé |
|---|---|
| Tester la connexion (InstancePing) | Oui |
| Lancer une extraction | Oui |
| Consulter les logs | Oui |
| Consulter le mapping (lecture) | Oui |
| Consulter le staging et appliquer les changements | Oui |
| Modifier la config (host, credentials) | Non |
| Modifier le mapping | Non |
| Supprimer l'instance | Non |
| Réinitialiser le mapping | Non |
<fieldset disabled> sur le formulaire de config, MappingEditor en mode lecture, bouton Supprimer masqué, bouton Réinitialiser masquéInstanceController::update(), ::destroy(), MappingController::reset(), MappingEditor::save() retournent une erreur si $instance->connector->is_managedocs_custom) — Connecteur configurableNon disponible à l'installation (
is_available = false). Les instances existantes (migrées depuisocs_inventory) continuent de fonctionner normalement.
Ce connecteur est destiné aux clients possédant leur propre serveur OCS Inventory OnPremise. La configuration complète est à la charge du client :
MappingEditor| Service | Rôle |
|---|---|
OcsConnectionService |
Crée une connexion MySQL dynamique nommée store_ocs_{instanceId} à partir des auth_params déchiffrés |
OcsSyncService |
Extraction des données OCS, enrichissement (détection VM, normalisation CPU/OS), transformation via les StoreMappingField, écriture dans store_staging |
OcsCompareService |
Compare le staging contre dsi_hw + dsi_hwvm, détermine tpaction = create / update / delete / unchanged |
OcsIntegrationService |
Applique les changements sur dsi_hw (physiques) ou dsi_hwvm (VMs), enregistre dans store_correspondence_ids et store_logs |
OcsExtractJob — dispatché sur la queue store, timeout 10 minutes. Déclenché via POST /store/instances/{id}/extract.
Lues depuis la base OCS distante : hardware, bios, softwares, drives, storages, memories, monitors, networks, videos, sounds, printers, slots.
Par numéro de série BIOS (BIOS_SSN). Un doublon (même serial + même tenant) est ignoré — comptabilisé dans duplicates_ignored affiché dans ExtractStatus.
OcsSyncService détecte les VMs via la valeur STYPE du champ hardware. Les VMs sont routées vers dsi_hwvm, les physiques vers dsi_hw.
Le pipeline V3 rapproche automatiquement le champ USERID OCS (login Windows) avec un utilisateur ISI-APP du tenant.
Sur la card staging, l'opérateur voit l'un des 4 cas suivants pour le champ "Utilisateur" :
| Cas | Affichage | Action |
|---|---|---|
| Proposition unique | Ancien → Nouveau (avec badge bleu manuel si choix manuel) |
Bouton croix rouge pour refuser ; popover (i) info déplacement vers les utilisateurs additionnels si applicable |
| Plusieurs candidats | Liste déroulante avec les candidats + option "— Faire le choix plus tard —" | Sélection libre ou report de décision |
| Aucun candidat | Sélecteur Tom Select cherche-friendly sur tous les users du tenant | Choix manuel libre |
| Refusé (transitoire) | "Proposition refusée" puis bascule auto en sélecteur manuel pour permettre un nouveau choix | — |
Sémantique de la croix rouge "refuser" :
store_user_match_rejections (le matcher ne reproposera plus ce candidat pour ce PC à la prochaine sync) ET bascule vers le sélecteur Tom Select pour choisir immédiatement un autre user.Déplacement vers les utilisateurs additionnels : à l'apply d'une modification, si le PC avait déjà un utilisateur principal différent du nouveau, l'ancien est déplacé dans la table de pivot dsi_hw_users (avec dtvalid = aujourd'hui). Le nouveau devient principal. Compatible avec le modèle multi-users existant.
Exclusion des comptes système : administrator, admin, system, guest (insensible à la casse, trim appliqué) sont automatiquement écartés du matching.
Limites : le matching reproduit fidèlement la logique V2 (OcsHelper::prepareUserFromOcs). Cas non gérés (hérités V2) :
johndoe) ou tout en majuscules (JOHNDOE) → pas de split prénom/nomJeanPierreDupont) → pas de splitjohn.doe, john_doe) → pas de splitDans ces cas, l'opérateur passe par le sélecteur manuel.
À chaque sync, OcsCompareService::injectIpDetection() rapproche l'adresse IP de chaque PC du plan d'adressage IP (dsi_planip) du tenant. Si une plage unique correspond, l'entité (idc) et l'adresse (idaddr) sont auto-affectées sur la card. Si plusieurs plages se recouvrent, l'opérateur choisit dans un dropdown.
Préservation DHCP historique : si un PC a déjà dsi_hw.idip = 'DHCP' en BDD (issu d'une décision V2 ou d'un toggle manuel précédent), V3 affiche "DHCP" sur la card et ne réécrit jamais l'IP. Le toggle DHCP ↔ IP classique reste accessible sur la card.
V3 cherche Office d'abord dans officepack, puis en fallback dans la table software via les GUID (O365*, O15*, O16*, Office*). Aligné sur le comportement V2.
Préservation Office BDD : si la sync courante ne retrouve aucune trace d'Office mais que la BDD contient déjà une valeur (dsi_hw.tpof = O365 par exemple), V3 ne l'écrase pas. Pattern aligné sur l'exclusion existante pour TeamViewer (iddist).
OCS détecte parfois des changements qu'on ne veut jamais appliquer — par exemple un poste renommé manuellement (1083SYL-POR4770 → 5013AEJPOR4770) qu'OCS veut systématiquement remettre à son ancien nom, ou un poste transféré dans un établissement non supervisé par OCS qui remonte indéfiniment.
Deux niveaux d'exclusion durable sont disponibles dans l'onglet Modifications :
| Action | Où | Effet |
|---|---|---|
| Ignorer ce champ (icône œil barré sur une ligne de modification) | Sur chaque champ modifié | Ce champ précis (ex: le nom) ne sera plus jamais synchronisé pour ce poste. La valeur saisie manuellement est conservée. Les autres champs continuent de se synchroniser normalement. |
| Ne plus synchroniser ce poste (bouton en bas de la carte) | Sur tout le poste | Le poste disparaît complètement de la synchronisation OCS (aucune création, modification ou suppression proposée). Idéal pour les machines transférées/non supervisées. |
Contrairement à l'ancien "Ignorer" (qui réapparaissait au sync suivant), ces exclusions sont persistantes : elles sont consultées à chaque synchronisation, donc la remontée ne réapparaît plus jamais.
Onglet "Ignorés" : liste toutes les exclusions actives (postes et champs), avec qui les a posées. Chaque exclusion peut être levée via le bouton "Réactiver" — la synchronisation reprend alors au prochain inventaire.
config/store/mappings/
ocs_isi_inventaire/
_flux.json # Définition des flux disponibles
hardware.json # Mapping champs matériels physiques
hardware_vm.json # Mapping champs VMs
software.json # Mapping champs logiciels
ocs_custom/
_flux.json
hardware.json
hardware_vm.json
software.json
Ces fichiers définissent les champs source (colonnes OCS) et cible (colonnes ISI-APP) disponibles dans MappingEditor. Les deux connecteurs partagent le même schéma de mapping.
L'ancienne interface OCS (/ocs) continue de fonctionner en parallèle du Store :
Legacy (/ocs) |
Store (/ocs-v3) |
|
|---|---|---|
| Route | /ocs |
/ocs-v3 + /store/instances |
| Middleware | isLocalAdmin, hardEnsureHasModule:it-ocs |
auth, sub, pswd |
| Connexion DB | Globale (config/database.php → connexion ocs) |
Dynamique par instance |
| Logique sync | OcsHelper (1 573 lignes) |
Services séparés (4 services) |
| Interface | jQuery + DataTables | Livewire 4 + Onyx |
Ne pas toucher au système legacy. Il coexiste avec le Store et est utilisé par des clients non encore migrés.
store:migrate-ocs-clientsMigre les clients ayant OCS actif (via DsiParam.lkocs non null) vers une instance ocs_isi_inventaire managée.
php artisan store:migrate-ocs-clients # Dry-run
php artisan store:migrate-ocs-clients --execute # Applique
php artisan store:migrate-ocs-clients --execute --force # Sans confirmation
Logique :
DsiParam::whereNotNull('lkocs')->where('lkocs', '!=', '') pour lister les clients éligibleswithTrashed() pour détecter les soft-deleted)StoreInstance avec _id = $dsiParam->_id, auth_params = $connector->default_auth_params/ocs-v3)Le controller OcsV3Controller liste les instances liées aux connecteurs ocs_inventory, ocs_custom, et ocs_isi_inventaire pour le tenant courant. Il route vers la page de synchronisation dédiée /ocs-v3/{id}.
Accès réservé aux administrateurs : comme le Store, les écrans OCS v3 ne sont ouverts qu'aux profils administrateur général (100), équipe IT (110), directeur IT (150), comptes internes ISI et membres Isi-DSI. Lancer une extraction, supprimer des doublons OCS ou arbitrer le staging sont des actes d'administration : un utilisateur simple (900) ou en lecture seule (120 / 300) ne voit pas l'entrée de menu et reçoit une erreur 403 s'il ouvre l'URL directement.
docs/store/README.md — Architecture générale du Store.claude/technical-docs/store/ocs-v3.md — Architecture technique OCS v3 (staging, Livewire, services).claude/technical-docs/store/ocs-technique.md — Système OCS legacy (OcsHelper)