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
Corporation—Grupo/consorcio empresarial
Company—Empresa
Departmentorg_departmentDepartamento (Gedmo NestedTree)
Position—Puesto
PositionLevel—Nivel del puesto
Employee—Empleado (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