Compare commits

..

2 Commits

Author SHA1 Message Date
Ali e8354516fb chore(i18n): sync az translations
Picked up by bench migrate — fills in msgstr values that were previously
empty. Unrelated to the tax-article cleanup; committed separately to keep
that change reviewable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 10:33:04 +00:00
Ali 294fcaf773 fix(tax-article): drop the aggregate VAT articles from the picker
301.1 (CƏMİ) and its two subtotals, the umbrella 165.1.3 article that sits
above the goods/services export ones, 308, 319.2 and 319.3 are ФНО summary
lines, not leaf articles an accountant should tag an invoice with. Tagging a
line with the umbrella 165.1.3 landed it in Əlavə 4 row 302.3 but not in the
302.3.1/302.3.2 breakdown underneath, so the total stopped reconciling with
its own parts.

Eight rows, not seven: 165.5 (NAĞD) shipped twice — Frappe truncates name at
140 chars, and the fixture carried both the full and the ellipsised spelling.
That was the only duplicate in the whole table.

Removing them from the fixture is not enough on its own: sync_fixtures imports
every json under fixtures/ regardless of the fixtures hook, and import_doc only
ever inserts or updates. Hence the patch as well — and it has to land before
sync_fixtures runs, which post_model_sync does.

No data referenced any of the eight (checked all ten Tax Article link fields,
including the ones jey_erp owns), so nothing on an invoice or asset moves.

Known follow-up, left deliberately: Əlavə 4 row 4 still resolves
report(VM-165.1.3) / report(VM-165.1.3-ödəniş), whose report columns are gone,
so it now yields 0 rather than 302.3.1 + 302.3.2. Handed to the accountant to
decide between summing the two survivors and filling the row by hand.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 10:33:04 +00:00
6 changed files with 616 additions and 677 deletions

View File

@ -10,17 +10,6 @@
"old_parent": null, "old_parent": null,
"parent_tax_article": "Verginin hesablanması" "parent_tax_article": "Verginin hesablanması"
}, },
{
"article_name": "Vergi Məcəlləsinin 165.5-ci maddəsinə əsasən ƏDV-si qaytarılan malların geri qaytarılması halları üzrə ƏDV-nin hesablanması (NAĞD ödənişlər)",
"declaration": "Declaration of value added tax",
"docstatus": 0,
"doctype": "Tax Article",
"is_group": 0,
"modified": "2025-08-26 20:39:37.642557",
"name": "Vergi Məcəlləsinin 165.5-ci maddəsinə əsasən ƏDV-si qaytarılan malların geri qaytarılması halları üzrə ƏDV-nin hesablanması (NAĞD ödənişlər)",
"old_parent": null,
"parent_tax_article": "Dəqiqləşdirilən vergi"
},
{ {
"article_name": "Vergi Məcəlləsinin 199.4.1-ci maddəsinə əsasən", "article_name": "Vergi Məcəlləsinin 199.4.1-ci maddəsinə əsasən",
"declaration": "Property tax return", "declaration": "Property tax return",
@ -527,17 +516,6 @@
"old_parent": null, "old_parent": null,
"parent_tax_article": "ƏDV-yə 0% dərəcə ilə tutulan əməliyyatlar" "parent_tax_article": "ƏDV-yə 0% dərəcə ilə tutulan əməliyyatlar"
}, },
{
"article_name": "Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən aparılan əməliyyatlar",
"declaration": "Declaration of value added tax",
"docstatus": 0,
"doctype": "Tax Article",
"is_group": 0,
"modified": "2025-09-19 16:35:19.690000",
"name": "Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən aparılan əməliyyatlar",
"old_parent": null,
"parent_tax_article": "ƏDV-yə 0% dərəcə ilə tutulan əməliyyatlar"
},
{ {
"article_name": "Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən malların ixracı üzrə aparılmış əməliyyatlar", "article_name": "Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən malların ixracı üzrə aparılmış əməliyyatlar",
"declaration": "Declaration of value added tax", "declaration": "Declaration of value added tax",
@ -1319,17 +1297,6 @@
"old_parent": null, "old_parent": null,
"parent_tax_article": "ƏDV-dən azad olunan əməliyyatlar" "parent_tax_article": "ƏDV-dən azad olunan əməliyyatlar"
}, },
{
"article_name": "VM 175.1-ci maddəsinə əsasən alınmış elektron qaimə-fakturalar (elektron vergi hesab-fakturalar) üzrə nağdsız qaydada ödənilmiş məbləğ",
"declaration": "Declaration of value added tax",
"docstatus": 0,
"doctype": "Tax Article",
"is_group": 0,
"modified": "2025-09-19 16:35:19.691000",
"name": "VM 175.1-ci maddəsinə əsasən alınmış elektron qaimə-fakturalar (elektron vergi hesab-fakturalar) üzrə nağdsız qaydada ödənilmiş məbləğ",
"old_parent": null,
"parent_tax_article": "Əvəzləşdirilən vergi"
},
{ {
"article_name": "VM 169.4-cü maddəsinə əsasən qeyri-rezidentə ödənilmiş məbləğ", "article_name": "VM 169.4-cü maddəsinə əsasən qeyri-rezidentə ödənilmiş məbləğ",
"declaration": "Declaration of value added tax", "declaration": "Declaration of value added tax",
@ -1374,28 +1341,6 @@
"old_parent": null, "old_parent": null,
"parent_tax_article": "Əvəzləşdirilən vergi" "parent_tax_article": "Əvəzləşdirilən vergi"
}, },
{
"article_name": "Vergi Məcəlləsinin 165.5-ci maddəsinə əsasən ƏDV-si qaytarılan malların geri qaytarılması halları üzrə ƏDV-nin hesablanması (NAĞD ödənişlər)",
"declaration": "Declaration of value added tax",
"docstatus": 0,
"doctype": "Tax Article",
"is_group": 0,
"modified": "2025-09-19 16:35:19.691000",
"name": "Vergi Məcəlləsinin 165.5-ci maddəsinə əsasən ƏDV-si qaytarılan malların geri qaytarılması halları üzrə ƏDV-nin hesablanması (NAĞD ödənişl...",
"old_parent": null,
"parent_tax_article": "Dəqiqləşdirilən vergi"
},
{
"article_name": "Vergi Məcəlləsinin 165.5-ci maddəsinə əsasən ƏDV-si qaytarılan malların geri qaytarılması halları üzrə ƏDV-nin hesablanması (NAĞDSIZ ödənişlər)",
"declaration": "Declaration of value added tax",
"docstatus": 0,
"doctype": "Tax Article",
"is_group": 0,
"modified": "2025-09-19 16:35:19.691000",
"name": "Vergi Məcəlləsinin 165.5-ci maddəsinə əsasən ƏDV-si qaytarılan malların geri qaytarılması halları üzrə ƏDV-nin hesablanması (NAĞDSIZ ödən...",
"old_parent": null,
"parent_tax_article": "Dəqiqləşdirilən vergi"
},
{ {
"article_name": "Vergi Məcəlləsinin 165.6-cı maddəsinə əsasən ƏDV-si qaytarılan malların geri qaytarılması halları üzrə ƏDV-nin hesablanması (NAĞDSIZ ödənişlər)", "article_name": "Vergi Məcəlləsinin 165.6-cı maddəsinə əsasən ƏDV-si qaytarılan malların geri qaytarılması halları üzrə ƏDV-nin hesablanması (NAĞDSIZ ödənişlər)",
"declaration": "Declaration of value added tax", "declaration": "Declaration of value added tax",
@ -2331,28 +2276,6 @@
"old_parent": null, "old_parent": null,
"parent_tax_article": "Əlavə Dəyər Vergisi (ƏDV)" "parent_tax_article": "Əlavə Dəyər Vergisi (ƏDV)"
}, },
{
"article_name": "301.1 Təqdim edilmiş mallar (işlər, xidmətlər) üzrə ƏDV-yə 18 faiz dərəcə ilə cəlb olunan əməliyyatların məbləği CƏMİ",
"declaration": "Declaration of value added tax",
"docstatus": 0,
"doctype": "Tax Article",
"is_group": 0,
"modified": "2026-06-08 00:00:00.000000",
"name": "301.1 Təqdim edilmiş mallar (işlər, xidmətlər) üzrə ƏDV-yə 18 faiz dərəcə ilə cəlb olunan əməliyyatların məbləği CƏMİ",
"old_parent": null,
"parent_tax_article": "ƏDV tutulan dövriyyə barədə məlumat"
},
{
"article_name": "301.1.1 Malların təqdim edilməsindən gəlir",
"declaration": "Declaration of value added tax",
"docstatus": 0,
"doctype": "Tax Article",
"is_group": 0,
"modified": "2026-06-08 00:00:00.000000",
"name": "301.1.1 Malların təqdim edilməsindən gəlir",
"old_parent": null,
"parent_tax_article": "ƏDV tutulan dövriyyə barədə məlumat"
},
{ {
"article_name": "301.1.1.1 Girov əmlakların(malların) təqdim edilməsi", "article_name": "301.1.1.1 Girov əmlakların(malların) təqdim edilməsi",
"declaration": "Declaration of value added tax", "declaration": "Declaration of value added tax",
@ -2507,17 +2430,6 @@
"old_parent": null, "old_parent": null,
"parent_tax_article": "ƏDV tutulan dövriyyə barədə məlumat" "parent_tax_article": "ƏDV tutulan dövriyyə barədə məlumat"
}, },
{
"article_name": "301.1.2 İşlərin görülməsi və xidmətlərin göstərilməsi üzrə əməliyyatlar",
"declaration": "Declaration of value added tax",
"docstatus": 0,
"doctype": "Tax Article",
"is_group": 0,
"modified": "2026-06-08 00:00:00.000000",
"name": "301.1.2 İşlərin görülməsi və xidmətlərin göstərilməsi üzrə əməliyyatlar",
"old_parent": null,
"parent_tax_article": "ƏDV tutulan dövriyyə barədə məlumat"
},
{ {
"article_name": "301.1.2.1 Daşınan və daşınmaz əmlakın icarəyə verilməsindən gəlirlər", "article_name": "301.1.2.1 Daşınan və daşınmaz əmlakın icarəyə verilməsindən gəlirlər",
"declaration": "Declaration of value added tax", "declaration": "Declaration of value added tax",

File diff suppressed because it is too large Load Diff

View File

@ -4,4 +4,5 @@
[post_model_sync] [post_model_sync]
# Patches added in this section will be executed after doctypes are migrated # Patches added in this section will be executed after doctypes are migrated
taxes_az.patches.remove_legacy_mixed_vat_tax_articles taxes_az.patches.remove_legacy_mixed_vat_tax_articles
taxes_az.patches.remove_aggregate_vat_tax_articles

View File

@ -0,0 +1,42 @@
"""Drop the aggregate/total VAT articles from the Tax Article picker.
These are ФНО summary lines (301.1 CƏMİ, its two subtotals, the umbrella 165.1.3
article that sits above the goods/services export ones, 308, 319.2, 319.3), not
leaf articles an accountant should be able to pick on an invoice line. They stay
in the declaration form itself, where those rows are filled in by hand.
Matched on article_name rather than name: Frappe truncates name at 140 chars, so
some of these exist under an ellipsised name and 165.5 (NAĞD) shipped twice,
once under each spelling. Equality (not LIKE) keeps the 165.1.3 goods/services
siblings and 165.6 alive.
Runs in post_model_sync, i.e. before fixtures are imported, and the same rows are
gone from tax_article.json otherwise sync_fixtures would just put them back.
Idempotent: a no-op once they are gone.
"""
import frappe
DOOMED = [
"301.1 Təqdim edilmiş mallar (işlər, xidmətlər) üzrə ƏDV-yə 18 faiz dərəcə ilə cəlb olunan əməliyyatların məbləği CƏMİ",
"301.1.1 Malların təqdim edilməsindən gəlir",
"301.1.2 İşlərin görülməsi və xidmətlərin göstərilməsi üzrə əməliyyatlar",
"Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən aparılan əməliyyatlar",
"VM 175.1-ci maddəsinə əsasən alınmış elektron qaimə-fakturalar (elektron vergi hesab-fakturalar) üzrə nağdsız qaydada ödənilmiş məbləğ",
"Vergi Məcəlləsinin 165.5-ci maddəsinə əsasən ƏDV-si qaytarılan malların geri qaytarılması halları üzrə ƏDV-nin hesablanması (NAĞD ödənişlər)",
"Vergi Məcəlləsinin 165.5-ci maddəsinə əsasən ƏDV-si qaytarılan malların geri qaytarılması halları üzrə ƏDV-nin hesablanması (NAĞDSIZ ödənişlər)",
]
def execute():
if not frappe.db.exists("DocType", "Tax Article"):
return
names = frappe.get_all(
"Tax Article",
filters={"article_name": ("in", DOOMED), "is_group": 0},
pluck="name",
)
for name in names:
frappe.delete_doc("Tax Article", name, force=1, ignore_permissions=True)

View File

@ -128,7 +128,6 @@ def get_tax_articles_mapping():
# 165.1.x статьи # 165.1.x статьи
"Vergi Məcəlləsinin 165.1.1-ci maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_1", "Vergi Məcəlləsinin 165.1.1-ci maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_1",
"Vergi Məcəlləsinin 165.1.2-ci maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_2", "Vergi Məcəlləsinin 165.1.2-ci maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_2",
"Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_3",
"Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən malların ixracı üzrə aparılmış əməliyyatlar": "vm_165_1_3_mal", "Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən malların ixracı üzrə aparılmış əməliyyatlar": "vm_165_1_3_mal",
"Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən bu Məcəllənin 168.1.5-ci maddəsində göstərilmiş xidmətlərin ixracı üzrə aparılmış əməliyyatlar": "vm_165_1_3_xid", "Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən bu Məcəllənin 168.1.5-ci maddəsində göstərilmiş xidmətlərin ixracı üzrə aparılmış əməliyyatlar": "vm_165_1_3_xid",
"Vergi Məcəlləsinin 165.1.4-cü maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_4", "Vergi Məcəlləsinin 165.1.4-cü maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_4",
@ -212,7 +211,6 @@ def get_field_to_label_mapping():
# 165.1.x статьи # 165.1.x статьи
"vm_165_1_1": "VM 165.1.1", "vm_165_1_1": "VM 165.1.1",
"vm_165_1_2": "VM 165.1.2", "vm_165_1_2": "VM 165.1.2",
"vm_165_1_3": "VM 165.1.3",
"vm_165_1_3_mal": "VM 165.1.3 Mal", "vm_165_1_3_mal": "VM 165.1.3 Mal",
"vm_165_1_3_xid": "VM 165.1.3 Xid", "vm_165_1_3_xid": "VM 165.1.3 Xid",
"vm_165_1_4": "VM 165.1.4", "vm_165_1_4": "VM 165.1.4",

View File

@ -152,7 +152,6 @@ def get_tax_articles_mapping():
# 165.1.x статьи # 165.1.x статьи
"Vergi Məcəlləsinin 165.1.1-ci maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_1", "Vergi Məcəlləsinin 165.1.1-ci maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_1",
"Vergi Məcəlləsinin 165.1.2-ci maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_2", "Vergi Məcəlləsinin 165.1.2-ci maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_2",
"Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_3",
"Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən malların ixracı üzrə aparılmış əməliyyatlar": "vm_165_1_3_mal", "Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən malların ixracı üzrə aparılmış əməliyyatlar": "vm_165_1_3_mal",
"Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən bu Məcəllənin 168.1.5-ci maddəsində göstərilmiş xidmətlərin ixracı üzrə aparılmış əməliyyatlar": "vm_165_1_3_xid", "Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən bu Məcəllənin 168.1.5-ci maddəsində göstərilmiş xidmətlərin ixracı üzrə aparılmış əməliyyatlar": "vm_165_1_3_xid",
"Vergi Məcəlləsinin 165.1.4-cü maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_4", "Vergi Məcəlləsinin 165.1.4-cü maddəsinə əsasən aparılan əməliyyatlar": "vm_165_1_4",
@ -228,8 +227,6 @@ def get_tax_articles_mapping():
"303.42 Azərbaycan Respublikasının tərəfdar çıxdığı beynəlxalq müqavilələr üzrə": "vm_303_42", "303.42 Azərbaycan Respublikasının tərəfdar çıxdığı beynəlxalq müqavilələr üzrə": "vm_303_42",
"303.53 Xüsusi iqtisadi zonalar haqqında qanunlar çərçivəsində aparılan əməliyyatlar": "vm_303_53", "303.53 Xüsusi iqtisadi zonalar haqqında qanunlar çərçivəsində aparılan əməliyyatlar": "vm_303_53",
# --- 301.x новые статьи (ƏDV tutulan dövriyyə barədə məlumat, Əlavə 3) --- # --- 301.x новые статьи (ƏDV tutulan dövriyyə barədə məlumat, Əlavə 3) ---
"301.1 Təqdim edilmiş mallar (işlər, xidmətlər) üzrə ƏDV-yə 18 faiz dərəcə ilə cəlb olunan əməliyyatların məbləği CƏMİ": "vm_301_1_cemi",
"301.1.1 Malların təqdim edilməsindən gəlir": "vm_301_1_1",
"301.1.1.1 Girov əmlakların(malların) təqdim edilməsi": "vm_301_1_1_1", "301.1.1.1 Girov əmlakların(malların) təqdim edilməsi": "vm_301_1_1_1",
"301.1.1.2 Əmək haqqının əvəzınə təqdim edilmiş mallar": "vm_301_1_1_2", "301.1.1.2 Əmək haqqının əvəzınə təqdim edilmiş mallar": "vm_301_1_1_2",
"301.1.1.3 Agent vasitəsi ilə təqdim edilmiş mallar üzrə gəlirlər": "vm_301_1_1_3", "301.1.1.3 Agent vasitəsi ilə təqdim edilmiş mallar üzrə gəlirlər": "vm_301_1_1_3",
@ -244,7 +241,6 @@ def get_tax_articles_mapping():
"301.1.1.12 Malların təqdim edilməsi üzrə yaranan debitor borclar üzrə iddia müddətinin bitməsi": "vm_301_1_1_12", "301.1.1.12 Malların təqdim edilməsi üzrə yaranan debitor borclar üzrə iddia müddətinin bitməsi": "vm_301_1_1_12",
"301.1.1.13 Qarşılıqlı hesablaşmalar aparıldıqda öhdəliyin ləğv edilməsi və ya ödənilməsi": "vm_301_1_1_13", "301.1.1.13 Qarşılıqlı hesablaşmalar aparıldıqda öhdəliyin ləğv edilməsi və ya ödənilməsi": "vm_301_1_1_13",
"301.1.1.14 Tələb hüququ güzəşt edildikdə güzəşt edilən məbləğ": "vm_301_1_1_14", "301.1.1.14 Tələb hüququ güzəşt edildikdə güzəşt edilən məbləğ": "vm_301_1_1_14",
"301.1.2 İşlərin görülməsi və xidmətlərin göstərilməsi üzrə əməliyyatlar": "vm_301_1_2",
"301.1.2.1 Daşınan və daşınmaz əmlakın icarəyə verilməsindən gəlirlər": "vm_301_1_2_1", "301.1.2.1 Daşınan və daşınmaz əmlakın icarəyə verilməsindən gəlirlər": "vm_301_1_2_1",
"301.1.2.2 Əmək haqqının əvəzinə işlərin görülməsi və xidmətlərin göstərilməsi üzrə əməliyyatlar": "vm_301_1_2_2", "301.1.2.2 Əmək haqqının əvəzinə işlərin görülməsi və xidmətlərin göstərilməsi üzrə əməliyyatlar": "vm_301_1_2_2",
"301.1.2.3 Müstəqil ƏDV ödəyicisi olan struktur bölmələri arasında işlərin görülməsi və xidmətlərin göstərilməsi üzrə əməliyyatlar": "vm_301_1_2_3", "301.1.2.3 Müstəqil ƏDV ödəyicisi olan struktur bölmələri arasında işlərin görülməsi və xidmətlərin göstərilməsi üzrə əməliyyatlar": "vm_301_1_2_3",
@ -283,7 +279,6 @@ def get_field_to_label_mapping():
# 165.1.x статьи # 165.1.x статьи
"vm_165_1_1": "VM 165.1.1", "vm_165_1_1": "VM 165.1.1",
"vm_165_1_2": "VM 165.1.2", "vm_165_1_2": "VM 165.1.2",
"vm_165_1_3": "VM 165.1.3",
"vm_165_1_3_mal": "VM 165.1.3 Mal", "vm_165_1_3_mal": "VM 165.1.3 Mal",
"vm_165_1_3_xid": "VM 165.1.3 Xid", "vm_165_1_3_xid": "VM 165.1.3 Xid",
"vm_165_1_4": "VM 165.1.4", "vm_165_1_4": "VM 165.1.4",
@ -359,8 +354,6 @@ def get_field_to_label_mapping():
"vm_303_42": "303.42", "vm_303_42": "303.42",
"vm_303_53": "303.53", "vm_303_53": "303.53",
# --- 301.x новые статьи --- # --- 301.x новые статьи ---
"vm_301_1_cemi": "301.1",
"vm_301_1_1": "301.1.1",
"vm_301_1_1_1": "301.1.1.1", "vm_301_1_1_1": "301.1.1.1",
"vm_301_1_1_2": "301.1.1.2", "vm_301_1_1_2": "301.1.1.2",
"vm_301_1_1_3": "301.1.1.3", "vm_301_1_1_3": "301.1.1.3",
@ -375,7 +368,6 @@ def get_field_to_label_mapping():
"vm_301_1_1_12": "301.1.1.12", "vm_301_1_1_12": "301.1.1.12",
"vm_301_1_1_13": "301.1.1.13", "vm_301_1_1_13": "301.1.1.13",
"vm_301_1_1_14": "301.1.1.14", "vm_301_1_1_14": "301.1.1.14",
"vm_301_1_2": "301.1.2",
"vm_301_1_2_1": "301.1.2.1", "vm_301_1_2_1": "301.1.2.1",
"vm_301_1_2_2": "301.1.2.2", "vm_301_1_2_2": "301.1.2.2",
"vm_301_1_2_3": "301.1.2.3", "vm_301_1_2_3": "301.1.2.3",