Files
Reem-Notas/db/migrate/20260827000003_create_romaneio_linhas.rb

52 lines
2.6 KiB
Ruby

# Uma PARADA do romaneio — vira uma linha da tabela do PDF.
#
# ⚠️ "linhas" e não "itens": "RomaneioItem".tableize dá `romaneio_items`, e o
# inflector pt-BR do projeto (config/initializers/inflections.rb) não conhece
# item/itens — ensiná-lo renomearia todo `item`/`items` do app. `RomaneioLinha`
# pluraliza sozinho, e `linhas` já é a palavra que os serviços usam
# (PlanilhaEntregas#linhas, PlanilhaCarga#linhas). Travado em
# spec/models/table_names_spec.rb, que existe porque ConsolidacaoMotorista já
# quebrou em produção por causa do inflector.
#
# `chave_origem` é a identidade ESTÁVEL entre reimportações: a NF quando existe,
# senão "T:<md5(titulo|endereco)>". Sem esse fallback, duas linhas cujo "Título" não
# casa o padrão "NF n - NOME" colidiriam no índice único e a importação inteira
# estouraria. Veículo e ordem NÃO entram na chave: eles mudam quando o plano é
# reotimizado, e a linha continua sendo a mesma entrega.
#
# `origem` = snapshot do que o PLANO trouxe na última importação (para o
# diff e para o botão "restaurar do plano").
# `campos_editados` = nomes dos campos que o operador sobrescreveu. É ISTO que
# sobrevive à reimportação — dirty tracking POR CAMPO, não por
# linha: "corrigi o telefone" não pode significar "também
# respondo pelo endereço" e congelar um endereço velho.
# `removido_em` = a linha saiu do plano mas tinha edição humana. Soft, porque
# apagar levaria junto o trabalho sem deixar rastro na tela.
class CreateRomaneioLinhas < ActiveRecord::Migration[7.1]
def change
create_table :romaneio_linhas do |t|
t.references :romaneio, null: false, foreign_key: true
t.string :veiculo, null: false
t.integer :ordem, null: false, default: 0
t.string :chave_origem, null: false
t.string :nota_fiscal, null: false, default: ''
t.string :nome, null: false, default: ''
t.text :endereco, null: false, default: ''
t.string :aparelho, null: false, default: '' # 'SIM' ou ''
t.string :telefones, null: false, default: ''
t.jsonb :origem, null: false, default: {}
t.jsonb :campos_editados, null: false, default: []
t.datetime :removido_em
t.timestamps
end
add_index :romaneio_linhas, %i[romaneio_id chave_origem],
unique: true, name: 'idx_romaneio_linha_chave_unico'
add_index :romaneio_linhas, %i[romaneio_id veiculo ordem],
name: 'idx_romaneio_linha_ordem'
end
end