110 lines
3.2 KiB
Python
110 lines
3.2 KiB
Python
import json
|
|
|
|
import frappe
|
|
from frappe import _
|
|
|
|
|
|
@frappe.whitelist()
|
|
def ensure_asan_login(phone, user_id):
|
|
"""Reuse the single Asan Login record (or create one) and reset its auth state.
|
|
|
|
The wizard is one-shot, so we keep at most one record. If the user goes back to the
|
|
credentials step and changes phone/user_id, we wipe the previous tokens so a fresh
|
|
auth round can run cleanly.
|
|
"""
|
|
_only_admin()
|
|
|
|
existing = frappe.get_all("Asan Login", limit=1, fields=["name"])
|
|
if existing:
|
|
doc = frappe.get_doc("Asan Login", existing[0].name)
|
|
else:
|
|
doc = frappe.new_doc("Asan Login")
|
|
|
|
doc.phone = phone
|
|
doc.user_id = user_id
|
|
doc.auth_status = "Not Authenticated"
|
|
doc.bearer_token = ""
|
|
doc.main_token = ""
|
|
doc.certificates_json = ""
|
|
doc.selected_certificate = ""
|
|
doc.selected_certificate_index = ""
|
|
doc.selected_certificate_json = ""
|
|
doc.choose_taxpayer_response = ""
|
|
doc.verification_code = ""
|
|
doc.is_default = 1
|
|
doc.flags.ignore_permissions = True
|
|
doc.save() if existing else doc.insert(ignore_permissions=True)
|
|
|
|
return {"name": doc.name}
|
|
|
|
|
|
@frappe.whitelist()
|
|
def get_company_from_cert(asan_login_name):
|
|
"""After select_taxpayer ran, pull the company name + VÖEN from the chosen
|
|
certificate. The cert payload from the tax portal already carries everything we need
|
|
for the wizard's company step — no extra HTTP call required.
|
|
"""
|
|
_only_admin()
|
|
|
|
doc = frappe.get_doc("Asan Login", asan_login_name)
|
|
cert = json.loads(doc.selected_certificate_json or "{}")
|
|
|
|
legal = cert.get("legalInfo") or {}
|
|
# Wizard is legal-only by user requirement; we still defensively fall back to
|
|
# individualInfo so the JS never crashes if a stray individual cert sneaks in.
|
|
individual = cert.get("individualInfo") or {}
|
|
|
|
return {
|
|
"taxpayer_type": cert.get("taxpayerType") or "",
|
|
"company_name": legal.get("name") or individual.get("name") or "",
|
|
"voen": legal.get("voen") or legal.get("tin") or individual.get("fin") or "",
|
|
}
|
|
|
|
|
|
@frappe.whitelist()
|
|
def reset_company_selection(asan_login_name):
|
|
"""Roll back after a wrong certificate pick. The e-taxes bearer_token is
|
|
single-use per chooseTaxpayer call, so we wipe the full auth state — the
|
|
caller is expected to immediately re-run handle_authentication to obtain a
|
|
fresh bearer_token via another phone tap. Also clears the wizard cache
|
|
(both e-taxes and AMAS) so the next pick starts from a clean slate.
|
|
"""
|
|
_only_admin()
|
|
|
|
doc = frappe.get_doc("Asan Login", asan_login_name)
|
|
doc.bearer_token = ""
|
|
doc.main_token = ""
|
|
doc.certificates_json = ""
|
|
doc.selected_certificate = ""
|
|
doc.selected_certificate_index = ""
|
|
doc.selected_certificate_json = ""
|
|
doc.choose_taxpayer_response = ""
|
|
doc.verification_code = ""
|
|
doc.auth_status = "Not Authenticated"
|
|
doc.flags.ignore_permissions = True
|
|
doc.save()
|
|
|
|
cache = frappe.get_single("Jey Wizard Etaxes Cache")
|
|
for field in (
|
|
"objects_json",
|
|
"cash_registers_json",
|
|
"pos_terminals_json",
|
|
"bank_accounts_json",
|
|
"presented_certs_json",
|
|
"amas_selected_employees_json",
|
|
"last_summary",
|
|
"last_error",
|
|
):
|
|
cache.set(field, "")
|
|
cache.fetched_at = None
|
|
cache.flags.ignore_permissions = True
|
|
cache.save()
|
|
frappe.db.commit()
|
|
|
|
return {"ok": True}
|
|
|
|
|
|
def _only_admin():
|
|
if frappe.session.user != "Administrator":
|
|
frappe.throw(_("Only Administrator may run setup"), frappe.PermissionError)
|