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:
@@ -385,15 +385,17 @@ final class WeeztixService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$guid = data_get($row, 'guid') ?? data_get($row, 'id');
|
$merged = $this->mergeCompanyRowWithNested($row);
|
||||||
$name = data_get($row, 'name');
|
$guid = data_get($merged, 'guid') ?? data_get($merged, 'id');
|
||||||
if (! is_string($guid) || $guid === '') {
|
if (! is_string($guid) || $guid === '') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$name = $this->resolveCompanyNameFromRow($merged, $guid);
|
||||||
|
|
||||||
$this->config->update([
|
$this->config->update([
|
||||||
'company_guid' => $guid,
|
'company_guid' => $guid,
|
||||||
'company_name' => is_string($name) ? $name : null,
|
'company_name' => $name,
|
||||||
]);
|
]);
|
||||||
$this->config->refresh();
|
$this->config->refresh();
|
||||||
}
|
}
|
||||||
@@ -417,6 +419,20 @@ final class WeeztixService
|
|||||||
return $this->normalizeCompanyRows($companies);
|
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');
|
$defaultId = data_get($profile, 'default_company_id');
|
||||||
if (is_string($defaultId) && $defaultId !== '') {
|
if (is_string($defaultId) && $defaultId !== '') {
|
||||||
return [
|
return [
|
||||||
@@ -438,20 +454,90 @@ final class WeeztixService
|
|||||||
if (! is_array($row)) {
|
if (! is_array($row)) {
|
||||||
continue;
|
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 === '') {
|
if (! is_string($guid) || $guid === '') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$name = data_get($row, 'name');
|
|
||||||
$out[] = [
|
$out[] = [
|
||||||
'guid' => $guid,
|
'guid' => $guid,
|
||||||
'name' => is_string($name) ? $name : null,
|
'name' => $this->resolveCompanyNameFromRow($merged, $guid),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $out;
|
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
|
private function logFailedResponse(string $action, string $url, Response $response): void
|
||||||
{
|
{
|
||||||
Log::error('Weeztix API request failed', [
|
Log::error('Weeztix API request failed', [
|
||||||
|
|||||||
@@ -916,17 +916,35 @@ document.addEventListener('alpine:init', () => {
|
|||||||
this.syncCouponName();
|
this.syncCouponName();
|
||||||
},
|
},
|
||||||
|
|
||||||
/** Prefer API/display name; avoid showing raw GUID when a label exists. */
|
/** Prefer human-readable label; skip API "names" that are just the GUID / UUID. */
|
||||||
companyLabel(c) {
|
companyLabel(c) {
|
||||||
if (!c || typeof c.guid !== 'string') {
|
if (!c || typeof c.guid !== 'string') {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
const n = c.name;
|
const g = c.guid;
|
||||||
if (typeof n === 'string' && n.trim() !== '') {
|
const isBadLabel = (s) => {
|
||||||
return n.trim();
|
const t = typeof s === 'string' ? s.trim() : '';
|
||||||
|
return (
|
||||||
|
t === '' ||
|
||||||
|
t.toLowerCase() === g.toLowerCase() ||
|
||||||
|
this.stringLooksLikeUuid(t)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
const fromApi = typeof c.name === 'string' ? c.name : '';
|
||||||
|
if (!isBadLabel(fromApi)) {
|
||||||
|
return fromApi.trim();
|
||||||
|
}
|
||||||
|
if (this.companyGuid === g && !isBadLabel(this.companyName)) {
|
||||||
|
return String(this.companyName).trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.guid;
|
return g;
|
||||||
|
},
|
||||||
|
|
||||||
|
stringLooksLikeUuid(s) {
|
||||||
|
return /^[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}$/.test(
|
||||||
|
String(s),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user