# lib/tasks/series_aparelho.rake # # Sincroniza o "Número de Série da Base (Aparelho)" da API do SimpliRoute para a # tabela series_aparelho (ver SincronizarSeriesAparelhoJob). # Log padrão das tarefas do projeto (ver historico.rake): uma linha de início, # uma de resultado, e o erro sobe para o cron registrar. É lambda (e não método) # para não pendurar um `executar` global no Object. executar = lambda do |&bloco| puts "[#{Time.current}] Sincronizando número de série da base (SimpliRoute)..." r = bloco.call puts "[#{Time.current}] OK — #{r[:datas]} data(s) varrida(s), #{r[:visitas]} visita(s), #{r[:series]} série(s) gravada(s)." puts "[#{Time.current}] AVISO — #{r[:falhas].size} data(s) sem resposta da API: #{r[:falhas].map { |f| f[:data] }.join(', ')}" if r[:falhas].present? rescue StandardError => e puts "[#{Time.current}] ERRO: #{e.message}" Rails.logger.error("[simpli_route:series] #{e.message}\n#{e.backtrace.first(5).join("\n")}") raise end namespace :simpli_route do desc 'Sincroniza o número de série da base dos últimos 45 dias (cron diário)' task series: :environment do executar.call { SincronizarSeriesAparelhoJob.perform_now } end desc 'Backfill de UMA operação inteira — rake "simpli_route:series_operacao[gade_entregas_ubs_sudeste_jul_2026]"' task :series_operacao, [:tabela] => :environment do |_t, args| tabela = args[:tabela].to_s if Operacao.valida?(tabela) puts "[#{Time.current}] Backfill da operação #{tabela}..." executar.call { SincronizarSeriesAparelhoJob.perform_now(operacao: tabela) } else puts "[#{Time.current}] ERRO: operação inválida (#{tabela.inspect})." puts "Válidas: #{Operacao.nomes_validos.join(', ')}" end end desc 'Backfill por período — rake "simpli_route:series_periodo[2026-07-01,2026-07-31]"' task :series_periodo, %i[de ate] => :environment do |_t, args| executar.call { SincronizarSeriesAparelhoJob.perform_now(de: Date.parse(args[:de]), ate: Date.parse(args[:ate])) } end end