Novo Campo de fotos da simpleroute
This commit is contained in:
@@ -71,24 +71,26 @@ def titulo(t)
|
||||
end
|
||||
|
||||
# ── 1. Leitura: o que cada endpoint devolve de imagem ────────────────────────
|
||||
titulo("1. GET /v1/routes/visits/#{visita_id}/")
|
||||
# As fotos REAIS do motorista ficam em extra_field_values (foto_nf,
|
||||
# foto_prova_visita, ...). O array `pictures` costuma ter só 1 imagem genérica.
|
||||
titulo("1. GET /v1/routes/visits/#{visita_id}/ (endpoint de escrita)")
|
||||
cod, visita = requisicao(:get, "/v1/routes/visits/#{visita_id}/")
|
||||
sair("Falhou (HTTP #{cod}): #{visita.inspect}") unless cod == 200
|
||||
|
||||
pictures_orig = Array(visita['pictures'])
|
||||
efv_orig = visita['extra_field_values'].is_a?(Hash) ? visita['extra_field_values'] : {}
|
||||
puts " status .............. #{visita['status'].inspect}"
|
||||
puts " reference (NF) ...... #{visita['reference'].inspect}"
|
||||
puts " pictures ............ #{pictures_orig.size} item(ns)"
|
||||
pictures_orig.each_with_index { |u, i| puts " [#{i}] #{u}" }
|
||||
puts " pictures ............ #{Array(visita['pictures']).size} item(ns) (genéricas)"
|
||||
puts " signature ........... #{visita['signature'].inspect}"
|
||||
puts " extra_field_values .. #{efv_orig.size} campo(s) — AQUI estão as fotos reais:"
|
||||
efv_orig.each { |campo, url| puts " #{campo.ljust(20)} #{url.nil? ? '(vazio)' : url}" }
|
||||
|
||||
titulo("2. GET /v1/plans/visits/#{visita_id}/detail/ (fonte extra de fotos)")
|
||||
titulo("2. GET /v1/plans/visits/#{visita_id}/detail/ (POD — costuma ser + completo)")
|
||||
cod_d, detalhe = requisicao(:get, "/v1/plans/visits/#{visita_id}/detail/")
|
||||
if cod_d == 200 && detalhe.is_a?(Hash)
|
||||
puts " OK. Chaves: #{detalhe.keys.sort.join(', ')}"
|
||||
puts " pictures ............ #{Array(detalhe['pictures']).size} item(ns)"
|
||||
Array(detalhe['pictures']).each_with_index { |u, i| puts " [#{i}] #{u}" }
|
||||
puts " signature ........... #{detalhe['signature'].inspect}"
|
||||
efv_det = detalhe['extra_field_values'].is_a?(Hash) ? detalhe['extra_field_values'] : {}
|
||||
puts " extra_field_values .. #{efv_det.size} campo(s):"
|
||||
efv_det.each { |campo, url| puts " #{campo.ljust(20)} #{url.nil? ? '(vazio)' : url}" }
|
||||
else
|
||||
puts " Indisponível (HTTP #{cod_d}) — a galeria segue só com a visita."
|
||||
end
|
||||
@@ -96,19 +98,31 @@ end
|
||||
unless testar_escrita
|
||||
titulo('Leitura concluída — nada foi alterado')
|
||||
puts ' Para descobrir se dá para GRAVAR foto, rode de novo com --testar-escrita'
|
||||
puts ' (de preferência numa visita de teste).'
|
||||
puts ' (de preferência numa visita de teste/antiga).'
|
||||
exit 0
|
||||
end
|
||||
|
||||
# ── 3. Escrita: tenta acrescentar uma foto e restaura ────────────────────────
|
||||
titulo('3. TESTE DE ESCRITA — PATCH pictures')
|
||||
puts " Valor ORIGINAL (guarde para restaurar na mão, se precisar):"
|
||||
puts " #{pictures_orig.to_json}"
|
||||
# ── 3. Escrita: mexe num campo VAZIO e restaura ──────────────────────────────
|
||||
# Alvo: um campo de foto que esteja vazio (por padrão foto_termo). Assim o teste
|
||||
# NÃO sobrescreve nenhuma foto real — só preenche um espaço em branco e desfaz.
|
||||
# Ao gravar, mandamos o dict INTEIRO (a API pode substituir o objeto todo).
|
||||
titulo('3. TESTE DE ESCRITA — PATCH extra_field_values')
|
||||
|
||||
alvo = efv_orig.key?('foto_termo') && efv_orig['foto_termo'].nil? ? 'foto_termo' :
|
||||
efv_orig.find { |_c, v| v.nil? }&.first
|
||||
if alvo.nil?
|
||||
sair(' Nenhum campo de foto vazio nesta visita — para não sobrescrever uma ' \
|
||||
'foto real, escolha outra visita (com foto_termo vazio) para o teste.')
|
||||
end
|
||||
|
||||
puts " Campo-alvo (vazio) .. #{alvo}"
|
||||
puts " extra_field_values ORIGINAL (guarde p/ restaurar na mão, se precisar):"
|
||||
puts " #{efv_orig.to_json}"
|
||||
|
||||
veredito = 'INDEFINIDO'
|
||||
begin
|
||||
novo = pictures_orig + [URL_TESTE]
|
||||
cod_p, resp = requisicao(:patch, "/v1/routes/visits/#{visita_id}/", { 'pictures' => novo })
|
||||
novo = efv_orig.merge(alvo => URL_TESTE)
|
||||
cod_p, resp = requisicao(:patch, "/v1/routes/visits/#{visita_id}/", { 'extra_field_values' => novo })
|
||||
puts "\n PATCH respondeu HTTP #{cod_p}"
|
||||
|
||||
if cod_p != 200
|
||||
@@ -117,31 +131,32 @@ begin
|
||||
else
|
||||
# 200 não basta: a API pode aceitar e ignorar o campo silenciosamente.
|
||||
_, confere = requisicao(:get, "/v1/routes/visits/#{visita_id}/")
|
||||
persistiu = Array(confere['pictures']).include?(URL_TESTE)
|
||||
veredito = persistiu ? 'É POSSÍVEL — a foto de teste persistiu' :
|
||||
'NÃO — a API respondeu 200 mas IGNOROU o campo pictures'
|
||||
puts " pictures após o PATCH: #{Array(confere['pictures']).size} item(ns)"
|
||||
atual = confere['extra_field_values'].is_a?(Hash) ? confere['extra_field_values'] : {}
|
||||
persistiu = atual[alvo] == URL_TESTE
|
||||
veredito = persistiu ? 'É POSSÍVEL — o valor de teste persistiu no campo de foto' :
|
||||
'NÃO — a API respondeu 200 mas IGNOROU extra_field_values'
|
||||
puts " #{alvo} após o PATCH: #{atual[alvo].inspect}"
|
||||
end
|
||||
ensure
|
||||
# Restaura sempre, mesmo se algo acima estourar.
|
||||
titulo('4. RESTAURANDO o valor original')
|
||||
cod_r, = requisicao(:patch, "/v1/routes/visits/#{visita_id}/", { 'pictures' => pictures_orig })
|
||||
cod_r, = requisicao(:patch, "/v1/routes/visits/#{visita_id}/", { 'extra_field_values' => efv_orig })
|
||||
_, final = requisicao(:get, "/v1/routes/visits/#{visita_id}/")
|
||||
restaurado = Array(final['pictures'])
|
||||
ok = restaurado == pictures_orig && !restaurado.include?(URL_TESTE)
|
||||
restaurado = final['extra_field_values'].is_a?(Hash) ? final['extra_field_values'] : {}
|
||||
ok = restaurado[alvo].to_s == efv_orig[alvo].to_s && restaurado[alvo] != URL_TESTE
|
||||
puts " PATCH de restauração: HTTP #{cod_r}"
|
||||
puts(ok ? ' ✔ Restaurado — a visita voltou ao estado original.' :
|
||||
" ✘ ATENÇÃO: confira manualmente. Agora está: #{restaurado.to_json}")
|
||||
puts(ok ? " ✔ Restaurado — #{alvo} voltou a #{efv_orig[alvo].inspect}." :
|
||||
" ✘ ATENÇÃO: confira manualmente. Agora #{alvo} = #{restaurado[alvo].inspect}")
|
||||
end
|
||||
|
||||
titulo("VEREDITO: #{veredito}")
|
||||
puts <<~FIM
|
||||
Se deu "É POSSÍVEL", dá para implementar substituir/remover/adicionar foto —
|
||||
faltando só resolver ONDE hospedar a imagem nova (o app ainda não tem
|
||||
ActiveStorage com migrations/storage.yml).
|
||||
Se deu "É POSSÍVEL", dá para implementar substituir/remover/adicionar foto:
|
||||
a edição é um PATCH em extra_field_values (o campo certo: foto_nf, foto_termo,
|
||||
foto_prova_visita, ...). Falta só resolver ONDE hospedar a imagem nova — o app
|
||||
ainda não tem ActiveStorage com migrations/storage.yml, então a foto enviada
|
||||
pelo ADM precisa virar uma URL pública antes do PATCH.
|
||||
|
||||
Se deu "NÃO", a alteração de foto terá de ser feita pela interface web do
|
||||
SimpliRoute, ou via o endpoint de checkout do app do motorista
|
||||
(POST /v1/mobile/visit/#{visita_id}/checkout/), que reescreve o checkout
|
||||
inteiro — bem mais invasivo. Vale confirmar com contact@simpliroute.com.
|
||||
Se deu "NÃO", a alteração terá de ser feita pela interface web do SimpliRoute.
|
||||
Vale confirmar o caminho de upload com contact@simpliroute.com.
|
||||
FIM
|
||||
|
||||
Reference in New Issue
Block a user