whole eshop is now in euro
This commit is contained in:
@@ -30,18 +30,18 @@
|
||||
{% for item in items %}
|
||||
<li class="flex justify-between gap-2">
|
||||
<span class="text-on-surface/80 dark:text-on-surface-dark/80">{{ item.product_name }}{% if item.variant_label %} · {{ item.variant_label }}{% endif %} × {{ item.quantity }}</span>
|
||||
<span class="tabular-nums">{{ item.line_total }} {{ order.currency }}</span>
|
||||
<span class="tabular-nums">{{ item.line_total }} €</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<div class="space-y-1 border-t border-outline py-3 text-sm dark:border-outline-dark">
|
||||
<div class="flex justify-between"><span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="checkout-subtotal", lang=lang | default(value='sk')) }}</span><span class="tabular-nums">{{ order.subtotal }} {{ order.currency }}</span></div>
|
||||
<div class="flex justify-between"><span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ order.carrier_name }}</span><span class="tabular-nums">{{ order.shipping }} {{ order.currency }}</span></div>
|
||||
<div class="flex justify-between"><span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="checkout-subtotal", lang=lang | default(value='sk')) }}</span><span class="tabular-nums">{{ order.subtotal }} €</span></div>
|
||||
<div class="flex justify-between"><span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ order.carrier_name }}</span><span class="tabular-nums">{{ order.shipping }} €</span></div>
|
||||
{% if order.pickup_point_name %}<div class="text-xs text-on-surface/60 dark:text-on-surface-dark/60">{{ order.pickup_point_name }}</div>{% endif %}
|
||||
</div>
|
||||
<div class="flex justify-between border-t border-outline pt-3 font-bold dark:border-outline-dark">
|
||||
<span>{{ t(key="order-total", lang=lang | default(value='sk')) }}</span>
|
||||
<span class="tabular-nums text-primary dark:text-primary-dark">{{ order.total }} {{ order.currency }}</span>
|
||||
<span class="tabular-nums text-primary dark:text-primary-dark">{{ order.total }} €</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="bank-account-name", lang=lang | default(value='sk')) }}</span><span class="font-medium">{{ order.bank_account_name }}</span>
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">IBAN</span><span class="font-mono font-medium">{{ order.bank_iban }}</span>
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="bank-variable-symbol", lang=lang | default(value='sk')) }}</span><span class="font-mono font-medium">{{ order.variable_symbol }}</span>
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="bank-amount", lang=lang | default(value='sk')) }}</span><span class="font-medium tabular-nums">{{ order.total }} {{ order.currency }}</span>
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="bank-amount", lang=lang | default(value='sk')) }}</span><span class="font-medium tabular-nums">{{ order.total }} €</span>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
</div>
|
||||
<div class="flex items-center gap-4">
|
||||
{{ self::status_badge(status=order.status) }}
|
||||
<span class="tabular-nums text-sm font-medium text-on-surface-strong dark:text-on-surface-dark-strong">{{ order.total }} {{ order.currency }}</span>
|
||||
<span class="tabular-nums text-sm font-medium text-on-surface-strong dark:text-on-surface-dark-strong">{{ order.total }} €</span>
|
||||
</div>
|
||||
</a>
|
||||
{% endmacro order_row %}
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
x-text="row.label || ('#' + row.id)"></span>
|
||||
<span class="text-sm tabular-nums text-on-surface/70 dark:text-on-surface-dark/70">
|
||||
{{ t(key="price", lang=lang | default(value='sk')) }}:
|
||||
<span x-text="row.regular_price"></span> <span x-text="row.currency"></span>
|
||||
<span x-text="row.regular_price"></span> €
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -80,9 +80,9 @@
|
||||
class="flex flex-wrap items-center justify-between gap-3 rounded-radius border border-outline bg-surface-alt px-4 py-2.5 text-sm dark:border-outline-dark dark:bg-surface-dark/40">
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="discount-preview-after", lang=lang | default(value='sk')) }}</span>
|
||||
<span class="flex items-center gap-2">
|
||||
<span class="tabular-nums text-on-surface/50 line-through dark:text-on-surface-dark/50" x-text="money(row.regular_cents) + ' ' + row.currency"></span>
|
||||
<span class="tabular-nums text-on-surface/50 line-through dark:text-on-surface-dark/50" x-text="money(row.regular_cents) + ' €'"></span>
|
||||
<span class="text-base font-semibold tabular-nums" :class="valid(row) ? 'text-danger' : 'text-on-surface/40 dark:text-on-surface-dark/40'"
|
||||
x-text="money(afterCents(row)) + ' ' + row.currency"></span>
|
||||
x-text="money(afterCents(row)) + ' €'"></span>
|
||||
<span x-show="valid(row)" class="text-xs text-on-surface/60 dark:text-on-surface-dark/60" x-text="'(−' + percentOff(row) + '%)'"></span>
|
||||
</span>
|
||||
</div>
|
||||
@@ -106,7 +106,6 @@
|
||||
label: r.label || '',
|
||||
regular_cents: r.regular_cents,
|
||||
regular_price: r.regular_price,
|
||||
currency: r.currency,
|
||||
mode: r.mode || 'fixed',
|
||||
fixed: r.fixed || '',
|
||||
percent: r.percent || '',
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
{{ ui::csrf_field() }}
|
||||
|
||||
{% if product %}
|
||||
{% set v_name = product.name %}{% set v_currency = product.currency %}{% set v_desc = product.description | default(value="") %}{% set v_short = product.short_description | default(value="") %}{% set v_pub = product.published %}
|
||||
{% set v_name = product.name %}{% set v_desc = product.description | default(value="") %}{% set v_short = product.short_description | default(value="") %}{% set v_pub = product.published %}
|
||||
{% else %}
|
||||
{% set v_name = "" %}{% set v_currency = "EUR" %}{% set v_desc = "" %}{% set v_short = "" %}{% set v_pub = false %}
|
||||
{% set v_name = "" %}{% set v_desc = "" %}{% set v_short = "" %}{% set v_pub = false %}
|
||||
{% endif %}
|
||||
{% set inp = "w-full rounded-radius border border-outline bg-surface-alt px-3 py-2 text-sm text-on-surface focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary dark:border-outline-dark dark:bg-surface-dark-alt/50 dark:text-on-surface-dark dark:focus-visible:outline-primary-dark" %}
|
||||
{% set sublabel = "text-xs font-medium text-on-surface/70 dark:text-on-surface-dark/70" %}
|
||||
@@ -33,11 +33,6 @@
|
||||
{{ ui::input(name="name", id="name", required=true, value=v_name) }}
|
||||
</div>
|
||||
|
||||
<div class="space-y-1.5 sm:max-w-[10rem]">
|
||||
<label for="currency" class="text-sm font-medium text-on-surface-strong dark:text-on-surface-dark-strong">{{ t(key="currency", lang=lang | default(value='sk')) }}</label>
|
||||
{{ ui::input(name="currency", id="currency", value=v_currency, attrs='maxlength="3"', extra="uppercase") }}
|
||||
</div>
|
||||
|
||||
{# --- Variants / options editor ------------------------------------------- #}
|
||||
{# Each product is sold as one or more variants (a free-text label such as #}
|
||||
{# "10cm x 13cm" or "5ml" plus its own price). Price is required. Stock is #}
|
||||
@@ -76,7 +71,7 @@
|
||||
<input type="number" min="0" :name="`variants[${i}][stock]`" x-model="row.stock" class="{{ inp }}" placeholder="∞" title="{{ t(key='stock-untracked-hint', lang=lang | default(value='sk')) }}">
|
||||
</div>
|
||||
<div class="space-y-1 sm:col-span-2">
|
||||
<label class="{{ sublabel }} block truncate">{{ t(key="price", lang=lang | default(value='sk')) }}</label>
|
||||
<label class="{{ sublabel }} block truncate">{{ t(key="price", lang=lang | default(value='sk')) }} (€)</label>
|
||||
<input :name="`variants[${i}][price]`" x-model="row.price" inputmode="decimal" required class="{{ inp }}" placeholder="0.00">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="px-4 py-3 tabular-nums">{% if product.has_options %}{{ t(key="from-price", price=product.regular_price, lang=lang | default(value='sk')) }}{% else %}{{ product.regular_price }}{% endif %} {{ product.currency }}</td>
|
||||
<td class="px-4 py-3 tabular-nums">{% if product.has_options %}{{ t(key="from-price", price=product.regular_price, lang=lang | default(value='sk')) }}{% else %}{{ product.regular_price }}{% endif %} €</td>
|
||||
<td class="px-4 py-3 tabular-nums">{{ product.variant_count }}</td>
|
||||
<td class="px-4 py-3 tabular-nums">
|
||||
<span id="eff-{{ product.id }}">{{ ui::eff_price(p=product) }}</span>
|
||||
|
||||
@@ -38,15 +38,15 @@
|
||||
<div class="space-y-2 rounded-radius bg-surface-alt px-4 py-3 dark:bg-surface-dark/40">
|
||||
<div class="flex items-center justify-between gap-3 text-sm">
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="price", lang=lang | default(value='sk')) }}</span>
|
||||
<span class="tabular-nums text-on-surface-strong dark:text-on-surface-dark-strong">{{ product.regular_price }} {{ product.currency }}</span>
|
||||
<span class="tabular-nums text-on-surface-strong dark:text-on-surface-dark-strong">{{ product.regular_price }} €</span>
|
||||
</div>
|
||||
<div class="flex items-center justify-between gap-3 text-sm">
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="business-price", lang=lang | default(value='sk')) }}</span>
|
||||
<span class="tabular-nums {% if product.business_reduced %}font-medium text-danger{% else %}text-on-surface-strong dark:text-on-surface-dark-strong{% endif %}">{{ product.business_price }} {{ product.currency }}</span>
|
||||
<span class="tabular-nums {% if product.business_reduced %}font-medium text-danger{% else %}text-on-surface-strong dark:text-on-surface-dark-strong{% endif %}">{{ product.business_price }} €</span>
|
||||
</div>
|
||||
<div class="flex items-center justify-between gap-3 text-sm">
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="effective-price", lang=lang | default(value='sk')) }}</span>
|
||||
<span class="tabular-nums font-medium {% if product.effective_differs %}text-primary dark:text-primary-dark{% else %}text-on-surface-strong dark:text-on-surface-dark-strong{% endif %}">{{ product.effective_price }} {{ product.currency }}</span>
|
||||
<span class="tabular-nums font-medium {% if product.effective_differs %}text-primary dark:text-primary-dark{% else %}text-on-surface-strong dark:text-on-surface-dark-strong{% endif %}">{{ product.effective_price }} €</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
<div class="flex items-center justify-between gap-3">
|
||||
<span class="text-sm text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="negotiated-price", lang=lang | default(value='sk')) }}</span>
|
||||
<span class="text-lg font-semibold tabular-nums" :class="valid ? 'text-secondary dark:text-secondary-dark' : 'text-on-surface/40 dark:text-on-surface-dark/40'">
|
||||
<span x-text="money(afterCents)"></span> {{ product.currency }}
|
||||
<span x-text="money(afterCents)"></span> €
|
||||
</span>
|
||||
</div>
|
||||
<p x-show="!valid" class="text-xs text-danger">{{ t(key="discount-must-be-positive", lang=lang | default(value='sk')) }}</p>
|
||||
|
||||
@@ -82,14 +82,14 @@
|
||||
</td>
|
||||
<td class="px-4 py-3 tabular-nums">
|
||||
{% if product.business_reduced %}
|
||||
<span class="font-medium text-danger">{{ product.business_price }} {{ product.currency }}</span>
|
||||
<span class="font-medium text-danger">{{ product.business_price }} €</span>
|
||||
<span class="ml-1 text-xs text-on-surface/50 line-through dark:text-on-surface-dark/50">{{ product.regular_price }}</span>
|
||||
{% else %}
|
||||
{{ product.business_price }} {{ product.currency }}
|
||||
{{ product.business_price }} €
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="px-4 py-3 tabular-nums">
|
||||
<span class="font-medium {% if product.effective_differs %}text-primary dark:text-primary-dark{% else %}text-on-surface-strong dark:text-on-surface-dark-strong{% endif %}">{{ product.effective_price }} {{ product.currency }}</span>
|
||||
<span class="font-medium {% if product.effective_differs %}text-primary dark:text-primary-dark{% else %}text-on-surface-strong dark:text-on-surface-dark-strong{% endif %}">{{ product.effective_price }} €</span>
|
||||
{% if product.collision %}<span class="ml-1">{{ ui::badge(label=t(key="collision", lang=lang | default(value='sk')), variant="warning") }}</span>{% endif %}
|
||||
</td>
|
||||
<td class="px-4 py-3">
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<td class="px-4 py-3">
|
||||
{{ ui::badge(label=t(key="order-status-" ~ order.status, lang=lang | default(value='sk')), variant="neutral") }}
|
||||
</td>
|
||||
<td class="px-4 py-3 text-right tabular-nums">{{ order.total }} {{ order.currency }}</td>
|
||||
<td class="px-4 py-3 text-right tabular-nums">{{ order.total }} €</td>
|
||||
<td class="px-4 py-3 text-right">
|
||||
{{ ui::button(variant="outline-secondary", label=t(key="view", lang=lang | default(value='sk')), href="/admin/orders/" ~ order.id, size="px-3 py-1.5 text-xs") }}
|
||||
</td>
|
||||
|
||||
@@ -38,14 +38,14 @@
|
||||
<tr>
|
||||
<td class="px-4 py-3">{{ item.product_name }}{% if item.variant_label %} <span class="text-on-surface/60 dark:text-on-surface-dark/60">· {{ item.variant_label }}</span>{% endif %}</td>
|
||||
<td class="px-4 py-3 tabular-nums">{{ item.quantity }}</td>
|
||||
<td class="px-4 py-3 text-right tabular-nums">{{ item.line_total }} {{ order.currency }}</td>
|
||||
<td class="px-4 py-3 text-right tabular-nums">{{ item.line_total }} €</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
<tfoot class="{{ ui::tfoot_cls() }}">
|
||||
<tr>
|
||||
<td colspan="2" class="px-4 py-3 text-right font-semibold">{{ t(key="order-total", lang=lang | default(value='sk')) }}</td>
|
||||
<td class="px-4 py-3 text-right font-bold tabular-nums text-primary dark:text-primary-dark">{{ order.total }} {{ order.currency }}</td>
|
||||
<td class="px-4 py-3 text-right font-bold tabular-nums text-primary dark:text-primary-dark">{{ order.total }} €</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
@@ -75,7 +75,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-xs uppercase tracking-wide text-on-surface/60 dark:text-on-surface-dark/60">{{ t(key="checkout-carrier", lang=lang | default(value='sk')) }}</p>
|
||||
<p class="text-on-surface/80 dark:text-on-surface-dark/80">{{ order.carrier_name }} — {{ order.shipping }} {{ order.currency }}</p>
|
||||
<p class="text-on-surface/80 dark:text-on-surface-dark/80">{{ order.carrier_name }} — {{ order.shipping }} €</p>
|
||||
{% if order.pickup_point_name %}<p class="text-on-surface/80 dark:text-on-surface-dark/80">{{ order.pickup_point_name }}</p>{% endif %}
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@@ -132,10 +132,10 @@
|
||||
{% macro eff_price(p, preview=false) -%}
|
||||
{%- if preview -%}{% set strong = "text-info" %}{%- else -%}{% set strong = "text-primary dark:text-primary-dark" %}{%- endif -%}
|
||||
{% if p.effective_reduced %}
|
||||
<span class="font-medium {{ strong }}">{{ p.effective_price }} {{ p.currency }}</span>
|
||||
<span class="font-medium {{ strong }}">{{ p.effective_price }} €</span>
|
||||
<span class="ml-1 text-xs text-on-surface/60 dark:text-on-surface-dark/60">(−{{ p.effective_percent_off }}%)</span>
|
||||
{% else %}
|
||||
{{ p.effective_price }} {{ p.currency }}
|
||||
{{ p.effective_price }} €
|
||||
{% endif %}
|
||||
{%- endmacro eff_price %}
|
||||
|
||||
|
||||
@@ -38,11 +38,11 @@
|
||||
{% endif %}
|
||||
{% if product.on_sale %}
|
||||
<div class="flex flex-wrap items-baseline gap-x-2 leading-tight">
|
||||
<span class="text-xl font-semibold text-danger"><span class="sr-only">Price</span>{% if product.has_options %}{{ t(key="from-price", price=product.price, lang=lang | default(value='sk')) }}{% else %}{{ product.price }}{% endif %} {{ product.currency }}</span>
|
||||
<span class="text-sm text-on-surface/50 line-through dark:text-on-surface-dark/50">{{ product.regular_price }} {{ product.currency }}</span>
|
||||
<span class="text-xl font-semibold text-danger"><span class="sr-only">Price</span>{% if product.has_options %}{{ t(key="from-price", price=product.price, lang=lang | default(value='sk')) }}{% else %}{{ product.price }}{% endif %} €</span>
|
||||
<span class="text-sm text-on-surface/50 line-through dark:text-on-surface-dark/50">{{ product.regular_price }} €</span>
|
||||
</div>
|
||||
{% else %}
|
||||
<span class="break-words text-xl"><span class="sr-only">Price</span>{% if product.has_options %}{{ t(key="from-price", price=product.price, lang=lang | default(value='sk')) }}{% else %}{{ product.price }}{% endif %} {{ product.currency }}</span>
|
||||
<span class="break-words text-xl"><span class="sr-only">Price</span>{% if product.has_options %}{{ t(key="from-price", price=product.price, lang=lang | default(value='sk')) }}{% else %}{{ product.price }}{% endif %} €</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</a>
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
</td>
|
||||
<td class="px-4 py-3 tabular-nums">
|
||||
{% if item.on_sale %}
|
||||
<span class="font-medium text-danger">{{ item.price }} {{ item.currency }}</span>
|
||||
<span class="font-medium text-danger">{{ item.price }} €</span>
|
||||
<span class="ml-1 text-xs text-on-surface/50 line-through dark:text-on-surface-dark/50">{{ item.regular_price }}</span>
|
||||
{% else %}
|
||||
{{ item.price }} {{ item.currency }}
|
||||
{{ item.price }} €
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="px-4 py-3">
|
||||
@@ -48,7 +48,7 @@
|
||||
class="w-20 rounded-radius border border-outline bg-surface-alt px-2 py-1 text-sm text-on-surface focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary disabled:cursor-not-allowed disabled:opacity-75 dark:border-outline-dark dark:bg-surface-dark-alt/50 dark:text-on-surface-dark dark:focus-visible:outline-primary-dark">
|
||||
</form>
|
||||
</td>
|
||||
<td class="px-4 py-3 text-right font-medium tabular-nums">{{ item.line_total }} {{ item.currency }}</td>
|
||||
<td class="px-4 py-3 text-right font-medium tabular-nums">{{ item.line_total }} €</td>
|
||||
<td class="px-4 py-3 text-right">
|
||||
<form method="post" action="/cart/remove"
|
||||
hx-post="/cart/remove" hx-target="#cart-body" hx-swap="innerHTML">
|
||||
@@ -63,7 +63,7 @@
|
||||
<tfoot class="{{ ui::tfoot_cls() }}">
|
||||
<tr>
|
||||
<td colspan="3" class="px-4 py-3 text-right font-semibold text-on-surface-strong dark:text-on-surface-dark-strong">{{ t(key="cart-total", lang=lang | default(value='sk')) }}</td>
|
||||
<td class="px-4 py-3 text-right text-lg font-bold tabular-nums text-primary dark:text-primary-dark">{{ total }} {{ currency }}</td>
|
||||
<td class="px-4 py-3 text-right text-lg font-bold tabular-nums text-primary dark:text-primary-dark">{{ total }} €</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{# Mini-cart preview shown on hover over the navbar cart (Alza-style).
|
||||
Lazy-loaded via htmx from /partials/cart into the hover dropdown panel in
|
||||
base.html. Receives: items[], total, currency, lang. #}
|
||||
base.html. Receives: items[], total, lang. #}
|
||||
{% import "macros/ui.html" as ui %}
|
||||
{% if items | length > 0 %}
|
||||
<div class="max-h-80 divide-y divide-outline overflow-y-auto dark:divide-outline-dark">
|
||||
@@ -9,16 +9,16 @@
|
||||
<div class="min-w-0 flex-1">
|
||||
<a href="/shop/{{ item.slug }}" class="block truncate text-sm font-medium text-on-surface-strong hover:text-primary dark:text-on-surface-dark-strong dark:hover:text-primary-dark">{{ item.name }}</a>
|
||||
{% if item.variant_label %}<span class="block truncate text-xs text-on-surface/60 dark:text-on-surface-dark/60">{{ item.variant_label }}</span>{% endif %}
|
||||
<p class="mt-0.5 text-xs tabular-nums text-on-surface dark:text-on-surface-dark">{{ item.quantity }} × {{ item.price }} {{ item.currency }}</p>
|
||||
<p class="mt-0.5 text-xs tabular-nums text-on-surface dark:text-on-surface-dark">{{ item.quantity }} × {{ item.price }} €</p>
|
||||
</div>
|
||||
<span class="shrink-0 text-sm font-semibold tabular-nums text-on-surface-strong dark:text-on-surface-dark-strong">{{ item.line_total }} {{ item.currency }}</span>
|
||||
<span class="shrink-0 text-sm font-semibold tabular-nums text-on-surface-strong dark:text-on-surface-dark-strong">{{ item.line_total }} €</span>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="border-t border-outline px-4 py-3 dark:border-outline-dark">
|
||||
<div class="mb-3 flex items-center justify-between">
|
||||
<span class="text-sm text-on-surface dark:text-on-surface-dark">{{ t(key="cart-total", lang=lang | default(value='sk')) }}</span>
|
||||
<span class="text-base font-bold tabular-nums text-primary dark:text-primary-dark">{{ total }} {{ currency }}</span>
|
||||
<span class="text-base font-bold tabular-nums text-primary dark:text-primary-dark">{{ total }} €</span>
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
{{ ui::button(href="/cart", variant="outline-primary", label=t(key="cart-title", lang=lang | default(value='sk')), extra="flex-1", attrs='hx-boost="false"') }}
|
||||
|
||||
@@ -188,7 +188,7 @@
|
||||
class="before:content[''] relative h-4 w-4 appearance-none rounded-full border border-outline bg-surface before:invisible before:absolute before:left-1/2 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-x-1/2 before:-translate-y-1/2 before:rounded-full before:bg-on-primary checked:border-primary checked:bg-primary checked:before:visible focus:outline-2 focus:outline-offset-2 focus:outline-outline-strong checked:focus:outline-primary disabled:cursor-not-allowed dark:border-outline-dark dark:bg-surface-dark dark:before:bg-on-primary-dark dark:checked:border-primary-dark dark:checked:bg-primary-dark dark:focus:outline-outline-dark-strong dark:checked:focus:outline-primary-dark">
|
||||
<span class="font-medium text-on-surface-strong dark:text-on-surface-dark-strong">{{ m.name }}</span>
|
||||
</span>
|
||||
<span class="tabular-nums text-on-surface/80 dark:text-on-surface-dark/80">{{ m.price }} {{ currency }}</span>
|
||||
<span class="tabular-nums text-on-surface/80 dark:text-on-surface-dark/80">{{ m.price }} €</span>
|
||||
</label>
|
||||
{% endfor %}
|
||||
|
||||
@@ -252,23 +252,23 @@
|
||||
{% for item in items %}
|
||||
<li class="flex justify-between gap-2">
|
||||
<span class="text-on-surface/80 dark:text-on-surface-dark/80">{{ item.name }} × {{ item.quantity }}</span>
|
||||
<span class="tabular-nums">{{ item.line_total }} {{ item.currency }}</span>
|
||||
<span class="tabular-nums">{{ item.line_total }} €</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<div class="space-y-1 border-t border-outline pt-3 text-sm dark:border-outline-dark">
|
||||
<div class="flex justify-between">
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="checkout-subtotal", lang=lang | default(value='sk')) }}</span>
|
||||
<span class="tabular-nums">{{ subtotal }} {{ currency }}</span>
|
||||
<span class="tabular-nums">{{ subtotal }} €</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="checkout-shipping-cost", lang=lang | default(value='sk')) }}</span>
|
||||
<span class="tabular-nums" x-text="fmt(carrierPrice) + ' {{ currency }}'"></span>
|
||||
<span class="tabular-nums" x-text="fmt(carrierPrice) + ' €'"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-between border-t border-outline pt-3 text-base font-bold dark:border-outline-dark">
|
||||
<span>{{ t(key="cart-total", lang=lang | default(value='sk')) }}</span>
|
||||
<span class="tabular-nums text-primary dark:text-primary-dark" x-text="fmt(subtotal + carrierPrice) + ' {{ currency }}'"></span>
|
||||
<span class="tabular-nums text-primary dark:text-primary-dark" x-text="fmt(subtotal + carrierPrice) + ' €'"></span>
|
||||
</div>
|
||||
{{ ui::button(label=t(key="checkout-place-order", lang=lang | default(value='sk')), type="submit", attrs=':disabled="!canSubmit"', extra="w-full", size="px-6 py-2.5 text-sm") }}
|
||||
</aside>
|
||||
|
||||
@@ -30,18 +30,18 @@
|
||||
{% for item in items %}
|
||||
<li class="flex justify-between gap-2">
|
||||
<span class="text-on-surface/80 dark:text-on-surface-dark/80">{{ item.product_name }}{% if item.variant_label %} · {{ item.variant_label }}{% endif %} × {{ item.quantity }}</span>
|
||||
<span class="tabular-nums">{{ item.line_total }} {{ order.currency }}</span>
|
||||
<span class="tabular-nums">{{ item.line_total }} €</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<div class="space-y-1 border-t border-outline py-3 text-sm dark:border-outline-dark">
|
||||
<div class="flex justify-between"><span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="checkout-subtotal", lang=lang | default(value='sk')) }}</span><span class="tabular-nums">{{ order.subtotal }} {{ order.currency }}</span></div>
|
||||
<div class="flex justify-between"><span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ order.carrier_name }}</span><span class="tabular-nums">{{ order.shipping }} {{ order.currency }}</span></div>
|
||||
<div class="flex justify-between"><span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="checkout-subtotal", lang=lang | default(value='sk')) }}</span><span class="tabular-nums">{{ order.subtotal }} €</span></div>
|
||||
<div class="flex justify-between"><span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ order.carrier_name }}</span><span class="tabular-nums">{{ order.shipping }} €</span></div>
|
||||
{% if order.pickup_point_name %}<div class="text-xs text-on-surface/60 dark:text-on-surface-dark/60">{{ order.pickup_point_name }}</div>{% endif %}
|
||||
</div>
|
||||
<div class="flex justify-between border-t border-outline pt-3 font-bold dark:border-outline-dark">
|
||||
<span>{{ t(key="order-total", lang=lang | default(value='sk')) }}</span>
|
||||
<span class="tabular-nums text-primary dark:text-primary-dark">{{ order.total }} {{ order.currency }}</span>
|
||||
<span class="tabular-nums text-primary dark:text-primary-dark">{{ order.total }} €</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="bank-account-name", lang=lang | default(value='sk')) }}</span><span class="font-medium">{{ order.bank_account_name }}</span>
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">IBAN</span><span class="font-mono font-medium">{{ order.bank_iban }}</span>
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="bank-variable-symbol", lang=lang | default(value='sk')) }}</span><span class="font-mono font-medium">{{ order.variable_symbol }}</span>
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="bank-amount", lang=lang | default(value='sk')) }}</span><span class="font-medium tabular-nums">{{ order.total }} {{ order.currency }}</span>
|
||||
<span class="text-on-surface/70 dark:text-on-surface-dark/70">{{ t(key="bank-amount", lang=lang | default(value='sk')) }}</span><span class="font-medium tabular-nums">{{ order.total }} €</span>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
<label for="variant-select" class="text-sm font-medium text-on-surface-strong dark:text-on-surface-dark-strong">{{ t(key="choose-option", lang=lang | default(value='sk')) }}</label>
|
||||
<select id="variant-select" x-model.number="sel" class="{{ fld }}">
|
||||
<template x-for="(v, i) in variants" :key="v.id">
|
||||
<option :value="i" x-text="(v.label || '—') + ' · ' + v.price + ' {{ product.currency }}' + (v.in_stock ? '' : ' ({{ t(key='out-of-stock', lang=lang | default(value='sk')) }})')"></option>
|
||||
<option :value="i" x-text="(v.label || '—') + ' · ' + v.price + ' €' + (v.in_stock ? '' : ' ({{ t(key='out-of-stock', lang=lang | default(value='sk')) }})')"></option>
|
||||
</template>
|
||||
</select>
|
||||
</div>
|
||||
@@ -75,10 +75,10 @@
|
||||
|
||||
<div class="flex items-baseline gap-3">
|
||||
<p class="text-2xl font-semibold" :class="current.on_sale ? 'text-danger' : 'text-primary dark:text-primary-dark'">
|
||||
<span x-text="current.price"></span> {{ product.currency }}
|
||||
<span x-text="current.price"></span> €
|
||||
</p>
|
||||
<template x-if="current.on_sale">
|
||||
<p class="text-lg text-on-surface/50 line-through dark:text-on-surface-dark/50"><span x-text="current.regular_price"></span> {{ product.currency }}</p>
|
||||
<p class="text-lg text-on-surface/50 line-through dark:text-on-surface-dark/50"><span x-text="current.regular_price"></span> €</p>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ mod m20260622_000005_product_search_aggregate;
|
||||
mod m20260622_000006_order_search_indexes;
|
||||
mod m20260623_000001_add_short_description_to_products;
|
||||
mod m20260623_000002_strip_html_from_product_search;
|
||||
mod m20260623_000003_drop_currency;
|
||||
pub struct Migrator;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
@@ -98,6 +99,7 @@ impl MigratorTrait for Migrator {
|
||||
Box::new(m20260622_000006_order_search_indexes::Migration),
|
||||
Box::new(m20260623_000001_add_short_description_to_products::Migration),
|
||||
Box::new(m20260623_000002_strip_html_from_product_search::Migration),
|
||||
Box::new(m20260623_000003_drop_currency::Migration),
|
||||
// inject-above (do not remove this comment)
|
||||
]
|
||||
}
|
||||
|
||||
20
migration/src/m20260623_000003_drop_currency.rs
Normal file
20
migration/src/m20260623_000003_drop_currency.rs
Normal file
@@ -0,0 +1,20 @@
|
||||
use loco_rs::schema::*;
|
||||
use sea_orm_migration::prelude::*;
|
||||
|
||||
#[derive(DeriveMigrationName)]
|
||||
pub struct Migration;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl MigrationTrait for Migration {
|
||||
async fn up(&self, m: &SchemaManager) -> Result<(), DbErr> {
|
||||
// The store is EUR-only. Currency is no longer stored per product/order;
|
||||
// the euro symbol is rendered everywhere in the UI.
|
||||
remove_column(m, "products", "currency").await?;
|
||||
remove_column(m, "orders", "currency").await
|
||||
}
|
||||
|
||||
async fn down(&self, m: &SchemaManager) -> Result<(), DbErr> {
|
||||
add_column(m, "products", "currency", ColType::StringWithDefault("EUR".to_string())).await?;
|
||||
add_column(m, "orders", "currency", ColType::StringWithDefault("EUR".to_string())).await
|
||||
}
|
||||
}
|
||||
@@ -198,7 +198,6 @@ async fn show(
|
||||
"variant_id": variant.id,
|
||||
"name": product.name,
|
||||
"variant_label": variant.label,
|
||||
"currency": product.currency,
|
||||
"regular_price": format_price(d.regular_cents),
|
||||
"business_price": format_price(b.price_cents),
|
||||
"business_reduced": b.price_cents < d.regular_cents,
|
||||
@@ -285,7 +284,6 @@ async fn price_edit(
|
||||
"variant_id": variant.id,
|
||||
"name": product.name,
|
||||
"variant_label": variant.label,
|
||||
"currency": product.currency,
|
||||
"regular_price": format_price(d.regular_cents),
|
||||
"regular_cents": d.regular_cents,
|
||||
"business_price": format_price(business_cents),
|
||||
|
||||
@@ -202,7 +202,6 @@ async fn ship(
|
||||
country: order.country.as_deref(),
|
||||
pickup_point_id: order.pickup_point_id.as_deref(),
|
||||
cod_cents,
|
||||
currency: &order.currency,
|
||||
value_cents: goods_value,
|
||||
weight_grams: DEFAULT_PARCEL_WEIGHT_GRAMS,
|
||||
};
|
||||
|
||||
@@ -53,7 +53,6 @@ struct ProductFields {
|
||||
slug: String,
|
||||
description: Option<String>,
|
||||
short_description: Option<String>,
|
||||
currency: String,
|
||||
category_id: Option<i32>,
|
||||
published: bool,
|
||||
}
|
||||
@@ -66,7 +65,6 @@ async fn parse_product_fields(
|
||||
let name = form
|
||||
.text("name")
|
||||
.ok_or_else(|| Error::BadRequest("product name is required".to_string()))?;
|
||||
let currency = form.text("currency").unwrap_or_else(|| "EUR".to_string());
|
||||
let description = form.text("description");
|
||||
let short_description = form.text("short_description");
|
||||
let category_id = form.text("category_id").and_then(|s| s.parse::<i32>().ok());
|
||||
@@ -94,7 +92,6 @@ async fn parse_product_fields(
|
||||
slug,
|
||||
description,
|
||||
short_description,
|
||||
currency,
|
||||
category_id,
|
||||
published,
|
||||
})
|
||||
@@ -366,7 +363,6 @@ fn product_row(
|
||||
"id": product.id,
|
||||
"name": product.name,
|
||||
"slug": product.slug,
|
||||
"currency": product.currency,
|
||||
"stock": stock_display,
|
||||
"variant_count": variant_count,
|
||||
"has_options": variant_count > 1,
|
||||
@@ -442,7 +438,6 @@ async fn create(
|
||||
slug: Set(fields.slug),
|
||||
description: Set(fields.description),
|
||||
short_description: Set(fields.short_description),
|
||||
currency: Set(fields.currency),
|
||||
view_count: Set(0),
|
||||
published: Set(fields.published),
|
||||
published_at: Set(fields.published.then(|| chrono::Utc::now().into())),
|
||||
@@ -557,7 +552,6 @@ async fn update(
|
||||
product.slug = Set(fields.slug);
|
||||
product.description = Set(fields.description);
|
||||
product.short_description = Set(fields.short_description);
|
||||
product.currency = Set(fields.currency);
|
||||
product.category_id = Set(fields.category_id);
|
||||
product.published = Set(fields.published);
|
||||
if fields.published && !was_published {
|
||||
@@ -704,7 +698,6 @@ async fn profiles_preview(
|
||||
}
|
||||
rows.push(json!({
|
||||
"id": product.id,
|
||||
"currency": product.currency,
|
||||
"effective_price": format_price(priced.price_cents),
|
||||
"effective_reduced": priced.is_reduced(),
|
||||
"effective_percent_off": percent_off(priced.regular_cents, priced.price_cents),
|
||||
@@ -816,13 +809,12 @@ impl DiscountRow {
|
||||
}
|
||||
}
|
||||
|
||||
fn to_json(&self, currency: &str) -> serde_json::Value {
|
||||
fn to_json(&self) -> serde_json::Value {
|
||||
json!({
|
||||
"id": self.id,
|
||||
"label": self.label,
|
||||
"regular_cents": self.regular_cents,
|
||||
"regular_price": format_price(self.regular_cents),
|
||||
"currency": currency,
|
||||
"mode": self.mode,
|
||||
"fixed": self.fixed,
|
||||
"percent": self.percent,
|
||||
@@ -871,7 +863,7 @@ async fn discount_view(
|
||||
audience: &str,
|
||||
error: Option<&str>,
|
||||
) -> Result<Response> {
|
||||
let rows_json: Vec<_> = rows.iter().map(|r| r.to_json(&product.currency)).collect();
|
||||
let rows_json: Vec<_> = rows.iter().map(DiscountRow::to_json).collect();
|
||||
let has_discount = rows.iter().any(|r| r.has_discount);
|
||||
format::view(
|
||||
v,
|
||||
@@ -880,7 +872,6 @@ async fn discount_view(
|
||||
"product": {
|
||||
"id": product.id,
|
||||
"name": product.name,
|
||||
"currency": product.currency,
|
||||
},
|
||||
"rows": rows_json,
|
||||
"audience": audience,
|
||||
|
||||
@@ -65,7 +65,7 @@ fn cart_cookie(value: String) -> Cookie<'static> {
|
||||
}
|
||||
|
||||
/// Look up a variant whose product is published, returning the variant together
|
||||
/// with its parent product (for name/slug/currency).
|
||||
/// with its parent product (for name/slug).
|
||||
async fn published_variant(
|
||||
ctx: &AppContext,
|
||||
variant_id: i32,
|
||||
@@ -174,11 +174,6 @@ async fn cart_response(
|
||||
}
|
||||
|
||||
let (lines, valid, total) = resolve_cart(ctx, &jar).await?;
|
||||
let currency = lines
|
||||
.first()
|
||||
.and_then(|line| line["currency"].as_str())
|
||||
.unwrap_or("EUR")
|
||||
.to_string();
|
||||
// Persist the re-validated cookie (drops now-invalid lines).
|
||||
let jar = jar.add(cart_cookie(serialize_cart(&valid)));
|
||||
let response = format::view(
|
||||
@@ -187,7 +182,6 @@ async fn cart_response(
|
||||
json!({
|
||||
"items": lines,
|
||||
"total": format_price(total),
|
||||
"currency": currency,
|
||||
"lang": current_lang(&jar),
|
||||
}),
|
||||
)?;
|
||||
@@ -235,7 +229,6 @@ pub(crate) async fn resolve_cart(
|
||||
"price": format_price(unit_price),
|
||||
"regular_price": format_price(priced.regular_cents),
|
||||
"on_sale": priced.is_reduced(),
|
||||
"currency": product.currency,
|
||||
"quantity": qty,
|
||||
"stock": variant.stock,
|
||||
"line_total": format_price(line_total),
|
||||
@@ -252,11 +245,6 @@ async fn show(
|
||||
State(ctx): State<AppContext>,
|
||||
) -> Result<Response> {
|
||||
let (lines, valid, total) = resolve_cart(&ctx, &jar).await?;
|
||||
let currency = lines
|
||||
.first()
|
||||
.and_then(|line| line["currency"].as_str())
|
||||
.unwrap_or("EUR")
|
||||
.to_string();
|
||||
|
||||
// Drop any now-invalid lines from the cookie so the badge stays accurate.
|
||||
let rebuilt = serialize_cart(&valid);
|
||||
@@ -267,7 +255,6 @@ async fn show(
|
||||
json!({
|
||||
"items": lines,
|
||||
"total": format_price(total),
|
||||
"currency": currency,
|
||||
"logged_in_admin": c.logged_in_admin,
|
||||
"logged_in_customer": c.logged_in_customer,
|
||||
"customer_name": c.customer_name,
|
||||
@@ -288,11 +275,6 @@ async fn preview(
|
||||
State(ctx): State<AppContext>,
|
||||
) -> Result<Response> {
|
||||
let (lines, valid, total) = resolve_cart(&ctx, &jar).await?;
|
||||
let currency = lines
|
||||
.first()
|
||||
.and_then(|line| line["currency"].as_str())
|
||||
.unwrap_or("EUR")
|
||||
.to_string();
|
||||
let rebuilt = serialize_cart(&valid);
|
||||
let response = format::view(
|
||||
&v,
|
||||
@@ -300,7 +282,6 @@ async fn preview(
|
||||
json!({
|
||||
"items": lines,
|
||||
"total": format_price(total),
|
||||
"currency": currency,
|
||||
"lang": current_lang(&jar),
|
||||
}),
|
||||
)?;
|
||||
|
||||
@@ -81,11 +81,6 @@ async fn checkout_page(
|
||||
if lines.is_empty() {
|
||||
return format::redirect("/cart");
|
||||
}
|
||||
let currency = lines
|
||||
.first()
|
||||
.and_then(|line| line["currency"].as_str())
|
||||
.unwrap_or("EUR")
|
||||
.to_string();
|
||||
|
||||
let methods: Vec<serde_json::Value> = enabled_shipping_methods(&ctx)
|
||||
.await?
|
||||
@@ -127,7 +122,6 @@ async fn checkout_page(
|
||||
"items": lines,
|
||||
"subtotal": format_price(subtotal),
|
||||
"subtotal_cents": subtotal,
|
||||
"currency": currency,
|
||||
"shipping_methods": methods,
|
||||
"packeta_api_key": settings::get(&ctx, "packeta_api_key").unwrap_or(""),
|
||||
"logged_in_admin": is_admin,
|
||||
|
||||
@@ -411,7 +411,6 @@ async fn show(
|
||||
"name": product.name,
|
||||
"slug": product.slug,
|
||||
"description": product.description,
|
||||
"currency": product.currency,
|
||||
"variant_count": 0,
|
||||
"has_options": false,
|
||||
}),
|
||||
|
||||
@@ -28,7 +28,6 @@ pub struct ShipmentRequest<'a> {
|
||||
pub pickup_point_id: Option<&'a str>,
|
||||
/// Cash-on-delivery amount in cents; `0` when payment is not COD.
|
||||
pub cod_cents: i64,
|
||||
pub currency: &'a str,
|
||||
/// Total order value in cents (for insurance / customs declarations).
|
||||
pub value_cents: i64,
|
||||
pub weight_grams: i32,
|
||||
|
||||
@@ -77,7 +77,7 @@ pub async fn create_shipment(ctx: &AppContext, req: ShipmentRequest<'_>) -> Resu
|
||||
xml_escape(address_id),
|
||||
value,
|
||||
cod,
|
||||
xml_escape(req.currency),
|
||||
"EUR",
|
||||
weight_kg,
|
||||
xml_escape(sender_label),
|
||||
);
|
||||
|
||||
@@ -16,7 +16,6 @@ pub struct Model {
|
||||
pub customer_name: Option<String>,
|
||||
pub status: String,
|
||||
pub total_cents: i64,
|
||||
pub currency: String,
|
||||
pub address: Option<String>,
|
||||
pub city: Option<String>,
|
||||
pub zip: Option<String>,
|
||||
|
||||
@@ -17,7 +17,6 @@ pub struct Model {
|
||||
pub description: Option<String>,
|
||||
#[sea_orm(column_type = "Text", nullable)]
|
||||
pub short_description: Option<String>,
|
||||
pub currency: String,
|
||||
pub view_count: i32,
|
||||
pub published: bool,
|
||||
pub published_at: Option<DateTimeWithTimeZone>,
|
||||
|
||||
@@ -53,7 +53,6 @@ pub async fn place(
|
||||
let txn = ctx.db.begin().await?;
|
||||
|
||||
let mut subtotal: i64 = 0;
|
||||
let mut currency = "EUR".to_string();
|
||||
let mut snapshots = Vec::new();
|
||||
for (variant_id, qty) in items {
|
||||
let variant = product_variants::Entity::find_by_id(*variant_id)
|
||||
@@ -75,7 +74,6 @@ pub async fn place(
|
||||
)));
|
||||
}
|
||||
}
|
||||
currency = product.currency.clone();
|
||||
// Snapshot the price the buyer actually pays — public sale or, for a
|
||||
// business account, their negotiated/lowest price (same resolver the
|
||||
// cart and storefront use).
|
||||
@@ -98,7 +96,6 @@ pub async fn place(
|
||||
customer_name: Set(details.customer_name),
|
||||
status: Set("pending".to_string()),
|
||||
total_cents: Set(subtotal + details.method.price_cents),
|
||||
currency: Set(currency),
|
||||
user_id: Set(details.user_id),
|
||||
account_type: Set(details.account_type),
|
||||
company_name: Set(details.company_name),
|
||||
|
||||
@@ -57,7 +57,7 @@ impl Entity {
|
||||
let sql = format!(
|
||||
r#"
|
||||
SELECT p.created_at, p.updated_at, p.id, p.name, p.slug, p.description,
|
||||
p.currency, p.view_count, p.published, p.published_at, p.category_id
|
||||
p.short_description, p.view_count, p.published, p.published_at, p.category_id
|
||||
FROM products p
|
||||
WHERE {published_clause} (
|
||||
p.search_vector @@ websearch_to_tsquery('sk_unaccent', $1)
|
||||
|
||||
@@ -161,7 +161,6 @@ pub async fn seed_catalog(ctx: &AppContext) -> Result<()> {
|
||||
name: Set(item.name.to_string()),
|
||||
slug: Set(product_slug),
|
||||
description: Set(Some(item.description.to_string())),
|
||||
currency: Set("EUR".to_string()),
|
||||
published: Set(true),
|
||||
published_at: Set(Some(now.into())),
|
||||
category_id: Set(category.map(|c| c.id)),
|
||||
|
||||
@@ -40,7 +40,6 @@ pub fn detail(order: &orders::Model, bank_iban: &str, bank_account_name: &str) -
|
||||
"subtotal": format_price(order.total_cents - order.shipping_cents),
|
||||
"shipping": format_price(order.shipping_cents),
|
||||
"total": format_price(order.total_cents),
|
||||
"currency": order.currency,
|
||||
"address": order.address,
|
||||
"city": order.city,
|
||||
"zip": order.zip,
|
||||
@@ -68,7 +67,6 @@ pub fn summary(order: &orders::Model) -> Value {
|
||||
"email": order.email,
|
||||
"status": order.status,
|
||||
"total": format_price(order.total_cents),
|
||||
"currency": order.currency,
|
||||
"created_at": order.created_at.to_rfc3339(),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@ pub fn product_card(
|
||||
"on_sale": priced.is_reduced(),
|
||||
"is_business": priced.is_business,
|
||||
"regular_price": format_price(priced.regular_cents),
|
||||
"currency": product.currency,
|
||||
"sku": representative.sku,
|
||||
"stock": representative.stock,
|
||||
"tracked": representative.tracked(),
|
||||
@@ -71,7 +70,6 @@ pub fn product_form(product: &products::Model, images: &[product_images::Model])
|
||||
"slug": product.slug,
|
||||
"description": product.description,
|
||||
"short_description": product.short_description,
|
||||
"currency": product.currency,
|
||||
"published": product.published,
|
||||
"category_id": product.category_id,
|
||||
"images": images
|
||||
|
||||
Reference in New Issue
Block a user