"""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": """
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
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
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