"""Setup email notifications in ERPNext for DiDi. Required env vars: SENDGRID_API_KEY — SendGrid SMTP credential (starts with `SG.`) ERPNEXT_ADMIN_PASSWORD — ERPNext Administrator password (default: admin, dev only) ERPNEXT_URL — ERPNext base URL (default: http://localhost:8080) """ import sys, io, os, requests sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8") SENDGRID_API_KEY = os.environ.get("SENDGRID_API_KEY") if not SENDGRID_API_KEY: print("ERROR: SENDGRID_API_KEY env var not set. Export it before running:") print(" export SENDGRID_API_KEY='SG.your-real-key-here'") exit(1) URL = os.environ.get("ERPNEXT_URL", "http://localhost:8080") ADMIN_PWD = os.environ.get("ERPNEXT_ADMIN_PASSWORD", "admin") s = requests.Session() r = s.post(f"{URL}/api/method/login", data={"usr": "Administrator", "pwd": ADMIN_PWD}) if r.status_code != 200: print(f"Login failed: {r.status_code} — check ERPNEXT_ADMIN_PASSWORD") exit(1) print("Logged in") def exists(doctype, name): r = s.get(f"{URL}/api/resource/{requests.utils.quote(doctype)}/{requests.utils.quote(name)}") return r.status_code == 200 # ── 1. Email Account (SendGrid) ── print("\n1. Email Account...") if exists("Email Account", "DiDi Outgoing"): print(" Already exists") else: r = s.post(f"{URL}/api/resource/Email%20Account", json={ "email_account_name": "DiDi Outgoing", "email_id": "office@clossers.com", "smtp_server": "smtp.sendgrid.net", "smtp_port": 587, "use_tls": 1, "use_ssl": 0, "login_id_for_outgoing": 1, "login_id": "apikey", "password": SENDGRID_API_KEY, "default_outgoing": 1, "enable_outgoing": 1, "enable_incoming": 0, "send_notifications": 1, "always_use_account_email_id_as_sender": 1, "always_use_account_name_as_sender_name": 1, "append_to": "", }) print(f" Created: {r.status_code}") # ── 2. Notification: Factura Emisa ── print("\n2. Notification: Factura Emisa...") if exists("Notification", "DiDi - Factura Emisa"): print(" Already exists") else: r = s.post(f"{URL}/api/resource/Notification", json={ "name": "DiDi - Factura Emisa", "subject": "Factura {{ doc.name }} - {{ doc.grand_total }} {{ doc.currency }}", "document_type": "Sales Invoice", "event": "Submit", "channel": "Email", "attach_print": 1, "print_format": "DiDi Invoice", "condition": "doc.docstatus == 1", "recipients": [ { "receiver_by_document_field": "contact_email", } ], "message": """

DiDi - Factura Emisa

Stimate client,

Va informam ca a fost emisa factura {{ doc.name }}.

Nr. Factura{{ doc.name }}
Data{{ doc.posting_date }}
Total{{ doc.grand_total }} {{ doc.currency }}
Status{{ doc.status }}

Factura in format PDF este atasata la acest email.

Va multumim,
Echipa DiDi / Clossers

TOP CLOSSERS SRL | CUI: 36193026 | office@clossers.com
""", "enabled": 1, }) print(f" Created: {r.status_code}") # ── 3. Notification: Plata Confirmata ── print("\n3. Notification: Plata Confirmata...") if exists("Notification", "DiDi - Plata Confirmata"): print(" Already exists") else: r = s.post(f"{URL}/api/resource/Notification", json={ "name": "DiDi - Plata Confirmata", "subject": "Plata confirmata - {{ doc.amount }} {{ doc.currency }}", "document_type": "Payment Log", "event": "New", "channel": "Email", "condition": "doc.status == 'Succeeded'", "recipients": [ { "receiver_by_document_field": "customer", } ], "message": """

Plata Confirmata

Stimate client,

Va confirmam ca plata dumneavoastra a fost procesata cu succes.

Suma{{ doc.amount }} {{ doc.currency }}
Status{{ doc.status }}
Data{{ doc.creation }}

Factura fiscala va fi disponibila in dashboard-ul dumneavoastra.

Va multumim,
Echipa DiDi / Clossers

TOP CLOSSERS SRL | CUI: 36193026 | office@clossers.com
""", "enabled": 1, }) print(f" Created: {r.status_code}") # ── 4. Notification: Expirare Abonament (7 zile inainte) ── print("\n4. Notification: Expirare Abonament...") if exists("Notification", "DiDi - Expirare Abonament Notificare"): print(" Already exists") else: r = s.post(f"{URL}/api/resource/Notification", json={ "name": "DiDi - Expirare Abonament Notificare", "subject": "Abonamentul dumneavoastra expira in curand", "document_type": "Subscription", "event": "Days Before", "days_in_advance": 7, "date_changed": "current_invoice_end", "channel": "Email", "condition": "doc.status == 'Active'", "recipients": [ { "receiver_by_document_field": "party", } ], "message": """

Abonament - Expirare Apropiata

Stimate client,

Va informam ca abonamentul dumneavoastra expira pe {{ doc.current_invoice_end }}.

Pentru a continua sa beneficiati de serviciile DiDi, va rugam sa reinnoti abonamentul din dashboard.

Va multumim,
Echipa DiDi / Clossers

""", "enabled": 1, }) print(f" Created: {r.status_code}") print("\nDone! Email infrastructure ready.") print("Email Account 'DiDi Outgoing' configured with key from SENDGRID_API_KEY env var.") print("To rotate the key, run this script again with a new SENDGRID_API_KEY value.")