Skip to content

Structure organisationnelle

Doggy fournit des capacités complètes de gestion de la structure organisationnelle d'entreprise, avec arborescence implémentée via Gedmo Nested Set, et prise en charge de plusieurs sociétés, départements et effectifs de postes.

Modèle d'entités

Les entités de la structure organisationnelle se trouvent dans src/Entity/Organization/ :

EntitéNom de tableDescription
CorporationGroupe/entreprise
CompanySociété
Departmentorg_departmentDépartement (Gedmo NestedTree)
PositionPoste
PositionLevelNiveau
EmployeeEmployé (également utilisateur système)

Gestion des départements

Les départements utilisent Gedmo NestedTree pour implémenter une arborescence à niveaux illimités (src/Entity/Organization/Department.php) :

php
#[ORM\Entity]
#[ORM\Table(name: 'org_department')]
#[Gedmo\Tree(type: 'nested')]
class Department implements GedmoNode
{
    use CommonTrait;

    #[ORM\Id]
    #[ORM\Column(type: 'uuid', unique: true)]
    #[ORM\GeneratedValue(strategy: 'CUSTOM')]
    #[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
    private $id;

    #[ORM\Column(length: 100)]
    private string $name;

    #[ORM\Column(length: 50, nullable: true)]
    private ?string $code = null;

    #[Gedmo\TreeLeft]
    #[ORM\Column(type: 'integer')]
    private int $lft;

    #[Gedmo\TreeLevel]
    #[ORM\Column(type: 'integer')]
    private int $lvl;

    #[Gedmo\TreeRight]
    #[ORM\Column(type: 'integer')]
    private int $rgt;

    #[Gedmo\TreeRoot]
    #[ORM\Column(type: 'integer', nullable: true)]
    private ?int $root = null;

    #[Gedmo\TreeParent]
    #[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'children')]
    private ?self $parent = null;

    #[ORM\OneToMany(targetEntity: self::class, mappedBy: 'parent')]
    private Collection $children;

    /** Many-to-Many with Employee for managers */
    #[ORM\ManyToMany(targetEntity: Employee::class)]
    private Collection $manager;
}

Attributs du département

ChampTypeDescription
namestringNom du département
codestringCode unique
parentself (NestedTree)Département parent
managerManyToMany(Employee)Responsable du département
companyManyToOne(Company)Société de rattachement
typestringType de département
statestringActif/désactivé
sortOrderintegerPoids de tri

Interface d'administration

Point d'entrée de l'administration : App\Controller\Admin\OrgController

  • Affichage visuel de l'arborescence (templates/admin/org/department.html.twig)
  • Édition d'un département (departmentEdit.html.twig)
  • Composant de nœud d'arborescence (department_node.html.twig)
  • Sélecteur de département (department/singleSelect.html.twig)

Gestion des postes

Les postes sont des définitions de fonctions au sein de l'organisation, associées aux départements. Le point d'entrée de gestion se trouve dans templates/admin/org/position/ :

  • Liste des postes (index.html.twig)
  • Création/édition de poste (create_drawer.html.twig, edit_drawer.html.twig)
  • Gestion des niveaux (level_index.html.twig)
  • Sélecteur de poste (position_modal.html.twig, position_multi_modal.html.twig)

Gestion des sociétés

Prise en charge de structures multi-sociétés :

  • Corporation : sommet du groupe d'entreprises
  • Company : société de rattachement, liée via corporation/company dans CommonTrait
  • Interface d'administration : corporation.html.twig, companyEdit.html.twig

Cache

La structure organisationnelle utilise une stratégie de cache sémantique ; la cohérence du cache est maintenue automatiquement via des écouteurs d'événements Doctrine.

Open source sous licence MIT | Copyright © 2026 Doggy