Company-dependent
Este documento descreve os padrões de negócio relacionados com dados que variam de acordo com a empresa.
Conceitos
Cliente
Trata-se de uma “entidade” que adquire/subscreve um produto.
Tenant
Instalação de um cliente.
Organization
Define uma organização de um cliente. Um tenant pode ter N organizações (organizations) e uma organização pode ter N empresas (companies).
As empresas dentro de uma mesma organização partilham os dados de todas as entidades que não possuam dependências da empresa. Por exemplo, os registos de uma tabela de artigos podem ser acedidos no contexto de uma transação associada a uma empresa específica.
Company
Corresponde a uma empresa legal e há determinadas transações (exemplo: uma fatura) que devem ser associadas a uma determinada empresa.
Desenho
Entidade Company-dependent
Uma entidade é company-dependent se estiver associada a uma determinada empresa e só for válida para essa empresa.
Nos casos de entidades company-dependent, a seleção da empresa para a criação de registos é efetuada na top bar da aplicação. O componente de seleção de empresas estará sempre disponível, mas só será utilizada para entidades desse tipo, e apresentará sempre uma empresa por defeito, com a possibilidade de alteração quando existir mais do que uma empresa criada.

Configurações por empresa
As configurações de um módulo (ex: Taxes) devem ser mantidas por entidade própria (ex: TaxesSetup) e essa entidade deve ser company-dependent.
A partir daí essa entidade será como qualquer outra entidade company-dependent, exceto:
- Quando uma nova empresa for criada, será automaticamente criado o registo nessas entidades para que possa ser alterada a configuração do módulo respetivo.
- Da mesma forma, se uma empresa for eliminada, os respetivos registos de configuração serão eliminados.
Implementação
De seguida descreve-se a implementação e os passos necessários na modelação de um módulo para suportar cada um dos cenários.
Entidade Company-dependent
Company e CompanyId
Todas as entidades company-dependent deverão ter uma associação para a entidade Company do módulo Core Patterns que identificará a empresa para a qual a entidade é válida.
Interface ICompanyDependent
Este interface é usado na framework de modelação para indicar as entidades company-depedent e possui a propriedade CompanyId (Guid?) que representa o id da empresa. Esta propriedade do interface garante também que o modelo de entidades obrigará o utilizador a ter a entidade com uma associação para a entidade Company (Core Patterns)).
Modelação
Para definir uma entidade como company-dependent será necessário no ED (Entities Designer) associá-la com o interface ICompanyDependent, o que, por sua vez, obrigará a criar uma associação para a entidade Company.
Tipicamente isso resultará num modelo de entidades semelhante ao seguinte:

Validações
As seguintes validações aplicam-se a entidades company-dependent:
- Deve existir uma associação para a entidade CorePatterns.Company.
- O campo “Company” não poderá estar presente no modelo de apresentação (porque a gestão deste campo e a pattern de utilização do mesmo serão asseguradas de forma automática).