elevenlabs-webhook-nodejs 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (969) hide show
  1. package/.claude/settings.local.json +27 -0
  2. package/.dockerignore +6 -0
  3. package/.env.example +43 -0
  4. package/BEFORE-PRODUCTION.md +32 -0
  5. package/Dockerfile +23 -0
  6. package/SYSTEM_OVERVIEW.md +942 -0
  7. package/SYSTEM_STATUS.md +332 -0
  8. package/backup_script/main.py +146 -0
  9. package/baileys/.dockerignore +7 -0
  10. package/baileys/Dockerfile +13 -0
  11. package/baileys/README.md +412 -0
  12. package/baileys/index.js +499 -0
  13. package/baileys/package-lock.json +2532 -0
  14. package/baileys/package.json +25 -0
  15. package/baileys/server.js +96 -0
  16. package/baileys/src/config.js +55 -0
  17. package/baileys/src/middleware/api-key.js +16 -0
  18. package/baileys/src/routes/accounts.js +51 -0
  19. package/baileys/src/routes/chats.js +103 -0
  20. package/baileys/src/routes/webhooks.js +34 -0
  21. package/baileys/src/services/account-store.js +259 -0
  22. package/baileys/src/services/webhook-dispatcher.js +161 -0
  23. package/baileys/src/services/worker-manager.js +597 -0
  24. package/baileys/src/utils/jid.js +79 -0
  25. package/baileys/src/utils/logger.js +16 -0
  26. package/baileys/src/utils/use-mongodb-auth-state.js +122 -0
  27. package/baileys/worker.js +721 -0
  28. package/dist/app.d.ts +1 -0
  29. package/dist/app.js +84 -0
  30. package/dist/app.js.map +1 -0
  31. package/dist/config/agentPrompts.json +19 -0
  32. package/dist/config/database.d.ts +1 -0
  33. package/dist/config/database.js +26 -0
  34. package/dist/config/database.js.map +1 -0
  35. package/dist/config/env.d.ts +41 -0
  36. package/dist/config/env.js +81 -0
  37. package/dist/config/env.js.map +1 -0
  38. package/dist/config/index.d.ts +3 -0
  39. package/dist/config/index.js +73 -0
  40. package/dist/config/index.js.map +1 -0
  41. package/dist/controllers/webhook.controller.d.ts +10 -0
  42. package/dist/controllers/webhook.controller.js +128 -0
  43. package/dist/controllers/webhook.controller.js.map +1 -0
  44. package/dist/errors/index.d.ts +4 -0
  45. package/dist/errors/index.js +13 -0
  46. package/dist/errors/index.js.map +1 -0
  47. package/dist/hooks/webhookValidator.d.ts +2 -0
  48. package/dist/hooks/webhookValidator.js +47 -0
  49. package/dist/hooks/webhookValidator.js.map +1 -0
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.js +55 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/migrations/001_session-architecture.d.ts +3 -0
  54. package/dist/migrations/001_session-architecture.js +119 -0
  55. package/dist/migrations/001_session-architecture.js.map +1 -0
  56. package/dist/migrations/002_agent-ref.d.ts +3 -0
  57. package/dist/migrations/002_agent-ref.js +55 -0
  58. package/dist/migrations/002_agent-ref.js.map +1 -0
  59. package/dist/migrations/003_shift-schedule.d.ts +3 -0
  60. package/dist/migrations/003_shift-schedule.js +48 -0
  61. package/dist/migrations/003_shift-schedule.js.map +1 -0
  62. package/dist/migrations/004_invert-shift-to-clinic-hours.d.ts +3 -0
  63. package/dist/migrations/004_invert-shift-to-clinic-hours.js +27 -0
  64. package/dist/migrations/004_invert-shift-to-clinic-hours.js.map +1 -0
  65. package/dist/migrations/005_composite-baileys-chat-ids.d.ts +3 -0
  66. package/dist/migrations/005_composite-baileys-chat-ids.js +47 -0
  67. package/dist/migrations/005_composite-baileys-chat-ids.js.map +1 -0
  68. package/dist/migrations/migration.model.d.ts +18 -0
  69. package/dist/migrations/migration.model.js +45 -0
  70. package/dist/migrations/migration.model.js.map +1 -0
  71. package/dist/migrations/migration.routes.d.ts +2 -0
  72. package/dist/migrations/migration.routes.js +37 -0
  73. package/dist/migrations/migration.routes.js.map +1 -0
  74. package/dist/migrations/migration.runner.d.ts +19 -0
  75. package/dist/migrations/migration.runner.js +74 -0
  76. package/dist/migrations/migration.runner.js.map +1 -0
  77. package/dist/models/ConversationClaim.d.ts +13 -0
  78. package/dist/models/ConversationClaim.js +44 -0
  79. package/dist/models/ConversationClaim.js.map +1 -0
  80. package/dist/models/ConversationEvaluation.d.ts +23 -0
  81. package/dist/models/ConversationEvaluation.js +92 -0
  82. package/dist/models/ConversationEvaluation.js.map +1 -0
  83. package/dist/models/Summary.d.ts +37 -0
  84. package/dist/models/Summary.js +78 -0
  85. package/dist/models/Summary.js.map +1 -0
  86. package/dist/models/Transcription.d.ts +34 -0
  87. package/dist/models/Transcription.js +71 -0
  88. package/dist/models/Transcription.js.map +1 -0
  89. package/dist/models/WhatsAppRecipient.d.ts +23 -0
  90. package/dist/models/WhatsAppRecipient.js +53 -0
  91. package/dist/models/WhatsAppRecipient.js.map +1 -0
  92. package/dist/modules/admin/admin.routes.d.ts +2 -0
  93. package/dist/modules/admin/admin.routes.js +1966 -0
  94. package/dist/modules/admin/admin.routes.js.map +1 -0
  95. package/dist/modules/admin/elevenlabs-test-chat.routes.d.ts +2 -0
  96. package/dist/modules/admin/elevenlabs-test-chat.routes.js +158 -0
  97. package/dist/modules/admin/elevenlabs-test-chat.routes.js.map +1 -0
  98. package/dist/modules/admin/whatsapp-test-chat.routes.d.ts +2 -0
  99. package/dist/modules/admin/whatsapp-test-chat.routes.js +204 -0
  100. package/dist/modules/admin/whatsapp-test-chat.routes.js.map +1 -0
  101. package/dist/modules/agents/agent.model.d.ts +38 -0
  102. package/dist/modules/agents/agent.model.js +92 -0
  103. package/dist/modules/agents/agent.model.js.map +1 -0
  104. package/dist/modules/agents/agent.routes.d.ts +2 -0
  105. package/dist/modules/agents/agent.routes.js +61 -0
  106. package/dist/modules/agents/agent.routes.js.map +1 -0
  107. package/dist/modules/appointment-validation/appointment-validation.model.d.ts +76 -0
  108. package/dist/modules/appointment-validation/appointment-validation.model.js +118 -0
  109. package/dist/modules/appointment-validation/appointment-validation.model.js.map +1 -0
  110. package/dist/modules/appointment-validation/appointment-validation.routes.d.ts +2 -0
  111. package/dist/modules/appointment-validation/appointment-validation.routes.js +202 -0
  112. package/dist/modules/appointment-validation/appointment-validation.routes.js.map +1 -0
  113. package/dist/modules/appointment-validation/appointment-validation.service.d.ts +53 -0
  114. package/dist/modules/appointment-validation/appointment-validation.service.js +827 -0
  115. package/dist/modules/appointment-validation/appointment-validation.service.js.map +1 -0
  116. package/dist/modules/auth/auth.model.d.ts +17 -0
  117. package/dist/modules/auth/auth.model.js +64 -0
  118. package/dist/modules/auth/auth.model.js.map +1 -0
  119. package/dist/modules/auth/auth.routes.d.ts +2 -0
  120. package/dist/modules/auth/auth.routes.js +202 -0
  121. package/dist/modules/auth/auth.routes.js.map +1 -0
  122. package/dist/modules/auth/auth.service.d.ts +28 -0
  123. package/dist/modules/auth/auth.service.js +183 -0
  124. package/dist/modules/auth/auth.service.js.map +1 -0
  125. package/dist/modules/auth/refresh-token.model.d.ts +13 -0
  126. package/dist/modules/auth/refresh-token.model.js +52 -0
  127. package/dist/modules/auth/refresh-token.model.js.map +1 -0
  128. package/dist/modules/billing/billing-alert.model.d.ts +16 -0
  129. package/dist/modules/billing/billing-alert.model.js +47 -0
  130. package/dist/modules/billing/billing-alert.model.js.map +1 -0
  131. package/dist/modules/billing/billing-period-snapshot.model.d.ts +35 -0
  132. package/dist/modules/billing/billing-period-snapshot.model.js +68 -0
  133. package/dist/modules/billing/billing-period-snapshot.model.js.map +1 -0
  134. package/dist/modules/billing/billing.model.d.ts +18 -0
  135. package/dist/modules/billing/billing.model.js +62 -0
  136. package/dist/modules/billing/billing.model.js.map +1 -0
  137. package/dist/modules/billing/billing.routes.d.ts +2 -0
  138. package/dist/modules/billing/billing.routes.js +63 -0
  139. package/dist/modules/billing/billing.routes.js.map +1 -0
  140. package/dist/modules/billing/billing.service.d.ts +69 -0
  141. package/dist/modules/billing/billing.service.js +498 -0
  142. package/dist/modules/billing/billing.service.js.map +1 -0
  143. package/dist/modules/billing/payment.model.d.ts +24 -0
  144. package/dist/modules/billing/payment.model.js +57 -0
  145. package/dist/modules/billing/payment.model.js.map +1 -0
  146. package/dist/modules/calls/call.model.d.ts +41 -0
  147. package/dist/modules/calls/call.model.js +97 -0
  148. package/dist/modules/calls/call.model.js.map +1 -0
  149. package/dist/modules/calls/call.routes.d.ts +2 -0
  150. package/dist/modules/calls/call.routes.js +103 -0
  151. package/dist/modules/calls/call.routes.js.map +1 -0
  152. package/dist/modules/campaigns/campaign.model.d.ts +45 -0
  153. package/dist/modules/campaigns/campaign.model.js +98 -0
  154. package/dist/modules/campaigns/campaign.model.js.map +1 -0
  155. package/dist/modules/campaigns/campaign.routes.d.ts +2 -0
  156. package/dist/modules/campaigns/campaign.routes.js +323 -0
  157. package/dist/modules/campaigns/campaign.routes.js.map +1 -0
  158. package/dist/modules/campaigns/campaign.service.d.ts +11 -0
  159. package/dist/modules/campaigns/campaign.service.js +86 -0
  160. package/dist/modules/campaigns/campaign.service.js.map +1 -0
  161. package/dist/modules/google-calendar/google-calendar.routes.d.ts +2 -0
  162. package/dist/modules/google-calendar/google-calendar.routes.js +32 -0
  163. package/dist/modules/google-calendar/google-calendar.routes.js.map +1 -0
  164. package/dist/modules/inbound-call/inbound-call-config.model.d.ts +20 -0
  165. package/dist/modules/inbound-call/inbound-call-config.model.js +68 -0
  166. package/dist/modules/inbound-call/inbound-call-config.model.js.map +1 -0
  167. package/dist/modules/inbound-call/inbound-call.routes.d.ts +2 -0
  168. package/dist/modules/inbound-call/inbound-call.routes.js +243 -0
  169. package/dist/modules/inbound-call/inbound-call.routes.js.map +1 -0
  170. package/dist/modules/leads/lead.model.d.ts +24 -0
  171. package/dist/modules/leads/lead.model.js +54 -0
  172. package/dist/modules/leads/lead.model.js.map +1 -0
  173. package/dist/modules/leads/lead.routes.d.ts +2 -0
  174. package/dist/modules/leads/lead.routes.js +201 -0
  175. package/dist/modules/leads/lead.routes.js.map +1 -0
  176. package/dist/modules/plans/plan.model.d.ts +25 -0
  177. package/dist/modules/plans/plan.model.js +59 -0
  178. package/dist/modules/plans/plan.model.js.map +1 -0
  179. package/dist/modules/surveys/survey.model.d.ts +30 -0
  180. package/dist/modules/surveys/survey.model.js +75 -0
  181. package/dist/modules/surveys/survey.model.js.map +1 -0
  182. package/dist/modules/surveys/survey.routes.d.ts +2 -0
  183. package/dist/modules/surveys/survey.routes.js +153 -0
  184. package/dist/modules/surveys/survey.routes.js.map +1 -0
  185. package/dist/modules/tenants/tenant.model.d.ts +86 -0
  186. package/dist/modules/tenants/tenant.model.js +127 -0
  187. package/dist/modules/tenants/tenant.model.js.map +1 -0
  188. package/dist/modules/tenants/tenant.routes.d.ts +2 -0
  189. package/dist/modules/tenants/tenant.routes.js +65 -0
  190. package/dist/modules/tenants/tenant.routes.js.map +1 -0
  191. package/dist/modules/users/user.routes.d.ts +2 -0
  192. package/dist/modules/users/user.routes.js +106 -0
  193. package/dist/modules/users/user.routes.js.map +1 -0
  194. package/dist/modules/webhooks/elevenlabs-tool.routes.d.ts +20 -0
  195. package/dist/modules/webhooks/elevenlabs-tool.routes.js +85 -0
  196. package/dist/modules/webhooks/elevenlabs-tool.routes.js.map +1 -0
  197. package/dist/modules/webhooks/elevenlabs-tool.service.d.ts +11 -0
  198. package/dist/modules/webhooks/elevenlabs-tool.service.js +360 -0
  199. package/dist/modules/webhooks/elevenlabs-tool.service.js.map +1 -0
  200. package/dist/modules/webhooks/elevenlabs.routes.d.ts +2 -0
  201. package/dist/modules/webhooks/elevenlabs.routes.js +34 -0
  202. package/dist/modules/webhooks/elevenlabs.routes.js.map +1 -0
  203. package/dist/modules/webhooks/elevenlabs.service.d.ts +6 -0
  204. package/dist/modules/webhooks/elevenlabs.service.js +512 -0
  205. package/dist/modules/webhooks/elevenlabs.service.js.map +1 -0
  206. package/dist/modules/webhooks/unipile.routes.d.ts +2 -0
  207. package/dist/modules/webhooks/unipile.routes.js +780 -0
  208. package/dist/modules/webhooks/unipile.routes.js.map +1 -0
  209. package/dist/modules/whatsapp/appointment.model.d.ts +27 -0
  210. package/dist/modules/whatsapp/appointment.model.js +58 -0
  211. package/dist/modules/whatsapp/appointment.model.js.map +1 -0
  212. package/dist/modules/whatsapp/operator-request.model.d.ts +29 -0
  213. package/dist/modules/whatsapp/operator-request.model.js +65 -0
  214. package/dist/modules/whatsapp/operator-request.model.js.map +1 -0
  215. package/dist/modules/whatsapp/stt-usage.model.d.ts +16 -0
  216. package/dist/modules/whatsapp/stt-usage.model.js +53 -0
  217. package/dist/modules/whatsapp/stt-usage.model.js.map +1 -0
  218. package/dist/modules/whatsapp/whatsapp-chat.model.d.ts +23 -0
  219. package/dist/modules/whatsapp/whatsapp-chat.model.js +55 -0
  220. package/dist/modules/whatsapp/whatsapp-chat.model.js.map +1 -0
  221. package/dist/modules/whatsapp/whatsapp-contact-profile.model.d.ts +23 -0
  222. package/dist/modules/whatsapp/whatsapp-contact-profile.model.js +54 -0
  223. package/dist/modules/whatsapp/whatsapp-contact-profile.model.js.map +1 -0
  224. package/dist/modules/whatsapp/whatsapp-message.model.d.ts +30 -0
  225. package/dist/modules/whatsapp/whatsapp-message.model.js +52 -0
  226. package/dist/modules/whatsapp/whatsapp-message.model.js.map +1 -0
  227. package/dist/modules/whatsapp/whatsapp-session.model.d.ts +33 -0
  228. package/dist/modules/whatsapp/whatsapp-session.model.js +65 -0
  229. package/dist/modules/whatsapp/whatsapp-session.model.js.map +1 -0
  230. package/dist/modules/whatsapp/whatsapp.routes.d.ts +2 -0
  231. package/dist/modules/whatsapp/whatsapp.routes.js +1237 -0
  232. package/dist/modules/whatsapp/whatsapp.routes.js.map +1 -0
  233. package/dist/plugins/cors.d.ts +3 -0
  234. package/dist/plugins/cors.js +11 -0
  235. package/dist/plugins/cors.js.map +1 -0
  236. package/dist/plugins/jwt.d.ts +3 -0
  237. package/dist/plugins/jwt.js +22 -0
  238. package/dist/plugins/jwt.js.map +1 -0
  239. package/dist/plugins/rawBody.d.ts +3 -0
  240. package/dist/plugins/rawBody.js +16 -0
  241. package/dist/plugins/rawBody.js.map +1 -0
  242. package/dist/plugins/rbac.d.ts +5 -0
  243. package/dist/plugins/rbac.js +29 -0
  244. package/dist/plugins/rbac.js.map +1 -0
  245. package/dist/routes/admin.routes.d.ts +2 -0
  246. package/dist/routes/admin.routes.js +169 -0
  247. package/dist/routes/admin.routes.js.map +1 -0
  248. package/dist/routes/health.routes.d.ts +2 -0
  249. package/dist/routes/health.routes.js +16 -0
  250. package/dist/routes/health.routes.js.map +1 -0
  251. package/dist/routes/webhook.routes.d.ts +2 -0
  252. package/dist/routes/webhook.routes.js +17 -0
  253. package/dist/routes/webhook.routes.js.map +1 -0
  254. package/dist/services/ai/base.ai.d.ts +19 -0
  255. package/dist/services/ai/base.ai.js +120 -0
  256. package/dist/services/ai/base.ai.js.map +1 -0
  257. package/dist/services/ai/gemini.service.d.ts +11 -0
  258. package/dist/services/ai/gemini.service.js +43 -0
  259. package/dist/services/ai/gemini.service.js.map +1 -0
  260. package/dist/services/ai/index.d.ts +2 -0
  261. package/dist/services/ai/index.js +26 -0
  262. package/dist/services/ai/index.js.map +1 -0
  263. package/dist/services/ai/openai.service.d.ts +11 -0
  264. package/dist/services/ai/openai.service.js +50 -0
  265. package/dist/services/ai/openai.service.js.map +1 -0
  266. package/dist/services/elevenlabs.service.d.ts +52 -0
  267. package/dist/services/elevenlabs.service.js +447 -0
  268. package/dist/services/elevenlabs.service.js.map +1 -0
  269. package/dist/services/google-calendar.service.d.ts +60 -0
  270. package/dist/services/google-calendar.service.js +494 -0
  271. package/dist/services/google-calendar.service.js.map +1 -0
  272. package/dist/services/inbound-call-schedule.service.d.ts +11 -0
  273. package/dist/services/inbound-call-schedule.service.js +162 -0
  274. package/dist/services/inbound-call-schedule.service.js.map +1 -0
  275. package/dist/services/netgsm.service.d.ts +41 -0
  276. package/dist/services/netgsm.service.js +89 -0
  277. package/dist/services/netgsm.service.js.map +1 -0
  278. package/dist/services/unipile.service.d.ts +41 -0
  279. package/dist/services/unipile.service.js +149 -0
  280. package/dist/services/unipile.service.js.map +1 -0
  281. package/dist/services/whatsapp-agent.service.d.ts +139 -0
  282. package/dist/services/whatsapp-agent.service.js +2055 -0
  283. package/dist/services/whatsapp-agent.service.js.map +1 -0
  284. package/dist/services/whatsapp.service.d.ts +26 -0
  285. package/dist/services/whatsapp.service.js +206 -0
  286. package/dist/services/whatsapp.service.js.map +1 -0
  287. package/dist/templates/index.d.ts +39 -0
  288. package/dist/templates/index.js +35 -0
  289. package/dist/templates/index.js.map +1 -0
  290. package/dist/templates/receptionist.d.ts +2 -0
  291. package/dist/templates/receptionist.js +39 -0
  292. package/dist/templates/receptionist.js.map +1 -0
  293. package/dist/templates/survey.d.ts +2 -0
  294. package/dist/templates/survey.js +41 -0
  295. package/dist/templates/survey.js.map +1 -0
  296. package/dist/types/index.d.ts +173 -0
  297. package/dist/types/index.js +3 -0
  298. package/dist/types/index.js.map +1 -0
  299. package/dist/utils/logger.d.ts +3 -0
  300. package/dist/utils/logger.js +105 -0
  301. package/dist/utils/logger.js.map +1 -0
  302. package/docker-compose.nestjs.yml +89 -0
  303. package/docker-compose.yml +78 -0
  304. package/docs/AI_AGENT_ENHANCEMENT_PLAN.md +164 -0
  305. package/docs/API.md +1193 -0
  306. package/docs/API_ENDPOINTS.md +344 -0
  307. package/docs/ARCHITECTURE.md +305 -0
  308. package/docs/AUTH_API.md +252 -0
  309. package/docs/BILLING_SMS_ALERTS.md +94 -0
  310. package/docs/CHAT_ASSIGNMENT_SYSTEM.md +118 -0
  311. package/docs/CLIENT_TOOLS_AND_FEATURES.md +337 -0
  312. package/docs/ELEVENLABS_WEBHOOK_TOOLS.md +644 -0
  313. package/docs/FRONTEND_CHECKLIST.md +227 -0
  314. package/docs/IMPLEMENTATION_STATUS.md +470 -0
  315. package/docs/MIGRATION_GUIDE.md +96 -0
  316. package/docs/MISSINGS_REPORT.md +507 -0
  317. package/docs/NESTJS_MIGRATION_REFERENCE.md +5136 -0
  318. package/docs/PROJECT_DESCRIPTION.md +1038 -0
  319. package/docs/SCALING.md +148 -0
  320. package/docs/SESSION_SUMMARY_2026_03_17.md +135 -0
  321. package/docs/WHATSAPP_AGENT.md +1086 -0
  322. package/docs/architecture/00-SYSTEM-OVERVIEW.md +318 -0
  323. package/docs/architecture/01-DATABASE-SCHEMA.md +2564 -0
  324. package/docs/architecture/02-AUTHENTICATION.md +1040 -0
  325. package/docs/architecture/03-MULTI-CLINIC.md +742 -0
  326. package/docs/architecture/04-WHATSAPP-AGENT.md +608 -0
  327. package/docs/architecture/05-OPERATOR-WORKFLOW.md +444 -0
  328. package/docs/architecture/06-BAILEYS-MICROSERVICE.md +616 -0
  329. package/docs/architecture/07-APPOINTMENTS.md +849 -0
  330. package/docs/architecture/08-VOICE-CALLS.md +470 -0
  331. package/docs/architecture/09-OUTBOUND-CAMPAIGNS.md +542 -0
  332. package/docs/architecture/10-CLIENT-TOOLS.md +665 -0
  333. package/docs/architecture/11-BILLING.md +458 -0
  334. package/docs/architecture/12-SECURITY.md +216 -0
  335. package/docs/architecture/13-LOGGING-AUDIT.md +549 -0
  336. package/docs/architecture/14-META-BUSINESS-API.md +454 -0
  337. package/docs/architecture/15-AI-MODULE.md +479 -0
  338. package/docs/architecture/16-BACKGROUND-JOBS.md +469 -0
  339. package/docs/architecture/17-REALTIME-LIVECHAT.md +447 -0
  340. package/docs/architecture/18-FILE-STORAGE.md +410 -0
  341. package/docs/architecture/19-PATIENTS.md +1034 -0
  342. package/docs/architecture/20-TREATMENTS-AND-PLANS.md +774 -0
  343. package/docs/architecture/21-BEFORE-AFTER-PHOTOS.md +519 -0
  344. package/docs/database.md +456 -0
  345. package/docs/ornek-randevu-onay.csv +3 -0
  346. package/ecosystem.config.js +16 -0
  347. package/elevenlabs-convai-api-reference.md +1171 -0
  348. package/frontend/.dockerignore +2 -0
  349. package/frontend/Dockerfile +24 -0
  350. package/frontend/README.md +75 -0
  351. package/frontend/components.json +25 -0
  352. package/frontend/eslint.config.js +23 -0
  353. package/frontend/index.html +13 -0
  354. package/frontend/nginx.conf +37 -0
  355. package/frontend/package-lock.json +8709 -0
  356. package/frontend/package.json +71 -0
  357. package/frontend/public/favicon.svg +1 -0
  358. package/frontend/public/icons.svg +24 -0
  359. package/frontend/src/App.tsx +125 -0
  360. package/frontend/src/components/error-boundary.tsx +50 -0
  361. package/frontend/src/components/shared/activity-timeline.tsx +66 -0
  362. package/frontend/src/components/shared/appointment-calendar.css +80 -0
  363. package/frontend/src/components/shared/appointment-calendar.tsx +245 -0
  364. package/frontend/src/components/shared/chat-bubble.tsx +72 -0
  365. package/frontend/src/components/shared/combobox.tsx +119 -0
  366. package/frontend/src/components/shared/confirm-dialog.tsx +57 -0
  367. package/frontend/src/components/shared/data-table-pagination.tsx +97 -0
  368. package/frontend/src/components/shared/data-table-toolbar.tsx +39 -0
  369. package/frontend/src/components/shared/empty-state.tsx +27 -0
  370. package/frontend/src/components/shared/file-upload.tsx +140 -0
  371. package/frontend/src/components/shared/index.ts +20 -0
  372. package/frontend/src/components/shared/language-switcher.tsx +29 -0
  373. package/frontend/src/components/shared/notification-dropdown.tsx +115 -0
  374. package/frontend/src/components/shared/page-header.tsx +23 -0
  375. package/frontend/src/components/shared/stat-card.tsx +37 -0
  376. package/frontend/src/components/shared/status-badge.tsx +70 -0
  377. package/frontend/src/components/shared/status-dot.tsx +43 -0
  378. package/frontend/src/components/ui/alert-dialog.tsx +187 -0
  379. package/frontend/src/components/ui/alert.tsx +76 -0
  380. package/frontend/src/components/ui/avatar.tsx +109 -0
  381. package/frontend/src/components/ui/badge.tsx +52 -0
  382. package/frontend/src/components/ui/breadcrumb.tsx +125 -0
  383. package/frontend/src/components/ui/button.tsx +60 -0
  384. package/frontend/src/components/ui/calendar.tsx +219 -0
  385. package/frontend/src/components/ui/card.tsx +103 -0
  386. package/frontend/src/components/ui/chart.tsx +371 -0
  387. package/frontend/src/components/ui/checkbox.tsx +29 -0
  388. package/frontend/src/components/ui/collapsible.tsx +19 -0
  389. package/frontend/src/components/ui/command.tsx +194 -0
  390. package/frontend/src/components/ui/dialog.tsx +158 -0
  391. package/frontend/src/components/ui/dropdown-menu.tsx +268 -0
  392. package/frontend/src/components/ui/input-group.tsx +156 -0
  393. package/frontend/src/components/ui/input.tsx +20 -0
  394. package/frontend/src/components/ui/label.tsx +20 -0
  395. package/frontend/src/components/ui/pagination.tsx +130 -0
  396. package/frontend/src/components/ui/popover.tsx +90 -0
  397. package/frontend/src/components/ui/progress.tsx +83 -0
  398. package/frontend/src/components/ui/radio-group.tsx +36 -0
  399. package/frontend/src/components/ui/scroll-area.tsx +54 -0
  400. package/frontend/src/components/ui/select.tsx +199 -0
  401. package/frontend/src/components/ui/separator.tsx +23 -0
  402. package/frontend/src/components/ui/sheet.tsx +138 -0
  403. package/frontend/src/components/ui/sidebar.tsx +723 -0
  404. package/frontend/src/components/ui/skeleton.tsx +13 -0
  405. package/frontend/src/components/ui/sonner.tsx +47 -0
  406. package/frontend/src/components/ui/switch.tsx +30 -0
  407. package/frontend/src/components/ui/table.tsx +114 -0
  408. package/frontend/src/components/ui/tabs.tsx +82 -0
  409. package/frontend/src/components/ui/textarea.tsx +18 -0
  410. package/frontend/src/components/ui/toggle-group.tsx +89 -0
  411. package/frontend/src/components/ui/toggle.tsx +43 -0
  412. package/frontend/src/components/ui/tooltip.tsx +64 -0
  413. package/frontend/src/hooks/use-mobile.ts +19 -0
  414. package/frontend/src/i18n/index.ts +20 -0
  415. package/frontend/src/i18n/locales/en.json +786 -0
  416. package/frontend/src/i18n/locales/tr.json +786 -0
  417. package/frontend/src/index.css +134 -0
  418. package/frontend/src/layouts/admin-layout.tsx +111 -0
  419. package/frontend/src/layouts/app-header.tsx +130 -0
  420. package/frontend/src/layouts/app-layout.tsx +19 -0
  421. package/frontend/src/layouts/app-sidebar.tsx +212 -0
  422. package/frontend/src/layouts/auth-guard.tsx +31 -0
  423. package/frontend/src/layouts/mobile-sidebar.tsx +120 -0
  424. package/frontend/src/lib/api.ts +68 -0
  425. package/frontend/src/lib/hooks/use-appointments.ts +224 -0
  426. package/frontend/src/lib/hooks/use-availability-blocks.ts +83 -0
  427. package/frontend/src/lib/hooks/use-chats.ts +236 -0
  428. package/frontend/src/lib/hooks/use-clinic-detail.ts +171 -0
  429. package/frontend/src/lib/hooks/use-clinics.ts +37 -0
  430. package/frontend/src/lib/hooks/use-doctor-calendar.ts +80 -0
  431. package/frontend/src/lib/hooks/use-examinations.ts +89 -0
  432. package/frontend/src/lib/hooks/use-medical-history.ts +52 -0
  433. package/frontend/src/lib/hooks/use-patients.ts +296 -0
  434. package/frontend/src/lib/hooks/use-photo-sets.ts +118 -0
  435. package/frontend/src/lib/hooks/use-treatment-plans.ts +152 -0
  436. package/frontend/src/lib/hooks/use-treatments.ts +125 -0
  437. package/frontend/src/lib/hooks/use-users.ts +172 -0
  438. package/frontend/src/lib/utils.ts +6 -0
  439. package/frontend/src/main.tsx +17 -0
  440. package/frontend/src/pages/admin/agents/detail.tsx +774 -0
  441. package/frontend/src/pages/admin/agents/import.tsx +280 -0
  442. package/frontend/src/pages/admin/agents/index.tsx +245 -0
  443. package/frontend/src/pages/admin/ai-playground.tsx +543 -0
  444. package/frontend/src/pages/appointments/create-appointment-dialog.tsx +390 -0
  445. package/frontend/src/pages/appointments/index.tsx +860 -0
  446. package/frontend/src/pages/audit/index.tsx +24 -0
  447. package/frontend/src/pages/auth/login.tsx +194 -0
  448. package/frontend/src/pages/billing/index.tsx +24 -0
  449. package/frontend/src/pages/calendar/index.tsx +704 -0
  450. package/frontend/src/pages/calendar-connections/index.tsx +295 -0
  451. package/frontend/src/pages/calls/index.tsx +24 -0
  452. package/frontend/src/pages/campaigns/index.tsx +24 -0
  453. package/frontend/src/pages/chats/index.tsx +981 -0
  454. package/frontend/src/pages/clinics/index.tsx +224 -0
  455. package/frontend/src/pages/clinics/settings.tsx +412 -0
  456. package/frontend/src/pages/components-showcase.tsx +773 -0
  457. package/frontend/src/pages/connections/index.tsx +328 -0
  458. package/frontend/src/pages/dashboard.tsx +50 -0
  459. package/frontend/src/pages/leads/index.tsx +24 -0
  460. package/frontend/src/pages/my-schedule/index.tsx +496 -0
  461. package/frontend/src/pages/patients/create-patient-dialog.tsx +358 -0
  462. package/frontend/src/pages/patients/detail.tsx +1195 -0
  463. package/frontend/src/pages/patients/edit-patient-dialog.tsx +387 -0
  464. package/frontend/src/pages/patients/examinations-tab.tsx +460 -0
  465. package/frontend/src/pages/patients/index.tsx +381 -0
  466. package/frontend/src/pages/patients/medical-history-dialog.tsx +207 -0
  467. package/frontend/src/pages/patients/photo-sets-tab.tsx +616 -0
  468. package/frontend/src/pages/patients/timeline-tab.tsx +164 -0
  469. package/frontend/src/pages/patients/treatment-plans-tab.tsx +598 -0
  470. package/frontend/src/pages/phone-numbers/detail.tsx +427 -0
  471. package/frontend/src/pages/phone-numbers/index.tsx +455 -0
  472. package/frontend/src/pages/platform/index.tsx +454 -0
  473. package/frontend/src/pages/settings/index.tsx +126 -0
  474. package/frontend/src/pages/treatments/index.tsx +487 -0
  475. package/frontend/src/pages/users/doctor-profile.tsx +672 -0
  476. package/frontend/src/pages/users/edit.tsx +329 -0
  477. package/frontend/src/pages/users/index.tsx +407 -0
  478. package/frontend/src/pages/validation/index.tsx +24 -0
  479. package/frontend/src/stores/auth.store.ts +108 -0
  480. package/frontend/src/stores/ui.store.ts +41 -0
  481. package/frontend/tsconfig.app.json +32 -0
  482. package/frontend/tsconfig.json +13 -0
  483. package/frontend/tsconfig.node.json +26 -0
  484. package/frontend/vite.config.ts +29 -0
  485. package/nestjs/.dockerignore +5 -0
  486. package/nestjs/.env.docker +64 -0
  487. package/nestjs/.prettierrc +4 -0
  488. package/nestjs/Dockerfile +36 -0
  489. package/nestjs/README.md +98 -0
  490. package/nestjs/eslint.config.mjs +35 -0
  491. package/nestjs/nest-cli.json +8 -0
  492. package/nestjs/package-lock.json +13390 -0
  493. package/nestjs/package.json +114 -0
  494. package/nestjs/prisma/migrations/20260409161536_add_message_metadata_fields/migration.sql +1746 -0
  495. package/nestjs/prisma/migrations/20260410140436_add_agent_ai_fields/migration.sql +36 -0
  496. package/nestjs/prisma/migrations/20260410175519_add_agent_clinic_assignments/migration.sql +21 -0
  497. package/nestjs/prisma/migrations/20260412094344_make_agent_tenant_optional/migration.sql +2 -0
  498. package/nestjs/prisma/migrations/20260412110008_add_admin_chat_sessions/migration.sql +47 -0
  499. package/nestjs/prisma/migrations/migration_lock.toml +3 -0
  500. package/nestjs/prisma/schema.prisma +1843 -0
  501. package/nestjs/prisma/seed.ts +375 -0
  502. package/nestjs/prisma.config.ts +14 -0
  503. package/nestjs/src/admin/admin.controller.ts +27 -0
  504. package/nestjs/src/admin/admin.module.ts +16 -0
  505. package/nestjs/src/admin/admin.service.ts +91 -0
  506. package/nestjs/src/admin/ai-chat-session.service.ts +454 -0
  507. package/nestjs/src/admin/ai-test.controller.ts +191 -0
  508. package/nestjs/src/admin/superadmin.controller.ts +106 -0
  509. package/nestjs/src/agents/agents.controller.ts +262 -0
  510. package/nestjs/src/agents/agents.module.ts +13 -0
  511. package/nestjs/src/agents/agents.service.ts +733 -0
  512. package/nestjs/src/agents/dto/create-agent.dto.ts +99 -0
  513. package/nestjs/src/agents/dto/index.ts +2 -0
  514. package/nestjs/src/agents/dto/update-agent.dto.ts +148 -0
  515. package/nestjs/src/app.module.ts +115 -0
  516. package/nestjs/src/appointment-validation/appointment-validation.controller.ts +194 -0
  517. package/nestjs/src/appointment-validation/appointment-validation.module.ts +16 -0
  518. package/nestjs/src/appointment-validation/appointment-validation.service.ts +450 -0
  519. package/nestjs/src/appointment-validation/dto/create-batch.dto.ts +105 -0
  520. package/nestjs/src/appointment-validation/dto/index.ts +1 -0
  521. package/nestjs/src/appointment-validation/processors/validation-dispatch.processor.ts +26 -0
  522. package/nestjs/src/appointment-validation/processors/validation-sync.processor.ts +23 -0
  523. package/nestjs/src/appointments/appointments.controller.ts +268 -0
  524. package/nestjs/src/appointments/appointments.module.ts +13 -0
  525. package/nestjs/src/appointments/appointments.service.ts +773 -0
  526. package/nestjs/src/appointments/dto/create-appointment.dto.ts +72 -0
  527. package/nestjs/src/appointments/dto/index.ts +4 -0
  528. package/nestjs/src/appointments/dto/query-appointments.dto.ts +60 -0
  529. package/nestjs/src/appointments/dto/update-appointment.dto.ts +43 -0
  530. package/nestjs/src/appointments/dto/update-status.dto.ts +18 -0
  531. package/nestjs/src/appointments/processors/reminder.processor.ts +243 -0
  532. package/nestjs/src/audit/audit.controller.ts +84 -0
  533. package/nestjs/src/audit/audit.decorator.ts +20 -0
  534. package/nestjs/src/audit/audit.interceptor.ts +67 -0
  535. package/nestjs/src/audit/audit.interfaces.ts +15 -0
  536. package/nestjs/src/audit/audit.module.ts +12 -0
  537. package/nestjs/src/audit/audit.service.ts +177 -0
  538. package/nestjs/src/auth/auth.controller.ts +116 -0
  539. package/nestjs/src/auth/auth.module.ts +25 -0
  540. package/nestjs/src/auth/auth.service.ts +612 -0
  541. package/nestjs/src/auth/dto/change-password.dto.ts +13 -0
  542. package/nestjs/src/auth/dto/forgot-password.dto.ts +8 -0
  543. package/nestjs/src/auth/dto/index.ts +6 -0
  544. package/nestjs/src/auth/dto/login.dto.ts +13 -0
  545. package/nestjs/src/auth/dto/refresh.dto.ts +8 -0
  546. package/nestjs/src/auth/dto/register.dto.ts +28 -0
  547. package/nestjs/src/auth/dto/reset-password.dto.ts +13 -0
  548. package/nestjs/src/auth/permissions.config.ts +85 -0
  549. package/nestjs/src/availability-blocks/availability-blocks.controller.ts +83 -0
  550. package/nestjs/src/availability-blocks/availability-blocks.module.ts +10 -0
  551. package/nestjs/src/availability-blocks/availability-blocks.service.ts +202 -0
  552. package/nestjs/src/billing/billing.controller.ts +104 -0
  553. package/nestjs/src/billing/billing.module.ts +12 -0
  554. package/nestjs/src/billing/billing.service.ts +398 -0
  555. package/nestjs/src/billing/dto/index.ts +2 -0
  556. package/nestjs/src/billing/dto/query-billing.dto.ts +29 -0
  557. package/nestjs/src/billing/dto/record-payment.dto.ts +60 -0
  558. package/nestjs/src/billing/processors/alerts.processor.ts +216 -0
  559. package/nestjs/src/billing/processors/snapshot.processor.ts +181 -0
  560. package/nestjs/src/calls/calls.controller.ts +92 -0
  561. package/nestjs/src/calls/calls.module.ts +10 -0
  562. package/nestjs/src/calls/calls.service.ts +359 -0
  563. package/nestjs/src/calls/dto/index.ts +1 -0
  564. package/nestjs/src/calls/dto/query-calls.dto.ts +46 -0
  565. package/nestjs/src/clinics/clinics.controller.ts +226 -0
  566. package/nestjs/src/clinics/clinics.module.ts +11 -0
  567. package/nestjs/src/clinics/clinics.service.ts +203 -0
  568. package/nestjs/src/clinics/dto/create-clinic.dto.ts +40 -0
  569. package/nestjs/src/clinics/dto/create-meta-connection.dto.ts +44 -0
  570. package/nestjs/src/clinics/dto/index.ts +4 -0
  571. package/nestjs/src/clinics/dto/update-clinic.dto.ts +133 -0
  572. package/nestjs/src/clinics/dto/update-meta-connection.dto.ts +22 -0
  573. package/nestjs/src/clinics/meta-connections.service.ts +210 -0
  574. package/nestjs/src/common/decorators/accessible-clinics.decorator.ts +9 -0
  575. package/nestjs/src/common/decorators/current-user.decorator.ts +10 -0
  576. package/nestjs/src/common/decorators/features.decorator.ts +7 -0
  577. package/nestjs/src/common/decorators/index.ts +4 -0
  578. package/nestjs/src/common/decorators/permissions.decorator.ts +13 -0
  579. package/nestjs/src/common/gateways/events.gateway.ts +157 -0
  580. package/nestjs/src/common/guards/clinic-access.guard.ts +40 -0
  581. package/nestjs/src/common/guards/features.guard.ts +38 -0
  582. package/nestjs/src/common/guards/index.ts +5 -0
  583. package/nestjs/src/common/guards/jwt-auth.guard.ts +54 -0
  584. package/nestjs/src/common/guards/permissions.guard.ts +50 -0
  585. package/nestjs/src/common/guards/superadmin.guard.ts +35 -0
  586. package/nestjs/src/common/interceptors/request-context.interceptor.ts +32 -0
  587. package/nestjs/src/common/interceptors/superadmin-tenant.interceptor.ts +42 -0
  588. package/nestjs/src/common/interfaces/jwt-payload.interface.ts +11 -0
  589. package/nestjs/src/config/config.module.ts +13 -0
  590. package/nestjs/src/database/database.module.ts +9 -0
  591. package/nestjs/src/database/prisma.service.ts +20 -0
  592. package/nestjs/src/database/tenant-context.ts +27 -0
  593. package/nestjs/src/google-calendar/google-calendar.controller.ts +259 -0
  594. package/nestjs/src/google-calendar/google-calendar.module.ts +10 -0
  595. package/nestjs/src/google-calendar/google-calendar.service.ts +811 -0
  596. package/nestjs/src/integrations/ai/ai.interface.ts +74 -0
  597. package/nestjs/src/integrations/ai/ai.module.ts +11 -0
  598. package/nestjs/src/integrations/ai/ai.service.ts +148 -0
  599. package/nestjs/src/integrations/ai/providers/anthropic.provider.ts +146 -0
  600. package/nestjs/src/integrations/ai/providers/openai.provider.ts +158 -0
  601. package/nestjs/src/integrations/elevenlabs/elevenlabs.module.ts +8 -0
  602. package/nestjs/src/integrations/elevenlabs/elevenlabs.service.ts +226 -0
  603. package/nestjs/src/integrations/encryption/encryption.module.ts +9 -0
  604. package/nestjs/src/integrations/encryption/encryption.service.ts +31 -0
  605. package/nestjs/src/integrations/image/image.module.ts +9 -0
  606. package/nestjs/src/integrations/image/image.service.ts +61 -0
  607. package/nestjs/src/integrations/meta-business/meta-business.module.ts +10 -0
  608. package/nestjs/src/integrations/meta-business/meta-instagram.service.ts +94 -0
  609. package/nestjs/src/integrations/meta-business/meta-webhook.service.ts +52 -0
  610. package/nestjs/src/integrations/meta-business/meta-whatsapp.service.ts +254 -0
  611. package/nestjs/src/integrations/minio/minio.module.ts +9 -0
  612. package/nestjs/src/integrations/minio/minio.service.ts +88 -0
  613. package/nestjs/src/integrations/netgsm/netgsm.module.ts +8 -0
  614. package/nestjs/src/integrations/netgsm/netgsm.service.ts +17 -0
  615. package/nestjs/src/integrations/tektippay/tektippay.module.ts +8 -0
  616. package/nestjs/src/integrations/tektippay/tektippay.service.ts +23 -0
  617. package/nestjs/src/leads/dto/index.ts +2 -0
  618. package/nestjs/src/leads/dto/query-leads.dto.ts +50 -0
  619. package/nestjs/src/leads/dto/update-lead.dto.ts +26 -0
  620. package/nestjs/src/leads/leads.controller.ts +184 -0
  621. package/nestjs/src/leads/leads.module.ts +10 -0
  622. package/nestjs/src/leads/leads.service.ts +375 -0
  623. package/nestjs/src/logging/logging.controller.ts +82 -0
  624. package/nestjs/src/logging/logging.module.ts +11 -0
  625. package/nestjs/src/logging/logging.service.ts +180 -0
  626. package/nestjs/src/main.ts +86 -0
  627. package/nestjs/src/outbound-campaigns/dto/create-campaign.dto.ts +47 -0
  628. package/nestjs/src/outbound-campaigns/dto/index.ts +3 -0
  629. package/nestjs/src/outbound-campaigns/dto/update-campaign.dto.ts +31 -0
  630. package/nestjs/src/outbound-campaigns/dto/upload-entries.dto.ts +35 -0
  631. package/nestjs/src/outbound-campaigns/outbound-campaigns.controller.ts +307 -0
  632. package/nestjs/src/outbound-campaigns/outbound-campaigns.module.ts +13 -0
  633. package/nestjs/src/outbound-campaigns/outbound-campaigns.service.ts +471 -0
  634. package/nestjs/src/outbound-campaigns/processors/campaign-dispatch.processor.ts +366 -0
  635. package/nestjs/src/patients/documents.service.ts +231 -0
  636. package/nestjs/src/patients/dto/create-examination.dto.ts +34 -0
  637. package/nestjs/src/patients/dto/create-note.dto.ts +14 -0
  638. package/nestjs/src/patients/dto/create-patient.dto.ts +86 -0
  639. package/nestjs/src/patients/dto/create-photo-set.dto.ts +32 -0
  640. package/nestjs/src/patients/dto/index.ts +10 -0
  641. package/nestjs/src/patients/dto/update-examination.dto.ts +29 -0
  642. package/nestjs/src/patients/dto/update-medical-history.dto.ts +47 -0
  643. package/nestjs/src/patients/dto/update-patient.dto.ts +87 -0
  644. package/nestjs/src/patients/dto/update-photo-set.dto.ts +28 -0
  645. package/nestjs/src/patients/dto/upload-document.dto.ts +31 -0
  646. package/nestjs/src/patients/dto/upload-photo.dto.ts +27 -0
  647. package/nestjs/src/patients/examinations.service.ts +271 -0
  648. package/nestjs/src/patients/medical-history.service.ts +149 -0
  649. package/nestjs/src/patients/notes.service.ts +172 -0
  650. package/nestjs/src/patients/patients.controller.ts +485 -0
  651. package/nestjs/src/patients/patients.module.ts +22 -0
  652. package/nestjs/src/patients/patients.service.ts +412 -0
  653. package/nestjs/src/patients/photo-sets.service.ts +389 -0
  654. package/nestjs/src/phone-numbers/dto/create-phone-number.dto.ts +57 -0
  655. package/nestjs/src/phone-numbers/dto/index.ts +3 -0
  656. package/nestjs/src/phone-numbers/dto/update-phone-number.dto.ts +38 -0
  657. package/nestjs/src/phone-numbers/dto/update-schedule.dto.ts +39 -0
  658. package/nestjs/src/phone-numbers/phone-numbers.controller.ts +125 -0
  659. package/nestjs/src/phone-numbers/phone-numbers.module.ts +10 -0
  660. package/nestjs/src/phone-numbers/phone-numbers.service.ts +209 -0
  661. package/nestjs/src/plans/dto/create-plan.dto.ts +70 -0
  662. package/nestjs/src/plans/dto/index.ts +2 -0
  663. package/nestjs/src/plans/dto/update-plan.dto.ts +80 -0
  664. package/nestjs/src/plans/plans.controller.ts +50 -0
  665. package/nestjs/src/plans/plans.module.ts +10 -0
  666. package/nestjs/src/plans/plans.service.ts +115 -0
  667. package/nestjs/src/platform/dto/create-tenant.dto.ts +36 -0
  668. package/nestjs/src/platform/dto/index.ts +2 -0
  669. package/nestjs/src/platform/dto/update-tenant-platform.dto.ts +44 -0
  670. package/nestjs/src/platform/platform.controller.ts +79 -0
  671. package/nestjs/src/platform/platform.module.ts +10 -0
  672. package/nestjs/src/platform/platform.service.ts +301 -0
  673. package/nestjs/src/queue/queue.module.ts +56 -0
  674. package/nestjs/src/redis/redis.module.ts +20 -0
  675. package/nestjs/src/tenants/dto/index.ts +1 -0
  676. package/nestjs/src/tenants/dto/update-tenant.dto.ts +15 -0
  677. package/nestjs/src/tenants/tenants.controller.ts +45 -0
  678. package/nestjs/src/tenants/tenants.module.ts +10 -0
  679. package/nestjs/src/tenants/tenants.service.ts +41 -0
  680. package/nestjs/src/tools/adapters/elevenlabs-http.adapter.ts +51 -0
  681. package/nestjs/src/tools/adapters/elevenlabs-ws.adapter.ts +59 -0
  682. package/nestjs/src/tools/handlers/calendar.tools.ts +441 -0
  683. package/nestjs/src/tools/handlers/notification.tools.ts +34 -0
  684. package/nestjs/src/tools/handlers/operator.tools.ts +303 -0
  685. package/nestjs/src/tools/handlers/patient.tools.ts +242 -0
  686. package/nestjs/src/tools/handlers/payment.tools.ts +43 -0
  687. package/nestjs/src/tools/handlers/validation.tools.ts +152 -0
  688. package/nestjs/src/tools/tool-registry.service.ts +221 -0
  689. package/nestjs/src/tools/tool.decorator.ts +16 -0
  690. package/nestjs/src/tools/tool.interfaces.ts +26 -0
  691. package/nestjs/src/tools/tools.module.ts +50 -0
  692. package/nestjs/src/treatments/dto/create-plan-item.dto.ts +27 -0
  693. package/nestjs/src/treatments/dto/create-treatment-plan.dto.ts +69 -0
  694. package/nestjs/src/treatments/dto/create-treatment.dto.ts +59 -0
  695. package/nestjs/src/treatments/dto/index.ts +6 -0
  696. package/nestjs/src/treatments/dto/update-plan-item.dto.ts +23 -0
  697. package/nestjs/src/treatments/dto/update-treatment-plan.dto.ts +22 -0
  698. package/nestjs/src/treatments/dto/update-treatment.dto.ts +70 -0
  699. package/nestjs/src/treatments/treatment-plans.service.ts +362 -0
  700. package/nestjs/src/treatments/treatments.controller.ts +265 -0
  701. package/nestjs/src/treatments/treatments.module.ts +14 -0
  702. package/nestjs/src/treatments/treatments.service.ts +165 -0
  703. package/nestjs/src/users/doctor-profiles.service.ts +202 -0
  704. package/nestjs/src/users/dto/index.ts +4 -0
  705. package/nestjs/src/users/dto/invite-user.dto.ts +52 -0
  706. package/nestjs/src/users/dto/update-clinic-assignments.dto.ts +9 -0
  707. package/nestjs/src/users/dto/update-doctor-profile.dto.ts +49 -0
  708. package/nestjs/src/users/dto/update-user.dto.ts +41 -0
  709. package/nestjs/src/users/users.controller.ts +142 -0
  710. package/nestjs/src/users/users.module.ts +11 -0
  711. package/nestjs/src/users/users.service.ts +250 -0
  712. package/nestjs/src/webhooks/elevenlabs-tool.controller.ts +66 -0
  713. package/nestjs/src/webhooks/elevenlabs-webhook.controller.ts +60 -0
  714. package/nestjs/src/webhooks/meta-webhook.controller.ts +178 -0
  715. package/nestjs/src/webhooks/processors/elevenlabs-webhook.processor.ts +28 -0
  716. package/nestjs/src/webhooks/webhooks.module.ts +17 -0
  717. package/nestjs/src/whatsapp/chat-context.service.ts +281 -0
  718. package/nestjs/src/whatsapp/dto/add-blacklist.dto.ts +13 -0
  719. package/nestjs/src/whatsapp/dto/index.ts +2 -0
  720. package/nestjs/src/whatsapp/dto/send-message.dto.ts +14 -0
  721. package/nestjs/src/whatsapp/listeners/meta-message.listener.ts +579 -0
  722. package/nestjs/src/whatsapp/meta-auth.controller.ts +268 -0
  723. package/nestjs/src/whatsapp/meta-instagram-auth.controller.ts +244 -0
  724. package/nestjs/src/whatsapp/operator.service.ts +692 -0
  725. package/nestjs/src/whatsapp/processors/cost-sweep.processor.ts +130 -0
  726. package/nestjs/src/whatsapp/processors/grace.processor.ts +191 -0
  727. package/nestjs/src/whatsapp/processors/message-buffer.processor.ts +138 -0
  728. package/nestjs/src/whatsapp/processors/message-cleanup.processor.ts +148 -0
  729. package/nestjs/src/whatsapp/processors/meta-token-refresh.processor.ts +114 -0
  730. package/nestjs/src/whatsapp/processors/operator-expiry.processor.ts +105 -0
  731. package/nestjs/src/whatsapp/processors/profile-update.processor.ts +234 -0
  732. package/nestjs/src/whatsapp/processors/session-cleanup.processor.ts +178 -0
  733. package/nestjs/src/whatsapp/processors/session-labels.processor.ts +248 -0
  734. package/nestjs/src/whatsapp/whatsapp-agent.service.ts +2506 -0
  735. package/nestjs/src/whatsapp/whatsapp-recovery.service.ts +117 -0
  736. package/nestjs/src/whatsapp/whatsapp.controller.ts +398 -0
  737. package/nestjs/src/whatsapp/whatsapp.module.ts +51 -0
  738. package/nestjs/src/whatsapp/whatsapp.service.ts +592 -0
  739. package/nestjs/test/app.e2e-spec.ts +25 -0
  740. package/nestjs/test/jest-e2e.json +9 -0
  741. package/nestjs/tsconfig.build.json +4 -0
  742. package/nestjs/tsconfig.json +25 -0
  743. package/nginx.example.conf +18 -0
  744. package/package.json +47 -0
  745. package/scripts/addRecipient.ts +48 -0
  746. package/scripts/listRecipients.ts +31 -0
  747. package/scripts/migrate-agent-ref.ts +86 -0
  748. package/scripts/migrate-sessions.ts +183 -0
  749. package/scripts/promote.ts +27 -0
  750. package/scripts/retrigger.ts +84 -0
  751. package/scripts/seed.ts +435 -0
  752. package/scripts/testSend.ts +63 -0
  753. package/src/app.ts +85 -0
  754. package/src/config/agentPrompts.json +19 -0
  755. package/src/config/database.ts +21 -0
  756. package/src/config/env.ts +94 -0
  757. package/src/config/index.ts +86 -0
  758. package/src/controllers/webhook.controller.ts +150 -0
  759. package/src/errors/index.ts +9 -0
  760. package/src/hooks/webhookValidator.ts +55 -0
  761. package/src/index.ts +68 -0
  762. package/src/migrations/001_session-architecture.ts +138 -0
  763. package/src/migrations/002_agent-ref.ts +65 -0
  764. package/src/migrations/003_shift-schedule.ts +55 -0
  765. package/src/migrations/004_invert-shift-to-clinic-hours.ts +30 -0
  766. package/src/migrations/005_composite-baileys-chat-ids.ts +60 -0
  767. package/src/migrations/migration.model.ts +27 -0
  768. package/src/migrations/migration.routes.ts +40 -0
  769. package/src/migrations/migration.runner.ts +112 -0
  770. package/src/models/ConversationClaim.ts +17 -0
  771. package/src/models/ConversationEvaluation.ts +91 -0
  772. package/src/models/Summary.ts +77 -0
  773. package/src/models/Transcription.ts +68 -0
  774. package/src/models/WhatsAppRecipient.ts +37 -0
  775. package/src/modules/admin/admin.routes.ts +2385 -0
  776. package/src/modules/admin/elevenlabs-test-chat.routes.ts +193 -0
  777. package/src/modules/admin/whatsapp-test-chat.routes.ts +244 -0
  778. package/src/modules/agents/agent.model.ts +93 -0
  779. package/src/modules/agents/agent.routes.ts +65 -0
  780. package/src/modules/appointment-validation/appointment-validation.model.ts +163 -0
  781. package/src/modules/appointment-validation/appointment-validation.routes.ts +275 -0
  782. package/src/modules/appointment-validation/appointment-validation.service.ts +1028 -0
  783. package/src/modules/auth/auth.model.ts +42 -0
  784. package/src/modules/auth/auth.routes.ts +199 -0
  785. package/src/modules/auth/auth.service.ts +210 -0
  786. package/src/modules/auth/refresh-token.model.ts +26 -0
  787. package/src/modules/billing/billing-alert.model.ts +28 -0
  788. package/src/modules/billing/billing-period-snapshot.model.ts +68 -0
  789. package/src/modules/billing/billing.model.ts +42 -0
  790. package/src/modules/billing/billing.routes.ts +67 -0
  791. package/src/modules/billing/billing.service.ts +562 -0
  792. package/src/modules/billing/payment.model.ts +42 -0
  793. package/src/modules/calls/call.model.ts +102 -0
  794. package/src/modules/calls/call.routes.ts +118 -0
  795. package/src/modules/campaigns/campaign.model.ts +111 -0
  796. package/src/modules/campaigns/campaign.routes.ts +402 -0
  797. package/src/modules/campaigns/campaign.service.ts +99 -0
  798. package/src/modules/google-calendar/google-calendar.routes.ts +31 -0
  799. package/src/modules/inbound-call/inbound-call-config.model.ts +49 -0
  800. package/src/modules/inbound-call/inbound-call.routes.ts +289 -0
  801. package/src/modules/leads/lead.model.ts +40 -0
  802. package/src/modules/leads/lead.routes.ts +246 -0
  803. package/src/modules/logs/log.model.ts +27 -0
  804. package/src/modules/logs/log.routes.ts +102 -0
  805. package/src/modules/plans/plan.model.ts +45 -0
  806. package/src/modules/surveys/survey.model.ts +70 -0
  807. package/src/modules/surveys/survey.routes.ts +187 -0
  808. package/src/modules/tenants/tenant.model.ts +181 -0
  809. package/src/modules/tenants/tenant.routes.ts +78 -0
  810. package/src/modules/users/user.routes.ts +126 -0
  811. package/src/modules/webhooks/elevenlabs-tool.routes.ts +94 -0
  812. package/src/modules/webhooks/elevenlabs-tool.service.ts +491 -0
  813. package/src/modules/webhooks/elevenlabs.routes.ts +34 -0
  814. package/src/modules/webhooks/elevenlabs.service.ts +565 -0
  815. package/src/modules/webhooks/unipile.routes.ts +917 -0
  816. package/src/modules/whatsapp/appointment.model.ts +47 -0
  817. package/src/modules/whatsapp/operator-request.model.ts +58 -0
  818. package/src/modules/whatsapp/stt-usage.model.ts +30 -0
  819. package/src/modules/whatsapp/whatsapp-chat.model.ts +39 -0
  820. package/src/modules/whatsapp/whatsapp-contact-profile.model.ts +41 -0
  821. package/src/modules/whatsapp/whatsapp-message.model.ts +41 -0
  822. package/src/modules/whatsapp/whatsapp-session.model.ts +60 -0
  823. package/src/modules/whatsapp/whatsapp.routes.ts +1435 -0
  824. package/src/plugins/cors.ts +7 -0
  825. package/src/plugins/jwt.ts +18 -0
  826. package/src/plugins/rawBody.ts +12 -0
  827. package/src/plugins/rbac.ts +24 -0
  828. package/src/routes/admin.routes.ts +208 -0
  829. package/src/routes/health.routes.ts +12 -0
  830. package/src/routes/webhook.routes.ts +12 -0
  831. package/src/services/ai/base.ai.ts +132 -0
  832. package/src/services/ai/gemini.service.ts +41 -0
  833. package/src/services/ai/index.ts +24 -0
  834. package/src/services/ai/openai.service.ts +48 -0
  835. package/src/services/elevenlabs.service.ts +532 -0
  836. package/src/services/google-calendar.service.ts +656 -0
  837. package/src/services/inbound-call-schedule.service.ts +174 -0
  838. package/src/services/netgsm.service.ts +128 -0
  839. package/src/services/unipile.service.ts +200 -0
  840. package/src/services/whatsapp-agent.service.ts +2479 -0
  841. package/src/services/whatsapp.service.ts +245 -0
  842. package/src/templates/index.ts +71 -0
  843. package/src/templates/receptionist.ts +44 -0
  844. package/src/templates/survey.ts +44 -0
  845. package/src/types/index.ts +218 -0
  846. package/src/utils/logger.ts +83 -0
  847. package/tsconfig.json +19 -0
  848. package/web/.dockerignore +4 -0
  849. package/web/Dockerfile +18 -0
  850. package/web/README.md +73 -0
  851. package/web/components.json +23 -0
  852. package/web/eslint.config.js +23 -0
  853. package/web/index.html +14 -0
  854. package/web/nginx.conf +18 -0
  855. package/web/package-lock.json +10292 -0
  856. package/web/package.json +48 -0
  857. package/web/public/favicon.ico +0 -0
  858. package/web/public/vite.svg +1 -0
  859. package/web/src/App.tsx +191 -0
  860. package/web/src/assets/react.svg +1 -0
  861. package/web/src/components/Layout.tsx +261 -0
  862. package/web/src/components/LeadConversation.tsx +251 -0
  863. package/web/src/components/ProtectedRoute.tsx +20 -0
  864. package/web/src/components/conversation-review/CardAudioPlayer.tsx +200 -0
  865. package/web/src/components/conversation-review/CardEvaluation.tsx +351 -0
  866. package/web/src/components/conversation-review/CardMetadata.tsx +44 -0
  867. package/web/src/components/conversation-review/ConversationCard.tsx +95 -0
  868. package/web/src/components/conversation-review/ReviewContainer.tsx +120 -0
  869. package/web/src/components/conversation-review/ReviewFilters.tsx +88 -0
  870. package/web/src/components/empty-state.tsx +15 -0
  871. package/web/src/components/page-header.tsx +19 -0
  872. package/web/src/components/page-loader.tsx +32 -0
  873. package/web/src/components/pagination.tsx +38 -0
  874. package/web/src/components/stat-card.tsx +27 -0
  875. package/web/src/components/status-badge.tsx +125 -0
  876. package/web/src/components/ui/alert.tsx +66 -0
  877. package/web/src/components/ui/badge.tsx +48 -0
  878. package/web/src/components/ui/button.tsx +64 -0
  879. package/web/src/components/ui/card.tsx +92 -0
  880. package/web/src/components/ui/checkbox.tsx +32 -0
  881. package/web/src/components/ui/dialog.tsx +158 -0
  882. package/web/src/components/ui/dropdown-menu.tsx +255 -0
  883. package/web/src/components/ui/input.tsx +21 -0
  884. package/web/src/components/ui/label.tsx +22 -0
  885. package/web/src/components/ui/progress.tsx +29 -0
  886. package/web/src/components/ui/select.tsx +188 -0
  887. package/web/src/components/ui/separator.tsx +28 -0
  888. package/web/src/components/ui/sheet.tsx +123 -0
  889. package/web/src/components/ui/skeleton.tsx +13 -0
  890. package/web/src/components/ui/sonner.tsx +35 -0
  891. package/web/src/components/ui/table.tsx +116 -0
  892. package/web/src/components/ui/tabs.tsx +89 -0
  893. package/web/src/components/ui/textarea.tsx +18 -0
  894. package/web/src/components/ui/tooltip.tsx +57 -0
  895. package/web/src/components/whatsapp/ChatDetail.tsx +417 -0
  896. package/web/src/components/whatsapp/ChatHeader.tsx +78 -0
  897. package/web/src/components/whatsapp/ChatList.tsx +107 -0
  898. package/web/src/components/whatsapp/ChatListItem.tsx +60 -0
  899. package/web/src/components/whatsapp/MessageBubble.tsx +46 -0
  900. package/web/src/components/whatsapp/MessageInput.tsx +63 -0
  901. package/web/src/components/whatsapp/MessageStream.tsx +135 -0
  902. package/web/src/components/whatsapp/SessionDivider.tsx +65 -0
  903. package/web/src/components/whatsapp/SessionHistory.tsx +119 -0
  904. package/web/src/components/whatsapp/settings/AiSettingsTab.tsx +268 -0
  905. package/web/src/components/whatsapp/settings/CalendarTab.tsx +339 -0
  906. package/web/src/components/whatsapp/settings/ConnectionTab.tsx +236 -0
  907. package/web/src/components/whatsapp/settings/NotificationsTab.tsx +109 -0
  908. package/web/src/components/whatsapp/settings/OperatorTab.tsx +303 -0
  909. package/web/src/contexts/AuthContext.tsx +103 -0
  910. package/web/src/index.css +130 -0
  911. package/web/src/lib/api.ts +92 -0
  912. package/web/src/lib/utils.ts +6 -0
  913. package/web/src/main.tsx +10 -0
  914. package/web/src/pages/AppointmentDetail.tsx +206 -0
  915. package/web/src/pages/AppointmentValidation.tsx +157 -0
  916. package/web/src/pages/AppointmentValidationDetail.tsx +617 -0
  917. package/web/src/pages/AppointmentValidationNew.tsx +1005 -0
  918. package/web/src/pages/Appointments.tsx +283 -0
  919. package/web/src/pages/Billing.tsx +126 -0
  920. package/web/src/pages/CallDetail.tsx +293 -0
  921. package/web/src/pages/CallSettings.tsx +313 -0
  922. package/web/src/pages/Calls.tsx +188 -0
  923. package/web/src/pages/CampaignDetail.tsx +216 -0
  924. package/web/src/pages/CampaignNew.tsx +277 -0
  925. package/web/src/pages/CampaignResults.tsx +185 -0
  926. package/web/src/pages/Campaigns.tsx +171 -0
  927. package/web/src/pages/Dashboard.tsx +336 -0
  928. package/web/src/pages/InboundSchedule.tsx +246 -0
  929. package/web/src/pages/LeadDetail.tsx +183 -0
  930. package/web/src/pages/Leads.tsx +258 -0
  931. package/web/src/pages/Login.tsx +99 -0
  932. package/web/src/pages/Register.tsx +129 -0
  933. package/web/src/pages/Settings.tsx +133 -0
  934. package/web/src/pages/SurveyDetail.tsx +232 -0
  935. package/web/src/pages/SurveyPreview.tsx +179 -0
  936. package/web/src/pages/Surveys.tsx +207 -0
  937. package/web/src/pages/Users.tsx +199 -0
  938. package/web/src/pages/WhatsApp.tsx +147 -0
  939. package/web/src/pages/WhatsAppSettings.tsx +215 -0
  940. package/web/src/pages/admin/AdminBaileysMessageLog.tsx +331 -0
  941. package/web/src/pages/admin/AdminBaileysRawMessages.tsx +318 -0
  942. package/web/src/pages/admin/AdminConversationReview.tsx +116 -0
  943. package/web/src/pages/admin/AdminCredits.tsx +467 -0
  944. package/web/src/pages/admin/AdminElevenLabsAgentDetail.tsx +332 -0
  945. package/web/src/pages/admin/AdminElevenLabsAgents.tsx +164 -0
  946. package/web/src/pages/admin/AdminElevenLabsBatchCallDetail.tsx +214 -0
  947. package/web/src/pages/admin/AdminElevenLabsBatchCalls.tsx +293 -0
  948. package/web/src/pages/admin/AdminElevenLabsConversationDetail.tsx +230 -0
  949. package/web/src/pages/admin/AdminElevenLabsConversations.tsx +228 -0
  950. package/web/src/pages/admin/AdminElevenLabsInboundCalls.tsx +293 -0
  951. package/web/src/pages/admin/AdminElevenLabsPhoneNumbers.tsx +506 -0
  952. package/web/src/pages/admin/AdminElevenLabsTestChat.tsx +258 -0
  953. package/web/src/pages/admin/AdminElevenLabsWebhooks.tsx +289 -0
  954. package/web/src/pages/admin/AdminEvaluationDashboard.tsx +520 -0
  955. package/web/src/pages/admin/AdminLeads.tsx +339 -0
  956. package/web/src/pages/admin/AdminLogs.tsx +283 -0
  957. package/web/src/pages/admin/AdminMigrations.tsx +247 -0
  958. package/web/src/pages/admin/AdminPlans.tsx +313 -0
  959. package/web/src/pages/admin/AdminSystem.tsx +391 -0
  960. package/web/src/pages/admin/AdminTenantBillableItems.tsx +464 -0
  961. package/web/src/pages/admin/AdminTenantDetail.tsx +1317 -0
  962. package/web/src/pages/admin/AdminTenants.tsx +274 -0
  963. package/web/src/pages/admin/AdminWhatsApp.tsx +618 -0
  964. package/web/src/pages/admin/AdminWhatsAppTestChat.tsx +328 -0
  965. package/web/src/types/index.ts +242 -0
  966. package/web/tsconfig.app.json +32 -0
  967. package/web/tsconfig.json +13 -0
  968. package/web/tsconfig.node.json +26 -0
  969. package/web/vite.config.ts +23 -0
@@ -0,0 +1,227 @@
1
+ # Frontend Development Checklist
2
+
3
+ > Portal Asistan 7/24 — React Frontend Progress
4
+ > Last updated: 2026-04-03
5
+
6
+ ---
7
+
8
+ ## Infrastructure
9
+
10
+ - [x] Vite + React 19 + TypeScript + React Compiler
11
+ - [x] Tailwind CSS v4 + shadcn/ui (Base UI)
12
+ - [x] Brand theme (#e77d22) with light/dark mode
13
+ - [x] i18n (Turkish + English, localStorage persisted)
14
+ - [x] React Router v7 with lazy loading
15
+ - [x] TanStack Query (React Query)
16
+ - [x] Zustand stores (auth + UI)
17
+ - [x] Axios API client with interceptors
18
+ - [x] Vite proxy (/api → backend)
19
+ - [x] Sonner toast notifications
20
+ - [ ] Socket.IO client connection
21
+ - [ ] Error boundary (global)
22
+
23
+ ## Components
24
+
25
+ - [x] 33 shadcn/ui components
26
+ - [x] PageHeader
27
+ - [x] StatCard
28
+ - [x] EmptyState
29
+ - [x] StatusDot
30
+ - [x] StatusBadge
31
+ - [x] ConfirmDialog
32
+ - [x] DataTableToolbar
33
+ - [x] DataTablePagination
34
+ - [x] AppointmentCalendar (Schedule-X)
35
+ - [x] ChatBubble
36
+ - [x] ActivityTimeline
37
+ - [x] FileUpload
38
+ - [x] NotificationDropdown
39
+ - [x] Combobox
40
+ - [x] LanguageSwitcher
41
+ - [x] Component showcase page (/components)
42
+
43
+ ## Layout
44
+
45
+ - [x] Login page (mobile-friendly, i18n, error handling) ✅ TESTED
46
+ - [x] Auth guard (redirect to /login) ✅ TESTED
47
+ - [x] App layout (header + sidebar + content) ✅ TESTED
48
+ - [x] Collapsible desktop sidebar (20 nav items, 6 groups) ✅ TESTED
49
+ - [x] Mobile sidebar (Sheet overlay)
50
+ - [x] User dropdown (profile, settings, logout) ✅ TESTED
51
+ - [x] Dark mode toggle (persisted) ✅ TESTED
52
+ - [x] Language switcher in header ✅ TESTED
53
+ - [x] Notification bell in header
54
+
55
+ ## Pages — CRM Core
56
+
57
+ ### Patients
58
+ - [x] Patient list (search, pagination, clinic filter) ✅ TESTED
59
+ - [x] Create patient dialog (all fields, Zod validation, referral tracking) ✅ TESTED
60
+ - [x] Patient detail page (header, stats, tabs) ✅ TESTED
61
+ - [x] Edit patient dialog (all fields match create) ✅ TESTED
62
+ - [x] Overview tab (medical history, AI summary, latest notes) ✅ TESTED
63
+ - [x] Appointments tab (table with status badges)
64
+ - [x] Notes tab (add, list, delete) ✅ TESTED
65
+ - [x] Documents tab (upload, list, detail modal, view via proxy, delete) ✅ TESTED
66
+ - [x] Photos tab (sets grid with cover previews, detail with lightbox, upload with thumbnails) ✅ TESTED
67
+ - [x] Examinations tab (create, view, edit — linked to appointments optionally) ✅ TESTED
68
+ - [x] Medical history edit form (allergies, conditions, medications, smoking, alcohol, pregnancy) ✅ TESTED
69
+ - [x] Patient timeline (unified activity feed — all events sorted) ✅ TESTED
70
+
71
+ ### Appointments
72
+ - [x] Appointment list (search, filters, pagination) ✅ TESTED
73
+ - [x] Create appointment dialog ✅ TESTED
74
+ - [x] Appointment detail modal (row click) ✅ TESTED
75
+ - [x] Status transitions (confirm, start, complete, cancel, no-show) ✅ TESTED
76
+ - [x] Cancellation reason dialog ✅ TESTED
77
+ - [x] Calendar view (Schedule-X week/day/month, doctor colors) ✅ TESTED
78
+ - [x] Availability checker (dialog on appointments page + sidebar on calendar)
79
+ - [x] Doctor schedule view (doctor filter on calendar + appointments page)
80
+
81
+ ### Treatments
82
+ - [x] Treatment catalog list (category filter chips, table) ✅ TESTED
83
+ - [x] Create treatment (name, category, description, duration, price, recall) ✅ TESTED
84
+ - [x] Edit treatment ✅ TESTED
85
+ - [x] Delete treatment (soft-delete) ✅ TESTED
86
+ - [x] Treatment plans list (per patient, collapsible cards with progress) ✅ TESTED
87
+ - [x] Create treatment plan with items ✅ TESTED
88
+ - [x] Add items to plan (treatment combobox, auto-fill name) ✅ TESTED
89
+ - [x] Plan item status management (inline dropdown) ✅ TESTED
90
+ - [x] Delete plan / remove items ✅ TESTED
91
+ - [x] Tooth number input (dental badge display) ✅ TESTED
92
+
93
+ ### Users
94
+ - [x] Users list (table, role badges, clinic assignments, status) ✅ TESTED
95
+ - [x] Invite user dialog (name, email, password, role, clinics) ✅ TESTED
96
+ - [x] User edit page (/users/:id/edit — name, role, phone, permissions grid)
97
+ - [x] Per-user custom permissions (full override, grouped checkbox grid)
98
+ - [x] Doctor profile page (/users/:id/profile — specialty, working hours, breaks, holidays)
99
+ - [x] Availability blocks (holidays, leaves, breaks — AvailabilityBlock model)
100
+ - [x] Per-day slot duration + break times in working hours
101
+ - [x] Deactivate user (soft-delete)
102
+ - [x] Clinic assignments management (checkbox list on user edit page)
103
+
104
+ ### Clinics
105
+ - [x] Clinics list (card grid with patient/appointment counts, timezone)
106
+ - [x] Create clinic dialog (name, slug, address, phone, email, timezone)
107
+ - [x] Clinic settings page (/clinics/:id/settings — general, AI, operator, SMS, retention)
108
+ - [x] Meta connections management (WhatsApp/Instagram — add, delete, token status)
109
+ - [x] Google Calendar connection (OAuth connect/disconnect)
110
+
111
+ ## Pages — Communication
112
+
113
+ ### Chats (WhatsApp/Instagram)
114
+ - [x] Chat list (sidebar, search, status filter, auto-refresh) ✅ TESTED
115
+ - [x] Chat view (message bubbles — contact/AI/human, timestamps)
116
+ - [x] Send message (text input, Enter to send)
117
+ - [x] Session status indicators (AI/Human/Waiting badges)
118
+ - [x] Takeover / release / resolve actions
119
+ - [x] Chat assignment system (assign to staff, chats:read_own for sales)
120
+ - [ ] Blacklist management
121
+ - [ ] Real-time updates (Socket.IO — currently polling)
122
+
123
+ ### Calls
124
+ - [ ] Calls list (filterable by direction, status)
125
+ - [ ] Call detail (transcript, summary, recording)
126
+ - [ ] Call stats dashboard
127
+
128
+ ### Leads
129
+ - [ ] Leads list (filterable by status)
130
+ - [ ] Lead detail
131
+ - [ ] Status update (contacted, scheduled, lost, etc.)
132
+ - [ ] Today's leads view
133
+ - [ ] CSV export
134
+
135
+ ## Pages — Campaigns & Validation
136
+
137
+ ### Outbound Campaigns
138
+ - [ ] Campaign list
139
+ - [ ] Create campaign wizard (agent config, schedule, extraction schema)
140
+ - [ ] Upload entries (CSV)
141
+ - [ ] Campaign detail (stats, entries, results)
142
+ - [ ] Start / pause / resume / stop controls
143
+ - [ ] Results export
144
+
145
+ ### Appointment Validation
146
+ - [ ] Batch list
147
+ - [ ] Create batch (CSV upload, column mapping)
148
+ - [ ] Batch detail (entries, stats)
149
+ - [ ] Submit / cancel / retry actions
150
+ - [ ] Export results
151
+
152
+ ## Pages — Admin & Settings
153
+
154
+ ### Billing
155
+ - [ ] Usage summary (plan vs actual)
156
+ - [ ] Daily trend chart
157
+ - [ ] Billing history
158
+ - [ ] Past period snapshots
159
+ - [ ] Record payment
160
+
161
+ ### Agents
162
+ - [ ] Agent list
163
+ - [ ] Agent config (ElevenLabs settings)
164
+ - [ ] Toggle active
165
+
166
+ ### Phone Numbers
167
+ - [ ] Phone number list
168
+ - [ ] Register phone number
169
+ - [ ] Schedule management (inbound calls)
170
+
171
+ ### Settings
172
+ - [ ] General settings
173
+ - [ ] Profile / password change
174
+
175
+ ### Audit & Logs
176
+ - [ ] Audit trail (filterable)
177
+ - [ ] System logs (admin)
178
+
179
+ ## Dashboard
180
+ - [x] Stat cards (patients, appointments, sessions, leads)
181
+ - [ ] Charts (calls per day, appointment trends)
182
+ - [ ] Recent activity feed
183
+ - [ ] Today's appointments list
184
+ - [ ] Active AI sessions
185
+ - [ ] Quick actions
186
+
187
+ ## Security & Auth
188
+ - [x] Opaque token auth (localStorage) ✅ TESTED
189
+ - [x] 401 interceptor with refresh ✅ TESTED
190
+ - [x] Auth guard on protected routes ✅ TESTED
191
+ - [x] Token cleared on login page mount ✅ TESTED
192
+ - [x] File proxy (no MinIO URL exposure) ✅ TESTED
193
+ - [x] Query param token for file streaming ✅ TESTED
194
+ - [ ] Role-based UI (hide buttons/pages by permission)
195
+ - [ ] Session timeout warning
196
+
197
+ ## Performance
198
+ - [x] Lazy loading (React.lazy + Suspense)
199
+ - [x] React Compiler (automatic memoization)
200
+ - [ ] Code splitting per route chunk
201
+ - [ ] Image optimization
202
+ - [ ] Virtual scrolling for large lists
203
+
204
+ ## Testing
205
+ - [ ] Unit tests
206
+ - [ ] Integration tests
207
+ - [ ] E2E tests (Playwright)
208
+
209
+ ## Deployment
210
+ - [ ] Production build config
211
+ - [ ] Docker container
212
+ - [ ] Electron desktop wrapper
213
+ - [ ] Auto-update mechanism
214
+
215
+ ---
216
+
217
+ ## Bug Fixes Applied
218
+ - [x] CORS: added PUT/PATCH/DELETE methods
219
+ - [x] Patient search: frontend sends ?q= (was ?search=)
220
+ - [x] Response structure: reads data.meta.total (was data.total)
221
+ - [x] Doctor role: added patients:create permission
222
+ - [x] Default clinic: auto-assigned on patient creation
223
+ - [x] Note author: display author.firstName + lastName (was authorName)
224
+ - [x] Document size: reads doc.sizeBytes (was doc.size → NaN)
225
+ - [x] DB schema sync: pushed appt_reminder_sent columns
226
+ - [x] File size limit: increased Fastify body limit to 50MB
227
+ - [x] Referral tracking: sourceDetail field in create/edit forms
@@ -0,0 +1,470 @@
1
+ # Implementation Status
2
+
3
+ > NestJS Backend — Portal Asistan 7/24
4
+ > Last updated: 2026-04-03
5
+
6
+ ---
7
+
8
+ ## Tech Stack (Implemented)
9
+
10
+ | Layer | Technology | Status |
11
+ |-------|-----------|--------|
12
+ | Framework | NestJS + Fastify adapter | Working |
13
+ | Language | TypeScript (strict) | Working |
14
+ | Database | PostgreSQL + Prisma ORM | Working (44 models, 31 enums) |
15
+ | Cache & Queues | Redis + BullMQ | Working (18 queues registered) |
16
+ | Object Storage | MinIO (S3-compatible) | Client implemented |
17
+ | Auth | Opaque tokens + Redis-backed JWT | Working |
18
+ | API Docs | Swagger (auto-generated) | Working at /api/docs |
19
+ | Security | Helmet, CORS, class-validator DTOs | Working |
20
+ | Rate Limiting | @nestjs/throttler + Redis | Working |
21
+ | Encryption | AES-256-GCM (5 keys) | Working |
22
+ | Events | @nestjs/event-emitter | Working |
23
+
24
+ ---
25
+
26
+ ## Modules (34 total)
27
+
28
+ ### Infrastructure (7 modules)
29
+
30
+ | Module | Path | Description | Status |
31
+ |--------|------|-------------|--------|
32
+ | ConfigModule | `src/config/` | Global, loads .env | Working |
33
+ | DatabaseModule | `src/database/` | Global, PrismaService with PostgreSQL + Prisma adapter | Working |
34
+ | RedisModule | `src/redis/` | Global, ioredis client | Working |
35
+ | QueueModule | `src/queue/` | Global, 18 BullMQ queues | Working (queues registered, processors are stubs) |
36
+ | EncryptionModule | `src/encryption/` | Global, AES-256-GCM encrypt/decrypt | Working |
37
+ | AuthModule | `src/auth/` | Global, opaque tokens + Redis JWT, login/register/refresh/logout/password reset | Working |
38
+ | EventEmitterModule | (NestJS built-in) | Inter-module communication | Working |
39
+
40
+ ### Core Domain (9 modules)
41
+
42
+ | Module | Endpoints | Status | Details |
43
+ |--------|-----------|--------|---------|
44
+ | TenantsModule | 2 | Working | GET/PUT /tenants/me |
45
+ | UsersModule | 6 | Working | Full CRUD with invite, clinic assignments, soft delete |
46
+ | ClinicsModule | 5 | Working | Full CRUD, 27-column config, auto-slug |
47
+ | PlansModule | 4 | Working | CRUD (superadmin manages, all read) |
48
+ | PatientsModule | 12 | Working | CRM with search, medical history, notes, PII encryption |
49
+ | TreatmentsModule | 13 | Working | Catalog + treatment plans with items, encrypted notes |
50
+ | AgentsModule | 5 | Working | CRUD + toggle active |
51
+ | PhoneNumbersModule | 6 | Working | CRUD + schedule update |
52
+ | BillingModule | 5 | Working | Usage summary, daily trend, snapshots, payments |
53
+
54
+ ### Communication (7 modules)
55
+
56
+ | Module | Endpoints | Status | Details |
57
+ |--------|-----------|--------|---------|
58
+ | WhatsAppModule | 11 | Partial | Chat/session queries work, message decryption works, blacklist CRUD works. AI engine (ElevenLabs WS, grace period, message buffer) is TODO |
59
+ | CallsModule | 3 | Working | Paginated list, stats, detail with transcript |
60
+ | LeadsModule | 5 | Working | List, today, get, update status, CSV export |
61
+ | GoogleCalendarModule | 5 | Working | OAuth flow, availability checking, event CRUD |
62
+ | OutboundCampaignsModule | 13 | Working | Full state machine, entries, start/pause/resume/stop, retry, export |
63
+ | AppointmentValidationModule | 8 | Working | Batch lifecycle, submit, cancel, retry, export |
64
+ | WebhooksModule | 4 | Partial | Meta webhook verification + event emission works. ElevenLabs webhook enqueues to BullMQ. Tool webhook returns stub. |
65
+
66
+ ### Tools (1 module)
67
+
68
+ | Module | Details | Status |
69
+ |--------|---------|--------|
70
+ | ToolsModule | 13 tool handlers registered via @Tool() auto-discovery | Partial — Registry, adapters, and handler structure work. Tool handler implementations are TODO stubs. |
71
+
72
+ ### Integrations (6 modules)
73
+
74
+ | Module | Status | Details |
75
+ |--------|--------|---------|
76
+ | ElevenLabsModule | Working | HTTP client for signed URLs, conversations, batch calls, SIP outbound, STT |
77
+ | MetaBusinessModule | Working | WhatsApp Cloud API (send text/template/media/interactive), Instagram Messenger, webhook HMAC verification |
78
+ | AIModule | Working | OpenAI + Anthropic providers, provider resolution chain (agent -> clinic -> env) |
79
+ | MinioModule | Working | Upload, download, signed URLs, bulk delete, bucket management |
80
+ | NetGSMModule | Stub | Returns `{ success: false }` |
81
+ | TekTipPayModule | Stub | Returns `{ success: false }` |
82
+
83
+ ### Platform & Admin (2 modules)
84
+
85
+ | Module | Endpoints | Status | Details |
86
+ |--------|-----------|--------|---------|
87
+ | PlatformModule | 6 | Working | Sales tenant onboarding (create tenant+clinic+owner, list, update, deactivate/reactivate) |
88
+ | AdminModule | 2 | Working | System health check, global usage stats |
89
+
90
+ ### Observability (2 modules)
91
+
92
+ | Module | Endpoints | Status | Details |
93
+ |--------|-----------|--------|---------|
94
+ | LoggingModule | 4 | Working | Async batched PostgreSQL writer (buffer 100, flush 5s), paginated log queries, stats, cleanup, request tracing |
95
+ | AuditModule | 3 | Working | Synchronous immutable writes, @Auditable() decorator + interceptor, entity/user history queries |
96
+
97
+ ---
98
+
99
+ ## Endpoints Summary (~131 total)
100
+
101
+ ### Auth (8 endpoints)
102
+
103
+ | Method | Path | Permission | Status |
104
+ |--------|------|-----------|--------|
105
+ | POST | `/auth/login` | Public (rate limited: 5/min) | Working |
106
+ | POST | `/auth/register` | Public (rate limited: 3/hr) | Working |
107
+ | POST | `/auth/refresh` | Public | Working |
108
+ | POST | `/auth/logout` | Authenticated | Working |
109
+ | POST | `/auth/change-password` | Authenticated | Working |
110
+ | POST | `/auth/forgot-password` | Public (rate limited: 3/15min) | Working |
111
+ | POST | `/auth/reset-password` | Public | Working |
112
+ | GET | `/auth/me` | Authenticated | Working |
113
+
114
+ ### Tenants (2 endpoints)
115
+
116
+ | Method | Path | Permission | Status |
117
+ |--------|------|-----------|--------|
118
+ | GET | `/tenants/me` | Authenticated | Working |
119
+ | PUT | `/tenants/me` | `tenant:update` | Working |
120
+
121
+ ### Users (6 endpoints)
122
+
123
+ | Method | Path | Permission | Status |
124
+ |--------|------|-----------|--------|
125
+ | GET | `/users` | `users:read` | Working |
126
+ | GET | `/users/:id` | `users:read` | Working |
127
+ | POST | `/users/invite` | `users:invite` | Working |
128
+ | PUT | `/users/:id` | `users:update` | Working |
129
+ | PUT | `/users/:id/clinics` | `users:update` | Working |
130
+ | DELETE | `/users/:id` | `users:delete` | Working |
131
+
132
+ ### Clinics (5 endpoints)
133
+
134
+ | Method | Path | Permission | Status |
135
+ |--------|------|-----------|--------|
136
+ | GET | `/clinics` | `clinics:read` | Working |
137
+ | GET | `/clinics/:id` | `clinics:read` | Working |
138
+ | POST | `/clinics` | `clinics:create` | Working |
139
+ | PUT | `/clinics/:id` | `clinics:update` | Working |
140
+ | DELETE | `/clinics/:id` | `clinics:delete` | Working |
141
+
142
+ ### Plans (4 endpoints)
143
+
144
+ | Method | Path | Permission | Status |
145
+ |--------|------|-----------|--------|
146
+ | GET | `/plans` | Authenticated | Working |
147
+ | GET | `/plans/:id` | Authenticated | Working |
148
+ | POST | `/plans` | `platform:plans.manage` | Working |
149
+ | PUT | `/plans/:id` | `platform:plans.manage` | Working |
150
+
151
+ ### Patients (12 endpoints)
152
+
153
+ | Method | Path | Permission | Status |
154
+ |--------|------|-----------|--------|
155
+ | GET | `/patients` | `patients:read` | Working |
156
+ | GET | `/patients/search` | `patients:read` | Working |
157
+ | POST | `/patients` | `patients:create` | Working |
158
+ | GET | `/patients/:id` | `patients:read` | Working |
159
+ | PUT | `/patients/:id` | `patients:update` | Working |
160
+ | DELETE | `/patients/:id` | `patients:delete` | Working |
161
+ | GET | `/patients/:id/medical-history` | `patients:read` | Working |
162
+ | PUT | `/patients/:id/medical-history` | `patients:update` | Working |
163
+ | GET | `/patients/:id/notes` | `patients:read` | Working |
164
+ | POST | `/patients/:id/notes` | `patients:update` | Working |
165
+ | PUT | `/patients/:id/notes/:noteId` | `patients:update` | Working |
166
+ | DELETE | `/patients/:id/notes/:noteId` | `patients:update` | Working |
167
+
168
+ ### Treatments — Catalog (6 endpoints)
169
+
170
+ | Method | Path | Permission | Status |
171
+ |--------|------|-----------|--------|
172
+ | GET | `/treatments` | `treatments:read` | Working |
173
+ | GET | `/treatments/categories` | `treatments:read` | Working |
174
+ | POST | `/treatments` | `treatments:manage` | Working |
175
+ | GET | `/treatments/:id` | `treatments:read` | Working |
176
+ | PUT | `/treatments/:id` | `treatments:manage` | Working |
177
+ | DELETE | `/treatments/:id` | `treatments:manage` | Working |
178
+
179
+ ### Treatments — Plans (7 endpoints)
180
+
181
+ | Method | Path | Permission | Status |
182
+ |--------|------|-----------|--------|
183
+ | GET | `/patients/:patientId/treatment-plans` | `patients:read` | Working |
184
+ | POST | `/patients/:patientId/treatment-plans` | `treatment_plans:manage` | Working |
185
+ | GET | `/treatment-plans/:id` | `patients:read` | Working |
186
+ | PUT | `/treatment-plans/:id` | `treatment_plans:manage` | Working |
187
+ | DELETE | `/treatment-plans/:id` | `treatment_plans:manage` | Working |
188
+ | POST | `/treatment-plans/:id/items` | `treatment_plans:manage` | Working |
189
+ | PUT | `/treatment-plans/:id/items/:itemId` | `treatment_plans:manage` | Working |
190
+ | DELETE | `/treatment-plans/:id/items/:itemId` | `treatment_plans:manage` | Working |
191
+
192
+ ### Agents (5 endpoints)
193
+
194
+ | Method | Path | Permission | Status |
195
+ |--------|------|-----------|--------|
196
+ | GET | `/agents` | `agents:read` | Working |
197
+ | GET | `/agents/:id` | `agents:read` | Working |
198
+ | POST | `/agents` | `agents:manage` | Working |
199
+ | PUT | `/agents/:id` | `agents:manage` | Working |
200
+ | POST | `/agents/:id/toggle` | `agents:manage` | Working |
201
+
202
+ ### Phone Numbers (6 endpoints)
203
+
204
+ | Method | Path | Permission | Status |
205
+ |--------|------|-----------|--------|
206
+ | GET | `/phone-numbers` | `phone_numbers:read` | Working |
207
+ | GET | `/phone-numbers/:id` | `phone_numbers:read` | Working |
208
+ | POST | `/phone-numbers` | `phone_numbers:manage` | Working |
209
+ | PUT | `/phone-numbers/:id` | `phone_numbers:manage` | Working |
210
+ | PUT | `/phone-numbers/:id/schedule` | `phone_numbers:manage` | Working |
211
+ | DELETE | `/phone-numbers/:id` | `phone_numbers:manage` | Working |
212
+
213
+ ### Calls (3 endpoints)
214
+
215
+ | Method | Path | Permission | Status |
216
+ |--------|------|-----------|--------|
217
+ | GET | `/calls` | `calls:read` | Working |
218
+ | GET | `/calls/stats` | `calls:read` | Working |
219
+ | GET | `/calls/:id` | `calls:read` | Working |
220
+
221
+ ### Leads (5 endpoints)
222
+
223
+ | Method | Path | Permission | Status |
224
+ |--------|------|-----------|--------|
225
+ | GET | `/leads` | `leads:read` | Working |
226
+ | GET | `/leads/today` | `leads:read` | Working |
227
+ | GET | `/leads/export` | `leads:export` | Working |
228
+ | GET | `/leads/:id` | `leads:read` | Working |
229
+ | PATCH | `/leads/:id` | `leads:update` | Working |
230
+
231
+ ### Billing (5 endpoints)
232
+
233
+ | Method | Path | Permission | Status |
234
+ |--------|------|-----------|--------|
235
+ | GET | `/billing/usage` | `billing:read` | Working |
236
+ | GET | `/billing/daily-trend` | `billing:read` | Working |
237
+ | GET | `/billing/snapshots` | `billing:read` | Working |
238
+ | GET | `/billing/history` | `billing:read` | Working |
239
+ | POST | `/billing/payments` | `billing:manage` | Working |
240
+
241
+ ### WhatsApp (11 endpoints)
242
+
243
+ | Method | Path | Permission | Status |
244
+ |--------|------|-----------|--------|
245
+ | GET | `/whatsapp/chats` | `chats:read` | Working |
246
+ | GET | `/whatsapp/chats/:id` | `chats:read` | Working |
247
+ | GET | `/whatsapp/chats/:id/messages` | `chats:read` | Working |
248
+ | POST | `/whatsapp/chats/:id/takeover` | `chats:takeover` | Working |
249
+ | POST | `/whatsapp/chats/:id/messages` | `chats:send` | Working |
250
+ | POST | `/whatsapp/chats/:id/release` | `chats:takeover` | Working |
251
+ | POST | `/whatsapp/chats/:id/resolve` | `chats:resolve` | Working |
252
+ | GET | `/whatsapp/stats` | `chats:read` | Working |
253
+ | GET | `/whatsapp/blacklist` | `chats:config` | Working |
254
+ | POST | `/whatsapp/blacklist` | `chats:config` | Working |
255
+ | DELETE | `/whatsapp/blacklist/:phone` | `chats:config` | Working |
256
+
257
+ ### Google Calendar (5 endpoints)
258
+
259
+ | Method | Path | Permission | Status |
260
+ |--------|------|-----------|--------|
261
+ | GET | `/google-calendar/auth-url` | `calendar:manage` | Working |
262
+ | GET | `/google-calendar/callback` | Public (browser redirect) | Working |
263
+ | POST | `/google-calendar/disconnect` | `calendar:manage` | Working |
264
+ | GET | `/google-calendar/calendars` | `calendar:read` | Working |
265
+ | PUT | `/google-calendar/calendar` | `calendar:manage` | Working |
266
+
267
+ ### Outbound Campaigns (13 endpoints)
268
+
269
+ | Method | Path | Permission | Status |
270
+ |--------|------|-----------|--------|
271
+ | GET | `/outbound-campaigns` | `campaigns:read` | Working |
272
+ | GET | `/outbound-campaigns/:id` | `campaigns:read` | Working |
273
+ | POST | `/outbound-campaigns` | `campaigns:manage` | Working |
274
+ | PUT | `/outbound-campaigns/:id` | `campaigns:manage` | Working |
275
+ | DELETE | `/outbound-campaigns/:id` | `campaigns:manage` | Working |
276
+ | POST | `/outbound-campaigns/:id/entries` | `campaigns:manage` | Working |
277
+ | DELETE | `/outbound-campaigns/:id/entries` | `campaigns:manage` | Working |
278
+ | POST | `/outbound-campaigns/:id/start` | `campaigns:manage` | Working |
279
+ | POST | `/outbound-campaigns/:id/pause` | `campaigns:manage` | Working |
280
+ | POST | `/outbound-campaigns/:id/resume` | `campaigns:manage` | Working |
281
+ | POST | `/outbound-campaigns/:id/stop` | `campaigns:manage` | Working |
282
+ | POST | `/outbound-campaigns/:id/retry` | `campaigns:manage` | Working |
283
+ | GET | `/outbound-campaigns/:id/results` | `campaigns:read` | Working |
284
+ | GET | `/outbound-campaigns/:id/export` | `campaigns:export` | Working |
285
+
286
+ ### Appointment Validation (8 endpoints)
287
+
288
+ | Method | Path | Permission | Status |
289
+ |--------|------|-----------|--------|
290
+ | GET | `/appointment-validation` | `validation:read` | Working |
291
+ | GET | `/appointment-validation/:id` | `validation:read` | Working |
292
+ | POST | `/appointment-validation` | `validation:manage` | Working |
293
+ | POST | `/appointment-validation/:id/submit` | `validation:manage` | Working |
294
+ | POST | `/appointment-validation/:id/cancel` | `validation:manage` | Working |
295
+ | POST | `/appointment-validation/:id/retry` | `validation:manage` | Working |
296
+ | POST | `/appointment-validation/:id/entries/:entryId/retry` | `validation:manage` | Working |
297
+ | GET | `/appointment-validation/:id/export` | `validation:export` | Working |
298
+
299
+ ### Webhooks (4 endpoints)
300
+
301
+ | Method | Path | Permission | Status |
302
+ |--------|------|-----------|--------|
303
+ | POST | `/webhooks/elevenlabs` | Public (webhook) | Working (enqueues to BullMQ) |
304
+ | POST | `/webhooks/elevenlabs/tools/:toolName` | API Key (`x-api-key`) | Stub (returns `not_implemented`) |
305
+ | GET | `/webhooks/meta` | Public (`hub.challenge` verification) | Working |
306
+ | POST | `/webhooks/meta` | Public (HMAC-verified) | Working (emits events) |
307
+
308
+ ### Platform (6 endpoints)
309
+
310
+ | Method | Path | Permission | Status |
311
+ |--------|------|-----------|--------|
312
+ | GET | `/platform/tenants` | `platform:tenants.list` | Working |
313
+ | POST | `/platform/tenants` | `platform:tenants.create` | Working |
314
+ | GET | `/platform/tenants/:id` | `platform:tenants.read` | Working |
315
+ | PUT | `/platform/tenants/:id` | `platform:tenants.update` | Working |
316
+ | PUT | `/platform/tenants/:id/deactivate` | `platform:tenants.update` | Working |
317
+ | PUT | `/platform/tenants/:id/reactivate` | `platform:tenants.update` | Working |
318
+
319
+ ### Admin (2 endpoints)
320
+
321
+ | Method | Path | Permission | Status |
322
+ |--------|------|-----------|--------|
323
+ | GET | `/admin/system/health` | `platform:plans.manage` | Working |
324
+ | GET | `/admin/system/usage` | `platform:plans.manage` | Working |
325
+
326
+ ### Logs (4 endpoints)
327
+
328
+ | Method | Path | Permission | Status |
329
+ |--------|------|-----------|--------|
330
+ | GET | `/admin/logs` | `audit:read` | Working |
331
+ | GET | `/admin/logs/stats` | `audit:read` | Working |
332
+ | DELETE | `/admin/logs` | Superadmin only | Working |
333
+ | GET | `/admin/logs/request/:requestId` | `audit:read` | Working |
334
+
335
+ ### Audit Logs (3 endpoints)
336
+
337
+ | Method | Path | Permission | Status |
338
+ |--------|------|-----------|--------|
339
+ | GET | `/audit-logs` | `audit:read` | Working |
340
+ | GET | `/audit-logs/entity/:entity/:entityId` | `audit:read` | Working |
341
+ | GET | `/audit-logs/user/:userId` | `audit:read` | Working |
342
+
343
+ ---
344
+
345
+ ## Database Schema
346
+
347
+ - **44 Prisma models** (1677 lines in `prisma/schema.prisma`)
348
+ - **31 enums**
349
+ - Tables removed from original design: `whatsapp_contact_profiles` (#19), `whatsapp_recipients` (#35)
350
+ - Tables added for new CRM domain: `patients`, `patient_medical_histories`, `patient_documents`, `patient_notes`, `treatments`, `treatment_plans`, `treatment_plan_items`, `doctor_profiles`, `patient_photo_sets`, `patient_photos`, `examination_records`
351
+
352
+ ---
353
+
354
+ ## Security
355
+
356
+ | Feature | Status |
357
+ |---------|--------|
358
+ | Opaque tokens (client never sees JWT) | Working |
359
+ | Redis session storage | Working |
360
+ | bcrypt password hashing (12 rounds) | Working |
361
+ | AES-256-GCM encryption (5 keys) | Working |
362
+ | Tenant-scoped queries (Prisma middleware) | Structure ready, middleware TODO |
363
+ | RBAC with 40+ permissions | Working |
364
+ | Clinic-scoped access | Working |
365
+ | Rate limiting | Working |
366
+ | Helmet security headers | Working |
367
+ | CORS whitelist | Working |
368
+ | Webhook HMAC verification | Working (Meta) |
369
+ | Message encryption | Working |
370
+ | Patient PII encryption | Working |
371
+ | 2FA | Not planned for launch |
372
+
373
+ ---
374
+
375
+ ## BullMQ Queues (18)
376
+
377
+ | # | Queue Name | Purpose | Processor Status |
378
+ |---|-----------|---------|-----------------|
379
+ | 1 | `whatsapp-grace` | Grace period expiry | Stub |
380
+ | 2 | `whatsapp-message-buffer` | Message debounce | Stub |
381
+ | 3 | `whatsapp-session-cleanup` | Inactive session sweep | Stub |
382
+ | 4 | `whatsapp-cost-sweep` | ElevenLabs cost fetch | Stub |
383
+ | 5 | `whatsapp-operator-expiry` | Expire operator requests | Stub |
384
+ | 6 | `whatsapp-profile-update` | Patient AI summary update | Stub |
385
+ | 7 | `whatsapp-session-labels` | Sentiment/category generation | Stub |
386
+ | 8 | `whatsapp-message-cleanup` | Auto-delete old messages | Stub |
387
+ | 9 | `elevenlabs-webhook` | Post-call processing | Stub |
388
+ | 10 | `elevenlabs-tools` | Tool call processing | Stub |
389
+ | 11 | `billing-snapshot` | Period snapshot | Registered (no processor yet) |
390
+ | 12 | `billing-alerts` | Usage alerts | Registered (no processor yet) |
391
+ | 13 | `appointment-validation-dispatch` | Batch call dispatch | Stub |
392
+ | 14 | `appointment-validation-sync` | Status sync | Stub |
393
+ | 15 | `appointment-reminder` | Pre-appointment reminders | Registered (no processor yet) |
394
+ | 16 | `inbound-call-schedule-sync` | Phone schedule sync | Registered (no processor yet) |
395
+ | 17 | `log-cleanup` | Delete old logs | Registered (no processor yet) |
396
+ | 18 | `webhook-outgoing` | Tenant webhook delivery | Registered (no processor yet) |
397
+
398
+ ---
399
+
400
+ ## AI Tools (13)
401
+
402
+ | Tool | Feature Flag | Channels | Status |
403
+ |------|-------------|----------|--------|
404
+ | `check_availability` | `google_calendar` | whatsapp, voice_call, instagram | TODO |
405
+ | `reserve_slot` | `google_calendar` | whatsapp, voice_call, instagram | TODO |
406
+ | `list_reservations` | `google_calendar` | whatsapp, voice_call, instagram | TODO |
407
+ | `cancel_reservation` | `google_calendar` | whatsapp, voice_call, instagram | TODO |
408
+ | `reschedule_reservation` | `google_calendar` | whatsapp, voice_call, instagram | TODO |
409
+ | `forward_to_operator` | `operator_workflow` | whatsapp | TODO |
410
+ | `forward_conversation` | `operator_workflow` | whatsapp | TODO |
411
+ | `send_example_photo` | `operator_workflow` | whatsapp | TODO |
412
+ | `check_patient_history` | -- | whatsapp, voice_call, instagram | TODO |
413
+ | `call_patient` | `outbound_calls` | whatsapp | TODO |
414
+ | `confirm_appointment_validation` | `appointment_validation` | voice_call | TODO |
415
+ | `request_payment` | `tektippay` | whatsapp, instagram | Stub (TekTipPay not implemented) |
416
+ | `send_sms` | `sms` | whatsapp, voice_call, instagram | Stub (NetGSM not implemented) |
417
+
418
+ ---
419
+
420
+ ## What's TODO
421
+
422
+ ### Priority 1 -- Core functionality gaps
423
+
424
+ - WhatsApp AI engine (ElevenLabs WebSocket connection, message buffering, grace period logic)
425
+ - BullMQ processor implementations (all 8 WhatsApp processors)
426
+ - Operator workflow forwarding (REF code generation, media forwarding via Meta API)
427
+ - Tool handler implementations (calendar tools, patient history, operator tools)
428
+ - Prisma tenant-scoping middleware (auto-inject WHERE tenantId)
429
+ - Real-time WebSocket gateway (Socket.IO for dashboard live updates)
430
+
431
+ ### Priority 2 -- Integration completions
432
+
433
+ - ElevenLabs WebSocket text-only chat integration
434
+ - Meta Business API webhook message processing (normalize payload, route to WhatsApp engine)
435
+ - Google Calendar sync (our calendar -> Google, bidirectional)
436
+ - Appointment reminder BullMQ processor
437
+ - Message auto-deletion BullMQ processor
438
+
439
+ ### Priority 3 -- Polish
440
+
441
+ - Billing snapshot and alert BullMQ processors
442
+ - Outbound campaign dispatch processor
443
+ - Appointment validation dispatch + sync processors
444
+ - Log cleanup processor
445
+ - Error handling standardization
446
+ - Request context (AsyncLocalStorage for correlation IDs)
447
+ - Audit trail integration on all mutating endpoints
448
+
449
+ ### Not planned for launch
450
+
451
+ - 2FA (TOTP)
452
+ - NetGSM SMS (stub)
453
+ - TekTipPay payments (stub)
454
+ - Baileys WhatsApp bridge
455
+ - Patient financial ledger
456
+ - Patient portal
457
+
458
+ ---
459
+
460
+ ## Encryption Keys
461
+
462
+ | Key | Env Variable | Protects |
463
+ |-----|-------------|----------|
464
+ | Google tokens | `GOOGLE_TOKEN_ENCRYPTION_KEY` | Google Calendar OAuth refresh tokens |
465
+ | Meta tokens | `META_TOKEN_ENCRYPTION_KEY` | Meta Business API access tokens |
466
+ | Messages | `MESSAGE_ENCRYPTION_KEY` | Chat messages, operator request text/responses |
467
+ | Patient PII | `PATIENT_PII_ENCRYPTION_KEY` | TC Kimlik, medical history, exam records, clinical notes |
468
+ | Patient summaries | `PATIENT_SUMMARY_ENCRYPTION_KEY` | AI-generated patient summaries |
469
+
470
+ All keys: 32-byte hex. Generate with `openssl rand -hex 32`.