diff --git a/taxes_az/public/js/dovr_period.js b/taxes_az/public/js/dovr_period.js index 362da24..c63af22 100644 --- a/taxes_az/public/js/dovr_period.js +++ b/taxes_az/public/js/dovr_period.js @@ -102,19 +102,50 @@ frappe.provide("taxes_az.dovr"); return 0; } - // Seçilmiş tarixi ay/il/rüb + dövr-a yazır. + // Seçilmiş tarixi ay/il/rüb + dövr-a yazır və hesablamaları BİR DƏFƏ işə salır. + // + // Niyə `frm.set_value()` yox: + // set_value hər sahə üçün ayrıca trigger qoyur, triggerlər isə asinxron + // işləyir (frappe.model.set_value -> run_serially). Yəni `ay` və `il` + // dəyərləri hər ikisi frm.doc-a düşəndən sonra HƏR İKİ handler işə düşür və + // bütün hesablama iki dəfə aparılır (VAT-da həm də populate_vat_tables iki + // dəfə çağırılır). + // Üstəlik set_value dəyər dəyişməyibsə heç nə etmir (`doc[key] !== value`), + // ona görə yalnız ayı dəyişəndə (il eyni qalanda) `il`-ə arxalanmaq olmaz — + // nə trigger, nə də dirty olardı. + // + // Ona görə set_value-nun etdiklərini əl ilə təkrarlayırıq və trigger-i bir dəfə + // özümüz çağırırıq. Bu təhlükəsizdir: bütün ФНО-larda period handler-i ilə `il` + // handler-inin gövdəsi eynidir (formula editor hər asılı sahə üçün eyni bloku + // generasiya edir), `calculate_table_row_field`-in triggerField arqumenti isə + // heç yerdə istifadə olunmur. function apply_selection(frm, mode, date) { const year = date.getFullYear(); + const pf = period_field(mode); // "ay" | "rüb" | null (annual) let period = null; - if (mode === "month") { - period = MONTHS[date.getMonth()]; - frm.set_value("ay", period); - } else if (is_quarter(mode)) { - period = QUARTERS[Math.floor(date.getMonth() / 3)]; - frm.set_value(period_field(mode), period); + + if (pf) { + period = (mode === "month") + ? MONTHS[date.getMonth()] + : QUARTERS[Math.floor(date.getMonth() / 3)]; + frm.doc[pf] = period; + } + frm.doc.il = year; + frm.doc["dövr"] = build_label(mode, period, year); + + if (pf) frm.refresh_field(pf); + frm.refresh_field("il"); + frm.refresh_field("dövr"); + frm.layout.refresh_dependency(); + frm.dirty(); + + // Hesablamaları bir dəfə işə salırıq. Adətən `il` handler-i var; yoxdursa + // period sahəsinin handler-inə geri düşürük. + const bound = frappe.ui.form.handlers[frm.doctype] || {}; + const on = (bound["il"] || []).length ? "il" : pf; + if (on) { + frm.script_manager.trigger(on, frm.doctype, frm.docname); } - frm.set_value("il", year); - frm.set_value("dövr", build_label(mode, period, year)); } function inject_style() {