migrations_v1.sql 23 KB

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