false,
'message' => 'Company name is required.'
]);
}
if (!in_array($status, $allowedStatuses, true)) {
$status = 'active';
}
if ($idcompany > 0) {
$sql = "
UPDATE companies
SET
company_name = :company_name,
legal_name = :legal_name,
vat_number = :vat_number,
external_code = :external_code,
address = :address,
city = :city,
zip = :zip,
country_id = :country_id,
email = :email,
phone = :phone,
status = :status,
updated_at = NOW()
WHERE idcompany = :idcompany
";
$stmt = $db->prepare($sql);
$stmt->execute([
':company_name' => $companyName,
':legal_name' => $legalName !== '' ? $legalName : null,
':vat_number' => $vatNumber !== '' ? $vatNumber : null,
':external_code' => $externalCode !== '' ? $externalCode : null,
':address' => $address !== '' ? $address : null,
':city' => $city !== '' ? $city : null,
':zip' => $zip !== '' ? $zip : null,
':country_id' => $countryId,
':email' => $email !== '' ? $email : null,
':phone' => $phone !== '' ? $phone : null,
':status' => $status,
':idcompany' => $idcompany,
]);
jsonResponse([
'success' => true,
'message' => 'Company updated successfully.'
]);
}
$sql = "
INSERT INTO companies (
company_name,
legal_name,
vat_number,
external_code,
address,
city,
zip,
country_id,
email,
phone,
status,
created_at,
updated_at
) VALUES (
:company_name,
:legal_name,
:vat_number,
:external_code,
:address,
:city,
:zip,
:country_id,
:email,
:phone,
:status,
NOW(),
NOW()
)
";
$stmt = $db->prepare($sql);
$stmt->execute([
':company_name' => $companyName,
':legal_name' => $legalName !== '' ? $legalName : null,
':vat_number' => $vatNumber !== '' ? $vatNumber : null,
':external_code' => $externalCode !== '' ? $externalCode : null,
':address' => $address !== '' ? $address : null,
':city' => $city !== '' ? $city : null,
':zip' => $zip !== '' ? $zip : null,
':country_id' => $countryId,
':email' => $email !== '' ? $email : null,
':phone' => $phone !== '' ? $phone : null,
':status' => $status,
]);
jsonResponse([
'success' => true,
'message' => 'Company created successfully.'
]);
}
if ($action === 'get_company') {
$idcompany = isset($_POST['idcompany']) ? (int) $_POST['idcompany'] : 0;
if ($idcompany <= 0) {
jsonResponse([
'success' => false,
'message' => 'Invalid company id.'
]);
}
$stmt = $db->prepare("
SELECT *
FROM companies
WHERE idcompany = :idcompany
LIMIT 1
");
$stmt->execute([':idcompany' => $idcompany]);
$company = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$company) {
jsonResponse([
'success' => false,
'message' => 'Company not found.'
]);
}
jsonResponse([
'success' => true,
'company' => $company
]);
}
if ($action === 'change_status') {
$idcompany = isset($_POST['idcompany']) ? (int) $_POST['idcompany'] : 0;
$status = $_POST['status'] ?? 'inactive';
$allowedStatuses = ['active', 'inactive', 'suspended'];
if ($idcompany <= 0 || !in_array($status, $allowedStatuses, true)) {
jsonResponse([
'success' => false,
'message' => 'Invalid request.'
]);
}
$stmt = $db->prepare("
UPDATE companies
SET status = :status, updated_at = NOW()
WHERE idcompany = :idcompany
");
$stmt->execute([
':status' => $status,
':idcompany' => $idcompany,
]);
jsonResponse([
'success' => true,
'message' => 'Company status updated successfully.'
]);
}
if ($action === 'delete_company') {
$idcompany = isset($_POST['idcompany']) ? (int) $_POST['idcompany'] : 0;
if ($idcompany <= 0) {
jsonResponse([
'success' => false,
'message' => 'Invalid company id.'
]);
}
/*
* Safe delete rule:
* Do not delete a company if it already has linked brands, departments or users.
*/
$stmt = $db->prepare("
SELECT
(SELECT COUNT(*) FROM brands WHERE idcompany = :idcompany1) AS brands_count,
(SELECT COUNT(*) FROM departments WHERE idcompany = :idcompany2) AS departments_count,
(SELECT COUNT(*) FROM company_users WHERE idcompany = :idcompany3) AS users_count
");
$stmt->execute([
':idcompany1' => $idcompany,
':idcompany2' => $idcompany,
':idcompany3' => $idcompany,
]);
$usage = $stmt->fetch(PDO::FETCH_ASSOC);
if (
((int) $usage['brands_count'] > 0) ||
((int) $usage['departments_count'] > 0) ||
((int) $usage['users_count'] > 0)
) {
jsonResponse([
'success' => false,
'message' => 'This company has linked brands, departments or users. Set it as inactive instead of deleting it.'
]);
}
$stmt = $db->prepare("
DELETE FROM companies
WHERE idcompany = :idcompany
");
$stmt->execute([':idcompany' => $idcompany]);
jsonResponse([
'success' => true,
'message' => 'Company deleted successfully.'
]);
}
jsonResponse([
'success' => false,
'message' => 'Unknown action.'
]);
} catch (Throwable $e) {
jsonResponse([
'success' => false,
'message' => $e->getMessage()
]);
}
}
/*
* Page data
*/
$countries = [];
try {
$stmt = $db->query("
SELECT id, name, iso_3166_2
FROM auth_countries
ORDER BY name ASC
");
$countries = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (Throwable $e) {
$countries = [];
}
$companies = [];
try {
$stmt = $db->query("
SELECT
c.idcompany,
c.company_name,
c.legal_name,
c.vat_number,
c.external_code,
c.city,
c.email,
c.phone,
c.status,
c.created_at,
ac.name AS country_name,
COUNT(DISTINCT b.idbrand) AS brand_count,
COUNT(DISTINCT d.iddepartment) AS department_count,
COUNT(DISTINCT cu.idcompanyuser) AS user_count
FROM companies c
LEFT JOIN auth_countries ac ON ac.id = c.country_id
LEFT JOIN brands b ON b.idcompany = c.idcompany
LEFT JOIN departments d ON d.idcompany = c.idcompany
LEFT JOIN company_users cu ON cu.idcompany = c.idcompany
GROUP BY
c.idcompany,
c.company_name,
c.legal_name,
c.vat_number,
c.external_code,
c.city,
c.email,
c.phone,
c.status,
c.created_at,
ac.name
ORDER BY c.company_name ASC
");
$companies = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (Throwable $e) {
$companies = [];
}
$pageTitle = 'Companies';
?>
= e($pageTitle); ?> - = isset($titlewebsite) ? e($titlewebsite) : 'TRFgo'; ?>
TRFgo Registry
Companies
Manage customer companies, laboratories and organizations connected to TRFgo.
Companies are the base layer for brands, departments, users and future TRF requests.
Add Company
$row['status'] === 'active'));
$suspendedCompanies = count(array_filter($companies, fn($row) => $row['status'] === 'suspended'));
?>
Total Companies
= e($totalCompanies); ?>
Active
= e($activeCompanies); ?>
Suspended
= e($suspendedCompanies); ?>
Company
External Code
Country / City
Email
Brands
Departments
Users
Status
Created
Actions
= e($company['company_name']); ?>
= e($company['legal_name']); ?>
VAT: = e($company['vat_number']); ?>
= !empty($company['external_code']) ? e($company['external_code']) : '- '; ?>
= !empty($company['country_name']) ? e($company['country_name']) : '- '; ?>
= e($company['city']); ?>
= e($company['email']); ?>
-
= e($company['phone']); ?>
= e($company['brand_count']); ?>
= e($company['department_count']); ?>
= e($company['user_count']); ?>
Active
Suspended
Inactive
= !empty($company['created_at']) ? e(date('d/m/Y', strtotime($company['created_at']))) : '-'; ?>