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/:
| Entidad | Nombre de tabla | Descripción |
|---|---|---|
Corporation | — | Grupo/consorcio empresarial |
Company | — | Empresa |
Department | org_department | Departamento (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):
#[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
| Campo | Tipo | Descripción |
|---|---|---|
| name | string | Nombre del departamento |
| code | string | Código único |
| parent | self (NestedTree) | Departamento superior |
| manager | ManyToMany(Employee) | Responsables del departamento |
| company | ManyToOne(Company) | Empresa a la que pertenece |
| type | string | Tipo de departamento |
| state | string | Habilitado/deshabilitado |
| sortOrder | integer | Peso 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 empresarialCompany: empresa filial, asociada mediantecorporation/companyenCommonTrait- 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.