Skip to main content

Overview

Uma Cooperative representa a organização administradora. Uma Company representa a empresa de transporte que opera frota, rotas, viagens, vendas e billing. A relação é 1:N:
  • Uma Cooperative pode administrar zero ou mais Company.
  • Uma Company pertence obrigatoriamente a uma única Cooperative.
  • O vínculo é persistido em Company.cooperativeId.

Responsabilidades

EntidadeResponsabilidade
CooperativeAgrupa e administra empresas afiliadas. É o escopo de coordenação e governança.
CompanyOpera transporte. É dona de frota, motoristas vinculados, rotas, viagens, vendas e billing.
OrganizationFornece identidade de tenant, dados cadastrais, roles, memberships e convites.
Mesmo vinculada a uma cooperativa, a Company continua sendo a unidade operacional e financeira. Dados como Vehicle, Route, Trip, Order, Payment, Receivable, Transfer, BankAccount e CompanyPaymentSettings pertencem à empresa.

Lifecycle

  1. A cooperativa nasce como uma Organization com type=COOPERATIVE e extensão Cooperative.
  2. A empresa nasce como uma Organization com type=COMPANY e extensão Company.
  3. A criação da empresa exige uma Cooperative ativa.
  4. O cooperativeId da empresa define a afiliação administrativa.
  5. O owner da cooperativa recebe Membership na organização da cooperativa.
  6. O owner da empresa recebe Membership na organização da empresa.

Regras de negócio

RegraDescrição
CardinalidadeUma cooperativa pode ter N empresas. Uma empresa tem exatamente uma cooperativa.
ObrigatoriedadeCompany.cooperativeId é obrigatório. Não existe Company órfã.
Tenant próprioCooperative e Company têm Organization próprias. Elas não compartilham organizationId.
Escopo operacionalFrota, motoristas, rotas, viagens, tickets e pedidos são sempre filtrados por companyId.
Escopo financeiroBilling pertence à Company. Cooperative não recebe pagamentos, recebíveis ou transferências diretamente.
AdministraçãoUsuários da Cooperative podem administrar empresas afiliadas apenas por capacidades explicitamente permitidas.
AuditoriaCriação, troca de afiliação, bloqueio ou remoção de Company deve registrar ator, data e motivo quando aplicável.

Escopo de acesso

Memberships continuam sendo avaliadas no contexto da Organization ativa do usuário.
Contexto ativoPode acessar
Organization da CooperativeDados administrativos da cooperativa e empresas afiliadas conforme permissions disponíveis.
Organization da CompanyOperação da própria empresa: frota, rotas, viagens, vendas e billing.
Sem Membership no contextoNenhum dado privado da cooperativa ou da empresa.
Quando uma tela de cooperativa lista empresas afiliadas, a consulta deve filtrar por:
Company.cooperativeId = Cooperative.cooperativeId do contexto ativo
Quando uma tela operacional da empresa busca recursos, a consulta deve filtrar por:
resource.companyId = Company.companyId do contexto ativo

Mudança de afiliação

A troca de Company.cooperativeId é uma operação sensível. O comportamento recomendado é tratar a troca como rotina administrativa controlada, não como edição comum de cadastro.
PontoRegra
AutorizaçãoExigir permission administrativa compatível com BackOffice ou Cooperative.
IntegridadeA nova Cooperative deve existir, estar ativa e não estar removida.
Dados históricosRegistros já criados continuam apontando para a mesma Company. Não reescrever companyId histórico.
BillingNão alterar ownership financeiro. Billing continua pertencendo à Company.
AuditoriaRegistrar oldCooperativeId, newCooperativeId, ator, data e motivo.

Padrões de consulta

Listar empresas da cooperativa

SELECT Company
WHERE Company.cooperativeId = :activeCooperativeId
  AND Company.deletedAt IS NULL
ORDER BY Company.createdAt DESC

Resolver cooperativa de uma empresa

SELECT Cooperative
JOIN Company ON Company.cooperativeId = Cooperative.cooperativeId
WHERE Company.companyId = :companyId

Validar se uma empresa pertence à cooperativa ativa

EXISTS Company
WHERE Company.companyId = :companyId
  AND Company.cooperativeId = :activeCooperativeId
  AND Company.deletedAt IS NULL

Modelagem relacionada