Comecando com Levy Compliance
Este artigo conduz voce pelo onboarding de uma unica jurisdicao (uma cidade) de ponta a ponta. O estado final: endpoints MDS estao ativos, o feed de politica da cidade e consultado a cada 60 segundos, geofences ativam-se conforme programado e o contato municipal recebe e-mails de digest diarios/semanais/mensais.
Pre-requisitos
Antes de comecar, confirme o seguinte:
| Requisito | Onde verificar |
|---|---|
| Voce possui uma licenca de operador ativa (ou esta em fase de pedido) | Departamento de licencas municipal |
Sua frota tem ao menos um veiculo com iot_imei definido | /dashboard/vehicles |
| Sua subconta tem um token bearer MDS emitido | Configuracoes -> API e Integracoes |
| Voce tem a URL do feed de politica da cidade (e token de auth, se privado) | Contato municipal |
| Voce tem ao menos um e-mail de contato municipal para envio de digest | Contato municipal |
Tokens bearer MDS
O Levy Compliance ainda usa a tabela de tokens bearer existente (mds_city_tokens) para auth primaria. A nova camada JWT e assinada em cima de cada resposta -- cidades podem continuar usando tokens bearer ou verificar o JWT contra sua URL JWKS. Veja Gerenciamento de Chaves JWKS.
Passo 1 -- Criar a jurisdicao
Abrir o dashboard de compliance
Va para Dashboard -> Compliance em /dashboard/compliance. Voce vera um indice de jurisdicoes (vazio se for sua primeira) mais um banner de alerta de conflito no topo.
Clicar em 'Adicionar jurisdicao'
Navega para /dashboard/compliance/new. Os campos do formulario mapeiam 1:1 para a tabela mds_jurisdictions.
Preencher o formulario
| Campo | Exemplo | Observacoes |
|---|---|---|
| Nome | Boulder, CO | Nome de exibicao mostrado a operadores e cidades. |
| Slug | boulder-co | Usado na URL publica: /city/boulder-co. Minusculas, separadas por hifen, deve ser unico. |
| URL do feed de politica | https://populus.cityofboulder.org/mds/policy | O endpoint de politica publicado pela cidade. |
| Token de auth do feed | bearer xyz... | Opcional. Armazenado criptografado. |
| Intervalo de poll (s) | 60 | Padrao 60s. Cidades com muitas atualizacoes podem ir mais baixo; cidades quietas mais alto. |
| Ativo | true | Desabilitar para pausar polling sem deletar. |
Salvar
A jurisdicao e criada. O primeiro par de chaves JWKS e gerado lazy na proxima vez que alguem acessar /api/mds/{subaccountId}/.well-known/jwks.json -- voce pode disparar isso agora abrindo essa URL no navegador.
Passo 2 -- Confirmar que endpoints MDS respondem
Cada jurisdicao herda a mesma base de endpoint MDS sob sua subconta:
GET /api/mds/{subaccountId}/provider/v2/vehicles
GET /api/mds/{subaccountId}/provider/v2/vehicles/status
GET /api/mds/{subaccountId}/provider/v2/trips
GET /api/mds/{subaccountId}/provider/v2/events
GET /api/mds/{subaccountId}/provider/v2/telemetry/{vehicle_id}
GET /api/mds/{subaccountId}/provider/v2/stops
GET /api/mds/{subaccountId}/provider/v2/reports
GET /api/mds/{subaccountId}/.well-known/jwks.json
Acesse vehicles/status com seu token bearer para confirmar:
curl -H "Authorization: Bearer <YOUR_MDS_TOKEN>" \
https://fleets.levyelectric.com/api/mds/<subaccountId>/provider/v2/vehicles/status
Uma resposta bem-sucedida carrega:
- HTTP 200
Content-Type: application/vnd.mds+json;version=2.0- Header
MDS-JWT(prova assinada do sha256 do corpo da resposta) - Um campo
versiondefinido como2.0.1no envelope JSON
Veja Configuracao do MDS Provider para a referencia completa de endpoints.
Passo 3 -- Entregar as URLs a cidade
Envie ao contato municipal um e-mail curto com estas quatro informacoes:
| Item | Valor |
|---|---|
| Base do MDS Provider | https://fleets.levyelectric.com/api/mds/<subaccountId>/provider/v2/ |
| URL JWKS | https://fleets.levyelectric.com/api/mds/<subaccountId>/.well-known/jwks.json |
| Token bearer | (emitir em Configuracoes -> API e Integracoes) |
| Raiz GBFS 3.0 | https://fleets.levyelectric.com/api/gbfs/v3/<subaccountId>/gbfs.json |
A instancia Populus / Ride Report / Lacuna da cidade validara os endpoints contra o validador GBFS da MobilityData e o validador mds-provider-validator do OMF antes de marcar sua frota como ativa em seu dashboard. Ambos os validadores devem passar sem avisos.
Passo 4 -- Observar o primeiro poll de politica
O cron mds-policy-poll roda a cada minuto. Em 60 segundos apos salvar a jurisdicao:
- O poller acessa o feed de politica da cidade.
- O payload bruto e hasheado em sha256 e comparado ao ultimo hash conhecido.
- Se mudou, o validador Zod faz parse de
policies[]egeographies[]. - Politicas sao upsertadas; regras sao substituidas; linhas
policy_geofencessao materializadas das geografias referenciadas. - Uma linha cai em
mds_policy_auditcomrun_id, JSONdiffeapplied_at.
Abra /dashboard/compliance/{jurisdiction-id} e voce deve ver a lista de politicas ativas povoada. Veja Ingestao de Politica de Cidades para o visualizador de diff.
Nao ve nenhuma politica?
Tres causas comuns: (1) a URL do feed da cidade esta errada ou atras de auth que voce nao configurou, (2) o feed valida mas nao contem politicas para seus tipos de veiculo, ou (3) o feed respondeu mas seu esquema nao corresponde ao MDS 2.0. O log de auditoria registra o erro de parse; verifique la primeiro.
Passo 5 -- Configurar contatos municipais
Contatos municipais recebem acesso por magic link ao Portal da Cidade e recebem e-mails de digest em uma cadencia que voce define.
Da pagina da jurisdicao, clicar em 'Adicionar contato municipal'
Adiciona uma linha em city_contacts limitada a esta jurisdicao.
Definir nome, e-mail, papel e digest_frequency
| Campo | Exemplo |
|---|---|
sarah@bouldercolorado.gov | |
| Nome | Sarah Johnson |
| Papel | City Compliance Officer |
| Acesso ao portal | true |
| Frequencia de digest | weekly (opcoes: daily, weekly, monthly) |
Salvar e notificar o contato
O contato pode agora ir para /city/{slug}, inserir seu e-mail e receber um magic link. Tambem comecara a receber e-mails de digest na cadencia escolhida.
Passo 6 -- Definir condicoes de licenca
Se sua licenca especifica condicoes aplicaveis (cap de frota, percentual de zonas de equidade, SLA de reclamacoes), registre cada uma em permit_conditions. O reporter de conformidade as avalia em cada execucao de digest.
condition_type | O que verifica |
|---|---|
fleet_cap | COUNT(veiculos ativos na jurisdicao) <= cap |
equity_zone_pct | % da frota implantada dentro das geografias de equidade >= limiar |
complaint_sla | responded_at de cada reclamacao dentro de N horas de created_at |
trip_report_eod | Um CSV de viagem e gerado diariamente as 23:59 hora local da jurisdicao |
corral_utilization | Snapshot horario da ocupacao do estacionamento |
Veja Relatorios de Condicoes de Licenca para detalhes do avaliador.
Passo 7 -- Verificar o primeiro digest
O cron compliance-digest roda horariamente e percorre cada linha de city_contacts cuja janela de cadencia expirou. Para um contato daily criado hoje, o primeiro e-mail chega dentro de uma hora apos o fechamento do periodo de digest (tipicamente meia-noite na hora local da jurisdicao).
Quando o e-mail sai:
- Uma linha e gravada em
city_compliance_reportscompayload(o JSON renderizado) epdf_urlse um PDF mensal foi anexado. - O
last_digest_sent_atdo contato e atualizado.
Se a cidade nao ve o e-mail apos a janela esperada, verifique spam, depois verifique last_digest_sent_at em city_contacts -- se estiver desatualizado, o cron nao disparou ou o sender deu erro. Veja Solucao de Problemas.
O que voce realizou
Depois dos passos 1-7:
- Sua subconta publica um feed MDS 2.0 Provider conformante
- Um feed GBFS 3.0 (com
vehicle_type_idpor regra de zona) esta ativo ao lado do feed 2.x legado - O feed de politica da cidade e consultado a cada minuto e comparado ao ultimo conhecido
- Geofences empilhados com a prioridade correta materializam-se das regras municipais
- O contato municipal pode logar no portal via magic link
- E-mails de digest fluirao na cadencia configurada
- Pass/fail de condicoes de licenca e computado diariamente e mostrado tanto no dashboard do operador quanto no portal municipal
Voce pode agora apontar seu oficial de licenca municipal para os endpoints MDS publicos e a raiz GBFS 3.0.
Proximos passos
- Configuracao do MDS Provider -- referencia de endpoint e detalhes de assinatura.
- Ingestao de Politica de Cidades -- visualizador de diff, auditoria, ativacao.
- Prioridade de Geofences Empilhados -- como regras municipais sobrescrevem suas zonas de operador.
- Solucao de Problemas -- quando polls ou digests nao disparam.