From e709de6593b461acfee0e5c84d409296e9fe3940 Mon Sep 17 00:00:00 2001 From: isaacclad Date: Fri, 24 Jul 2026 15:38:07 +0000 Subject: [PATCH] Use WooCommerce store currency for product and order money. Sync currency from the plugin, format product prices and totals with it, and show the store currency on product price fields instead of hard-coding GHS. --- app/Models/WooOrder.php | 9 ++- app/Models/WooProduct.php | 19 ++++- app/Models/WooStore.php | 35 ++++++++ app/Services/Woo/CatalogSyncService.php | 50 ++++++++++++ app/Services/Woo/OrderIngestService.php | 8 +- app/Services/Woo/OrderSyncService.php | 9 +++ public/downloads/ladill-woo-plugin.zip | Bin 13255 -> 19790 bytes resources/views/woo/products/form.blade.php | 29 ++++++- tests/Unit/WooStoreCurrencyTest.php | 84 ++++++++++++++++++++ 9 files changed, 234 insertions(+), 9 deletions(-) create mode 100644 tests/Unit/WooStoreCurrencyTest.php diff --git a/app/Models/WooOrder.php b/app/Models/WooOrder.php index eb66459..2812fd9 100644 --- a/app/Models/WooOrder.php +++ b/app/Models/WooOrder.php @@ -65,8 +65,13 @@ class WooOrder extends Model public function totalFormatted(): string { $minor = (int) $this->total_minor; - $currency = strtoupper((string) ($this->currency ?: 'GHS')); + $currency = strtoupper(trim((string) ($this->currency ?: ''))); + if ($currency === '' && ($this->relationLoaded('store') || $this->store)) { + $currency = $this->store->currency(); + } - return $currency.' '.number_format($minor / 100, 2); + $amount = number_format($minor / 100, 2); + + return $currency !== '' ? $currency.' '.$amount : $amount; } } diff --git a/app/Models/WooProduct.php b/app/Models/WooProduct.php index 85a0e74..877e5c2 100644 --- a/app/Models/WooProduct.php +++ b/app/Models/WooProduct.php @@ -64,9 +64,24 @@ class WooProduct extends Model return '—'; } - $currency = strtoupper((string) ($this->store?->metadata['currency'] ?? 'GHS')); + if ($this->relationLoaded('store') || $this->store) { + return $this->store->formatMoney($minor); + } - return $currency.' '.number_format($minor / 100, 2); + return number_format($minor / 100, 2); + } + + public function regularPriceFormatted(): string + { + if ($this->regular_price_minor === null) { + return '—'; + } + + if ($this->relationLoaded('store') || $this->store) { + return $this->store->formatMoney((int) $this->regular_price_minor); + } + + return number_format(((int) $this->regular_price_minor) / 100, 2); } public function statusLabel(): string diff --git a/app/Models/WooStore.php b/app/Models/WooStore.php index 8cfdfb1..662cd0c 100644 --- a/app/Models/WooStore.php +++ b/app/Models/WooStore.php @@ -70,4 +70,39 @@ class WooStore extends Model { return rtrim((string) config('app.url'), '/').'/webhooks/woocommerce/'.$this->public_id; } + + /** + * WooCommerce store currency (ISO 4217), synced from the connected site. + * Does not fall back to GHS — unknown currency is empty until the next sync. + */ + public function currency(): string + { + $meta = is_array($this->metadata) ? $this->metadata : []; + $currency = strtoupper(trim((string) ($meta['currency'] ?? ''))); + + return preg_match('/^[A-Z]{3}$/', $currency) === 1 ? $currency : ''; + } + + public function currencySymbol(): string + { + $meta = is_array($this->metadata) ? $this->metadata : []; + $symbol = trim((string) ($meta['currency_symbol'] ?? '')); + if ($symbol !== '') { + return $symbol; + } + + return $this->currency(); + } + + public function formatMoney(int|float|null $minor): string + { + if ($minor === null) { + return '—'; + } + + $currency = $this->currency(); + $amount = number_format(((int) $minor) / 100, 2); + + return $currency !== '' ? $currency.' '.$amount : $amount; + } } diff --git a/app/Services/Woo/CatalogSyncService.php b/app/Services/Woo/CatalogSyncService.php index 38449fd..3ef5eb4 100644 --- a/app/Services/Woo/CatalogSyncService.php +++ b/app/Services/Woo/CatalogSyncService.php @@ -16,12 +16,53 @@ class CatalogSyncService public function syncAll(WooStore $store, ?User $user = null): array { + $this->syncStoreMeta($store); + return [ 'categories' => $this->syncCategories($store), 'products' => $this->syncProducts($store, $user), ]; } + /** + * Pull store-level settings (currency, site name) from the WooCommerce plugin. + */ + public function syncStoreMeta(WooStore $store): void + { + $response = $this->client->get($store, 'store'); + if (! is_array($response)) { + return; + } + + $this->applyStoreMeta($store, $response); + } + + /** @param array $payload */ + public function applyStoreMeta(WooStore $store, array $payload): void + { + $currency = strtoupper(trim((string) ($payload['currency'] ?? ''))); + if (preg_match('/^[A-Z]{3}$/', $currency) !== 1) { + return; + } + + $meta = is_array($store->metadata) ? $store->metadata : []; + $meta['currency'] = $currency; + + $symbol = trim((string) ($payload['currency_symbol'] ?? '')); + if ($symbol !== '') { + $meta['currency_symbol'] = $symbol; + } + + $siteName = trim((string) ($payload['site_name'] ?? '')); + $updates = ['metadata' => $meta]; + if ($siteName !== '' && (string) $store->site_name !== $siteName) { + $updates['site_name'] = $siteName; + } + + $store->forceFill($updates)->save(); + $store->refresh(); + } + public function syncCategories(WooStore $store): int { $response = $this->client->get($store, 'categories', ['per_page' => 100]); @@ -53,11 +94,20 @@ class CatalogSyncService return 0; } + if (isset($response['currency']) || isset($response['currency_symbol'])) { + $this->applyStoreMeta($store, $response); + } + $items = $response['data'] ?? $response; if (! is_array($items)) { return 0; } + // Bare list responses are numeric arrays of products — ignore non-product keys. + if (array_is_list($items) === false && isset($response['data']) === false) { + $items = array_values(array_filter($items, fn ($item) => is_array($item) && isset($item['id']))); + } + $count = 0; foreach ($items as $item) { if (! is_array($item)) { diff --git a/app/Services/Woo/OrderIngestService.php b/app/Services/Woo/OrderIngestService.php index e726987..63cdfaf 100644 --- a/app/Services/Woo/OrderIngestService.php +++ b/app/Services/Woo/OrderIngestService.php @@ -30,7 +30,13 @@ class OrderIngestService ->all(); $totalMinor = (int) round(((float) ($payload['total'] ?? 0)) * 100); - $currency = strtoupper((string) ($payload['currency'] ?? 'GHS')); + $currency = strtoupper(trim((string) ($payload['currency'] ?? ''))); + if (preg_match('/^[A-Z]{3}$/', $currency) !== 1) { + $currency = $store->currency(); + } + if ($currency === '') { + $currency = 'XXX'; + } $wcUpdatedAt = isset($payload['date_modified_gmt']) ? Carbon::parse($payload['date_modified_gmt'].' UTC') diff --git a/app/Services/Woo/OrderSyncService.php b/app/Services/Woo/OrderSyncService.php index aa6db3b..f35cddf 100644 --- a/app/Services/Woo/OrderSyncService.php +++ b/app/Services/Woo/OrderSyncService.php @@ -9,6 +9,7 @@ class OrderSyncService public function __construct( private PluginClient $client, private OrderIngestService $orders, + private CatalogSyncService $catalog, ) {} public function syncOrders(WooStore $store): int @@ -18,11 +19,19 @@ class OrderSyncService return 0; } + if (isset($response['currency']) || isset($response['currency_symbol'])) { + $this->catalog->applyStoreMeta($store, $response); + } + $items = $response['data'] ?? $response; if (! is_array($items)) { return 0; } + if (array_is_list($items) === false && isset($response['data']) === false) { + $items = array_values(array_filter($items, fn ($item) => is_array($item) && (isset($item['id']) || isset($item['number'])))); + } + $count = 0; foreach ($items as $item) { if (! is_array($item)) { diff --git a/public/downloads/ladill-woo-plugin.zip b/public/downloads/ladill-woo-plugin.zip index 375d6950c22b9faffef82b014000481f5cd316e8..3c46b159315cc0add591c94ab06dbab54ea88b78 100644 GIT binary patch delta 11090 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 diff --git a/resources/views/woo/products/form.blade.php b/resources/views/woo/products/form.blade.php index 5f87177..a6041a0 100644 --- a/resources/views/woo/products/form.blade.php +++ b/resources/views/woo/products/form.blade.php @@ -40,16 +40,37 @@ + @php + $storeCurrency = $currentStore->currency(); + $storeCurrencyLabel = $storeCurrency !== '' ? $storeCurrency : 'store currency'; + @endphp

- - + +
+ @if($storeCurrency !== '') + {{ $storeCurrency }} + @endif + +
- - + +
+ @if($storeCurrency !== '') + {{ $storeCurrency }} + @endif + +
+ @if($storeCurrency === '') +

Store currency not synced yet. Run Sync from WooCommerce on the products page so prices use your WooCommerce currency.

+ @endif