diff --git a/app/Controllers/Items.php b/app/Controllers/Items.php index e99150f9c..0754aa6c2 100644 --- a/app/Controllers/Items.php +++ b/app/Controllers/Items.php @@ -482,9 +482,9 @@ class Items extends Secure_Controller foreach ($result as &$item) { if (isset($item['item_number']) && empty($item['item_number']) && $this->config['barcode_generate_if_empty']) { if (isset($item['item_id'])) { - $save_item = ['item_number' => $item['item_number']]; - $this->item->save_value($save_item, $item['item_id']); - } + $save_item = ['item_number' => $item['item_number'], 'item_id' => $item['item_id']]; + $this->item->saveValue($save_item); + } } } $data['items'] = $result; @@ -663,7 +663,12 @@ class Items extends Secure_Controller $employee_id = $this->employee->get_logged_in_employee_info()->person_id; - if ($this->item->save_value($item_data, $item_id)) { + // For updates, include item_id in data array + if ($item_id !== NEW_ENTRY) { + $item_data['item_id'] = $item_id; + } + + if ($this->item->saveValue($item_data)) { $success = true; $new_item = false; @@ -826,8 +831,8 @@ class Items extends Secure_Controller */ public function getRemoveLogo($item_id): ResponseInterface { - $item_data = ['pic_filename' => null]; - $result = $this->item->save_value($item_data, $item_id); + $item_data = ['pic_filename' => null, 'item_id' => $item_id]; + $result = $this->item->saveValue($item_data); return $this->response->setJSON(['success' => $result]); } @@ -1039,7 +1044,7 @@ class Items extends Secure_Controller return $value !== null && strlen($value); }); - if (!$isFailedRow && $this->item->save_value($itemData, $itemId)) { + if (!$isFailedRow && $this->item->saveValue($itemData)) { $this->save_tax_data($row, $itemData); $this->save_inventory_quantities($row, $itemData, $allowedStockLocations, $employeeId); $csvAttributeValues = $this->extractAttributeData($row); @@ -1312,8 +1317,8 @@ class Items extends Secure_Controller $images = glob(FCPATH . "uploads/item_pics/$item->pic_filename.*"); if (sizeof($images) > 0) { $new_pic_filename = pathinfo($images[0], PATHINFO_BASENAME); - $item_data = ['pic_filename' => $new_pic_filename]; - $this->item->save_value($item_data, $item->item_id); + $item_data = ['pic_filename' => $new_pic_filename, 'item_id' => $item->item_id]; + $this->item->saveValue($item_data); } } } diff --git a/app/Models/Item.php b/app/Models/Item.php index 3759810a0..1246d83b2 100644 --- a/app/Models/Item.php +++ b/app/Models/Item.php @@ -436,32 +436,39 @@ class Item extends Model /** * Inserts or updates an item + * + * If the primary key (item_id) is present in the data array and the record exists, + * it will update the existing record. Otherwise, it will insert a new record. + * + * @param array $data The item data to save (passed by reference to set item_id on insert) + * @return bool True on success, false on failure */ - public function save_value(array &$item_data, int $item_id = NEW_ENTRY): bool // TODO: need to bring this in line with parent or change the name + public function saveValue(array &$data): bool { - $builder = $this->db->table('items'); + $primaryKey = $this->primaryKey; + $id = $data[$primaryKey] ?? NEW_ENTRY; - if ($item_id < 1 || !$this->exists($item_id, true)) { - if ($builder->insert($item_data)) { - $item_data['item_id'] = (int)$this->db->insertID(); - if ($item_id < 1) { - $builder = $this->db->table('items'); - $builder->where('item_id', $item_data['item_id']); - $builder->update(['low_sell_item_id' => $item_data['item_id']]); - } - - return true; - } - - return false; - } else { - $item_data['item_id'] = $item_id; + // If id > 0 and record exists, update it + if ($id > 0 && $this->exists($id, true)) { + $builder = $this->db->table('items'); + $builder->where($primaryKey, $id); + return $builder->update($data); } + // Insert new record $builder = $this->db->table('items'); - $builder->where('item_id', $item_id); + if ($builder->insert($data)) { + $data[$primaryKey] = (int)$this->db->insertID(); + + // Update low_sell_item_id for new items + $builder = $this->db->table('items'); + $builder->where($primaryKey, $data[$primaryKey]); + $builder->update(['low_sell_item_id' => $data[$primaryKey]]); - return $builder->update($item_data); + return true; + } + + return false; } /** @@ -1079,9 +1086,9 @@ class Item extends Model $total_quantity = $old_total_quantity + $items_received; $average_price = bcdiv(bcadd(bcmul((string)$items_received, (string)$new_price), bcmul((string)$old_total_quantity, (string)$old_price)), (string)$total_quantity); - $data = ['cost_price' => $average_price]; + $data = ['cost_price' => $average_price, 'item_id' => $item_id]; - return $this->save_value($data, $item_id); + return $this->saveValue($data); } /** diff --git a/tests/Controllers/ItemsCsvImportTest.php b/tests/Controllers/ItemsCsvImportTest.php index d322377b0..e9e88c703 100644 --- a/tests/Controllers/ItemsCsvImportTest.php +++ b/tests/Controllers/ItemsCsvImportTest.php @@ -237,7 +237,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $row = $this->db->table('items') ->where('item_number', $itemData['item_number']) @@ -268,7 +268,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $locationId = 1; $quantity = 100; @@ -298,7 +298,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $inventoryData = [ 'trans_inventory' => 50, @@ -329,7 +329,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $taxesData = [ ['name' => 'VAT', 'percent' => 20], @@ -406,7 +406,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => false ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); } $item1 = $this->item->get_info_by_id_or_number('ITEM-A'); @@ -430,7 +430,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($originalData)); + $this->assertTrue($this->item->saveValue($originalData)); $updatedData = [ 'item_id' => $originalData['item_id'], @@ -443,7 +443,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($updatedData, $updatedData['item_id'])); + $this->assertTrue($this->item->saveValue($updatedData)); $updatedItem = $this->item->get_info($updatedData['item_id']); $this->assertEquals('Updated Name', $updatedItem->name); @@ -464,7 +464,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($originalData)); + $this->assertTrue($this->item->saveValue($originalData)); $definitionData = [ 'definition_name' => 'Color', @@ -510,7 +510,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $definitionData = [ 'definition_name' => 'Color', @@ -553,7 +553,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); // Mock Attribute DROPDOWN $definitionData = [ @@ -604,7 +604,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $locationId = 1; @@ -633,7 +633,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $savedItem = $this->item->get_info($itemData['item_id']); $this->assertEquals(-1, (int)$savedItem->reorder_level); @@ -672,7 +672,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $savedItem = $this->item->get_info($itemData['item_id']); @@ -702,7 +702,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $savedItem = $this->item->get_info($itemData['item_id']); $this->assertEquals('8471', $savedItem->hsn_code); @@ -719,7 +719,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $locations = [ 'Warehouse' => 100, @@ -792,7 +792,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $this->assertIsInt($itemData['item_id']); $this->assertGreaterThan(0, $itemData['item_id']); @@ -812,7 +812,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $exists = $this->item->exists($itemData['item_id']); $this->assertTrue($exists); @@ -858,7 +858,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $taxesData = []; if (is_numeric($csvRow['Tax 1 Percent']) && $csvRow['Tax 1 Name'] !== '') { @@ -1032,7 +1032,7 @@ class ItemsCsvImportTest extends CIUnitTestCase 'deleted' => 0 ]; - $this->assertTrue($this->item->save_value($itemData)); + $this->assertTrue($this->item->saveValue($itemData)); $uniqueId = uniqid(); $locations = ['Warehouse' . $uniqueId, 'Store' . $uniqueId];