Skip to content

Estrutura organizacional

O Doggy fornece capacidades completas de gestão da estrutura organizacional empresarial, implementando a estrutura de árvore com base no Gedmo Nested Set, com suporte para múltiplas empresas, departamentos e quadros de pessoal por posição.

Modelo de entidades

As entidades relacionadas com a estrutura organizacional localizam-se em src/Entity/Organization/:

EntidadeNome da tabelaDescrição
CorporationGrupo/consórcio empresarial
CompanyEmpresa
Departmentorg_departmentDepartamento (Gedmo NestedTree)
PositionPosição
PositionLevelNível
EmployeeEmpregado (também utilizador do sistema)

Gestão de departamentos

Os departamentos usam o Gedmo NestedTree para implementar uma estrutura de árvore de profundidade 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;
}

Propriedades do departamento

CampoTipoDescrição
namestringNome do departamento
codestringCódigo único
parentself (NestedTree)Departamento superior
managerManyToMany(Employee)Responsáveis do departamento
companyManyToOne(Company)Empresa a que pertence
typestringTipo de departamento
statestringAtivado/desativado
sortOrderintegerPeso de ordenação

Interface de administração

Entrada no backoffice: App\Controller\Admin\OrgController

  • Visualização da estrutura de árvore (templates/admin/org/department.html.twig)
  • Edição de departamentos (departmentEdit.html.twig)
  • Componente de nós da árvore de departamentos (department_node.html.twig)
  • Seletor de departamentos (department/singleSelect.html.twig)

Gestão de posições

As posições são definições de funções na organização, associadas a departamentos, com gestão em templates/admin/org/position/:

  • Lista de posições (index.html.twig)
  • Criação/edição de posições (create_drawer.html.twig, edit_drawer.html.twig)
  • Gestão de níveis (level_index.html.twig)
  • Seletor de posições (position_modal.html.twig, position_multi_modal.html.twig)

Gestão de empresas

Suporta estruturas com múltiplas empresas:

  • Corporation: topo do grupo empresarial
  • Company: empresas subsidiárias, associadas através dos campos corporation/company do CommonTrait
  • Interface de administração: corporation.html.twig, companyEdit.html.twig

Cache

A estrutura organizacional adota uma estratégia de cache semântica, mantendo automaticamente a consistência da cache através de listeners de eventos Doctrine.

Código aberto sob MIT | Copyright © 2026 Doggy