78 lines
2.6 KiB
Python
Executable File
78 lines
2.6 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}")
|
|
|
|
conn.close()
|
|
log("DONE")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|