feat: GTI Gerenciador as the single source of truth for clients; bump to 1.1.2
Tenant gains source (LOCAL|GTI_GERENCIADOR), external_client_id, external_code, active and synced_at (migration 0024). central/app/client_sync.py fetches from the panel's new GET /internal/fiscal/clients (dedicated bearer token, never MySQL credentials) and upserts Tenant rows, never touching a LOCAL row. /agents/new now offers only active GTI_GERENCIADOR tenants, with a client-side search box; the POST validates the same rule server-side, not just in the dropdown. central/scripts/sync_clients_from_gerenciador.py is the operator-run sync + reconciliation report. GTI_FISCAL_VERSION/AGENT_VERSION bumped to 1.1.2 (release/VERSION single source of truth), incorporating the installation_id persistence fix. Rebuilt the EXE installer trio at 1.1.2 (scripts/build_windows_installer.ps1). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -215,9 +215,22 @@ class RtcCredPresEntry(Base):
|
||||
|
||||
|
||||
class Tenant(Base):
|
||||
"""A client. GTI Gerenciador (the panel) is the single source of truth —
|
||||
see central/app/client_sync.py. `source='GTI_GERENCIADOR'` rows are
|
||||
upserted by that sync, keyed by `external_client_id` (Gerenciador's
|
||||
CLIENTE.ID, the stable technical PK — CLIENTE.CODIGO is editable and
|
||||
never used as identity, same reasoning as FUNCIONARIO_PAINEL.ID in SSO).
|
||||
`source='LOCAL'` rows predate this sync (dev/test tenants) and are never
|
||||
offered for a new installation."""
|
||||
__tablename__ = "tenants"
|
||||
__table_args__ = (UniqueConstraint("source", "external_client_id", name="uq_tenant_external_identity"),)
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
name: Mapped[str] = mapped_column(String(128), unique=True)
|
||||
source: Mapped[str] = mapped_column(String(16), default="LOCAL", server_default="LOCAL") # LOCAL | GTI_GERENCIADOR
|
||||
external_client_id: Mapped[int | None] = mapped_column(Integer, nullable=True, index=True)
|
||||
external_code: Mapped[str | None] = mapped_column(String(16), nullable=True)
|
||||
active: Mapped[bool] = mapped_column(Boolean, default=True, server_default="true")
|
||||
synced_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
|
||||
|
||||
|
||||
class Agent(Base):
|
||||
|
||||
Reference in New Issue
Block a user