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
Corporation—Groupe/entreprise
Company—Société
Departmentorg_departmentDépartement (Gedmo NestedTree)
Position—Poste
PositionLevel—Niveau
Employee—Employé (é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