diff --git a/taxes_az/client/company.js b/taxes_az/client/company.js index fecba1f..2d0ada5 100644 --- a/taxes_az/client/company.js +++ b/taxes_az/client/company.js @@ -9,12 +9,15 @@ frappe.ui.form.on('Company', { frm.add_custom_button(__('Get E-Taxes Profile'), function() { ETaxesCompany.checkAuthAndFetchProfile(frm); }, __('E-Taxes')); - + // Add Set Main Activity button frm.add_custom_button(__('Set Main Activity'), function() { ETaxesCompany.showMainActivitySelector(frm); }, __('E-Taxes')); - + + // Make declaration default fields always editable + ETaxesCompany.enableDeclarationDefaultFields(frm); + // Check gambling activity on refresh ETaxesCompany.checkGamblingActivity(frm); }, @@ -26,6 +29,18 @@ frappe.ui.form.on('Company', { } }, + 'mdssüzrə': function(frm) { + ETaxesCompany.saveDeclarationDefaults(frm); + }, + + 'icbaritibbisığortaüzrə': function(frm) { + ETaxesCompany.saveDeclarationDefaults(frm); + }, + + 'işsizlikdənsığortaüzrə': function(frm) { + ETaxesCompany.saveDeclarationDefaults(frm); + }, + seller: function(frm) { ETaxesCompany.handleGamblingFieldChange(frm, 'seller'); }, @@ -217,6 +232,44 @@ window.ETaxesCompany = { }); }, + /** + * Make declaration default fields editable regardless of docstatus + */ + enableDeclarationDefaultFields: function(frm) { + ['mdssüzrə', 'icbaritibbisığortaüzrə', 'işsizlikdənsığortaüzrə'].forEach(function(fieldname) { + frm.set_df_property(fieldname, 'read_only', 0); + }); + frm.refresh_fields(['mdssüzrə', 'icbaritibbisığortaüzrə', 'işsizlikdənsığortaüzrə']); + }, + + /** + * Auto-save declaration default fields via direct DB update (bypasses submit state) + */ + saveDeclarationDefaults: function(frm) { + frappe.call({ + method: 'taxes_az.company_etaxes.force_update_declaration_defaults', + args: { + company_name: frm.doc.name, + mdss: frm.doc['mdssüzrə'] || '', + icbari: frm.doc['icbaritibbisığortaüzrə'] || '', + issizlik: frm.doc['işsizlikdənsığortaüzrə'] || '' + }, + callback: function(r) { + if (r.message && r.message.success) { + frm.doc.__unsaved = 0; + if (frm.doc.docstatus === 1) { + frm.page.set_indicator(__('Submitted'), 'blue'); + } else { + frm.page.clear_indicator(); + } + frappe.show_alert({ message: __('Saved'), indicator: 'green' }, 2); + } else { + frappe.show_alert({ message: __('Save failed'), indicator: 'red' }, 3); + } + } + }); + }, + /** * Check authentication and fetch profile with inline re-authentication */ diff --git a/taxes_az/company_etaxes.py b/taxes_az/company_etaxes.py index 7867f94..237febe 100644 --- a/taxes_az/company_etaxes.py +++ b/taxes_az/company_etaxes.py @@ -542,6 +542,31 @@ def get_property_type_name_by_code(code, asan_login_name=None): "message": "An error occurred while getting property type name" } +@frappe.whitelist() +def force_update_declaration_defaults(company_name, mdss, icbari, issizlik): + """Обновление полей умолчаний деклараций на компании, минуя проверку submit-статуса""" + try: + if not frappe.db.exists("Company", company_name): + return {"success": False, "message": f"Company {company_name} not found"} + + frappe.db.sql(""" + UPDATE `tabCompany` + SET `mdssüzrə` = %s, + `icbaritibbisığortaüzrə` = %s, + `işsizlikdənsığortaüzrə` = %s, + `modified` = NOW(), + `modified_by` = %s + WHERE `name` = %s + """, (mdss or '', icbari or '', issizlik or '', frappe.session.user, company_name)) + + frappe.db.commit() + return {"success": True} + + except Exception as e: + frappe.log_error(f"Error in force_update_declaration_defaults: {str(e)}", "Declaration Defaults Error") + return {"success": False, "message": str(e)} + + @frappe.whitelist() def force_update_single_field(company_name, field_name, field_value): """Форсированное обновление одного поля компании""" diff --git a/taxes_az/taxes_az/doctype/single_declaration_related_to_salaried_and_non_salaried_work/single_declaration_related_to_salaried_and_non_salaried_work.js b/taxes_az/taxes_az/doctype/single_declaration_related_to_salaried_and_non_salaried_work/single_declaration_related_to_salaried_and_non_salaried_work.js index d5f7ebf..f7b7fb2 100644 --- a/taxes_az/taxes_az/doctype/single_declaration_related_to_salaried_and_non_salaried_work/single_declaration_related_to_salaried_and_non_salaried_work.js +++ b/taxes_az/taxes_az/doctype/single_declaration_related_to_salaried_and_non_salaried_work/single_declaration_related_to_salaried_and_non_salaried_work.js @@ -1,3 +1,33 @@ +function fillFromCompanyDefaults(frm) { + const company = frappe.defaults.get_user_default('Company') + || frappe.defaults.get_default('Company'); + if (!company) return; + + frappe.db.get_value( + 'Company', + company, + ['mdssüzrə', 'icbaritibbisığortaüzrə', 'işsizlikdənsığortaüzrə', 'main_activity'] + ).then(r => { + if (!r || !r.message) return; + const v = r.message; + if (v['mdssüzrə']) frm.set_value('mdssüzrə', v['mdssüzrə']); + if (v['icbaritibbisığortaüzrə']) frm.set_value('icbaritibbisığortaüzrə', v['icbaritibbisığortaüzrə']); + if (v['işsizlikdənsığortaüzrə']) frm.set_value('işsizlikdənsığortaüzrə', v['işsizlikdənsığortaüzrə']); + if (v['main_activity']) frm.set_value('vergiüzrə', v['main_activity']); + }); +} + +frappe.ui.form.on('Single declaration related to salaried and non-salaried work', { + onload: function(frm) { + if (!frm.doc.__islocal) return; + fillFromCompanyDefaults(frm); + }, + + il: function(frm) { + fillFromCompanyDefaults(frm); + } +}); + // Код для экспорта XML frappe.ui.form.on('Single declaration related to salaried and non-salaried work', { refresh: function(frm) { diff --git a/taxes_az/taxes_az/doctype/single_declaration_related_to_salaried_and_non_salaried_work/single_declaration_related_to_salaried_and_non_salaried_work.json b/taxes_az/taxes_az/doctype/single_declaration_related_to_salaried_and_non_salaried_work/single_declaration_related_to_salaried_and_non_salaried_work.json index 569d647..95aa161 100644 --- a/taxes_az/taxes_az/doctype/single_declaration_related_to_salaried_and_non_salaried_work/single_declaration_related_to_salaried_and_non_salaried_work.json +++ b/taxes_az/taxes_az/doctype/single_declaration_related_to_salaried_and_non_salaried_work/single_declaration_related_to_salaried_and_non_salaried_work.json @@ -137,8 +137,9 @@ }, { "fieldname": "vergi\u00fczr\u0259", - "fieldtype": "Select", - "label": "Vergi \u00fczr\u0259" + "fieldtype": "Link", + "label": "Vergi \u00fczr\u0259", + "options": "Main type of activity" }, { "fieldname": "azadolmav\u0259g\u00fcz\u0259\u015ftl\u0259r\u0259m\u0259km\u0259zuniyy\u0259tin\u0259g\u00f6r\u0259kompensasiya",