Extensibilidade - Entidades de Utilizador
A extensibilidade tem como objetivo a personalização dos produtos Primavera para que estes se adaptem às necessidades específicas de cada negócio.
As Entidades de Utilizador permitem ao utilizador criar entidades - às quais podem ser associados atributos de utilizador - de modo a armazenar informação personalizada e relevante para o seu negócio.
Do ponto de vista técnico, uma entidade de utilizador apenas difere de uma entidade modelada por fazer uso de uma tabela de base de dados única (uma entidade modelada utiliza uma tabela por entidade). Os restantes elementos que compõem uma entidade (TFV's, listas, operações, etc) são criadas em runtime mas de forma a copiar a lógica atualmente existente na modelação.
Arquitetura
Modelo de dados
O modelo de dados não se distingue consideravelmente do modelo utilizado na modelação, mas ainda assim existem subtis diferenças que aqui se documentam.
Definição das entidade de utilizador
À semelhança de uma entidade modelada, uma entidade de utilizador é definida através de uma entrada na tabela Corepatterns.SchemaEntities, no entanto foi adicionada uma nova coluna UserEntityDefinition onde são guardados metadados adicionais em formato JSON.
Também foi adicionado a coluna IsCompanyDependent que não é persistida.

Figura 1: Alterações efetuadas à entidade SchemaEntity.
De momento a coluna UserEntityDefinition guarda as labels dos campos key e description da entidade e também a indicação se a entidade de utilizador é companyDependent ou não.

Figura 2: UserEntityDefinition.
Persistência das entidades de utilizador
Persistência de registos
Em contraste a uma entidade modelada - onde normalmente existe uma tabela por entidade - todos os registos de todas as entidades de utilizador existem na mesma tabela CorePatterns.CustomEntityRecords, sendo possível distinguir a que entidade pertence cada registo através da coluna CorePatterns.CustomEntityRecords.SchemaEntityId.

Figura 3: Entidade CustomEntityRecords.
Persistência de Vistas e Rotinas
Numa entidade modelada, as vistas (views) e rotinas (TVF's, stored procedures, etc) que a suportam existem no schema que corresponde ao módulo da entidade (ex: sales, shipping, etc). Visto uma entidade de utilizador não pertencer a nenhum módulo, foi criado o schema CustomEntities onde são guardar as vistas e rotinas de base de dados.

Figura 3: Schema CustomEntities.
Controlo de acesso
As funcionalidades aqui descritas apenas são ativadas no produto de acordo com as seguintes condições:
- Presença da claim
claim_allow_extensibility_custom_entitiesna subscrição; - O utilizador autenticado possuir um role cujo menu possui link para a lista da entidade de utilizador em questão.
Modelos
Por forma a possibilitar a criação e gestão de entidades de utilizador foram modelados entities, services, operations, resources e views.
Entidades
Foi modelada uma nova entidade CustomEntityRecord, à qual corresponde a tabela CorePatterns.CustomEntityRecords, que tem como objetivo guardar todos os registos de todas a entidades de utilizador.
Esta nova entidade possui uma foreign key para SchemaEntity por forma a ser possível distinguir a que entidade pertende cada registo.
.
Figura 4: Entidade CustomEntityRecord.
Serviços
Abaixo estão descritas as alterações feitas ao serviço SchemaEntity, bem com a explicação do novo serviço CustomEntityRecords.
Serviço SchemaEntity
O serviço SchemaEntity foi expandido de forma a suportar uma nova ListOperation (CustomEntities) e Resource (CustomEntity), que dão suporte a entidades de utilizador.

Figura 5: Nova ListOperation CustomEntities, e nova Resource CustomEntity.
Serviço CustomEntityRecord
Uma nova ListOperation e serviço CustomEntityRecords foram modelados por forma a que entidades de utilizador suportem todas as operações que qualquer entidade modelada suporta.

Figura 6: Nova ListOperation e Service CustomEntityRecords.
Apresentação
Para finalizar as alterações aos modelos, foram criados os recursos visíveis na imagem seguinte no modelo de apresesentação. É também possível visualizar na seguinte imagem a estrutura do formulário de criação de nova entidade de utilizador.

Figura 6: Novos recursos do modelo de apresentação.
View definition
A persistência das view definitions das entidades de utilizador é conseguida através da reutilização do mecanismo dos atributos de utilizador. A view definition é gerada em runtime e guardada uma azure table da extensiblidade, ao lado dos atributos de utilizador.
Estrutura
Modelação
A ativação das entidades de utilizador e gestão de permissões relacionadas é feita recorrendo à modelação. Todos os aspetos dos vários modelos estão descritos em seguida.
Modelo de menu
Modelo de produto
Codigo gerado
A ações demonstradas acima em Modelação têm os impactos descritos neste capítulo.