105 lines
3.0 KiB
PHP
105 lines
3.0 KiB
PHP
<?php
|
|
|
|
class WarehouseManager {
|
|
|
|
private $pdo;
|
|
private $company_id;
|
|
|
|
public function __construct($pdo, $company_id) {
|
|
$this->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
|
|
]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
?>
|