fix_call_relations.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import sqlite3
  2. from pathlib import Path
  3. DB = Path("data/telephony.sqlite3")
  4. con = sqlite3.connect(DB)
  5. con.execute("PRAGMA foreign_keys = ON")
  6. # Neue direkte Beziehung zum echten 3CX-CDR-Datensatz.
  7. cols = {
  8. row[1]
  9. for row in con.execute("PRAGMA table_info(transcripts)")
  10. }
  11. if "cdr_row_id" not in cols:
  12. con.execute("""
  13. ALTER TABLE transcripts
  14. ADD COLUMN cdr_row_id INTEGER
  15. """)
  16. # call_id darf künftig NULL sein.
  17. # SQLite erlaubt keine direkte Änderung von NOT NULL.
  18. # Bestehende 0 wird deshalb als "nicht verknüpft" behandelt.
  19. # Die echte Beziehung läuft über cdr_row_id.
  20. analysis_cols = {
  21. row[1]
  22. for row in con.execute("PRAGMA table_info(analyses)")
  23. }
  24. if "cdr_row_id" not in analysis_cols:
  25. con.execute("""
  26. ALTER TABLE analyses
  27. ADD COLUMN cdr_row_id INTEGER
  28. """)
  29. con.execute("""
  30. CREATE INDEX IF NOT EXISTS idx_transcripts_cdr_row_id
  31. ON transcripts(cdr_row_id)
  32. """)
  33. con.execute("""
  34. CREATE INDEX IF NOT EXISTS idx_analyses_cdr_row_id
  35. ON analyses(cdr_row_id)
  36. """)
  37. # Das bereits analysierte Recording 4648 eindeutig zuordnen.
  38. cdr = con.execute("""
  39. SELECT id
  40. FROM cdr_calls
  41. WHERE src_rec_id = 4648
  42. OR dst_rec_id = 4648
  43. ORDER BY id
  44. LIMIT 1
  45. """).fetchone()
  46. if cdr:
  47. cdr_row_id = cdr[0]
  48. con.execute("""
  49. UPDATE transcripts
  50. SET cdr_row_id = ?
  51. WHERE rec_id = 4648
  52. """, (cdr_row_id,))
  53. con.execute("""
  54. UPDATE analyses
  55. SET cdr_row_id = ?
  56. WHERE transcript_id IN (
  57. SELECT id
  58. FROM transcripts
  59. WHERE rec_id = 4648
  60. )
  61. """, (cdr_row_id,))
  62. print(f"recId 4648 → cdr_calls.id {cdr_row_id}")
  63. else:
  64. print("WARNUNG: CDR für recId 4648 nicht gefunden.")
  65. con.commit()
  66. print()
  67. print("=== VERKNÜPFUNG ===")
  68. row = con.execute("""
  69. SELECT
  70. t.id AS transcript_id,
  71. t.cdr_row_id,
  72. t.rec_id,
  73. a.id AS analysis_id,
  74. c.cdr_id,
  75. c.start_time,
  76. c.source_caller_id,
  77. c.src_rec_id
  78. FROM transcripts t
  79. LEFT JOIN analyses a
  80. ON a.transcript_id = t.id
  81. LEFT JOIN cdr_calls c
  82. ON c.id = t.cdr_row_id
  83. WHERE t.rec_id = 4648
  84. ORDER BY t.id DESC
  85. LIMIT 1
  86. """).fetchone()
  87. if row:
  88. print(
  89. "transcript_id =", row[0],
  90. "| cdr_row_id =", row[1],
  91. "| rec_id =", row[2],
  92. "| analysis_id =", row[3],
  93. "| cdr_id =", row[4],
  94. "| start =", row[5],
  95. "| caller =", row[6],
  96. "| recording =", row[7],
  97. )
  98. con.close()