fix(tax-article): match 328-330 to the e-taxes wording

The accountant reads the Tax Article picker side by side with the cabinet, so
the two have to read identically. Three of the nine Əlavə 3.2 articles drifted:
328 carried a double space and the grammatically-tidied "Respublikasının" where
the form writes "Respublikasınını", 329 a double space, 330 spelled out "Vergi
Məcəlləsinin" where the form abbreviates to "VM-nin".

331 and 336 are left alone — Əlavə 3.2 is the reference wording for those two
and the articles already match it.

The nine already existed and were already mapped in the VAT allocation report;
only the wording moved. Tax Article is autoname:Prompt, so name is a stored id
rather than a slug of article_name — re-wording article_name alone would leave
the old text showing in every link picker. The name has to move too, and a moved
name is a different document, hence the delete-and-reinsert patch rather than a
rename_doc walk across a NestedSet. Nothing referenced the three (all ten Tax
Article link fields checked, zero rows).

The report's mapping keys move in lockstep. They are matched by exact string
against article_name, so a key left behind would not raise — it would silently
zero its column on a filed return. All 115 keys verified to resolve against the
live table afterwards.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ali 2026-07-14 11:44:50 +00:00
parent e8354516fb
commit 770241a30e
4 changed files with 49 additions and 10 deletions

View File

@ -2640,35 +2640,35 @@
"parent_tax_article": "ƏDV tutulan dövriyyə barədə məlumat"
},
{
"article_name": "328. VM-nin 159.2-ci maddəsinə əsasən bu Məcəllənin 167-ci və 168-ci maddələrinə uyğun olaraq Azərbaycan Respublikasının hüdudlarından kənarda malların təqdim edilməsi, xidmətlərin göstərilməsi və işlər görülməsi üzrə əməliyyatlar",
"article_name": "328. VM-nin 159.2-ci maddəsinə əsasən bu Məcəllənin 167-ci və 168-ci maddələrinə uyğun olaraq Azərbaycan Respublikasınını hüdudlarından kənarda malların təqdim edilməsi, xidmətlərin göstərilməsi və işlər görülmə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": "328. VM-nin 159.2-ci maddəsinə əsasən bu Məcəllənin 167-ci və 168-ci maddələrinə uyğun olaraq Azərbaycan Respublikasının hüdudlarından k...",
"name": "328. VM-nin 159.2-ci maddəsinə əsasən bu Məcəllənin 167-ci və 168-ci maddələrinə uyğun olaraq Azərbaycan Respublikasınını hüdudlarından k...",
"old_parent": null,
"parent_tax_article": "ƏDV tutulan əməliyyat sayılmayan dövriyyə barədə məlumat"
},
{
"article_name": "329. VM-nin 159.5-ci maddəsinə əsasən fövqəladə hallarda, qanunvericiliklə müəyyən edilmiş təbii itki normaları daxilində zayolmadan əmələ gələn itkilər, təbii itki normaları daxilində xarabolmalar və bu kimi əskikgəlmələr üzrə məbləğ",
"article_name": "329. VM-nin 159.5-ci maddəsinə əsasən fövqəladə hallarda, qanunvericiliklə müəyyən edilmiş təbii itki normaları daxilində zayolmadan əmələ gələn itkilər, təbii itki normaları daxilində xarabolmalar və bu kimi əskikgəlmələr üzrə məbləğ",
"declaration": "Declaration of value added tax",
"docstatus": 0,
"doctype": "Tax Article",
"is_group": 0,
"modified": "2026-06-08 00:00:00.000000",
"name": "329. VM-nin 159.5-ci maddəsinə əsasən fövqəladə hallarda, qanunvericiliklə müəyyən edilmiş təbii itki normaları daxilində zayolmadan əmə...",
"name": "329. VM-nin 159.5-ci maddəsinə əsasən fövqəladə hallarda, qanunvericiliklə müəyyən edilmiş təbii itki normaları daxilində zayolmadan əməl...",
"old_parent": null,
"parent_tax_article": "ƏDV tutulan əməliyyat sayılmayan dövriyyə barədə məlumat"
},
{
"article_name": "330. Vergi Məcəlləsinin 159.7-ci maddəsinə əsasən vergiyə cəlb olunmayan əməliyyatlar",
"article_name": "330. VM-nin 159.7-ci maddəsinə əsasən vergiyə cəlb olunmayan ə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": "330. Vergi Məcəlləsinin 159.7-ci maddəsinə əsasən vergiyə cəlb olunmayan əməliyyatlar",
"name": "330. VM-nin 159.7-ci maddəsinə əsasən vergiyə cəlb olunmayan əməliyyatlar",
"old_parent": null,
"parent_tax_article": "ƏDV tutulan əməliyyat sayılmayan dövriyyə barədə məlumat"
},

View File

@ -5,4 +5,5 @@
[post_model_sync]
# 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_aggregate_vat_tax_articles
taxes_az.patches.remove_aggregate_vat_tax_articles
taxes_az.patches.rename_non_taxable_turnover_articles

View File

@ -0,0 +1,38 @@
"""Re-word 328336 (Əlavə 3.2) to match the e-taxes ФНО verbatim.
The accountant reads the article list side by side with the cabinet, so the two
have to read identically. Three of the nine drifted:
328 double space; "Respublikasının" -> "Respublikasınını" (the form's spelling)
329 double space
330 "Vergi Məcəlləsinin" -> "VM-nin"
331 and 336 stay as they are: Əlavə 3.2 is the reference wording for those two,
and the articles already match it.
Tax Article is autoname:Prompt, so name is a stored id, not derived re-wording
article_name alone would leave the old text showing in every link picker. The
name has to move too, and a moved name is a different document. Nothing points at
these nine (all ten Tax Article link fields checked, zero rows), so dropping the
old ids and letting sync_fixtures insert the new ones is safe and avoids a
rename_doc dance across a NestedSet.
post_model_sync, i.e. before fixtures import. Idempotent: a no-op once gone.
"""
import frappe
OLD_NAMES = [
"328. VM-nin 159.2-ci maddəsinə əsasən bu Məcəllənin 167-ci və 168-ci maddələrinə uyğun olaraq Azərbaycan Respublikasının hüdudlarından k...",
"329. VM-nin 159.5-ci maddəsinə əsasən fövqəladə hallarda, qanunvericiliklə müəyyən edilmiş təbii itki normaları daxilində zayolmadan əmə...",
"330. Vergi Məcəlləsinin 159.7-ci maddəsinə əsasən vergiyə cəlb olunmayan əməliyyatlar",
]
def execute():
if not frappe.db.exists("DocType", "Tax Article"):
return
for name in OLD_NAMES:
if frappe.db.exists("Tax Article", name):
frappe.delete_doc("Tax Article", name, force=1, ignore_permissions=True)

View File

@ -261,9 +261,9 @@ def get_tax_articles_mapping():
"301-3 Topdan ticarət üzrə ƏDV-yə 18 faiz dərəcə ilə cəlb edilən əməliyyatlar": "vm_301_3",
"301-4 Tibb müəssisələrinin və özəl tibbi praktika ilə məşğul olan fiziki şəxslərin hesabat dövrü ərzində əhaliyə göstərilən tibbi xidmətlər üzrə nağdsız qaydada POS-terminal vasitəsi ilə aparılan ödəmələr əsasında formalaşan dövriyyə": "vm_301_4",
# --- 328336 новые статьи (ƏDV tutulan əməliyyat sayılmayan dövriyyə, Əlavə 3) ---
"328. VM-nin 159.2-ci maddəsinə əsasən bu Məcəllənin 167-ci və 168-ci maddələrinə uyğun olaraq Azərbaycan Respublikasının hüdudlarından kənarda malların təqdim edilməsi, xidmətlərin göstərilməsi və işlər görülməsi üzrə əməliyyatlar": "vm_328",
"329. VM-nin 159.5-ci maddəsinə əsasən fövqəladə hallarda, qanunvericiliklə müəyyən edilmiş təbii itki normaları daxilində zayolmadan əmələ gələn itkilər, təbii itki normaları daxilində xarabolmalar və bu kimi əskikgəlmələr üzrə məbləğ": "vm_329",
"330. Vergi Məcəlləsinin 159.7-ci maddəsinə əsasən vergiyə cəlb olunmayan əməliyyatlar": "vm_330",
"328. VM-nin 159.2-ci maddəsinə əsasən bu Məcəllənin 167-ci və 168-ci maddələrinə uyğun olaraq Azərbaycan Respublikasınını hüdudlarından kənarda malların təqdim edilməsi, xidmətlərin göstərilməsi və işlər görülməsi üzrə əməliyyatlar": "vm_328",
"329. VM-nin 159.5-ci maddəsinə əsasən fövqəladə hallarda, qanunvericiliklə müəyyən edilmiş təbii itki normaları daxilində zayolmadan əmələ gələn itkilər, təbii itki normaları daxilində xarabolmalar və bu kimi əskikgəlmələr üzrə məbləğ": "vm_329",
"330. VM-nin 159.7-ci maddəsinə əsasən vergiyə cəlb olunmayan əməliyyatlar": "vm_330",
"331. Vergi Məcəlləsinin 160-cı maddəsinə əsasən vergiyə cəlb edilməyən əməliyyatlar, o cümlədən müəssisənin təqdim edilməsi": "vm_331",
"332. Müstəqil sahibkarlıq fəaliyyəti çərçivəsində malların göndərilməsi, işlərin görülməsi və xidmətlərin göstərilməsi sayılmayan əməliyyatlar üzrə": "vm_332",
"333. Rüsumsuz ticarət mağazalarında (Duty-Free) malların təqdim edilməsi və xidmətlərin göstərilməsi üzrə əməliyyatlar": "vm_333",