refactor: rename EMAS to AMAS throughout application

This commit renames all references from "emas" to "amas" in the invoice_az application, including:

**DocType Changes:**
- Renamed DocType: "Emas Employees" → "Amas Employees"
- Updated autoname: EMAS-EMP-{####} → AMAS-EMP-{####}
- Updated Python class: EmasEmployees → AmasEmployees

**Files Renamed:**
- invoice_az/emas_api.py → amas_api.py
- client/emas_employees.js → amas_employees.js
- doctype/emas_employees/ → amas_employees/ (entire directory)

**Code Updates:**
- Python: All EMAS_ constants → AMAS_ constants
- Python: All emas_ functions → amas_ functions
- JavaScript: All emas references → amas references
- API paths: invoice_az.emas_api → invoice_az.amas_api

**Database Migration:**
- Asan Login fields renamed:
  - emas_section → amas_section
  - emas_auth_status → amas_auth_status
  - emas_account_name → amas_account_name
  - emas_account_number → amas_account_number
  - column_break_emas → column_break_amas
  - emas_account_oid → amas_account_oid
  - emas_last_activity → amas_last_activity
  - emas_session → amas_session
  - emas_csrf_token → amas_csrf_token

**Preserved (Not Changed):**
- User-facing text with "ƏMAS" (Azerbaijani ə character)
- API requirements: ":eroom:emas", "domain": "emas"
- Report ID: "emasValidEmploymentContractOnline"

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Ali 2026-02-12 13:48:29 +04:00
parent aa2cab8b22
commit 72cf279a64
11 changed files with 264 additions and 264 deletions

View File

@ -20,36 +20,36 @@ from urllib.parse import unquote
import frappe
import requests
# Increase header limit - EMAS returns many Set-Cookie headers
# Increase header limit - AMAS returns many Set-Cookie headers
http.client._MAXHEADERS = 1000
# EMAS Base URL
EMAS_BASE_URL = "https://eroom.e-social.gov.az"
# AMAS Base URL
AMAS_BASE_URL = "https://eroom.e-social.gov.az"
# EMAS API Endpoints
EMAS_SSO_CALLBACK = "/ssoAsan/v2"
EMAS_CHANGE_ACCOUNT = "/service/aas.changeAccount"
EMAS_EXECUTE_REPORT = "/service/magusbi.executeReport"
EMAS_GET_DOMAINS = "/service/aas.domains"
EMAS_GET_ACCOUNTS = "/request/accounts"
# AMAS API Endpoints
AMAS_SSO_CALLBACK = "/ssoAsan/v2"
AMAS_CHANGE_ACCOUNT = "/service/aas.changeAccount"
AMAS_EXECUTE_REPORT = "/service/magusbi.executeReport"
AMAS_GET_DOMAINS = "/service/aas.domains"
AMAS_GET_ACCOUNTS = "/request/accounts"
# MyGovID OAuth API
MYGOVID_API_URL = "https://api.mygovid.gov.az"
MYGOVID_AUTH_CODES_URL = f"{MYGOVID_API_URL}/ssoauth/oauth2/auth/codes"
# EMAS OAuth Client ID (from HAR analysis)
EMAS_CLIENT_ID = "64942e33ec8d49059333a1e0ebad7fe2"
EMAS_REDIRECT_URI = f"{EMAS_BASE_URL}{EMAS_SSO_CALLBACK}"
# AMAS OAuth Client ID (from HAR analysis)
AMAS_CLIENT_ID = "64942e33ec8d49059333a1e0ebad7fe2"
AMAS_REDIRECT_URI = f"{AMAS_BASE_URL}{AMAS_SSO_CALLBACK}"
# EMAS request headers
EMAS_HEADERS = {
# AMAS request headers
AMAS_HEADERS = {
"Accept": "text/plain, */*; q=0.01",
"Accept-Language": "en-US,en;q=0.9",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest",
"Origin": EMAS_BASE_URL,
"Referer": f"{EMAS_BASE_URL}/",
"Origin": AMAS_BASE_URL,
"Referer": f"{AMAS_BASE_URL}/",
"X-MAGUS-RECAPTCHA": "null",
}
@ -63,7 +63,7 @@ MYGOVID_HEADERS = {
def generate_request_number():
"""Generate a unique request number for EMAS API calls"""
"""Generate a unique request number for AMAS API calls"""
# Format: 1XXXXXXXXXXXXXXX (alphanumeric)
chars = string.ascii_uppercase + string.digits
return "1" + "".join(random.choices(chars, k=13))
@ -85,12 +85,12 @@ def parse_cookies_from_response(response):
@frappe.whitelist()
def connect_emas(asan_login_name):
def connect_amas(asan_login_name):
"""
Connect to EMAS using MyGovID JWT token.
Connect to AMAS using MyGovID JWT token.
This is the main entry point for EMAS connection.
If MyGovID token exists - uses it to get EMAS session automatically.
This is the main entry point for AMAS connection.
If MyGovID token exists - uses it to get AMAS session automatically.
If not - returns error asking user to login with MyGovID first.
"""
try:
@ -105,7 +105,7 @@ def connect_emas(asan_login_name):
}
# Step 1: Get authorization code from MyGovID
auth_code_result = get_emas_auth_code(doc.mygovid_token)
auth_code_result = get_amas_auth_code(doc.mygovid_token)
if not auth_code_result.get("success"):
# Token might be expired
@ -129,20 +129,20 @@ def connect_emas(asan_login_name):
# Step 3: Save session data (but don't save account yet - user must select)
session_data = session_result.get("session_data")
doc.emas_session = json.dumps(session_data)
doc.emas_csrf_token = session_data.get("xsrf_token")
doc.emas_auth_status = "Connected"
doc.emas_last_activity = frappe.utils.now_datetime()
doc.amas_session = json.dumps(session_data)
doc.amas_csrf_token = session_data.get("xsrf_token")
doc.amas_auth_status = "Connected"
doc.amas_last_activity = frappe.utils.now_datetime()
# Clear any previous account selection - user must choose
doc.emas_account_oid = None
doc.emas_account_name = None
doc.emas_account_number = None
doc.amas_account_oid = None
doc.amas_account_name = None
doc.amas_account_number = None
doc.save(ignore_permissions=True)
frappe.db.commit()
# Step 4: Fetch available accounts from /request/accounts
accounts_result = get_emas_accounts(asan_login_name)
accounts_result = get_amas_accounts(asan_login_name)
accounts = accounts_result.get("accounts", []) if accounts_result.get("success") else []
return {
@ -161,7 +161,7 @@ def connect_emas(asan_login_name):
return {"success": False, "message": f"Error: {str(e)}"}
def get_emas_auth_code(mygovid_token):
def get_amas_auth_code(mygovid_token):
"""
Get EMAS authorization code using MyGovID JWT token.
@ -172,10 +172,10 @@ def get_emas_auth_code(mygovid_token):
state = generate_state()
payload = {
"client_id": EMAS_CLIENT_ID,
"client_id": AMAS_CLIENT_ID,
"state": state,
"response_type": "code",
"redirect_uri": EMAS_REDIRECT_URI
"redirect_uri": AMAS_REDIRECT_URI
}
headers = MYGOVID_HEADERS.copy()
@ -266,7 +266,7 @@ def exchange_code_for_session(code, state):
"""
try:
# Build SSO callback URL
callback_url = f"{EMAS_REDIRECT_URI}?code={code}&state={state}"
callback_url = f"{AMAS_REDIRECT_URI}?code={code}&state={state}"
# Create session to capture cookies
session = requests.Session()
@ -347,15 +347,15 @@ def exchange_code_for_session(code, state):
return {"success": False, "message": f"Error: {str(e)}"}
def get_emas_session_data(asan_login_name):
def get_amas_session_data(asan_login_name):
"""Get EMAS session data from document"""
doc = frappe.get_doc("Asan Login", asan_login_name)
if not doc.emas_session:
if not doc.amas_session:
return None
try:
return json.loads(doc.emas_session)
return json.loads(doc.amas_session)
except (json.JSONDecodeError, TypeError):
return None
@ -368,7 +368,7 @@ def refresh_csrf_token_internal(asan_login_name):
"""
import re
session_data = get_emas_session_data(asan_login_name)
session_data = get_amas_session_data(asan_login_name)
if not session_data:
return None, None
@ -378,13 +378,13 @@ def refresh_csrf_token_internal(asan_login_name):
try:
# Make GET request to dashboard to get fresh CSRF token
response = requests.get(
f"{EMAS_BASE_URL}/core.dashboard",
f"{AMAS_BASE_URL}/core.dashboard",
cookies=cookies,
timeout=30
)
if response.status_code != 200:
return session_data, doc.emas_csrf_token
return session_data, doc.amas_csrf_token
# Update cookies from response
for cookie in response.cookies:
@ -402,7 +402,7 @@ def refresh_csrf_token_internal(asan_login_name):
csrf_token = unquote(cookies["XSRF-TOKEN"])
if csrf_token:
doc.emas_csrf_token = csrf_token
doc.amas_csrf_token = csrf_token
session_data["xsrf_token"] = csrf_token
# Update token from page config if available
@ -411,8 +411,8 @@ def refresh_csrf_token_internal(asan_login_name):
session_data["token"] = html_config.get("token")
# Save updated session
doc.emas_session = json.dumps(session_data)
doc.emas_last_activity = frappe.utils.now_datetime()
doc.amas_session = json.dumps(session_data)
doc.amas_last_activity = frappe.utils.now_datetime()
doc.save(ignore_permissions=True)
frappe.db.commit()
@ -420,10 +420,10 @@ def refresh_csrf_token_internal(asan_login_name):
except Exception as e:
frappe.log_error(f"CSRF refresh error: {str(e)}", "ƏMAS API Error")
return session_data, doc.emas_csrf_token
return session_data, doc.amas_csrf_token
def make_emas_request(asan_login_name, endpoint, data):
def make_amas_request(asan_login_name, endpoint, data):
"""
Make an authenticated request to EMAS API.
@ -443,8 +443,8 @@ def make_emas_request(asan_login_name, endpoint, data):
doc = frappe.get_doc("Asan Login", asan_login_name)
# Build request headers with fresh CSRF token
headers = EMAS_HEADERS.copy()
csrf_token = csrf_token or doc.emas_csrf_token or session_data.get("xsrf_token", "")
headers = AMAS_HEADERS.copy()
csrf_token = csrf_token or doc.amas_csrf_token or session_data.get("xsrf_token", "")
headers["X-CSRF-TOKEN"] = csrf_token
headers["MAGUS-REQUEST-NUMBER"] = generate_request_number()
@ -463,7 +463,7 @@ def make_emas_request(asan_login_name, endpoint, data):
data["currentTabToken"] = token
try:
url = f"{EMAS_BASE_URL}{endpoint}"
url = f"{AMAS_BASE_URL}{endpoint}"
response = requests.post(
url,
@ -482,11 +482,11 @@ def make_emas_request(asan_login_name, endpoint, data):
# Update CSRF token if changed - IMPORTANT: decode URL-encoded token!
if "XSRF-TOKEN" in new_cookies:
decoded_token = unquote(new_cookies["XSRF-TOKEN"])
doc.emas_csrf_token = decoded_token
doc.amas_csrf_token = decoded_token
session_data["xsrf_token"] = decoded_token
doc.emas_session = json.dumps(session_data)
doc.emas_last_activity = frappe.utils.now_datetime()
doc.amas_session = json.dumps(session_data)
doc.amas_last_activity = frappe.utils.now_datetime()
doc.save(ignore_permissions=True)
frappe.db.commit()
@ -525,7 +525,7 @@ def make_emas_request(asan_login_name, endpoint, data):
# Update token if present in response
if result.get("token"):
session_data["token"] = result.get("token")
doc.emas_session = json.dumps(session_data)
doc.amas_session = json.dumps(session_data)
doc.save(ignore_permissions=True)
frappe.db.commit()
@ -543,7 +543,7 @@ def make_emas_request(asan_login_name, endpoint, data):
"message": "CSRF token expired. Please reconnect to ƏMAS."
}
elif response.status_code == 401:
doc.emas_auth_status = "Error"
doc.amas_auth_status = "Error"
doc.save(ignore_permissions=True)
frappe.db.commit()
return {
@ -568,7 +568,7 @@ def make_emas_request(asan_login_name, endpoint, data):
@frappe.whitelist()
def get_emas_accounts(asan_login_name):
def get_amas_accounts(asan_login_name):
"""
Get list of organizations/accounts user has access to in EMAS.
Fetches from /request/accounts endpoint.
@ -583,8 +583,8 @@ def get_emas_accounts(asan_login_name):
doc = frappe.get_doc("Asan Login", asan_login_name)
# Build request headers with fresh CSRF token
headers = EMAS_HEADERS.copy()
csrf_token = csrf_token or doc.emas_csrf_token or session_data.get("xsrf_token", "")
headers = AMAS_HEADERS.copy()
csrf_token = csrf_token or doc.amas_csrf_token or session_data.get("xsrf_token", "")
headers["X-CSRF-TOKEN"] = csrf_token
headers["MAGUS-REQUEST-NUMBER"] = generate_request_number()
@ -604,7 +604,7 @@ def get_emas_accounts(asan_login_name):
# Make request to /request/accounts
response = requests.post(
f"{EMAS_BASE_URL}{EMAS_GET_ACCOUNTS}",
f"{AMAS_BASE_URL}{AMAS_GET_ACCOUNTS}",
data=data,
headers=headers,
cookies=cookies,
@ -620,10 +620,10 @@ def get_emas_accounts(asan_login_name):
# Update CSRF token if changed
if "XSRF-TOKEN" in new_cookies:
decoded_token = unquote(new_cookies["XSRF-TOKEN"])
doc.emas_csrf_token = decoded_token
doc.amas_csrf_token = decoded_token
session_data["xsrf_token"] = decoded_token
doc.emas_session = json.dumps(session_data)
doc.amas_session = json.dumps(session_data)
doc.save(ignore_permissions=True)
frappe.db.commit()
@ -649,7 +649,7 @@ def get_emas_accounts(asan_login_name):
@frappe.whitelist()
def change_emas_account(asan_login_name, account_oid, account_name, account_number, role_name="chairman"):
def change_amas_account(asan_login_name, account_oid, account_name, account_number, role_name="chairman"):
"""
Select/switch to a specific organization account in EMAS.
"""
@ -664,9 +664,9 @@ def change_emas_account(asan_login_name, account_oid, account_name, account_numb
"domain": "emas"
}
result = make_emas_request(
result = make_amas_request(
asan_login_name,
EMAS_CHANGE_ACCOUNT,
AMAS_CHANGE_ACCOUNT,
data
)
@ -685,19 +685,19 @@ def change_emas_account(asan_login_name, account_oid, account_name, account_numb
# Store selected account info
doc = frappe.get_doc("Asan Login", asan_login_name)
doc.emas_account_oid = account_oid
doc.emas_account_name = account_name
doc.emas_account_number = account_number
doc.emas_auth_status = "Connected"
doc.emas_last_activity = frappe.utils.now_datetime()
doc.amas_account_oid = account_oid
doc.amas_account_name = account_name
doc.amas_account_number = account_number
doc.amas_auth_status = "Connected"
doc.amas_last_activity = frappe.utils.now_datetime()
# Update session with token from response
token = response_data.get("token")
if token:
session_data = get_emas_session_data(asan_login_name)
session_data = get_amas_session_data(asan_login_name)
if session_data:
session_data["token"] = token
doc.emas_session = json.dumps(session_data)
doc.amas_session = json.dumps(session_data)
doc.save(ignore_permissions=True)
frappe.db.commit()
@ -724,7 +724,7 @@ def get_employees_report(asan_login_name, offset=0, limit=100):
try:
doc = frappe.get_doc("Asan Login", asan_login_name)
if not doc.emas_account_oid:
if not doc.amas_account_oid:
return {
"success": False,
"message": "No ƏMAS account selected. Please select an organization first."
@ -737,7 +737,7 @@ def get_employees_report(asan_login_name, offset=0, limit=100):
"attributes[newExcel]": "true"
}
result = make_emas_request(asan_login_name, EMAS_EXECUTE_REPORT, data)
result = make_amas_request(asan_login_name, AMAS_EXECUTE_REPORT, data)
if not result.get("success"):
return result
@ -780,7 +780,7 @@ def get_contract_stats(asan_login_name):
try:
doc = frappe.get_doc("Asan Login", asan_login_name)
if not doc.emas_account_oid:
if not doc.amas_account_oid:
return {
"success": False,
"message": "No ƏMAS account selected. Please select an organization first."
@ -792,7 +792,7 @@ def get_contract_stats(asan_login_name):
"pagination[limit]": "100"
}
result = make_emas_request(asan_login_name, EMAS_EXECUTE_REPORT, data)
result = make_amas_request(asan_login_name, AMAS_EXECUTE_REPORT, data)
if not result.get("success"):
return result
@ -822,7 +822,7 @@ def get_contract_stats(asan_login_name):
@frappe.whitelist()
def check_emas_connection(asan_login_name):
def check_amas_connection(asan_login_name):
"""
Check if EMAS connection is active.
"""
@ -831,11 +831,11 @@ def check_emas_connection(asan_login_name):
return {
"success": True,
"emas_auth_status": doc.emas_auth_status or "Not Connected",
"emas_account_name": doc.emas_account_name,
"emas_account_number": doc.emas_account_number,
"emas_last_activity": str(doc.emas_last_activity) if doc.emas_last_activity else None,
"has_session": bool(doc.emas_session),
"amas_auth_status": doc.amas_auth_status or "Not Connected",
"amas_account_name": doc.amas_account_name,
"amas_account_number": doc.amas_account_number,
"amas_last_activity": str(doc.amas_last_activity) if doc.amas_last_activity else None,
"has_session": bool(doc.amas_session),
"has_mygovid_token": bool(doc.mygovid_token)
}
@ -848,14 +848,14 @@ def check_emas_connection(asan_login_name):
@frappe.whitelist()
def refresh_emas_session(asan_login_name):
def refresh_amas_session(asan_login_name):
"""
Refresh EMAS session by making a GET request to get fresh CSRF token.
Use this when you get CSRF_TOKEN_MISMATCH errors.
"""
try:
doc = frappe.get_doc("Asan Login", asan_login_name)
session_data = get_emas_session_data(asan_login_name)
session_data = get_amas_session_data(asan_login_name)
if not session_data:
return {
@ -867,7 +867,7 @@ def refresh_emas_session(asan_login_name):
# Make GET request to EMAS dashboard to get fresh CSRF token
response = requests.get(
f"{EMAS_BASE_URL}/core.dashboard",
f"{AMAS_BASE_URL}/core.dashboard",
cookies=cookies,
timeout=30
)
@ -889,7 +889,7 @@ def refresh_emas_session(asan_login_name):
match = re.search(r'name="csrf-token" content="([^"]+)"', response.text)
if match:
new_csrf_token = match.group(1)
doc.emas_csrf_token = new_csrf_token
doc.amas_csrf_token = new_csrf_token
session_data["xsrf_token"] = new_csrf_token
# Also update from cookie if available
@ -897,7 +897,7 @@ def refresh_emas_session(asan_login_name):
decoded_token = unquote(cookies["XSRF-TOKEN"])
# Prefer meta tag token, but update session data
if not match:
doc.emas_csrf_token = decoded_token
doc.amas_csrf_token = decoded_token
session_data["xsrf_token"] = decoded_token
# Parse config for updated token
@ -905,8 +905,8 @@ def refresh_emas_session(asan_login_name):
if html_config.get("token"):
session_data["token"] = html_config.get("token")
doc.emas_session = json.dumps(session_data)
doc.emas_last_activity = frappe.utils.now_datetime()
doc.amas_session = json.dumps(session_data)
doc.amas_last_activity = frappe.utils.now_datetime()
doc.save(ignore_permissions=True)
frappe.db.commit()
@ -924,20 +924,20 @@ def refresh_emas_session(asan_login_name):
@frappe.whitelist()
def disconnect_emas(asan_login_name):
def disconnect_amas(asan_login_name):
"""
Disconnect from EMAS by clearing session data.
"""
try:
doc = frappe.get_doc("Asan Login", asan_login_name)
doc.emas_session = None
doc.emas_csrf_token = None
doc.emas_account_oid = None
doc.emas_account_name = None
doc.emas_account_number = None
doc.emas_auth_status = "Not Connected"
doc.emas_last_activity = None
doc.amas_session = None
doc.amas_csrf_token = None
doc.amas_account_oid = None
doc.amas_account_name = None
doc.amas_account_number = None
doc.amas_auth_status = "Not Connected"
doc.amas_last_activity = None
doc.save(ignore_permissions=True)
frappe.db.commit()
@ -965,18 +965,18 @@ def get_connected_asan_logins():
asan_logins = frappe.get_all(
"Asan Login",
filters={
"emas_auth_status": "Connected",
"emas_account_oid": ["is", "set"]
"amas_auth_status": "Connected",
"amas_account_oid": ["is", "set"]
},
fields=["name", "emas_account_name", "emas_account_number", "emas_account_oid"]
fields=["name", "amas_account_name", "amas_account_number", "amas_account_oid"]
)
result = []
for al in asan_logins:
result.append({
"name": al.name,
"organization_name": al.emas_account_name or "Unknown",
"organization_voen": al.emas_account_number or ""
"organization_name": al.amas_account_name or "Unknown",
"organization_voen": al.amas_account_number or ""
})
return {
@ -993,7 +993,7 @@ def get_connected_asan_logins():
# Exact list of API fields that map 1:1 to Əmas Employees DocType fields
EMAS_EMPLOYEE_FIELDS = [
AMAS_EMPLOYEE_FIELDS = [
"full_name",
"identification_number",
"ssn",
@ -1039,8 +1039,8 @@ def import_employees(asan_login_name, employees):
employees = json.loads(employees)
doc = frappe.get_doc("Asan Login", asan_login_name)
organization_name = doc.emas_account_name
organization_voen = doc.emas_account_number
organization_name = doc.amas_account_name
organization_voen = doc.amas_account_number
imported_count = 0
updated_count = 0
@ -1080,17 +1080,17 @@ def import_employees(asan_login_name, employees):
fin = str(fin).strip()
existing = frappe.db.exists(
"Emas Employees",
"Amas Employees",
{"identification_number": fin, "organization_voen": organization_voen}
)
if existing:
employee_doc = frappe.get_doc("Emas Employees", existing)
employee_doc = frappe.get_doc("Amas Employees", existing)
update_employee_from_data(employee_doc, emp_data)
employee_doc.save(ignore_permissions=True)
updated_count += 1
else:
employee_doc = frappe.new_doc("Emas Employees")
employee_doc = frappe.new_doc("Amas Employees")
employee_doc.asan_login = asan_login_name
employee_doc.organization_name = organization_name
employee_doc.organization_voen = organization_voen
@ -1116,7 +1116,7 @@ def import_employees(asan_login_name, employees):
# Check if exists
existing = frappe.db.exists(
"Emas Employees",
"Amas Employees",
{
"identification_number": fin,
"organization_voen": organization_voen
@ -1124,7 +1124,7 @@ def import_employees(asan_login_name, employees):
)
if existing:
employee_doc = frappe.get_doc("Emas Employees", existing)
employee_doc = frappe.get_doc("Amas Employees", existing)
# First populate basic fields from list data
update_employee_from_data(employee_doc, emp_data)
# Then overlay with detailed data
@ -1135,7 +1135,7 @@ def import_employees(asan_login_name, employees):
employee_doc.save(ignore_permissions=True)
updated_count += 1
else:
employee_doc = frappe.new_doc("Emas Employees")
employee_doc = frappe.new_doc("Amas Employees")
employee_doc.asan_login = asan_login_name
employee_doc.organization_name = organization_name
employee_doc.organization_voen = organization_voen
@ -1186,7 +1186,7 @@ def update_employee_from_data(employee_doc, emp_data):
Hard 1:1 mapping - API field names match DocType field names exactly.
"""
# Map all API fields directly to DocType fields
for field in EMAS_EMPLOYEE_FIELDS:
for field in AMAS_EMPLOYEE_FIELDS:
value = emp_data.get(field)
if value is not None:
setattr(employee_doc, field, str(value))
@ -1200,7 +1200,7 @@ def update_employee_from_data(employee_doc, emp_data):
employee_doc.import_date = frappe.utils.now_datetime()
def parse_emas_date(date_str):
def parse_amas_date(date_str):
"""
Parse date string from ƏMAS into YYYY-MM-DD format for Frappe Date fields.
ƏMAS dates can be in various formats.
@ -1256,7 +1256,7 @@ def resolve_designation(position_text, create_if_missing):
@frappe.whitelist()
def create_employees_from_emas(asan_login_name, employees, company, create_designation=0):
def create_employees_from_amas(asan_login_name, employees, company, create_designation=0):
"""
Create Employee records directly from ƏMAS API data.
@ -1283,8 +1283,8 @@ def create_employees_from_emas(asan_login_name, employees, company, create_desig
return {"success": False, "message": "Company is required"}
doc = frappe.get_doc("Asan Login", asan_login_name)
organization_name = doc.emas_account_name
organization_voen = doc.emas_account_number
organization_name = doc.amas_account_name
organization_voen = doc.amas_account_number
created_count = 0
updated_count = 0
@ -1340,42 +1340,42 @@ def create_employees_from_emas(asan_login_name, employees, company, create_desig
fin = str(fin).strip()
# 1. Save/update Emas Employees record
emas_existing = None
amas_existing = None
if doc_oid:
emas_existing = frappe.db.exists("Emas Employees", {"doc_oid": str(doc_oid)})
if not emas_existing:
emas_existing = frappe.db.exists(
"Emas Employees",
amas_existing = frappe.db.exists("Amas Employees", {"doc_oid": str(doc_oid)})
if not amas_existing:
amas_existing = frappe.db.exists(
"Amas Employees",
{"identification_number": fin, "organization_voen": organization_voen}
)
if emas_existing:
emas_doc = frappe.get_doc("Emas Employees", emas_existing)
if amas_existing:
amas_doc = frappe.get_doc("Amas Employees", amas_existing)
# Always populate basic fields from list data first
update_employee_from_data(emas_doc, emp_data)
update_employee_from_data(amas_doc, emp_data)
# Then overlay with detail data if available
if detail_data:
update_employee_from_detail_data(emas_doc, detail_data)
update_employee_from_detail_data(amas_doc, detail_data)
# Ensure FIN is set (required field)
if not emas_doc.identification_number:
emas_doc.identification_number = fin
emas_doc.save(ignore_permissions=True)
if not amas_doc.identification_number:
amas_doc.identification_number = fin
amas_doc.save(ignore_permissions=True)
else:
emas_doc = frappe.new_doc("Emas Employees")
emas_doc.asan_login = asan_login_name
emas_doc.organization_name = organization_name
emas_doc.organization_voen = organization_voen
amas_doc = frappe.new_doc("Amas Employees")
amas_doc.asan_login = asan_login_name
amas_doc.organization_name = organization_name
amas_doc.organization_voen = organization_voen
# Set FIN first (required field)
emas_doc.identification_number = fin
amas_doc.identification_number = fin
# Always populate basic fields from list data first
update_employee_from_data(emas_doc, emp_data)
update_employee_from_data(amas_doc, emp_data)
# Then overlay with detail data if available
if detail_data:
update_employee_from_detail_data(emas_doc, detail_data)
update_employee_from_detail_data(amas_doc, detail_data)
# Ensure FIN is still set after mapping
if not emas_doc.identification_number:
emas_doc.identification_number = fin
emas_doc.insert(ignore_permissions=True)
if not amas_doc.identification_number:
amas_doc.identification_number = fin
amas_doc.insert(ignore_permissions=True)
# 2. Create/update Employee record
existing_employee = frappe.db.exists("Employee", {"passport_number": fin})
@ -1393,16 +1393,16 @@ def create_employees_from_emas(asan_login_name, employees, company, create_desig
if detail_data:
# Get from detail data
if 'iamasBean' in detail_data and detail_data.get('iamasBean'):
dob = parse_emas_date(detail_data['iamasBean'].get('birthDate'))
dob = parse_amas_date(detail_data['iamasBean'].get('birthDate'))
if 'EmasContractDetailsEnt' in detail_data and isinstance(detail_data.get('EmasContractDetailsEnt'), list) and len(detail_data['EmasContractDetailsEnt']) > 0:
details = detail_data['EmasContractDetailsEnt'][0]
doj = parse_emas_date(details.get('beginDate'))
contract_end = parse_emas_date(details.get('endDate'))
doj = parse_amas_date(details.get('beginDate'))
contract_end = parse_amas_date(details.get('endDate'))
else:
# Fallback to list data
dob = parse_emas_date(emp_data.get("birthday"))
doj = parse_emas_date(emp_data.get("begin_date"))
contract_end = parse_emas_date(emp_data.get("end_date"))
dob = parse_amas_date(emp_data.get("birthday"))
doj = parse_amas_date(emp_data.get("begin_date"))
contract_end = parse_amas_date(emp_data.get("end_date"))
# Map status
raw_status = ""
@ -1471,8 +1471,8 @@ def create_employees_from_emas(asan_login_name, employees, company, create_desig
created_count += 1
# Link Emas Employees → Employee
emas_doc.employee = emp.name
emas_doc.save(ignore_permissions=True)
amas_doc.employee = emp.name
amas_doc.save(ignore_permissions=True)
except Exception as e:
fin_val = emp_data.get("identification_number", "?")
@ -1516,25 +1516,25 @@ def get_edit_form_data(asan_login_name, doc_oid, doc_no, doc_type):
"docNo": doc_no,
"docType": doc_type
}
return make_emas_request(asan_login_name, "/service/eroom.getEditForm", data)
return make_amas_request(asan_login_name, "/service/eroom.getEditForm", data)
def get_staff_data(asan_login_name, staff_oid):
"""Call embas.getStaffData for position info"""
data = {"staffOid": staff_oid}
return make_emas_request(asan_login_name, "/service/embas.getStaffData", data)
return make_amas_request(asan_login_name, "/service/embas.getStaffData", data)
def get_person_data(asan_login_name, entity_oid):
"""Call refdata.getPersonDataByEntOid for personal data"""
data = {"entityOid": entity_oid} # Fixed: was "entOid", should be "entityOid"
return make_emas_request(asan_login_name, "/service/refdata.getPersonDataByEntOid", data)
return make_amas_request(asan_login_name, "/service/refdata.getPersonDataByEntOid", data)
def get_address_data(asan_login_name, address_oid):
"""Call refdata.getAddressData for work address"""
data = {"addressOid": address_oid}
return make_emas_request(asan_login_name, "/service/refdata.getAddressData", data)
return make_amas_request(asan_login_name, "/service/refdata.getAddressData", data)
def get_doc_main_data(asan_login_name, doc_oid, doc_no, doc_type):
@ -1544,7 +1544,7 @@ def get_doc_main_data(asan_login_name, doc_oid, doc_no, doc_type):
"docNo": doc_no,
"docType": doc_type
}
return make_emas_request(asan_login_name, "/service/eroom.getDocMainData", data)
return make_amas_request(asan_login_name, "/service/eroom.getDocMainData", data)
def get_contract_attachments(asan_login_name, doc_oid, attach_type="attachType_5"):
@ -1556,7 +1556,7 @@ def get_contract_attachments(asan_login_name, doc_oid, attach_type="attachType_5
"docOid[]": doc_oid,
"attachType": attach_type
}
return make_emas_request(asan_login_name, "/service/eroom.getAttachListByType", data)
return make_amas_request(asan_login_name, "/service/eroom.getAttachListByType", data)
def download_contract_file(asan_login_name, file_id):
@ -1565,7 +1565,7 @@ def download_contract_file(asan_login_name, file_id):
Returns HTML content of the employment contract.
"""
data = {"fileId": file_id}
return make_emas_request(asan_login_name, "/request/readFromStorage", data)
return make_amas_request(asan_login_name, "/request/readFromStorage", data)
@frappe.whitelist()
@ -1750,8 +1750,8 @@ def update_employee_from_detail_data(employee_doc, detail_data):
# Dates
employee_doc.main_contract_begin_date = str(details.get('mainContractBeginDate') or '')
employee_doc.contract_begin_date = parse_emas_date(details.get('beginDate'))
employee_doc.contract_end_date = parse_emas_date(details.get('endDate'))
employee_doc.contract_begin_date = parse_amas_date(details.get('beginDate'))
employee_doc.contract_end_date = parse_amas_date(details.get('endDate'))
employee_doc.emp_job_start_date = str(details.get('empJobStartDate') or '')
employee_doc.begin_date = str(details.get('beginDate') or '')
employee_doc.end_date = str(details.get('endDate') or '')
@ -1800,8 +1800,8 @@ def update_employee_from_detail_data(employee_doc, detail_data):
employee_doc.marital_status = person.get('maritalStatus')
employee_doc.military_status = person.get('militaryStatus')
employee_doc.document_number = person.get('documentNumber')
employee_doc.document_issue_date = parse_emas_date(person.get('issueDate'))
employee_doc.document_expiry_date = parse_emas_date(person.get('expireDate'))
employee_doc.document_issue_date = parse_amas_date(person.get('issueDate'))
employee_doc.document_expiry_date = parse_amas_date(person.get('expireDate'))
employee_doc.document_issued_by = person.get('issuedBy')
employee_doc.personal_address = person.get('address')
employee_doc.personal_city = person.get('city')
@ -1855,10 +1855,10 @@ def on_delete_employee(doc, method):
"""
When an Employee is deleted, also delete linked Emas Employees records.
"""
emas_records = frappe.get_all(
"Emas Employees",
amas_records = frappe.get_all(
"Amas Employees",
filters={"employee": doc.name},
fields=["name"]
)
for rec in emas_records:
frappe.delete_doc("Emas Employees", rec.name, ignore_permissions=True)
for rec in amas_records:
frappe.delete_doc("Amas Employees", rec.name, ignore_permissions=True)

View File

@ -1,4 +1,4 @@
frappe.ui.form.on('Emas Employees', {
frappe.ui.form.on('Amas Employees', {
refresh: function(frm) {
// Add "View Contract" button if contract HTML exists
if (frm.doc.contract_html && frm.doc.contract_html.trim().length > 0) {

View File

@ -8,26 +8,26 @@ if (frappe.listview_settings['Employee']) {
const orig_onload = frappe.listview_settings['Employee'].onload;
frappe.listview_settings['Employee'].onload = function(listview) {
if (orig_onload) orig_onload(listview);
add_emas_load_button(listview);
add_amas_load_button(listview);
};
} else {
frappe.listview_settings['Employee'] = {
onload: function(listview) {
add_emas_load_button(listview);
add_amas_load_button(listview);
}
};
}
function add_emas_load_button(listview) {
function add_amas_load_button(listview) {
listview.page.add_inner_button(__('Load from ƏMAS'), function() {
start_emas_employee_import(listview);
start_amas_employee_import(listview);
});
}
// Step 1: Get default connected Asan Login → fetch employees from ƏMAS API
function start_emas_employee_import(listview) {
function start_amas_employee_import(listview) {
frappe.call({
method: 'invoice_az.emas_api.get_connected_asan_logins',
method: 'invoice_az.amas_api.get_connected_asan_logins',
freeze: true,
freeze_message: __('Checking ƏMAS connection...'),
callback: function(r) {
@ -52,20 +52,20 @@ function start_emas_employee_import(listview) {
}
// Use the first (default) connected login
fetch_employees_from_emas(listview, asan_logins[0].name, asan_logins[0].organization_name);
fetch_employees_from_amas(listview, asan_logins[0].name, asan_logins[0].organization_name);
}
});
}
// Step 2: Fetch employees from ƏMAS API
function fetch_employees_from_emas(listview, asan_login_name, organization_name) {
function fetch_employees_from_amas(listview, asan_login_name, organization_name) {
frappe.show_alert({
message: __('Fetching employees from ƏMAS...'),
indicator: 'blue'
}, 3);
frappe.call({
method: 'invoice_az.emas_api.get_employees_report',
method: 'invoice_az.amas_api.get_employees_report',
args: {
asan_login_name: asan_login_name,
offset: 0,
@ -140,7 +140,7 @@ function show_employee_selection(listview, asan_login_name, organization_name, e
// Build table (e-taxes style)
let invoiceTable = '<div style="max-height: 500px; overflow-y: auto;">' +
'<table class="table table-bordered emas-employees-table" style="width: 100%; table-layout: fixed;">' +
'<table class="table table-bordered amas-employees-table" style="width: 100%; table-layout: fixed;">' +
'<thead><tr>' +
'<th style="width: 4%;"><input type="checkbox" class="select-all-employees"></th>' +
'<th style="width: 20%;">' + __('Full Name') + '</th>' +
@ -274,7 +274,7 @@ function create_employees(listview, asan_login_name, selected_employees, company
);
frappe.call({
method: 'invoice_az.emas_api.create_employees_from_emas',
method: 'invoice_az.amas_api.create_employees_from_amas',
args: {
asan_login_name: asan_login_name,
employees: selected_employees,

View File

@ -12,7 +12,7 @@ doctype_js = {
"Sales Invoice": "client/sales_invoice.js",
"Journal Entry": "client/journal_entry.js",
"Supplier": "client/supplier.js",
"Emas Employees": "client/emas_employees.js"
"Amas Employees": "client/amas_employees.js"
}
doctype_list_js = {
@ -55,7 +55,7 @@ doc_events = {
"on_update": "invoice_az.api.update_mapped_statuses"
},
"Employee": {
"on_trash": "invoice_az.emas_api.on_delete_employee"
"on_trash": "invoice_az.amas_api.on_delete_employee"
}
}

View File

@ -1,7 +1,7 @@
// Copyright (c) 2026, Your Company and contributors
// For license information, please see license.txt
frappe.ui.form.on('Emas Employees', {
frappe.ui.form.on('Amas Employees', {
refresh: function(frm) {
// Form view - show employee details
if (!frm.is_new()) {

View File

@ -1,7 +1,7 @@
{
"actions": [],
"allow_rename": 1,
"autoname": "format:EMAS-EMP-{####}",
"autoname": "format:AMAS-EMP-{####}",
"creation": "2026-02-06 10:00:00",
"doctype": "DocType",
"engine": "InnoDB",
@ -934,7 +934,7 @@
"modified": "2026-02-10 10:00:00",
"modified_by": "Administrator",
"module": "Invoice Az",
"name": "Emas Employees",
"name": "Amas Employees",
"naming_rule": "Expression",
"owner": "Administrator",
"permissions": [
@ -955,4 +955,4 @@
"states": [],
"title_field": "full_name",
"track_changes": 1
}
}

View File

@ -4,5 +4,5 @@
from frappe.model.document import Document
class EmasEmployees(Document):
class AmasEmployees(Document):
pass

View File

@ -1,7 +1,7 @@
// Copyright (c) 2026, Your Company and contributors
// For license information, please see license.txt
frappe.listview_settings['Emas Employees'] = {
frappe.listview_settings['Amas Employees'] = {
onload: function(listview) {
listview.page.add_inner_button(__('Import from ƏMAS'), function() {
show_import_employees_dialog();
@ -11,7 +11,7 @@ frappe.listview_settings['Emas Employees'] = {
function show_import_employees_dialog() {
frappe.call({
method: 'invoice_az.emas_api.get_connected_asan_logins',
method: 'invoice_az.amas_api.get_connected_asan_logins',
callback: function(r) {
if (r.message && r.message.success) {
const asan_logins = r.message.asan_logins || [];
@ -83,7 +83,7 @@ function load_employees_for_import(asan_login_name, organization_name) {
loading_dialog.show();
frappe.call({
method: 'invoice_az.emas_api.get_employees_report',
method: 'invoice_az.amas_api.get_employees_report',
args: {
'asan_login_name': asan_login_name,
'offset': 0,
@ -239,7 +239,7 @@ function import_selected_employees(asan_login_name, employees, selected_indices)
progress_dialog.show();
frappe.call({
method: 'invoice_az.emas_api.import_employees',
method: 'invoice_az.amas_api.import_employees',
args: {
'asan_login_name': asan_login_name,
'employees': selected_employees

View File

@ -7,7 +7,7 @@ frappe.ui.form.on('Asan Login', {
}
// Add EMAS buttons
add_emas_buttons(frm);
add_amas_buttons(frm);
// Кнопка для MyGovID Login
frm.add_custom_button(__('MyGovID Login'), function() {
@ -967,7 +967,7 @@ function startMyGovIDLogin(frm) {
// ƏMAS (e-social.gov.az) Integration Functions
// ============================================
function add_emas_buttons(frm) {
function add_amas_buttons(frm) {
// Only show ƏMAS buttons if user is authenticated with e-taxes or MyGovID
const is_authenticated = frm.doc.auth_status === 'Authenticated' ||
frm.doc.auth_status === 'Fully Authenticated' ||
@ -978,9 +978,9 @@ function add_emas_buttons(frm) {
}
// Check current ƏMAS status
const emas_status = frm.doc.emas_auth_status || 'Not Connected';
const amas_status = frm.doc.amas_auth_status || 'Not Connected';
if (emas_status === 'Connected' && frm.doc.emas_account_oid) {
if (amas_status === 'Connected' && frm.doc.amas_account_oid) {
// ƏMAS is connected - show employee buttons
frm.add_custom_button(__('Get Employees'), function() {
show_employees_dialog(frm);
@ -991,36 +991,36 @@ function add_emas_buttons(frm) {
}, __('ƏMAS'));
frm.add_custom_button(__('Refresh Session'), function() {
refresh_emas_session(frm);
refresh_amas_session(frm);
}, __('ƏMAS'));
frm.add_custom_button(__('Disconnect'), function() {
disconnect_emas(frm);
disconnect_amas(frm);
}, __('ƏMAS'));
} else if (emas_status === 'Connected' && !frm.doc.emas_account_oid) {
} else if (amas_status === 'Connected' && !frm.doc.amas_account_oid) {
// Connected but no account selected
frm.add_custom_button(__('Select Organization'), function() {
show_accounts_dialog(frm);
}, __('ƏMAS'));
frm.add_custom_button(__('Refresh Session'), function() {
refresh_emas_session(frm);
refresh_amas_session(frm);
}, __('ƏMAS'));
frm.add_custom_button(__('Disconnect'), function() {
disconnect_emas(frm);
disconnect_amas(frm);
}, __('ƏMAS'));
} else {
// Not connected - show connect button
frm.add_custom_button(__('Connect ƏMAS'), function() {
start_emas_connection(frm);
start_amas_connection(frm);
}, __('ƏMAS'));
}
}
function start_emas_connection(frm) {
function start_amas_connection(frm) {
// Show loading indicator
frappe.show_alert({
message: __('Connecting to ƏMAS...'),
@ -1028,7 +1028,7 @@ function start_emas_connection(frm) {
}, 3);
frappe.call({
method: 'invoice_az.emas_api.connect_emas',
method: 'invoice_az.amas_api.connect_amas',
args: {
'asan_login_name': frm.doc.name
},
@ -1060,7 +1060,7 @@ function start_emas_connection(frm) {
__('MyGovID authentication required. Do you want to login with MyGovID now?'),
function() {
// Start MyGovID login, then connect to ƏMAS
start_mygovid_then_emas(frm);
start_mygovid_then_amas(frm);
}
);
} else {
@ -1074,7 +1074,7 @@ function start_emas_connection(frm) {
});
}
function start_mygovid_then_emas(frm) {
function start_mygovid_then_amas(frm) {
// Show MyGovID login dialog with ƏMAS callback
frappe.show_alert({
message: __('Starting MyGovID authentication...'),
@ -1090,22 +1090,22 @@ function start_mygovid_then_emas(frm) {
fieldtype: 'HTML',
options: `
<div class="text-center">
<div class="mygovid-emas-spinner" style="display: inline-block; width: 64px; height: 64px;">
<div style="width: 64px; height: 64px; border: 6px solid #4e73df; border-radius: 50%; border-color: #4e73df transparent #4e73df transparent; animation: mygovid-emas-spin 1.2s linear infinite;"></div>
<div class="mygovid-amas-spinner" style="display: inline-block; width: 64px; height: 64px;">
<div style="width: 64px; height: 64px; border: 6px solid #4e73df; border-radius: 50%; border-color: #4e73df transparent #4e73df transparent; animation: mygovid-amas-spin 1.2s linear infinite;"></div>
</div>
<style>
@keyframes mygovid-emas-spin {
@keyframes mygovid-amas-spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
<div class="mt-3" id="mygovid_emas_status_message">
<div class="mt-3" id="mygovid_amas_status_message">
<h4>Waiting for confirmation on your phone</h4>
<p>Please check your phone and confirm the authentication request in ASAN Sign app.</p>
</div>
<div id="mygovid_emas_code_container" style="display:none; margin-top: 15px;">
<div id="mygovid_amas_code_container" style="display:none; margin-top: 15px;">
<div style="background: #f8f9fa; padding: 10px; display: inline-block; border-radius: 5px; font-size: 24px; font-weight: bold; letter-spacing: 2px; color: #333; border: 1px solid #ddd;">
<span id="mygovid_emas_code">----</span>
<span id="mygovid_amas_code">----</span>
</div>
<p style="margin-top: 5px; font-size: 12px; color: #666;">Verification Code</p>
</div>
@ -1136,25 +1136,25 @@ function start_mygovid_then_emas(frm) {
if (r.message && r.message.success) {
// MyGovID login successful, now connect to ƏMAS
$('#mygovid_emas_status_message').html(`
$('#mygovid_amas_status_message').html(`
<h4 style="color: blue;">Connecting to ƏMAS...</h4>
<p>MyGovID authentication successful. Now connecting to ƏMAS...</p>
`);
$('#mygovid_emas_code_container').hide();
$('#mygovid_amas_code_container').hide();
// Now connect to ƏMAS
frappe.call({
method: 'invoice_az.emas_api.connect_emas',
method: 'invoice_az.amas_api.connect_amas',
args: {
'asan_login_name': frm.doc.name
},
callback: function(r2) {
if (r2.message && r2.message.success) {
$('#mygovid_emas_status_message').html(`
$('#mygovid_amas_status_message').html(`
<h4 style="color: green;">ƏMAS Connected!</h4>
<p>Successfully connected to ƏMAS.</p>
`);
$('.mygovid-emas-spinner').html(`
$('.mygovid-amas-spinner').html(`
<div style="width: 64px; height: 64px; display: flex; align-items: center; justify-content: center;">
<i class="fa fa-check" style="font-size: 48px; color: #5cb85c;"></i>
</div>
@ -1181,11 +1181,11 @@ function start_mygovid_then_emas(frm) {
});
}, 2000);
} else {
$('#mygovid_emas_status_message').html(`
$('#mygovid_amas_status_message').html(`
<h4 style="color: red;">ƏMAS Connection Failed</h4>
<p>${r2.message ? r2.message.message : 'Unknown error'}</p>
`);
$('.mygovid-emas-spinner').css('display', 'none');
$('.mygovid-amas-spinner').css('display', 'none');
status_dialog.set_primary_action(__('Close'), function() {
status_dialog.hide();
@ -1196,12 +1196,12 @@ function start_mygovid_then_emas(frm) {
});
} else {
// MyGovID login failed
$('#mygovid_emas_status_message').html(`
$('#mygovid_amas_status_message').html(`
<h4 style="color: red;">Authentication Failed</h4>
<p>${r.message ? r.message.message : 'Unknown error'}</p>
`);
$('.mygovid-emas-spinner').css('display', 'none');
$('#mygovid_emas_code_container').hide();
$('.mygovid-amas-spinner').css('display', 'none');
$('#mygovid_amas_code_container').hide();
status_dialog.set_primary_action(__('Close'), function() {
status_dialog.hide();
@ -1212,12 +1212,12 @@ function start_mygovid_then_emas(frm) {
error: function() {
if (window.mygovidEmasStop) return;
$('#mygovid_emas_status_message').html(`
$('#mygovid_amas_status_message').html(`
<h4 style="color: red;">Authentication Timeout</h4>
<p>The request timed out. Please try again.</p>
`);
$('.mygovid-emas-spinner').css('display', 'none');
$('#mygovid_emas_code_container').hide();
$('.mygovid-amas-spinner').css('display', 'none');
$('#mygovid_amas_code_container').hide();
status_dialog.set_primary_action(__('Close'), function() {
status_dialog.hide();
@ -1233,8 +1233,8 @@ function start_mygovid_then_emas(frm) {
args: { 'asan_login_name': frm.doc.name },
callback: function(r) {
if (r.message && r.message.success) {
$('#mygovid_emas_code').text(r.message.code);
$('#mygovid_emas_code_container').show();
$('#mygovid_amas_code').text(r.message.code);
$('#mygovid_amas_code_container').show();
}
}
});
@ -1267,7 +1267,7 @@ function show_accounts_dialog_with_data(frm, accounts) {
<td>${frappe.utils.escape_html(voen)}</td>
<td>${frappe.utils.escape_html(role)}</td>
<td>
<button class="btn btn-xs btn-primary select-emas-account"
<button class="btn btn-xs btn-primary select-amas-account"
data-oid="${frappe.utils.escape_html(oid)}"
data-name="${frappe.utils.escape_html(name)}"
data-number="${frappe.utils.escape_html(voen)}"
@ -1296,19 +1296,19 @@ function show_accounts_dialog_with_data(frm, accounts) {
d.show();
// Add click handler for account selection
d.$wrapper.find('.select-emas-account').on('click', function() {
d.$wrapper.find('.select-amas-account').on('click', function() {
const oid = $(this).data('oid');
const name = $(this).data('name');
const number = $(this).data('number');
const role = $(this).data('role');
select_emas_account(frm, d, oid, name, number, role);
select_amas_account(frm, d, oid, name, number, role);
});
}
function show_accounts_dialog(frm) {
frappe.call({
method: 'invoice_az.emas_api.get_emas_accounts',
method: 'invoice_az.amas_api.get_amas_accounts',
args: {
'asan_login_name': frm.doc.name
},
@ -1338,7 +1338,7 @@ function show_accounts_dialog(frm) {
<td>${frappe.utils.escape_html(voen)}</td>
<td>${frappe.utils.escape_html(role)}</td>
<td>
<button class="btn btn-xs btn-primary select-emas-account"
<button class="btn btn-xs btn-primary select-amas-account"
data-oid="${frappe.utils.escape_html(oid)}"
data-name="${frappe.utils.escape_html(name)}"
data-number="${frappe.utils.escape_html(voen)}"
@ -1367,13 +1367,13 @@ function show_accounts_dialog(frm) {
d.show();
// Add click handler for account selection
d.$wrapper.find('.select-emas-account').on('click', function() {
d.$wrapper.find('.select-amas-account').on('click', function() {
const oid = $(this).data('oid');
const name = $(this).data('name');
const number = $(this).data('number');
const role = $(this).data('role');
select_emas_account(frm, d, oid, name, number, role);
select_amas_account(frm, d, oid, name, number, role);
});
} else {
@ -1387,9 +1387,9 @@ function show_accounts_dialog(frm) {
});
}
function select_emas_account(frm, dialog, oid, name, number, role) {
function select_amas_account(frm, dialog, oid, name, number, role) {
frappe.call({
method: 'invoice_az.emas_api.change_emas_account',
method: 'invoice_az.amas_api.change_amas_account',
args: {
'asan_login_name': frm.doc.name,
'account_oid': oid,
@ -1429,17 +1429,17 @@ function show_employees_dialog(frm) {
fieldname: 'loading_html',
fieldtype: 'HTML',
options: `
<div class="text-center" id="emas_loading">
<div class="text-center" id="amas_loading">
<i class="fa fa-spinner fa-spin fa-3x"></i>
<p class="mt-3">Loading employees...</p>
</div>
<div id="emas_employees_container" style="display: none;">
<div id="amas_employees_container" style="display: none;">
<div class="mb-3">
<strong>Organization:</strong> ${frm.doc.emas_account_name || ''}
(VOEN: ${frm.doc.emas_account_number || ''})
<strong>Organization:</strong> ${frm.doc.amas_account_name || ''}
(VOEN: ${frm.doc.amas_account_number || ''})
</div>
<div id="emas_employees_table"></div>
<div id="emas_pagination" class="mt-3"></div>
<div id="amas_employees_table"></div>
<div id="amas_pagination" class="mt-3"></div>
</div>
`
}
@ -1458,21 +1458,21 @@ function show_employees_dialog(frm) {
function load_employees(frm, dialog, offset, limit) {
frappe.call({
method: 'invoice_az.emas_api.get_employees_report',
method: 'invoice_az.amas_api.get_employees_report',
args: {
'asan_login_name': frm.doc.name,
'offset': offset,
'limit': limit
},
callback: function(r) {
dialog.$wrapper.find('#emas_loading').hide();
dialog.$wrapper.find('#emas_employees_container').show();
dialog.$wrapper.find('#amas_loading').hide();
dialog.$wrapper.find('#amas_employees_container').show();
if (r.message && r.message.success) {
const employees = r.message.employees || [];
render_employees_table(dialog, employees, offset, limit, r.message.has_more);
} else {
dialog.$wrapper.find('#emas_employees_table').html(`
dialog.$wrapper.find('#amas_employees_table').html(`
<div class="alert alert-danger">
${r.message ? r.message.message : __('Failed to load employees')}
</div>
@ -1484,7 +1484,7 @@ function load_employees(frm, dialog, offset, limit) {
function render_employees_table(dialog, employees, offset, limit, has_more) {
if (employees.length === 0) {
dialog.$wrapper.find('#emas_employees_table').html(`
dialog.$wrapper.find('#amas_employees_table').html(`
<div class="alert alert-info">
${__('No employees found')}
</div>
@ -1533,7 +1533,7 @@ function render_employees_table(dialog, employees, offset, limit, has_more) {
table_html += '</tbody></table></div>';
dialog.$wrapper.find('#emas_employees_table').html(table_html);
dialog.$wrapper.find('#amas_employees_table').html(table_html);
// Pagination info
const showing_from = offset + 1;
@ -1545,12 +1545,12 @@ function render_employees_table(dialog, employees, offset, limit, has_more) {
}
pagination_html += '</p>';
dialog.$wrapper.find('#emas_pagination').html(pagination_html);
dialog.$wrapper.find('#amas_pagination').html(pagination_html);
}
function show_contract_stats(frm) {
frappe.call({
method: 'invoice_az.emas_api.get_contract_stats',
method: 'invoice_az.amas_api.get_contract_stats',
args: {
'asan_login_name': frm.doc.name
},
@ -1565,8 +1565,8 @@ function show_contract_stats(frm) {
fieldtype: 'HTML',
options: `
<div style="padding: 20px;">
<h4>${frm.doc.emas_account_name || 'Organization'}</h4>
<p class="text-muted">VOEN: ${frm.doc.emas_account_number || ''}</p>
<h4>${frm.doc.amas_account_name || 'Organization'}</h4>
<p class="text-muted">VOEN: ${frm.doc.amas_account_number || ''}</p>
<hr>
<div class="row">
<div class="col-md-4 text-center">
@ -1613,9 +1613,9 @@ function show_contract_stats(frm) {
});
}
function refresh_emas_session(frm) {
function refresh_amas_session(frm) {
frappe.call({
method: 'invoice_az.emas_api.refresh_emas_session',
method: 'invoice_az.amas_api.refresh_amas_session',
args: {
'asan_login_name': frm.doc.name
},
@ -1639,12 +1639,12 @@ function refresh_emas_session(frm) {
});
}
function disconnect_emas(frm) {
function disconnect_amas(frm) {
frappe.confirm(
__('Are you sure you want to disconnect from ƏMAS?'),
function() {
frappe.call({
method: 'invoice_az.emas_api.disconnect_emas',
method: 'invoice_az.amas_api.disconnect_amas',
args: {
'asan_login_name': frm.doc.name
},

View File

@ -25,15 +25,15 @@
"choose_taxpayer_response",
"mygovid_section",
"mygovid_token",
"emas_section",
"emas_auth_status",
"emas_account_name",
"emas_account_number",
"column_break_emas",
"emas_account_oid",
"emas_last_activity",
"emas_session",
"emas_csrf_token"
"amas_section",
"amas_auth_status",
"amas_account_name",
"amas_account_number",
"column_break_amas",
"amas_account_oid",
"amas_last_activity",
"amas_session",
"amas_csrf_token"
],
"fields": [
{
@ -155,13 +155,13 @@
"label": "Last Activity Time"
},
{
"fieldname": "emas_section",
"fieldname": "amas_section",
"fieldtype": "Section Break",
"label": "ƏMAS (e-social.gov.az)"
},
{
"default": "Not Connected",
"fieldname": "emas_auth_status",
"fieldname": "amas_auth_status",
"fieldtype": "Select",
"in_list_view": 1,
"label": "ƏMAS Status",
@ -169,41 +169,41 @@
"read_only": 1
},
{
"fieldname": "emas_account_name",
"fieldname": "amas_account_name",
"fieldtype": "Data",
"label": "ƏMAS Account Name",
"read_only": 1
},
{
"fieldname": "emas_account_number",
"fieldname": "amas_account_number",
"fieldtype": "Data",
"label": "ƏMAS Account VOEN",
"read_only": 1
},
{
"fieldname": "column_break_emas",
"fieldname": "column_break_amas",
"fieldtype": "Column Break"
},
{
"fieldname": "emas_account_oid",
"fieldname": "amas_account_oid",
"fieldtype": "Small Text",
"hidden": 1,
"label": "EMAS Account OID"
"label": "AMAS Account OID"
},
{
"fieldname": "emas_last_activity",
"fieldname": "amas_last_activity",
"fieldtype": "Datetime",
"label": "ƏMAS Last Activity",
"read_only": 1
},
{
"fieldname": "emas_session",
"fieldname": "amas_session",
"fieldtype": "Small Text",
"hidden": 1,
"label": "ƏMAS Session"
},
{
"fieldname": "emas_csrf_token",
"fieldname": "amas_csrf_token",
"fieldtype": "Small Text",
"hidden": 1,
"label": "ƏMAS CSRF Token"