pdo = $pdo; $this->company_id = $company_id; } public function getWarehouseName($warehouse_id) { $sql = "SELECT warehouse_name FROM md_warehouse WHERE company_id = :company_id AND id = :warehouse_id"; $sth = $this->pdo->prepare($sql); $sth->execute([ ":company_id" => $this->company_id, ":warehouse_id" => $warehouse_id ]); return $sth->fetchColumn(); } public function getStockContext($warehouse_id, $id) { $name = $this->getWarehouseName($warehouse_id); $table = "td_stock_" . $name; if (empty($id)) { return [ 'table' => $table, 'name' => $name, 'row' => [] ]; } $sql = "SELECT * FROM `$table` WHERE company_id = :company_id AND id = :id"; $sth = $this->pdo->prepare($sql); $sth->execute([ ":company_id" => $this->company_id, ":id" => $id ]); return [ 'table' => $table, 'name' => $name, 'row' => $sth->fetch(PDO::FETCH_ASSOC) ?: [] ]; } public function adjustBalance($type, $warehouse_id, $product_sku, $old_qty, $new_qty) { // Lock the row — other transactions wait here $sql = "SELECT id FROM warehouse_balance WHERE company_id = :company_id AND warehouse_id = :warehouse_id AND product_sku = :product_sku FOR UPDATE"; $sth = $this->pdo->prepare($sql); $sth->execute([ ":company_id" => $this->company_id, ":warehouse_id" => $warehouse_id, ":product_sku" => $product_sku ]); if (!$sth->fetchColumn()) { $sql = "INSERT INTO warehouse_balance (company_id, warehouse_id, product_sku) VALUES (:company_id, :warehouse_id, :product_sku)"; $sth = $this->pdo->prepare($sql); $sth->execute([ ":company_id" => $this->company_id, ":warehouse_id" => $warehouse_id, ":product_sku" => $product_sku ]); } $column = $type === 'in' ? 'total_in' : 'total_out'; // This is already atomic since it uses relative update $sql = "UPDATE warehouse_balance SET `$column` = `$column` - :old_qty + :new_qty WHERE company_id = :company_id AND warehouse_id = :warehouse_id AND product_sku = :product_sku"; $sth = $this->pdo->prepare($sql); $sth->execute([ ":company_id" => $this->company_id, ":warehouse_id" => $warehouse_id, ":product_sku" => $product_sku, ":old_qty" => $old_qty, ":new_qty" => $new_qty ]); } } ?>