20260709120000_create_atendimento_avaliacoes_table.cjs 1.6 KB

123456789101112131415161718192021222324252627282930
  1. exports.up = function (knex) {
  2. return knex.schema.createTable("atendimento_avaliacoes", (t) => {
  3. t.integer("AtendimentoId").unsigned().primary();
  4. t.boolean("Avaliavel").notNullable().defaultTo(true); // false = conversa sem conteúdo suficiente para avaliar
  5. t.tinyint("ScoreAtendente").unsigned().nullable(); // 1 a 10
  6. t.text("JustificativaScore").nullable();
  7. t.string("Resolvido", 12).notNullable().defaultTo("indefinido"); // sim | nao | parcial | indefinido
  8. t.string("Sentimento", 12).notNullable().defaultTo("indefinido"); // positivo | neutro | negativo | indefinido
  9. t.text("Resumo").nullable();
  10. t.text("Sugestoes").nullable(); // JSON array de strings
  11. t.text("Atendentes").nullable(); // JSON array com nomes dos atendentes identificados
  12. t.boolean("VisitaAgendada").nullable();
  13. t.string("HorarioVisitaInformado", 15).nullable(); // sim | nao | nao_se_aplica
  14. t.string("HorarioVisita", 150).nullable();
  15. t.string("Modelo", 100).nullable();
  16. t.bigInteger("UltimaMensagemId").unsigned().nullable(); // última mensagem considerada; avaliação fica pendente de novo se chegarem mensagens mais novas
  17. t.integer("TotalMensagens").unsigned().nullable();
  18. t.timestamp("CreatedAt").notNullable().defaultTo(knex.fn.now());
  19. t.timestamp("UpdatedAt").notNullable().defaultTo(knex.fn.now());
  20. t.foreign("AtendimentoId").references("atendimentos.Id").onDelete("CASCADE");
  21. t.index(["ScoreAtendente"]);
  22. t.index(["Resolvido"]);
  23. t.index(["Sentimento"]);
  24. });
  25. };
  26. exports.down = function (knex) {
  27. return knex.schema.dropTable("atendimento_avaliacoes");
  28. };