migrations_v1.sql 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. -- ----------------------------------------------------------------
  2. -- 1. CORE ENTITIES
  3. -- ----------------------------------------------------------------
  4. CREATE TABLE company (
  5. company_id SERIAL PRIMARY KEY,
  6. company_name VARCHAR(100) NOT NULL,
  7. company_cnpj VARCHAR(14) NOT NULL UNIQUE,
  8. company_logo TEXT NOT NULL,
  9. company_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  10. company_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity'
  11. );
  12. CREATE TABLE "user" (
  13. user_id SERIAL PRIMARY KEY,
  14. company_id INT NOT NULL,
  15. user_name VARCHAR(100) NOT NULL,
  16. user_phone VARCHAR(20) NOT NULL,
  17. user_email VARCHAR(100) NOT NULL UNIQUE,
  18. user_role VARCHAR(10) NOT NULL,
  19. user_password VARCHAR(255) NOT NULL,
  20. user_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  21. user_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  22. CONSTRAINT fk_users_company FOREIGN KEY (company_id) REFERENCES company(company_id)
  23. );
  24. CREATE TABLE operator (
  25. operator_id SERIAL PRIMARY KEY,
  26. company_id INT NOT NULL,
  27. operator_name VARCHAR(100) NOT NULL,
  28. operator_initials VARCHAR(5) NOT NULL,
  29. operator_email VARCHAR(100) NOT NULL,
  30. operator_phone VARCHAR(20) NOT NULL,
  31. operator_department VARCHAR(20) NOT NULL,
  32. operator_status VARCHAR(30) NOT NULL DEFAULT 'Disponível',
  33. operator_available_for_escalation BOOLEAN NOT NULL DEFAULT TRUE,
  34. operator_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  35. operator_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  36. CONSTRAINT fk_operators_company FOREIGN KEY (company_id) REFERENCES company(company_id)
  37. );
  38. CREATE TABLE operator_channel (
  39. operator_channel_id SERIAL PRIMARY KEY,
  40. operator_id INT NOT NULL,
  41. operator_channel VARCHAR(20) NOT NULL,
  42. operator_channel_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  43. operator_channel_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  44. CONSTRAINT fk_op_channel_operator FOREIGN KEY (operator_id) REFERENCES operator(operator_id)
  45. );
  46. CREATE TABLE sla_config (
  47. sla_config_id SERIAL PRIMARY KEY,
  48. company_id INT NOT NULL,
  49. sla_config_department VARCHAR(20) NOT NULL,
  50. sla_config_response_hours INT NOT NULL DEFAULT 2,
  51. sla_config_resolution_hours INT NOT NULL DEFAULT 24,
  52. sla_config_updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
  53. sla_config_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  54. CONSTRAINT fk_sla_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  55. CONSTRAINT uq_sla_dept UNIQUE (company_id, sla_config_department)
  56. );
  57. CREATE TABLE sku (
  58. sku_id SERIAL PRIMARY KEY,
  59. company_id INT NOT NULL,
  60. sku_name VARCHAR(100) NOT NULL,
  61. sku_value DECIMAL(12,2) NOT NULL,
  62. sku_sold INT NOT NULL DEFAULT 0,
  63. sku_line VARCHAR(50) NOT NULL,
  64. sku_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  65. sku_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  66. CONSTRAINT fk_skus_company FOREIGN KEY (company_id) REFERENCES company(company_id)
  67. );
  68. CREATE TABLE integration (
  69. integration_id SERIAL PRIMARY KEY,
  70. company_id INT NOT NULL,
  71. integration_provider VARCHAR(30) NOT NULL,
  72. integration_account_id TEXT NOT NULL,
  73. integration_external_account_id TEXT NOT NULL,
  74. integration_account_name VARCHAR(100) NOT NULL,
  75. integration_status VARCHAR(20) NOT NULL,
  76. integration_access_token TEXT NOT NULL,
  77. integration_refresh_token TEXT NOT NULL,
  78. integration_is_connected BOOLEAN NOT NULL DEFAULT TRUE,
  79. integration_last_sync_at TIMESTAMP NOT NULL,
  80. integration_last_error TEXT NOT NULL,
  81. integration_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  82. integration_updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
  83. integration_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  84. CONSTRAINT fk_integrations_company FOREIGN KEY (company_id) REFERENCES company(company_id)
  85. );
  86. -- ----------------------------------------------------------------
  87. -- 2. CLIENTS & CONVERSATIONS
  88. -- ----------------------------------------------------------------
  89. CREATE TABLE client (
  90. client_id SERIAL PRIMARY KEY,
  91. company_id INT NOT NULL,
  92. client_provider_id TEXT NOT NULL,
  93. client_phone VARCHAR(20) NOT NULL,
  94. client_name VARCHAR(100) NOT NULL,
  95. client_email VARCHAR(100) NOT NULL,
  96. client_segment VARCHAR(100) NOT NULL,
  97. client_is_registered BOOLEAN NOT NULL DEFAULT FALSE,
  98. client_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  99. client_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  100. CONSTRAINT fk_clients_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  101. CONSTRAINT uq_client_phone_company UNIQUE (company_id, client_phone)
  102. );
  103. CREATE TABLE conversation (
  104. conversation_id SERIAL PRIMARY KEY,
  105. company_id INT NOT NULL,
  106. integration_id INT NOT NULL,
  107. operator_id INT NOT NULL,
  108. client_id INT NOT NULL,
  109. conversation_external_id TEXT NOT NULL,
  110. conversation_provider_id TEXT NOT NULL,
  111. conversation_channel VARCHAR(20) NOT NULL,
  112. conversation_status VARCHAR(20) NOT NULL DEFAULT 'open',
  113. conversation_is_automated BOOLEAN NOT NULL DEFAULT FALSE,
  114. conversation_started_at TIMESTAMP NOT NULL DEFAULT NOW(),
  115. conversation_closed_at TIMESTAMP NOT NULL,
  116. conversation_sla_deadline TIMESTAMP NOT NULL,
  117. conversation_last_message_at TIMESTAMP NOT NULL,
  118. conversation_last_message_preview TEXT NOT NULL,
  119. conversation_last_message_from VARCHAR(10) NOT NULL,
  120. conversation_impact_value DECIMAL(12,2) NOT NULL,
  121. conversation_ticket_value DECIMAL(12,2) NOT NULL,
  122. conversation_conversion_chance INT NOT NULL,
  123. conversation_optimum_window VARCHAR(20) NOT NULL,
  124. conversation_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  125. CONSTRAINT fk_conv_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  126. CONSTRAINT fk_conv_integration FOREIGN KEY (integration_id) REFERENCES integration(integration_id),
  127. CONSTRAINT fk_conv_operator FOREIGN KEY (operator_id) REFERENCES operator(operator_id),
  128. CONSTRAINT fk_conv_client FOREIGN KEY (client_id) REFERENCES client(client_id)
  129. );
  130. CREATE TABLE message (
  131. message_id SERIAL PRIMARY KEY,
  132. conversation_id INT NOT NULL,
  133. quoted_message_id INT NOT NULL,
  134. message_external_id TEXT NOT NULL,
  135. message_provider_id TEXT NOT NULL,
  136. message_sender_provider_id TEXT NOT NULL,
  137. message_is_operator BOOLEAN NOT NULL,
  138. message_type VARCHAR(20) NOT NULL DEFAULT 'text',
  139. message_content TEXT NOT NULL,
  140. message_seen BOOLEAN NOT NULL,
  141. message_delivered BOOLEAN NOT NULL,
  142. message_edited BOOLEAN NOT NULL DEFAULT FALSE,
  143. message_deleted BOOLEAN NOT NULL DEFAULT FALSE,
  144. message_hidden BOOLEAN NOT NULL DEFAULT FALSE,
  145. message_is_event BOOLEAN NOT NULL DEFAULT FALSE,
  146. message_event_type INT NOT NULL,
  147. message_sent_at TIMESTAMP NOT NULL DEFAULT NOW(),
  148. message_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  149. CONSTRAINT fk_msg_conversation FOREIGN KEY (conversation_id) REFERENCES conversation(conversation_id),
  150. CONSTRAINT fk_quoted_message FOREIGN KEY (quoted_message_id) REFERENCES message(message_id)
  151. );
  152. CREATE TABLE message_attachment (
  153. attachment_id SERIAL PRIMARY KEY,
  154. message_id INT NOT NULL,
  155. attachment_external_id TEXT NOT NULL,
  156. attachment_url TEXT NOT NULL,
  157. attachment_type VARCHAR(50) NOT NULL,
  158. attachment_mime_type VARCHAR(100) NOT NULL,
  159. attachment_file_name VARCHAR(255) NOT NULL,
  160. attachment_size BIGINT NOT NULL,
  161. attachment_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  162. attachment_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  163. CONSTRAINT fk_attachment_message FOREIGN KEY (message_id) REFERENCES message(message_id)
  164. );
  165. CREATE TABLE message_reaction (
  166. reaction_id SERIAL PRIMARY KEY,
  167. message_id INT NOT NULL,
  168. reaction_sender_provider_id TEXT NOT NULL,
  169. reaction_value VARCHAR(20) NOT NULL,
  170. reaction_is_sender BOOLEAN NOT NULL DEFAULT FALSE,
  171. reaction_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  172. reaction_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  173. CONSTRAINT fk_reaction_message FOREIGN KEY (message_id) REFERENCES message(message_id)
  174. );
  175. CREATE TABLE conversation_participant (
  176. participant_id SERIAL PRIMARY KEY,
  177. conversation_id INT NOT NULL,
  178. participant_provider_id TEXT NOT NULL,
  179. participant_name VARCHAR(100) NOT NULL,
  180. participant_is_admin BOOLEAN NOT NULL DEFAULT FALSE,
  181. participant_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  182. participant_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  183. CONSTRAINT fk_participant_conversation FOREIGN KEY (conversation_id) REFERENCES conversation(conversation_id)
  184. );
  185. CREATE TABLE webhook_event (
  186. webhook_event_id SERIAL PRIMARY KEY,
  187. integration_id INT NOT NULL,
  188. webhook_event_type VARCHAR(50) NOT NULL,
  189. webhook_event_external_id TEXT NOT NULL,
  190. webhook_event_payload JSONB NOT NULL,
  191. webhook_event_processed BOOLEAN NOT NULL DEFAULT FALSE,
  192. webhook_event_received_at TIMESTAMP NOT NULL DEFAULT NOW(),
  193. webhook_event_processed_at TIMESTAMP NOT NULL,
  194. webhook_event_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  195. CONSTRAINT fk_webhook_integration FOREIGN KEY (integration_id) REFERENCES integration(integration_id)
  196. );
  197. -- ----------------------------------------------------------------
  198. -- 3. AI-PROCESSED DATA
  199. -- ----------------------------------------------------------------
  200. CREATE TABLE conversation_analysis (
  201. analysis_id SERIAL PRIMARY KEY,
  202. conversation_id INT NOT NULL UNIQUE,
  203. company_id INT NOT NULL,
  204. conversation_analysis_sentiment VARCHAR(20) NOT NULL,
  205. conversation_analysis_sentiment_score NUMERIC(3,2) NOT NULL,
  206. conversation_analysis_aspect VARCHAR(50) NOT NULL,
  207. conversation_analysis_sub_aspect VARCHAR(100) NOT NULL,
  208. conversation_analysis_analyzed_at TIMESTAMP NOT NULL DEFAULT NOW(),
  209. conversation_analysis_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  210. CONSTRAINT fk_analysis_conv FOREIGN KEY (conversation_id) REFERENCES conversation(conversation_id),
  211. CONSTRAINT fk_analysis_company FOREIGN KEY (company_id) REFERENCES company(company_id)
  212. );
  213. CREATE TABLE aspect_feedback (
  214. aspect_feedback_id SERIAL PRIMARY KEY,
  215. company_id INT NOT NULL,
  216. conversation_id INT NOT NULL,
  217. aspect_feedback_aspect VARCHAR(50) NOT NULL,
  218. aspect_feedback_sentiment VARCHAR(20) NOT NULL,
  219. aspect_feedback_text TEXT NOT NULL,
  220. aspect_feedback_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  221. aspect_feedback_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  222. CONSTRAINT fk_af_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  223. CONSTRAINT fk_af_conv FOREIGN KEY (conversation_id) REFERENCES conversation(conversation_id)
  224. );
  225. CREATE TABLE emotion_snapshot (
  226. emotion_id SERIAL PRIMARY KEY,
  227. company_id INT NOT NULL,
  228. emotion_snapshot_date DATE NOT NULL,
  229. emotion_happiness NUMERIC(5,2) NOT NULL DEFAULT 0,
  230. emotion_sadness NUMERIC(5,2) NOT NULL DEFAULT 0,
  231. emotion_anger NUMERIC(5,2) NOT NULL DEFAULT 0,
  232. emotion_fear NUMERIC(5,2) NOT NULL DEFAULT 0,
  233. emotion_anticipation NUMERIC(5,2) NOT NULL DEFAULT 0,
  234. emotion_confidence NUMERIC(5,2) NOT NULL DEFAULT 0,
  235. emotion_surprise NUMERIC(5,2) NOT NULL DEFAULT 0,
  236. emotion_total_analyzed INT NOT NULL DEFAULT 0,
  237. CONSTRAINT fk_emotion_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  238. CONSTRAINT uq_emotion_date UNIQUE (company_id, emotion_snapshot_date)
  239. );
  240. CREATE TABLE public_opinion (
  241. opinion_id SERIAL PRIMARY KEY,
  242. company_id INT NOT NULL,
  243. conversation_id INT NOT NULL,
  244. opinion_is_positive BOOLEAN NOT NULL,
  245. opinion_classified_at TIMESTAMP NOT NULL DEFAULT NOW(),
  246. opinion_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  247. CONSTRAINT fk_opinion_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  248. CONSTRAINT fk_opinion_conv FOREIGN KEY (conversation_id) REFERENCES conversation(conversation_id)
  249. );
  250. CREATE TABLE alert (
  251. alert_id SERIAL PRIMARY KEY,
  252. company_id INT NOT NULL,
  253. client_id INT NOT NULL,
  254. alert_type VARCHAR(20) NOT NULL,
  255. alert_priority VARCHAR(10) NOT NULL,
  256. alert_title TEXT NOT NULL,
  257. alert_description TEXT NOT NULL,
  258. alert_tips TEXT NOT NULL,
  259. alert_is_resolved BOOLEAN NOT NULL DEFAULT FALSE,
  260. alert_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  261. alert_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  262. CONSTRAINT fk_alert_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  263. CONSTRAINT fk_alert_client FOREIGN KEY (client_id) REFERENCES client(client_id)
  264. );
  265. CREATE TABLE ai_action (
  266. ai_action_id SERIAL PRIMARY KEY,
  267. company_id INT NOT NULL,
  268. ai_action_idea TEXT NOT NULL,
  269. ai_action_is_accepted BOOLEAN NOT NULL,
  270. ai_action_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  271. ai_action_responded_at TIMESTAMP NOT NULL,
  272. ai_action_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  273. CONSTRAINT fk_ai_action_company FOREIGN KEY (company_id) REFERENCES company(company_id)
  274. );
  275. -- ----------------------------------------------------------------
  276. -- 4. PERSONAS & STRATEGIES
  277. -- ----------------------------------------------------------------
  278. CREATE TABLE persona (
  279. persona_id SERIAL PRIMARY KEY,
  280. company_id INT NOT NULL,
  281. persona_name VARCHAR(100) NOT NULL,
  282. persona_type VARCHAR(50) NOT NULL DEFAULT 'O PERFIL',
  283. persona_description TEXT NOT NULL,
  284. persona_details TEXT NOT NULL,
  285. persona_risk_level VARCHAR(10) NOT NULL DEFAULT 'Médio',
  286. persona_churn_risk_pct NUMERIC(5,2) NOT NULL,
  287. persona_expansion_potential VARCHAR(20) NOT NULL,
  288. persona_expansion_strategy TEXT NOT NULL,
  289. persona_engagement_strategy TEXT NOT NULL,
  290. persona_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  291. persona_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  292. CONSTRAINT fk_personas_company FOREIGN KEY (company_id) REFERENCES company(company_id)
  293. );
  294. CREATE TABLE client_persona (
  295. client_persona_id SERIAL PRIMARY KEY,
  296. client_id INT NOT NULL,
  297. persona_id INT NOT NULL,
  298. client_persona_assigned_at TIMESTAMP NOT NULL DEFAULT NOW(),
  299. client_persona_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  300. CONSTRAINT fk_cp_client FOREIGN KEY (client_id) REFERENCES client(client_id),
  301. CONSTRAINT fk_cp_persona FOREIGN KEY (persona_id) REFERENCES persona(persona_id)
  302. );
  303. CREATE TABLE best_action (
  304. best_action_id SERIAL PRIMARY KEY,
  305. company_id INT NOT NULL,
  306. persona_id INT NOT NULL,
  307. best_action_type VARCHAR(20) NOT NULL,
  308. best_action_idea TEXT NOT NULL,
  309. best_action_created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  310. best_action_deleted_at TIMESTAMP NOT NULL DEFAULT 'infinity',
  311. CONSTRAINT fk_ba_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  312. CONSTRAINT fk_ba_persona FOREIGN KEY (persona_id) REFERENCES persona(persona_id)
  313. );
  314. -- ----------------------------------------------------------------
  315. -- 5. TIME-SERIES / SNAPSHOTS
  316. -- ----------------------------------------------------------------
  317. CREATE TABLE volume_snapshot (
  318. volume_id SERIAL PRIMARY KEY,
  319. company_id INT NOT NULL,
  320. volume_snapshot_date DATE NOT NULL,
  321. volume_channel VARCHAR(20) NOT NULL,
  322. volume_message_count INT NOT NULL DEFAULT 0,
  323. volume_conversation_count INT NOT NULL DEFAULT 0,
  324. CONSTRAINT fk_volume_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  325. CONSTRAINT uq_volume_date_channel UNIQUE (company_id, volume_snapshot_date, volume_channel)
  326. );
  327. CREATE TABLE sentiment_evolution (
  328. evolution_id SERIAL PRIMARY KEY,
  329. company_id INT NOT NULL,
  330. evolution_snapshot_date DATE NOT NULL,
  331. evolution_sentiment_score NUMERIC(3,2) NOT NULL,
  332. CONSTRAINT fk_evo_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  333. CONSTRAINT uq_evo_date UNIQUE (company_id, evolution_snapshot_date)
  334. );
  335. CREATE TABLE playbooks_monitor (
  336. playbook_id SERIAL PRIMARY KEY,
  337. company_id INT NOT NULL,
  338. playbook_snapshot_date DATE NOT NULL,
  339. playbook_new_detected INT NOT NULL DEFAULT 0,
  340. playbook_converted INT NOT NULL DEFAULT 0,
  341. playbook_client_type VARCHAR(10) NOT NULL DEFAULT 'new',
  342. CONSTRAINT fk_pb_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  343. CONSTRAINT uq_pb_date UNIQUE (company_id, playbook_snapshot_date)
  344. );
  345. CREATE TABLE operator_daily_stats (
  346. stat_id SERIAL PRIMARY KEY,
  347. company_id INT NOT NULL,
  348. operator_id INT NOT NULL,
  349. operator_stat_date DATE NOT NULL,
  350. operator_attendances_count INT NOT NULL DEFAULT 0,
  351. operator_avg_response_seconds INT NOT NULL DEFAULT 0,
  352. operator_sla_compliance_pct NUMERIC(5,2) NOT NULL DEFAULT 0,
  353. operator_sales_amount DECIMAL(12,2) NOT NULL DEFAULT 0,
  354. CONSTRAINT fk_stats_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  355. CONSTRAINT fk_stats_operator FOREIGN KEY (operator_id) REFERENCES operator(operator_id),
  356. CONSTRAINT uq_stats_op_date UNIQUE (operator_id, operator_stat_date)
  357. );
  358. CREATE TABLE kpi_snapshot (
  359. kpi_id SERIAL PRIMARY KEY,
  360. company_id INT NOT NULL,
  361. kpi_snapshot_date DATE NOT NULL,
  362. kpi_current_sales DECIMAL(12,2) NOT NULL DEFAULT 0,
  363. kpi_avg_ticket DECIMAL(12,2) NOT NULL DEFAULT 0,
  364. kpi_lifetime_at_risk DECIMAL(12,2) NOT NULL DEFAULT 0,
  365. kpi_critical_risk_clients INT NOT NULL DEFAULT 0,
  366. kpi_sla_compliance_pct NUMERIC(5,2) NOT NULL DEFAULT 0,
  367. kpi_churn_low_pct NUMERIC(5,2) NOT NULL DEFAULT 0,
  368. kpi_churn_moderate_pct NUMERIC(5,2) NOT NULL DEFAULT 0,
  369. kpi_churn_high_pct NUMERIC(5,2) NOT NULL DEFAULT 0,
  370. kpi_churn_critical_pct NUMERIC(5,2) NOT NULL DEFAULT 0,
  371. kpi_ltv_total DECIMAL(12,2) NOT NULL DEFAULT 0,
  372. kpi_ltv_at_risk DECIMAL(12,2) NOT NULL DEFAULT 0,
  373. kpi_total_registered_clients INT NOT NULL DEFAULT 0,
  374. kpi_total_active_operators INT NOT NULL DEFAULT 0,
  375. kpi_general_emotion VARCHAR(20) NOT NULL,
  376. CONSTRAINT fk_kpi_company FOREIGN KEY (company_id) REFERENCES company(company_id),
  377. CONSTRAINT uq_kpi_date UNIQUE (company_id, kpi_snapshot_date)
  378. );