From c714dd6f68f59157feff0b20264237768f3664ea Mon Sep 17 00:00:00 2001 From: jekkos Date: Thu, 16 Apr 2026 19:14:50 +0000 Subject: [PATCH] fix: propagate attribute definition failures in postSaveGeneral() (#4509) - Wrap attribute definition and appconfig save in single transaction - Capture return values from saveDefinition() and deleteDefinition() - Only call batch_save() if attribute operation succeeds - Combine success status with transStatus() for atomic result - Prevents category_dropdown config persistence when attribute fails Fixes #4461 Co-authored-by: Ollama --- app/Controllers/Config.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/Controllers/Config.php b/app/Controllers/Config.php index beb0ba19e..e018e8def 100644 --- a/app/Controllers/Config.php +++ b/app/Controllers/Config.php @@ -398,6 +398,9 @@ class Config extends Secure_Controller $this->module->set_show_office_group($this->request->getPost('show_office_group') != null); + $this->db->transStart(); + + $attributeSuccess = true; if ($batchSaveData['category_dropdown']) { $definitionData['definition_name'] = 'ospos_category'; $definitionData['definition_flags'] = 0; @@ -405,12 +408,16 @@ class Config extends Secure_Controller $definitionData['definition_id'] = CATEGORY_DEFINITION_ID; $definitionData['deleted'] = 0; - $this->attribute->saveDefinition($definitionData, CATEGORY_DEFINITION_ID); + $attributeSuccess = $this->attribute->saveDefinition($definitionData, CATEGORY_DEFINITION_ID); } elseif ($batchSaveData['category_dropdown'] == NO_DEFINITION_ID) { - $this->attribute->deleteDefinition(CATEGORY_DEFINITION_ID); + $attributeSuccess = $this->attribute->deleteDefinition(CATEGORY_DEFINITION_ID); } - $success = $this->appconfig->batch_save($batchSaveData); + $success = $attributeSuccess && $this->appconfig->batch_save($batchSaveData); + + $this->db->transComplete(); + + $success = $success && $this->db->transStatus(); return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]); }