false, 'message' => 'Company is required.' ]); } if ($brandName === '') { jsonResponse([ 'success' => false, 'message' => 'Brand name is required.' ]); } if (!in_array($status, $allowedStatuses, true)) { $status = 'active'; } /* * Check company exists */ $stmt = $db->prepare("SELECT COUNT(*) FROM companies WHERE idcompany = :idcompany"); $stmt->execute([':idcompany' => $idcompany]); if ((int) $stmt->fetchColumn() === 0) { jsonResponse([ 'success' => false, 'message' => 'Selected company does not exist.' ]); } if ($idbrand > 0) { $sql = " UPDATE brands SET idcompany = :idcompany, brand_name = :brand_name, external_brand_code = :external_brand_code, status = :status, updated_at = NOW() WHERE idbrand = :idbrand "; $stmt = $db->prepare($sql); $stmt->execute([ ':idcompany' => $idcompany, ':brand_name' => $brandName, ':external_brand_code' => $externalBrandCode !== '' ? $externalBrandCode : null, ':status' => $status, ':idbrand' => $idbrand, ]); jsonResponse([ 'success' => true, 'message' => 'Brand updated successfully.' ]); } $sql = " INSERT INTO brands ( idcompany, brand_name, external_brand_code, status, created_at, updated_at ) VALUES ( :idcompany, :brand_name, :external_brand_code, :status, NOW(), NOW() ) "; $stmt = $db->prepare($sql); $stmt->execute([ ':idcompany' => $idcompany, ':brand_name' => $brandName, ':external_brand_code' => $externalBrandCode !== '' ? $externalBrandCode : null, ':status' => $status, ]); jsonResponse([ 'success' => true, 'message' => 'Brand created successfully.' ]); } if ($action === 'get_brand') { $idbrand = isset($_POST['idbrand']) ? (int) $_POST['idbrand'] : 0; if ($idbrand <= 0) { jsonResponse([ 'success' => false, 'message' => 'Invalid brand id.' ]); } $stmt = $db->prepare(" SELECT * FROM brands WHERE idbrand = :idbrand LIMIT 1 "); $stmt->execute([':idbrand' => $idbrand]); $brand = $stmt->fetch(PDO::FETCH_ASSOC); if (!$brand) { jsonResponse([ 'success' => false, 'message' => 'Brand not found.' ]); } jsonResponse([ 'success' => true, 'brand' => $brand ]); } if ($action === 'change_status') { $idbrand = isset($_POST['idbrand']) ? (int) $_POST['idbrand'] : 0; $status = $_POST['status'] ?? 'inactive'; $allowedStatuses = ['active', 'inactive']; if ($idbrand <= 0 || !in_array($status, $allowedStatuses, true)) { jsonResponse([ 'success' => false, 'message' => 'Invalid request.' ]); } $stmt = $db->prepare(" UPDATE brands SET status = :status, updated_at = NOW() WHERE idbrand = :idbrand "); $stmt->execute([ ':status' => $status, ':idbrand' => $idbrand, ]); jsonResponse([ 'success' => true, 'message' => 'Brand status updated successfully.' ]); } if ($action === 'delete_brand') { $idbrand = isset($_POST['idbrand']) ? (int) $_POST['idbrand'] : 0; if ($idbrand <= 0) { jsonResponse([ 'success' => false, 'message' => 'Invalid brand id.' ]); } /* * Safe delete rule: * Do not delete a brand if it has linked departments or users. */ $stmt = $db->prepare(" SELECT (SELECT COUNT(*) FROM departments WHERE idbrand = :idbrand1) AS departments_count, (SELECT COUNT(*) FROM company_users WHERE idbrand = :idbrand2) AS users_count "); $stmt->execute([ ':idbrand1' => $idbrand, ':idbrand2' => $idbrand, ]); $usage = $stmt->fetch(PDO::FETCH_ASSOC); if (((int) $usage['departments_count'] > 0) || ((int) $usage['users_count'] > 0)) { jsonResponse([ 'success' => false, 'message' => 'This brand has linked departments or users. Set it as inactive instead of deleting it.' ]); } $stmt = $db->prepare(" DELETE FROM brands WHERE idbrand = :idbrand "); $stmt->execute([':idbrand' => $idbrand]); jsonResponse([ 'success' => true, 'message' => 'Brand deleted successfully.' ]); } jsonResponse([ 'success' => false, 'message' => 'Unknown action.' ]); } catch (Throwable $e) { jsonResponse([ 'success' => false, 'message' => $e->getMessage() ]); } } /* * Page data */ $companies = []; try { $stmt = $db->query(" SELECT idcompany, company_name, status FROM companies ORDER BY company_name ASC "); $companies = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (Throwable $e) { $companies = []; } $brands = []; try { $stmt = $db->query(" SELECT b.idbrand, b.idcompany, b.brand_name, b.external_brand_code, b.status, b.created_at, c.company_name, c.status AS company_status, COUNT(DISTINCT d.iddepartment) AS department_count, COUNT(DISTINCT cu.idcompanyuser) AS user_count FROM brands b INNER JOIN companies c ON c.idcompany = b.idcompany LEFT JOIN departments d ON d.idbrand = b.idbrand LEFT JOIN company_users cu ON cu.idbrand = b.idbrand GROUP BY b.idbrand, b.idcompany, b.brand_name, b.external_brand_code, b.status, b.created_at, c.company_name, c.status ORDER BY c.company_name ASC, b.brand_name ASC "); $brands = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (Throwable $e) { $brands = []; } $pageTitle = 'Brands'; ?> <?= e($pageTitle); ?> - <?= isset($titlewebsite) ? e($titlewebsite) : 'TRFgo'; ?>
TRFgo Registry

Brands

Manage brands and divisions linked to customer companies. Brands help organize samples, TRF requests, departments and user access.

$row['status'] === 'active')); $inactiveBrands = count(array_filter($brands, fn($row) => $row['status'] === 'inactive')); ?>
Total Brands
Active
Inactive
Brand List

Brands and divisions configured for customer companies

No companies available. Create at least one company before adding brands.
Brand Company External Code Departments Users Status Created Actions
ID:
Company status:
-'; ?> Active Inactive