intermediate
comecando
jurisdicoes
onboarding

Comecando com Levy Compliance

Onboarding ponta a ponta para uma nova jurisdicao municipal -- da concessao da licenca ao primeiro digest de conformidade enviado a cidade.

Equipe Levy FleetsMay 18, 202614 min read

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:

RequisitoOnde 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 emitidoConfiguracoes -> 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 digestContato 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

1

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.

2

Clicar em 'Adicionar jurisdicao'

Navega para /dashboard/compliance/new. Os campos do formulario mapeiam 1:1 para a tabela mds_jurisdictions.

3

Preencher o formulario

CampoExemploObservacoes
NomeBoulder, CONome de exibicao mostrado a operadores e cidades.
Slugboulder-coUsado na URL publica: /city/boulder-co. Minusculas, separadas por hifen, deve ser unico.
URL do feed de politicahttps://populus.cityofboulder.org/mds/policyO endpoint de politica publicado pela cidade.
Token de auth do feedbearer xyz...Opcional. Armazenado criptografado.
Intervalo de poll (s)60Padrao 60s. Cidades com muitas atualizacoes podem ir mais baixo; cidades quietas mais alto.
AtivotrueDesabilitar para pausar polling sem deletar.
4

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 version definido como 2.0.1 no 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:

ItemValor
Base do MDS Providerhttps://fleets.levyelectric.com/api/mds/<subaccountId>/provider/v2/
URL JWKShttps://fleets.levyelectric.com/api/mds/<subaccountId>/.well-known/jwks.json
Token bearer(emitir em Configuracoes -> API e Integracoes)
Raiz GBFS 3.0https://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:

  1. O poller acessa o feed de politica da cidade.
  2. O payload bruto e hasheado em sha256 e comparado ao ultimo hash conhecido.
  3. Se mudou, o validador Zod faz parse de policies[] e geographies[].
  4. Politicas sao upsertadas; regras sao substituidas; linhas policy_geofences sao materializadas das geografias referenciadas.
  5. Uma linha cai em mds_policy_audit com run_id, JSON diff e applied_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.

1

Da pagina da jurisdicao, clicar em 'Adicionar contato municipal'

Adiciona uma linha em city_contacts limitada a esta jurisdicao.

2

Definir nome, e-mail, papel e digest_frequency

CampoExemplo
E-mailsarah@bouldercolorado.gov
NomeSarah Johnson
PapelCity Compliance Officer
Acesso ao portaltrue
Frequencia de digestweekly (opcoes: daily, weekly, monthly)
3

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_typeO que verifica
fleet_capCOUNT(veiculos ativos na jurisdicao) &lt;= cap
equity_zone_pct% da frota implantada dentro das geografias de equidade &gt;= limiar
complaint_slaresponded_at de cada reclamacao dentro de N horas de created_at
trip_report_eodUm CSV de viagem e gerado diariamente as 23:59 hora local da jurisdicao
corral_utilizationSnapshot 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_reports com payload (o JSON renderizado) e pdf_url se um PDF mensal foi anexado.
  • O last_digest_sent_at do 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_id por 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