From 770241a30e2faa5c73f8e574f45dcdfa7a69d116 Mon Sep 17 00:00:00 2001 From: Ali <010109ali@gmail.com> Date: Tue, 14 Jul 2026 11:44:50 +0000 Subject: [PATCH] fix(tax-article): match 328-330 to the e-taxes wording MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- taxes_az/fixtures/tax_article.json | 12 +++--- taxes_az/patches.txt | 3 +- .../rename_non_taxable_turnover_articles.py | 38 +++++++++++++++++++ .../vat_allocation_tax_articles_report.py | 6 +-- 4 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 taxes_az/patches/rename_non_taxable_turnover_articles.py diff --git a/taxes_az/fixtures/tax_article.json b/taxes_az/fixtures/tax_article.json index 22f42cc..2079bde 100644 --- a/taxes_az/fixtures/tax_article.json +++ b/taxes_az/fixtures/tax_article.json @@ -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" }, diff --git a/taxes_az/patches.txt b/taxes_az/patches.txt index b80c0ba..e04695a 100644 --- a/taxes_az/patches.txt +++ b/taxes_az/patches.txt @@ -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 \ No newline at end of file +taxes_az.patches.remove_aggregate_vat_tax_articles +taxes_az.patches.rename_non_taxable_turnover_articles \ No newline at end of file diff --git a/taxes_az/patches/rename_non_taxable_turnover_articles.py b/taxes_az/patches/rename_non_taxable_turnover_articles.py new file mode 100644 index 0000000..f7bf453 --- /dev/null +++ b/taxes_az/patches/rename_non_taxable_turnover_articles.py @@ -0,0 +1,38 @@ +"""Re-word 328–336 (Ə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) diff --git a/taxes_az/taxes_az/report/vat_allocation_tax_articles_report/vat_allocation_tax_articles_report.py b/taxes_az/taxes_az/report/vat_allocation_tax_articles_report/vat_allocation_tax_articles_report.py index 74bcd4e..186639e 100644 --- a/taxes_az/taxes_az/report/vat_allocation_tax_articles_report/vat_allocation_tax_articles_report.py +++ b/taxes_az/taxes_az/report/vat_allocation_tax_articles_report/vat_allocation_tax_articles_report.py @@ -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", # --- 328–336 новые статьи (Ə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",