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
= e($totalBrands); ?>
Active
= e($activeBrands); ?>
Inactive
= e($inactiveBrands); ?>
No companies available.
Create at least one company before adding brands.
| Brand |
Company |
External Code |
Departments |
Users |
Status |
Created |
Actions |
|
= e($brand['brand_name']); ?>
ID: = e($brand['idbrand']); ?>
|
= e($brand['company_name']); ?>
Company status: = e($brand['company_status']); ?>
|
= !empty($brand['external_brand_code']) ? e($brand['external_brand_code']) : '-'; ?>
|
= e($brand['department_count']); ?>
|
= e($brand['user_count']); ?>
|
Active
Inactive
|
= !empty($brand['created_at']) ? e(date('d/m/Y', strtotime($brand['created_at']))) : '-'; ?>
|
|