Skip to content

Estructura organizativa

Doggy ofrece capacidades completas de gestión de la estructura organizativa empresarial, basadas en Gedmo Nested Set para implementar estructuras en árbol, con soporte para múltiples empresas, departamentos y plantillas de puestos.

Modelo de entidades

Las entidades de la estructura organizativa se encuentran en src/Entity/Organization/:

EntidadNombre de tablaDescripción
CorporationGrupo/consorcio empresarial
CompanyEmpresa
Departmentorg_departmentDepartamento (Gedmo NestedTree)
PositionPuesto
PositionLevelNivel del puesto
EmployeeEmpleado (también usuario del sistema)

Gestión de departamentos

Los departamentos utilizan Gedmo NestedTree para implementar una estructura en árbol de profundidad ilimitada (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;
}

Atributos del departamento

CampoTipoDescripción
namestringNombre del departamento
codestringCódigo único
parentself (NestedTree)Departamento superior
managerManyToMany(Employee)Responsables del departamento
companyManyToOne(Company)Empresa a la que pertenece
typestringTipo de departamento
statestringHabilitado/deshabilitado
sortOrderintegerPeso de ordenación

Interfaz de administración

Entrada en el panel de administración: App\Controller\Admin\OrgController

  • Visualización de la estructura en árbol (templates/admin/org/department.html.twig)
  • Edición de departamentos (departmentEdit.html.twig)
  • Componente de nodo del árbol de departamentos (department_node.html.twig)
  • Selector de departamentos (department/singleSelect.html.twig)

Gestión de puestos

Los puestos son definiciones de cargos en la organización, asociados a departamentos; la entrada de gestión se encuentra en templates/admin/org/position/:

  • Lista de puestos (index.html.twig)
  • Creación/edición de puestos (create_drawer.html.twig, edit_drawer.html.twig)
  • Gestión de niveles (level_index.html.twig)
  • Selector de puestos (position_modal.html.twig, position_multi_modal.html.twig)

Gestión de empresas

Soporta estructuras de múltiples empresas:

  • Corporation: nivel superior del consorcio empresarial
  • Company: empresa filial, asociada mediante corporation/company en CommonTrait
  • Interfaz de administración: corporation.html.twig, companyEdit.html.twig

Caché

La estructura organizativa emplea una estrategia de caché semántica, manteniendo automáticamente la coherencia de la caché mediante escuchadores de eventos de Doctrine.

Código abierto bajo MIT | Copyright © 2026 Doggy