pdo = $pdo; } // --- Data Type Management (dsps_tbl_typedatasource) --- /** * Adds a new data type. * * @param string $name_en English name of the data type. * @param string|null $name_kh Khmer name of the data type. * @param int $reg_by User ID who registered it. * @return bool True on success. * @throws Exception If a database error occurs or name already exists. */ public function addDataType(string $name_en, ?string $name_kh, int $reg_by): bool { $sql = "INSERT INTO dsps_tbl_typedatasource (dspstds_name_en, dspstds_name_kh, dspstds_reg_by) VALUES (:name_en, :name_kh, :reg_by)"; try { $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':name_en', $name_en); $stmt->bindParam(':name_kh', $name_kh); $stmt->bindParam(':reg_by', $reg_by); return $stmt->execute(); } catch (PDOException $e) { if ($e->getCode() == '23000') { // Integrity constraint violation (duplicate entry) throw new Exception("Data Type with this English name already exists."); } error_log("Error adding data type: " . $e->getMessage()); throw new Exception("Could not add data type. Please try again later."); } } /** * Updates an existing data type. * * @param int $id ID of the data type to update. * @param string $name_en New English name. * @param string|null $name_kh New Khmer name. * @param int $mod_by User ID who modified it. * @return bool True on success. * @throws Exception If a database error occurs or name already exists. */ public function updateDataType(int $id, string $name_en, ?string $name_kh, int $mod_by): bool { $sql = "UPDATE dsps_tbl_typedatasource SET dspstds_name_en = :name_en, dspstds_name_kh = :name_kh, dspstds_mod_datetime = CURRENT_TIMESTAMP, dspstds_reg_by = :mod_by WHERE pkdspstds_id = :id"; try { $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':name_en', $name_en); $stmt->bindParam(':name_kh', $name_kh); $stmt->bindParam(':mod_by', $mod_by); $stmt->bindParam(':id', $id); return $stmt->execute(); } catch (PDOException $e) { if ($e->getCode() == '23000') { throw new Exception("Data Type with this English name already exists."); } error_log("Error updating data type (ID: $id): " . $e->getMessage()); throw new Exception("Could not update data type. Please try again later."); } } /** * Deletes a data type. * * @param int $id ID of the data type to delete. * @return bool True on success. * @throws Exception If a database error occurs or data type is in use. */ public function deleteDataType(int $id): bool { // Check if any data sources are using this data type $checkSql = "SELECT COUNT(*) FROM dsps_tbl_datasource WHERE fkdspstds_id = :id"; $stmtCheck = $this->pdo->prepare($checkSql); $stmtCheck->bindParam(':id', $id); $stmtCheck->execute(); if ($stmtCheck->fetchColumn() > 0) { throw new Exception("Cannot delete Data Type: It is currently used by one or more data sources."); } $sql = "DELETE FROM dsps_tbl_typedatasource WHERE pkdspstds_id = :id"; try { $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':id', $id); return $stmt->execute(); } catch (PDOException $e) { error_log("Error deleting data type (ID: $id): " . $e->getMessage()); throw new Exception("Could not delete data type. Please try again later."); } } /** * Retrieves a single data type by ID. * * @param int $id ID of the data type. * @return array|false Data type data or false if not found. * @throws Exception If a database error occurs. */ public function getDataTypeById(int $id) { $sql = "SELECT * FROM dsps_tbl_typedatasource WHERE pkdspstds_id = :id"; try { $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':id', $id); $stmt->execute(); return $stmt->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { error_log("Error fetching data type by ID ($id): " . $e->getMessage()); throw new Exception("Could not retrieve data type. Please try again later."); } } /** * Retrieves all data types. * * @return array An array of data type data. * @throws Exception If a database error occurs. */ public function getAllDataTypes(): array { $sql = "SELECT * FROM dsps_tbl_typedatasource ORDER BY dspstds_name_en ASC"; try { $stmt = $this->pdo->query($sql); return $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { error_log("Error fetching all data types: " . $e->getMessage()); throw new Exception("Could not retrieve data types. Please try again later."); } } /** * Gets the total count of data types. * * @return int The total number of data types. * @throws Exception If a database error occurs. */ public function getTotalDataTypes(): int { $sql = "SELECT COUNT(*) FROM dsps_tbl_typedatasource"; try { $stmt = $this->pdo->query($sql); return $stmt->fetchColumn(); } catch (PDOException $e) { error_log("Error getting total data types count: " . $e->getMessage()); throw new Exception("Could not retrieve data type count. Please try again later."); } } // --- Category Management (dsps_tbl_dspscategory) --- /** * Adds a new category. * * @param string $title_en English title of the category. * @param string|null $details Details about the category. * @param int $reg_by User ID who registered it. * @return bool True on success. * @throws Exception If a database error occurs or title already exists. */ public function addCategory(string $title_en, ?string $details, int $reg_by): bool { $sql = "INSERT INTO dsps_tbl_dspscategory (dspscate_title_en, dspscate_details, dspscate_reg_by) VALUES (:title_en, :details, :reg_by)"; try { $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':title_en', $title_en); $stmt->bindParam(':details', $details); $stmt->bindParam(':reg_by', $reg_by); return $stmt->execute(); } catch (PDOException $e) { if ($e->getCode() == '23000') { throw new Exception("Category with this English title already exists."); } error_log("Error adding category: " . $e->getMessage()); throw new Exception("Could not add category. Please try again later."); } } /** * Updates an existing category. * * @param int $id ID of the category to update. * @param string $title_en New English title. * @param string|null $details New details. * @param int $mod_by User ID who modified it. * @return bool True on success. * @throws Exception If a database error occurs or title already exists. */ public function updateCategory(int $id, string $title_en, ?string $details, int $mod_by): bool { $sql = "UPDATE dsps_tbl_dspscategory SET dspscate_title_en = :title_en, dspscate_details = :details, dspscate_mod_datetime = CURRENT_TIMESTAMP, dspscate_reg_by = :mod_by WHERE pkdspscate_id = :id"; try { $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':title_en', $title_en); $stmt->bindParam(':details', $details); $stmt->bindParam(':mod_by', $mod_by); $stmt->bindParam(':id', $id); return $stmt->execute(); } catch (PDOException $e) { if ($e->getCode() == '23000') { throw new Exception("Category with this English title already exists."); } error_log("Error updating category (ID: $id): " . $e->getMessage()); throw new Exception("Could not update category. Please try again later."); } } /** * Deletes a category. * * @param int $id ID of the category to delete. * @return bool True on success. * @throws Exception If a database error occurs or category is in use. */ public function deleteCategory(int $id): bool { // Check if any data sources are using this category $checkSql = "SELECT COUNT(*) FROM dsps_tbl_datasource WHERE fkdspscate_id = :id"; $stmtCheck = $this->pdo->prepare($checkSql); $stmtCheck->bindParam(':id', $id); $stmtCheck->execute(); if ($stmtCheck->fetchColumn() > 0) { throw new Exception("Cannot delete Category: It is currently used by one or more data sources."); } $sql = "DELETE FROM dsps_tbl_dspscategory WHERE pkdspscate_id = :id"; try { $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':id', $id); return $stmt->execute(); } catch (PDOException $e) { error_log("Error deleting category (ID: $id): " . $e->getMessage()); throw new Exception("Could not delete category. Please try again later."); } } /** * Retrieves a single category by ID. * * @param int $id ID of the category. * @return array|false Category data or false if not found. * @throws Exception If a database error occurs. */ public function getCategoryById(int $id) { $sql = "SELECT * FROM dsps_tbl_dspscategory WHERE pkdspscate_id = :id"; try { $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':id', $id); $stmt->execute(); return $stmt->fetch(PDO::FETCH_ASSOC); } catch (PDOException $e) { error_log("Error fetching category by ID ($id): " . $e->getMessage()); throw new Exception("Could not retrieve category. Please try again later."); } } /** * Retrieves all categories. * * @return array An array of category data. * @throws Exception If a database error occurs. */ public function getAllCategories(): array { $sql = "SELECT * FROM dsps_tbl_dspscategory ORDER BY dspscate_title_en ASC"; try { $stmt = $this->pdo->query($sql); return $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { error_log("Error fetching all categories: " . $e->getMessage()); throw new Exception("Could not retrieve categories. Please try again later."); } } /** * Gets the total count of categories. * * @return int The total number of categories. * @throws Exception If a database error occurs. */ public function getTotalCategories(): int { $sql = "SELECT COUNT(*) FROM dsps_tbl_dspscategory"; try { $stmt = $this->pdo->query($sql); return $stmt->fetchColumn(); } catch (PDOException $e) { error_log("Error getting total categories count: " . $e->getMessage()); throw new Exception("Could not retrieve category count. Please try again later."); } } }