diff --git a/taxes_az/fixtures/client_script.json b/taxes_az/fixtures/client_script.json index d6520fd..dedaf49 100644 --- a/taxes_az/fixtures/client_script.json +++ b/taxes_az/fixtures/client_script.json @@ -1,112 +1,13 @@ [ - { - "docstatus": 0, - "doctype": "Client Script", - "dt": "Property tax return", - "enabled": 0, - "modified": "2025-08-04 19:19:28.002273", - "module": "Taxes Az", - "name": "DefaultProperty tax return Emlak vergi hesablamasi 3cu cedvel 1", - "script": "frappe.ui.form.on('Property tax return', {\r\n onload: function(frm) {\r\n if (!frm.doc.__islocal) return; \r\n\r\n if (!frm.doc.table_qqlq) {\r\n frm.set_value('table_qqlq', []); \r\n }\r\n\r\n const default_rows = [\r\n { göstəricilər: '503. Əsas vəsaitlərin ümumi dəyəri', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: '503.1 Vergiyə cəlb olunan əsas vəsaitlərin dəyəri', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: '503.1.1 Qeyri-kommersiya fəaliyyətində istifadə olunan əsas vəsaitlərin dəyəri', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: '503.2 Vergidən azad olunan əsas vəsaitlərin dəyəri', SahəAdı2: 'Məlumat' },\r\n ];\r\n\r\n default_rows.forEach(row => {\r\n frm.add_child('table_qqlq', row);\r\n });\r\n\r\n frm.refresh_field('table_qqlq'); \r\n }\r\n});", - "view": "Form" - }, - { - "docstatus": 0, - "doctype": "Client Script", - "dt": "Single declaration related to salaried and non-salaried work", - "enabled": 1, - "modified": "2025-02-07 19:15:44.492027", - "module": "Taxes Az", - "name": "SingleDeclarationRelatedToSalariedAndNon-SalariedWorkElave3-1", - "script": "frappe.ui.form.on('Single declaration related to salaried and non-salaried work', {\r\n onload: function(frm) {\r\n if (!frm.doc.__islocal) return; \r\n\r\n if (!frm.doc.table_zurm) {\r\n frm.set_value('table_zurm', []); \r\n }\r\n\r\n const default_rows = [\r\n { göstəricilər: 'İşçilərin ümumi sayı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Faktiki işə cəlb olunan işçilərin sayı', SahəAdı2: 'Məlumat' },\r\n ];\r\n\r\n default_rows.forEach(row => {\r\n frm.add_child('table_zurm', row);\r\n });\r\n\r\n frm.refresh_field('table_zurm'); \r\n }\r\n});", - "view": "Form" - }, - { - "docstatus": 0, - "doctype": "Client Script", - "dt": "Single declaration related to salaried and non-salaried work", - "enabled": 1, - "modified": "2025-02-07 19:17:50.796881", - "module": "Taxes Az", - "name": "SingleDeclarationRelatedToSalariedAndNon-SalariedWorkElave3-2", - "script": "frappe.ui.form.on('Single declaration related to salaried and non-salaried work', {\r\n onload: function(frm) {\r\n if (!frm.doc.__islocal) return; \r\n\r\n if (!frm.doc.table_jsoo) {\r\n frm.set_value('table_jsoo', []); \r\n }\r\n\r\n const default_rows = [\r\n { göstəricilər: 'Gəlirlər, cəmi', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Hesablanmış əmək haqqı və digər gəlirlər', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'O cümlədən əmək haqqının tərkibinə daxil olmayan gəlirlər', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'İstifadə edilməmiş əmək məzuniyyətinə görə hesablanmış kompensasiya məbləği', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Həyatın yığım sığortasına cəlb olunmuş məbləğə nisbətdə (vaxtından əvvəl müqaviləyə xitam verildiyi halda )', SahəAdı2: 'Məlumat' },\r\n ];\r\n\r\n default_rows.forEach(row => {\r\n frm.add_child('table_jsoo', row);\r\n });\r\n\r\n frm.refresh_field('table_jsoo'); \r\n }\r\n});", - "view": "Form" - }, - { - "docstatus": 0, - "doctype": "Client Script", - "dt": "Single declaration related to salaried and non-salaried work", - "enabled": 1, - "modified": "2025-02-07 19:19:42.101289", - "module": "Taxes Az", - "name": "SingleDeclarationRelatedToSalariedAndNon-SalariedWorkElave3-3", - "script": "frappe.ui.form.on('Single declaration related to salaried and non-salaried work', {\r\n onload: function(frm) {\r\n if (!frm.doc.__islocal) return; \r\n\r\n if (!frm.doc.table_crkw) {\r\n frm.set_value('table_crkw', []); \r\n }\r\n\r\n const default_rows = [\r\n { göstəricilər: 'Muzdlu işlə əlaqəli ödəmə mənbəyində tutulan vergilər üzrə güzəşt və azadolmalar', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Məcburi dövlət sosial sığorta haqqına cəlb olunmayan gəlirlər', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'İşsizlikdən sığorta haqqına cəlb olunmayan gəlirlər', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'İcbari tibbi sığorta haqqına cəlb olunmayan gəlirlər', SahəAdı2: 'Məlumat' },\r\n ];\r\n\r\n default_rows.forEach(row => {\r\n frm.add_child('table_crkw', row);\r\n });\r\n\r\n frm.refresh_field('table_crkw'); \r\n }\r\n});", - "view": "Form" - }, - { - "docstatus": 0, - "doctype": "Client Script", - "dt": "Single declaration related to salaried and non-salaried work", - "enabled": 1, - "modified": "2025-02-07 19:25:12.513505", - "module": "Taxes Az", - "name": "SingleDeclarationRelatedToSalariedAndNon-SalariedWorkElave5-1", - "script": "frappe.ui.form.on('Single declaration related to salaried and non-salaried work', {\r\n onload: function(frm) {\r\n if (!frm.doc.__islocal) return; \r\n\r\n if (!frm.doc.table_ukdx) {\r\n frm.set_value('table_ukdx', []); \r\n }\r\n\r\n const default_rows = [\r\n { göstəricilər: 'Məcburi dövlət sosial sığorta haqqına cəlb olunan gəlirlər', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Hesablama (cəmi)', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Hesablanmış məcburi dövlət sosial sığorta haqqı (cəmi)', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Sığortaedənin hesabına məcburi dövlət sosial sığorta haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Hesablanmış əmək haqqı və digər gəlirlərə nisbətdə MDSS haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'İstifadə edilməmiş əmək məzuniyyətinə görə hesablanmış kompensasiya məbləğinə nisbətdə MDSS haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Həyatın yığım sığortasına cəlb olunmuş məbləğə nisbətdə (vaxtından əvvəl müqaviləyə xitam verildiyi halda)', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Sığortaolunanın (işçinin) hesabına məcburi dövlət sosial sığorta haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Hesablanmış əmək haqqı və digər gəlirlərə nisbətdə MDSS haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'İstifadə edilməmiş əmək məzuniyyətinə görə hesablanmış kompensasiya məbləğinə nisbətdə MDSS haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Həyatın yığım sığortasına cəlb olunmuş məbləğə nisbətdə (vaxtından əvvəl müqaviləyə xitam verildiyi halda)', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Sığortaolunanın (işçinin) hesabına məcburi dövlət sosial sığorta haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Hesablanmış əmək haqqı və digər gəlirlərə nisbətdə MDSS haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'İstifadə edilməmiş əmək məzuniyyətinə görə hesablanmış kompensasiya məbləğinə nisbətdə MDSS haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Digər', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Sanatoriya kurort yollayışlarının dəyərinin qismən ödənilməsi', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Əmək zədəsi və peşə xəstəliyi üzrə müavinətlərin geri qaytarılması', SahəAdı2: 'Məlumat' },\r\n ];\r\n\r\n default_rows.forEach(row => {\r\n frm.add_child('table_ukdx', row);\r\n });\r\n\r\n frm.refresh_field('table_ukdx'); \r\n }\r\n});", - "view": "Form" - }, - { - "docstatus": 0, - "doctype": "Client Script", - "dt": "Single declaration related to salaried and non-salaried work", - "enabled": 1, - "modified": "2025-02-07 19:28:15.179882", - "module": "Taxes Az", - "name": "SingleDeclarationRelatedToSalariedAndNon-SalariedWorkElave5-2", - "script": "frappe.ui.form.on('Single declaration related to salaried and non-salaried work', {\r\n onload: function(frm) {\r\n if (!frm.doc.__islocal) return; \r\n\r\n if (!frm.doc.table_zwzv) {\r\n frm.set_value('table_zwzv', []); \r\n }\r\n\r\n const default_rows = [\r\n { göstəricilər: 'İşsizlikdən sığorta haqqına cəlb edilən gəlirlər', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Hesablama (cəmi)', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Hesablanmış işsizlikdən sığorta haqqı (cəmi)', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Sığortaedənin hesabına işsizlikdən sığorta haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Sığortaolunanın hesabına işsizlikdən sığorta haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Digər mənbələr', SahəAdı2: 'Məlumat' },\r\n ];\r\n\r\n default_rows.forEach(row => {\r\n frm.add_child('table_zwzv', row);\r\n });\r\n\r\n frm.refresh_field('table_zwzv'); \r\n }\r\n});", - "view": "Form" - }, - { - "docstatus": 0, - "doctype": "Client Script", - "dt": "Single declaration related to salaried and non-salaried work", - "enabled": 1, - "modified": "2025-02-07 19:31:09.856380", - "module": "Taxes Az", - "name": "SingleDeclarationRelatedToSalariedAndNon-SalariedWorkElave5-3", - "script": "frappe.ui.form.on('Single declaration related to salaried and non-salaried work', {\r\n onload: function(frm) {\r\n if (!frm.doc.__islocal) return; \r\n\r\n if (!frm.doc.table_pkqe) {\r\n frm.set_value('table_pkqe', []); \r\n }\r\n\r\n const default_rows = [\r\n { göstəricilər: 'İcbari tibbi sığorta haqqına cəlb edilən gəlirlər', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Hesablanmış icbari tibbi sığorta haqqı, cəmi', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Sığortalının hesabına icbari tibbi sığorta haqqı', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Sığortaolunanın hesabına icbari tibbi sığorta haqqı', SahəAdı2: 'Məlumat' },\r\n ];\r\n\r\n default_rows.forEach(row => {\r\n frm.add_child('table_pkqe', row);\r\n });\r\n\r\n frm.refresh_field('table_pkqe'); \r\n }\r\n});", - "view": "Form" - }, - { - "docstatus": 0, - "doctype": "Client Script", - "dt": "Single declaration related to salaried and non-salaried work", - "enabled": 1, - "modified": "2025-02-07 19:59:24.473216", - "module": "Taxes Az", - "name": "SingleDeclarationRelatedToSalariedAndNon-SalariedWorkElave4", - "script": "frappe.ui.form.on('Single declaration related to salaried and non-salaried work', {\r\n onload: function(frm) {\r\n if (!frm.doc.__islocal) return; \r\n\r\n if (!frm.doc.table_yidf) {\r\n frm.set_value('table_yidf', []); \r\n }\r\n\r\n const default_rows = [\r\n { göstəricilər: 'Muzdlu işlə əlaqədar hesablamalar', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'AR hüdudlarından kənarda muzdlu işlə əlaqədar hesablamalar', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'O cümlədən, rəsmi bəyan edilməklə hesablamalar', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Yerli fiziki şəxslər üzrə hesablamalar', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'VM-nin 98.2-ci maddəsinə əsasən yerli fiziki şəxslər üzrə hesablamalar', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'İstifadə edilməmiş əmək məzuniyyətinə görə ödənilmiş kompensasiya məbləği', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Xarici fiziki şəxslər üzrə hesablamalar (manatla)', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'Xarici fiziki şəxslər üzrə hesablamalar (ABŞ dolları ilə)', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'VM-nin 98.2-ci maddəsinə əsasən xarici fiziki şəxslər üzrə hesablamalar (manatla)', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'VM-nin 98.2-ci maddəsinə əsasən xarici fiziki şəxslər üzrə hesablamalar (ABŞ dolları ilə)', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'İstifadə edilməmiş əmək məzuniyyətinə görə ödənilmiş kompensasiya məbləği (manatla)', SahəAdı2: 'Məlumat' },\r\n { göstəricilər: 'İstifadə edilməmiş əmək məzuniyyətinə görə ödənilmiş kompensasiya məbləği (ABŞ dolları ilə)', SahəAdı2: 'Məlumat' },\r\n ];\r\n\r\n default_rows.forEach(row => {\r\n frm.add_child('table_yidf', row);\r\n });\r\n\r\n frm.refresh_field('table_yidf'); \r\n }\r\n});", - "view": "Form" - }, - { - "docstatus": 0, - "doctype": "Client Script", - "dt": "Declaration of mining tax", - "enabled": 0, - "modified": "2025-08-27 14:13:38.557750", - "module": "Taxes Az", - "name": "testtsetes", - "script": "// Generated by Formula Editor\nfrappe.ui.form.on(\"Declaration of mining tax\", {\n \"refresh\": async function(frm) {\n initialize_table_row_formulas(frm);\n },\n \"ay\": async function(frm) {\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 1)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 2)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları) * 2\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 3)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 4)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 5)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 6)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 7)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 8)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 9)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 10)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 11)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 12)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 13)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 14)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 15)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 16)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 17)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 18)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 19)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 20)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 21)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 22)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular) * 0.04\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 23)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 24)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular) * 10\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 25)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 26)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 27)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 28)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 29)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 30)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 31)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 32)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 33)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 34)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 35)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице topdansatış_qiyməti_ilə (порядок: 36)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Təbii qaz-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице topdansatış_qiyməti_ilə (порядок: 37)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 38)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti) * 26/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n },\n \"il\": async function(frm) {\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 1)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 2)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları) * 2\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 3)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 4)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 5)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 6)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 7)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 8)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 9)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 10)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 11)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 12)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 13)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 14)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 15)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 16)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 17)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 18)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 19)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 20)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 21)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 22)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular) * 0.04\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 23)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 24)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular) * 10\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 25)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 26)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 27)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 28)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 29)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 30)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 31)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 32)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 33)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 34)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 35)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице topdansatış_qiyməti_ilə (порядок: 36)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Təbii qaz-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице topdansatış_qiyməti_ilə (порядок: 37)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 38)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti) * 26/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n },\n \"faydalı_qazıntıların_hasilatı_add\": function(frm) {\n // Обновляем индексы строк после добавления новой строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n \"faydalı_qazıntıların_hasilatı_remove\": function(frm) {\n // Обновляем индексы строк после удаления строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n \"topdansatış_qiyməti_ilə_add\": function(frm) {\n // Обновляем индексы строк после добавления новой строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n \"topdansatış_qiyməti_ilə_remove\": function(frm) {\n // Обновляем индексы строк после удаления строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n});\n\n\n // Функция для обработки и выполнения формул\n async function processFormula(frm, formula) {\n try {\n // Проверяем наличие вызовов отчетов\n if (formula.includes(\"report(\")) {\n // Извлекаем все вызовы report() из формулы\n const reportRegex = /report\\(([^)]+)\\)/g;\n let match;\n let processedFormula = formula;\n \n // Массив для хранения промисов запросов к отчетам\n const reportPromises = [];\n const reportPlaceholders = [];\n \n // Находим все вызовы report() и заменяем их на плейсхолдеры\n while ((match = reportRegex.exec(formula)) !== null) {\n const fullMatch = match[0]; // report(fieldName)\n const fieldName = match[1]; // fieldName\n \n // Создаем уникальный плейсхолдер\n const placeholder = `__REPORT_PLACEHOLDER_${reportPromises.length}__`;\n \n // Ищем данные отчета в хранилище\n const reportFields = JSON.parse(frm.doc.report_fields_storage || \"{}\");\n const reportField = Object.values(reportFields).find(f => f.name === fieldName);\n \n if (reportField) {\n // Добавляем промис запроса к отчету\n reportPromises.push(\n getReportFieldValue(\n frm,\n reportField.report, \n JSON.parse(reportField.filters_json || \"{}\"), \n reportField.field_name, \n reportField.aggregation || 'sum'\n )\n );\n \n // Запоминаем соответствие плейсхолдера и вызова\n reportPlaceholders.push({\n placeholder: placeholder,\n original: fullMatch\n });\n \n // Заменяем вызов отчета на плейсхолдер\n processedFormula = processedFormula.replace(fullMatch, placeholder);\n }\n }\n \n // Если нашли вызовы отчетов, ждем выполнения всех запросов\n if (reportPromises.length > 0) {\n const reportResults = await Promise.all(reportPromises);\n \n // Заменяем плейсхолдеры на результаты\n for (let i = 0; i < reportPlaceholders.length; i++) {\n // Убедимся, что результат - числовое значение\n const reportValue = reportResults[i] !== undefined ? Number(reportResults[i]) : 0;\n processedFormula = processedFormula.replace(\n reportPlaceholders[i].placeholder, \n reportValue\n );\n }\n \n // Теперь формула не содержит вызовов report(), обрабатываем её обычным способом\n let transformResult = transform_expression(processedFormula, false);\n \n // Если есть внешняя трансформация, применяем её\n let result;\n if (transformResult && transformResult.transformed) {\n result = eval(transformResult.transformed);\n } else {\n // Иначе просто вычисляем выражение\n result = eval(processedFormula);\n }\n \n // Возвращаем результат\n return isNaN(result) ? 0 : result;\n }\n }\n \n // Стандартная обработка для формул без отчетов\n let transformResult = transform_expression(formula, false);\n let result = eval(transformResult.transformed);\n return isNaN(result) ? 0 : result;\n } catch (e) {\n return 0;\n }\n }\n\n\n // Функция для расчета универсальных полей\n async function calculate_universal_fields(frm) {\n \n }\n \n // Функция для обработки квартала (rüb) и года (il)\n function processQuarterDateField(docValues) {\n // Проверяем, есть ли у нас значения rüb и il\n if (docValues && docValues.rüb && docValues.il) {\n // Получаем номер квартала (преобразуем из строки вида \"1 Rüb\" в число 1)\n const quarterStr = docValues.rüb;\n const quarterMatch = quarterStr.match(/(\\d+)/);\n \n if (!quarterMatch) {\n return null;\n }\n \n const quarterNum = parseInt(quarterMatch[1]);\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем начальный и конечный месяц квартала\n let startMonth, endMonth;\n \n switch(quarterNum) {\n case 1:\n startMonth = 1; // Январь\n endMonth = 3; // Март\n break;\n case 2:\n startMonth = 4; // Апрель\n endMonth = 6; // Июнь\n break;\n case 3:\n startMonth = 7; // Июль\n endMonth = 9; // Сентябрь\n break;\n case 4:\n startMonth = 10; // Октябрь\n endMonth = 12; // Декабрь\n break;\n default:\n return null;\n }\n \n // Определяем первый день квартала (1-е число начального месяца)\n const firstDay = new Date(year, startMonth - 1, 1);\n \n // Последний день квартала (последнее число конечного месяца)\n const lastDay = new Date(year, endMonth, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = `${year}-${String(startMonth).padStart(2, '0')}-01`;\n const lastDayStr = `${year}-${String(endMonth).padStart(2, '0')}-${String(lastDay.getDate()).padStart(2, '0')}`; \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Если это не специальное поле или значение не распознано, возвращаем null\n return null;\n }\n \n // Функция для обработки специальных полей с азербайджанскими месяцами\n function processAzerbayjanDateField(docValues) {\n // Словарь для сопоставления названий месяцев с их номерами\n const monthNames = {\n \"Yanvar\": 1,\n \"Fevral\": 2,\n \"Mart\": 3,\n \"Aprel\": 4,\n \"May\": 5,\n \"İyun\": 6,\n \"İyul\": 7,\n \"Avqust\": 8,\n \"Sentyabr\": 9,\n \"Oktyabr\": 10,\n \"Noyabr\": 11,\n \"Dekabr\": 12\n };\n \n // Проверяем наличие квартала (rüb) и года (il)\n if (docValues && docValues.rüb && docValues.il) {\n // Вызываем специальную функцию для обработки квартала\n return processQuarterDateField(docValues);\n }\n \n // Проверяем, есть ли у нас значения ay и il\n if (docValues && docValues.ay && monthNames[docValues.ay]) {\n // Получаем номер месяца\n const monthNum = monthNames[docValues.ay];\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем первый день месяца (1-е число)\n const firstDay = new Date(year, monthNum - 1, 1);\n \n // Последний день месяца (получаем последнее число месяца)\n const lastDay = new Date(year, monthNum, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = `${year}-${String(monthNum).padStart(2, '0')}-01`;\n const lastDayStr = `${year}-${String(monthNum).padStart(2, '0')}-${String(lastDay.getDate()).padStart(2, '0')}`; \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Если это не специальное поле или значение не распознано, возвращаем null\n return null;\n }\n \n\n\n// Функция для обработки азербайджанских дат\nfunction processAzerbayjanDateField(docValues) {\n // Словарь для сопоставления названий месяцев с их номерами\n const monthNames = {\n \"Yanvar\": 1,\n \"Fevral\": 2,\n \"Mart\": 3,\n \"Aprel\": 4,\n \"May\": 5,\n \"İyun\": 6,\n \"İyul\": 7,\n \"Avqust\": 8,\n \"Sentyabr\": 9,\n \"Oktyabr\": 10,\n \"Noyabr\": 11,\n \"Dekabr\": 12\n };\n \n // Проверяем наличие квартала (rüb) и года (il)\n if (docValues && docValues.rüb && docValues.il) {\n // Получаем номер квартала (преобразуем из строки вида \"1 Rüb\" в число 1)\n const quarterStr = docValues.rüb;\n const quarterMatch = quarterStr.match(/(\\d+)/);\n \n if (!quarterMatch) {\n return null;\n }\n \n const quarterNum = parseInt(quarterMatch[1]);\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем начальный и конечный месяц квартала\n let startMonth, endMonth;\n \n switch(quarterNum) {\n case 1:\n startMonth = 1; // Январь\n endMonth = 3; // Март\n break;\n case 2:\n startMonth = 4; // Апрель\n endMonth = 6; // Июнь\n break;\n case 3:\n startMonth = 7; // Июль\n endMonth = 9; // Сентябрь\n break;\n case 4:\n startMonth = 10; // Октябрь\n endMonth = 12; // Декабрь\n break;\n default:\n return null;\n }\n \n // Определяем первый день квартала (1-е число начального месяца)\n const firstDay = new Date(year, startMonth - 1, 1);\n \n // Последний день квартала (последнее число конечного месяца)\n const lastDay = new Date(year, endMonth, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = year + \"-\" + String(startMonth).padStart(2, '0') + \"-01\";\n const lastDayStr = year + \"-\" + String(endMonth).padStart(2, '0') + \"-\" + String(lastDay.getDate()).padStart(2, '0'); \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Проверяем, есть ли у нас значения ay и il\n if (docValues && docValues.ay && monthNames[docValues.ay]) {\n // Получаем номер месяца\n const monthNum = monthNames[docValues.ay];\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем первый день месяца (1-е число)\n const firstDay = new Date(year, monthNum - 1, 1);\n \n // Последний день месяца (получаем последнее число месяца)\n const lastDay = new Date(year, monthNum, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = year + \"-\" + String(monthNum).padStart(2, '0') + \"-01\";\n const lastDayStr = year + \"-\" + String(monthNum).padStart(2, '0') + \"-\" + String(lastDay.getDate()).padStart(2, '0'); \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Если это не специальное поле или значение не распознано, возвращаем null\n return null;\n}\n\nasync function getReportFieldValue(frm, reportName, filters, fieldName, aggregation) {\n try {\n // Обрабатываем фильтры с возможными ссылками на поля документа\n const processedFilters = {};\n \n for (const key in filters) {\n let value = filters[key];\n \n // Проверяем, является ли значение ссылкой на поле документа\n if (typeof value === 'string' && value.startsWith('doc.')) {\n const docField = value.substring(4);\n if (frm.doc[docField] !== undefined) {\n processedFilters[key] = frm.doc[docField];\n continue;\n }\n }\n \n // Обработка специальных переменных\n if (typeof value === 'string' && value.startsWith('$')) {\n switch (value) {\n case '$DefaultCompany':\n // Получаем компанию по умолчанию из настроек или документа\n processedFilters[key] = frm.doc.company || frappe.defaults.get_user_default(\"Company\");\n continue;\n \n case '$AyIlSpecial':\n // Обрабатываем специальные даты для азербайджанских месяцев/кварталов\n const dateRange = processAzerbayjanDateField(frm.doc);\n if (dateRange) {\n // Для полей from_date и to_date используем соответствующие значения\n if (key === 'from_date') {\n processedFilters[key] = dateRange.start;\n } else if (key === 'to_date') {\n processedFilters[key] = dateRange.end;\n } else {\n // Для других полей используем начальную дату\n processedFilters[key] = dateRange.start;\n }\n } else {\n // Если не удалось получить диапазон дат, используем текущую дату\n processedFilters[key] = frappe.datetime.get_today();\n }\n continue;\n \n default:\n // Для других $-переменных оставляем как есть\n processedFilters[key] = value;\n continue;\n }\n }\n \n // Обычные значения\n processedFilters[key] = value;\n }\n \n // Проверяем кеш\n if (!window.reportCache) window.reportCache = {};\n \n const cacheKey = reportName + \"|\" + JSON.stringify(processedFilters) + \"|\" + fieldName + \"|\" + aggregation;\n const now = new Date().getTime();\n \n if (window.reportCache[cacheKey] && \n window.reportCache[cacheKey].timestamp > now - 5 * 60 * 1000) {\n return window.reportCache[cacheKey].value;\n }\n \n // Выполняем запрос к серверу\n try {\n const result = await frappe.call({\n method: \"formula_editor.api.run_report_for_formula\",\n args: {\n report_name: reportName,\n filters: processedFilters,\n field_name: fieldName\n },\n freeze: false\n });\n \n if (result && result.message !== undefined) {\n if (result.message.error) {\n console.error('Report error:', result.message.error);\n return 0;\n } \n \n let value = parseFloat(result.message);\n if (isNaN(value)) value = 0;\n \n // Округляем до 2 знаков после запятой\n value = Math.round(value * 100) / 100;\n \n // Сохраняем в кеш\n window.reportCache[cacheKey] = {\n value: value,\n timestamp: now\n };\n \n return value;\n }\n } catch (err) {\n console.error('Report field error:', err);\n }\n \n return 0;\n } catch (error) {\n console.error('getReportFieldValue error:', error);\n return 0;\n }\n}\n\n\n function transform_expression(expression, for_child_table = false, table_name = null) {\n let transformed = expression;\n let needsAsync = false;\n let reportCalls = [];\n\n // === Обработка report(...) ===\n const reportRegex = /report\\(([^)]+)\\)/g;\n let match;\n \n // Находим все вызовы report() в выражении\n while ((match = reportRegex.exec(expression)) !== null) {\n const reportName = match[1]; // Имя поля отчета\n const fullMatch = match[0]; // Полный текст match - \"report(xyz)\"\n needsAsync = true;\n \n // Создаем уникальный плейсхолдер\n const placeholder = `__REPORT_PLACEHOLDER_${reportCalls.length}__`;\n \n // Ищем соответствующее поле отчета по имени\n \n if (reportName === \"Xam neft\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Xam_neft___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Təbii qaz\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Tebii_qaz___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Filiz faydalı qazıntıları: bütün növ metallar\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Filiz_faydali_qazintilari__butun_nov_metallar___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Mişar daşları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Misar_daslari___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Üzlük daşları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Üzluk_daslari___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Seolit\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Seolit___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Barit\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Barit___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Yüngül doldurucuların istehsalı üçün gillər\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Yungul_doldurucular_ucun_giller___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Vulkan külü və pemza\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Vulkan_kulu_ve_pemza___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Kvars qumları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Kvars_qumlari___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Sement xammalı\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Sement_xammali___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Duz\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Duz___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Qiymətli və yarımqiymətli bəzək daşları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Qiymetli_ve_yarimqiymetli_bezek_daslari___karat___qram\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Yodlu bromlu sular\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Yodlu_bromlu_sular___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Mineral sular\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Mineral_sular___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Bentonit gillər\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Bentonit_giller___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Kərpic-kirəmit gilləri\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Kerpic_kiremit_gilleri___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Tikinti qumları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Tikinti_qumlari___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Çınqıl xammalı\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Çinqil_xammali___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Gips, gəc\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Gips,_gec___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Xam neft-Topdan satış qiyməti\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Xam_neft___ton_sales\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Təbii qaz-Topdan satış qiyməti\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Tebii_qaz___m3_sales\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Filiz_faydali_qazintilari__butun_nov_metallar___ton_sales\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n }\n\n // === Обработка table(...) ===\n const tableRegex = /table\\(([^,)]+),\\s*([^,)]+),\\s*([^)]+)\\)/g;\n let tableMatch;\n while ((tableMatch = tableRegex.exec(expression)) !== null) {\n const fullMatch = tableMatch[0];\n const tableName = tableMatch[1].trim().replace(/['\"]/g, '');\n const rowNumber = tableMatch[2].trim();\n const fieldName = tableMatch[3].trim().replace(/['\"]/g, '');\n \n const replacement = `(function() { \n try {\n if (!frm.doc[\"${tableName}\"] || !frm.doc[\"${tableName}\"][${rowNumber} - 1]) {\n return 0;\n }\n const value = frm.doc[\"${tableName}\"][${rowNumber} - 1][\"${fieldName}\"];\n return parseFloat(value) || 0;\n } catch (e) {\n return 0;\n }\n })()`;\n \n transformed = transformed.replace(fullMatch, replacement);\n }\n\n // === Обработка universal полей ===\n \n\n // === Обработка val() и row() ===\n const tablePrefixes = [\"items\", \"taxes\", \"packed_items\", \"payments\", \"advances\", \"timesheets\", \"payment_schedule\", \"sales_team\"];\n\n for (const prefix of tablePrefixes) {\n const sumPattern = new RegExp(`sum\\\\(${prefix}_([^)]+)\\\\)`, 'g');\n transformed = transformed.replace(sumPattern, (m, f) => \n `(frm.doc[\"${prefix}\"] && frm.doc[\"${prefix}\"].reduce((s, r) => s + (parseFloat(r[\"${f}\"]) || 0), 0) || 0)`\n );\n\n const valPattern = new RegExp(`val\\\\(${prefix}_([^)]+)\\\\)`, 'g');\n transformed = transformed.replace(valPattern, (m, f) => \n `(frm.doc[\"${prefix}\"] && frm.doc[\"${prefix}\"].reduce((s, r) => s + (parseFloat(r[\"${f}\"]) || 0), 0) || 0)`\n );\n }\n\n if (for_child_table) {\n transformed = transformed.replace(/row\\(([^)]+)\\)/g, (m, f) => \n `(parseFloat(row[\"${f}\"]) || 0)`\n );\n\n transformed = transformed.replace(/val\\(([^)]+)\\)/g, (m, f) => {\n if (f.startsWith(table_name + '_')) {\n return `(parseFloat(row[\"${f.slice(table_name.length + 1)}\"]) || 0)`;\n }\n return `(parseFloat(frm.doc[\"${f}\"]) || 0)`;\n });\n } else {\n transformed = transformed.replace(/val\\(([^)]+)\\)/g, (m, f) => \n `(parseFloat(frm.doc[\"${f}\"]) || 0)`\n );\n\n transformed = transformed.replace(/row\\(([^)]+)\\)/g, () => \n `0 /* ERROR: row() вне табличной части */`\n );\n }\n\n return { transformed, needsAsync, reportCalls };\n }\n\n\n// Функция для получения индекса строки по её имени (name/cdn)\nfunction get_row_index(frm, tableName, rowName) {\n \n // Проверяем наличие таблицы\n if (!frm.doc[tableName]) {\n return -1;\n }\n \n // Выводим все строки для отладки\n frm.doc[tableName].forEach((row, idx) => {\n });\n \n // Ищем индекс строки по имени\n for (let i = 0; i < frm.doc[tableName].length; i++) {\n if (frm.doc[tableName][i].name === rowName) {\n return i;\n }\n }\n return -1;\n}\n\n// Функция для доступа к полям конкретных строк таблицы\nfunction table_row(tableName, rowIndex, fieldName) {\n // Проверяем наличие необходимых аргументов\n if (!tableName || rowIndex === undefined || !fieldName) {\n return 0;\n }\n \n // Преобразуем rowIndex в число (на случай, если передана строка)\n const rowIdx = parseInt(rowIndex) - 1; // Индексация с 1 для пользователя, но с 0 в массиве\n \n try {\n // Проверяем наличие таблицы и строки\n if (!frm.doc[tableName] || !frm.doc[tableName][rowIdx]) {\n return 0;\n }\n \n // Получаем значение поля\n const value = frm.doc[tableName][rowIdx][fieldName];\n \n // Проверяем на NaN и возвращаем значение или 0\n const numValue = parseFloat(value);\n if (isNaN(numValue)) {\n return 0;\n }\n return numValue;\n } catch (error) {\n return 0;\n }\n}\n\n// Функция для обновления значения поля конкретной строки таблицы\nfunction set_table_row(frm, tableName, rowIndex, fieldName, value) {\n // Проверяем наличие необходимых аргументов\n if (!frm || !tableName || rowIndex === undefined || !fieldName) {\n return false;\n }\n \n // Преобразуем rowIndex в число (на случай, если передана строка)\n const rowIdx = parseInt(rowIndex) - 1; // Индексация с 1 для пользователя, но с 0 в массиве\n \n try {\n // Проверяем наличие таблицы и строки\n if (!frm.doc[tableName] || !frm.doc[tableName][rowIdx]) {\n return false;\n }\n \n // Получаем строку таблицы\n const row = frm.doc[tableName][rowIdx];\n \n // Получаем сетевое имя cdt и cdn для Frappe\n const cdt = frm.fields_dict[tableName].grid.doctype;\n const cdn = row.name;\n \n // Проверяем, является ли значение NaN, и если да, заменяем его на 0\n let finalValue = value;\n if (typeof value === 'number' && isNaN(value)) {\n finalValue = 0;\n }\n \n // Обновляем значение поля\n frappe.model.set_value(cdt, cdn, fieldName, finalValue);\n \n return true;\n } catch (error) {\n return false;\n }\n}\n\n// Функция для поиска строки таблицы по значению поля\nfunction find_table_row(frm, tableName, fieldName, value) {\n // Проверяем наличие необходимых аргументов\n if (!frm || !tableName || !fieldName) {\n return -1;\n }\n \n try {\n // Проверяем наличие таблицы\n if (!frm.doc[tableName]) {\n return -1;\n }\n \n // Ищем строку с указанным значением поля\n for (let i = 0; i < frm.doc[tableName].length; i++) {\n if (frm.doc[tableName][i][fieldName] == value) {\n // Возвращаем индекс строки (начиная с 1 для пользователя)\n return i + 1;\n }\n }\n \n // Если строка не найдена\n return -1;\n } catch (error) {\n return -1;\n }\n}\n\n\n // Функция для инициализации формул строк табличных частей\n function initialize_table_row_formulas(frm) {\n try {\n // Получаем информацию о формулах для строк табличных частей\n const formulas = JSON.parse(frm.doc.table_row_formulas_storage || \"{}\");\n \n // ВАЖНО: Преобразуем объект в массив и сортируем его по порядку выполнения\n const sortedFormulas = Object.entries(formulas).map(([id, formula]) => {\n return { id, ...formula };\n }).sort((a, b) => {\n // Сортировка по значению поля order (если порядок не задан, используем 10 по умолчанию)\n const orderA = a.order !== undefined ? parseInt(a.order) : 10;\n const orderB = b.order !== undefined ? parseInt(b.order) : 10;\n return orderA - orderB;\n });\n \n // Группируем формулы по табличным частям и строкам\n const formulasByTableAndRow = {};\n \n sortedFormulas.forEach(formula => {\n const tableName = formula.table_name;\n const rowIndex = parseInt(formula.row_index);\n \n if (!formulasByTableAndRow[tableName]) {\n formulasByTableAndRow[tableName] = {};\n }\n \n if (!formulasByTableAndRow[tableName][rowIndex]) {\n formulasByTableAndRow[tableName][rowIndex] = [];\n }\n \n formulasByTableAndRow[tableName][rowIndex].push(formula);\n });\n \n // Устанавливаем обработчики для каждой табличной части\n Object.keys(formulasByTableAndRow).forEach(tableName => {\n if (!frm.doc[tableName]) {\n return;\n }\n \n // Для каждой строки таблицы\n frm.doc[tableName].forEach((row, rowIdx) => {\n // Получаем отсортированные формулы для текущей строки (строки нумеруются с 1, а индексы с 0)\n const rowFormulas = formulasByTableAndRow[tableName][rowIdx + 1] || [];\n \n // Выполняем формулы в порядке сортировки (по полю order)\n for (const formula of rowFormulas) {\n try {\n // Определяем необходимость асинхронного вызова\n const usesUniversal = formula.formula && formula.formula.includes(\"univ(\");\n const usesReports = formula.formula && formula.formula.includes(\"report(\");\n \n // Вызываем расчет формулы согласно установленному порядку\n if (usesUniversal || usesReports) {\n // Для асинхронных вызовов используем await в асинхронной IIFE\n (async () => {\n try {\n await calculate_table_row_field(frm, tableName, rowIdx, formula.field_name, formula.formula, \"refresh\");\n } catch (asyncError) {\n }\n })();\n } else {\n // Для синхронных вызовов выполняем напрямую\n calculate_table_row_field(frm, tableName, rowIdx, formula.field_name, formula.formula, \"refresh\");\n }\n } catch (error) {\n }\n }\n });\n });\n } catch (error) {\n }\n }\n\n\n// Функция для расчета значения поля в строке табличной части\nasync function calculate_table_row_field(frm, tableName, rowIndex, fieldName, formula, triggerField) {\n try {\n \n if (!frm.doc[tableName] || !frm.doc[tableName][rowIndex]) {\n return;\n }\n\n const row = frm.doc[tableName][rowIndex];\n const cdt = frm.fields_dict[tableName].grid.doctype;\n const cdn = row.name;\n \n // === ЕДИНАЯ ТОЧКА ОБРАБОТКИ ВСЕХ ФУНКЦИЙ ===\n let finalFormula, reportCalls;\n \n try {\n // Используем transform_expression как единственную точку преобразования\n const transformResult = transform_expression(formula, true, tableName);\n \n if (transformResult) {\n finalFormula = transformResult.transformed;\n reportCalls = transformResult.reportCalls || [];\n } else {\n finalFormula = formula;\n reportCalls = [];\n }\n } catch (transformError) {\n console.error('Ошибка transform_expression:', transformError);\n finalFormula = formula;\n reportCalls = [];\n }\n \n // === ОБРАБОТКА АСИНХРОННЫХ ВЫЗОВОВ ОТЧЕТОВ ===\n if (reportCalls && reportCalls.length > 0) {\n try {\n // Выполняем все асинхронные запросы к отчетам параллельно\n const reportResults = await Promise.all(\n reportCalls.map(call => \n getReportFieldValue(\n frm,\n call.reportName,\n call.filters,\n call.fieldName,\n call.aggregation\n )\n )\n );\n \n // Заменяем плейсхолдеры на реальные значения\n for (let i = 0; i < reportCalls.length; i++) {\n const reportValue = reportResults[i] !== undefined ? Number(reportResults[i]) : 0;\n finalFormula = finalFormula.replace(\n reportCalls[i].placeholder, \n reportValue\n );\n }\n } catch (reportError) {\n console.error('Ошибка получения данных отчетов:', reportError);\n // В случае ошибки заменяем все плейсхолдеры на 0\n for (const call of reportCalls) {\n finalFormula = finalFormula.replace(call.placeholder, 0);\n }\n }\n }\n \n // === ВЫЧИСЛЕНИЕ ФИНАЛЬНОЙ ФОРМУЛЫ ===\n let result = 0;\n try {\n // Создаем функцию с доступом к контексту row и frm\n const evalFunc = new Function('row', 'frm', `return ${finalFormula};`);\n result = evalFunc(row, frm);\n } catch (evalError) {\n console.error('Ошибка вычисления формулы:', evalError, 'Formula:', finalFormula);\n }\n\n if (isNaN(result)) {\n result = 0;\n }\n\n // Устанавливаем вычисленное значение\n frappe.model.set_value(cdt, cdn, fieldName, result);\n\n // Обновляем таблицу\n frm.refresh_field(tableName);\n } catch (err) {\n console.error('Ошибка в calculate_table_row_field:', err);\n }\n}\n\n\n// Функция для получения индекса строки по её имени\nfunction get_row_index(frm, tableName, rowName) {\n \n // Проверяем наличие таблицы\n if (!frm.doc[tableName]) {\n return -1;\n }\n \n // Ищем индекс строки по имени\n for (let i = 0; i < frm.doc[tableName].length; i++) {\n if (frm.doc[tableName][i].name === rowName) {\n return i;\n }\n }\n return -1;\n}", - "view": "Form" - }, { "docstatus": 0, "doctype": "Client Script", "dt": "Declaration of mining tax", "enabled": 1, - "modified": "2025-08-28 16:03:01.345760", + "modified": "2025-08-29 13:34:41.106666", "module": "Taxes Az", "name": "Formula_Editor_Script_for_Declaration of mining tax", - "script": "// Generated by Formula Editor\nfrappe.ui.form.on(\"Declaration of mining tax\", {\n \"refresh\": async function(frm) {\n initialize_table_row_formulas(frm);\n calculate_721hesablanmışvergiməbləğinincəmi(frm);\n calculate_722vergiməcəlləsinin(frm);\n },\n \"ay\": async function(frm) {\n await calculate_721hesablanmışvergiməbləğinincəmi(frm); // order: 10\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 1)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 2)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları) * 2\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 3)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 4)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 5)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 6)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 7)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 8)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 9)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 10)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 11)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 12)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 13)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 14)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 15)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 16)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 17)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 18)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 19)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 20)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 21)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 22)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular) * 0.04\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 23)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 24)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular) * 10\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 25)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 26)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 27)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 28)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 29)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 30)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 31)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 32)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 33)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 34)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 35)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице topdansatış_qiyməti_ilə (порядок: 36)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Təbii qaz-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице topdansatış_qiyməti_ilə (порядок: 37)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 38)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti) * 26/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице topdansatış_qiyməti_ilə (порядок: 39)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Təbii qaz-Topdan satış qiyməti) * 20/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице topdansatış_qiyməti_ilə (порядок: 40)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti) * 3/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n await calculate_722vergiməcəlləsinin(frm); // order: 999\n },\n \"il\": async function(frm) {\n await calculate_721hesablanmışvergiməbləğinincəmi(frm); // order: 10\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 1)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 2)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları) * 2\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 3)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 4)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 5)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 6)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 7)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 8)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 9)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 10)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 11)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 12)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 13)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 14)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 15)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 16)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 17)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 18)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 19)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 20)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 21)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 22)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular) * 0.04\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 23)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 24)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular) * 10\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 25)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 26)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 27)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 28)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 29)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 30)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 31)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 32)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 33)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 34)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 35)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице topdansatış_qiyməti_ilə (порядок: 36)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Təbii qaz-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице topdansatış_qiyməti_ilə (порядок: 37)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 38)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti) * 26/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице topdansatış_qiyməti_ilə (порядок: 39)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Təbii qaz-Topdan satış qiyməti) * 20/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице topdansatış_qiyməti_ilə (порядок: 40)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti) * 3/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n await calculate_722vergiməcəlləsinin(frm); // order: 999\n },\n \"faydalı_qazıntıların_hasilatı_add\": function(frm) {\n // Обновляем индексы строк после добавления новой строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n \"faydalı_qazıntıların_hasilatı_remove\": function(frm) {\n // Обновляем индексы строк после удаления строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n \"topdansatış_qiyməti_ilə_add\": function(frm) {\n // Обновляем индексы строк после добавления новой строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n \"topdansatış_qiyməti_ilə_remove\": function(frm) {\n // Обновляем индексы строк после удаления строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n});\n\n\n // Функция для обработки и выполнения формул\n async function processFormula(frm, formula) {\n try {\n // Проверяем наличие вызовов отчетов\n if (formula.includes(\"report(\")) {\n // Извлекаем все вызовы report() из формулы\n const reportRegex = /report\\(([^)]+)\\)/g;\n let match;\n let processedFormula = formula;\n \n // Массив для хранения промисов запросов к отчетам\n const reportPromises = [];\n const reportPlaceholders = [];\n \n // Находим все вызовы report() и заменяем их на плейсхолдеры\n while ((match = reportRegex.exec(formula)) !== null) {\n const fullMatch = match[0]; // report(fieldName)\n const fieldName = match[1]; // fieldName\n \n // Создаем уникальный плейсхолдер\n const placeholder = `__REPORT_PLACEHOLDER_${reportPromises.length}__`;\n \n // Ищем данные отчета в хранилище\n const reportFields = JSON.parse(frm.doc.report_fields_storage || \"{}\");\n const reportField = Object.values(reportFields).find(f => f.name === fieldName);\n \n if (reportField) {\n // Добавляем промис запроса к отчету\n reportPromises.push(\n getReportFieldValue(\n frm,\n reportField.report, \n JSON.parse(reportField.filters_json || \"{}\"), \n reportField.field_name, \n reportField.aggregation || 'sum'\n )\n );\n \n // Запоминаем соответствие плейсхолдера и вызова\n reportPlaceholders.push({\n placeholder: placeholder,\n original: fullMatch\n });\n \n // Заменяем вызов отчета на плейсхолдер\n processedFormula = processedFormula.replace(fullMatch, placeholder);\n }\n }\n \n // Если нашли вызовы отчетов, ждем выполнения всех запросов\n if (reportPromises.length > 0) {\n const reportResults = await Promise.all(reportPromises);\n \n // Заменяем плейсхолдеры на результаты\n for (let i = 0; i < reportPlaceholders.length; i++) {\n // Убедимся, что результат - числовое значение\n const reportValue = reportResults[i] !== undefined ? Number(reportResults[i]) : 0;\n processedFormula = processedFormula.replace(\n reportPlaceholders[i].placeholder, \n reportValue\n );\n }\n \n // Теперь формула не содержит вызовов report(), обрабатываем её обычным способом\n let transformResult = transform_expression(processedFormula, false);\n \n // Если есть внешняя трансформация, применяем её\n let result;\n if (transformResult && transformResult.transformed) {\n result = eval(transformResult.transformed);\n } else {\n // Иначе просто вычисляем выражение\n result = eval(processedFormula);\n }\n \n // Возвращаем результат\n return isNaN(result) ? 0 : result;\n }\n }\n \n // Стандартная обработка для формул без отчетов\n let transformResult = transform_expression(formula, false);\n let result = eval(transformResult.transformed);\n return isNaN(result) ? 0 : result;\n } catch (e) {\n return 0;\n }\n }\n\n\n // Функция для расчета универсальных полей\n async function calculate_universal_fields(frm) {\n \n }\n \n // Функция для обработки квартала (rüb) и года (il)\n function processQuarterDateField(docValues) {\n // Проверяем, есть ли у нас значения rüb и il\n if (docValues && docValues.rüb && docValues.il) {\n // Получаем номер квартала (преобразуем из строки вида \"1 Rüb\" в число 1)\n const quarterStr = docValues.rüb;\n const quarterMatch = quarterStr.match(/(\\d+)/);\n \n if (!quarterMatch) {\n return null;\n }\n \n const quarterNum = parseInt(quarterMatch[1]);\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем начальный и конечный месяц квартала\n let startMonth, endMonth;\n \n switch(quarterNum) {\n case 1:\n startMonth = 1; // Январь\n endMonth = 3; // Март\n break;\n case 2:\n startMonth = 4; // Апрель\n endMonth = 6; // Июнь\n break;\n case 3:\n startMonth = 7; // Июль\n endMonth = 9; // Сентябрь\n break;\n case 4:\n startMonth = 10; // Октябрь\n endMonth = 12; // Декабрь\n break;\n default:\n return null;\n }\n \n // Определяем первый день квартала (1-е число начального месяца)\n const firstDay = new Date(year, startMonth - 1, 1);\n \n // Последний день квартала (последнее число конечного месяца)\n const lastDay = new Date(year, endMonth, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = `${year}-${String(startMonth).padStart(2, '0')}-01`;\n const lastDayStr = `${year}-${String(endMonth).padStart(2, '0')}-${String(lastDay.getDate()).padStart(2, '0')}`; \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Если это не специальное поле или значение не распознано, возвращаем null\n return null;\n }\n \n // Функция для обработки специальных полей с азербайджанскими месяцами\n function processAzerbayjanDateField(docValues) {\n // Словарь для сопоставления названий месяцев с их номерами\n const monthNames = {\n \"Yanvar\": 1,\n \"Fevral\": 2,\n \"Mart\": 3,\n \"Aprel\": 4,\n \"May\": 5,\n \"İyun\": 6,\n \"İyul\": 7,\n \"Avqust\": 8,\n \"Sentyabr\": 9,\n \"Oktyabr\": 10,\n \"Noyabr\": 11,\n \"Dekabr\": 12\n };\n \n // Проверяем наличие квартала (rüb) и года (il)\n if (docValues && docValues.rüb && docValues.il) {\n // Вызываем специальную функцию для обработки квартала\n return processQuarterDateField(docValues);\n }\n \n // Проверяем, есть ли у нас значения ay и il\n if (docValues && docValues.ay && monthNames[docValues.ay]) {\n // Получаем номер месяца\n const monthNum = monthNames[docValues.ay];\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем первый день месяца (1-е число)\n const firstDay = new Date(year, monthNum - 1, 1);\n \n // Последний день месяца (получаем последнее число месяца)\n const lastDay = new Date(year, monthNum, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = `${year}-${String(monthNum).padStart(2, '0')}-01`;\n const lastDayStr = `${year}-${String(monthNum).padStart(2, '0')}-${String(lastDay.getDate()).padStart(2, '0')}`; \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Если это не специальное поле или значение не распознано, возвращаем null\n return null;\n }\n \n\n\n// Функция для обработки азербайджанских дат\nfunction processAzerbayjanDateField(docValues) {\n // Словарь для сопоставления названий месяцев с их номерами\n const monthNames = {\n \"Yanvar\": 1,\n \"Fevral\": 2,\n \"Mart\": 3,\n \"Aprel\": 4,\n \"May\": 5,\n \"İyun\": 6,\n \"İyul\": 7,\n \"Avqust\": 8,\n \"Sentyabr\": 9,\n \"Oktyabr\": 10,\n \"Noyabr\": 11,\n \"Dekabr\": 12\n };\n \n // Проверяем наличие квартала (rüb) и года (il)\n if (docValues && docValues.rüb && docValues.il) {\n // Получаем номер квартала (преобразуем из строки вида \"1 Rüb\" в число 1)\n const quarterStr = docValues.rüb;\n const quarterMatch = quarterStr.match(/(\\d+)/);\n \n if (!quarterMatch) {\n return null;\n }\n \n const quarterNum = parseInt(quarterMatch[1]);\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем начальный и конечный месяц квартала\n let startMonth, endMonth;\n \n switch(quarterNum) {\n case 1:\n startMonth = 1; // Январь\n endMonth = 3; // Март\n break;\n case 2:\n startMonth = 4; // Апрель\n endMonth = 6; // Июнь\n break;\n case 3:\n startMonth = 7; // Июль\n endMonth = 9; // Сентябрь\n break;\n case 4:\n startMonth = 10; // Октябрь\n endMonth = 12; // Декабрь\n break;\n default:\n return null;\n }\n \n // Определяем первый день квартала (1-е число начального месяца)\n const firstDay = new Date(year, startMonth - 1, 1);\n \n // Последний день квартала (последнее число конечного месяца)\n const lastDay = new Date(year, endMonth, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = year + \"-\" + String(startMonth).padStart(2, '0') + \"-01\";\n const lastDayStr = year + \"-\" + String(endMonth).padStart(2, '0') + \"-\" + String(lastDay.getDate()).padStart(2, '0'); \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Проверяем, есть ли у нас значения ay и il\n if (docValues && docValues.ay && monthNames[docValues.ay]) {\n // Получаем номер месяца\n const monthNum = monthNames[docValues.ay];\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем первый день месяца (1-е число)\n const firstDay = new Date(year, monthNum - 1, 1);\n \n // Последний день месяца (получаем последнее число месяца)\n const lastDay = new Date(year, monthNum, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = year + \"-\" + String(monthNum).padStart(2, '0') + \"-01\";\n const lastDayStr = year + \"-\" + String(monthNum).padStart(2, '0') + \"-\" + String(lastDay.getDate()).padStart(2, '0'); \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Если это не специальное поле или значение не распознано, возвращаем null\n return null;\n}\n\nasync function getReportFieldValue(frm, reportName, filters, fieldName, aggregation) {\n try {\n // Обрабатываем фильтры с возможными ссылками на поля документа\n const processedFilters = {};\n \n for (const key in filters) {\n let value = filters[key];\n \n // Проверяем, является ли значение ссылкой на поле документа\n if (typeof value === 'string' && value.startsWith('doc.')) {\n const docField = value.substring(4);\n if (frm.doc[docField] !== undefined) {\n processedFilters[key] = frm.doc[docField];\n continue;\n }\n }\n \n // Обработка специальных переменных\n if (typeof value === 'string' && value.startsWith('$')) {\n switch (value) {\n case '$DefaultCompany':\n // Получаем компанию по умолчанию из настроек или документа\n processedFilters[key] = frm.doc.company || frappe.defaults.get_user_default(\"Company\");\n continue;\n \n case '$AyIlSpecial':\n // Обрабатываем специальные даты для азербайджанских месяцев/кварталов\n const dateRange = processAzerbayjanDateField(frm.doc);\n if (dateRange) {\n // Для полей from_date и to_date используем соответствующие значения\n if (key === 'from_date') {\n processedFilters[key] = dateRange.start;\n } else if (key === 'to_date') {\n processedFilters[key] = dateRange.end;\n } else {\n // Для других полей используем начальную дату\n processedFilters[key] = dateRange.start;\n }\n } else {\n // Если не удалось получить диапазон дат, используем текущую дату\n processedFilters[key] = frappe.datetime.get_today();\n }\n continue;\n \n default:\n // Для других $-переменных оставляем как есть\n processedFilters[key] = value;\n continue;\n }\n }\n \n // Обычные значения\n processedFilters[key] = value;\n }\n \n // Проверяем кеш\n if (!window.reportCache) window.reportCache = {};\n \n const cacheKey = reportName + \"|\" + JSON.stringify(processedFilters) + \"|\" + fieldName + \"|\" + aggregation;\n const now = new Date().getTime();\n \n if (window.reportCache[cacheKey] && \n window.reportCache[cacheKey].timestamp > now - 5 * 60 * 1000) {\n return window.reportCache[cacheKey].value;\n }\n \n // Выполняем запрос к серверу\n try {\n const result = await frappe.call({\n method: \"formula_editor.api.run_report_for_formula\",\n args: {\n report_name: reportName,\n filters: processedFilters,\n field_name: fieldName\n },\n freeze: false\n });\n \n if (result && result.message !== undefined) {\n if (result.message.error) {\n console.error('Report error:', result.message.error);\n return 0;\n } \n \n let value = parseFloat(result.message);\n if (isNaN(value)) value = 0;\n \n // Округляем до 2 знаков после запятой\n value = Math.round(value * 100) / 100;\n \n // Сохраняем в кеш\n window.reportCache[cacheKey] = {\n value: value,\n timestamp: now\n };\n \n return value;\n }\n } catch (err) {\n console.error('Report field error:', err);\n }\n \n return 0;\n } catch (error) {\n console.error('getReportFieldValue error:', error);\n return 0;\n }\n}\n\n\n function transform_expression(expression, for_child_table = false, table_name = null) {\n let transformed = expression;\n let needsAsync = false;\n let reportCalls = [];\n\n // === Обработка report(...) ===\n const reportRegex = /report\\(([^)]+)\\)/g;\n let match;\n \n // Находим все вызовы report() в выражении\n while ((match = reportRegex.exec(expression)) !== null) {\n const reportName = match[1]; // Имя поля отчета\n const fullMatch = match[0]; // Полный текст match - \"report(xyz)\"\n needsAsync = true;\n \n // Создаем уникальный плейсхолдер\n const placeholder = `__REPORT_PLACEHOLDER_${reportCalls.length}__`;\n \n // Ищем соответствующее поле отчета по имени\n \n if (reportName === \"Xam neft\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Xam_neft___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Təbii qaz\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Tebii_qaz___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Filiz faydalı qazıntıları: bütün növ metallar\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Filiz_faydali_qazintilari__butun_nov_metallar___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Mişar daşları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Misar_daslari___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Üzlük daşları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Üzluk_daslari___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Seolit\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Seolit___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Barit\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Barit___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Yüngül doldurucuların istehsalı üçün gillər\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Yungul_doldurucular_ucun_giller___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Vulkan külü və pemza\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Vulkan_kulu_ve_pemza___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Kvars qumları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Kvars_qumlari___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Sement xammalı\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Sement_xammali___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Duz\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Duz___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Qiymətli və yarımqiymətli bəzək daşları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Qiymetli_ve_yarimqiymetli_bezek_daslari___karat___qram\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Yodlu bromlu sular\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Yodlu_bromlu_sular___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Mineral sular\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Mineral_sular___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Bentonit gillər\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Bentonit_giller___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Kərpic-kirəmit gilləri\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Kerpic_kiremit_gilleri___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Tikinti qumları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Tikinti_qumlari___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Çınqıl xammalı\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Çinqil_xammali___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Gips, gəc\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Gips,_gec___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Xam neft-Topdan satış qiyməti\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Xam_neft___ton_sales\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Təbii qaz-Topdan satış qiyməti\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Tebii_qaz___m3_sales\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Filiz_faydali_qazintilari__butun_nov_metallar___ton_sales\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n }\n\n // === Обработка table(...) ===\n const tableRegex = /table\\(([^,)]+),\\s*([^,)]+),\\s*([^)]+)\\)/g;\n let tableMatch;\n while ((tableMatch = tableRegex.exec(expression)) !== null) {\n const fullMatch = tableMatch[0];\n const tableName = tableMatch[1].trim().replace(/['\"]/g, '');\n const rowNumber = tableMatch[2].trim();\n const fieldName = tableMatch[3].trim().replace(/['\"]/g, '');\n \n const replacement = `(function() { \n try {\n if (!frm.doc[\"${tableName}\"] || !frm.doc[\"${tableName}\"][${rowNumber} - 1]) {\n return 0;\n }\n const value = frm.doc[\"${tableName}\"][${rowNumber} - 1][\"${fieldName}\"];\n return parseFloat(value) || 0;\n } catch (e) {\n return 0;\n }\n })()`;\n \n transformed = transformed.replace(fullMatch, replacement);\n }\n\n // === Обработка universal полей ===\n \n\n // === Обработка val() и row() ===\n const tablePrefixes = [\"items\", \"taxes\", \"packed_items\", \"payments\", \"advances\", \"timesheets\", \"payment_schedule\", \"sales_team\"];\n\n for (const prefix of tablePrefixes) {\n const sumPattern = new RegExp(`sum\\\\(${prefix}_([^)]+)\\\\)`, 'g');\n transformed = transformed.replace(sumPattern, (m, f) => \n `(frm.doc[\"${prefix}\"] && frm.doc[\"${prefix}\"].reduce((s, r) => s + (parseFloat(r[\"${f}\"]) || 0), 0) || 0)`\n );\n\n const valPattern = new RegExp(`val\\\\(${prefix}_([^)]+)\\\\)`, 'g');\n transformed = transformed.replace(valPattern, (m, f) => \n `(frm.doc[\"${prefix}\"] && frm.doc[\"${prefix}\"].reduce((s, r) => s + (parseFloat(r[\"${f}\"]) || 0), 0) || 0)`\n );\n }\n\n if (for_child_table) {\n transformed = transformed.replace(/row\\(([^)]+)\\)/g, (m, f) => \n `(parseFloat(row[\"${f}\"]) || 0)`\n );\n\n transformed = transformed.replace(/val\\(([^)]+)\\)/g, (m, f) => {\n if (f.startsWith(table_name + '_')) {\n return `(parseFloat(row[\"${f.slice(table_name.length + 1)}\"]) || 0)`;\n }\n return `(parseFloat(frm.doc[\"${f}\"]) || 0)`;\n });\n } else {\n transformed = transformed.replace(/val\\(([^)]+)\\)/g, (m, f) => \n `(parseFloat(frm.doc[\"${f}\"]) || 0)`\n );\n\n transformed = transformed.replace(/row\\(([^)]+)\\)/g, () => \n `0 /* ERROR: row() вне табличной части */`\n );\n }\n\n return { transformed, needsAsync, reportCalls };\n }\n\n\n// Функция для получения индекса строки по её имени (name/cdn)\nfunction get_row_index(frm, tableName, rowName) {\n \n // Проверяем наличие таблицы\n if (!frm.doc[tableName]) {\n return -1;\n }\n \n // Выводим все строки для отладки\n frm.doc[tableName].forEach((row, idx) => {\n });\n \n // Ищем индекс строки по имени\n for (let i = 0; i < frm.doc[tableName].length; i++) {\n if (frm.doc[tableName][i].name === rowName) {\n return i;\n }\n }\n return -1;\n}\n\n// Функция для доступа к полям конкретных строк таблицы\nfunction table_row(tableName, rowIndex, fieldName) {\n // Проверяем наличие необходимых аргументов\n if (!tableName || rowIndex === undefined || !fieldName) {\n return 0;\n }\n \n // Преобразуем rowIndex в число (на случай, если передана строка)\n const rowIdx = parseInt(rowIndex) - 1; // Индексация с 1 для пользователя, но с 0 в массиве\n \n try {\n // Проверяем наличие таблицы и строки\n if (!frm.doc[tableName] || !frm.doc[tableName][rowIdx]) {\n return 0;\n }\n \n // Получаем значение поля\n const value = frm.doc[tableName][rowIdx][fieldName];\n \n // Проверяем на NaN и возвращаем значение или 0\n const numValue = parseFloat(value);\n if (isNaN(numValue)) {\n return 0;\n }\n return numValue;\n } catch (error) {\n return 0;\n }\n}\n\n// Функция для обновления значения поля конкретной строки таблицы\nfunction set_table_row(frm, tableName, rowIndex, fieldName, value) {\n // Проверяем наличие необходимых аргументов\n if (!frm || !tableName || rowIndex === undefined || !fieldName) {\n return false;\n }\n \n // Преобразуем rowIndex в число (на случай, если передана строка)\n const rowIdx = parseInt(rowIndex) - 1; // Индексация с 1 для пользователя, но с 0 в массиве\n \n try {\n // Проверяем наличие таблицы и строки\n if (!frm.doc[tableName] || !frm.doc[tableName][rowIdx]) {\n return false;\n }\n \n // Получаем строку таблицы\n const row = frm.doc[tableName][rowIdx];\n \n // Получаем сетевое имя cdt и cdn для Frappe\n const cdt = frm.fields_dict[tableName].grid.doctype;\n const cdn = row.name;\n \n // Проверяем, является ли значение NaN, и если да, заменяем его на 0\n let finalValue = value;\n if (typeof value === 'number' && isNaN(value)) {\n finalValue = 0;\n }\n \n // Обновляем значение поля\n frappe.model.set_value(cdt, cdn, fieldName, finalValue);\n \n return true;\n } catch (error) {\n return false;\n }\n}\n\n// Функция для поиска строки таблицы по значению поля\nfunction find_table_row(frm, tableName, fieldName, value) {\n // Проверяем наличие необходимых аргументов\n if (!frm || !tableName || !fieldName) {\n return -1;\n }\n \n try {\n // Проверяем наличие таблицы\n if (!frm.doc[tableName]) {\n return -1;\n }\n \n // Ищем строку с указанным значением поля\n for (let i = 0; i < frm.doc[tableName].length; i++) {\n if (frm.doc[tableName][i][fieldName] == value) {\n // Возвращаем индекс строки (начиная с 1 для пользователя)\n return i + 1;\n }\n }\n \n // Если строка не найдена\n return -1;\n } catch (error) {\n return -1;\n }\n}\n\n\n async function calculate_721hesablanmışvergiməbləğinincəmi(frm) {\n try {\n \n const { transformed, needsAsync, reportCalls } = transform_expression(\"report(Mişar daşları) + report(Üzlük daşları) + report(Seolit) + report(Barit) + report(Yüngül doldurucuların istehsalı üçün gillər) + report(Vulkan külü və pemza) + report(Kvars qumları) + report(Sement xammalı) + report(Duz) + report(Qiymətli və yarımqiymətli bəzək daşları) + report(Yodlu bromlu sular) + report(Mineral sular) + report(Bentonit gillər) + report(Kərpic-kirəmit gilləri) + report(Tikinti qumları) + report(Çınqıl xammalı) + report(Gips, gəc) + report(Xam neft-Topdan satış qiyməti) + report(Təbii qaz-Topdan satış qiyməti) + report(Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti)\", false);\n \n // Обработка вызовов отчетов, если они есть\n let finalExpression = transformed;\n if (reportCalls && reportCalls.length > 0) {\n // Собираем все результаты отчетов\n const reportResults = [];\n for (const call of reportCalls) {\n const result = await getReportFieldValue(\n frm,\n call.reportName,\n call.filters,\n call.fieldName,\n call.aggregation\n );\n reportResults.push({ placeholder: call.placeholder, value: result });\n }\n \n // Заменяем плейсхолдеры на полученные значения\n for (const result of reportResults) {\n finalExpression = finalExpression.replace(result.placeholder, result.value);\n }\n }\n \n // Теперь можно безопасно вычислить выражение\n const result = eval(finalExpression);\n frm.set_value(\"721hesablanmışvergiməbləğinincəmi\", isNaN(result) ? 0 : result);\n } catch (e) {\n }\n }\n\n\n async function calculate_722vergiməcəlləsinin(frm) {\n try {\n \n const { transformed, needsAsync, reportCalls } = transform_expression(\"table('faydalı_qazıntıların_hasilatı', 1, 'vergininməbləğimanatla')\", false);\n \n // Обработка вызовов отчетов, если они есть\n let finalExpression = transformed;\n if (reportCalls && reportCalls.length > 0) {\n // Собираем все результаты отчетов\n const reportResults = [];\n for (const call of reportCalls) {\n const result = await getReportFieldValue(\n frm,\n call.reportName,\n call.filters,\n call.fieldName,\n call.aggregation\n );\n reportResults.push({ placeholder: call.placeholder, value: result });\n }\n \n // Заменяем плейсхолдеры на полученные значения\n for (const result of reportResults) {\n finalExpression = finalExpression.replace(result.placeholder, result.value);\n }\n }\n \n // Теперь можно безопасно вычислить выражение\n const result = eval(finalExpression);\n frm.set_value(\"722vergiməcəlləsinin\", isNaN(result) ? 0 : result);\n } catch (e) {\n }\n }\n\n\n // Функция для инициализации формул строк табличных частей\n function initialize_table_row_formulas(frm) {\n try {\n // Получаем информацию о формулах для строк табличных частей\n const formulas = JSON.parse(frm.doc.table_row_formulas_storage || \"{}\");\n \n // ВАЖНО: Преобразуем объект в массив и сортируем его по порядку выполнения\n const sortedFormulas = Object.entries(formulas).map(([id, formula]) => {\n return { id, ...formula };\n }).sort((a, b) => {\n // Сортировка по значению поля order (если порядок не задан, используем 10 по умолчанию)\n const orderA = a.order !== undefined ? parseInt(a.order) : 10;\n const orderB = b.order !== undefined ? parseInt(b.order) : 10;\n return orderA - orderB;\n });\n \n // Группируем формулы по табличным частям и строкам\n const formulasByTableAndRow = {};\n \n sortedFormulas.forEach(formula => {\n const tableName = formula.table_name;\n const rowIndex = parseInt(formula.row_index);\n \n if (!formulasByTableAndRow[tableName]) {\n formulasByTableAndRow[tableName] = {};\n }\n \n if (!formulasByTableAndRow[tableName][rowIndex]) {\n formulasByTableAndRow[tableName][rowIndex] = [];\n }\n \n formulasByTableAndRow[tableName][rowIndex].push(formula);\n });\n \n // Устанавливаем обработчики для каждой табличной части\n Object.keys(formulasByTableAndRow).forEach(tableName => {\n if (!frm.doc[tableName]) {\n return;\n }\n \n // Для каждой строки таблицы\n frm.doc[tableName].forEach((row, rowIdx) => {\n // Получаем отсортированные формулы для текущей строки (строки нумеруются с 1, а индексы с 0)\n const rowFormulas = formulasByTableAndRow[tableName][rowIdx + 1] || [];\n \n // Выполняем формулы в порядке сортировки (по полю order)\n for (const formula of rowFormulas) {\n try {\n // Определяем необходимость асинхронного вызова\n const usesUniversal = formula.formula && formula.formula.includes(\"univ(\");\n const usesReports = formula.formula && formula.formula.includes(\"report(\");\n \n // Вызываем расчет формулы согласно установленному порядку\n if (usesUniversal || usesReports) {\n // Для асинхронных вызовов используем await в асинхронной IIFE\n (async () => {\n try {\n await calculate_table_row_field(frm, tableName, rowIdx, formula.field_name, formula.formula, \"refresh\");\n } catch (asyncError) {\n }\n })();\n } else {\n // Для синхронных вызовов выполняем напрямую\n calculate_table_row_field(frm, tableName, rowIdx, formula.field_name, formula.formula, \"refresh\");\n }\n } catch (error) {\n }\n }\n });\n });\n } catch (error) {\n }\n }\n\n\n// Функция для расчета значения поля в строке табличной части\nasync function calculate_table_row_field(frm, tableName, rowIndex, fieldName, formula, triggerField) {\n try {\n \n if (!frm.doc[tableName] || !frm.doc[tableName][rowIndex]) {\n return;\n }\n\n const row = frm.doc[tableName][rowIndex];\n const cdt = frm.fields_dict[tableName].grid.doctype;\n const cdn = row.name;\n \n // === ЕДИНАЯ ТОЧКА ОБРАБОТКИ ВСЕХ ФУНКЦИЙ ===\n let finalFormula, reportCalls;\n \n try {\n // Используем transform_expression как единственную точку преобразования\n const transformResult = transform_expression(formula, true, tableName);\n \n if (transformResult) {\n finalFormula = transformResult.transformed;\n reportCalls = transformResult.reportCalls || [];\n } else {\n finalFormula = formula;\n reportCalls = [];\n }\n } catch (transformError) {\n console.error('Ошибка transform_expression:', transformError);\n finalFormula = formula;\n reportCalls = [];\n }\n \n // === ОБРАБОТКА АСИНХРОННЫХ ВЫЗОВОВ ОТЧЕТОВ ===\n if (reportCalls && reportCalls.length > 0) {\n try {\n // Выполняем все асинхронные запросы к отчетам параллельно\n const reportResults = await Promise.all(\n reportCalls.map(call => \n getReportFieldValue(\n frm,\n call.reportName,\n call.filters,\n call.fieldName,\n call.aggregation\n )\n )\n );\n \n // Заменяем плейсхолдеры на реальные значения\n for (let i = 0; i < reportCalls.length; i++) {\n const reportValue = reportResults[i] !== undefined ? Number(reportResults[i]) : 0;\n finalFormula = finalFormula.replace(\n reportCalls[i].placeholder, \n reportValue\n );\n }\n } catch (reportError) {\n console.error('Ошибка получения данных отчетов:', reportError);\n // В случае ошибки заменяем все плейсхолдеры на 0\n for (const call of reportCalls) {\n finalFormula = finalFormula.replace(call.placeholder, 0);\n }\n }\n }\n \n // === ВЫЧИСЛЕНИЕ ФИНАЛЬНОЙ ФОРМУЛЫ ===\n let result = 0;\n try {\n // Создаем функцию с доступом к контексту row и frm\n const evalFunc = new Function('row', 'frm', `return ${finalFormula};`);\n result = evalFunc(row, frm);\n } catch (evalError) {\n console.error('Ошибка вычисления формулы:', evalError, 'Formula:', finalFormula);\n }\n\n if (isNaN(result)) {\n result = 0;\n }\n\n // Устанавливаем вычисленное значение\n frappe.model.set_value(cdt, cdn, fieldName, result);\n\n // Обновляем таблицу\n frm.refresh_field(tableName);\n } catch (err) {\n console.error('Ошибка в calculate_table_row_field:', err);\n }\n}\n\n\n// Функция для получения индекса строки по её имени\nfunction get_row_index(frm, tableName, rowName) {\n \n // Проверяем наличие таблицы\n if (!frm.doc[tableName]) {\n return -1;\n }\n \n // Ищем индекс строки по имени\n for (let i = 0; i < frm.doc[tableName].length; i++) {\n if (frm.doc[tableName][i].name === rowName) {\n return i;\n }\n }\n return -1;\n}", + "script": "// Generated by Formula Editor\nfrappe.ui.form.on(\"Declaration of mining tax\", {\n \"refresh\": async function(frm) {\n initialize_table_row_formulas(frm);\n calculate_721hesablanmışvergiməbləğinincəmi(frm);\n calculate_723büdcəyəödənilməlivergininməbləğ(frm);\n },\n \"ay\": async function(frm) {\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 1)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 2)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları) * 2\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 3)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 4)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 5)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 6)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 7)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 8)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 9)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 10)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 11)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 12)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 13)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 14)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 15)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 16)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 17)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 18)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 19)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 20)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 21)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 22)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular) * 0.04\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 23)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 24)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular) * 10\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 25)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 26)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 27)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 28)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 29)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 30)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 31)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 32)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 33)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 34)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 35)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице topdansatış_qiyməti_ilə (порядок: 36)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Təbii qaz-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице topdansatış_qiyməti_ilə (порядок: 37)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 38)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti) * 26/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице topdansatış_qiyməti_ilə (порядок: 39)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Təbii qaz-Topdan satış qiyməti) * 20/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице topdansatış_qiyməti_ilə (порядок: 40)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti) * 3/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"ay\");\n } catch (error) {\n }\n }\n await calculate_721hesablanmışvergiməbləğinincəmi(frm); // order: 99\n await calculate_723büdcəyəödənilməlivergininməbləğ(frm); // order: 100\n },\n \"il\": async function(frm) {\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 1)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице faydalı_qazıntıların_hasilatı (порядок: 2)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Mişar daşları) * 2\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 3)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице faydalı_qazıntıların_hasilatı (порядок: 4)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Üzlük daşları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 5)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице faydalı_qazıntıların_hasilatı (порядок: 6)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Seolit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 7)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 4 в таблице faydalı_qazıntıların_hasilatı (порядок: 8)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 4) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 3;\n const formula = \"report(Barit) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 9)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 5 в таблице faydalı_qazıntıların_hasilatı (порядок: 10)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 5) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 4;\n const formula = \"report(Yüngül doldurucuların istehsalı üçün gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 11)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 6 в таблице faydalı_qazıntıların_hasilatı (порядок: 12)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 6) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 5;\n const formula = \"report(Vulkan külü və pemza) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 13)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 7 в таблице faydalı_qazıntıların_hasilatı (порядок: 14)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 7) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 6;\n const formula = \"report(Kvars qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 15)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 8 в таблице faydalı_qazıntıların_hasilatı (порядок: 16)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 8) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 7;\n const formula = \"report(Sement xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 17)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 9 в таблице faydalı_qazıntıların_hasilatı (порядок: 18)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 9) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 8;\n const formula = \"report(Duz) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 19)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 10 в таблице faydalı_qazıntıların_hasilatı (порядок: 20)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 10) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 9;\n const formula = \"report(Qiymətli və yarımqiymətli bəzək daşları) * 6\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 21)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 11 в таблице faydalı_qazıntıların_hasilatı (порядок: 22)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 11) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 10;\n const formula = \"report(Yodlu bromlu sular) * 0.04\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 23)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 12 в таблице faydalı_qazıntıların_hasilatı (порядок: 24)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 12) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 11;\n const formula = \"report(Mineral sular) * 10\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 25)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 13 в таблице faydalı_qazıntıların_hasilatı (порядок: 26)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 13) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 12;\n const formula = \"report(Bentonit gillər) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 27)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 14 в таблице faydalı_qazıntıların_hasilatı (порядок: 28)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 14) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 13;\n const formula = \"report(Kərpic-kirəmit gilləri) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 29)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 15 в таблице faydalı_qazıntıların_hasilatı (порядок: 30)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 15) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 14;\n const formula = \"report(Tikinti qumları) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 31)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 16 в таблице faydalı_qazıntıların_hasilatı (порядок: 32)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 16) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 15;\n const formula = \"report(Çınqıl xammalı) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 33)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc)\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"faydalıqazıntılarınhasilatınhəcmi\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 17 в таблице faydalı_qazıntıların_hasilatı (порядок: 34)\n if (frm.doc.faydalı_qazıntıların_hasilatı && frm.doc.faydalı_qazıntıların_hasilatı.length >= 17) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 16;\n const formula = \"report(Gips, gəc) * 1\";\n \n await calculate_table_row_field(frm, \"faydalı_qazıntıların_hasilatı\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 35)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице topdansatış_qiyməti_ilə (порядок: 36)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Təbii qaz-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице topdansatış_qiyməti_ilə (порядок: 37)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti)\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"topdansatışqiymətimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 1 в таблице topdansatış_qiyməti_ilə (порядок: 38)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 1) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 0;\n const formula = \"report(Xam neft-Topdan satış qiyməti) * 26/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 2 в таблице topdansatış_qiyməti_ilə (порядок: 39)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 2) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 1;\n const formula = \"report(Təbii qaz-Topdan satış qiyməti) * 20/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n \n // Формула строки 3 в таблице topdansatış_qiyməti_ilə (порядок: 40)\n if (frm.doc.topdansatış_qiyməti_ilə && frm.doc.topdansatış_qiyməti_ilə.length >= 3) {\n try {\n // Индекс строки на 1 меньше номера строки\n const rowIndex = 2;\n const formula = \"report(Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti) * 3/ 100\";\n \n await calculate_table_row_field(frm, \"topdansatış_qiyməti_ilə\", rowIndex, \"vergininməbləğimanatla\", formula, \"il\");\n } catch (error) {\n }\n }\n await calculate_721hesablanmışvergiməbləğinincəmi(frm); // order: 99\n await calculate_723büdcəyəödənilməlivergininməbləğ(frm); // order: 100\n },\n \"faydalı_qazıntıların_hasilatı_add\": function(frm) {\n // Обновляем индексы строк после добавления новой строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n \"faydalı_qazıntıların_hasilatı_remove\": function(frm) {\n // Обновляем индексы строк после удаления строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n \"topdansatış_qiyməti_ilə_add\": function(frm) {\n // Обновляем индексы строк после добавления новой строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n \"topdansatış_qiyməti_ilə_remove\": function(frm) {\n // Обновляем индексы строк после удаления строки\n setTimeout(() => initialize_table_row_formulas(frm), 100);\n },\n});\n\n\n // Функция для обработки и выполнения формул\n async function processFormula(frm, formula) {\n try {\n // Проверяем наличие вызовов отчетов\n if (formula.includes(\"report(\")) {\n // Извлекаем все вызовы report() из формулы\n const reportRegex = /report\\(([^)]+)\\)/g;\n let match;\n let processedFormula = formula;\n \n // Массив для хранения промисов запросов к отчетам\n const reportPromises = [];\n const reportPlaceholders = [];\n \n // Находим все вызовы report() и заменяем их на плейсхолдеры\n while ((match = reportRegex.exec(formula)) !== null) {\n const fullMatch = match[0]; // report(fieldName)\n const fieldName = match[1]; // fieldName\n \n // Создаем уникальный плейсхолдер\n const placeholder = `__REPORT_PLACEHOLDER_${reportPromises.length}__`;\n \n // Ищем данные отчета в хранилище\n const reportFields = JSON.parse(frm.doc.report_fields_storage || \"{}\");\n const reportField = Object.values(reportFields).find(f => f.name === fieldName);\n \n if (reportField) {\n // Добавляем промис запроса к отчету\n reportPromises.push(\n getReportFieldValue(\n frm,\n reportField.report, \n JSON.parse(reportField.filters_json || \"{}\"), \n reportField.field_name, \n reportField.aggregation || 'sum'\n )\n );\n \n // Запоминаем соответствие плейсхолдера и вызова\n reportPlaceholders.push({\n placeholder: placeholder,\n original: fullMatch\n });\n \n // Заменяем вызов отчета на плейсхолдер\n processedFormula = processedFormula.replace(fullMatch, placeholder);\n }\n }\n \n // Если нашли вызовы отчетов, ждем выполнения всех запросов\n if (reportPromises.length > 0) {\n const reportResults = await Promise.all(reportPromises);\n \n // Заменяем плейсхолдеры на результаты\n for (let i = 0; i < reportPlaceholders.length; i++) {\n // Убедимся, что результат - числовое значение\n const reportValue = reportResults[i] !== undefined ? Number(reportResults[i]) : 0;\n processedFormula = processedFormula.replace(\n reportPlaceholders[i].placeholder, \n reportValue\n );\n }\n \n // Теперь формула не содержит вызовов report(), обрабатываем её обычным способом\n let transformResult = transform_expression(processedFormula, false);\n \n // Если есть внешняя трансформация, применяем её\n let result;\n if (transformResult && transformResult.transformed) {\n result = eval(transformResult.transformed);\n } else {\n // Иначе просто вычисляем выражение\n result = eval(processedFormula);\n }\n \n // Возвращаем результат\n return isNaN(result) ? 0 : result;\n }\n }\n \n // Стандартная обработка для формул без отчетов\n let transformResult = transform_expression(formula, false);\n let result = eval(transformResult.transformed);\n return isNaN(result) ? 0 : result;\n } catch (e) {\n return 0;\n }\n }\n\n\n // Функция для расчета универсальных полей\n async function calculate_universal_fields(frm) {\n \n }\n \n // Функция для обработки квартала (rüb) и года (il)\n function processQuarterDateField(docValues) {\n // Проверяем, есть ли у нас значения rüb и il\n if (docValues && docValues.rüb && docValues.il) {\n // Получаем номер квартала (преобразуем из строки вида \"1 Rüb\" в число 1)\n const quarterStr = docValues.rüb;\n const quarterMatch = quarterStr.match(/(\\d+)/);\n \n if (!quarterMatch) {\n return null;\n }\n \n const quarterNum = parseInt(quarterMatch[1]);\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем начальный и конечный месяц квартала\n let startMonth, endMonth;\n \n switch(quarterNum) {\n case 1:\n startMonth = 1; // Январь\n endMonth = 3; // Март\n break;\n case 2:\n startMonth = 4; // Апрель\n endMonth = 6; // Июнь\n break;\n case 3:\n startMonth = 7; // Июль\n endMonth = 9; // Сентябрь\n break;\n case 4:\n startMonth = 10; // Октябрь\n endMonth = 12; // Декабрь\n break;\n default:\n return null;\n }\n \n // Определяем первый день квартала (1-е число начального месяца)\n const firstDay = new Date(year, startMonth - 1, 1);\n \n // Последний день квартала (последнее число конечного месяца)\n const lastDay = new Date(year, endMonth, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = `${year}-${String(startMonth).padStart(2, '0')}-01`;\n const lastDayStr = `${year}-${String(endMonth).padStart(2, '0')}-${String(lastDay.getDate()).padStart(2, '0')}`; \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Если это не специальное поле или значение не распознано, возвращаем null\n return null;\n }\n \n // Функция для обработки специальных полей с азербайджанскими месяцами\n function processAzerbayjanDateField(docValues) {\n // Словарь для сопоставления названий месяцев с их номерами\n const monthNames = {\n \"Yanvar\": 1,\n \"Fevral\": 2,\n \"Mart\": 3,\n \"Aprel\": 4,\n \"May\": 5,\n \"İyun\": 6,\n \"İyul\": 7,\n \"Avqust\": 8,\n \"Sentyabr\": 9,\n \"Oktyabr\": 10,\n \"Noyabr\": 11,\n \"Dekabr\": 12\n };\n \n // Проверяем наличие квартала (rüb) и года (il)\n if (docValues && docValues.rüb && docValues.il) {\n // Вызываем специальную функцию для обработки квартала\n return processQuarterDateField(docValues);\n }\n \n // Проверяем, есть ли у нас значения ay и il\n if (docValues && docValues.ay && monthNames[docValues.ay]) {\n // Получаем номер месяца\n const monthNum = monthNames[docValues.ay];\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем первый день месяца (1-е число)\n const firstDay = new Date(year, monthNum - 1, 1);\n \n // Последний день месяца (получаем последнее число месяца)\n const lastDay = new Date(year, monthNum, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = `${year}-${String(monthNum).padStart(2, '0')}-01`;\n const lastDayStr = `${year}-${String(monthNum).padStart(2, '0')}-${String(lastDay.getDate()).padStart(2, '0')}`; \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Если это не специальное поле или значение не распознано, возвращаем null\n return null;\n }\n \n\n\n// Функция для обработки азербайджанских дат\nfunction processAzerbayjanDateField(docValues) {\n // Словарь для сопоставления названий месяцев с их номерами\n const monthNames = {\n \"Yanvar\": 1,\n \"Fevral\": 2,\n \"Mart\": 3,\n \"Aprel\": 4,\n \"May\": 5,\n \"İyun\": 6,\n \"İyul\": 7,\n \"Avqust\": 8,\n \"Sentyabr\": 9,\n \"Oktyabr\": 10,\n \"Noyabr\": 11,\n \"Dekabr\": 12\n };\n \n // Проверяем наличие квартала (rüb) и года (il)\n if (docValues && docValues.rüb && docValues.il) {\n // Получаем номер квартала (преобразуем из строки вида \"1 Rüb\" в число 1)\n const quarterStr = docValues.rüb;\n const quarterMatch = quarterStr.match(/(\\d+)/);\n \n if (!quarterMatch) {\n return null;\n }\n \n const quarterNum = parseInt(quarterMatch[1]);\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем начальный и конечный месяц квартала\n let startMonth, endMonth;\n \n switch(quarterNum) {\n case 1:\n startMonth = 1; // Январь\n endMonth = 3; // Март\n break;\n case 2:\n startMonth = 4; // Апрель\n endMonth = 6; // Июнь\n break;\n case 3:\n startMonth = 7; // Июль\n endMonth = 9; // Сентябрь\n break;\n case 4:\n startMonth = 10; // Октябрь\n endMonth = 12; // Декабрь\n break;\n default:\n return null;\n }\n \n // Определяем первый день квартала (1-е число начального месяца)\n const firstDay = new Date(year, startMonth - 1, 1);\n \n // Последний день квартала (последнее число конечного месяца)\n const lastDay = new Date(year, endMonth, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = year + \"-\" + String(startMonth).padStart(2, '0') + \"-01\";\n const lastDayStr = year + \"-\" + String(endMonth).padStart(2, '0') + \"-\" + String(lastDay.getDate()).padStart(2, '0'); \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Проверяем, есть ли у нас значения ay и il\n if (docValues && docValues.ay && monthNames[docValues.ay]) {\n // Получаем номер месяца\n const monthNum = monthNames[docValues.ay];\n \n // Получаем год из поля il или используем текущий год\n let year = docValues.il || new Date().getFullYear();\n \n // Определяем первый день месяца (1-е число)\n const firstDay = new Date(year, monthNum - 1, 1);\n \n // Последний день месяца (получаем последнее число месяца)\n const lastDay = new Date(year, monthNum, 0);\n \n // Форматируем даты в формате YYYY-MM-DD\n const firstDayStr = year + \"-\" + String(monthNum).padStart(2, '0') + \"-01\";\n const lastDayStr = year + \"-\" + String(monthNum).padStart(2, '0') + \"-\" + String(lastDay.getDate()).padStart(2, '0'); \n \n // Возвращаем объект с диапазоном дат\n return {\n start: firstDayStr,\n end: lastDayStr\n };\n }\n \n // Если это не специальное поле или значение не распознано, возвращаем null\n return null;\n}\n\nasync function getReportFieldValue(frm, reportName, filters, fieldName, aggregation) {\n try {\n // Обрабатываем фильтры с возможными ссылками на поля документа\n const processedFilters = {};\n \n for (const key in filters) {\n let value = filters[key];\n \n // Проверяем, является ли значение ссылкой на поле документа\n if (typeof value === 'string' && value.startsWith('doc.')) {\n const docField = value.substring(4);\n if (frm.doc[docField] !== undefined) {\n processedFilters[key] = frm.doc[docField];\n continue;\n }\n }\n \n // Обработка специальных переменных\n if (typeof value === 'string' && value.startsWith('$')) {\n switch (value) {\n case '$DefaultCompany':\n // Получаем компанию по умолчанию из настроек или документа\n processedFilters[key] = frm.doc.company || frappe.defaults.get_user_default(\"Company\");\n continue;\n \n case '$AyIlSpecial':\n // Обрабатываем специальные даты для азербайджанских месяцев/кварталов\n const dateRange = processAzerbayjanDateField(frm.doc);\n if (dateRange) {\n // Для полей from_date и to_date используем соответствующие значения\n if (key === 'from_date') {\n processedFilters[key] = dateRange.start;\n } else if (key === 'to_date') {\n processedFilters[key] = dateRange.end;\n } else {\n // Для других полей используем начальную дату\n processedFilters[key] = dateRange.start;\n }\n } else {\n // Если не удалось получить диапазон дат, используем текущую дату\n processedFilters[key] = frappe.datetime.get_today();\n }\n continue;\n \n default:\n // Для других $-переменных оставляем как есть\n processedFilters[key] = value;\n continue;\n }\n }\n \n // Обычные значения\n processedFilters[key] = value;\n }\n \n // Проверяем кеш\n if (!window.reportCache) window.reportCache = {};\n \n const cacheKey = reportName + \"|\" + JSON.stringify(processedFilters) + \"|\" + fieldName + \"|\" + aggregation;\n const now = new Date().getTime();\n \n if (window.reportCache[cacheKey] && \n window.reportCache[cacheKey].timestamp > now - 5 * 60 * 1000) {\n return window.reportCache[cacheKey].value;\n }\n \n // Выполняем запрос к серверу\n try {\n const result = await frappe.call({\n method: \"formula_editor.api.run_report_for_formula\",\n args: {\n report_name: reportName,\n filters: processedFilters,\n field_name: fieldName\n },\n freeze: false\n });\n \n if (result && result.message !== undefined) {\n if (result.message.error) {\n console.error('Report error:', result.message.error);\n return 0;\n } \n \n let value = parseFloat(result.message);\n if (isNaN(value)) value = 0;\n \n // Округляем до 2 знаков после запятой\n value = Math.round(value * 100) / 100;\n \n // Сохраняем в кеш\n window.reportCache[cacheKey] = {\n value: value,\n timestamp: now\n };\n \n return value;\n }\n } catch (err) {\n console.error('Report field error:', err);\n }\n \n return 0;\n } catch (error) {\n console.error('getReportFieldValue error:', error);\n return 0;\n }\n}\n\n\n function transform_expression(expression, for_child_table = false, table_name = null) {\n let transformed = expression;\n let needsAsync = false;\n let reportCalls = [];\n\n // === Обработка report(...) ===\n const reportRegex = /report\\(([^)]+)\\)/g;\n let match;\n \n // Находим все вызовы report() в выражении\n while ((match = reportRegex.exec(expression)) !== null) {\n const reportName = match[1]; // Имя поля отчета\n const fullMatch = match[0]; // Полный текст match - \"report(xyz)\"\n needsAsync = true;\n \n // Создаем уникальный плейсхолдер\n const placeholder = `__REPORT_PLACEHOLDER_${reportCalls.length}__`;\n \n // Ищем соответствующее поле отчета по имени\n \n if (reportName === \"Xam neft\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Xam_neft___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Təbii qaz\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Tebii_qaz___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Filiz faydalı qazıntıları: bütün növ metallar\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Filiz_faydali_qazintilari__butun_nov_metallar___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Mişar daşları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Misar_daslari___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Üzlük daşları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Üzluk_daslari___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Seolit\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Seolit___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Barit\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Barit___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Yüngül doldurucuların istehsalı üçün gillər\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Yungul_doldurucular_ucun_giller___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Vulkan külü və pemza\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Vulkan_kulu_ve_pemza___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Kvars qumları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Kvars_qumlari___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Sement xammalı\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Sement_xammali___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Duz\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Duz___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Qiymətli və yarımqiymətli bəzək daşları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Qiymetli_ve_yarimqiymetli_bezek_daslari___karat___qram\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Yodlu bromlu sular\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Yodlu_bromlu_sular___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Mineral sular\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Mineral_sular___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Bentonit gillər\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Bentonit_giller___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Kərpic-kirəmit gilləri\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Kerpic_kiremit_gilleri___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Tikinti qumları\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Tikinti_qumlari___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Çınqıl xammalı\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Çinqil_xammali___m3\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Gips, gəc\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Gips,_gec___ton\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Xam neft-Topdan satış qiyməti\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Xam_neft___ton_sales\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Təbii qaz-Topdan satış qiyməti\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Tebii_qaz___m3_sales\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n if (reportName === \"Filiz faydalı qazıntıları: bütün növ metallar-Topdan satış qiyməti\") {\n reportCalls.push({\n placeholder: placeholder,\n reportName: \"Mining Resources Stock Report\",\n filters: JSON.parse(\"{\\\"company\\\":\\\"$DefaultCompany\\\",\\\"from_date\\\":\\\"$AyIlSpecial\\\",\\\"to_date\\\":\\\"$AyIlSpecial\\\",\\\"fiscal_year\\\":\\\"$DefaultFiscalYear\\\"}\"),\n fieldName: \"Filiz_faydali_qazintilari__butun_nov_metallar___ton_sales\",\n aggregation: \"sum\"\n });\n \n transformed = transformed.replace(fullMatch, placeholder);\n }\n }\n\n // === Обработка table(...) ===\n const tableRegex = /table\\(([^,)]+),\\s*([^,)]+),\\s*([^)]+)\\)/g;\n let tableMatch;\n while ((tableMatch = tableRegex.exec(expression)) !== null) {\n const fullMatch = tableMatch[0];\n const tableName = tableMatch[1].trim().replace(/['\"]/g, '');\n const rowNumber = tableMatch[2].trim();\n const fieldName = tableMatch[3].trim().replace(/['\"]/g, '');\n \n const replacement = `(function() { \n try {\n if (!frm.doc[\"${tableName}\"] || !frm.doc[\"${tableName}\"][${rowNumber} - 1]) {\n return 0;\n }\n const value = frm.doc[\"${tableName}\"][${rowNumber} - 1][\"${fieldName}\"];\n return parseFloat(value) || 0;\n } catch (e) {\n return 0;\n }\n })()`;\n \n transformed = transformed.replace(fullMatch, replacement);\n }\n\n // === Обработка universal полей ===\n \n\n // === Обработка val() и row() ===\n const tablePrefixes = [\"items\", \"taxes\", \"packed_items\", \"payments\", \"advances\", \"timesheets\", \"payment_schedule\", \"sales_team\"];\n\n for (const prefix of tablePrefixes) {\n const sumPattern = new RegExp(`sum\\\\(${prefix}_([^)]+)\\\\)`, 'g');\n transformed = transformed.replace(sumPattern, (m, f) => \n `(frm.doc[\"${prefix}\"] && frm.doc[\"${prefix}\"].reduce((s, r) => s + (parseFloat(r[\"${f}\"]) || 0), 0) || 0)`\n );\n\n const valPattern = new RegExp(`val\\\\(${prefix}_([^)]+)\\\\)`, 'g');\n transformed = transformed.replace(valPattern, (m, f) => \n `(frm.doc[\"${prefix}\"] && frm.doc[\"${prefix}\"].reduce((s, r) => s + (parseFloat(r[\"${f}\"]) || 0), 0) || 0)`\n );\n }\n\n if (for_child_table) {\n transformed = transformed.replace(/row\\(([^)]+)\\)/g, (m, f) => \n `(parseFloat(row[\"${f}\"]) || 0)`\n );\n\n transformed = transformed.replace(/val\\(([^)]+)\\)/g, (m, f) => {\n if (f.startsWith(table_name + '_')) {\n return `(parseFloat(row[\"${f.slice(table_name.length + 1)}\"]) || 0)`;\n }\n return `(parseFloat(frm.doc[\"${f}\"]) || 0)`;\n });\n } else {\n transformed = transformed.replace(/val\\(([^)]+)\\)/g, (m, f) => \n `(parseFloat(frm.doc[\"${f}\"]) || 0)`\n );\n\n transformed = transformed.replace(/row\\(([^)]+)\\)/g, () => \n `0 /* ERROR: row() вне табличной части */`\n );\n }\n\n return { transformed, needsAsync, reportCalls };\n }\n\n\n// Функция для получения индекса строки по её имени (name/cdn)\nfunction get_row_index(frm, tableName, rowName) {\n \n // Проверяем наличие таблицы\n if (!frm.doc[tableName]) {\n return -1;\n }\n \n // Выводим все строки для отладки\n frm.doc[tableName].forEach((row, idx) => {\n });\n \n // Ищем индекс строки по имени\n for (let i = 0; i < frm.doc[tableName].length; i++) {\n if (frm.doc[tableName][i].name === rowName) {\n return i;\n }\n }\n return -1;\n}\n\n// Функция для доступа к полям конкретных строк таблицы\nfunction table_row(tableName, rowIndex, fieldName) {\n // Проверяем наличие необходимых аргументов\n if (!tableName || rowIndex === undefined || !fieldName) {\n return 0;\n }\n \n // Преобразуем rowIndex в число (на случай, если передана строка)\n const rowIdx = parseInt(rowIndex) - 1; // Индексация с 1 для пользователя, но с 0 в массиве\n \n try {\n // Проверяем наличие таблицы и строки\n if (!frm.doc[tableName] || !frm.doc[tableName][rowIdx]) {\n return 0;\n }\n \n // Получаем значение поля\n const value = frm.doc[tableName][rowIdx][fieldName];\n \n // Проверяем на NaN и возвращаем значение или 0\n const numValue = parseFloat(value);\n if (isNaN(numValue)) {\n return 0;\n }\n return numValue;\n } catch (error) {\n return 0;\n }\n}\n\n// Функция для обновления значения поля конкретной строки таблицы\nfunction set_table_row(frm, tableName, rowIndex, fieldName, value) {\n // Проверяем наличие необходимых аргументов\n if (!frm || !tableName || rowIndex === undefined || !fieldName) {\n return false;\n }\n \n // Преобразуем rowIndex в число (на случай, если передана строка)\n const rowIdx = parseInt(rowIndex) - 1; // Индексация с 1 для пользователя, но с 0 в массиве\n \n try {\n // Проверяем наличие таблицы и строки\n if (!frm.doc[tableName] || !frm.doc[tableName][rowIdx]) {\n return false;\n }\n \n // Получаем строку таблицы\n const row = frm.doc[tableName][rowIdx];\n \n // Получаем сетевое имя cdt и cdn для Frappe\n const cdt = frm.fields_dict[tableName].grid.doctype;\n const cdn = row.name;\n \n // Проверяем, является ли значение NaN, и если да, заменяем его на 0\n let finalValue = value;\n if (typeof value === 'number' && isNaN(value)) {\n finalValue = 0;\n }\n \n // Обновляем значение поля\n frappe.model.set_value(cdt, cdn, fieldName, finalValue);\n \n return true;\n } catch (error) {\n return false;\n }\n}\n\n// Функция для поиска строки таблицы по значению поля\nfunction find_table_row(frm, tableName, fieldName, value) {\n // Проверяем наличие необходимых аргументов\n if (!frm || !tableName || !fieldName) {\n return -1;\n }\n \n try {\n // Проверяем наличие таблицы\n if (!frm.doc[tableName]) {\n return -1;\n }\n \n // Ищем строку с указанным значением поля\n for (let i = 0; i < frm.doc[tableName].length; i++) {\n if (frm.doc[tableName][i][fieldName] == value) {\n // Возвращаем индекс строки (начиная с 1 для пользователя)\n return i + 1;\n }\n }\n \n // Если строка не найдена\n return -1;\n } catch (error) {\n return -1;\n }\n}\n\n\n async function calculate_721hesablanmışvergiməbləğinincəmi(frm) {\n try {\n \n const { transformed, needsAsync, reportCalls } = transform_expression(\"table(topdansatış_qiyməti_ilə, 1, vergininməbləğimanatla) + table(topdansatış_qiyməti_ilə, 2, vergininməbləğimanatla) + table(topdansatış_qiyməti_ilə, 3, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 1, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 2, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 3, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 4, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 5, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 6, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 7, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 8, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 9, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 10, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 11, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 12, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 13, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 14, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 15, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 16, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 17, vergininməbləğimanatla)\", false);\n \n // Обработка вызовов отчетов, если они есть\n let finalExpression = transformed;\n if (reportCalls && reportCalls.length > 0) {\n // Собираем все результаты отчетов\n const reportResults = [];\n for (const call of reportCalls) {\n const result = await getReportFieldValue(\n frm,\n call.reportName,\n call.filters,\n call.fieldName,\n call.aggregation\n );\n reportResults.push({ placeholder: call.placeholder, value: result });\n }\n \n // Заменяем плейсхолдеры на полученные значения\n for (const result of reportResults) {\n finalExpression = finalExpression.replace(result.placeholder, result.value);\n }\n }\n \n // Теперь можно безопасно вычислить выражение\n const result = eval(finalExpression);\n frm.set_value(\"721hesablanmışvergiməbləğinincəmi\", isNaN(result) ? 0 : result);\n } catch (e) {\n }\n }\n\n\n async function calculate_723büdcəyəödənilməlivergininməbləğ(frm) {\n try {\n \n const { transformed, needsAsync, reportCalls } = transform_expression(\"table(topdansatış_qiyməti_ilə, 1, vergininməbləğimanatla) + table(topdansatış_qiyməti_ilə, 2, vergininməbləğimanatla) + table(topdansatış_qiyməti_ilə, 3, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 1, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 2, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 3, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 4, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 5, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 6, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 7, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 8, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 9, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 10, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 11, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 12, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 13, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 14, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 15, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 16, vergininməbləğimanatla) + table(faydalı_qazıntıların_hasilatı, 17, vergininməbləğimanatla)\", false);\n \n // Обработка вызовов отчетов, если они есть\n let finalExpression = transformed;\n if (reportCalls && reportCalls.length > 0) {\n // Собираем все результаты отчетов\n const reportResults = [];\n for (const call of reportCalls) {\n const result = await getReportFieldValue(\n frm,\n call.reportName,\n call.filters,\n call.fieldName,\n call.aggregation\n );\n reportResults.push({ placeholder: call.placeholder, value: result });\n }\n \n // Заменяем плейсхолдеры на полученные значения\n for (const result of reportResults) {\n finalExpression = finalExpression.replace(result.placeholder, result.value);\n }\n }\n \n // Теперь можно безопасно вычислить выражение\n const result = eval(finalExpression);\n frm.set_value(\"723büdcəyəödənilməlivergininməbləğ\", isNaN(result) ? 0 : result);\n } catch (e) {\n }\n }\n\n\n // Функция для инициализации формул строк табличных частей\n function initialize_table_row_formulas(frm) {\n try {\n // Получаем информацию о формулах для строк табличных частей\n const formulas = JSON.parse(frm.doc.table_row_formulas_storage || \"{}\");\n \n // ВАЖНО: Преобразуем объект в массив и сортируем его по порядку выполнения\n const sortedFormulas = Object.entries(formulas).map(([id, formula]) => {\n return { id, ...formula };\n }).sort((a, b) => {\n // Сортировка по значению поля order (если порядок не задан, используем 10 по умолчанию)\n const orderA = a.order !== undefined ? parseInt(a.order) : 10;\n const orderB = b.order !== undefined ? parseInt(b.order) : 10;\n return orderA - orderB;\n });\n \n // Группируем формулы по табличным частям и строкам\n const formulasByTableAndRow = {};\n \n sortedFormulas.forEach(formula => {\n const tableName = formula.table_name;\n const rowIndex = parseInt(formula.row_index);\n \n if (!formulasByTableAndRow[tableName]) {\n formulasByTableAndRow[tableName] = {};\n }\n \n if (!formulasByTableAndRow[tableName][rowIndex]) {\n formulasByTableAndRow[tableName][rowIndex] = [];\n }\n \n formulasByTableAndRow[tableName][rowIndex].push(formula);\n });\n \n // Устанавливаем обработчики для каждой табличной части\n Object.keys(formulasByTableAndRow).forEach(tableName => {\n if (!frm.doc[tableName]) {\n return;\n }\n \n // Для каждой строки таблицы\n frm.doc[tableName].forEach((row, rowIdx) => {\n // Получаем отсортированные формулы для текущей строки (строки нумеруются с 1, а индексы с 0)\n const rowFormulas = formulasByTableAndRow[tableName][rowIdx + 1] || [];\n \n // Выполняем формулы в порядке сортировки (по полю order)\n for (const formula of rowFormulas) {\n try {\n // Определяем необходимость асинхронного вызова\n const usesUniversal = formula.formula && formula.formula.includes(\"univ(\");\n const usesReports = formula.formula && formula.formula.includes(\"report(\");\n \n // Вызываем расчет формулы согласно установленному порядку\n if (usesUniversal || usesReports) {\n // Для асинхронных вызовов используем await в асинхронной IIFE\n (async () => {\n try {\n await calculate_table_row_field(frm, tableName, rowIdx, formula.field_name, formula.formula, \"refresh\");\n } catch (asyncError) {\n }\n })();\n } else {\n // Для синхронных вызовов выполняем напрямую\n calculate_table_row_field(frm, tableName, rowIdx, formula.field_name, formula.formula, \"refresh\");\n }\n } catch (error) {\n }\n }\n });\n });\n } catch (error) {\n }\n }\n\n\n// Функция для расчета значения поля в строке табличной части\nasync function calculate_table_row_field(frm, tableName, rowIndex, fieldName, formula, triggerField) {\n try {\n \n if (!frm.doc[tableName] || !frm.doc[tableName][rowIndex]) {\n return;\n }\n\n const row = frm.doc[tableName][rowIndex];\n const cdt = frm.fields_dict[tableName].grid.doctype;\n const cdn = row.name;\n \n // === ЕДИНАЯ ТОЧКА ОБРАБОТКИ ВСЕХ ФУНКЦИЙ ===\n let finalFormula, reportCalls;\n \n try {\n // Используем transform_expression как единственную точку преобразования\n const transformResult = transform_expression(formula, true, tableName);\n \n if (transformResult) {\n finalFormula = transformResult.transformed;\n reportCalls = transformResult.reportCalls || [];\n } else {\n finalFormula = formula;\n reportCalls = [];\n }\n } catch (transformError) {\n console.error('Ошибка transform_expression:', transformError);\n finalFormula = formula;\n reportCalls = [];\n }\n \n // === ОБРАБОТКА АСИНХРОННЫХ ВЫЗОВОВ ОТЧЕТОВ ===\n if (reportCalls && reportCalls.length > 0) {\n try {\n // Выполняем все асинхронные запросы к отчетам параллельно\n const reportResults = await Promise.all(\n reportCalls.map(call => \n getReportFieldValue(\n frm,\n call.reportName,\n call.filters,\n call.fieldName,\n call.aggregation\n )\n )\n );\n \n // Заменяем плейсхолдеры на реальные значения\n for (let i = 0; i < reportCalls.length; i++) {\n const reportValue = reportResults[i] !== undefined ? Number(reportResults[i]) : 0;\n finalFormula = finalFormula.replace(\n reportCalls[i].placeholder, \n reportValue\n );\n }\n } catch (reportError) {\n console.error('Ошибка получения данных отчетов:', reportError);\n // В случае ошибки заменяем все плейсхолдеры на 0\n for (const call of reportCalls) {\n finalFormula = finalFormula.replace(call.placeholder, 0);\n }\n }\n }\n \n // === ВЫЧИСЛЕНИЕ ФИНАЛЬНОЙ ФОРМУЛЫ ===\n let result = 0;\n try {\n // Создаем функцию с доступом к контексту row и frm\n const evalFunc = new Function('row', 'frm', `return ${finalFormula};`);\n result = evalFunc(row, frm);\n } catch (evalError) {\n console.error('Ошибка вычисления формулы:', evalError, 'Formula:', finalFormula);\n }\n\n if (isNaN(result)) {\n result = 0;\n }\n\n // Устанавливаем вычисленное значение\n frappe.model.set_value(cdt, cdn, fieldName, result);\n\n // Обновляем таблицу\n frm.refresh_field(tableName);\n } catch (err) {\n console.error('Ошибка в calculate_table_row_field:', err);\n }\n}\n\n\n// Функция для получения индекса строки по её имени\nfunction get_row_index(frm, tableName, rowName) {\n \n // Проверяем наличие таблицы\n if (!frm.doc[tableName]) {\n return -1;\n }\n \n // Ищем индекс строки по имени\n for (let i = 0; i < frm.doc[tableName].length; i++) {\n if (frm.doc[tableName][i].name === rowName) {\n return i;\n }\n }\n return -1;\n}", "view": "Form" }, { diff --git a/taxes_az/fixtures/main_type_of_activity.json b/taxes_az/fixtures/main_type_of_activity.json index f54770b..37f59ec 100644 --- a/taxes_az/fixtures/main_type_of_activity.json +++ b/taxes_az/fixtures/main_type_of_activity.json @@ -23291,9 +23291,9 @@ { "docstatus": 0, "doctype": "Main type of activity", - "modified": "2025-01-16 14:31:25.203438", + "modified": "2025-09-15 13:12:14.004452", "name": "9200001", - "option_name": "9200001 LOTOREYA OYUNLARI" + "option_name": "9200001-LOTOREYA OYUNLARI" }, { "docstatus": 0,