fix: show real Weeztix company trade names, not GUID-as-name

Merge nested company objects, prefer trade_name over name, skip UUID-like
labels; Alpine falls back to stored company_name when API label is junk.

Made-with: Cursor
This commit is contained in:
2026-04-05 10:48:04 +02:00
parent 70c1d25ad4
commit 977e09d8ac
2 changed files with 115 additions and 11 deletions

View File

@@ -385,15 +385,17 @@ final class WeeztixService
return;
}
$guid = data_get($row, 'guid') ?? data_get($row, 'id');
$name = data_get($row, 'name');
$merged = $this->mergeCompanyRowWithNested($row);
$guid = data_get($merged, 'guid') ?? data_get($merged, 'id');
if (! is_string($guid) || $guid === '') {
return;
}
$name = $this->resolveCompanyNameFromRow($merged, $guid);
$this->config->update([
'company_guid' => $guid,
'company_name' => is_string($name) ? $name : null,
'company_name' => $name,
]);
$this->config->refresh();
}
@@ -417,6 +419,20 @@ final class WeeztixService
return $this->normalizeCompanyRows($companies);
}
$defaultCompany = data_get($profile, 'default_company');
if (is_array($defaultCompany)) {
$merged = $this->mergeCompanyRowWithNested($defaultCompany);
$guid = data_get($merged, 'guid') ?? data_get($merged, 'id');
if (is_string($guid) && $guid !== '') {
return [
[
'guid' => $guid,
'name' => $this->resolveCompanyNameFromRow($merged, $guid),
],
];
}
}
$defaultId = data_get($profile, 'default_company_id');
if (is_string($defaultId) && $defaultId !== '') {
return [
@@ -438,20 +454,90 @@ final class WeeztixService
if (! is_array($row)) {
continue;
}
$guid = data_get($row, 'guid') ?? data_get($row, 'id');
$merged = $this->mergeCompanyRowWithNested($row);
$guid = data_get($merged, 'guid')
?? data_get($merged, 'id')
?? data_get($merged, 'company_id');
if (! is_string($guid) || $guid === '') {
continue;
}
$name = data_get($row, 'name');
$out[] = [
'guid' => $guid,
'name' => is_string($name) ? $name : null,
'name' => $this->resolveCompanyNameFromRow($merged, $guid),
];
}
return $out;
}
/**
* Flatten `{ "company": { ... } }` style payloads so name fields resolve reliably.
*
* @param array<string, mixed> $row
* @return array<string, mixed>
*/
private function mergeCompanyRowWithNested(array $row): array
{
$nested = data_get($row, 'company');
if (! is_array($nested)) {
return $row;
}
return array_merge($row, $nested);
}
/**
* Weeztix / Open Ticket payloads use varying keys; `name` is sometimes a duplicate of the GUID.
*
* @param array<string, mixed> $row
*/
private function resolveCompanyNameFromRow(array $row, ?string $companyGuid = null): ?string
{
$candidates = [
data_get($row, 'trade_name'),
data_get($row, 'commercial_name'),
data_get($row, 'business_name'),
data_get($row, 'legal_name'),
data_get($row, 'company_name'),
data_get($row, 'display_name'),
data_get($row, 'title'),
data_get($row, 'label'),
data_get($row, 'general.name'),
data_get($row, 'company.trade_name'),
data_get($row, 'company.legal_name'),
data_get($row, 'company.name'),
data_get($row, 'name'),
];
foreach ($candidates as $value) {
if (! is_string($value)) {
continue;
}
$trimmed = trim($value);
if ($trimmed === '') {
continue;
}
if ($companyGuid !== null && strcasecmp($trimmed, $companyGuid) === 0) {
continue;
}
if ($this->stringLooksLikeUuid($trimmed)) {
continue;
}
return $trimmed;
}
return null;
}
private function stringLooksLikeUuid(string $value): bool
{
return preg_match(
'/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/',
$value
) === 1;
}
private function logFailedResponse(string $action, string $url, Response $response): void
{
Log::error('Weeztix API request failed', [