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.

$row['status'] === 'active')); $suspendedCompanies = count(array_filter($companies, fn($row) => $row['status'] === 'suspended')); ?>
Total Companies
Active
Suspended
Company List

Customer and laboratory organizations configured in TRFgo

Company External Code Country / City Email Brands Departments Users Status Created Actions
VAT:
-'; ?>
-'; ?>
-
Active Suspended Inactive