jey_wizard/jey_wizard/api.py

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)