chore: use native Azərbaycan spelling in user-facing strings
Replaces "Azeri" / "Azerbaijani" / "Azerbaijan" with the native form "Azərbaycan" in labels, descriptions, comments and docs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
a90fe340d5
commit
08e31c6815
14
CLAUDE.md
14
CLAUDE.md
|
|
@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
Invoice Az is a Frappe application that integrates with Azerbaijan government systems:
|
Invoice Az is a Frappe application that integrates with Azərbaycan government systems:
|
||||||
|
|
||||||
**E-Taxes Integration (e-taxes.gov.az):**
|
**E-Taxes Integration (e-taxes.gov.az):**
|
||||||
- Downloading and importing purchase invoices from e-taxes
|
- Downloading and importing purchase invoices from e-taxes
|
||||||
|
|
@ -15,7 +15,7 @@ Invoice Az is a Frappe application that integrates with Azerbaijan government sy
|
||||||
- Managing authentication via ASAN Login with automatic token renewal
|
- Managing authentication via ASAN Login with automatic token renewal
|
||||||
|
|
||||||
**AMAS Integration (e-social.gov.az):**
|
**AMAS Integration (e-social.gov.az):**
|
||||||
- Importing employees from AMAS (Azerbaijan Employment Management System)
|
- Importing employees from AMAS (Azərbaycan Employment Management System)
|
||||||
- MyGovID/ASAN authentication for accessing AMAS
|
- MyGovID/ASAN authentication for accessing AMAS
|
||||||
- Automatic employee synchronization with ERPNext
|
- Automatic employee synchronization with ERPNext
|
||||||
|
|
||||||
|
|
@ -586,7 +586,7 @@ bench --site [site-name] console
|
||||||
### Core Modules
|
### Core Modules
|
||||||
|
|
||||||
1. **Authentication Module** (`invoice_az/auth.py`)
|
1. **Authentication Module** (`invoice_az/auth.py`)
|
||||||
- ASAN Login integration for Azerbaijan government authentication
|
- ASAN Login integration for Azərbaycan government authentication
|
||||||
- Token management with automatic renewal every 4 minutes via cron job
|
- Token management with automatic renewal every 4 minutes via cron job
|
||||||
- Activity tracking to prevent unnecessary token renewals
|
- Activity tracking to prevent unnecessary token renewals
|
||||||
- Retry logic with exponential backoff for failed requests
|
- Retry logic with exponential backoff for failed requests
|
||||||
|
|
@ -609,7 +609,7 @@ bench --site [site-name] console
|
||||||
- Customer mapping system (separate from suppliers)
|
- Customer mapping system (separate from suppliers)
|
||||||
- Create Sales Orders and Sales Invoices
|
- Create Sales Orders and Sales Invoices
|
||||||
- E-Taxes Sales tracking records
|
- E-Taxes Sales tracking records
|
||||||
- Azerbaijani character normalization for matching
|
- Azərbaycan character normalization for matching
|
||||||
|
|
||||||
4. **Sales Send API** (`invoice_az/send_sales_api.py`)
|
4. **Sales Send API** (`invoice_az/send_sales_api.py`)
|
||||||
- Send Sales Invoices to e-taxes system
|
- Send Sales Invoices to e-taxes system
|
||||||
|
|
@ -738,7 +738,7 @@ bench --site [site-name] console
|
||||||
- **Bulk Operations**: Support for syncing multiple entities at once
|
- **Bulk Operations**: Support for syncing multiple entities at once
|
||||||
- **Batch Processing**: Load reference data from invoices in batches
|
- **Batch Processing**: Load reference data from invoices in batches
|
||||||
- **Error Handling**: Comprehensive error logging and user-friendly error messages
|
- **Error Handling**: Comprehensive error logging and user-friendly error messages
|
||||||
- **Azerbaijani Support**: Character normalization for Ə, Ü, Ö, Ğ, İ, Ç, Ş characters
|
- **Azərbaycan Support**: Character normalization for Ə, Ü, Ö, Ğ, İ, Ç, Ş characters
|
||||||
- **Two-step Signing**: Create draft invoice/act, then sign with ASAN Imza
|
- **Two-step Signing**: Create draft invoice/act, then sign with ASAN Imza
|
||||||
- **Retry Signing**: Retry signing for failed/pending invoices/acts
|
- **Retry Signing**: Retry signing for failed/pending invoices/acts
|
||||||
- **VAT Import**: Import VAT account operations as Journal Entries with configurable account mappings
|
- **VAT Import**: Import VAT account operations as Journal Entries with configurable account mappings
|
||||||
|
|
@ -929,7 +929,7 @@ Supported act types for Purchase Invoices with Individual suppliers:
|
||||||
5. System shows operation selection dialog with columns:
|
5. System shows operation selection dialog with columns:
|
||||||
- Date, TIN, Name, Operation Type, Classification Code, Amount
|
- Date, TIN, Name, Operation Type, Classification Code, Amount
|
||||||
6. Creates Journal Entries using account mappings:
|
6. Creates Journal Entries using account mappings:
|
||||||
- API returns technical operation types (SUB_TO_SUB, etc.) which are mapped to Azerbaijani names
|
- API returns technical operation types (SUB_TO_SUB, etc.) which are mapped to Azərbaycan names
|
||||||
- API returns taxCodeInfo with code (e.g., "114117") and description
|
- API returns taxCodeInfo with code (e.g., "114117") and description
|
||||||
- Looks up mapping in E-Taxes Settings with priority:
|
- Looks up mapping in E-Taxes Settings with priority:
|
||||||
- First: operation_type + classification_code (if taxCodeInfo.code exists)
|
- First: operation_type + classification_code (if taxCodeInfo.code exists)
|
||||||
|
|
@ -965,7 +965,7 @@ Supported act types for Purchase Invoices with Individual suppliers:
|
||||||
|
|
||||||
### Workflow: Importing Employees from AMAS
|
### Workflow: Importing Employees from AMAS
|
||||||
|
|
||||||
AMAS (e-social.gov.az) is Azerbaijan's Employment Management System maintained by the Ministry of Labour and Social Protection.
|
AMAS (e-social.gov.az) is Azərbaycan's Employment Management System maintained by the Ministry of Labour and Social Protection.
|
||||||
|
|
||||||
**Prerequisites:**
|
**Prerequisites:**
|
||||||
1. User must have MyGovID authentication (same as ASAN Login)
|
1. User must have MyGovID authentication (same as ASAN Login)
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
## Общая информация
|
## Общая информация
|
||||||
|
|
||||||
**Название проекта:** Invoice Az (Invoices Azerbaijan)
|
**Название проекта:** Invoice Az (Invoices Azərbaycan)
|
||||||
**Версия:** 0.0.1
|
**Версия:** 0.0.1
|
||||||
**Автор:** Jey ERP (info@jeyerp.az)
|
**Автор:** Jey ERP (info@jeyerp.az)
|
||||||
**Лицензия:** Unlicense (Общественное достояние)
|
**Лицензия:** Unlicense (Общественное достояние)
|
||||||
|
|
|
||||||
|
|
@ -331,7 +331,7 @@ Same as Invoice Az app license.
|
||||||
|
|
||||||
- **CLAUDE.md** - E-Taxes integration patterns (critical patterns documented)
|
- **CLAUDE.md** - E-Taxes integration patterns (critical patterns documented)
|
||||||
- **Invoice Az App** - Main application repository
|
- **Invoice Az App** - Main application repository
|
||||||
- **E-Taxes API** - Azerbaijan government tax system
|
- **E-Taxes API** - Azərbaycan government tax system
|
||||||
- **ASAN Imza** - Digital signature system
|
- **ASAN Imza** - Digital signature system
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
|
||||||
|
|
@ -630,8 +630,8 @@ frappe.db.commit()
|
||||||
| **Agricultural Goods** | Products from agriculture (fruits, vegetables, grains, etc.) |
|
| **Agricultural Goods** | Products from agriculture (fruits, vegetables, grains, etc.) |
|
||||||
| **Tax Free** | Product exempt from VAT (0% tax rate) |
|
| **Tax Free** | Product exempt from VAT (0% tax rate) |
|
||||||
| **Taxable** | Product subject to 5% agricultural tax |
|
| **Taxable** | Product subject to 5% agricultural tax |
|
||||||
| **E-Taxes** | Azerbaijan government tax reporting system |
|
| **E-Taxes** | Azərbaycan government tax reporting system |
|
||||||
| **ASAN Imza** | Digital signature system for Azerbaijan |
|
| **ASAN Imza** | Digital signature system for Azərbaycan |
|
||||||
| **Act** | Agricultural product purchase act (document type in E-Taxes) |
|
| **Act** | Agricultural product purchase act (document type in E-Taxes) |
|
||||||
| **Tax Rate** | E-Taxes API code for tax calculation ("taxFree", "tax2") |
|
| **Tax Rate** | E-Taxes API code for tax calculation ("taxFree", "tax2") |
|
||||||
| **Serial Number** | Unique identifier for E-Taxes document |
|
| **Serial Number** | Unique identifier for E-Taxes document |
|
||||||
|
|
@ -648,7 +648,7 @@ frappe.db.commit()
|
||||||
- `USER_GUIDE_TAX_TYPE.md` - End-user guide
|
- `USER_GUIDE_TAX_TYPE.md` - End-user guide
|
||||||
|
|
||||||
**External Resources:**
|
**External Resources:**
|
||||||
- E-Taxes API Documentation (Azerbaijan government)
|
- E-Taxes API Documentation (Azərbaycan government)
|
||||||
- ASAN Imza Integration Guide
|
- ASAN Imza Integration Guide
|
||||||
- Frappe Framework Documentation: https://frappeframework.com/docs
|
- Frappe Framework Documentation: https://frappeframework.com/docs
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
ƏMAS (e-social.gov.az) Integration API
|
ƏMAS (e-social.gov.az) Integration API
|
||||||
|
|
||||||
This module provides functions to interact with ƏMAS (Employment Management System)
|
This module provides functions to interact with ƏMAS (Employment Management System)
|
||||||
of Azerbaijan's Ministry of Labour and Social Protection.
|
of Azərbaycan's Ministry of Labour and Social Protection.
|
||||||
|
|
||||||
ƏMAS uses MyGovID/ASAN authentication. The flow is:
|
ƏMAS uses MyGovID/ASAN authentication. The flow is:
|
||||||
1. Get MyGovID JWT token via ASAN Sign (same as existing MyGovID Login)
|
1. Get MyGovID JWT token via ASAN Sign (same as existing MyGovID Login)
|
||||||
|
|
@ -1352,7 +1352,7 @@ def map_gender(amas_gender):
|
||||||
|
|
||||||
gender_str = str(amas_gender).strip().lower()
|
gender_str = str(amas_gender).strip().lower()
|
||||||
|
|
||||||
# Map Azerbaijani values
|
# Map Azərbaycan values
|
||||||
if gender_str in ("kişi", "kisi", "male", "m", "erkək", "erkek"):
|
if gender_str in ("kişi", "kisi", "male", "m", "erkək", "erkek"):
|
||||||
return "Male"
|
return "Male"
|
||||||
elif gender_str in ("qadın", "qadin", "female", "f", "qız", "qiz"):
|
elif gender_str in ("qadın", "qadin", "female", "f", "qız", "qiz"):
|
||||||
|
|
@ -1372,7 +1372,7 @@ def map_marital_status(amas_status):
|
||||||
|
|
||||||
status_str = str(amas_status).strip().lower()
|
status_str = str(amas_status).strip().lower()
|
||||||
|
|
||||||
# Map Azerbaijani values
|
# Map Azərbaycan values
|
||||||
if status_str in ("evli", "married", "nikahli", "nikаhlı"):
|
if status_str in ("evli", "married", "nikahli", "nikаhlı"):
|
||||||
return "Married"
|
return "Married"
|
||||||
elif status_str in ("subay", "subаy", "single", "bekar", "bekаr"):
|
elif status_str in ("subay", "subаy", "single", "bekar", "bekаr"):
|
||||||
|
|
|
||||||
|
|
@ -373,7 +373,7 @@ def get_default_settings():
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def normalize_azeri_text(text):
|
def normalize_azeri_text(text):
|
||||||
"""Normalization of Azerbaijani text for matching"""
|
"""Normalization of Azərbaycan text for matching"""
|
||||||
if not text:
|
if not text:
|
||||||
return text
|
return text
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1871,7 +1871,7 @@ function show_object_picker_dialog(frm, objects, customerName, taxId) {
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
// Show first confirmation dialog
|
// Show first confirmation dialog
|
||||||
frappe.confirm(
|
frappe.confirm(
|
||||||
__('Send this Sales Invoice to Azerbaijan E-Taxes system?') + '<br><br>' +
|
__('Send this Sales Invoice to Azərbaycan E-Taxes system?') + '<br><br>' +
|
||||||
__('Invoice: {0}', [frm.doc.name]) + '<br>' +
|
__('Invoice: {0}', [frm.doc.name]) + '<br>' +
|
||||||
__('Customer: {0}', [frm.doc.customer]) + '<br>' +
|
__('Customer: {0}', [frm.doc.customer]) + '<br>' +
|
||||||
__('Object: {0}', [selectedObject.name]) + '<br>' +
|
__('Object: {0}', [selectedObject.name]) + '<br>' +
|
||||||
|
|
|
||||||
|
|
@ -64,10 +64,10 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"default": "1",
|
"default": "1",
|
||||||
"description": "Consider replacement of Azerbaijani letters with Latin equivalents when matching",
|
"description": "Consider replacement of Azərbaycan letters with Latin equivalents when matching",
|
||||||
"fieldname": "consider_azeri_chars",
|
"fieldname": "consider_azeri_chars",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Consider Azerbaijani Characters"
|
"label": "Consider Azərbaycan Characters"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "default_item_settings_section",
|
"fieldname": "default_item_settings_section",
|
||||||
|
|
|
||||||
|
|
@ -1075,7 +1075,7 @@ def create_act_on_etaxes(token, payload, serial_number):
|
||||||
if response.status_code not in [200, 201]:
|
if response.status_code not in [200, 201]:
|
||||||
try:
|
try:
|
||||||
error_data = response.json()
|
error_data = response.json()
|
||||||
# Try to get Azerbaijani message first
|
# Try to get Azərbaycan message first
|
||||||
if isinstance(error_data, dict) and "message" in error_data:
|
if isinstance(error_data, dict) and "message" in error_data:
|
||||||
if isinstance(error_data["message"], dict) and "az" in error_data["message"]:
|
if isinstance(error_data["message"], dict) and "az" in error_data["message"]:
|
||||||
return {
|
return {
|
||||||
|
|
@ -1455,7 +1455,7 @@ def cancel_act_on_etaxes(purchase_invoice_name):
|
||||||
}
|
}
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# Other error - try to get Azerbaijani message
|
# Other error - try to get Azərbaycan message
|
||||||
error_msg = f"E-Taxes returned status {response.status_code}"
|
error_msg = f"E-Taxes returned status {response.status_code}"
|
||||||
try:
|
try:
|
||||||
error_data = response.json()
|
error_data = response.json()
|
||||||
|
|
|
||||||
|
|
@ -588,7 +588,7 @@ def create_invoice_on_etaxes(token, payload, serial_number):
|
||||||
if response.status_code not in [200, 201]:
|
if response.status_code not in [200, 201]:
|
||||||
try:
|
try:
|
||||||
error_data = response.json()
|
error_data = response.json()
|
||||||
# Try to get Azerbaijani message first
|
# Try to get Azərbaycan message first
|
||||||
if isinstance(error_data, dict) and "message" in error_data:
|
if isinstance(error_data, dict) and "message" in error_data:
|
||||||
if isinstance(error_data["message"], dict) and "az" in error_data["message"]:
|
if isinstance(error_data["message"], dict) and "az" in error_data["message"]:
|
||||||
return {
|
return {
|
||||||
|
|
@ -970,7 +970,7 @@ def cancel_invoice_on_etaxes(sales_invoice_name):
|
||||||
}
|
}
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# Other error - try to get Azerbaijani message
|
# Other error - try to get Azərbaycan message
|
||||||
error_msg = f"E-Taxes returned status {response.status_code}"
|
error_msg = f"E-Taxes returned status {response.status_code}"
|
||||||
try:
|
try:
|
||||||
error_data = response.json()
|
error_data = response.json()
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,7 @@ def fetch_supplier_data_from_etaxes(supplier_name):
|
||||||
if response.status_code not in [200, 201]:
|
if response.status_code not in [200, 201]:
|
||||||
try:
|
try:
|
||||||
error_data = response.json()
|
error_data = response.json()
|
||||||
# Try to get Azerbaijani message first
|
# Try to get Azərbaycan message first
|
||||||
if isinstance(error_data, dict) and "message" in error_data:
|
if isinstance(error_data, dict) and "message" in error_data:
|
||||||
if isinstance(error_data["message"], dict) and "az" in error_data["message"]:
|
if isinstance(error_data["message"], dict) and "az" in error_data["message"]:
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
# ======= VAT OPERATIONS API MODULE =======
|
# ======= VAT OPERATIONS API MODULE =======
|
||||||
# Module for importing VAT Account operations from E-Taxes Azerbaijan
|
# Module for importing VAT Account operations from E-Taxes Azərbaycan
|
||||||
# and creating Journal Entries in ERPNext
|
# and creating Journal Entries in ERPNext
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue