Viagens — Cadastro e Gestão
Cadastro e edição de viagens com múltiplas abas, migrado para v1 (TripCadViewModelNew, base https://api.monisystem.com/v1). O TripCadFragment foi refatorado em TabHelpers — cada aba é gerenciada por uma classe helper independente, mantendo o fragment enxuto. A análise pré-cadastro é feita pelo próprio POST /v1/trip/ com accept_nonconformity=false (não existe /analyze separado): o backend Go devolve conflitos/avisos; depois reenvia-se com accept_nonconformity=true para confirmar.
Módulo /ui/trip/ vs /ui/travels/
| Pacote | Conteúdo | Acesso |
|---|---|---|
/ui/trip/ | TripCadFragment, TripCadViewModel, TabHelpers, dialogs, models | Cadastro e edição de viagens (gestor/admin) |
/ui/travels/ | TripFragment, TripManagementFragment, FragmentButtonsTravels, DriverTripViewModel | Acompanhamento de viagem ativa (motorista) |
Abas do TripCadFragment
| Tab | Helper | Conteúdo principal |
|---|---|---|
| Info Gerais | InfoGeraisTabHelper | Veículo, motorista, rota, perfil, grupo, apólice, contato WhatsApp |
| Entregas | EntregasTabHelper | Pontos de entrega, destinatário, emitente, NCM, rotograma associado |
| Iscas/Escolta | IscaEscoltaTabHelper | Rastreadores de isca e veículos de escolta vinculados à viagem |
| Temperatura | TemperaturaTabHelper | Sensores de temperatura — faixa ideal e limites de alerta |
| Situações | SituacoesTabHelper | Status e situações especiais (ocorrências, bloqueios) |
Fluxo de Salvamento
Análise prévia — POST /v1/trip/ (accept_nonconformity=false)
Antes de confirmar, o app envia o mesmo payload da viagem com accept_nonconformity=false (montado em buildTripJsonV1, TripCadViewModelNew ~1268). Não há endpoint /analyze dedicado — o próprio POST /v1/trip/ devolve conflitos/avisos. Se estiver tudo limpo, o backend já cria a viagem e retorna 201. A resposta é interpretada pela classe AnalysisResult e exibida em diálogo.
Confirmações do usuário
Cada conflito/aviso retornado pode exigir que o usuário confirme explicitamente (checkbox ou botão). Sem confirmação, o salvamento é bloqueado.
Confirmação — POST /v1/trip/ (accept_nonconformity=true)
Reenvia o mesmo payload com accept_nonconformity=true, efetivando a criação da viagem. Campos em inglês snake_case conforme contrato dos structs Go. Não há PUT /v1/trip/{id} confirmado no código — criação e edição passam pelo mesmo POST /v1/trip/ (singular, com barra final).
Validação de Apólice
O status da apólice é verificado antes de habilitar o botão de salvar:
| Estado | Condição | Comportamento |
|---|---|---|
| Válida | expiration_days > 30 | Badge verde, salvamento liberado |
| Aviso | 0 < expiration_days ≤ 30 | Badge amarelo, alerta exibido mas permite continuar |
| Bloqueada | expiration_days ≤ 0 | Badge vermelho, botão de salvar desabilitado |
Endpoints Principais
/v1/vehicles
type == "V" para placas de veículos (exclui reboques e iscas)./v1/user?_driver=true&_limit=10000
_driver=true sobre o endpoint de usuários). Não existe /v1/drivers./v1/point?_detail=true&nome=...&cnpj=...
/v1/delivery-points). Com _detail=true, o campo name_city_id retorna "CIDADE - UF" já formatado — não é necessário enriquecimento separado.
/v1/trip/registration_permissions
allowed + checks para habilitar/bloquear tipos de viagem e perfis. Substituiu as leituras antigas por Elasticsearch. Lido em TripCadViewModelNew (~2696), consumido pela seleção de tipo (SelectedTypeFragment)./v1/trip/
accept_nonconformity=false (análise — devolve conflitos/avisos, ou 201 se limpo) e depois accept_nonconformity=true (confirmação). Todos os campos em inglês snake_case conforme structs Go da API. Não há /analyze nem PUT de edição confirmado./v1/trip/{id}
Dialogs e Helpers Auxiliares
| Classe | Localização | Uso |
|---|---|---|
AnalysisResult | /ui/trip/ | Model dos conflitos/avisos retornados pelo POST /v1/trip/ com accept_nonconformity=false |
SelectedTypeFragment | /ui/trip/ | Seleção de tipo de viagem (modal) |
TripCadViewModel | /ui/trip/ | Versão legada |
TripCadViewModelNew | /ui/trip/ | Versão v1 — ativa |
RequestThrottle actor com máx 3 requests concorrentes.