Files
weval-l99/ethica-sync-to-send_contacts.py
2026-04-20 11:56:38 +02:00

89 lines
3.2 KiB
Python
Executable File

#!/usr/bin/env python3
"""
ETHICA → admin.send_contacts SYNC · Opus 20avr · Doctrine #13 cause racine
Écrit les HCPs Ethica avec email valide vers admin.send_contacts
Évite doublons via WHERE NOT EXISTS
"""
import psycopg2, time, sys, os
DB = "host=10.1.0.3 dbname=adx_system user=admin password=admin123"
BATCH = int(sys.argv[1]) if len(sys.argv) > 1 else 5000
LOG = "/var/log/weval/ethica-sync-send_contacts.log"
def log(msg):
line = f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {msg}"
print(line)
os.makedirs(os.path.dirname(LOG), exist_ok=True)
with open(LOG, "a") as f:
f.write(line + "\n")
def main():
conn = psycopg2.connect(DB)
cur = conn.cursor()
# Count gap
cur.execute("""
SELECT COUNT(*) FROM ethica.medecins_real e
WHERE e.email IS NOT NULL AND e.email != '' AND e.email != 'N/A'
AND NOT EXISTS (
SELECT 1 FROM admin.send_contacts sc
WHERE sc.email = e.email AND sc.source = 'ethica_hcp'
)
""")
gap = cur.fetchone()[0]
log(f"GAP: {gap} HCPs Ethica avec email not-in send_contacts")
if gap == 0:
log("NOTHING TO SYNC")
conn.close()
return
# Bulk INSERT via SELECT (atomic, efficient)
cur.execute("""
INSERT INTO admin.send_contacts (email, first_name, last_name, country, source, created_at, status)
SELECT DISTINCT ON (e.email)
e.email,
COALESCE(NULLIF(split_part(e.nom, ' ', 1), ''), '') AS first_name,
COALESCE(NULLIF(substring(e.nom from position(' ' in e.nom)+1), ''), e.nom) AS last_name,
COALESCE(e.pays, 'MA') AS country,
'ethica_hcp' AS source,
NOW(),
'active'
FROM ethica.medecins_real e
WHERE e.email IS NOT NULL AND e.email != '' AND e.email != 'N/A'
AND NOT EXISTS (
SELECT 1 FROM admin.send_contacts sc
WHERE sc.email = e.email AND sc.source = 'ethica_hcp'
)
LIMIT %s
ON CONFLICT DO NOTHING
""", (BATCH,))
inserted = cur.rowcount
conn.commit()
log(f"INSERTED {inserted} rows from ethica.medecins_real to admin.send_contacts")
# Verify
cur.execute("SELECT COUNT(*) FROM admin.send_contacts WHERE source = 'ethica_hcp'")
total = cur.fetchone()[0]
cur.execute("SELECT MAX(created_at) FROM admin.send_contacts WHERE source = 'ethica_hcp'")
latest = cur.fetchone()[0]
log(f"POST-SYNC: total ethica_hcp = {total}, latest = {latest}")
# Doctrine #4 honesty: report dedup count (skipped email already present via other source)
cur.execute("""
SELECT COUNT(*) FROM ethica.medecins_real e
WHERE e.email IS NOT NULL AND e.email != '' AND e.email != 'N/A'
AND NOT EXISTS (SELECT 1 FROM admin.send_contacts sc WHERE sc.email = e.email AND sc.source = 'ethica_hcp')
AND EXISTS (SELECT 1 FROM admin.send_contacts sc2 WHERE sc2.email = e.email)
""")
dedup = cur.fetchone()[0]
if dedup > 0:
log(f"DEDUP: {dedup} HCPs skipped (email already in send_contacts via another source = OK, reachable)")
conn.close()
log("DONE")
if __name__ == "__main__":
main()