From 92d116fd2186f473fd2bb26c779e9f1b33384860 Mon Sep 17 00:00:00 2001 From: Thanakorn S Date: Fri, 24 Apr 2026 13:48:40 +0700 Subject: [PATCH] remove actions and data integrity --- app.zip | Bin 18358551 -> 18393994 bytes app/assets/utils/classes/ContactManager.php | 185 ++++++ app/assets/utils/classes/ProductManager.php | 186 ++++++ app/assets/utils/classes/WarehouseManager.php | 545 +++++++++++++++--- app/contact/api/engine/remove_contact.php | 29 + .../api/engine/remove_contact_type.php | 29 + app/contact/contact.php | 46 +- app/ics/api/engine/delete_stock_in.php | 32 + app/ics/api/engine/delete_stock_out.php | 32 + app/ics/api/engine/delete_stock_transfer.php | 32 + app/ics/api/engine/manage_stock_in.php | 54 +- app/ics/api/engine/manage_stock_out.php | 102 ++-- app/ics/api/engine/retrieve_stock_in.php | 2 +- app/ics/api/engine/retrieve_stock_out.php | 2 +- app/ics/manage_stock_in.php | 2 + app/ics/manage_stock_out.php | 2 + app/ics/manage_stock_transfer.php | 4 +- app/ics/stock_in.php | 23 +- app/ics/stock_out.php | 23 +- app/ics/stock_transfer.php | 25 +- app/inventory/api/engine/remove_category.php | 61 +- app/inventory/api/engine/remove_product.php | 29 + app/inventory/api/engine/remove_storage.php | 29 + app/inventory/api/engine/remove_warehouse.php | 29 + app/inventory/product.php | 24 +- app/inventory/warehouse.php | 47 +- 26 files changed, 1325 insertions(+), 249 deletions(-) create mode 100644 app/assets/utils/classes/ContactManager.php create mode 100644 app/assets/utils/classes/ProductManager.php create mode 100644 app/contact/api/engine/remove_contact.php create mode 100644 app/contact/api/engine/remove_contact_type.php create mode 100644 app/ics/api/engine/delete_stock_in.php create mode 100644 app/ics/api/engine/delete_stock_out.php create mode 100644 app/ics/api/engine/delete_stock_transfer.php create mode 100644 app/inventory/api/engine/remove_product.php create mode 100644 app/inventory/api/engine/remove_storage.php create mode 100644 app/inventory/api/engine/remove_warehouse.php diff --git a/app.zip b/app.zip index 6d23753d2d44ab14a8ac602eed54ba69331ea8e1..c39ea11f5291df3ad7dc200547222046ad9f1334 100644 GIT binary patch delta 81418 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 z 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

DPbH z+8F(4IB()~uU|{^verJ6?P?@9cU=9r{P=qdFPr*^Wd|#s+>$O#v!23w9o2Q^zOn}W zJ~IX4CvQteeIBl}_t;m*+uEB)9-g)&VASc_{@X5mnlok5O8doQlSZuQWIb?0-qexT z`e{un%`TrCBKD}OT^(*ET{XPIzp~$B<%9Y^6LOvY6%V}|n4tPO)53pYLQ2V*43)s} zx{WHqAz`*(C5t11IT4+QN+%xdX4dK4=v?EOYC*Hw)EVc%Hl1YV42T z8>3<#`InjAPLICmW7D*6QkMI?qrPGnk-A2-<<`HI2MQWbJDPWm$nC^^;M4G+|D?X! zBa-LlZ7IrhUsmO%k?`o;#-C+FV`?Np6SrKq_BxtjvRCK5Xv2eBZeBkIr{5Twc<{!y zW1BbM2-+Af?lXb!S+rpNB&BO!lg#=3yN|o_DegemsUHt2U3xt}Br59R+LG`F_mH|; z`cPj()2qVd&MX#;+IWCNy= zqx=on`bY}vAOg-g7zHv9bG^_7@FzQ<3pEpA^r)l?!%0cY9JG2Bk1Z+;U&3P_VXI(2 zZRE2Jn_#v|;;~cd)u6m&9@~MAL&FLldm|fZSf!B>DS_=c!O>d_W_yZj#(e2>1<*Qmaj7#8

p5e(IkDi|-0aJ$ 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 delta 46496 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 rx0Hy_g+X*BGsp#ym3@kf#zLrn&wR9zR;@ypdo = $pdo; + $this->company_id = $company_id; + } + + // ───────────────────────────────────────────────────────────── + // Private helpers + // ───────────────────────────────────────────────────────────── + + /** + * Check if a contact_id is referenced in any active td_stock_* row. + * Returns true if blocking stock exists. + */ + private function hasActiveStock(int $contact_id): bool { + + $sth = $this->pdo->prepare( + "SELECT table_name FROM information_schema.tables + WHERE table_schema = DATABASE() + AND table_name LIKE 'td_stock_%'" + ); + $sth->execute(); + $tables = $sth->fetchAll(PDO::FETCH_COLUMN); + + foreach ($tables as $table) { + $sth = $this->pdo->prepare( + "SELECT COUNT(*) FROM `$table` + WHERE company_id = :company_id + AND contact_id = :contact_id" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':contact_id' => $contact_id, + ]); + if ($sth->fetchColumn() > 0) { + return true; + } + } + + return false; + } + + /** + * Build a log entry array for audit context. + */ + private function buildLogEntry(string $action): array { + return [ + 'user_id' => $_SESSION['login_user_id'] ?? null, + 'dt' => date('Y-m-d H:i:s'), + 'login' => isset($_SESSION['otpTime']) + ? date('Y-m-d H:i:s', $_SESSION['otpTime']) + : null, + 'action' => $action, + ]; + } + + // ───────────────────────────────────────────────────────────── + // Contact type + // ───────────────────────────────────────────────────────────── + + /** + * Soft-delete a contact type. + * + * Blocks if any md_contact references this type. + * + * @throws Exception if contact type not found or has dependent contacts + */ + public function deleteContactType(int $type_id): void { + + $sth = $this->pdo->prepare( + "SELECT id, contact_type, `log` FROM md_contact_type + WHERE company_id = :company_id AND id = :id" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':id' => $type_id, + ]); + $row = $sth->fetch(PDO::FETCH_ASSOC); + + if (!$row) { + throw new Exception("Contact type not found."); + } + + // Block if any contact references this type + $sth = $this->pdo->prepare( + "SELECT COUNT(*) FROM md_contact + WHERE company_id = :company_id + AND contact_type = :type_id" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':type_id' => $type_id, + ]); + + if ($sth->fetchColumn() > 0) { + throw new Exception( + "Cannot delete — contact type \"{$row['contact_type']}\" " . + "still has contacts assigned to it." + ); + } + + // Append delete event to log + $log = json_decode($row['log'] ?? '[]', true) ?: []; + $log[] = $this->buildLogEntry('delete'); + + // Soft-delete + $this->pdo->prepare( + "UPDATE md_contact_type + SET company_id = company_id * -1, + `log` = :log + WHERE id = :id AND company_id = :company_id" + )->execute([ + ':log' => json_encode($log), + ':id' => $type_id, + ':company_id' => $this->company_id, + ]); + } + + // ───────────────────────────────────────────────────────────── + // Contact + // ───────────────────────────────────────────────────────────── + + /** + * Soft-delete a contact. + * + * Blocks if the contact is referenced in any active td_stock_* row. + * + * @throws Exception if contact not found or referenced in active stock + */ + public function deleteContact(int $contact_id): void { + + $sth = $this->pdo->prepare( + "SELECT id, contact_name, `log` FROM md_contact + WHERE company_id = :company_id AND id = :id" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':id' => $contact_id, + ]); + $row = $sth->fetch(PDO::FETCH_ASSOC); + + if (!$row) { + throw new Exception("Contact not found."); + } + + // Block if contact is referenced in any active stock transaction + if ($this->hasActiveStock($contact_id)) { + throw new Exception( + "Cannot delete — \"{$row['contact_name']}\" " . + "is referenced in active stock transactions." + ); + } + + // Append delete event to log + $log = json_decode($row['log'] ?? '[]', true) ?: []; + $log[] = $this->buildLogEntry('delete'); + + // Soft-delete + $this->pdo->prepare( + "UPDATE md_contact + SET company_id = company_id * -1, + `log` = :log + WHERE id = :id AND company_id = :company_id" + )->execute([ + ':log' => json_encode($log), + ':id' => $contact_id, + ':company_id' => $this->company_id, + ]); + } +} \ No newline at end of file diff --git a/app/assets/utils/classes/ProductManager.php b/app/assets/utils/classes/ProductManager.php new file mode 100644 index 0000000..e6207c8 --- /dev/null +++ b/app/assets/utils/classes/ProductManager.php @@ -0,0 +1,186 @@ +pdo = $pdo; + $this->company_id = $company_id; + } + + // ───────────────────────────────────────────────────────────── + // Private helpers + // ───────────────────────────────────────────────────────────── + + /** + * Check if a SKU has any active stock across all td_stock_* tables. + * Returns the first blocking table name found, or null if clear. + */ + private function findActiveStock(string $sku): ?string { + + $sth = $this->pdo->prepare( + "SELECT table_name FROM information_schema.tables + WHERE table_schema = DATABASE() + AND table_name LIKE 'td_stock_%'" + ); + $sth->execute(); + $tables = $sth->fetchAll(PDO::FETCH_COLUMN); + + foreach ($tables as $table) { + $sth = $this->pdo->prepare( + "SELECT COUNT(*) FROM `$table` + WHERE company_id = :company_id + AND product_sku = :sku" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':sku' => $sku, + ]); + if ($sth->fetchColumn() > 0) { + return $table; + } + } + + return null; + } + + /** + * Build a log entry array for audit context. + */ + private function buildLogEntry(string $action): array { + return [ + 'user_id' => $_SESSION['login_user_id'] ?? null, + 'dt' => date('Y-m-d H:i:s'), + 'login' => isset($_SESSION['otpTime']) + ? date('Y-m-d H:i:s', $_SESSION['otpTime']) + : null, + 'action' => $action, + ]; + } + + // ───────────────────────────────────────────────────────────── + // Product category + // ───────────────────────────────────────────────────────────── + + /** + * Soft-delete a product category. + * + * Blocks if any md_product references this category. + * + * @throws Exception if category not found or has dependent products + */ + public function deleteCategory(int $category_id): void { + + $sth = $this->pdo->prepare( + "SELECT id, category, `log` FROM md_product_category + WHERE company_id = :company_id AND id = :id" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':id' => $category_id, + ]); + $row = $sth->fetch(PDO::FETCH_ASSOC); + + if (!$row) { + throw new Exception("Product category not found."); + } + + // Block if any product references this category + $sth = $this->pdo->prepare( + "SELECT COUNT(*) FROM md_product + WHERE company_id = :company_id + AND category = :category_id" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':category_id' => $category_id, + ]); + + if ($sth->fetchColumn() > 0) { + throw new Exception( + "Cannot delete — category \"{$row['category']}\" " . + "still has products assigned to it." + ); + } + + // Append delete event to log + $log = json_decode($row['log'] ?? '[]', true) ?: []; + $log[] = $this->buildLogEntry('delete'); + + // Soft-delete + $this->pdo->prepare( + "UPDATE md_product_category + SET company_id = company_id * -1, + `log` = :log + WHERE id = :id AND company_id = :company_id" + )->execute([ + ':log' => json_encode($log), + ':id' => $category_id, + ':company_id' => $this->company_id, + ]); + } + + // ───────────────────────────────────────────────────────────── + // Product + // ───────────────────────────────────────────────────────────── + + /** + * Soft-delete a product. + * + * Blocks if the product SKU has any active stock across any td_stock_* table. + * + * @throws Exception if product not found or has active stock + */ + public function deleteProduct(int $product_id): void { + + $sth = $this->pdo->prepare( + "SELECT id, product_name, sku, `log` FROM md_product + WHERE company_id = :company_id AND id = :id" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':id' => $product_id, + ]); + $row = $sth->fetch(PDO::FETCH_ASSOC); + + if (!$row) { + throw new Exception("Product not found."); + } + + // Block if active stock exists for this SKU in any warehouse + $blocking_table = $this->findActiveStock($row['sku']); + if ($blocking_table !== null) { + throw new Exception( + "Cannot delete — \"{$row['product_name']}\" " . + "still has active stock in the system." + ); + } + + // Append delete event to log + $log = json_decode($row['log'] ?? '[]', true) ?: []; + $log[] = $this->buildLogEntry('delete'); + + // Soft-delete + $this->pdo->prepare( + "UPDATE md_product + SET company_id = company_id * -1, + `log` = :log + WHERE id = :id AND company_id = :company_id" + )->execute([ + ':log' => json_encode($log), + ':id' => $product_id, + ':company_id' => $this->company_id, + ]); + } +} \ No newline at end of file diff --git a/app/assets/utils/classes/WarehouseManager.php b/app/assets/utils/classes/WarehouseManager.php index e06656b..76ff906 100644 --- a/app/assets/utils/classes/WarehouseManager.php +++ b/app/assets/utils/classes/WarehouseManager.php @@ -125,8 +125,22 @@ class WarehouseManager { */ public function syncRacks(int $storage_id, array $range): void { + // Guard: refuse if any rack under this storage_id is still occupied $this->validateRangeChange($storage_id, $range); - $this->removeRacksOutsideRange($storage_id, $range); + + // Wipe all empty racks belonging to this storage_id + $sql = "DELETE FROM md_rack + WHERE company_id = :company_id + AND storage_id = :storage_id + AND product_sku IS NULL"; + + $sth = $this->pdo->prepare($sql); + $sth->execute([ + ':company_id' => $this->company_id, + ':storage_id' => $storage_id, + ]); + + // Reinsert the full range fresh $this->insertRacksInRange($storage_id, $range); } @@ -161,32 +175,6 @@ class WarehouseManager { } } - /** - * Delete empty racks that fall outside the new range. - */ - private function removeRacksOutsideRange(int $storage_id, array $range): void { - - $sql = "DELETE FROM md_rack - WHERE company_id = :company_id - AND storage_id = :storage_id - AND ( - CAST(aisle AS UNSIGNED) < :aisle_from OR - CAST(aisle AS UNSIGNED) > :aisle_to OR - CAST(rack AS UNSIGNED) < :rack_from OR - CAST(rack AS UNSIGNED) > :rack_to - )"; - - $sth = $this->pdo->prepare($sql); - $sth->execute([ - ":company_id" => $this->company_id, - ":storage_id" => $storage_id, - ":aisle_from" => (int) $range['aisle_from'], - ":aisle_to" => (int) $range['aisle_to'], - ":rack_from" => (int) $range['rack_from'], - ":rack_to" => (int) $range['rack_to'], - ]); - } - /** * Insert rack rows for the full range (IGNORE skips duplicates). */ @@ -266,24 +254,30 @@ class WarehouseManager { // ───────────────────────────────────────────────────────────── /** - * Build a log JSON by appending an action entry to an existing md_rack.log. - * Entry captures user_id, dt (now), and login (session start) for audit context, + * Insert a log entry into md_rack_log for the given rack and action. + * Captures user_id, dt (now), and login (session start) for audit context, * plus any action-specific fields passed via $extra. */ - private function buildRackLog(?string $existing_log, string $action, array $extra = []): string { + private function insertRackLog(int $rack_id, string $action, array $extra = []): void { - $log = json_decode($existing_log ?: '[]', true) ?: []; + $sql = "INSERT INTO md_rack_log + (company_id, md_rack_id, user_id, dt, login, action, product_sku, td_stock_id) + VALUES + (:company_id, :md_rack_id, :user_id, :dt, :login, :action, :product_sku, :td_stock_id)"; - $log[] = array_merge([ - 'user_id' => $_SESSION['login_user_id'] ?? null, - 'dt' => date('Y-m-d H:i:s'), - 'login' => isset($_SESSION['otpTime']) - ? date('Y-m-d H:i:s', $_SESSION['otpTime']) - : null, - 'action' => $action, - ], $extra); - - return json_encode($log, JSON_UNESCAPED_UNICODE); + $sth = $this->pdo->prepare($sql); + $sth->execute([ + ':company_id' => $this->company_id, + ':md_rack_id' => $rack_id, + ':user_id' => $_SESSION['login_user_id'] ?? null, + ':dt' => date('Y-m-d H:i:s'), + ':login' => isset($_SESSION['otpTime']) + ? date('Y-m-d H:i:s', $_SESSION['otpTime']) + : null, + ':action' => $action, + ':product_sku' => $extra['product_sku'] ?? null, + ':td_stock_id' => $extra['td_stock_id'] ?? null, + ]); } /** @@ -296,8 +290,8 @@ class WarehouseManager { */ public function occupyRack($warehouse_id, $zone, $aisle, $rack, $product_sku, $td_stock_id): void { - // Lock and fetch current state (including log for in-place append) - $sql = "SELECT id, product_sku, `log` FROM md_rack + + $sql = "SELECT id, product_sku FROM md_rack WHERE company_id = :company_id AND warehouse = :warehouse AND zone = :zone @@ -328,20 +322,20 @@ class WarehouseManager { // Single atomic UPDATE: state + log together $sql = "UPDATE md_rack SET product_sku = :product_sku, - td_stock_id = :td_stock_id, - `log` = :log + td_stock_id = :td_stock_id WHERE id = :id"; $sth = $this->pdo->prepare($sql); $sth->execute([ ":product_sku" => $product_sku, ":td_stock_id" => $td_stock_id, - ":log" => $this->buildRackLog($current['log'], 'occupy', [ - 'product_sku' => $product_sku, - 'td_stock_id' => $td_stock_id, - ]), ":id" => $current['id'], ]); + + $this->insertRackLog($current['id'], 'occupy', [ + 'product_sku' => $product_sku, + 'td_stock_id' => $td_stock_id, + ]); } /** @@ -349,8 +343,8 @@ class WarehouseManager { */ public function releaseRack($warehouse_id, $zone, $aisle, $rack): void { - // Fetch current state + log (needed to append release event) - $sql = "SELECT id, product_sku, td_stock_id, `log` FROM md_rack + + $sql = "SELECT id, product_sku, td_stock_id FROM md_rack WHERE company_id = :company_id AND warehouse = :warehouse AND zone = :zone @@ -376,18 +370,18 @@ class WarehouseManager { // Clear state + record log in one UPDATE $sql = "UPDATE md_rack SET product_sku = NULL, - td_stock_id = NULL, - `log` = :log + td_stock_id = NULL WHERE id = :id"; $sth = $this->pdo->prepare($sql); $sth->execute([ - ":log" => $this->buildRackLog($current['log'], 'release', [ - 'product_sku' => $current['product_sku'], - 'td_stock_id' => $current['td_stock_id'], - ]), ":id" => $current['id'], ]); + + $this->insertRackLog($current['id'], 'release', [ + 'product_sku' => $current['product_sku'], + 'td_stock_id' => $current['td_stock_id'], + ]); } /** @@ -403,7 +397,7 @@ class WarehouseManager { ): void { // Fetch both racks with FOR UPDATE, ordered by id to prevent deadlocks - $sql = "SELECT id, warehouse, zone, aisle, rack, product_sku, td_stock_id, `log` + $sql = "SELECT id, warehouse, zone, aisle, rack, product_sku, td_stock_id FROM md_rack WHERE company_id = :company_id AND ( @@ -464,32 +458,443 @@ class WarehouseManager { // Clear source — state + log in one UPDATE $sql = "UPDATE md_rack - SET product_sku = NULL, td_stock_id = NULL, `log` = :log + SET product_sku = NULL, td_stock_id = NULL WHERE id = :id"; $this->pdo->prepare($sql)->execute([ - ":log" => $this->buildRackLog($from['log'], 'transfer_out', [ - 'product_sku' => $sku, - 'td_stock_id' => $td_stock_id, - 'to_rack_id' => $to['id'], - ]), ":id" => $from['id'], ]); + $this->insertRackLog($from['id'], 'transfer_out', [ + 'product_sku' => $sku, + 'td_stock_id' => $td_stock_id, + ]); + // Populate destination — state + log in one UPDATE $sql = "UPDATE md_rack - SET product_sku = :sku, td_stock_id = :td_stock_id, `log` = :log + SET product_sku = :sku, td_stock_id = :td_stock_id WHERE id = :id"; $this->pdo->prepare($sql)->execute([ ":sku" => $sku, ":td_stock_id" => $td_stock_id, - ":log" => $this->buildRackLog($to['log'], 'transfer_in', [ - 'product_sku' => $sku, - 'td_stock_id' => $td_stock_id, - 'from_rack_id' => $from['id'], - ]), ":id" => $to['id'], ]); + + $this->insertRackLog($to['id'], 'transfer_in', [ + 'product_sku' => $sku, + 'td_stock_id' => $td_stock_id, + ]); } + + + // ───────────────────────────────────────────────────────────── + // Delete (soft-delete) operations + // ───────────────────────────────────────────────────────────── + + /** + * Validate that a given row is the latest transaction for its SKU in the table. + * Throws a descriptive exception if a newer transaction exists. + * + * @param string $product_sku SKU to check + * @param string $row_date The date of the row being deleted + * @param string $product_name Human-readable product name for error message + * @throws Exception if a newer transaction exists + */ + private function validateLatestTransaction( + string $product_sku, + string $row_date, + string $product_name + ): void { + + // Discover all td_stock_* tables for this database + $sth = $this->pdo->prepare( + "SELECT table_name FROM information_schema.tables + WHERE table_schema = DATABASE() + AND table_name LIKE 'td_stock_%'" + ); + $sth->execute(); + $tables = $sth->fetchAll(PDO::FETCH_COLUMN); + + if (empty($tables)) { + return; + } + + // Build UNION across all td_stock_* tables to find global MAX(date) + $unions = implode(' UNION ALL ', array_map( + fn($t) => "SELECT `type`, `date` FROM `$t` + WHERE company_id = :company_id + AND product_sku = :product_sku", + $tables + )); + + $sth = $this->pdo->prepare( + "SELECT `type`, `date` FROM ($unions) AS all_stock + ORDER BY `date` DESC + LIMIT 1" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':product_sku' => $product_sku, + ]); + $latest = $sth->fetch(PDO::FETCH_ASSOC); + + if (!$latest || $row_date === $latest['date']) { + return; // ✓ this is the latest globally — allow + } + + $type = strtoupper($latest['type']); + $date = $latest['date']; + + throw new Exception( + "Cannot delete — \"{$product_name}\" has a newer " . + "{$type} transaction on {$date} that must be deleted first." + ); + } + + /** + * Helper to build a log entry with consistent user and timestamp info for warehouse operations. + */ + private function buildLogEntry(string $action): array { + return [ + 'user_id' => $_SESSION['login_user_id'] ?? null, + 'dt' => date('Y-m-d H:i:s'), + 'login' => isset($_SESSION['otpTime']) + ? date('Y-m-d H:i:s', $_SESSION['otpTime']) + : null, + 'action' => $action, + ]; + } + + /** + * Resolve product name from md_product for readable error messages. + */ + private function getProductName(string $product_sku): string { + + $sth = $this->pdo->prepare( + "SELECT product_name FROM md_product + WHERE company_id = :company_id AND sku = :sku" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':sku' => $product_sku, + ]); + return $sth->fetchColumn() ?: $product_sku; + } + + /** + * Soft-delete a stock_in record and reverse its side effects. + * + * - Validates this is the latest transaction for the SKU + * - Negates company_id (soft-delete) + * - Releases the rack + * - Reverses the balance + * + * Must be called inside a DB transaction by the caller. + * + * @throws Exception if not the latest transaction or record not found + */ + public function deleteStockIn(int $stock_id, int $warehouse_id): void { + + $ctx = $this->getStockContext($warehouse_id, $stock_id); + $table = $ctx['table']; + $row = $ctx['row']; + + if (!$row) { + throw new Exception("Stock in record not found."); + } + + $product_sku = $row['product_sku']; + $product_name = $this->getProductName($product_sku); + + $this->validateLatestTransaction($product_sku, $row['date'], $product_name); + + // Soft-delete + $this->pdo->prepare( + "UPDATE `$table` + SET company_id = company_id * -1 + WHERE id = :id AND company_id = :company_id" + )->execute([':id' => $stock_id, ':company_id' => $this->company_id]); + + // Release the rack + $this->releaseRack($warehouse_id, $row['zone'], $row['aisle'], $row['rack']); + + // Reverse balance + $this->adjustBalance('in', $warehouse_id, $product_sku, (int)$row['in'], 0); + } + + /** + * Soft-delete a stock_out record and reverse its side effects. + * + * - Validates this is the latest transaction for the SKU + * - Negates company_id (soft-delete) + * - Re-occupies the rack with the original stock_in batch (via ref_id) + * - Reverses the balance + * + * Must be called inside a DB transaction by the caller. + * + * @throws Exception if not the latest transaction or record not found + */ + public function deleteStockOut(int $stock_id, int $warehouse_id): void { + + $ctx = $this->getStockContext($warehouse_id, $stock_id); + $table = $ctx['table']; + $row = $ctx['row']; + + if (!$row) { + throw new Exception("Stock out record not found."); + } + + $product_sku = $row['product_sku']; + $product_name = $this->getProductName($product_sku); + + $this->validateLatestTransaction($product_sku, $row['date'], $product_name); + + // Soft-delete + $this->pdo->prepare( + "UPDATE `$table` + SET company_id = company_id * -1 + WHERE id = :id AND company_id = :company_id" + )->execute([':id' => $stock_id, ':company_id' => $this->company_id]); + + // Re-occupy the rack — restore the stock_in batch that was consumed + $this->occupyRack( + $warehouse_id, + $row['zone'], $row['aisle'], $row['rack'], + $product_sku, + (int)$row['ref_id'] + ); + + // Reverse balance + $this->adjustBalance('out', $warehouse_id, $product_sku, (int)$row['out'], 0); + } + + /** + * Soft-delete a transfer record pair and reverse all side effects. + * + * - Validates this is the latest transaction for the SKU on BOTH warehouses + * - Negates company_id on both rows (soft-delete) + * - Releases destination rack, re-occupies source rack + * - Reverses balances on both warehouses + * + * Must be called inside a DB transaction by the caller. + * + * @throws Exception if not the latest transaction on either side, or records not found + */ + public function deleteTransfer(int $from_stock_id, int $from_warehouse_id): void { + + // Fetch the "from" row (transfer_out side) + $from_ctx = $this->getStockContext($from_warehouse_id, $from_stock_id); + $from_table = $from_ctx['table']; + $from_row = $from_ctx['row']; + + if (!$from_row || $from_row['type'] !== 'transfer') { + throw new Exception("Transfer record not found."); + } + + $product_sku = $from_row['product_sku']; + $product_name = $this->getProductName($product_sku); + $to_warehouse = (int)$from_row['ref_warehouse']; + $ref_id = (int)$from_row['ref_id']; + + // Fetch the "to" row (transfer_in side) + $to_ctx = $this->getStockContext($to_warehouse, $ref_id); + $to_row = $to_ctx['row']; + + if (!$to_row) { + throw new Exception("Paired destination record missing — data integrity issue."); + } + + // Single global validation covers both warehouses + $this->validateLatestTransaction($product_sku, $from_row['date'], $product_name); + + // Soft-delete both rows + $this->pdo->prepare( + "UPDATE `$from_table` + SET company_id = company_id * -1 + WHERE id = :id AND company_id = :company_id" + )->execute([':id' => $from_stock_id, ':company_id' => $this->company_id]); + + $this->pdo->prepare( + "UPDATE `{$to_ctx['table']}` + SET company_id = company_id * -1 + WHERE id = :id AND company_id = :company_id" + )->execute([':id' => $ref_id, ':company_id' => $this->company_id]); + + // Destination rack was occupied by transfer_in — release it + $this->releaseRack( + $to_warehouse, + $to_row['zone'], $to_row['aisle'], $to_row['rack'] + ); + + // Source rack was released by transfer_out — re-occupy with original batch + $this->occupyRack( + $from_warehouse_id, + $from_row['zone'], $from_row['aisle'], $from_row['rack'], + $product_sku, + $from_stock_id + ); + + // Reverse balances + $quantity = (int)$from_row['out']; + $this->adjustBalance('out', $from_warehouse_id, $product_sku, $quantity, 0); + $this->adjustBalance('in', $to_warehouse, $product_sku, $quantity, 0); + } + + /** + * Soft-delete a warehouse. + * + * Blocks if any md_storage references this warehouse by name. + * + * Must be called inside a DB transaction by the caller. + * + * @throws Exception if warehouse not found or has dependent storage + */ + public function deleteWarehouse(int $warehouse_id): void { + + $sth = $this->pdo->prepare( + "SELECT id, warehouse_name, `log` FROM md_warehouse + WHERE company_id = :company_id AND id = :id" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':id' => $warehouse_id, + ]); + $row = $sth->fetch(PDO::FETCH_ASSOC); + + if (!$row) { + throw new Exception("Warehouse not found."); + } + + // Block if any md_storage references this warehouse by name + $sth = $this->pdo->prepare( + "SELECT COUNT(*) FROM md_storage + WHERE company_id = :company_id + AND warehouse = :warehouse_name" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':warehouse_name' => $row['warehouse_name'], + ]); + + if ($sth->fetchColumn() > 0) { + throw new Exception( + "Cannot delete — warehouse \"{$row['warehouse_name']}\" " . + "still has storage locations assigned to it." + ); + } + + // Append delete event to log + $log = json_decode($row['log'] ?? '[]', true) ?: []; + $log[] = $this->buildLogEntry('delete'); + + // Soft-delete + $this->pdo->prepare( + "UPDATE md_warehouse + SET company_id = company_id * -1, + `log` = :log + WHERE id = :id AND company_id = :company_id" + )->execute([ + ':log' => json_encode($log), + ':id' => $warehouse_id, + ':company_id' => $this->company_id, + ]); + } + + + /** + * Soft-delete a storage record and its associated racks. + * + * - Blocks if any md_rack under this storage_id is occupied + * - Hard-deletes md_rack_log rows for those racks + * - Soft-deletes all md_rack rows under this storage_id + * - Soft-deletes md_storage + * + * Must be called inside a DB transaction by the caller. + * + * @throws Exception if storage not found or has occupied racks + */ + public function deleteStorage(int $storage_id): void { + + $sth = $this->pdo->prepare( + "SELECT id, zone, `log` FROM md_storage + WHERE company_id = :company_id AND id = :id" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':id' => $storage_id, + ]); + $row = $sth->fetch(PDO::FETCH_ASSOC); + + if (!$row) { + throw new Exception("Storage not found."); + } + + // Block if any rack under this storage is occupied + $sth = $this->pdo->prepare( + "SELECT COUNT(*) FROM md_rack + WHERE company_id = :company_id + AND storage_id = :storage_id + AND product_sku IS NOT NULL" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':storage_id' => $storage_id, + ]); + + if ($sth->fetchColumn() > 0) { + throw new Exception( + "Cannot delete — storage zone \"{$row['zone']}\" " . + "still has occupied racks with stock." + ); + } + + // Collect rack IDs before deleting — needed for rack log cleanup + $sth = $this->pdo->prepare( + "SELECT id FROM md_rack + WHERE company_id = :company_id + AND storage_id = :storage_id" + ); + $sth->execute([ + ':company_id' => $this->company_id, + ':storage_id' => $storage_id, + ]); + $rack_ids = $sth->fetchAll(PDO::FETCH_COLUMN); + + // Hard-delete md_rack_log for these racks + if (!empty($rack_ids)) { + $placeholders = implode(',', array_fill(0, count($rack_ids), '?')); + $this->pdo->prepare( + "DELETE FROM md_rack_log WHERE md_rack_id IN ($placeholders)" + )->execute($rack_ids); + } + + // Soft-delete all md_rack rows under this storage + $this->pdo->prepare( + "UPDATE md_rack + SET company_id = company_id * -1 + WHERE company_id = :company_id + AND storage_id = :storage_id" + )->execute([ + ':company_id' => $this->company_id, + ':storage_id' => $storage_id, + ]); + + // Append delete event to log + $log = json_decode($row['log'] ?? '[]', true) ?: []; + $log[] = $this->buildLogEntry('delete'); + + // Soft-delete md_storage + $this->pdo->prepare( + "UPDATE md_storage + SET company_id = company_id * -1, + `log` = :log + WHERE id = :id AND company_id = :company_id" + )->execute([ + ':log' => json_encode($log), + ':id' => $storage_id, + ':company_id' => $this->company_id, + ]); + } + } ?> \ No newline at end of file diff --git a/app/contact/api/engine/remove_contact.php b/app/contact/api/engine/remove_contact.php new file mode 100644 index 0000000..28dc3c9 --- /dev/null +++ b/app/contact/api/engine/remove_contact.php @@ -0,0 +1,29 @@ +deleteContact((int)$data['id']); + + }); + + $answer["success"] = 1; + + } catch (PDOException $e) { + $answer["success"] = 0; + $answer["message"] = "Database error, please try again"; + http_response_code(500); + + } catch (Exception $e) { + $answer["success"] = 0; + $answer["message"] = $e->getMessage(); + http_response_code(400); + } + + exit(json_encode($answer)); +?> \ No newline at end of file diff --git a/app/contact/api/engine/remove_contact_type.php b/app/contact/api/engine/remove_contact_type.php new file mode 100644 index 0000000..6e89e9e --- /dev/null +++ b/app/contact/api/engine/remove_contact_type.php @@ -0,0 +1,29 @@ +deleteContactType((int)$data['id']); + + }); + + $answer["success"] = 1; + + } catch (PDOException $e) { + $answer["success"] = 0; + $answer["message"] = "Database error, please try again"; + http_response_code(500); + + } catch (Exception $e) { + $answer["success"] = 0; + $answer["message"] = $e->getMessage(); + http_response_code(400); + } + + exit(json_encode($answer)); +?> \ No newline at end of file diff --git a/app/contact/contact.php b/app/contact/contact.php index 7db527c..aebf043 100644 --- a/app/contact/contact.php +++ b/app/contact/contact.php @@ -268,7 +268,7 @@ - + `; }) @@ -331,7 +331,7 @@ - + `; }) @@ -340,6 +340,48 @@ } + + function remove_contact_type(id,element) { + + return ajax_request({ + url: "contact/api/engine/remove_contact_type.php", + autoPrepare: true, + checkRequired: 0, + debugMode: 0, + data: { + id: id + }, + action: 'delete', + onSuccess: function(res) { + + element.parent().parent().remove(); + + } + }); + + } + + + function remove_contact(id,element) { + + return ajax_request({ + url: "contact/api/engine/remove_contact.php", + autoPrepare: true, + checkRequired: 0, + debugMode: 0, + data: { + id: id + }, + action: 'delete', + onSuccess: function(res) { + + element.parent().parent().remove(); + + } + }); + + } + $(async function() { try { await retrieve_contact_type(); diff --git a/app/ics/api/engine/delete_stock_in.php b/app/ics/api/engine/delete_stock_in.php new file mode 100644 index 0000000..d4e2bbb --- /dev/null +++ b/app/ics/api/engine/delete_stock_in.php @@ -0,0 +1,32 @@ +deleteStockIn( + (int)$data['id'], + (int)$data['wh'] + ); + + }); + + $answer["success"] = 1; + + } catch (PDOException $e) { + $answer["success"] = 0; + $answer["message"] = "Database error, please try again"; + http_response_code(500); + + } catch (Exception $e) { + $answer["success"] = 0; + $answer["message"] = $e->getMessage(); + http_response_code(400); + } + + exit(json_encode($answer)); +?> \ No newline at end of file diff --git a/app/ics/api/engine/delete_stock_out.php b/app/ics/api/engine/delete_stock_out.php new file mode 100644 index 0000000..2f19b97 --- /dev/null +++ b/app/ics/api/engine/delete_stock_out.php @@ -0,0 +1,32 @@ +deleteStockOut( + (int)$data['id'], + (int)$data['wh'] + ); + + }); + + $answer["success"] = 1; + + } catch (PDOException $e) { + $answer["success"] = 0; + $answer["message"] = "Database error, please try again"; + http_response_code(500); + + } catch (Exception $e) { + $answer["success"] = 0; + $answer["message"] = $e->getMessage(); + http_response_code(400); + } + + exit(json_encode($answer)); +?> \ No newline at end of file diff --git a/app/ics/api/engine/delete_stock_transfer.php b/app/ics/api/engine/delete_stock_transfer.php new file mode 100644 index 0000000..c211a84 --- /dev/null +++ b/app/ics/api/engine/delete_stock_transfer.php @@ -0,0 +1,32 @@ +deleteTransfer( + (int)$data['id'], + (int)$data['wh'] + ); + + }); + + $answer["success"] = 1; + + } catch (PDOException $e) { + $answer["success"] = 0; + $answer["message"] = "Database error, please try again"; + http_response_code(500); + + } catch (Exception $e) { + $answer["success"] = 0; + $answer["message"] = $e->getMessage(); + http_response_code(400); + } + + exit(json_encode($answer)); +?> \ No newline at end of file diff --git a/app/ics/api/engine/manage_stock_in.php b/app/ics/api/engine/manage_stock_in.php index 4558a06..77564b3 100644 --- a/app/ics/api/engine/manage_stock_in.php +++ b/app/ics/api/engine/manage_stock_in.php @@ -24,11 +24,6 @@ // UPDATE existing stock_in record $sql = "UPDATE `$table` SET - `product_sku` = :product_sku, - `in` = :quantity, - `zone` = :zone, - `aisle` = :aisle, - `rack` = :rack, `contact_id` = :contact_id, `description` = :description, `log` = :log @@ -38,41 +33,12 @@ $sth->execute([ ":id" => $id, ":company_id" => $company_id, - ":product_sku" => $data["product_sku"], - ":quantity" => $data["quantity"], - ":zone" => $data["zone"], - ":aisle" => $data["aisle"], - ":rack" => $data["rack"], ":contact_id" => (int)$data["contact_id"], ":description" => $data["description"], ":log" => json_encode($table_log), ]); - // On UPDATE, td_stock_id stays the same (this record's ID) - $td_stock_id = $id; - // Only touch md_rack if the physical location actually changed. - // Skipping when unchanged avoids redundant log entries and release/occupy cycles. - $rack_changed = ( - ($row['zone'] ?? '') != $data['zone'] || - ($row['aisle'] ?? '') != $data['aisle'] || - ($row['rack'] ?? '') != $data['rack'] - ); - - if ($rack_changed) { - // Free up the old rack - $whMgmt->releaseRack( - $warehouse_id, - $row['zone'], $row['aisle'], $row['rack'] - ); - // Claim the new rack, linked to the same stock record - $whMgmt->occupyRack( - $warehouse_id, - $data['zone'], $data['aisle'], $data['rack'], - $data['product_sku'], - $td_stock_id - ); - } } else { @@ -107,17 +73,17 @@ $data['product_sku'], $td_stock_id ); - } + // Balance adjustment handles both INSERT (delta = full qty) + // and UPDATE (delta = new - old) via the same formula. + $whMgmt->adjustBalance( + 'in', + $warehouse_id, + $data["product_sku"], + $row['in'] ?? 0, + $data["quantity"] + ); - // Balance adjustment handles both INSERT (delta = full qty) - // and UPDATE (delta = new - old) via the same formula. - $whMgmt->adjustBalance( - 'in', - $warehouse_id, - $data["product_sku"], - $row['in'] ?? 0, - $data["quantity"] - ); + } }); diff --git a/app/ics/api/engine/manage_stock_out.php b/app/ics/api/engine/manage_stock_out.php index b8e4d68..705ca13 100644 --- a/app/ics/api/engine/manage_stock_out.php +++ b/app/ics/api/engine/manage_stock_out.php @@ -19,42 +19,10 @@ $table_log = json_decode($row['log'] ?? '[]', true); $table_log[] = $logging; - // Look up the source stock record via the rack. - // Under 1:1, the rack points to exactly one td_stock_ row. - $source_stock = $whMgmt->getRackStock( - $warehouse_id, - $data["zone"], - $data["aisle"], - $data["rack"] - ); - - if (!$source_stock) { - throw new Exception( - "Rack {$data['zone']}-{$data['aisle']}-{$data['rack']} is empty — nothing to take out." - ); - } - - // Defensive check — UI cascade should already prevent mismatches - if ($source_stock['product_sku'] !== $data["product_sku"]) { - throw new Exception( - "Rack holds {$source_stock['product_sku']}, not {$data['product_sku']}." - ); - } - - // Quantity comes from the source stock_in row, NOT user input. - // Under 1:1, taking from this rack = taking the full batch. - $quantity = (int) $source_stock['in']; - $ref_id = (int) $source_stock['id']; - if ($id > 0) { // UPDATE existing stock_out record $sql = "UPDATE `$table` SET - `product_sku` = :product_sku, - `out` = :quantity, - `zone` = :zone, - `aisle` = :aisle, - `rack` = :rack, `contact_id` = :contact_id, `description` = :description, `log` = :log @@ -64,41 +32,39 @@ $sth->execute([ ":id" => $id, ":company_id" => $company_id, - ":product_sku" => $data["product_sku"], - ":quantity" => $quantity, - ":zone" => $data["zone"], - ":aisle" => $data["aisle"], - ":rack" => $data["rack"], ":contact_id" => (int)$data["contact_id"], ":description" => $data["description"], ":log" => json_encode($table_log), ]); - // Only touch md_rack if the physical location actually changed. - $rack_changed = ( - ($row['zone'] ?? '') != $data['zone'] || - ($row['aisle'] ?? '') != $data['aisle'] || - ($row['rack'] ?? '') != $data['rack'] + } else { + + // Look up the source stock record via the rack. + // Under 1:1, the rack points to exactly one td_stock_ row. + $source_stock = $whMgmt->getRackStock( + $warehouse_id, + $data["zone"], + $data["aisle"], + $data["rack"] ); - if ($rack_changed) { - // Re-occupy the old rack with the batch it originally held - // (logically: the stock goes back to where it came from) - $whMgmt->occupyRack( - $warehouse_id, - $row['zone'], $row['aisle'], $row['rack'], - $row['product_sku'], - $row['ref_id'] ?? null - ); - - // Release the new rack (the real stock-out action) - $whMgmt->releaseRack( - $warehouse_id, - $data['zone'], $data['aisle'], $data['rack'] + if (!$source_stock) { + throw new Exception( + "Rack {$data['zone']}-{$data['aisle']}-{$data['rack']} is empty — nothing to take out." ); } - } else { + // Defensive check — UI cascade should already prevent mismatches + if ($source_stock['product_sku'] !== $data["product_sku"]) { + throw new Exception( + "Rack holds {$source_stock['product_sku']}, not {$data['product_sku']}." + ); + } + + // Quantity comes from the source stock_in row, NOT user input. + // Under 1:1, taking from this rack = taking the full batch. + $quantity = (int) $source_stock['in']; + $ref_id = (int) $source_stock['id']; // INSERT new stock_out record. // ref_id links this stock_out row back to the stock_in batch it consumed. @@ -130,18 +96,18 @@ $warehouse_id, $data["zone"], $data["aisle"], $data["rack"] ); - } + // Balance: total_out increases by delta. + // INSERT: $row['out'] = 0 → delta = full quantity + // UPDATE: $row['out'] = old → delta = new - old + $whMgmt->adjustBalance( + 'out', + $warehouse_id, + $data["product_sku"], + $row['out'] ?? 0, + $quantity + ); - // Balance: total_out increases by delta. - // INSERT: $row['out'] = 0 → delta = full quantity - // UPDATE: $row['out'] = old → delta = new - old - $whMgmt->adjustBalance( - 'out', - $warehouse_id, - $data["product_sku"], - $row['out'] ?? 0, - $quantity - ); + } }); diff --git a/app/ics/api/engine/retrieve_stock_in.php b/app/ics/api/engine/retrieve_stock_in.php index b2add0f..c66cf06 100644 --- a/app/ics/api/engine/retrieve_stock_in.php +++ b/app/ics/api/engine/retrieve_stock_in.php @@ -31,7 +31,7 @@ a.company_id = b.company_id and a.contact_id = b.id LEFT JOIN md_product c ON - a.company_id = b.company_id and + a.company_id = c.company_id and a.product_sku = c.sku WHERE a.company_id = :company_id and diff --git a/app/ics/api/engine/retrieve_stock_out.php b/app/ics/api/engine/retrieve_stock_out.php index 40e359d..68b43b5 100644 --- a/app/ics/api/engine/retrieve_stock_out.php +++ b/app/ics/api/engine/retrieve_stock_out.php @@ -31,7 +31,7 @@ a.company_id = b.company_id and a.contact_id = b.id LEFT JOIN md_product c ON - a.company_id = b.company_id and + a.company_id = c.company_id and a.product_sku = c.sku WHERE a.company_id = :company_id and diff --git a/app/ics/manage_stock_in.php b/app/ics/manage_stock_in.php index 8425248..35f210e 100644 --- a/app/ics/manage_stock_in.php +++ b/app/ics/manage_stock_in.php @@ -273,6 +273,8 @@ $('#product_name').val(data.product_name); $('#product_sku').attr('secondary', data.product_sku); + $('#product_sku,#quantity').prop('disabled', true); + $(`button[type=submit]`).text('Update'); $(`button[type=reset]`).hide(); diff --git a/app/ics/manage_stock_out.php b/app/ics/manage_stock_out.php index 40383b7..8f6293b 100644 --- a/app/ics/manage_stock_out.php +++ b/app/ics/manage_stock_out.php @@ -271,6 +271,8 @@ $('#product_name').val(data.product_name); $('#product_sku').attr('secondary', data.product_sku); + $('#product_sku,#quantity').prop('disabled', true); + $(`button[type=submit]`).text('Update'); $(`button[type=reset]`).hide(); diff --git a/app/ics/manage_stock_transfer.php b/app/ics/manage_stock_transfer.php index 4e4ed1d..1376d8d 100644 --- a/app/ics/manage_stock_transfer.php +++ b/app/ics/manage_stock_transfer.php @@ -344,10 +344,12 @@ $('#contact').val(data.contact_name) .attr('secondary', data.contact_name) .attr('data-id', data.contact_id); - console.log(data); + $('#product_name').val(data.product_name); $('#product_sku').attr('secondary', data.product_sku); + $('#product_sku,#quantity').prop('disabled', true); + $(`button[type=submit]`).text('Update'); $(`button[type=reset]`).hide(); diff --git a/app/ics/stock_in.php b/app/ics/stock_in.php index 34fc53f..0e3c27a 100644 --- a/app/ics/stock_in.php +++ b/app/ics/stock_in.php @@ -133,7 +133,10 @@ - + + + `; }) @@ -162,6 +165,24 @@ } + function delete_stock_in(element, id) { + + return ajax_request({ + url: "ics/api/engine/delete_stock_in.php", + autoPrepare: true, + checkRequired: 0, + action: 'delete', + data : { + id: id, + wh: $(`select#warehouse`).val() + }, + onSuccess: function(res) { + element.closest('tr').remove(); + } + }); + + } + $(async function() { try { await retrieve_warehouse(); diff --git a/app/ics/stock_out.php b/app/ics/stock_out.php index 2883583..0c30699 100644 --- a/app/ics/stock_out.php +++ b/app/ics/stock_out.php @@ -133,7 +133,10 @@ - + + + `; }) @@ -162,6 +165,24 @@ } + function delete_stock_out(element, id) { + + return ajax_request({ + url: "ics/api/engine/delete_stock_out.php", + autoPrepare: true, + checkRequired: 0, + action: 'delete', + data : { + id: id, + wh: $(`select#warehouse`).val() + }, + onSuccess: function(res) { + element.closest('tr').remove(); + } + }); + + } + $(async function() { try { await retrieve_warehouse(); diff --git a/app/ics/stock_transfer.php b/app/ics/stock_transfer.php index 9a6a685..c1b3458 100644 --- a/app/ics/stock_transfer.php +++ b/app/ics/stock_transfer.php @@ -133,7 +133,10 @@ - + + + `; }) @@ -162,6 +165,26 @@ } + + + function delete_stock_transfer(element, id) { + + return ajax_request({ + url: "ics/api/engine/delete_stock_transfer.php", + autoPrepare: true, + checkRequired: 0, + action: 'delete', + data : { + id: id, + wh: $(`select#warehouse`).val() + }, + onSuccess: function(res) { + element.closest('tr').remove(); + } + }); + + } + $(async function() { try { await retrieve_warehouse(); diff --git a/app/inventory/api/engine/remove_category.php b/app/inventory/api/engine/remove_category.php index 0ed6092..27cf4c5 100644 --- a/app/inventory/api/engine/remove_category.php +++ b/app/inventory/api/engine/remove_category.php @@ -1,69 +1,18 @@ -deleteCategory((int)$data['id']); - // 1. Validate: check if category is in use by any product - $sql = "SELECT COUNT(*) - FROM md_product - WHERE company_id = :company_id - AND category = :id"; - $sth = $pdo->prepare($sql); - $sth->execute([ - ":company_id" => $company_id, - ":id" => $id - ]); - - $product_count = (int) $sth->fetchColumn(); - - if ($product_count > 0) { - throw new Exception("Cannot remove category. It is currently used by {$product_count} product(s)."); - } - - // 2. Append to log history - $sql = "SELECT `log` FROM md_product_category - WHERE company_id = :company_id AND id = :id"; - $sth = $pdo->prepare($sql); - $sth->execute([ - ":company_id" => $company_id, - ":id" => $id - ]); - - $table_log = json_decode($sth->fetchColumn() ?: '[]', true); - if (!is_array($table_log)) $table_log = []; - $table_log[] = $logging; - - // 3. Soft-delete via sign flip - $sql = "UPDATE md_product_category - SET company_id = company_id * (-1), - `log` = :log - WHERE company_id = :company_id - AND id = :id"; - $sth = $pdo->prepare($sql); - $sth->execute([ - ":company_id" => $company_id, - ":id" => $id, - ":log" => json_encode($table_log, JSON_UNESCAPED_UNICODE), - ]); - - if ($sth->rowCount() === 0) { - throw new Exception("Category not found or already removed."); - } - - return $id; }); $answer["success"] = 1; - $answer["message"] = "Category removed successfully."; - $answer["id"] = $result; } catch (PDOException $e) { $answer["success"] = 0; diff --git a/app/inventory/api/engine/remove_product.php b/app/inventory/api/engine/remove_product.php new file mode 100644 index 0000000..630337d --- /dev/null +++ b/app/inventory/api/engine/remove_product.php @@ -0,0 +1,29 @@ +deleteProduct((int)$data['id']); + + }); + + $answer["success"] = 1; + + } catch (PDOException $e) { + $answer["success"] = 0; + $answer["message"] = "Database error, please try again"; + http_response_code(500); + + } catch (Exception $e) { + $answer["success"] = 0; + $answer["message"] = $e->getMessage(); + http_response_code(400); + } + + exit(json_encode($answer)); +?> \ No newline at end of file diff --git a/app/inventory/api/engine/remove_storage.php b/app/inventory/api/engine/remove_storage.php new file mode 100644 index 0000000..3e7f336 --- /dev/null +++ b/app/inventory/api/engine/remove_storage.php @@ -0,0 +1,29 @@ +deleteStorage((int)$data['id']); + + }); + + $answer["success"] = 1; + + } catch (PDOException $e) { + $answer["success"] = 0; + $answer["message"] = "Database error, please try again"; + http_response_code(500); + + } catch (Exception $e) { + $answer["success"] = 0; + $answer["message"] = $e->getMessage(); + http_response_code(400); + } + + exit(json_encode($answer)); +?> \ No newline at end of file diff --git a/app/inventory/api/engine/remove_warehouse.php b/app/inventory/api/engine/remove_warehouse.php new file mode 100644 index 0000000..4926d82 --- /dev/null +++ b/app/inventory/api/engine/remove_warehouse.php @@ -0,0 +1,29 @@ +deleteWarehouse((int)$data['id']); + + }); + + $answer["success"] = 1; + + } catch (PDOException $e) { + $answer["success"] = 0; + $answer["message"] = "Database error, please try again"; + http_response_code(500); + + } catch (Exception $e) { + $answer["success"] = 0; + $answer["message"] = $e->getMessage(); + http_response_code(400); + } + + exit(json_encode($answer)); +?> \ No newline at end of file diff --git a/app/inventory/product.php b/app/inventory/product.php index 68b2ea9..aae13d0 100644 --- a/app/inventory/product.php +++ b/app/inventory/product.php @@ -298,6 +298,28 @@ + function remove_product(id,element) { + + return ajax_request({ + url: "inventory/api/engine/remove_product.php", + autoPrepare: true, + checkRequired: 0, + debugMode: 0, + data: { + id: id + }, + action: 'delete', + onSuccess: function(res) { + + element.parent().parent().remove(); + + } + }); + + } + + + function change_page_category(page_num) { var offset = (page_num - 1) * prop_limit; @@ -382,7 +404,7 @@ - + `; }) diff --git a/app/inventory/warehouse.php b/app/inventory/warehouse.php index 666cdaa..58af3aa 100644 --- a/app/inventory/warehouse.php +++ b/app/inventory/warehouse.php @@ -335,7 +335,7 @@ - + `; }) @@ -393,7 +393,7 @@ - + `; }) @@ -402,6 +402,49 @@ } + + function remove_warehouse(id,element) { + + return ajax_request({ + url: "inventory/api/engine/remove_warehouse.php", + autoPrepare: true, + checkRequired: 0, + debugMode: 0, + data: { + id: id + }, + action: 'delete', + onSuccess: function(res) { + + element.parent().parent().remove(); + + } + }); + + } + + + function remove_storage(id,element) { + + return ajax_request({ + url: "inventory/api/engine/remove_storage.php", + autoPrepare: true, + checkRequired: 0, + debugMode: 0, + data: { + id: id + }, + action: 'delete', + onSuccess: function(res) { + + element.parent().parent().remove(); + + } + }); + + } + + $(async function() { try { await retrieve_stats();