9266 lines
499 KiB
XML
9266 lines
499 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<theme name="Default" author_name="Invision Power Services, Inc" author_url="https://www.invisioncommunity.com">
|
|
<template template_group="billingagreements" template_name="view" template_data="$billingAgreement, $purchases, $transactions" template_location="admin" template_app="nexus"><![CDATA[{{if $billingAgreement->status() == $billingAgreement::STATUS_ACTIVE and !$billingAgreement->next_cycle}}
|
|
<p class="ipsMessage ipsMessage--warning">{lang="billing_agreement_run_failed" sprintf="$billingAgreement->acpUrl()->setQueryString( 'do', 'reconcile' )->csrf()"}</p>
|
|
{{endif}}
|
|
<div class='ipsSpanGrid' data-ips-template="view">
|
|
<div class='ipsSpanGrid__4'>
|
|
{{if $billingAgreement->status() == $billingAgreement::STATUS_ACTIVE}}
|
|
<p class='i-background_positive i-padding_3 i-text-align_center i-margin-bottom_3'>
|
|
<span class='ipsTitle ipsTitle--h3'><i class='fa-solid fa-check-circle'></i> {lang="billing_agreement_active"}</span>
|
|
</p>
|
|
{{elseif $billingAgreement->status() == $billingAgreement::STATUS_SUSPENDED}}
|
|
<p class='i-background_3 i-padding_3 i-text-align_center i-margin-bottom_3'>
|
|
<span class='ipsTitle ipsTitle--h3'><i class='fa-solid fa-circle-exclamation'></i> {lang="billing_agreement_suspended"}</span>
|
|
</p>
|
|
{{elseif $billingAgreement->status() == $billingAgreement::STATUS_CANCELED}}
|
|
<p class='i-background_negative i-padding_3 i-text-align_center i-margin-bottom_3'>
|
|
<span class='ipsTitle ipsTitle--h3'><i class='fa-solid fa-xmark-circle'></i> {lang="billing_agreement_canceled"}</span>
|
|
</p>
|
|
{{endif}}
|
|
<div class="ipsBox i-margin-bottom_1">
|
|
<h2 class='ipsBox__header'>{lang="billing_agreement_details"}</h2>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--billing-agreements">
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120">
|
|
<strong>{lang="ba_gw_id"}</strong>
|
|
</span>
|
|
<span class="">
|
|
{$billingAgreement->gw_id}
|
|
</span>
|
|
</li>
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120">
|
|
<strong>{lang="billing_agreement_term"}</strong>
|
|
</span>
|
|
<span class="">
|
|
{$billingAgreement->term()}
|
|
</span>
|
|
</li>
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120">
|
|
<strong>{lang="ba_started"}</strong>
|
|
</span>
|
|
<span class="">
|
|
{$billingAgreement->started->localeDate()}
|
|
</span>
|
|
</li>
|
|
{{if $billingAgreement->next_cycle}}
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120">
|
|
<strong>{lang="billing_agreement_next_payment"}</strong>
|
|
</span>
|
|
<span class="">
|
|
{$billingAgreement->nextPaymentDate()->localeDate()}
|
|
</span>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
<div class="ipsBox i-margin-bottom_1">
|
|
<h2 class="ipsBox__header">{lang="purchase_customer_info"}</h2>
|
|
{{if $billingAgreement->member}}
|
|
<div class='i-padding_3 ipsPhotoPanel ipsPhotoPanel_small'>
|
|
<a href="{$billingAgreement->member->acpUrl()}"><img src='{$billingAgreement->member->photo}' class='ipsUserPhoto ipsUserPhoto--small' alt="" loading="lazy"></a>
|
|
<div>
|
|
<h3 class='i-font-size_2 i-link-color_inherit'><strong><a href="{$billingAgreement->member->acpUrl()}">{$billingAgreement->member->cm_name}</a></strong></h3>
|
|
{$billingAgreement->member->email}<br>
|
|
{lang="transaction_customer_since" sprintf="$billingAgreement->member->joined->localeDate()"}<br>
|
|
{lang="transaction_spent" sprintf="$billingAgreement->member->totalSpent()"}
|
|
</div>
|
|
</div>
|
|
{{else}}
|
|
<div class='i-padding_3'>
|
|
<p class="ipsMessage ipsMessage--error">{lang="billing_agreement_no_member"}</p>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
<div class='ipsSpanGrid__8'>
|
|
{{if $purchases}}
|
|
<div class="i-margin-bottom_1">
|
|
<h2 class="acpBlock_title acpBlock_titleDark acpBlock_titleSmall">{lang="billing_agreement_purchases"}</h2>
|
|
{$purchases|raw}
|
|
</div>
|
|
{{endif}}
|
|
{{if $transactions}}
|
|
<div class="i-margin-bottom_1">
|
|
<h2 class="acpBlock_title acpBlock_titleDark acpBlock_titleSmall">{lang="billing_agreement_transactions"}</h2>
|
|
{$transactions|raw}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="checkout" template_name="checkoutOrderSummary" template_data="$summary" template_location="front" template_app="nexus"><![CDATA[
|
|
{{$totalItems = 0;}}
|
|
{{$itemTotal = new \IPS\Math\Number('0');}}
|
|
{{foreach $summary['items'] as $item}}
|
|
{{if !( $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount )}}
|
|
{{$itemTotal = $itemTotal->add( $item->linePrice()->amount );}}
|
|
{{$totalItems += $item->quantity;}}
|
|
{{endif}}
|
|
{{endforeach}}
|
|
<div>
|
|
<h2 class='ipsTitle ipsTitle--h3 ipsTitle--padding'>{lang="order_review"}</h2>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table i-margin-top_3">
|
|
<li class='ipsData__item'>
|
|
<div class='ipsData__main'>
|
|
<span>{lang="summary_items" pluralize="$totalItems"}</span>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end'>
|
|
<span class='cNexusPrice'>{money="$itemTotal"}</span>
|
|
</div>
|
|
</li>
|
|
{{foreach $summary['items'] as $item}}
|
|
{{if $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount}}
|
|
<li class='ipsData__item cNexusCheckout_coupon'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="coupon"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
{$item->linePrice()}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
<li class='ipsData__item cNexusCheckout_subtotal'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="subtotal"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
{$summary['subtotal']}
|
|
</div>
|
|
</li>
|
|
{{foreach $summary['tax'] as $taxId => $tax}}
|
|
<li class='ipsData__item'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="nexus_tax_{$taxId}"} ({expression="$tax['rate']*100"}%)</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
{$tax['amount']}
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</div>]]></template>
|
|
<template template_group="checkout" template_name="checkoutWrapper" template_data="$content, $checkoutStatus = NULL" template_location="front" template_app="nexus"><![CDATA[
|
|
<div class='ipsBox ipsPull ipsBox--checkoutWrapper'>
|
|
<div class='i-text-align_center i-padding_3 i-border-bottom_3'>
|
|
{{if $checkoutStatus && $checkoutStatus != 'continue'}}
|
|
{{if $checkoutStatus === 'complete'}}
|
|
<i class='i-font-size_6 fa-solid fa-check-circle i-margin-bottom_2 i-color_soft'></i>
|
|
<h1 class='i-font-size_5 i-font-weight_600 i-color_hard i-text-align_center'>{lang="transaction_title_success"}</h1>
|
|
{{elseif $checkoutStatus === 'waiting'}}
|
|
<i class='i-font-size_6 fa-regular fa-clock i-margin-bottom_2 i-color_soft'></i>
|
|
<h1 class='i-font-size_5 i-font-weight_600 i-color_hard i-text-align_center'>{lang="transaction_title_waiting"}</h1>
|
|
{{elseif $checkoutStatus === 'hold'}}
|
|
<i class='i-font-size_6 fa-regular fa-clock i-margin-bottom_2 i-color_soft'></i>
|
|
<h1 class='i-font-size_5 i-font-weight_600 i-color_hard i-text-align_center'>{lang="transaction_title_hold"}</h1>
|
|
{{elseif $checkoutStatus === 'pending'}}
|
|
<i class='i-font-size_6 fa-regular fa-clock i-margin-bottom_2 i-color_soft'></i>
|
|
<h1 class='i-font-size_5 i-font-weight_600 i-color_hard i-text-align_center'>{lang="transaction_title_pending"}</h1>
|
|
{{elseif $checkoutStatus === 'refused'}}
|
|
<i class='i-font-size_6 fa-solid fa-triangle-exclamation i-margin-bottom_2 i-color_soft'></i>
|
|
<h1 class='i-font-size_5 i-font-weight_600 i-color_hard i-text-align_center'>{lang="transaction_title_refused"}</h1>
|
|
{{endif}}
|
|
{{else}}
|
|
<i class='i-font-size_6 fa-solid fa-cart-shopping i-margin-bottom_2 i-color_soft'></i>
|
|
<h1 class='i-font-size_5 i-font-weight_600 i-color_hard i-text-align_center'>{lang="checkout"}</h1>
|
|
{{endif}}
|
|
{{if \IPS\Request::i()->isSecure() === TRUE}}
|
|
<div class="i-margin-top_1 i-font-weight_500 i-color_soft"><i class='fa-solid fa-lock'></i> {lang="secure_page"}</div>
|
|
{{endif}}
|
|
</div>
|
|
|
|
<section id='elCheckoutContent'>
|
|
{$content|raw}
|
|
</section>
|
|
</div>]]></template>
|
|
<template template_group="checkout" template_name="confirmAndPay" template_data="$invoice, $summary, $form, $amountToPay, $couponForm, $recurrings, $overriddenRenewalTerms" template_location="front" template_app="nexus"><![CDATA[<div class='ipsColumns ipsColumns--reverse ipsColumns--lines cNexusCheckout_review' data-controller='nexus.front.checkout.review'>
|
|
<div class='ipsColumns__primary'>
|
|
<div class="i-padding_3">
|
|
{{if $invoice->billaddress}}
|
|
<div class='ipsSpanGrid i-margin-bottom_3'>
|
|
{{if $invoice->billaddress}}
|
|
<div class='ipsSpanGrid__6'>
|
|
<h2 class='ipsTitle ipsTitle--h3'>{lang="billing_address"} <a href='{$invoice->checkoutUrl()->setQueryString( '_step', 'checkout_customer' )}' data-action='wizardLink' class='i-font-size_-2'>({lang="edit"})</a></h2>
|
|
<div class='i-margin-top_3'>
|
|
{$invoice->billaddress->toString('<br>')|raw}
|
|
{{if isset( $invoice->billaddress->vat ) and $invoice->billaddress->vat}}
|
|
<br>
|
|
{lang="cm_checkout_vat_number"}: {$invoice->billaddress->vat}
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
{{if $invoice->member->email}}
|
|
<div class='i-color_soft'>
|
|
<i class='fa-solid fa-circle-info'></i> {lang="confirmation_sent_to" sprintf="$invoice->member->email"}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
|
|
{$couponForm|raw}
|
|
|
|
<section>
|
|
<h2 class='ipsHide'>
|
|
{{if \IPS\Request::i()->isSecure() === TRUE}}
|
|
<i class='fa-solid fa-lock'></i> {lang="secure_payment"}
|
|
{{else}}
|
|
{lang="payment"}
|
|
{{endif}}
|
|
</h2>
|
|
<div>
|
|
{$form|raw}
|
|
</div>
|
|
</section>
|
|
</div>
|
|
<div class='ipsColumns__secondary i-basis_360'>
|
|
<div class="i-padding_3">
|
|
<h2 class='ipsTitle ipsTitle--h3'>{lang="order_review"}</h2>
|
|
</div>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--order-review">
|
|
{{foreach $summary['items'] as $item}}
|
|
{{if !( $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount )}}
|
|
<li class='ipsData__item'>
|
|
<div class="ipsData__image" aria-hidden="true">
|
|
{{if $image = $item->image()}}
|
|
<img src="{$image->url}" alt="" loading="lazy">
|
|
{{elseif $item::$icon}}
|
|
<i class='fa-solid fa-{$item::$icon}'></i>
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div><span class='i-color_soft'>{$item->quantity} x </span>{$item->name}</div>
|
|
{$item->detailsForDisplay( 'checkout' )|raw}
|
|
</div>
|
|
<div class='i-text-align_end'>
|
|
<span class='cNexusPrice'>{$item->linePrice()}</span>
|
|
{{if $item->quantity > 1}}
|
|
<p class='i-font-size_-2 i-color_soft'>
|
|
{lang="each_short" sprintf="$item->price"}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{foreach $summary['items'] as $item}}
|
|
{{if $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount}}
|
|
<li class='ipsData__item cNexusCheckout_coupon'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="coupon"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
{$item->linePrice()}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
<li class='ipsData__item cNexusCheckout_subtotal'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="subtotal"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
{$summary['subtotal']}
|
|
</div>
|
|
</li>
|
|
{{foreach $summary['tax'] as $taxId => $tax}}
|
|
<li class='ipsData__item'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="nexus_tax_{$taxId}"} <span class='i-color_soft i-font-weight_normal'>({expression="$tax['rate']*100"}%)</span></strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
{$tax['amount']}
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
{{if $transactionsReceived = $invoice->transactions( array( \IPS\nexus\Transaction::STATUS_PAID, \IPS\nexus\Transaction::STATUS_PART_REFUNDED, \IPS\nexus\Transaction::STATUS_HELD, \IPS\nexus\Transaction::STATUS_REVIEW, \IPS\nexus\Transaction::STATUS_GATEWAY_PENDING ) )}}
|
|
{{if \count( $transactionsReceived )}}
|
|
{{foreach $transactionsReceived as $id => $transaction}}
|
|
<li class='ipsData__item i-font-size_2 {{if $id === 0}}cNexusCheckout_subtotal{{endif}}'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="payment_received"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
<strong>{money="$transaction->amount->amount->subtract( $transaction->partial_refund->amount )->multiply( new \IPS\Math\Number('-1') )" currency="$transaction->currency"}</strong>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
<li class='ipsData__item i-font-size_2 cNexusCheckout_subtotal'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="total_to_pay"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
<strong>{$invoice->amountToPay( TRUE )}</strong>
|
|
</div>
|
|
</li>
|
|
{{else}}
|
|
<li class='ipsData__item i-font-size_2 cNexusCheckout_subtotal'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="total"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
<strong>{$invoice->amountToPay()}</strong>
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{endif}}
|
|
</ul>
|
|
</i-data>
|
|
{{if \count( $recurrings )}}
|
|
{{$taxAmount = new \IPS\Math\Number('0');}}
|
|
{{foreach $recurrings as $recurring}}
|
|
<div class="i-padding_3">
|
|
<h3 class="ipsTitle ipsTitle--h3 i-margin-top_3">{lang="renewals_header" sprintf="$recurring['term']->getTermUnit()"}</h3>
|
|
</div>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--renewals i-margin-top_3">
|
|
{{foreach $recurring['items'] as $rId => $item}}
|
|
{{if !( $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount )}}
|
|
<li class='ipsData__item'>
|
|
<div class="ipsData__image" aria-hidden="true">
|
|
{{if $image = $item->image()}}
|
|
<img src="{$image->url}" alt="" loading="lazy">
|
|
{{elseif $item::$icon}}
|
|
<i class='fa-solid fa-{$item::$icon}'></i>
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div><span class='i-color_soft'>{$item->quantity} x </span>{$item->name}</div>
|
|
{$item->detailsForDisplay( 'checkout' )|raw}
|
|
{{if isset( $recurring['showDueDate'] ) AND !$recurring['showDueDate']}}
|
|
<strong>{lang="product_renews_on" sprintf="$item->expireDate->relative()"}</strong>
|
|
{{endif}}
|
|
</div>
|
|
<div class='i-basis_120 i-text-align_end'>
|
|
<span class='cNexusPrice'>
|
|
{{if $item instanceof \IPS\nexus\Invoice\Item\Renewal}}
|
|
{$item->linePrice()}
|
|
{{else}}
|
|
{{if isset( $overriddenRenewalTerms[ $rId ] )}}
|
|
{money="$overriddenRenewalTerms[ $rId ]->cost->amount->multiply( new \IPS\Math\Number( (string) $item->quantity ) )" currency="$overriddenRenewalTerms[ $rId ]->cost->currency"}
|
|
{{elseif $item->renewalTerm}}
|
|
{money="$item->renewalTerm->cost->amount->multiply( new \IPS\Math\Number( (string) $item->quantity ) )" currency="$item->renewalTerm->cost->currency"}
|
|
{{endif}}
|
|
{{endif}}
|
|
</span>
|
|
{{if $item->quantity > 1 AND (!$item instanceof \IPS\nexus\Invoice\Item\Renewal)}}
|
|
<p class='i-font-size_-2 i-color_soft'>
|
|
{lang="each_short" sprintf="$item->renewalTerm->cost"}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{if $recurring['term']->tax and $taxRate = $recurring['term']->tax->rate( $invoice->billaddress ) and $taxAmount = $recurring['term']->cost->amount->multiply( new \IPS\Math\Number( $taxRate ) )}}
|
|
<li class='ipsData__item'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{$recurring['term']->tax->_title} <span class='i-color_soft i-font-weight_normal'>({expression="$taxRate*100"}%)</span></strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
{money="$taxAmount" currency="$recurring['term']->cost->currency"}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{if !isset( $recurring['showDueDate'] ) OR $recurring['showDueDate'] }}
|
|
<li class='ipsData__item cNexusCheckout_subtotal'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="total_due_on" sprintf="$recurring['dueDate']->relative()"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
<strong>{money="$recurring['term']->cost->amount->add( $taxAmount )" currency="$recurring['term']->cost->currency"}</strong>
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</i-data>
|
|
{{endforeach}}
|
|
{{endif}}
|
|
{{if settings.nexus_tac === 'button'}}
|
|
<p class="i-font-size_-2">{lang="you_agree_to_tac" sprintf="\IPS\Settings::i()->nexus_tac_link"}</p>
|
|
{{endif}}
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="checkout" template_name="couponForm" template_data="$id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar=NULL, $form=NULL" template_location="front" template_app="nexus"><![CDATA[
|
|
<form accept-charset='utf-8' class="ipsForm {$class} ipsForm--coupon" action="{$action}" method="post" {{if $uploadField}}enctype="multipart/form-data"{{endif}} {{foreach $attributes as $k => $v}}{$k}="{$v}"{{endforeach}} data-ipsForm data-role='couponForm'>
|
|
<input type="hidden" name="{$id}_submitted" value="1">
|
|
{{foreach $hiddenValues as $k => $v}}
|
|
{{if \is_array($v)}}
|
|
{{foreach $v as $_k => $_v}}
|
|
<input type="hidden" name="{$k}[{$_k}]" value="{$_v}">
|
|
{{endforeach}}
|
|
{{else}}
|
|
<input type="hidden" name="{$k}" value="{$v}">
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{if $uploadField}}
|
|
<input type="hidden" name="MAX_FILE_SIZE" value="{$uploadField}">
|
|
<input type="hidden" name="plupload" value="{expression="md5( mt_rand() )"}">
|
|
{{endif}}
|
|
|
|
<div class='i-padding_2 i-border-top_3'>
|
|
{{if $form->error}}
|
|
<div class="ipsMessage ipsMessage--error">
|
|
{$form->error}
|
|
</div>
|
|
{{endif}}
|
|
<h2 class='ipsMinorTitle'>{lang="do_you_have_coupon"}</h2>
|
|
<div class='i-flex i-gap_1 i-margin-top_2'>
|
|
{{foreach $elements as $collection}}
|
|
{{foreach $collection as $inputName => $input}}
|
|
<div class='i-flex_11'>
|
|
{$input->html()|raw}
|
|
{{if $input->error}}
|
|
<p class="i-margin-top_2 i-font-size_-2 i-color_warning">{lang="$input->error"}</p>
|
|
{{endif}}
|
|
</div>
|
|
{{endforeach}}
|
|
{{endforeach}}
|
|
<button type='submit' class='i-flex_00 ipsButton ipsButton--inherit'>{lang="apply_coupon"}</button>
|
|
</div>
|
|
</div>
|
|
</form>]]></template>
|
|
<template template_group="checkout" template_name="customerInformation" template_data="$informationForm, $login, $loginError, $invoice" template_location="front" template_app="nexus"><![CDATA[{{if $login !== NULL}}
|
|
<section data-controller='nexus.front.checkout.register' {{if isset( \IPS\Request::i()->customer_submitted )}}data-regform="true"{{endif}}>
|
|
{{$usernamePasswordMethods = $login->usernamePasswordMethods();}}
|
|
{{$buttonMethods = $login->buttonMethods();}}
|
|
{{if \IPS\Login::registrationType() != 'disabled' or ( $usernamePasswordMethods and $buttonMethods )}}
|
|
<div class='ipsFluid i-basis_280 i-gap_lines' data-role="memberChoice">
|
|
<div class='cNexusCheckout_returning'>
|
|
<h2 class="i-padding_3 ipsTitle ipsTitle--h3">{lang="returning_member"}</h2>
|
|
<div class=''>
|
|
{{if $loginError !== NULL}}
|
|
{template="message" group="global" location="global" app="core" params="$loginError, 'error'"}
|
|
{{endif}}
|
|
<form accept-charset='utf-8' method='post' action='{$login->url}' class="ipsForm ipsForm--fullWidth" data-controller="core.global.core.login">
|
|
<input type="hidden" name="csrfKey" value="{expression="\IPS\Session::i()->csrfKey"}">
|
|
{{if $usernamePasswordMethods}}
|
|
{template="loginForm" app="core" group="system" params="$login"}
|
|
{{elseif $buttonMethods}}
|
|
<div class='i-gap_2 i-margin-top_2'>
|
|
{{foreach $buttonMethods as $method}}
|
|
<div class='i-text-align_center'>
|
|
{$method->button()|raw}
|
|
</div>
|
|
{{endforeach}}
|
|
</div>
|
|
{{endif}}
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<div class="i-background_2 i-padding_3">
|
|
{{if \IPS\Login::registrationType() != 'disabled'}}
|
|
<div class="i-margin-bottom_3">
|
|
<h2 class="ipsTitle ipsTitle--h3">{lang="new_customers"}</h2>
|
|
<p class="i-color_soft i-margin-bottom_3">{lang="new_customer_blurb"}</p>
|
|
{{if \IPS\Login::registrationType() == 'redirect'}}
|
|
<a href="{expression="\IPS\Settings::i()->allow_reg_target"}" target="_blank" rel="noopener" class='ipsButton ipsButton--primary'>{lang="sign_up"}</a>
|
|
{{else}}
|
|
<button data-action='newMember' class='ipsButton ipsButton--primary ipsButton--wide'>{lang="continue_as_new_member"}</button>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
{{if $usernamePasswordMethods and $buttonMethods}}
|
|
<form accept-charset='utf-8' method='post' action='{$login->url}' data-controller="core.global.core.login">
|
|
<input type="hidden" name="csrfKey" value="{expression="\IPS\Session::i()->csrfKey"}">
|
|
<p class='i-color_soft i-font-weight_500'>{lang="sign_in_with_these"}:</p>
|
|
<div class='i-grid i-gap_2 i-text-align_center i-margin-top_2'>
|
|
{{foreach $buttonMethods as $method}}
|
|
<div>
|
|
{$method->button()|raw}
|
|
</div>
|
|
{{endforeach}}
|
|
</div>
|
|
</form>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
<div class="ipsJS_hide" data-role='newCustomerForm'>
|
|
<h2 class='ipsTitle ipsTitle--h3 ipsTitle--padding'>{lang="create_new_account"}</h2>
|
|
{$informationForm|raw}
|
|
</div>
|
|
{{else}}
|
|
<div class="i-padding_3">
|
|
<div>
|
|
{{if $loginError !== NULL}}
|
|
{template="message" group="global" location="global" app="core" params="$loginError, 'error'"}
|
|
<br>
|
|
{{endif}}
|
|
<form accept-charset='utf-8' method='post' action='{$login->url}' class="ipsForm" data-controller="core.global.core.login">
|
|
<input type="hidden" name="csrfKey" value="{expression="\IPS\Session::i()->csrfKey"}">
|
|
{{if $usernamePasswordMethods}}
|
|
{template="loginForm" app="core" group="system" params="$login"}
|
|
{{elseif $buttonMethods}}
|
|
<div class='i-gap_2 i-margin-top_2'>
|
|
{{foreach $buttonMethods as $method}}
|
|
<div class='i-text-align_center'>
|
|
{$method->button()|raw}
|
|
</div>
|
|
{{endforeach}}
|
|
</div>
|
|
{{endif}}
|
|
</form>
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</section>
|
|
{{else}}
|
|
<div class='ipsColumns ipsColumns--reverse ipsColumns--lines ipsColumns--customerInformation'>
|
|
<div class='ipsColumns__primary'>
|
|
<h2 class='ipsTitle ipsTitle--h3 ipsTitle--padding'>{lang="billing_information"}</h2>
|
|
{$informationForm|raw}
|
|
</div>
|
|
<div class='ipsColumns__secondary i-basis_340'>
|
|
{template="checkoutOrderSummary" group="checkout" app="nexus" params="$invoice->summary()"}
|
|
</div>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="checkout" template_name="customerInformationForm" template_data="$id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar=NULL, $form=NULL" template_location="front" template_app="nexus"><![CDATA[
|
|
<form accept-charset='utf-8' class="ipsForm {$class} ipsForm--customer-info" action="{$action}" method="post" {{if $uploadField}}enctype="multipart/form-data"{{endif}} {{foreach $attributes as $k => $v}}{$k}="{$v}"{{endforeach}} data-ipsForm>
|
|
<input type="hidden" name="{$id}_submitted" value="1">
|
|
{{foreach $hiddenValues as $k => $v}}
|
|
{{if \is_array($v)}}
|
|
{{foreach $v as $_k => $_v}}
|
|
<input type="hidden" name="{$k}[{$_k}]" value="{$_v}">
|
|
{{endforeach}}
|
|
{{else}}
|
|
<input type="hidden" name="{$k}" value="{$v}">
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{if $uploadField}}
|
|
<input type="hidden" name="MAX_FILE_SIZE" value="{$uploadField}">
|
|
<input type="hidden" name="plupload" value="{expression="md5( mt_rand() )"}">
|
|
{{endif}}
|
|
{{if $form->error}}
|
|
<div class="ipsMessage ipsMessage--error">
|
|
{$form->error}
|
|
</div>
|
|
{{endif}}
|
|
|
|
<ul>
|
|
{{foreach $elements as $collection}}
|
|
{{foreach $collection as $inputName => $input}}
|
|
{$input|raw}
|
|
{{endforeach}}
|
|
{{endforeach}}
|
|
</ul>
|
|
<div class='ipsSubmitRow'>
|
|
<button type='submit' class='ipsButton ipsButton--primary'>{lang="continue_to_review"} <i class='fa-solid fa-chevron-right'></i></button>
|
|
</div>
|
|
</form>]]></template>
|
|
<template template_group="checkout" template_name="orderReview" template_data="$invoice" template_location="front" template_app="nexus"><![CDATA[
|
|
<section class=''>
|
|
<div class="i-padding_3 i-border-top_3 i-border-bottom_3 i-flex i-align-items_center i-gap_2">
|
|
<h2 class='ipsTitle ipsTitle--h3'><span class="i-color_soft">{lang="order_review"}:</span> {lang="order"} #{$invoice->id}</h2>
|
|
{{if \IPS\Member::loggedIn()->canAccessModule( \IPS\Application\Module::get( 'nexus', 'clients' ) ) }}
|
|
<a href='{{if $invoice->guest_data and isset( $invoice->guest_data['guestTransactionKey'] )}}{$invoice->url()->setQueryString( array( 'do' => 'printout', 'key' => $invoice->guest_data['guestTransactionKey'] ) )}{{else}}{$invoice->url()->setQueryString( 'do', 'printout' )}{{endif}}' target="_blank" rel='noopener' class='ipsJS_show ipsButton ipsButton--inherit ipsButton--small i-margin-start_auto'><i class="fa-solid fa-print"></i> {lang="order_invoice_print"}</a>
|
|
{{endif}}
|
|
</div>
|
|
<div class='i-padding_3'>
|
|
<div class='ipsFluid i-basis_300 i-margin-top_3'>
|
|
<div>
|
|
{{if $invoice->billaddress}}
|
|
<div class='ipsSpanGrid i-margin-bottom_4'>
|
|
{{if $invoice->billaddress}}
|
|
<div class='ipsSpanGrid__6'>
|
|
<h3 class='ipsTitle ipsTitle--h3'>{lang="billing_address"}</h3>
|
|
<div class='i-margin-top_3'>
|
|
{$invoice->billaddress->toString('<br>')|raw}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
<h3 class='ipsTitle ipsTitle--h3'>{lang="payment_details"}</h3>
|
|
{template="paymentLog" group="clients" app="nexus" params="$invoice"}
|
|
</div>
|
|
<div>
|
|
<h2 class='ipsTitle ipsTitle--h3'>{lang="order_review"}</h2>
|
|
{{$summary = $invoice->summary();}}
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--order-review i-margin-top_3">
|
|
{{foreach $summary['items'] as $item}}
|
|
{{if !( $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount )}}
|
|
<li class='ipsData__item'>
|
|
<div class="ipsData__image" aria-hidden="true">
|
|
{{if $image = $item->image()}}
|
|
<img src="{$image->url}" alt="" loading="lazy">
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div><span class='i-color_soft'>{$item->quantity} x </span>{$item->name}</div>
|
|
{{if \count( $item->details )}}
|
|
<span class="i-color_soft">
|
|
{{foreach $item->details as $k => $v}}
|
|
<strong>{lang="nexus_pfield_{$k}"}: </strong> {expression="\IPS\nexus\Package\CustomField::load( $k )->displayValue( $v )" raw="true"}<br>
|
|
{{endforeach}}
|
|
</span>
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>]]></template>
|
|
<template template_group="checkout" template_name="packageFields" template_data="$item" template_location="front" template_app="nexus"><![CDATA[{{if \count( $item->details )}}
|
|
<div class="i-color_soft">
|
|
{{foreach $item->details as $k => $v}}
|
|
<strong>{lang="nexus_pfield_{$k}"}: </strong> {expression="\IPS\nexus\Package\CustomField::load( $k )->displayValue( $v )" raw="true"}<br>
|
|
{{endforeach}}
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="checkout" template_name="paymentForm" template_data="$invoice, $amountToPay, $showSubmitButton, $id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar=NULL, $form=NULL" template_location="front" template_app="nexus"><![CDATA[
|
|
<form accept-charset='utf-8' class="ipsForm {$class} ipsForm--payment" action="{$action}" method="post" {{foreach $attributes as $k => $v}}{$k}="{$v}"{{endforeach}} data-ipsForm data-role="paymentForm">
|
|
<input type="hidden" name="{$id}_submitted" value="1">
|
|
{{foreach $hiddenValues as $k => $v}}
|
|
{{if \is_array($v)}}
|
|
{{foreach $v as $_k => $_v}}
|
|
<input type="hidden" name="{$k}[{$_k}]" value="{$_v}">
|
|
{{endforeach}}
|
|
{{else}}
|
|
<input type="hidden" name="{$k}" value="{$v}">
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{if $uploadField}}
|
|
<input type="hidden" name="MAX_FILE_SIZE" value="{$uploadField}">
|
|
<input type="hidden" name="plupload" value="{expression="md5( mt_rand() )"}">
|
|
{{endif}}
|
|
|
|
{{if $form->error}}
|
|
<div class="ipsMessage ipsMessage--error">
|
|
{$form->error}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{foreach $elements as $collection}}
|
|
{{foreach $collection as $inputName => $input}}
|
|
{{if $inputName == 'payment_method'}}
|
|
<div class='ipsFieldRow'>
|
|
<label class='ipsFieldRow__label' for='elInput_{$input->htmlId}'>
|
|
<span class='ipsTitle ipsTitle--h3'>{lang="$inputName"}</span>
|
|
</label>
|
|
<div class='ipsFieldRow__content'>
|
|
{{if $invoice->canSplitPayment()}}
|
|
<div class='i-flex i-align-items_center i-flex-wrap_wrap i-gap_2'>
|
|
<a href="{$invoice->checkoutUrl()->setQueryString( 'do', 'split' )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title="{lang="split_payment"}" data-ipsTooltip title='{lang="split_payment_title"}'>{lang="split_payment"} <i class='fa-solid fa-caret-down'></i></a>
|
|
{{endif}}
|
|
<ul class='ipsFieldRow__content--checkboxes i-flex_11'>
|
|
{{foreach $input->options['options'] as $k => $v}}
|
|
<li>
|
|
<input type="radio" {{if (string) $input->value == (string) $k or ( isset( $input->options['userSuppliedInput'] ) and !\in_array( $input->value, array_keys( $input->options['options'] ) ) and $k == $input->options['userSuppliedInput'] )}}checked{{endif}} {{if $input->required === TRUE}}required{{endif}} {{if $input->disabled === TRUE or ( \is_array( $input->disabled ) and \in_array( $k, $input->disabled ) )}}disabled{{endif}} {{if isset( $input->options['toggles'][ $k ] ) and !empty( $input->options['toggles'][ $k ] )}}data-control="toggle" data-toggles="{expression="implode( ',', $input->options['toggles'][ $k ] )"}"{{endif}} id="elRadio_{$input->name}_{$k}" name="{$input->name}" value="{$k}" class="ipsInput ipsInput--toggle">
|
|
<label for='elRadio_{$input->name}_{$k}' id='elField_{$input->name}_label'>{$v|raw}</label>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{{if $invoice->canSplitPayment()}}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{else}}
|
|
<ul>
|
|
{$input->rowHtml()|raw}
|
|
</ul>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endforeach}}
|
|
|
|
{{if $showSubmitButton}}
|
|
<div class="ipsSubmitRow" id="paymentMethodSubmit">
|
|
<button type='submit' class='ipsButton ipsButton--primary ipsButton--wide'>
|
|
<i class='fa-solid fa-check-circle'></i>
|
|
{{if $amountToPay->amount->isZero()}}
|
|
{lang="confirm_and_no_pay"}
|
|
{{elseif $amountToPay->amount->compare( $invoice->total->amount ) !== 0}}
|
|
{lang="confirm_and_pay_split" sprintf="$amountToPay"}
|
|
{{else}}
|
|
{lang="confirm_and_pay"}
|
|
{{endif}}
|
|
</button>
|
|
</div>
|
|
{{endif}}
|
|
</form>]]></template>
|
|
<template template_group="checkout" template_name="transactionFail" template_data="$transaction" template_location="front" template_app="nexus"><![CDATA[
|
|
<p class='i-font-size_2 i-text-align_center'>
|
|
<strong>{lang="order_fail_blurb"}</strong>
|
|
</p>
|
|
|
|
{{if isset( $transaction->extra['publicNote'] )}}
|
|
<div class='ipsRichText i-background_3 i-padding_3 i-margin-block_2'>
|
|
{$transaction->extra['publicNote']}
|
|
</div>
|
|
{{endif}}
|
|
|
|
<p class='i-text-align_center'>
|
|
{{if \IPS\Member::loggedIn()->canUseContactUs() and !( \IPS\Dispatcher::i()->application->directory == 'core' and \IPS\Dispatcher::i()->module and \IPS\Dispatcher::i()->module->key == 'contact' )}}
|
|
<a href="{url="app=core&module=contact&controller=contact" seoTemplate="contact"}" class='ipsButton ipsButton--primary ipsButton--small'>{lang="contact"}</a>
|
|
{{endif}}
|
|
<a href="{$transaction->invoice->checkoutUrl()}" class='ipsButton ipsButton--secondary ipsButton--small'>{lang="try_another_payment"}</a>
|
|
</p>]]></template>
|
|
<template template_group="checkout" template_name="transactionGatewayPending" template_data="$transaction, $invoice=NULL" template_location="front" template_app="nexus"><![CDATA[
|
|
<p class='i-font-size_2 i-text-align_center'>
|
|
{lang="order_thanks_blurb_no_email"}
|
|
</p>
|
|
<p class='i-font-size_2 i-text-align_center'>
|
|
<strong>{lang="order_processing_blurb"}</strong><br>
|
|
{lang="order_processing_blurb2"}
|
|
</p>
|
|
{{if member.member_id}}
|
|
<p class='i-text-align_center'>
|
|
<i class='fa-solid fa-circle-info'></i> {lang="track_orders_in_billing"}
|
|
</p>
|
|
{{endif}}
|
|
|
|
{template="orderReview" group="checkout" app="nexus" params="$invoice ?: $transaction->invoice"}]]></template>
|
|
<template template_group="checkout" template_name="transactionHold" template_data="$transaction" template_location="front" template_app="nexus"><![CDATA[
|
|
<p class='i-font-size_2 i-text-align_center'>
|
|
{lang="order_thanks_blurb_no_email"}
|
|
</p>
|
|
<p class='i-font-size_2 i-text-align_center'>
|
|
<strong>{lang="order_held_blurb"}</strong><br>
|
|
{lang="order_held_blurb2"}
|
|
</p>
|
|
{{if member.member_id}}
|
|
<p class='i-text-align_center'>
|
|
<i class='fa-solid fa-circle-info'></i> {lang="track_orders_in_billing"}
|
|
</p>
|
|
{{endif}}
|
|
{{if isset( $transaction->extra['publicNote'] )}}
|
|
<div class='ipsRichText'>
|
|
{$transaction->extra['publicNote']}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{template="orderReview" group="checkout" app="nexus" params="$transaction->invoice"}]]></template>
|
|
<template template_group="checkout" template_name="transactionOkay" template_data="$transaction, $complete, $purchases" template_location="front" template_app="nexus"><![CDATA[
|
|
{{if $complete}}
|
|
<p class='i-font-size_2 i-text-align_center'>
|
|
<strong>{lang="order_thanks_blurb"}</strong>
|
|
</p>
|
|
<p class='i-text-align_center'>
|
|
<i class='fa-solid fa-circle-info'></i> {lang="manage_orders_in_billing"}.
|
|
</p>
|
|
|
|
{template="orderReview" group="checkout" app="nexus" params="$transaction->invoice"}
|
|
{{else}}
|
|
<p class='i-font-size_2 i-text-align_center'>
|
|
<strong>{lang="order_split_payment_success"}</strong>
|
|
</p>
|
|
<p class='i-font-size_2 i-text-align_center'>
|
|
{lang="order_split_payment_success2"}
|
|
</p>
|
|
{{if $invoice = $transaction->invoice}}
|
|
<p class='i-text-align_center'>
|
|
<a href="{$invoice->checkoutUrl()}" class='ipsButton ipsButton--primary'>{lang="return_to_checkout"}</a>
|
|
</p>
|
|
{{endif}}
|
|
{{endif}}]]></template>
|
|
<template template_group="checkout" template_name="transactionWait" template_data="$transaction" template_location="front" template_app="nexus"><![CDATA[
|
|
<div class="i-padding_3 i-background_2 i-border-bottom_3">
|
|
<p class="i-color_hard i-font-size_3 i-font-weight_500 i-margin-bottom_1">
|
|
{lang="order_thanks_blurb_no_email"}
|
|
</p>
|
|
<p>
|
|
{lang="order_wait_blurb"} {lang="order_wait_blurb2"}
|
|
</p>
|
|
</div>
|
|
|
|
<div class='ipsRichText i-padding_3'>
|
|
{$transaction->method->manualPaymentInstructions( $transaction )|raw}
|
|
</div>
|
|
{{if member.member_id}}
|
|
<p class='ipsMessage ipsMessage--info i-margin_1'>{lang="track_orders_in_billing"}</p>
|
|
{{endif}}
|
|
|
|
{template="orderReview" group="checkout" app="nexus" params="$transaction->invoice"}]]></template>
|
|
<template template_group="clients" template_name="address" template_data="$address" template_location="front" template_app="nexus"><![CDATA[
|
|
<div>
|
|
{$address->address->toString('<br>')|raw}
|
|
{{if isset( $address->address->vat ) and $address->address->vat}}
|
|
<br>
|
|
{lang="cm_checkout_vat_number"}: {$address->address->vat}
|
|
{{endif}}
|
|
</div>
|
|
<ul class='ipsButtons ipsButtons--start i-margin-top_2'>
|
|
<li><a class="ipsButton ipsButton--inherit ipsButton--small" href="{url="app=nexus&module=clients&controller=addresses&do=form&id={$address->id}" seoTemplate="clientsaddresses"}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="edit_address_title"}' title="{lang="edit_address_title"}">{lang="edit"}</a></li>
|
|
<li><a class="ipsButton ipsButton--inherit ipsButton--small" href="{url="app=nexus&module=clients&controller=addresses&do=delete&id={$address->id}" seoTemplate="clientsaddresses" csrf="true"}" data-confirm data-confirmMessage='{{if $address->primary_billing}}{lang="delete_address_confirm_billing"}{{else}}{lang="delete_address_confirm"}{{endif}}' title='{lang="delete_address_title"}'>{lang="delete"}</a></li>
|
|
</ul>
|
|
|
|
{{if !$address->primary_billing}}
|
|
<ul class='ipsList ipsList--inline'>
|
|
<li>
|
|
<strong>{lang="set_as_address"}</strong>
|
|
</li>
|
|
{{if !$address->primary_billing}}
|
|
<li>
|
|
<a href="{url="app=nexus&module=clients&controller=addresses&do=primary&id={$address->id}" seoTemplate="clientsaddresses" csrf="true"}" class='ipsButton ipsButton--soft ipsButton--small' title="{lang="address_billing_title"}">{lang="address_billing"}</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
{{endif}}]]></template>
|
|
<template template_group="clients" template_name="addresses" template_data="$billingAddress=NULL, $otherAddresses=array()" template_location="front" template_app="nexus"><![CDATA[<div class="ipsBox ipsBox--commerceAddresses ipsPull">
|
|
<header class='ipsPageHeader'>
|
|
<div class="ipsPageHeader__row">
|
|
<div class="ipsPageHeader__primary">
|
|
<h1 class='ipsPageHeader__title'>{lang="address_book"}</h1>
|
|
<p class="ipsPageHeader__desc">{lang="address_book_info"}</p>
|
|
</div>
|
|
<a href='{url="app=nexus&module=clients&controller=addresses&do=form" seoTemplate="clientsaddresses"}' class='ipsButton ipsButton--primary' title="{lang="address_add_title"}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="address_add"}'>{lang="address_add"}</a>
|
|
</div>
|
|
</header>
|
|
|
|
{{if $billingAddress}}
|
|
<div class='ipsGrid ipsGrid--lines ipsGrid--commerce-address ipsGrid--auto-fit i-basis_360'>
|
|
{{if $billingAddress}}
|
|
<div class='i-padding_3'>
|
|
<h2 class='ipsTitle ipsTitle--h3 i-margin-bottom_3'>{lang="address_default_billing"}</h2>
|
|
{template="address" group="clients" app="nexus" params="$billingAddress"}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if \count( $otherAddresses )}}
|
|
<hr class='ipsHr'>
|
|
<div class='i-padding_3'>
|
|
<h2 class='ipsTitle ipsTitle--h3 i-margin-bottom_3'>{lang="address_other_addresses"}</h2>
|
|
<ul class='ipsGrid ipsGrid--lines ipsGrid--commerce-other-addresses ipsGrid--auto-fit i-basis_360'>
|
|
{{foreach $otherAddresses as $address}}
|
|
<li>
|
|
{template="address" group="clients" app="nexus" params="$address"}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="clients" template_name="alternatives" template_data="$protected=FALSE" template_location="front" template_app="nexus"><![CDATA[<section class='ipsBox ipsBox--cmsAlternativeClients ipsPull'>
|
|
<header class='ipsPageHeader'>
|
|
<div class="ipsPageHeader__row">
|
|
<div class="ipsPageHeader__primary">
|
|
<h1 class='ipsPageHeader__title'>{lang="altcontact_title"}</h1>
|
|
<p class="ipsPageHeader__desc">{lang="altcontact_info"}</p>
|
|
</div>
|
|
<a href='{url="app=nexus&module=clients&controller=alternatives&do=form" seoTemplate="clientsalternatives"}' class='ipsButton ipsButton--primary' title="{lang="altcontact_add_title"}" data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title="{lang="altcontact_add"}">{lang="altcontact_add"}</a>
|
|
</div>
|
|
</header>
|
|
{{if !$protected}}
|
|
{{if !\count( \IPS\nexus\Customer::loggedIn()->alternativeContacts() )}}
|
|
<div class='ipsEmptyMessage'>
|
|
{lang="altcontact_none" sprintf="\IPS\Member::loggedIn()->language()->addToStack('altcontact_add')"}
|
|
</div>
|
|
{{else}}
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--alternatives">
|
|
{{foreach \IPS\nexus\Customer::loggedIn()->alternativeContacts() as $contact}}
|
|
<li class='ipsData__item cAlternateContactPerms'>
|
|
<div class='ipsData__icon'>
|
|
{template="userPhoto" group="global" app="core" params="$contact->alt_id"}
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<h2 class='ipsData__title'>
|
|
{template="userLink" group="global" app="core" params="$contact->alt_id"} {lang="altcontact_can"}:
|
|
</h2>
|
|
<ul class='ipsList i-gap_1 cAlternateContactPerms_perms'>
|
|
{{if \count( $contact->purchases )}}
|
|
<li class='i-flex i-align-items_center i-gap_2'>
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--positive i-flex_00'>
|
|
<i class='fa-solid fa-check'></i>
|
|
</span>
|
|
<div class='i-flex_11'>
|
|
{lang="altcontact_perm_manage" pluralize="\count( $contact->purchases )"}
|
|
<ul class="ipsSubList">
|
|
{{foreach $contact->purchases as $purchase}}
|
|
<li>
|
|
<a href="{$purchase->url()}">{$purchase->name}</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{if $contact->billing}}
|
|
<li class='i-flex i-align-items_center i-gap_2'>
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--positive i-flex_00'>
|
|
<i class='fa-solid fa-check'></i>
|
|
</span>
|
|
<div class='i-flex_11'>
|
|
{lang="altcontact_perm_billing"}
|
|
</div>
|
|
</li>
|
|
{{else}}
|
|
<li class='i-flex i-align-items_center i-gap_2 i-opacity_4'>
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--neutral i-flex_00'>
|
|
<i class='fa-solid fa-xmark'></i>
|
|
</span>
|
|
<div class='i-flex_11'>
|
|
{lang="altcontact_perm_billing"}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
<div class='i-basis_100'>
|
|
<ul class='ipsButtons'>
|
|
<li>
|
|
<a href="{url="app=nexus&module=clients&controller=alternatives&do=form&id={$contact->alt_id->member_id}" seoTemplate="clientsalternatives"}" class='ipsButton ipsButton--inherit ipsButton--small ipsButton--wide' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title='{lang="altcontact_edit"}' title='{lang="altcontact_edit"}'>{lang="edit"}</a>
|
|
</li>
|
|
<li>
|
|
<a href="{url="app=nexus&module=clients&controller=alternatives&do=delete&id={$contact->alt_id->member_id}" seoTemplate="clientsalternatives" csrf="true"}" class='ipsButton ipsButton--inherit ipsButton--small ipsButton--wide' data-confirm data-confirmMessage="{lang="altcontact_delete_confirm"}" title="{lang="altcontact_delete"}">{lang="delete"}</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
{{endif}}
|
|
{{endif}}
|
|
</section>]]></template>
|
|
<template template_group="clients" template_name="billingAgreement" template_data="$billingAgreement, $purchases, $invoices, $invoicePagination" template_location="front" template_app="nexus"><![CDATA[
|
|
<div class="ipsData__item i-margin-bottom_3">
|
|
<div class=''>
|
|
{{if $billingAgreement->status() === \IPS\nexus\Customer\BillingAgreement::STATUS_ACTIVE}}
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--positive' data-ipsTooltip title='{lang="billing_agreement_active"}'>
|
|
<i class='fa-solid fa-check i-font-size_2'></i>
|
|
</span>
|
|
{{elseif $billingAgreement->status() === \IPS\nexus\Customer\BillingAgreement::STATUS_SUSPENDED}}
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--neutral' data-ipsTooltip title='{lang="billing_agreement_suspended"}'>
|
|
<i class='fa-regular fa-clock i-font-size_2'></i>
|
|
</span>
|
|
{{elseif $billingAgreement->status() === \IPS\nexus\Customer\BillingAgreement::STATUS_CANCELED}}
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--negative' data-ipsTooltip title='{lang="billing_agreement_canceled"}'>
|
|
<i class='fa-solid fa-xmark i-font-size_2'></i>
|
|
</span>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class="ipsData__main">
|
|
<h1 class='ipsData__title'>{lang="billing_agreement" sprintf="$billingAgreement->gw_id"}</h1>
|
|
<span class="cNexusPrice i-font-size_2">{$billingAgreement->term()}</span>
|
|
</div>
|
|
<div class="">
|
|
{{if $billingAgreement->status() === \IPS\nexus\Customer\BillingAgreement::STATUS_ACTIVE}}
|
|
<a href="{$billingAgreement->url()->setQueryString( array( 'do' => 'act', 'act' => 'suspend' ) )->csrf()}" class="ipsButton ipsButton--small ipsButton--soft" data-confirm data-confirmSubMessage="{lang="billing_agreement_suspend_confirm"}">{lang="billing_agreement_suspend"}</a>
|
|
{{endif}}
|
|
{{if $billingAgreement->status() === \IPS\nexus\Customer\BillingAgreement::STATUS_SUSPENDED}}
|
|
<a href="{$billingAgreement->url()->setQueryString( array( 'do' => 'act', 'act' => 'reactivate' ) )->csrf()}" class="ipsButton ipsButton--small ipsButton--soft" data-confirm>{lang="billing_agreement_reactivate"}</a>
|
|
{{endif}}
|
|
{{if $billingAgreement->status() !== \IPS\nexus\Customer\BillingAgreement::STATUS_CANCELED}}
|
|
<a href="{$billingAgreement->url()->setQueryString( array( 'do' => 'act', 'act' => 'cancel' ) )->csrf()}" class="ipsButton ipsButton--small ipsButton--soft" data-confirm>{lang="billing_agreement_cancel"}</a>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{if isset( $purchases[0] ) and \count( $purchases[0] )}}
|
|
<hr class="ipsHr">
|
|
<h2 class="ipsTitle ipsTitle--h3 i-margin-bottom_3">{lang="billing_agreement_purchases"}</h2>
|
|
<ul>
|
|
{template="purchaseList" group="clients" params="0, $purchases, FALSE, $billingAgreement"}
|
|
</ul>
|
|
{{endif}}
|
|
<hr class="ipsHr">
|
|
<h2 class="ipsTitle ipsTitle--h3 i-margin-bottom_3">{lang="billing_agreement_payments"}</h2>
|
|
{{if $invoicePagination}}
|
|
<div class="ipsBox i-padding_2 i-margin-bottom_3">
|
|
{$invoicePagination|raw}
|
|
</div>
|
|
{{endif}}
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--category cNexusOrderList">
|
|
{{foreach $invoices as $invoice}}
|
|
{template="invoiceList" group="clients" params="$invoice, $billingAgreement"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
{{if $invoicePagination}}
|
|
<div class="ipsBox i-padding_2 i-margin-top_3">
|
|
{$invoicePagination|raw}
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="clients" template_name="billingAgreements" template_data="$billingAgreements" template_location="front" template_app="nexus"><![CDATA[
|
|
<h1 class='ipsTitle ipsTitle--h3'>{lang="billing_agreements_title"}</h1>
|
|
|
|
<p class='i-margin-bottom_3'>
|
|
{lang="billing_agreements_info"}
|
|
</p>
|
|
|
|
{{if !\count( $billingAgreements )}}
|
|
<div class='ipsBox ipsEmptyMessage'>
|
|
{lang="billing_agreements_none"}
|
|
</div>
|
|
{{else}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table ipsData--billing-agreements">
|
|
{{foreach $billingAgreements as $billingAgreement}}
|
|
<li class='ipsData__item'>
|
|
<div class='i-flex_00'>
|
|
{{if $billingAgreement['status'] === \IPS\nexus\Customer\BillingAgreement::STATUS_ACTIVE}}
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--positive' data-ipsTooltip title='{lang="billing_agreement_active"}'>
|
|
<i class='fa-solid fa-check i-font-size_2'></i>
|
|
</span>
|
|
{{elseif $billingAgreement['status'] === \IPS\nexus\Customer\BillingAgreement::STATUS_SUSPENDED}}
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--neutral' data-ipsTooltip title='{lang="billing_agreement_suspended"}'>
|
|
<i class='fa-regular fa-clock i-font-size_2'></i>
|
|
</span>
|
|
{{elseif $billingAgreement['status'] === \IPS\nexus\Customer\BillingAgreement::STATUS_CANCELED}}
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--negative' data-ipsTooltip title='{lang="billing_agreement_canceled"}'>
|
|
<i class='fa-solid fa-xmark i-font-size_2'></i>
|
|
</span>
|
|
{{else}}
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--neutral' data-ipsTooltip title='{lang="billing_agreement_unknown"}'>
|
|
<i class='fa-solid fa-question i-font-size_2'></i>
|
|
</span>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<strong class='i-font-size_2'>{$billingAgreement['id']}</strong>
|
|
<p class='ipsData__meta cNexusPrice'>
|
|
{$billingAgreement['term']}
|
|
</p>
|
|
</div>
|
|
<div class=''>
|
|
<a href="{$billingAgreement['url']}" class='ipsButton ipsButton--inherit ipsButton--small'>{lang="billing_agreement_view"}</a>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{endif}}]]></template>
|
|
<template template_group="clients" template_name="cards" template_data="$cards" template_location="front" template_app="nexus"><![CDATA[
|
|
<div class='i-flex i-align-items_center i-gap_2'>
|
|
<h1 class='ipsTitle ipsTitle--h3'>{lang="cards_title"}</h1>
|
|
<a href='{url="app=nexus&module=clients&controller=cards&do=add" seoTemplate="clientscards"}' class='ipsButton ipsButton--primary ipsButton--small' title="{lang="cards_add_title"}">{lang="cards_add"}</a>
|
|
</div>
|
|
|
|
<p class='i-margin-bottom_3'>
|
|
{lang="cards_info"}
|
|
</p>
|
|
|
|
{{if \count( $cards )}}
|
|
<ul class='ipsList ipsList--inline cNexusCards i-margin-top_3 ipsBox i-padding_3'>
|
|
{{foreach $cards as $card}}
|
|
<li>
|
|
{{if $card['card_type'] === 'paypal' or $card['card_type'] === 'venmo'}}
|
|
<div class='cNexusCards_name'>{$card['card_number']}</div>
|
|
{{else}}
|
|
<span class='cNexusCards_number'>
|
|
{{if $card['card_type'] == 'american_express' OR $card['card_type'] == 'diners_club'}}
|
|
XXXX XXXXXX X{$card['card_number']}
|
|
{{else}}
|
|
XXXX XXXX XXXX {$card['card_number']}
|
|
{{endif}}
|
|
</span>
|
|
{{endif}}
|
|
{{if $card['card_type']}}
|
|
<span class='cNexusCards_type cPayment cPayment_{$card['card_type']}'><span class='ipsInvisible'>{lang="card_type_{$card['card_type']}"}</span></span>
|
|
{{endif}}
|
|
{{if $card['card_expire']}}
|
|
<span class='cNexusCards_expTitle'>{lang="cards_exp"}</span>
|
|
<span class='cNexusCards_exp'>{$card['card_expire']}</span>
|
|
{{endif}}
|
|
|
|
<a href="{url="app=nexus&module=clients&controller=cards&do=delete&id={$card['id']}" seoTemplate="clientscards" csrf="true"}" class='cNexusCards_delete' data-confirm data-ipsTooltip title='{lang="delete_this_card"}'>×</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{{else}}
|
|
<p class='ipsEmptyMessage'>
|
|
{lang="no_credit_cards"}
|
|
</p>
|
|
{{endif}}]]></template>
|
|
<template template_group="clients" template_name="credit" template_data="$balance, $pastWithdrawals, $pastWithdrawalsPagination, $canWithdraw, $canTopup" template_location="front" template_app="nexus"><![CDATA[
|
|
<h1 class='ipsTitle ipsTitle--h3'>{lang="credit_title"}</h1>
|
|
|
|
<div class='ipsBox i-padding_3 i-margin-top_3'>
|
|
<div class='ipsColumns'>
|
|
<div class='ipsColumns__secondary i-basis_280'>
|
|
{{if is_countable( $balance ) AND \count( $balance )}}
|
|
{{foreach $balance as $amount}}
|
|
<h2 class='ipsMinorTitle'>{lang="credit_balance"} {{if \count( $balance ) > 1}}({$amount->currency}){{endif}}</h2>
|
|
<div class='cNexusCredit_total i-margin-bottom_3'>
|
|
{$amount}
|
|
</div>
|
|
{{endforeach}}
|
|
{{elseif $balance !== NULL}}
|
|
<h2 class='ipsMinorTitle'>{lang="credit_balance"}</h2>
|
|
<div class='cNexusCredit_total i-margin-bottom_3'>
|
|
{money="0" currency="\IPS\nexus\Customer::loggedIn()->defaultCurrency()"}
|
|
</div>
|
|
{{endif}}
|
|
{{if $canWithdraw or $canTopup}}
|
|
<ul class='i-grid i-gap_2'>
|
|
{{if $canTopup}}
|
|
<li><a href='{url="app=nexus&module=clients&controller=credit&do=topup" seoTemplate="clientscredit"}' data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="credit_add"}' class='ipsButton ipsButton--primary ipsButton--wide' title="{lang="credit_add_title"}">{lang="credit_add"}</a></li>
|
|
{{endif}}
|
|
{{if $canWithdraw}}
|
|
<li><a href='{url="app=nexus&module=clients&controller=credit&do=withdraw" seoTemplate="clientscredit"}' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title='{lang="credit_withdraw_dialog"}' class='ipsButton ipsButton--soft ipsButton--wide' title="{lang="credit_withdraw_title"}">{lang="credit_withdraw"}</a></li>
|
|
{{endif}}
|
|
</ul>
|
|
{{endif}}
|
|
{{if \count( \IPS\nexus\Customer::loggedIn()->parentContacts( array('billing=1') ) )}}
|
|
<hr class='ipsHr'>
|
|
<p>{lang="credit_altcontact"}</p>
|
|
{{foreach \IPS\nexus\Customer::loggedIn()->parentContacts( array('billing=1') ) as $contact}}
|
|
<hr class='ipsHr'>
|
|
<div class='ipsPhotoPanel ipsPhotoPanel--tiny'>
|
|
{template="userPhoto" group="global" app="core" params="$contact->main_id, 'tiny'"}
|
|
<div>
|
|
<h3>{$contact->main_id->cm_name}</h3>
|
|
|
|
{{$val = FALSE;}}
|
|
{{foreach $contact->main_id->cm_credits as $credit}}
|
|
{{if $credit->amount->isGreaterThanZero()}}
|
|
{{$val = TRUE;}}
|
|
<h2 class='ipsMinorTitle'>{lang="credit_balance"} {{if \count( $contact->main_id->cm_credits ) > 1}}({$credit->currency}){{endif}}</h2>
|
|
<div class='cNexusCredit_total cNexusCredit_contact i-margin-bottom_3'>
|
|
{$credit}
|
|
</div>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{if !$val}}
|
|
<h2 class='ipsMinorTitle'>{lang="credit_balance"}</h2>
|
|
<div class='cNexusCredit_total cNexusCredit_contact i-margin-bottom_3'>
|
|
{money="0" currency="$contact->main_id->defaultCurrency()"}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{endforeach}}
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsColumns__primary'>
|
|
{{if isset( request.withdraw )}}
|
|
{{if request.withdraw === 'success'}}
|
|
<p class="ipsMessage ipsMessage--success">{lang="payout_status_success"}</p>
|
|
<br>
|
|
{{elseif request.withdraw === 'pending'}}
|
|
<p class="ipsMessage ipsMessage--info">{lang="payout_status_pending"}</p>
|
|
<br>
|
|
{{endif}}
|
|
{{endif}}
|
|
|
|
{{if \count( $pastWithdrawals ) or $canWithdraw}}
|
|
<h2 class='ipsTitle ipsTitle--h3'>{lang="credit_withdrawal_history"}</h2>
|
|
{{if \count( $pastWithdrawals )}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table ipsData--withdrawl-history">
|
|
{{foreach $pastWithdrawals as $withdrawal}}
|
|
<li class='ipsData__item'>
|
|
<div class='i-flex_00'>
|
|
{{if $withdrawal->status === \IPS\nexus\Payout::STATUS_COMPLETE}}
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--positive' data-ipsTooltip title='{lang="credit_withdraw_complete"}'>
|
|
<i class='fa-solid fa-check i-font-size_2'></i>
|
|
</span>
|
|
{{elseif $withdrawal->status === \IPS\nexus\Payout::STATUS_PENDING}}
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--neutral' data-ipsTooltip title='{lang="credit_withdraw_pending"}'>
|
|
<i class='fa-regular fa-clock i-font-size_2'></i>
|
|
</span>
|
|
{{elseif $withdrawal->status === \IPS\nexus\Payout::STATUS_CANCELED}}
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--negative' data-ipsTooltip title='{lang="credit_withdraw_cancelled"}'>
|
|
<i class='fa-solid fa-xmark i-font-size_2'></i>
|
|
{{elseif $withdrawal->status == \IPS\nexus\Payout::STATUS_PROCESSING}}
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--intermediary' data-ipsTooltip title='{lang="credit_withdraw_processing"}'>
|
|
<i class='fa-solid fa-circle-notch fa-spin'></i>
|
|
</span>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<strong class='ipsData__title'>{$withdrawal->amount}</strong>
|
|
<p class='ipsData__meta'>
|
|
{datetime="$withdrawal->date"}
|
|
</p>
|
|
</div>
|
|
{{if $withdrawal->status === \IPS\nexus\Payout::STATUS_PENDING}}
|
|
<div class=''>
|
|
<a href="{url="app=nexus&module=clients&controller=credit&do=cancel&id={$withdrawal->id}" seoTemplate="clientscredit" csrf="true"}" class='ipsButton ipsButton--inherit ipsButton--small' data-confirm data-confirmMessage='{lang="credit_withdraw_cancel_confirm"}'>{lang="cancel"}</a>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{$pastWithdrawalsPagination|raw}
|
|
{{else}}
|
|
<p class='ipsEmptyMessage'>
|
|
{lang="credit_no_withdrawals"}
|
|
</p>
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="clients" template_name="donations" template_data="" template_location="front" template_app="nexus"><![CDATA[<section class="ipsBox ipsBox--commerceDonations ipsPull">
|
|
<header class="ipsPageHeader ipsPageHeader--padding">
|
|
<h1 class='ipsPageHeader__title'>{lang="current_donation_goals"}</h1>
|
|
</header>
|
|
|
|
{{if request.thanks}}
|
|
<p class="ipsMessage ipsMessage--success">{lang="thanks_for_your_donation"}</p>
|
|
{{endif}}
|
|
|
|
<div class="ipsFluid i-gap_lines i-basis_400">
|
|
{{foreach \IPS\nexus\Donation\Goal::roots() as $goal}}
|
|
<div class="i-flex i-flex-direction_column" id="elDonationGoal{$goal->id}">
|
|
<div class="i-padding_3 i-flex_11">
|
|
<h2 class="ipsTitle ipsTitle--h3 i-margin-bottom_3">{$goal->_title}</h2>
|
|
{{if $desc = member.language()->get("nexus_donategoal_{$goal->id}_desc")}}
|
|
<div class="i-margin-bottom_3">
|
|
<div class="ipsRichText">
|
|
{$desc|raw}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
<div class="i-padding_3 i-padding-top_0">
|
|
{{if $goal->goal}}
|
|
<p class="i-text-align_center i-margin-bottom_2">
|
|
<strong>{lang="donate_progress" sprintf="new \IPS\nexus\Money( $goal->current, $goal->currency ), new \IPS\nexus\Money( $goal->goal, $goal->currency )"}</strong>
|
|
</p>
|
|
<progress class='ipsProgress ipsProgress--donation i-margin-bottom_2' max='{$goal->goal}' value='{$goal->current}'></progress>
|
|
{{else}}
|
|
<p class="i-text-align_center">
|
|
<strong>{lang="donate_sofar" sprintf="new \IPS\nexus\Money( $goal->current, $goal->currency )"}</strong>
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsSubmitRow">
|
|
<a href="{$goal->url()->setQueryString( 'noDesc', 1 )}" class="ipsButton ipsButton--primary" {{if member.member_id }} data-ipsDialog {{endif}} >{lang="donate_to_goal"}</a>
|
|
</div>
|
|
</div>
|
|
{{endforeach}}
|
|
</div>
|
|
</section>]]></template>
|
|
<template template_group="clients" template_name="info" template_data="$form" template_location="front" template_app="nexus"><![CDATA[<section class='ipsBox ipsBox--cmsClientInfo ipsPull'>
|
|
<header class="ipsPageHeader ipsPageHeader--padding">
|
|
<h1 class='ipsPageHeader__title'>{lang="customerinfo_title"}</h1>
|
|
</header>
|
|
{$form|raw}
|
|
</section>]]></template>
|
|
<template template_group="clients" template_name="invoice" template_data="$invoice" template_location="front" template_app="nexus"><![CDATA[
|
|
<div class='ipsBox ipsBox--commerceInvoice i-padding_3 i-margin-bottom_3'>
|
|
<div class='i-flex i-justify-content_space-between i-margin-bottom_2'>
|
|
<div>
|
|
<h1 class='ipsTitle ipsTitle--h3'>{lang="order_title"} #{$invoice->id}</h1>
|
|
<p class='i-color_soft'>{lang="order_placed"} {datetime="$invoice->date" lowercase="true"}</p>
|
|
</div>
|
|
<div class='i-flex i-flex-direction_column i-align-items_stretch i-justify-content_center i-gap_1'>
|
|
<a href='{{if $invoice->guest_data and isset( $invoice->guest_data['guestTransactionKey'] )}}{$invoice->url()->setQueryString( array( 'do' => 'printout', 'key' => $invoice->guest_data['guestTransactionKey'] ) )}{{else}}{$invoice->url()->setQueryString( 'do', 'printout' )}{{endif}}' target="_blank" rel='noopener' class='ipsButton ipsButton--small ipsButton--soft ipsButton--wide'>{lang="order_invoice_print"}</a>
|
|
{{if $invoice->po}}
|
|
<p class='i-margin-block_2'>
|
|
{lang="invoice_po_number"}: {$invoice->po} <a href="{$invoice->url()->setQueryString( array( 'do' => 'poNumber' ) )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="order_po_number_dialog"}' class='i-font-size_-2' title='{lang="order_po_number"}'>({lang="edit"})</a>
|
|
</p>
|
|
{{else}}
|
|
<a href="{$invoice->url()->setQueryString( array( 'do' => 'poNumber' ) )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="order_po_number_dialog"}' title='{lang="order_po_number_add_title"}' class='ipsButton ipsButton--small ipsButton--text ipsButton--wide'>{lang="order_po_number_add"}</a>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
|
|
<hr class='ipsHr'>
|
|
|
|
<div class='ipsSpanGrid i-margin-top_3 cNexusInvoiceView'>
|
|
<div class='ipsSpanGrid__6'>
|
|
{{if $invoice->billaddress}}
|
|
<div class='ipsSpanGrid i-margin-bottom_4'>
|
|
{{if $invoice->billaddress }}
|
|
<div class='ipsSpanGrid__6'>
|
|
<h3 class='ipsTitle ipsTitle--h3'>{lang="billing_address"}</h3>
|
|
<div class='i-margin-top_3'>
|
|
{$invoice->billaddress->toString('<br>')|raw}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if $invoice->notes}}
|
|
<h2 class='ipsTitle ipsTitle--h3'>{lang="invoice_notes"}</h2>
|
|
<div class='i-margin-bottom_2'>
|
|
{expression="nl2br( htmlspecialchars( $invoice->notes, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE ) )" raw="true"}
|
|
</div>
|
|
<a href="{$invoice->url()->setQueryString( array( 'do' => 'notes' ) )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="order_edit_invoice_notes"}'>({lang="edit"})</a>
|
|
{{else}}
|
|
<p class='i-margin-top_3'><a href="{$invoice->url()->setQueryString( array( 'do' => 'notes' ) )}" class='ipsButton ipsButton--soft ipsButton--small' data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="order_edit_invoice_notes"}' title='{lang="order_add_invoice_notes"}'>{lang="order_add_invoice_notes"}</a></p>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsSpanGrid__6 i-text-align_center'>
|
|
<div class='ipsInnerBox i-padding_3'>
|
|
<h2 class='ipsMinorTitle'>{lang="order_order_total"}</h2>
|
|
<span class='cNexusOrderBadge cNexusOrderBadge_{$invoice->status}'>{lang="istatus_{$invoice->status}"}</span> <span class='cNexusPrice'>{$invoice->total}</span>
|
|
|
|
{{if $invoice->status === $invoice::STATUS_PENDING}}
|
|
<ul class='i-grid i-gap_2'>
|
|
<li><a href="{$invoice->checkoutUrl()}" class='ipsButton ipsButton--primary ipsButton--wide ipsButton--small' title="{lang="order_pay_now_title"}">{lang="order_pay_now"}</a></li>
|
|
<li><a href="{$invoice->url()->setQueryString( 'do', 'cancel' )->csrf()}" class='ipsButton ipsButton--soft ipsButton--wide ipsButton--small' data-confirm title='{lang="order_cancel_invoice"}'>{lang="cancel"}</a></li>
|
|
</ul>
|
|
{{elseif $invoice->status === $invoice::STATUS_EXPIRED}}
|
|
<p class='i-text-align_center i-color_soft i-margin-top_3'>
|
|
{lang="order_invoice_expired"}
|
|
</p>
|
|
{{elseif $invoice->status === $invoice::STATUS_CANCELED}}
|
|
<p class='i-text-align_center i-color_soft i-margin-top_3'>
|
|
{lang="order_invoice_cancelled"}
|
|
</p>
|
|
{{elseif $invoice->status === $invoice::STATUS_PAID}}
|
|
<p class='i-text-align_center i-color_soft i-margin-top_3'>
|
|
{lang="order_invoice_paid"}<br>
|
|
{{if $invoice->billaddress AND \count( $invoice->transactions( array( \IPS\nexus\Transaction::STATUS_PAID, \IPS\nexus\Transaction::STATUS_WAITING, \IPS\nexus\Transaction::STATUS_HELD, \IPS\nexus\Transaction::STATUS_REVIEW, \IPS\nexus\Transaction::STATUS_REFUSED, \IPS\nexus\Transaction::STATUS_REFUNDED, \IPS\nexus\Transaction::STATUS_PART_REFUNDED, \IPS\nexus\Transaction::STATUS_GATEWAY_PENDING ) ) ) > 0 }}
|
|
<a href='#elPaymentDetails' data-ipsDialog data-ipsDialog-content='#elPaymentDetails' data-ipsDialog-title='{lang="order_payment_details"}' data-ipsDialog-size='narrow'>{lang="order_view_payment"}</a>
|
|
{{endif}}
|
|
</p>
|
|
|
|
{{if $invoice->billaddress}}
|
|
<div id='elPaymentDetails' class='i-text-align_start ipsJS_hide'>
|
|
{template="paymentLog" group="clients" app="nexus" params="$invoice"}
|
|
</div>
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
{{$summary = $invoice->summary();}}
|
|
<div class='ipsBox ipsBox--commerceOrderDetails'>
|
|
<h2 class='ipsBox__header'>{lang="order_details"}</h2>
|
|
<div class='ipsBox__content'>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--order-details">
|
|
{{foreach $summary['items'] as $k => $item}}
|
|
{{if !( $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount )}}
|
|
<li class='ipsData__item'>
|
|
<div class="ipsData__image" aria-hidden="true">
|
|
{{if $image = $item->image()}}
|
|
<img src="{$image->url}" alt='' loading='lazy'>
|
|
{{elseif $item::$icon}}
|
|
<i class='fa-solid fa-{$item::$icon}'></i>
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<h2 class='ipsData__title'>
|
|
{{if $url = $item->url()}}
|
|
<a href="{$url}"><span class='i-color_soft'>{$item->quantity} x</span> {$item->name}</a>
|
|
{{else}}
|
|
<span class='i-color_soft'>{$item->quantity} x</span> {$item->name}
|
|
{{endif}}
|
|
</h2>
|
|
<dl class='cNexusPurchase_info'>
|
|
{$item->detailsForDisplay( 'invoice' )|raw}
|
|
</dl>
|
|
</div>
|
|
<div class='i-basis_140 i-text-align_end i-align-self_start'>
|
|
<span class='cNexusPrice i-font-size_2'>
|
|
{$item->linePrice()}
|
|
</span>
|
|
{{if $item->quantity > 1}}
|
|
<p class='i-font-size_-2 i-color_soft'>
|
|
{lang="each_short" sprintf="$item->price"}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{foreach $summary['items'] as $item}}
|
|
{{if $item instanceof \IPS\nexus\extensions\nexus\Item\CouponDiscount}}
|
|
<li class='ipsData__item cNexusCheckout_coupon'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="coupon"} {$item->name}</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
{$item->linePrice()}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
<li class='ipsData__item cNexusCheckout_subtotal'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="subtotal"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
{$summary['subtotal']}
|
|
</div>
|
|
</li>
|
|
{{foreach $summary['tax'] as $taxId => $tax}}
|
|
<li class='ipsData__item'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="nexus_tax_{$taxId}"} ({expression="$tax['rate']*100"}%)</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
{$tax['amount']}
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
<li class='ipsData__item i-font-size_2 cNexusCheckout_subtotal'>
|
|
<div class='ipsData__main i-text-align_end'>
|
|
<strong>{lang="total"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 i-text-align_end cNexusPrice'>
|
|
<strong>{$summary['total']}</strong>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="clients" template_name="invoiceList" template_data="$invoice, $fromBillingAgreement=NULL" template_location="front" template_app="nexus"><![CDATA[<li class='ipsData__item'>
|
|
<a href='{$invoice->url()}' class="ipsLinkPanel" aria-hidden="true"><span>{lang="order_view_details"}</span></a>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class="ipsColumns ipsColumns--orders">
|
|
<div class='ipsColumns__secondary i-basis_260'>
|
|
<a href='{$invoice->url()}' class='ipsData__title'>{datetime="$invoice->date"}</a>
|
|
<div class='ipsData__meta'><strong class='cNexusPrice'>{$invoice->total}</strong> · {lang="order_title"} #{$invoice->id}</div>
|
|
<p class='i-flex i-gap_1 i-align-items_center i-flex-wrap_wrap i-margin-top_1'>
|
|
<span class='cNexusOrderBadge cNexusOrderBadge_{$invoice->status}'>{lang="istatus_{$invoice->status}"}</span>
|
|
</p>
|
|
</div>
|
|
{{if !$fromBillingAgreement}}
|
|
<div class="ipsColumns__primary i-align-self_center">
|
|
{{$summary = $invoice->summary();}}
|
|
{{if \count( $summary['items'] )}}
|
|
<ul class='i-grid i-gap_3 cNexusOrderList_items'>
|
|
{{foreach $summary['items'] as $k => $item}}
|
|
<li class='i-flex i-gap_2'>
|
|
<div class='i-basis_40 i-flex_00' {{if $item::$title}}title='{lang="$item::$title"}' data-ipsTooltip{{endif}}>
|
|
<div class="ipsThumb i-width_100p">
|
|
{{if $image = $item->image()}}
|
|
<img src="{$image->url}" alt='' loading='lazy'>
|
|
{{elseif $item::$icon}}
|
|
<i class='fa-solid fa-{$item::$icon}'></i>
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
<div class='i-flex_11'>
|
|
{{if $url = $item->url()}}
|
|
<a href="{$url}" class='i-color_hard i-font-weight_600'>{$item->name}</a>
|
|
{{else}}
|
|
<span class='i-color_hard i-font-weight_600'>{$item->name}</span>
|
|
{{endif}}
|
|
<ul class='ipsList ipsList--inline i-color_soft i-gap_3 i-row-gap_0'>
|
|
<li>{lang="quantity"}: {$item->quantity}</li>
|
|
<li>{lang="invoice_unit_price"}: {$item->price}</li>
|
|
</ul>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{{else}}
|
|
<span class='ipsEmptyMessage'>{lang="orders_no_items"}</span>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{if $invoice->status === $invoice::STATUS_PENDING}}
|
|
<ul class='ipsButtons ipsButtons--fill i-flex_00'>
|
|
<li>
|
|
<a href='{$invoice->url()->setQueryString( 'do', 'cancel' )->csrf()}' data-confirm class='ipsButton ipsButton--inherit ipsButton--small' title="{lang="orders_cancel_title"}"><i class="fa-solid fa-xmark"></i> {lang="orders_cancel"}</a>
|
|
</li>
|
|
<li>
|
|
<a href='{$invoice->checkoutUrl()}' class='ipsButton ipsButton--primary ipsButton--small' title="{lang="order_pay_now_title"}"><i class="fa-solid fa-check"></i> {lang="order_pay_now"}</a>
|
|
</li>
|
|
</ul>
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
]]></template>
|
|
<template template_group="clients" template_name="invoices" template_data="$invoices, $pagination" template_location="front" template_app="nexus"><![CDATA[{template="pageHeader" group="global" app="core" params="\IPS\Member::loggedIn()->language()->addToStack('orders_title')"}
|
|
<div class="ipsBox ipsBox--commerceInvoices ipsPull">
|
|
{{if \count( $invoices )}}
|
|
{{if trim($pagination)}}
|
|
<div class="ipsButtonBar ipsButtonBar--top">
|
|
<div class="ipsButtonBar__pagination">
|
|
{$pagination|raw}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--invoices cNexusOrderList">
|
|
{{foreach $invoices as $invoice}}
|
|
{template="invoiceList" group="clients" params="$invoice"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
{{if trim($pagination)}}
|
|
<div class="ipsButtonBar ipsButtonBar--bottom">
|
|
<div class="ipsButtonBar__pagination">
|
|
{$pagination|raw}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
{{else}}
|
|
<p class="ipsEmptyMessage">{lang="orders_none"}</p>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="clients" template_name="packageFields" template_data="$item" template_location="front" template_app="nexus"><![CDATA[{{foreach $item->details as $k => $v}}
|
|
<dt class='ipsMinorTitle i-margin-top_2'><strong>{lang="nexus_pfield_{$k}"}</strong></dt>
|
|
<dd>{expression="\IPS\nexus\Package\CustomField::load( $k )->displayValue( $v )" raw="true"}</dd>
|
|
{{endforeach}}]]></template>
|
|
<template template_group="clients" template_name="paymentLog" template_data="$invoice" template_location="front" template_app="nexus"><![CDATA[<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--payment-log cNexusPaymentLog">
|
|
{{foreach $invoice->transactions( array( \IPS\nexus\Transaction::STATUS_PAID, \IPS\nexus\Transaction::STATUS_WAITING, \IPS\nexus\Transaction::STATUS_HELD, \IPS\nexus\Transaction::STATUS_REVIEW, \IPS\nexus\Transaction::STATUS_REFUSED, \IPS\nexus\Transaction::STATUS_REFUNDED, \IPS\nexus\Transaction::STATUS_PART_REFUNDED, \IPS\nexus\Transaction::STATUS_GATEWAY_PENDING ) ) as $thisTransaction}}
|
|
<li class='ipsData__item'>
|
|
{{if $thisTransaction->status === $thisTransaction::STATUS_PAID}}
|
|
<div class='ipsData__icon i-color_positive'>
|
|
<i class="fa-solid fa-check-circle"></i>
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>{lang="transaction_paid" sprintf="$thisTransaction->amount, ( $thisTransaction->method ) ? $thisTransaction->method->_title : \IPS\Member::loggedIn()->language()->get('account_credit')"}</div>
|
|
<p class='ipsData__meta'>{datetime="$thisTransaction->date"}</p>
|
|
</div>
|
|
{{elseif $thisTransaction->status === $thisTransaction::STATUS_WAITING}}
|
|
<div class='ipsData__icon i-color_issue'>
|
|
<i class="fa-solid fa-triangle-exclamation"></i>
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'><a href="{$thisTransaction->url()}">{lang="transaction_wait" sprintf="$thisTransaction->method->_title"}</a></div>
|
|
</div>
|
|
{{elseif $thisTransaction->status === $thisTransaction::STATUS_HELD or $thisTransaction->status === $thisTransaction::STATUS_REVIEW}}
|
|
<div class='ipsData__icon i-color_issue'>
|
|
<i class="fa-regular fa-clock"></i>
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>
|
|
{lang="transaction_awaiting_approval"}: {lang="transaction_paid" sprintf="$thisTransaction->amount, $thisTransaction->method->_title"}
|
|
<span class='i-color_soft'>{datetime="$thisTransaction->date"}</span>
|
|
</div>
|
|
{{if $thisTransaction->gw_id}}
|
|
<p class='ipsData__meta'>
|
|
{lang="payment_ref"}: {$thisTransaction->gw_id}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
{{elseif $thisTransaction->status === $thisTransaction::STATUS_GATEWAY_PENDING}}
|
|
<div class='ipsData__icon i-color_issue'>
|
|
<i class="fa-regular fa-clock"></i>
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>
|
|
{lang="transaction_processing"}: {lang="transaction_paid" sprintf="$thisTransaction->amount, $thisTransaction->method->_title"}</strong>
|
|
<span class='i-color_soft'>{datetime="$thisTransaction->date"}</span>
|
|
</p>
|
|
</div>
|
|
{{elseif $thisTransaction->status === $thisTransaction::STATUS_REFUSED}}
|
|
<div class='ipsData__icon i-color_warning'>
|
|
<i class="fa-solid fa-circle-xmark"></i>
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>{lang="transaction_declined" sprintf="$thisTransaction->amount, $thisTransaction->method->_title"}</div>
|
|
{{if $thisTransaction->gw_id}}
|
|
<p class='ipsData__meta'>
|
|
{lang="payment_ref"}: {$thisTransaction->gw_id}
|
|
</p>
|
|
{{endif}}
|
|
{{if isset( $thisTransaction->extra['processor_response'] )}}
|
|
<p class='ipsData__meta'>
|
|
{{$responseCode = $thisTransaction->extra['processor_response']['response_code'];}}
|
|
<br>
|
|
{lang="processor_response_avs"}: {$thisTransaction->extra['processor_response']['avs_code']} ({lang="processor_response_avs__{$thisTransaction->extra['processor_response']['avs_code']}"})
|
|
<br>
|
|
{lang="processor_response_cvv"}: {$thisTransaction->extra['processor_response']['cvv_code']}({lang="processor_response_cvv__{$thisTransaction->extra['processor_response']['cvv_code']}"})
|
|
<br>
|
|
{lang="processor_response_code"}: {$responseCode} {{if \is_numeric( $responseCode )}}{{$responseCode = (int)$responseCode;}}{{endif}}
|
|
<br>
|
|
<span>{lang="processor_response_code__{$responseCode}"}</span>
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
{{elseif $thisTransaction->status === $thisTransaction::STATUS_REFUNDED}}
|
|
<div class='ipsData__icon i-color_soft'>
|
|
<i class="fa-solid fa-circle-arrow-left"></i>
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>{lang="transaction_refunded" sprintf="$thisTransaction->amount, ( $thisTransaction->method ) ? $thisTransaction->method->_title : \IPS\Member::loggedIn()->language()->get('account_credit')"}</div>
|
|
{{if $thisTransaction->gw_id}}
|
|
<p class='ipsData__meta'>
|
|
{lang="payment_ref"}: {$thisTransaction->gw_id}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
{{elseif $thisTransaction->status === $thisTransaction::STATUS_PART_REFUNDED}}
|
|
<div class='ipsData__icon i-color_positive'>
|
|
<i class="fa-solid fa-check-circle"></i>
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>{lang="transaction_paid" sprintf="$thisTransaction->amount, ( $thisTransaction->method ) ? $thisTransaction->method->_title : \IPS\Member::loggedIn()->language()->get('account_credit')"}
|
|
<span class='i-color_soft'>{datetime="$thisTransaction->date"}</span>
|
|
</div>
|
|
{{if $thisTransaction->partial_refund->amount->isGreaterThanZero()}}
|
|
<p>
|
|
{lang="transaction_part_refunded" sprintf="$thisTransaction->partial_refund"}
|
|
</p>
|
|
{{endif}}
|
|
{{if $thisTransaction->credit->amount->isGreaterThanZero()}}
|
|
<p>
|
|
{lang="transaction_part_credited" sprintf="$thisTransaction->credit"}
|
|
</p>
|
|
{{endif}}
|
|
{{if $thisTransaction->gw_id}}
|
|
<p class='ipsData__meta'>
|
|
{lang="payment_ref"}: {$thisTransaction->gw_id}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>]]></template>
|
|
<template template_group="clients" template_name="purchase" template_data="$purchase" template_location="front" template_app="nexus"><![CDATA[{{$extra = $purchase->clientAreaPage();}}
|
|
<div class='ipsBox ipsBox--commercePurchase'>
|
|
<div class='ipsColumns cNexusPurchase i-padding_2'>
|
|
<div class='ipsColumns__secondary i-basis_200'>
|
|
<span class='ipsThumb i-display_block'>
|
|
{{if $image = $purchase->image()}}
|
|
<img src="{expression="str_replace( array( '(', ')' ), array( '\(', '\)' ), $image->url )"}" alt="" loading="lazy">
|
|
{{elseif $icon = $purchase->getIcon()}}
|
|
<i class='fa fa-solid fa-{$icon}'></i>
|
|
{{else}}
|
|
{{if $purchase->type == 'giftvoucher'}}
|
|
<i class="fa-solid fa-gift"></i>
|
|
{{else}}
|
|
<i class="fa-solid fa-box-open"></i>
|
|
{{endif}}
|
|
{{endif}}
|
|
</span>
|
|
|
|
<hr class='ipsHr'>
|
|
|
|
{{if ( $purchase->expire AND $canRenewUntil = $purchase->canRenewUntil(NULL,TRUE) ) OR $purchase->canCancel()}}
|
|
<ul class='i-grid i-gap_2 cNexusPurchase_renewActions'>
|
|
{{if $purchase->expire AND $canRenewUntil}}
|
|
<li><a href="{url="app=nexus&module=clients&controller=purchases&do=renew&id={$purchase->id}" base="front" csrf="true" seoTemplate="clientspurchaserenew" seoTitle="\IPS\Http\Url\Friendly::seoTitle( $purchase->name )"}" class='ipsButton ipsButton--primary ipsButton--wide ipsButton--small' title="{lang="purchase_renew_now_title"}" {{if $canRenewUntil === TRUE or $canRenewUntil > 1}}data-ipsDialog data-ipsDialog-size='narrow'{{endif}}>{lang="purchase_renew_now"}</a></li>
|
|
{{endif}}
|
|
{{if $purchase->canCancel()}}
|
|
<li><a href="{url="app=nexus&module=clients&controller=purchases&do=cancel&id={$purchase->id}" base="front" csrf="true" seoTemplate="clientspurchasecancel" seoTitle="\IPS\Http\Url\Friendly::seoTitle( $purchase->name )"}" class='ipsButton ipsButton--text ipsButton--wide ipsButton--small' data-confirm data-confirmSubMessage="{lang="purchase_cancel_renewal_confirm"}">{lang="purchase_cancel_renewal"}</a></li>
|
|
{{endif}}
|
|
</ul>
|
|
{{endif}}
|
|
|
|
<dl class='cNexusPurchase_info i-margin-top_3' data-ips-hook="purchaseInfo">
|
|
<dt class='ipsMinorTitle'><strong>{lang="ps_start"}</strong></dt>
|
|
<dd>{$purchase->start->localeDate()}</dd>
|
|
{{if $purchase->expire}}
|
|
<dt class='ipsMinorTitle'><strong>{lang="ps_expire"}</strong></dt>
|
|
<dd>{$purchase->expire->localeDate()}</dd>
|
|
{{endif}}
|
|
{{if $purchase->renewals and !$purchase->grouped_renewals}}
|
|
<dt class='ipsMinorTitle'><strong>{lang="purchase_renewal_terms"}</strong></dt>
|
|
<dd>{$purchase->renewals->toDisplay( $purchase->member )}</dd>
|
|
{{endif}}
|
|
{{if $purchase->billing_agreement AND !$purchase->billing_agreement->canceled}}
|
|
<dt class='ipsMinorTitle'><strong>{lang="ps_billing_agreement"}</strong></dt>
|
|
<dd class='i-link-color_inherit'><a href='{$purchase->billing_agreement->url()}'>{$purchase->billing_agreement->gw_id}</a></dd>
|
|
{{endif}}
|
|
</dl>
|
|
</div>
|
|
<div class='ipsColumns__primary'>
|
|
<h1 class="ipsTitle ipsTitle--h3">{$purchase->name}</h1>
|
|
<p>
|
|
{{if $purchase->cancelled}}
|
|
<span class='ipsBadge ipsBadge--negative'>{lang="purchase_canceled"}</span>
|
|
{{elseif !$purchase->active}}
|
|
<span class='ipsBadge ipsBadge--neutral'>{lang="purchase_expired"}</span>
|
|
{{elseif $purchase->expire}}
|
|
{{if $purchase->grace_period and $purchase->expire->getTimestamp() < time()}}
|
|
<span class='ipsBadge ipsBadge--positive'>{lang="purchase_in_grace_period_front"}</span>
|
|
{{else}}
|
|
<span class='ipsBadge ipsBadge--positive'>{lang="purchase_active"}</span>
|
|
{{endif}}
|
|
{{endif}}
|
|
{lang="$purchase->getTypeTitle()"}
|
|
</p>
|
|
<br><br>
|
|
|
|
{{if $pendingInvoice = $purchase->invoice_pending and $pendingInvoice->status === $pendingInvoice::STATUS_PENDING}}
|
|
<div class='i-margin-bottom_3 ipsMessage ipsMessage--info'>
|
|
{lang="purchase_pending_invoice"} {{if $pendingInvoice->canView()}}<a href="{$pendingInvoice->checkoutUrl()}" title="{lang="order_pay_now_title"}">{lang="order_pay_now"}</a>{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if $lkey = $purchase->licenseKey()}}
|
|
<div class='i-background_2 i-padding_3 i-text-align_center i-margin-bottom_4'>
|
|
<h2 class='ipsMinorTitle i-margin-bottom_2'>{lang="purchase_license_key"}</h2>
|
|
<div class='i-font-size_2 i-font-family_monospace cNexusLicenseKey'>
|
|
{$lkey->key}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if isset( $extra['packageInfo'] )}}
|
|
<h2 class='ipsTitle ipsTitle--h3 i-margin-bottom_2'>{lang="purchase_package_info"}</h2>
|
|
{template="richText" group="global" app="core" location="global" params="$extra['packageInfo'], array('i-margin-bottom_3')"}
|
|
{{endif}}
|
|
|
|
{{if isset( $extra['purchaseInfo'] )}}
|
|
<div>{$extra['purchaseInfo']|raw}</div>
|
|
<br><br>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="clients" template_name="purchaseList" template_data="$rootId, $purchases, $halfSize=FALSE, $fromBillingAgreement=NULL" template_location="front" template_app="nexus"><![CDATA[{{foreach $purchases[$rootId] as $purchase}}
|
|
<li class='cNexusPurchaseList i-flex i-flex-direction_column i-gap_2 i-padding_3'>
|
|
<a href='{$purchase->url()}' class='ipsThumb i-aspect-ratio_7'>
|
|
{{if $image = $purchase->image()}}
|
|
<img src="{expression="str_replace( array( '(', ')' ), array( '\(', '\)' ), $image->url )"}" alt='' loading='lazy'>
|
|
{{elseif $icon = $purchase->getIcon()}}
|
|
<i class='fa fa-{$icon} i-font-size_7'></i>
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</a>
|
|
<h2 class='ipsTitle ipsTitle--h3'><a href="{$purchase->url()}" title="{lang="purchases_manage_purchase"}">{$purchase->name}</a></h2>
|
|
<p class="i-color_soft i-font-weight_500">{lang="$purchase->getTypeTitle()"}</p>
|
|
{{if isset( $purchases[ $purchase->id ])}}
|
|
<ul class='cNexusPurchaseSubList'>
|
|
{template="purchaseList" group="clients" params="$purchase->id, $purchases, TRUE"}
|
|
</ul>
|
|
{{endif}}
|
|
<div class='i-margin-top_auto i-padding-top_3 cNexusPurchaseList_info'>
|
|
|
|
{{if !$fromBillingAgreement and $pendingInvoice = $purchase->invoice_pending and $pendingInvoice->status === $pendingInvoice::STATUS_PENDING}}
|
|
<p>
|
|
<i class='fa-solid fa-circle-info'></i> {lang="purchase_pending_invoice"} {{if $pendingInvoice->canView()}}<a href="{$pendingInvoice->checkoutUrl()}" title="{lang="order_pay_now_title"}">{lang="order_pay_now"}</a>{{endif}}
|
|
</p>
|
|
<hr class='ipsHr'>
|
|
{{endif}}
|
|
|
|
<div class='i-flex i-flex-wrap_wrap i-gap_3'>
|
|
<div>
|
|
<h3 class='ipsMinorTitle'>{lang="purchase_status"}</h3>
|
|
<span>{{if $purchase->active}}{{if $purchase->grace_period and $expire = $purchase->expire and $expire->getTimestamp() < time()}}<span class='ipsBadge ipsBadge--positive'>{lang="purchase_in_grace_period_front"}</span>{{else}}<span class='ipsBadge ipsBadge--positive'>{lang="purchase_active"}</span>{{endif}}{{elseif $purchase->cancelled}}<span class='ipsBadge ipsBadge--negative'>{lang="purchase_canceled"}</span>{{else}}<span class='ipsBadge ipsBadge--neutral'>{lang="purchase_expired"}</span>{{endif}}</span>
|
|
</div>
|
|
<div>
|
|
<h3 class='ipsMinorTitle'>{lang="ps_start"}</h3>
|
|
<span>{$purchase->start->localeDate()}</span>
|
|
</div>
|
|
{{if $purchase->expire}}
|
|
<div>
|
|
<h3 class='ipsMinorTitle'>{lang="ps_expire"}</h3>
|
|
<span>{$purchase->expire->localeDate()}</span>
|
|
</div>
|
|
{{endif}}
|
|
{{if !$fromBillingAgreement and $purchase->billing_agreement AND !$purchase->billing_agreement->canceled}}
|
|
<div>
|
|
<h3 class='ipsMinorTitle'>{lang="ps_billing_agreement"}</h3>
|
|
<span><a href='{$purchase->billing_agreement->url()}'>{$purchase->billing_agreement->gw_id}</a></span>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
<div class='ipsButtons ipsButtons--fill ipsButtons--start i-padding-top_2' data-ips-hook="purchaseButtons">
|
|
{{if $fromBillingAgreement}}
|
|
<!-- <a href='{$purchase->url()}' class='ipsButton ipsButton--secondary ipsButton--small' title="{lang="purchases_manage_purchase"}"><i class="fa-solid fa-box-open"></i> {lang="view"}</a> -->
|
|
{{else}}
|
|
{{if $canRenewUntil = $purchase->canRenewUntil(NULL,TRUE)}}
|
|
<a href="{$purchase->url()->setQueryString( 'do', 'renew' )->csrf()}" class='ipsButton ipsButton--inherit ipsButton--small' title="{lang="purchase_renew_now_title"}" {{if $canRenewUntil === TRUE OR $canRenewUntil > 1}}data-ipsDialog data-ipsDialog-size='narrow'{{endif}}><i class="fa-solid fa-arrows-rotate"></i> {lang="purchases_renewal_price"} {money="$purchase->renewal_price"}</a>
|
|
{{endif}}
|
|
<!-- <a href='{$purchase->url()}' class='ipsButton ipsButton--secondary ipsButton--small' title="{lang="purchases_manage_purchase"}"><i class="fa-solid fa-pen-to-square"></i> {lang="manage"}</a> -->
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endforeach}}]]></template>
|
|
<template template_group="clients" template_name="purchases" template_data="$purchases" template_location="front" template_app="nexus"><![CDATA[<div class="ipsBox ipsBox--commercePurchases ipsPull">
|
|
<header class="ipsPageHeader ipsPageHeader--padding">
|
|
<h1 class='ipsPageHeader__title'>{lang="purchases_title"}</h1>
|
|
{{if \count( $purchases )}}
|
|
<p class='ipsPageHeader__desc'>
|
|
{lang="purchases_info"}
|
|
</p>
|
|
{{endif}}
|
|
</header>
|
|
{{if \count( $purchases )}}
|
|
<ul class="ipsGrid ipsGrid--lines i-basis_300">
|
|
{template="purchaseList" group="clients" params="0, $purchases"}
|
|
</ul>
|
|
{{else}}
|
|
<div class='ipsEmptyMessage'>
|
|
{lang="purchases_none"}
|
|
</div>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="customers" template_name="accountInformation" template_data="$customer, $tabs, $activeTabKey, $activeTabContents, $activeSubscription" template_location="admin" template_app="nexus"><![CDATA[
|
|
<div class='ipsBox'>
|
|
<div id='acpPageHeader' class='cNexusSupportHeader i-text-align_center'>
|
|
{template="userPhoto" group="global" app="core" params="$customer, 'medium'"}
|
|
<div>
|
|
<h1 class='i-font-size_5 i-color_hard i-font-weight_bold i-margin-top_2'>{$customer->cm_name}</h1>
|
|
<p class="i-font-size_2 i-color_soft i-font-weight_500">{$customer->email}</p>
|
|
<p class='i-font-weight_500 i-margin-top_2 i-color_soft'>{lang="customer_since" htmlsprintf="$customer->joined->html()"}</p>
|
|
{{if $activeSubscription}}
|
|
<p class="i-text-align_center i-color_positive i-font-size_1 i-margin-top_1">
|
|
{{if member.hasAcpRestriction( 'nexus', 'customers', 'purchases_view' ) and $activeSubscription->purchase}}
|
|
<a href="{$activeSubscription->purchase->acpUrl()}" class="i-link-color_inherit">
|
|
{{endif}}
|
|
<i class="fa-solid fa-certificate"></i> {lang="nexus_subs_subscriber" sprintf="$activeSubscription->package->_title"}
|
|
{{if member.hasAcpRestriction( 'nexus', 'customers', 'purchases_view' ) and $activeSubscription->purchase}}
|
|
</a>
|
|
{{endif}}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
|
|
{{if \IPS\Member::loggedIn()->hasAcpRestriction( 'nexus', 'payments', 'invoices_add' )}}
|
|
<div class="i-margin-top_2"><a href='{url="app=nexus&module=payments&controller=invoices&do=generate&member={$customer->member_id}&_new=1"}' class='ipsButton ipsButton--primary ipsButton--wide ipsButton--large'>{lang="add_invoice"}</a></div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class='ipsBox'>
|
|
<i-tabs class='ipsTabs ipsTabs--stretch ipsTabs--customerTabs' id='ipsTabs_customer' data-ipsTabBar data-ipsTabBar-contentArea='#ipsTabs_customer_content'>
|
|
<div role='tablist'>
|
|
{{foreach $tabs as $k => $tab}}
|
|
<a href='{$customer->acpUrl()->setQueryString( array( 'do' => 'view', 'blockKey' => 'nexus_AccountInformation', 'block[nexus_AccountInformation]' => $k ) )}' class='ipsTabs__tab' id='ipsTabs_customer_{$k}' role="tab" aria-controls="ipsTabs_customer_{$k}_panel" aria-selected="{{if $activeTabKey == $k}}true{{else}}{{endif}}" data-ipsTooltip title='{lang="customer_tab_{$k}"}'>
|
|
<i class='{$tab['icon']}'></i> <span class='ipsResponsive_showPhone'>{lang="customer_tab_{$k}"}</span>
|
|
{{if $tab['count']}}<span class='ipsNotification'>{$tab['count']}</span>{{endif}}
|
|
</a>
|
|
{{endforeach}}
|
|
</div>
|
|
{template="tabScrollers" app="core" group="global" location="global"}
|
|
</i-tabs>
|
|
<div id='ipsTabs_customer_content' class='ipsTabs__panels acpFormTabContent'>
|
|
<div id='ipsTabs_customer_{$activeTabKey}_panel' class='ipsTabs__panel' role="tabpanel" aria-labelledby='ipsTabs_customer_{$activeTabKey}'>
|
|
{$activeTabContents|raw}
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="customers" template_name="accountInformationOverview" template_data="$customer, $sparkline, $primaryBillingAddress, $addressCount" template_location="admin" template_app="nexus"><![CDATA[<div class="i-padding_3">
|
|
{{if $sparkline }}
|
|
<div id='elCustomerIncome'>{$sparkline|raw}</div>
|
|
<p class='i-color_soft i-font-size_-1 i-margin-top_1'>
|
|
{lang="revenue_past_12_months"}
|
|
</p>
|
|
{{endif}}
|
|
|
|
{{if \IPS\Member::loggedIn()->hasAcpRestriction( 'nexus', 'customers', 'customers_view_credit' )}}
|
|
<div class="i-margin-top_4">
|
|
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
|
<div class='i-background_3{{if isset( $customer->cm_credits[ $currency ] ) && $customer->cm_credits[ $currency ]->amount->isGreaterThanZero()}}_positive{{endif}} i-padding_2 i-text-align_center i-font-size_2 cCustomerCredit i-border-radius_box'>
|
|
<h2 class='ipsMinorTitle'>{lang="client_credit"}</h2>
|
|
{{if isset( $customer->cm_credits[ $currency ] )}}
|
|
{$customer->cm_credits[ $currency ]}
|
|
{{else}}
|
|
{money="0" currency="$currency"}
|
|
{{endif}}
|
|
{{if member.hasAcpRestriction( 'nexus', 'customers', 'customers_edit_credit' )}}
|
|
<p><a href='{url="app=nexus&module=customers&controller=view&id={$customer->member_id}&do=credits"}' data-ipsDialog data-ipsDialog-title='{lang="edit_credit"}' data-ipsDialog-size='narrow' class='i-font-size_-1'>{lang="edit"}</a></p>
|
|
{{endif}}
|
|
</div>
|
|
{{endforeach}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
<div class="i-margin-top_4">
|
|
<h2 class='ipsTitle ipsTitle--h4'>{lang="primary_address"}</h2>
|
|
{{if $primaryBillingAddress}}
|
|
<p class='i-font-size_1 i-margin-top_1'>
|
|
{$primaryBillingAddress->toString('<br>')|raw}
|
|
{{if isset( $primaryBillingAddress->vat ) and $primaryBillingAddress->vat}}
|
|
<br>
|
|
{lang="cm_checkout_vat_number"}: {template="vatNumber" app="nexus" group="global" params="$primaryBillingAddress->vat"}
|
|
{{endif}}
|
|
</p>
|
|
{{else}}
|
|
<p class='i-font-size_1 i-margin-top_1 i-color_soft'>
|
|
{lang="no_primary_address"}
|
|
</p>
|
|
{{endif}}
|
|
<p>
|
|
<a href='{url="app=nexus&module=customers&controller=view&id={$customer->member_id}&do=addresses"}' data-ipsDialog data-ipsDialog-title='{lang="customer_addresses"}' class='i-font-size_-1'>{lang="edit_addresses_count" sprintf="$addressCount"}</a>
|
|
</p>
|
|
</div>
|
|
|
|
{{if \count( \IPS\nexus\Customer\CustomField::roots() ) or member.hasAcpRestriction( 'nexus', 'customers', 'customers_edit_details' )}}
|
|
<div class="i-margin-top_4">
|
|
<h2 class='ipsTitle ipsTitle--h4 i-margin-bottom_1'>{lang="customer_information"}</h2>
|
|
{{if member.hasAcpRestriction( 'nexus', 'customers', 'customers_edit_details' )}}
|
|
<p class='i-margin-bottom_1'>
|
|
<a href='{url="app=nexus&module=customers&controller=view&id={$customer->member_id}&do=edit"}' class='i-font-size_-1' data-ipsDialog data-ipsDialog-title='{lang="edit_customer_info"}'>{lang="edit_information"}</a>
|
|
</p>
|
|
{{endif}}
|
|
{{foreach \IPS\nexus\Customer\CustomField::roots() as $field}}
|
|
{{$column = $field->column;}}
|
|
{{if $displayValue = $field->displayValue( $customer->$column, TRUE )}}
|
|
<div class="i-margin-bottom_1">
|
|
<h2 class='ipsMinorTitle'>{$field->_title}</h2>
|
|
<p class='i-font-size_1'>
|
|
{$displayValue|raw}
|
|
</p>
|
|
</div>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if member.hasAcpRestriction( 'nexus', 'customers', 'customers_void' )}}
|
|
<a href="{url="app=nexus&module=customers&controller=view&do=void&id={$customer->member_id}"}" class="i-margin-top_4 ipsButton ipsButton--negative ipsButton--wide" data-ipsDialog data-ipsDialog-title="{lang="void_account"}">{lang="void_account"}</a>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="customers" template_name="accountInformationTablePreview" template_data="$customer, $table, $title, $type" template_location="admin" template_app="nexus"><![CDATA[<div class="i-padding_3">
|
|
{{$count = \count( $table->getRows(NULL) );}}
|
|
<h3 class='ipsTitle ipsTitle--h4'>{$title}</h3>
|
|
{$table|raw}
|
|
<p class='i-margin-top_1'>
|
|
<a href='{url="app=core&module=members&controller=members&do=editBlock&block=IPS\\nexus\\extensions\\core\\MemberACPProfileBlocks\\AccountInformation&id={$customer->member_id}&type={$type}"}' data-ipsDialog data-ipsDialog-title='{lang="customer_tab_{$type}"}' class='ipsButton ipsButton--inherit ipsButton--wide'>
|
|
{lang="customer_manage_{$type}"} <i class='fa-solid fa-caret-down'></i>
|
|
</a>
|
|
</p>
|
|
</div>]]></template>
|
|
<template template_group="customers" template_name="addressItem" template_data="$address" template_location="admin" template_app="nexus"><![CDATA[
|
|
<div>
|
|
{$address['address']|raw}
|
|
|
|
{{if $address['_buttons']}}
|
|
<br>
|
|
{template="controlStrip" params="$address['_buttons'], 'ipsControlStrip_showText'" group="global" app="core"}
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="customers" template_name="addressTable" template_data="$table, $headers, $rows, $quickSearch" template_location="admin" template_app="nexus"><![CDATA[
|
|
{template="buttons" params="$table->rootButtons, ''" group="global" app="core" if="isset( $headers['_buttons'] )"}
|
|
|
|
<div class='cCustomerAddresses'>
|
|
{{if \count( $rows )}}
|
|
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
|
{{else}}
|
|
<p class='ipsEmptyMessage'>{lang="no_addresses"}</p>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="customers" template_name="addressTableRows" template_data="$table, $headers, $rows" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{$billing = null;}}
|
|
|
|
{{foreach $rows as $row}}
|
|
{{if $row['primary_billing'] == true}}
|
|
{{$billing = $row;}}
|
|
{{endif}}
|
|
{{endforeach}}
|
|
|
|
{{if $billing}}
|
|
<div class='ipsSpanGrid'>
|
|
{{if $billing}}
|
|
<div class='ipsSpanGrid__6 i-background_2 i-padding_3'>
|
|
<h2 class='ipsTitle ipsTitle--h3 i-margin-bottom_1'>{lang="address_default_billing"}</h2>
|
|
{template="addressItem" group="customers" app="nexus" params="$billing"}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
<hr class='ipsHr'>
|
|
|
|
{{if ( $billing && \count( $rows ) > 1 ) || ( !$billing && \count( $rows ) )}}
|
|
<ul class='ipsGrid i-basis_340'>
|
|
{{foreach $rows as $row}}
|
|
{{if !$row['primary_billing']}}
|
|
<li>
|
|
{template="addressItem" group="customers" app="nexus" params="$row"}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endif}}]]></template>
|
|
<template template_group="customers" template_name="altContactsOverview" template_data="$table, $headers, $rows, $quickSearch" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{if \count( $rows )}}
|
|
<ul class='cCustomerOther_list i-grid i-gap_2 i-margin-top_2 i-margin-bottom_3'>
|
|
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
|
</ul>
|
|
{{else}}
|
|
<p class='ipsEmptyMessage'>{lang="no_alternate_contacts"}</p>
|
|
{{endif}}]]></template>
|
|
<template template_group="customers" template_name="altContactsOverviewRows" template_data="$table, $headers, $rows" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{foreach $rows as $row}}
|
|
<li>
|
|
<p class='i-font-weight_600 i-color_hard'>
|
|
{$row['alt_id']|raw}
|
|
</p>
|
|
<span class='i-color_soft'>{$row['email']}</span>
|
|
</li>
|
|
{{endforeach}}]]></template>
|
|
<template template_group="customers" template_name="billingAgreementsOverview" template_data="$table, $headers, $rows, $quickSearch" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{if \count( $rows )}}
|
|
<ul class='cCustomerOther_list i-grid i-gap_3'>
|
|
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
|
</ul>
|
|
{{else}}
|
|
<p class='ipsEmptyMessage'>{lang="no_billing_agreements"}</p>
|
|
{{endif}}]]></template>
|
|
<template template_group="customers" template_name="billingAgreementsOverviewRows" template_data="$table, $headers, $rows" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{foreach $rows as $row}}
|
|
<li>
|
|
<a href="{url="app=nexus&module=payments&controller=billingagreements&id={$row['id']}"}" class="i-link-color_inherit">
|
|
<span class='ipsTruncate ipsTruncate_line'>
|
|
{$row['gw_id']}
|
|
</span>
|
|
<span class='i-font-size_1 i-color_soft ipsTruncate ipsTruncate_line'>{{if $row['next_cycle']}}{lang="ba_next_cycle"} {$row['next_cycle']}{{endif}}</span>
|
|
</a>
|
|
</li>
|
|
{{endforeach}}]]></template>
|
|
<template template_group="customers" template_name="cardsOverview" template_data="$table, $headers, $rows, $quickSearch" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{if \count( $rows )}}
|
|
<ul class='cCustomerOther_list i-grid i-gap_3'>
|
|
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
|
</ul>
|
|
{{else}}
|
|
<p class='ipsEmptyMessage'>{lang="no_credit_cards"}</p>
|
|
{{endif}}]]></template>
|
|
<template template_group="customers" template_name="cardsOverviewRows" template_data="$table, $headers, $rows" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{foreach $rows as $row}}
|
|
<li>
|
|
<p class='ipsTruncate ipsTruncate_line'>
|
|
{{if $row['card_type'] == 'paypal' or $row['card_type'] == 'venmo'}}{$row['card_number']}{{elseif $row['card_type'] == 'american_express' OR $row['card_type'] == 'diners_club'}}XXXX-XXXXXX-X{$row['card_number']}{{else}}XXXX-XXXX-XXXX-{$row['card_number']}{{endif}}
|
|
</p>
|
|
<span class='i-font-size_1 i-color_soft ipsTruncate ipsTruncate_line'>{{if $row['card_type']}}{lang="card_type_{$row['card_type']}"}{{else}}{lang="card_type_generic"}{{endif}}{{if isset( $row['card_expires'] )}}, {lang="card_expires_lc"} {$row['card_expire']}{{endif}}</span>
|
|
</li>
|
|
{{endforeach}}]]></template>
|
|
<template template_group="customers" template_name="cardsTable" template_data="$table, $headers, $rows, $quickSearch" template_location="admin" template_app="nexus"><![CDATA[
|
|
{template="buttons" params="$table->rootButtons, ''" group="global" app="core" if="isset( $headers['_buttons'] )"}
|
|
|
|
{{if \count( $rows )}}
|
|
<ul class='ipsList ipsList--inline cNexusCards i-margin-top_1 i-text-align_center'>
|
|
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
|
</ul>
|
|
{{else}}
|
|
<p class='ipsEmptyMessage'>
|
|
{lang="no_credit_cards"}
|
|
</p>
|
|
{{endif}}]]></template>
|
|
<template template_group="customers" template_name="cardsTableRows" template_data="$table, $headers, $rows" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{foreach $rows as $row}}
|
|
<li>
|
|
{{if $row['card_type'] == 'paypal' or $row['card_type'] === 'venmo'}}
|
|
<div class='cNexusCards_name'>{$row['card_number']}</div>
|
|
{{else}}
|
|
<span class='cNexusCards_number'>
|
|
{{if $row['card_type'] == 'american_express' OR $row['card_type'] == 'diners_club'}}
|
|
XXXX XXXXXX X{$row['card_number']}
|
|
{{else}}
|
|
XXXX XXXX XXXX {$row['card_number']}
|
|
{{endif}}
|
|
</span>
|
|
{{endif}}
|
|
{{if $row['card_type']}}
|
|
<span class='cNexusCards_type cPayment cPayment_{$row['card_type']}'>{lang="card_type_{$row['card_type']}"}</span>
|
|
{{endif}}
|
|
{{if $row['card_expire']}}
|
|
<span class='cNexusCards_expTitle'>{lang="cards_exp"}</span>
|
|
<span class='cNexusCards_exp'>{$row['card_expire']}</span>
|
|
{{endif}}
|
|
|
|
<a href="{url="app=nexus&module=customers&controller=view&do=deleteCard&id={$row['card_member']}&card_id={$row['id']}" csrf="true"}" class='cNexusCards_delete' data-confirm data-ipsTooltip title='{lang="delete_this_card"}'>×</a>
|
|
</li>
|
|
{{endforeach}}]]></template>
|
|
<template template_group="customers" template_name="customerPopup" template_data="$content" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{if \IPS\Request::i()->isAjax()}}
|
|
<div class='i-padding_3'>
|
|
{{endif}}
|
|
|
|
{$content|raw}
|
|
|
|
{{if \IPS\Request::i()->isAjax()}}
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="customers" template_name="downloadsLink" template_data="$file" template_location="admin" template_app="nexus"><![CDATA[<a href="{$file->url()}" target="_blank" rel='noopener'>{$file->name}</a>]]></template>
|
|
<template template_group="customers" template_name="invoices" template_data="$customer, $invoices, $invoiceCount" template_location="admin" template_app="nexus"><![CDATA[<div class='ipsBox ipsPull ipsBox--invoicesACP'>
|
|
<h2 class='ipsBox__header'>
|
|
{lang="menu__nexus_payments_invoices"} ({$invoiceCount})
|
|
{{if $invoiceCount > $invoices->limit}}
|
|
<a href="{url="app=nexus&module=payments&controller=invoices&member={$customer->member_id}"}" class="ipsBox__header-secondary">{lang="see_all_invoices" pluralize="$invoiceCount"}</a>
|
|
{{endif}}
|
|
</h2>
|
|
<div>
|
|
{$invoices|raw}
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="customers" template_name="invoicesTable" template_data="$table, $headers, $rows, $quickSearch" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{if \count( $rows )}}
|
|
<i-data>
|
|
<ul class='ipsData ipsData--table ipsData--invoices-table'>
|
|
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
|
</ul>
|
|
</i-data>
|
|
{{else}}
|
|
<p class='ipsEmptyMessage'>{lang="no_invoices"}</p>
|
|
{{endif}}]]></template>
|
|
<template template_group="customers" template_name="invoicesTableRows" template_data="$table, $headers, $rows" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{foreach $rows as $row}}
|
|
<li class='ipsData__item'>
|
|
<div class="i-flex i-flex-wrap_wrap i-align-items_center i-gap_3">
|
|
<div class="i-flex_91 i-basis_300 i-flex i-gap_2 i-align-items_center">
|
|
<div class='i-flex_00 i-basis_100 i-text-align_center'>
|
|
<span class='cNexusCustomerInvoice'>{$row['i_total']}</span>
|
|
{$row['i_status']|raw}
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div class="i-flex i-align-items_center i-gap_3 i-flex-wrap_wrap">
|
|
<div class="i-flex_91">
|
|
<p class='ipsData__title'>
|
|
{{if $row['_buttons']['view']}}
|
|
<a href='{$row['_buttons']['view']['link']}'>
|
|
{{endif}}
|
|
<span class='i-color_soft'>#{$row['i_id']}</span>: {$row['i_title']|raw}
|
|
{{if $row['_buttons']['view']}}
|
|
</a>
|
|
{{endif}}
|
|
</p>
|
|
<p class='ipsData__meta'>{lang="invoice_created"} {datetime="$row['i_date']"}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class='i-flex_11 i-basis_120 i-text-align_end'>
|
|
{template="controlStrip" params="$row['_buttons']" group="global" app="core"}
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}]]></template>
|
|
<template template_group="customers" template_name="logType" template_data="$type" template_location="admin" template_app="nexus"><![CDATA[{{if $type === 'invoice'}}
|
|
<i class="fa-solid fa-file-lines"></i>
|
|
{{elseif $type === 'purchase'}}
|
|
<i class="fa-solid fa-box-archive"></i>
|
|
{{elseif $type === 'transaction'}}
|
|
<i class="fa-solid fa-money-bill"></i>
|
|
{{elseif $type === 'comission' or $type === 'payout'}}
|
|
<i class="fa-solid fa-folder-open"></i>
|
|
{{elseif $type === 'giftvoucher'}}
|
|
<i class="fa-solid fa-gift"></i>
|
|
{{elseif $type === 'info'}}
|
|
<i class="fa-solid fa-user"></i>
|
|
{{elseif $type === 'address'}}
|
|
<i class="fa-solid fa-house"></i>
|
|
{{elseif $type === 'card'}}
|
|
<i class="fa-solid fa-credit-card"></i>
|
|
{{elseif $type === 'alternative'}}
|
|
<i class="fa-solid fa-users"></i>
|
|
{{elseif $type === 'lkey'}}
|
|
<i class="fa-solid fa-key"></i>
|
|
{{elseif $type === 'download'}}
|
|
<i class="fa-solid fa-download"></i>
|
|
{{elseif $type === 'billingagreement'}}
|
|
<i class="fa-brands fa-paypal"></i>
|
|
{{elseif $type === 'note'}}
|
|
<i class="fa-solid fa-file-lines"></i>
|
|
{{elseif $type === 'custom'}}
|
|
<i class="fa-solid fa-star"></i>
|
|
{{else}}
|
|
{$type}
|
|
{{endif}}]]></template>
|
|
<template template_group="customers" template_name="notes" template_data="$table, $headers, $rows, $quickSearch" template_location="admin" template_app="nexus"><![CDATA[<div class="i-flex">
|
|
<div class="i-flex_11">
|
|
{{if $table->pages > 1}}
|
|
{template="pagination" group="global" app="core" location="global" params="$table->baseUrl, $table->pages, $table->page, $table->limit"}
|
|
{{endif}}
|
|
</div>
|
|
{template="buttons" params="$table->rootButtons, ''" group="global" app="core" if="isset( $headers['_buttons'] )"}
|
|
</div>
|
|
{{foreach $rows as $note}}
|
|
<article class="ipsEntry ipsEntry--simple ipsEntry--customer-note">
|
|
<header class="ipsEntry__header">
|
|
<div class="ipsEntry__header-align">
|
|
<div class="ipsPhotoPanel">
|
|
{template="userPhoto" app="core" group="global" params="\IPS\Member::load( $note['note_author'] ), 'mini'"}
|
|
<div class="ipsPhotoPanel__text">
|
|
<div class="ipsPhotoPanel__primary">{member="name" id="$note['note_author']"}</div>
|
|
<div class="ipsPhotoPanel__secondary">{datetime="$note['note_date']"}</div>
|
|
</div>
|
|
</div>
|
|
{template="controlStrip" params="$note['_buttons'], 'ipsControlStrip_showText'" group="global" app="core"}
|
|
</div>
|
|
</header>
|
|
<div class="ipsEntry__post ipsRichText">
|
|
{$note['note_text']|raw}
|
|
</div>
|
|
</article>
|
|
{{endforeach}}
|
|
{{if $table->pages > 1}}
|
|
<div class="i-padding_2">
|
|
{template="pagination" group="global" app="core" location="global" params="$table->baseUrl, $table->pages, $table->page, $table->limit"}
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="customers" template_name="notesBlock" template_data="$customer, $noteCount, $notes" template_location="admin" template_app="nexus"><![CDATA[{{if $noteCount}}
|
|
<div class='ipsBox cNotesBox' data-ips-template="notesBlock">
|
|
<h2 class='ipsBox__header'>
|
|
<span>{lang="customer_notes"} ({$noteCount})</span>
|
|
<a href='{url="app=core&module=members&controller=members&do=lazyBlock&block=IPS\\nexus\\extensions\\core\\MemberACPProfileBlocks\\Notes&id={$customer->member_id}"}' data-ipsDialog data-ipsDialog-title='{lang="customer_notes"}' class='i-margin-start_auto'>
|
|
{lang="manage_notes"}
|
|
</a>
|
|
</h2>
|
|
<div class='i-padding_3'>
|
|
{$notes|raw}
|
|
</div>
|
|
</div>
|
|
{{else}}
|
|
<div class='i-padding_3 i-color_soft cCustomerNotes_none' data-ips-template="notesBlock">
|
|
<a href='{url="app=core&module=members&controller=members&do=lazyBlock&block=IPS\\nexus\\extensions\\core\\MemberACPProfileBlocks\\Notes&id={$customer->member_id}"}' data-ipsDialog data-ipsDialog-title='{lang="customer_notes"}' class='i-float_end i-font-size_1'>
|
|
{lang="manage_notes"}
|
|
</a>
|
|
{lang="customer_notes"} ({$noteCount})
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="customers" template_name="notesOverview" template_data="$table, $headers, $rows, $quickSearch" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{if \count( $rows )}}
|
|
<ul class='cCustomerOther_list i-grid i-gap_3'>
|
|
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
|
</ul>
|
|
{{else}}
|
|
<p class='ipsEmptyMessage'>{lang="no_customer_notes"}</p>
|
|
{{endif}}]]></template>
|
|
<template template_group="customers" template_name="notesOverviewRows" template_data="$table, $headers, $rows" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{foreach $rows as $row}}
|
|
<li>
|
|
<p class='ipsTruncate ipsTruncate_line'>
|
|
{expression="\strip_tags( \IPS\Text\Parser::removeElements( $row['note_text'], array( 'blockquote' ) ), '<br>' )" raw="true"}
|
|
</p>
|
|
<span class='i-font-size_1 i-color_soft ipsTruncate ipsTruncate_line'>{datetime="$row['note_date']"}, {member="name" id="$row['note_author']"}</span>
|
|
</li>
|
|
{{endforeach}}]]></template>
|
|
<template template_group="customers" template_name="numberOfPurchasesField" template_data="$field" template_location="admin" template_app="nexus"><![CDATA[<select class="ipsInput ipsInput--select" name="{$field->name}[0]">
|
|
<option value="n" data-control="toggle" data-toggles="{$field->name}_nop" {{if $field->value[0] === 'n'}}selected{{endif}}>{lang="number_of_purchases"}</option>
|
|
<option value="v" data-control="toggle" data-toggles="{$field->name}_tas" {{if $field->value[0] === 'v'}}selected{{endif}}>{lang="total_amount_spent"}</option>
|
|
</select>
|
|
{lang="is"}
|
|
<select class="ipsInput ipsInput--select" name="{$field->name}[1]">
|
|
<option value="g" {{if $field->value[1] === 'g'}}selected{{endif}}>{lang="greater_than"}</option>
|
|
<option value="e" {{if $field->value[1] === 'e'}}selected{{endif}}>{lang="exactly"}</option>
|
|
<option value="l" {{if $field->value[1] === 'l'}}selected{{endif}}>{lang="less_than"}</option>
|
|
</select>
|
|
|
|
<input id="{$field->name}_nop" type="number" class="ipsInput ipsField_tiny" name="{$field->name}[2]" value="{$field->value[2]}">
|
|
<div id="{$field->name}_tas">
|
|
<br>
|
|
{template="money" app="nexus" group="forms" location="global" params="$field->name . '[3]', json_decode( $field->value[2], TRUE ), array( 'unlimitedLang' => NULL )"}
|
|
</div>
|
|
<br> {lang="or"}
|
|
<input type="checkbox" class="ipsInput ipsInput--toggle" name="{$field->name}[4]" id="{$field->name}_nr" data-control="unlimited" {{if !$field->value[1]}}checked{{endif}}>
|
|
<label for="{$field->name}_nr" class='ipsField_unlimited'>{lang="no_restriction"}</label>]]></template>
|
|
<template template_group="customers" template_name="parentAccounts" template_data="$parents" template_location="admin" template_app="nexus"><![CDATA[<div class='i-margin-bottom_1'>
|
|
{{foreach $parents as $parent}}
|
|
<div class='ipsPhotoPanel ipsPhotoPanel_mini i-padding_2' data-role='result'>
|
|
{template="userPhoto" app="core" group="global" params="$parent, 'mini'"}
|
|
<div class="ipsPhotoPanel__text">
|
|
<h2 class='ipsPhotoPanel__primary'>{lang="alt_contact_for"} <a href='{$parent->acpUrl()}'>{$parent->cm_name}</a></h2>
|
|
<p class='ipsPhotoPanel__secondary'>{$parent->email}</p>
|
|
</div>
|
|
</div>
|
|
{{endforeach}}
|
|
</div>]]></template>
|
|
<template template_group="customers" template_name="purchases" template_data="$customer, $tabs, $activeTabKey, $activeTabContents" template_location="admin" template_app="nexus"><![CDATA[<div class='ipsBox' data-ips-template="purchases">
|
|
<h2 class="ipsBox__header">{lang="purchases"}</h2>
|
|
<i-tabs class='ipsTabs ipsTabs--stretch' id='ipsTabs_purchases' data-ipsTabBar data-ipsTabBar-contentArea='#ipsTabs_purchases_content'>
|
|
<div role='tablist'>
|
|
{{foreach $tabs as $k => $tab}}
|
|
<a href='{$customer->acpUrl()->setQueryString( array( 'do' => 'view', 'blockKey' => 'nexus_Purchases', 'block[nexus_Purchases]' => $k ) )}' class='ipsTabs__tab' role="tab" id='ipsTabs_purchases_{$k}' aria-controls="ipsTabs_purchases_{$k}_panel" aria-selected="{{if $activeTabKey == $k}}true{{else}}false{{endif}}">
|
|
{lang="purchase_tab_{$k}"}
|
|
({$tab['count']})
|
|
</a>
|
|
{{endforeach}}
|
|
</div>
|
|
{template="tabScrollers" app="core" group="global" location="global"}
|
|
</i-tabs>
|
|
<div id='ipsTabs_purchases_content' class='ipsTabs__panels acpFormTabContent'>
|
|
<div id='ipsTabs_purchases_{$activeTabKey}_panel' class='ipsTabs__panel' role="tabpanel" aria-labelledby='ipsTabs_purchases_{$activeTabKey}'>
|
|
{$activeTabContents|raw}
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="customers" template_name="purchaseValueField" template_data="$field" template_location="admin" template_app="nexus"><![CDATA[<select class="ipsInput ipsInput--select" name="{$field->name}[0]">
|
|
<option value="g" {{if $field->value[0] === 'g'}}selected{{endif}}>{lang="greater_than"}</option>
|
|
<option value="e" {{if $field->value[0] === 'e'}}selected{{endif}}>{lang="exactly"}</option>
|
|
<option value="l" {{if $field->value[0] === 'l'}}selected{{endif}}>{lang="less_than"}</option>
|
|
</select>
|
|
<br>
|
|
{template="money" app="nexus" group="forms" location="global" params="$field->name . '[1]', json_decode( $field->value[1], TRUE ), array( 'unlimitedLang' => NULL )"}
|
|
<br> {lang="or"}
|
|
<input type="checkbox" class="ipsInput ipsInput--toggle" name="{$field->name}[2]" id="{$field->name}_nr" data-control="unlimited" {{if !$field->value[0]}}checked{{endif}}>
|
|
<label for="{$field->name}_nr" class='ipsField_unlimited'>{lang="no_restriction"}</label>]]></template>
|
|
<template template_group="customers" template_name="rowName" template_data="$row" template_location="admin" template_app="nexus"><![CDATA[<a href="{url="app=core&module=members&controller=members&do=view&tab=nexus_Main&id={$row['member_id']}"}">{{if $row['cm_first_name'] and $row['cm_last_name']}}{$row['cm_last_name']}, {$row['cm_first_name']}{{else}}{$row['name']}{{endif}}</a>]]></template>
|
|
<template template_group="customers" template_name="rowPhoto" template_data="$member" template_location="admin" template_app="nexus"><![CDATA[<a href="{url="app=core&module=members&controller=members&do=view&tab=nexus_Main&id={$member->member_id}"}" class="ipsUserPhoto ipsUserPhoto--mini"><img src='{$member->photo}'></a>]]></template>
|
|
<template template_group="customers" template_name="standing" template_data="$standing" template_location="admin" template_app="nexus"><![CDATA[<div id='elCustomerStanding' class="i-margin-block_2">
|
|
{{foreach $standing as $k => $data}}
|
|
{{$positive = false;}}
|
|
{{if ( $data['thisval'] >= $data['avgval'] && $data['type'] != 'timetopay' ) || ( $data['thisval'] <= $data['avgval'] && $data['type'] != 'timetopay' )}}
|
|
{{$positive = true;}}
|
|
{{endif}}
|
|
<div class="ipsSpanGrid__3">
|
|
<div class="cCustomerStanding_value {{if $positive}}cCustomerStanding_positive{{else}}cCustomerStanding_negative{{endif}}">
|
|
{$data['value']}
|
|
{{if $positive}}
|
|
<span class='cCustomerStanding_arrow ipsCursor_pointer' data-ipsHover data-ipsHover-width='250' data-ipsHover-content='#el{$data['type']}'>
|
|
{{if $data['type'] != 'timetopay'}}
|
|
<i class='fa-solid fa-arrow-up'></i>
|
|
{{else}}
|
|
<i class='fa-solid fa-arrow-down'></i>
|
|
{{endif}}
|
|
</span>
|
|
{{else}}
|
|
<span class='cCustomerStanding_arrow ipsCursor_pointer' data-ipsHover data-ipsHover-width='250' data-ipsHover-content='#el{$data['type']}'>
|
|
{{if $data['type'] != 'timetopay'}}
|
|
<i class='fa-solid fa-arrow-down'></i>
|
|
{{else}}
|
|
<i class='fa-solid fa-arrow-up'></i>
|
|
{{endif}}
|
|
</span>
|
|
{{endif}}
|
|
<div id='el{$data['type']}' class='ipsHide'>
|
|
<div class='i-padding_3'>
|
|
{{if $positive}}
|
|
<p class='ipsType_uppercase i-text-align_center i-font-size_1 i-color_positive'>
|
|
<strong>
|
|
{expression="abs( \intval( $data['avgpct'] - $data['thispct'] ) )"}%
|
|
|
|
{{if $data['type'] != 'timetopay'}}
|
|
{lang="above_average"}
|
|
{{else}}
|
|
{lang="below_average"}
|
|
{{endif}}
|
|
</strong>
|
|
</p>
|
|
{{else}}
|
|
<p class='ipsType_uppercase i-text-align_center i-font-size_1 i-color_negative'>
|
|
<strong>
|
|
{expression="abs( \intval( $data['avgpct'] - $data['thispct'] ) )"}%
|
|
|
|
{{if $data['type'] != 'timetopay'}}
|
|
{lang="below_average"}
|
|
{{else}}
|
|
{lang="above_average"}
|
|
{{endif}}
|
|
</strong>
|
|
</p>
|
|
{{endif}}
|
|
<hr class='ipsHr'>
|
|
|
|
<div class='i-margin-top_1 cCustomerStanding_progressIndicator'>
|
|
<p class='cCustomerStanding_values i-flex i-justify-content_space-between i-font-size_-1'>
|
|
<strong>{$data['lowest']}</strong>
|
|
<strong>{$data['highest']}</strong>
|
|
</p>
|
|
<div class='cCustomerStanding_progress'></div>
|
|
<div class='cCustomerStanding_markers'>
|
|
<span class='cCustomerStanding_markerAvg' style='left: {$data['avgpct']}%'>
|
|
<i class='fa-solid fa-caret-up'></i>
|
|
<span>{lang="avg_short"}</span>
|
|
</span>
|
|
<span class='cCustomerStanding_markerThis' style='left: {$data['thispct']}%'><i class='fa-solid fa-caret-up'></i></span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<h3 class='ipsMinorTitle ipsTruncate ipsTruncate_line'>{$k}</h3>
|
|
</div>
|
|
{{endforeach}}
|
|
</div>]]></template>
|
|
<template template_group="customers" template_name="voidFails" template_data="$fails" template_location="admin" template_app="nexus"><![CDATA[{lang="void_account_fails"}
|
|
<ul>
|
|
{{foreach $fails as $id}}
|
|
<li><a href='{url="app=nexus&module=payments&controller=transactions&do=view&id={$id}"}'>{lang="transaction_number" sprintf="$id"}</a></li>
|
|
{{endforeach}}
|
|
</ul>]]></template>
|
|
<template template_group="dashboard" template_name="pendingActions" template_data="$pendingTransactions, $pendingWithdrawals, $pendingAdvertisements" template_location="admin" template_app="nexus"><![CDATA[
|
|
<div class='ipsGrid i-basis_400'>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--pending-transactions" id='elNexusActions'>
|
|
{{if $pendingTransactions !== NULL}}
|
|
<li class="ipsData__item">
|
|
<span class='cNexusActionBadge {{if $pendingTransactions < 1}}cNexusActionBadge_off{{endif}}'>{{if $pendingTransactions > 99}}99+{{else}}{number="$pendingTransactions"}{{endif}}</span>
|
|
<div class='ipsData__main'>
|
|
<a href="{url="app=nexus&module=payments&controller=transactions&filter=tstatus_hold" base="admin"}">{lang="pending_transactions"}</a>
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{if $pendingWithdrawals !== NULL}}
|
|
<li class="ipsData__item">
|
|
<span class='cNexusActionBadge {{if $pendingWithdrawals < 1}}cNexusActionBadge_off{{endif}}'>{{if $pendingWithdrawals > 99}}99+{{else}}{number="$pendingWithdrawals"}{{endif}}</span>
|
|
<div class='ipsData__main'>
|
|
<a href="{url="app=nexus&module=payments&controller=payouts&filter=postatus_pend" base="admin"}">{lang="pending_widthdrawals"}</a>
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</i-data>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--pending-advertisements" id='elNexusActions'>
|
|
{{if $pendingAdvertisements !== NULL}}
|
|
<li class="ipsData__item">
|
|
<span class='cNexusActionBadge {{if $pendingAdvertisements < 1}}cNexusActionBadge_off{{endif}}'>{{if $pendingAdvertisements > 99}}99+{{else}}{number="$pendingAdvertisements"}{{endif}}</span>
|
|
<div class='ipsData__main'>
|
|
<a href="{url="app=core&module=promotion&controller=advertisements" base="admin"}">{lang="pending_advertisements"}</a>
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</i-data>
|
|
</div>]]></template>
|
|
<template template_group="discountforms" template_name="bulk" template_data="$field, $nodeSelect" template_location="admin" template_app="nexus"><![CDATA[
|
|
<div class='cNexusStack cNexusStack_usergroup'>
|
|
<ol>
|
|
<li data-step='{lang="discount_if"}'>
|
|
<strong class='i-font-size_1'>{lang="discount_purchasing"}</strong><br>
|
|
<input type="number" name="{$field->name}[buying]" class="ipsInput ipsField_short ipsField_stackItemNoMargin" name="{$field->name}[buying]" {{if \is_array( $field->value )}}value="{$field->value['buying']}"{{endif}}>
|
|
</li>
|
|
<li data-step='{lang="discount_of"}'>
|
|
<input type="radio" name="{$field->name}[this]" id="{$field->name}_this_this" value="1" {{if !\is_array( $field->value ) or !$field->value['package']}}checked{{endif}} > <label for="{$field->name}_this_this"> <strong class='i-font-size_1'>{lang="discount_this_product"}</strong></label><br>
|
|
<input type="radio" name="{$field->name}[this]" id="{$field->name}_this_other" value="0" data-control='toggle' data-toggles='p_bulk_discounts_nodeSelect{$field->htmlId}' {{if \is_array( $field->value ) and $field->value['package']}}checked{{endif}} > <label for="{$field->name}_this_other"> <strong class='i-font-size_1'>{lang="discount_different_product"}</strong></label><br>
|
|
<div id="p_bulk_discounts_nodeSelect{$field->htmlId}">
|
|
{$nodeSelect|raw}
|
|
</div>
|
|
</li>
|
|
<li data-step='{lang="discount_then"}'>
|
|
<strong class='i-font-size_1'>{lang="discount_price_becomes"}</strong><br>
|
|
<ul>
|
|
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
|
<li>
|
|
<input type="number" class="ipsInput ipsField_short ipsField_stackItemNoMargin" name="{$field->name}[price][{$currency}]" {{if \is_array( $field->value )}}value="{$field->value['price'][$currency]}"{{endif}} data-decimals="2" data-decpoint="{expression="\IPS\Member::loggedIn()->language()->locale['decimal_point']"}" data-thousandsseparator="{expression="\IPS\Member::loggedIn()->language()->locale['thousands_sep']"}" step="0.01"> {$currency}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
<br>
|
|
{lang="discount_price_becomes_once"}
|
|
</li>
|
|
</ol>
|
|
</div>
|
|
]]></template>
|
|
<template template_group="discountforms" template_name="loyalty" template_data="$field, $nodeSelect" template_location="admin" template_app="nexus"><![CDATA[
|
|
<div class='cNexusStack cNexusStack_usergroup'>
|
|
<ol>
|
|
<li data-step='{lang="discount_if"}'>
|
|
<strong class='i-font-size_1'>{lang="discount_after_purchasing"}</strong><br>
|
|
<input type="number" name="{$field->name}[owns]" class="ipsInput ipsField_short ipsField_stackItemNoMargin" name="{$field->name}[owns]" {{if \is_array( $field->value )}}value="{$field->value['owns']}"{{endif}}> {lang="discount_or_more"}<br>
|
|
<input type="checkbox" name="{$field->name}[active]" {{if \is_array( $field->value ) and isset( $field->value['active'] ) and $field->value['active']}}checked{{endif}}> {lang="discount_active_only"}<br>
|
|
</li>
|
|
<li data-step='{lang="discount_of"}'>
|
|
<input type="radio" name="{$field->name}[this]" id="{$field->name}_this_this" value="1" {{if !\is_array( $field->value ) or !$field->value['package']}}checked{{endif}} > <label for="{$field->name}_this_this"> <strong class='i-font-size_1'>{lang="discount_this_product"}</strong></label><br>
|
|
<input type="radio" name="{$field->name}[this]" id="{$field->name}_this_other" value="0" data-control='toggle' data-toggles='p_loyalty_discounts_nodeSelect{$field->htmlId}' {{if \is_array( $field->value ) and $field->value['package']}}checked{{endif}} > <label for="{$field->name}_this_other"> <strong class='i-font-size_1'>{lang="discount_different_product"}</strong></label><br>
|
|
<div id="p_loyalty_discounts_nodeSelect{$field->htmlId}">
|
|
{$nodeSelect|raw}
|
|
</div>
|
|
</li>
|
|
<li data-step='{lang="discount_then"}'>
|
|
<strong class='i-font-size_1'>{lang="discount_price_becomes"}</strong><br>
|
|
<ul>
|
|
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
|
<li>
|
|
<input type="number" class="ipsInput ipsField_short ipsField_stackItemNoMargin" name="{$field->name}[price][{$currency}]" {{if \is_array( $field->value )}}value="{$field->value['price'][$currency]}"{{endif}} step="0.01"> {$currency}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
<br>
|
|
{lang="discount_price_becomes_always"}
|
|
</li>
|
|
</ol>
|
|
</div>]]></template>
|
|
<template template_group="discountforms" template_name="usergroup" template_data="$field" template_location="admin" template_app="nexus"><![CDATA[
|
|
<div class='cNexusStack cNexusStack_usergroup'>
|
|
<ol>
|
|
<li data-step='{lang="discount_if"}'>
|
|
<strong class='i-font-size_1'>{lang="discount_customer_in_group"}</strong><br>
|
|
<select name="{$field->name}[group]" class='ipsInput ipsInput--select ipsInput--fullWidth'><option value="0"></option>{{foreach \IPS\Member\Group::groups() as $group}}<option value="{$group->g_id}" {{if \is_array( $field->value ) and $field->value['group'] == $group->g_id}}selected{{endif}}>{$group->name}</option>{{endforeach}}</select><br>
|
|
<input type="checkbox" name="{$field->name}[secondary]" {{if \is_array( $field->value ) and isset( $field->value['secondary'] ) and $field->value['secondary']}}checked{{endif}}> {lang="discount_check_secondary"}
|
|
</li>
|
|
<li data-step='{lang="discount_then"}'>
|
|
<strong class='i-font-size_1'>{lang="discount_price_becomes"}</strong><br>
|
|
<ul>
|
|
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
|
<li>
|
|
<input type="number" class="ipsInput ipsField_short ipsField_stackItemNoMargin" name="{$field->name}[price][{$currency}]" {{if \is_array( $field->value )}}value="{$field->value['price'][$currency]}"{{endif}} step="0.01"> {$currency}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</li>
|
|
</ol>
|
|
</div>]]></template>
|
|
<template template_group="forms" template_name="addPaymentMethodForm" template_data="$showSubmitButton, $id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar=NULL, $form=NULL" template_location="global" template_app="nexus"><![CDATA[
|
|
<div class="ipsBox ipsBox--commerceAddPaymentMethodForm">
|
|
<form accept-charset='utf-8' class="ipsFormWrap ipsFormWrap--add-payment" action="{$action}" method="post" {{if $uploadField}}enctype="multipart/form-data"{{endif}} {{foreach $attributes as $k => $v}}{$k}="{$v}"{{endforeach}} data-ipsForm>
|
|
<input type="hidden" name="{$id}_submitted" value="1">
|
|
{{foreach $hiddenValues as $k => $v}}
|
|
{{if \is_array($v)}}
|
|
{{foreach $v as $_k => $_v}}
|
|
<input type="hidden" name="{$k}[{$_k}]" value="{$_v}">
|
|
{{endforeach}}
|
|
{{else}}
|
|
<input type="hidden" name="{$k}" value="{$v}">
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{if $uploadField}}
|
|
<input type="hidden" name="MAX_FILE_SIZE" value="{$uploadField}">
|
|
<input type="hidden" name="plupload" value="{expression="md5( mt_rand() )"}">
|
|
{{endif}}
|
|
|
|
<div class="i-padding_3">
|
|
{{if $form->error}}
|
|
<div class="ipsMessage ipsMessage--error">
|
|
{$form->error}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{foreach $elements as $collection}}
|
|
<ul class='ipsForm {$class} ipsForm--add-payment'>
|
|
{{foreach $collection as $inputName => $input}}
|
|
{$input->rowHtml()|raw}
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endforeach}}
|
|
</div>
|
|
|
|
{{if $showSubmitButton}}
|
|
<div class='i-background_2 i-padding_3 i-text-align_center' id="paymentMethodSubmit">
|
|
<button type='submit' class='ipsButton ipsButton--primary'>{lang="save"}</button>
|
|
</div>
|
|
{{endif}}
|
|
</form>
|
|
</div>]]></template>
|
|
<template template_group="forms" template_name="businessAddress" template_data="$name, $value, $googleApiKey, $minimize=FALSE, $requireFullAddress=TRUE, $htmlId=NULL, $vat=FALSE" template_location="global" template_app="nexus"><![CDATA[<ul class="ipsFieldList" data-ipsAddressForm {{if $googleApiKey}}data-ipsAddressForm-googlePlaces data-ipsAddressForm-googleApiKey="{$googleApiKey}"{{endif}} data-ipsAddressForm-requireFullAddress="{{if $requireFullAddress}}true{{else}}false{{endif}}" {{if $minimize}}data-ipsAddressForm-minimize{{endif}}{{if $value->country AND !$value->city AND !$value->region AND !$value->postalCode}} data-ipsAddressForm-country="{$value->country}"{{endif}} data-controller="nexus.global.forms.businessAddressVat">
|
|
<li>
|
|
<ul class="ipsFieldList" role="radiogroup" id="elRadio_{$name}_{$htmlId}_type">
|
|
<li>
|
|
<input type="radio" name="{$name}[type]" value="consumer" data-role="addressTypeRadio" {{if !isset( $value->business )}}checked{{endif}} id="elRadio_{$name}_type_consumer_{$htmlId}" class="ipsInput ipsInput--toggle">
|
|
<div class='ipsFieldList__content'>
|
|
<label for='elRadio_{$name}_type_consumer_{$htmlId}' id='elField_{$name}_type_label'>{lang="cm_address_consumer"}</label>
|
|
</div>
|
|
</li>
|
|
<li>
|
|
<input type="radio" name="{$name}[type]" value="business" data-role="addressTypeRadio" {{if isset( $value->business )}}checked{{endif}} id="elRadio_{$name}_type_business_{$htmlId}" data-control="toggle" data-toggles="{$htmlId}_businessName" class="ipsInput ipsInput--toggle">
|
|
<div class='ipsFieldList__content'>
|
|
<label for='elRadio_{$name}_type_business_{$htmlId}' id='elField_{$name}_type_label'>{lang="cm_address_business"}</label>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<select class="ipsInput ipsInput--select" name="{$name}[country]" data-role="countrySelect" data-sort>
|
|
<option value='' {{if !$value->country OR (!$value->city AND !$value->region AND !$value->postalCode)}}selected{{endif}}>{lang="country"}</option>
|
|
{{foreach \IPS\GeoLocation::$countries as $k}}
|
|
<option value="{$k}" {{if $k == $value->country AND ( ( $value->city AND ( $value->postalCode OR $value->region ) ) OR !$minimize )}}selected{{endif}}>
|
|
{lang="country-{$k}"}
|
|
</option>
|
|
{{endforeach}}
|
|
</select>
|
|
</li>
|
|
<li id="{$htmlId}_businessName">
|
|
<input type="text" class="ipsInput ipsInput--text" name="{$name}[business]" placeholder="{lang="cm_business_name"}" value="{{if isset( $value->business )}}{$value->business}{{endif}}" data-role="business" autocomplete="organization">
|
|
</li>
|
|
{{foreach $value->addressLines as $i => $line}}
|
|
<li>
|
|
<input type="text" class="ipsInput ipsInput--text" name="{$name}[address][]" placeholder="{lang="address_line"}" value="{$line}" data-role="addressLine">
|
|
</li>
|
|
{{endforeach}}
|
|
<li>
|
|
<input type="text" class="ipsInput ipsInput--text" name="{$name}[city]" placeholder="{lang="city"}" value="{$value->city}" data-role="city" autocomplete="address-level2">
|
|
</li>
|
|
<li>
|
|
<input type="text" class="ipsInput ipsInput--text" name="{$name}[region]" placeholder="{lang="region"}" value="{$value->region}" data-role="regionText" autocomplete="address-level1">
|
|
</li>
|
|
<li>
|
|
<input type="text" class="ipsInput ipsInput--text" name="{$name}[postalCode]" placeholder="{lang="zip"}" value="{$value->postalCode}" data-role="postalCode" autocomplete="postal-code">
|
|
</li>
|
|
{{if $vat}}
|
|
<li data-role="vatField" id="{$htmlId}_vat">
|
|
<input type="text" name="{$name}[vat]" placeholder="{lang="cm_checkout_vat_number"}" value="{{if isset( $value->vat ) and $value->vat}}{$value->vat}{{endif}}" data-role="vat" class="ipsInput ipsInput--text ipsFieldRow_errorExclude">
|
|
</li>
|
|
{{endif}}
|
|
</ul>]]></template>
|
|
<template template_group="forms" template_name="combined" template_data="$name, $field1, $field2" template_location="global" template_app="nexus"><![CDATA[<input type="hidden" name="{$name}" value="">
|
|
<div class="i-flex i-flex-wrap_wrap i-gap_3">
|
|
<div>
|
|
{$field1->html()|raw}
|
|
</div>
|
|
<div>
|
|
<div id="{$name}_unit">
|
|
{$field2->html()|raw}
|
|
{{if $name === 'f_maxmind'}}
|
|
/ 100
|
|
{{elseif $name === 'f_maxmind_proxy'}}
|
|
/ 4
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="forms" template_name="creditCard" template_data="$field, $types, $number, $expMonth, $expYear, $ccv, $storedCards" template_location="global" template_app="nexus"><![CDATA[<div {{if $field->htmlId}}id="{$field->htmlId}"{{endif}} class=''>
|
|
{{if $field->options['attr']}}
|
|
<div {{foreach $field->options['attr'] as $k => $v}}{$k}="{$v}"{{endforeach}}>
|
|
{{endif}}
|
|
{{if $field->options['jsRequired']}}
|
|
<div class="ipsJS_hide" data-role="error">
|
|
<div class="ipsMessage ipsMessage--error" data-role="errorMessage">{lang="card_requires_js"}</div>
|
|
</div>
|
|
{{endif}}
|
|
<div class="ipsJS_show ipsBox i-padding_3" data-role="paymentMethodForm">
|
|
<div {{if $field->options['loading'] and !\count( $storedCards )}}class="ipsLoading i-opacity_3"{{endif}}>
|
|
{{if \count( $storedCards )}}
|
|
<div class='ipsFieldRow '>
|
|
<ul class='ipsFieldRow__content ipsFieldList'>
|
|
{{$j = 0;}}
|
|
{{foreach $storedCards as $i => $card}}
|
|
<li>
|
|
<input type='radio' name="{$field->name}[stored]" value="{$card->id}" id="{$field->name}_stored{$i}" {{if $j === 0}}checked{{endif}}>
|
|
<div class='ipsFieldList__content'>
|
|
<label for='{$field->name}_stored{$i}'><span class='i-color_soft'>xxxx</span>{$card->card->lastFour}</label>
|
|
<div class='ipsFieldRow__desc'>{{if $card->card->type}}{lang="card_type_{$card->card->type}"}{{endif}} {{if $card->card->expMonth}}{lang="card_expires_lc"} {$card->card->expMonth}/{$card->card->expYear}{{endif}}</div>
|
|
</div>
|
|
</li>
|
|
{{$j++;}}
|
|
{{endforeach}}
|
|
<li>
|
|
<input type='radio' name="{$field->name}[stored]" value="0" id="{$field->name}_stored0" data-control="toggle" data-toggles="{$field->name}_new">
|
|
<div class='ipsFieldList__content'>
|
|
<label for='{$field->name}_stored0'>{lang="use_new_card"}</label>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div id='{$field->name}_new' class="ipsHide">
|
|
<hr class='ipsHr'>
|
|
{{endif}}
|
|
{{if \count( $types )}}
|
|
<ul class='ipsList ipsList--inline i-gap_0 i-margin-bottom_3 cPayment_cardTypeList'>
|
|
{{foreach $types as $key => $lang}}
|
|
<li><span class='cPayment cPayment_{$key}'><span class='ipsInvisible'>{lang="$lang"}</span></span></li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endif}}
|
|
<div class='ipsFieldRow {{if $field->error == 'card_number_invalid'}}ipsFieldRow_error{{endif}}'>
|
|
<label class='ipsFieldRow__label' for='elInput_{$field->htmlId}-number'>
|
|
{lang="card_number"} <span class='ipsFieldRow__required'>{lang="required"}</span>
|
|
</label>
|
|
<div class='ipsFieldRow__content'>
|
|
{{if $field->options['dummy']}}
|
|
<div class="ipsInput ipsInput--text ipsInput--dummy ipsInput--primary ipsInput--stripeInput" id="elInput_{$field->htmlId}-number" data-role="dummyCard"></div>
|
|
{{else}}
|
|
<input type="text" class='ipsInput ipsInput--text ipsInput--primary' {{if $field->options['names']}}name="{$field->name}[number]"{{endif}} data-card="number" id="elInput_{$field->htmlId}-number" maxlength="16" value="{$number}" autocomplete="cc-number">
|
|
{{endif}}
|
|
<div class="ipsFieldRow__warning" data-warning="number">{{if $field->error and !\in_array( $field->error, array( 'card_expire_expired', 'ccv_invalid', 'ccv_invalid_3', 'ccv_invalid_4' ) )}}{lang="$field->error"}{{endif}}</div>
|
|
</div>
|
|
</div>
|
|
<div class='ipsSpanGrid i-margin-bottom_3'>
|
|
<div class='ipsSpanGrid__7 cNexusCard_expiry'>
|
|
<div class='ipsFieldRow {{if $field->error == 'card_expire_expired'}}ipsFieldRow_error{{endif}}'>
|
|
<label class='ipsFieldRow__label' for='elInput_{$field->htmlId}-exp_month'>
|
|
{lang="card_expire"} <span class='ipsFieldRow__required'>{lang="required"}</span>
|
|
</label>
|
|
<div class='ipsFieldRow__content'>
|
|
{{if $field->options['dummy']}}
|
|
<div class="ipsInput ipsInput--text ipsInput--dummy ipsInput--stripeInput" id="elInput_{$field->htmlId}-exp" data-role="dummyExp"></div>
|
|
{{else}}
|
|
<select class="ipsInput ipsInput--select" {{if $field->options['names']}}name="{$field->name}[exp_month]"{{endif}} data-card="exp_month" id="elInput_{$field->htmlId}-exp_month" autocomplete="cc-exp-month">
|
|
<option {{if $expMonth === NULL}}selected{{endif}} disabled>MM</option>
|
|
{{foreach range( 1, 12 ) as $m}}
|
|
<option value="{$m}" {{if $expMonth === $m}}selected{{endif}}>{expression="str_pad( $m, 2, '0', STR_PAD_LEFT )"}</option>
|
|
{{endforeach}}
|
|
</select>
|
|
<select class="ipsInput ipsInput--select" {{if $field->options['names']}}name="{$field->name}[exp_year]"{{endif}} data-card="exp_year" id="elInput_{$field->htmlId}-exp_year" autocomplete="cc-exp-year">
|
|
<option {{if $expYear === NULL}}selected{{endif}} disabled>YYYY</option>
|
|
{{foreach range( date('Y'), date('Y') + 10 ) as $y}}
|
|
<option value="{$y}" {{if $expYear === $y}}selected{{endif}}>{$y}</option>
|
|
{{endforeach}}
|
|
</select>
|
|
<br>
|
|
{{endif}}
|
|
</div>
|
|
<span class="i-color_warning" data-warning="exp">{{if $field->error == 'card_expire_expired'}}{lang="$field->error"}{{endif}}</span>
|
|
</div>
|
|
</div>
|
|
<div class='ipsSpanGrid__5'>
|
|
<div class='ipsFieldRow {{if $field->error == 'ccv_invalid' or $field->error == 'ccv_invalid_3' or $field->error == 'ccv_invalid_4'}}ipsFieldRow_error{{endif}}'>
|
|
<label class='ipsFieldRow__label' for='elInput_{$field->htmlId}-number'>
|
|
<span title="{{if array_key_exists( \IPS\nexus\CreditCard::TYPE_AMERICAN_EXPRESS, $types )}}{lang="card_ccv_desc"}{{else}}{lang="card_ccv_desc_no_amex"}{{endif}}" data-ipsTooltip>{lang="card_ccv"}</span> <span class='ipsFieldRow__required'>{lang="required"}</span>
|
|
</label>
|
|
<div class='ipsFieldRow__content'>
|
|
{{if $field->options['dummy']}}
|
|
<div class="ipsInput ipsInput--text ipsInput--dummy ipsInput--stripeInput" id="elInput_{$field->htmlId}-ccv" data-role="dummyCcv"></div>
|
|
{{else}}
|
|
<input type="text" class="ipsInput ipsInput--text" size='4' {{if $field->options['names']}}name="{$field->name}[ccv]"{{endif}} data-card="ccv" id="elInput_{$field->htmlId}-ccv" maxlength="4" value="{$ccv}" autocomplete="cc-csc">
|
|
{{endif}}
|
|
</div>
|
|
<span class="i-color_warning" data-warning="ccv">{{if $field->error == 'ccv_invalid' or $field->error == 'ccv_invalid_3' or $field->error == 'ccv_invalid_4'}}{lang="$field->error"}{{endif}}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{if $field->options['save']}}
|
|
<div class='ipsFieldRow ipsFieldRow--checkbox'>
|
|
<input type='checkbox' name="{$field->name}[save]" value="1" id='el{$field->name}Save' checked>
|
|
<div class='ipsFieldRow__content'>
|
|
<label for='el{$field->name}Save'>{lang="card_save"}</label>
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
{{if \count( $storedCards )}}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{if $field->options['attr']}}
|
|
</div>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="forms" template_name="money" template_data="$name, $value, $options" template_location="global" template_app="nexus"><![CDATA[{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
|
{{$decimals = \IPS\nexus\Money::numberOfDecimalsForCurrency( $currency );}}
|
|
<input type="number" name="{$name}[{$currency}]" size="4" value="{{if isset($value[$currency]) AND $value !== '*'}}{expression="number_format( \is_object( $value[$currency] ) ? (string) $value[$currency]->amount : $value[$currency], $decimals, '.', '' )"}{{endif}}" class="ipsInput ipsInput--text ipsField_short" step="{expression="number_format(1/pow(10,$decimals),$decimals,'.','')"}"> {$currency}
|
|
<br>
|
|
{{endforeach}}
|
|
{{if $options['unlimitedLang'] !== NULL}}
|
|
|
|
{lang="or"}
|
|
|
|
<input
|
|
type="checkbox"
|
|
role='checkbox'
|
|
data-control="unlimited {{if !empty($options['unlimitedTogglesOn']) OR !empty($options['unlimitedTogglesOff'])}}toggle{{endif}}"
|
|
name="{$name}[__unlimited]"
|
|
value="1"
|
|
{{if $value === '*'}}checked{{endif}}
|
|
id="{$name}-unlimitedCheck"
|
|
{{if !empty($options['unlimitedTogglesOn'])}} data-togglesOn="{expression="implode( ',', $options['unlimitedTogglesOn'] )"}" aria-controls="{expression="implode( ',', $options['unlimitedTogglesOn'] )"}"{{endif}}
|
|
{{if !empty($options['unlimitedTogglesOff'])}} data-togglesOff="{expression="implode( ',', $options['unlimitedTogglesOff'] )"}" aria-controls="{expression="implode( ',', $options['unlimitedTogglesOff'] )"}"{{endif}}
|
|
> <label for='{$name}-unlimitedCheck'>{lang="$options['unlimitedLang']"}</label>
|
|
<br>
|
|
{{endif}}]]></template>
|
|
<template template_group="forms" template_name="paymentRequestApi" template_data="$field, $gateway, $key, $country, $invoice, $currency, $amountAsCents, $amount" template_location="global" template_app="nexus"><![CDATA[<div data-controller="nexus.global.gateways.stripepaymentrequest" data-id="{$gateway->id}" data-key="{$key}" data-country="{$country}" data-currency="{$currency}" data-amount="{$amount}" data-amountAsCents="{$amountAsCents}" data-invoice="{$invoice->id}" id="{$field->htmlId}">
|
|
<noscript>
|
|
<div class="ipsMessage ipsMessage--error">{lang="card_requires_js"}</div>
|
|
</noscript>
|
|
<div id="paymentrequest-{$field->htmlId}">
|
|
</div>]]></template>
|
|
<template template_group="forms" template_name="renewalTerm" template_data="$name, $value, $options" template_location="global" template_app="nexus"><![CDATA[{{$term = ( $value and $value->interval ) ? $value->getTerm() : NULL;}}
|
|
{{if $options['nullLang']}}
|
|
<div class="i-margin-block_2">
|
|
<input type="checkbox" role="checkbox" name="{$name}[null]" id="{$name}_null" data-control="unlimited" {{if $value === NULL}}checked{{endif}} aria-labelledby="{$name}_null_label" class="ipsInput ipsInput--toggle">
|
|
<label for="{$name}_null" id="{$name}_null_label" class="ipsField_unlimited">{lang="$options['nullLang']"}</label>
|
|
{lang="or"}
|
|
</div>
|
|
{{endif}}
|
|
{{if !isset( $options['lockPrice'] ) or !$options['lockPrice']}}
|
|
<div class='cNexusStack cNexusStack_usergroup' id="{$name}_stack">
|
|
<ol>
|
|
<li data-step='{lang="price"}'>
|
|
{{if $options['allCurrencies']}}
|
|
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
|
<input type="number" name="{$name}[amount_{$currency}]" size="4" data-decimals="2" data-decpoint="{expression="\IPS\Member::loggedIn()->language()->locale['decimal_point']"}" data-thousandsseparator="{expression="\IPS\Member::loggedIn()->language()->locale['thousands_sep']"}" step="0.01" value="{{if $value AND isset( $value->cost[ $currency ]->amount )}}{$value->cost[ $currency ]->amount}{{endif}}" class="ipsInput ipsInput--text ipsField_short ipsField_stackItemNoMargin"> {$currency}<br>
|
|
{{endforeach}}
|
|
{{else}}
|
|
<input type="number" name="{$name}[amount]" size="4" data-decimals="2" data-decpoint="{expression="\IPS\Member::loggedIn()->language()->locale['decimal_point']"}" data-thousandsseparator="{expression="\IPS\Member::loggedIn()->language()->locale['thousands_sep']"}" step="0.01" value="{{if $value}}{$value->cost->amountAsString()}{{endif}}" class="ipsInput ipsInput--text ipsField_short ipsField_stackItemNoMargin">
|
|
{{if \count( \IPS\nexus\Money::currencies() ) === 1}}
|
|
{{if $value}}{$value->cost->currency}{{else}}{expression="\IPS\nexus\Money::currencies()[0]"}{{endif}}
|
|
{{else}}
|
|
<select class="ipsInput ipsInput--select" name="{$name}[currency]">
|
|
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
|
<option value="{$currency}" {{if $value AND $currency === $value->cost->currency}}selected{{endif}}>{$currency}</option>
|
|
{{endforeach}}
|
|
</select>
|
|
{{endif}}
|
|
{{endif}}
|
|
</li>
|
|
<li data-step="{{if $options['initialTerm']}}{lang="for"}{{else}}{lang="every"}{{endif}}" data-role="unlimitedCatch">
|
|
{{endif}}
|
|
<input type="number" name="{$name}[term]" size="4" value="{{if $term}}{$term['term']}{{else}}1{{endif}}" class="ipsInput ipsInput--text ipsField_tiny ipsField_stackItemNoMargin" {{if $options['lockTerm']}}disabled{{endif}}>
|
|
<select class="ipsInput ipsInput--select" name="{$name}[unit]" {{if $options['lockTerm']}}disabled{{endif}}>
|
|
<option value="d" {{if $term and $term['unit'] === 'd'}}selected{{endif}}>{lang="days"}</option>
|
|
<option value="m" {{if !$term or $term['unit'] === 'm'}}selected{{endif}}>{lang="months"}</option>
|
|
<option value="y" {{if $term and $term['unit'] === 'y'}}selected{{endif}}>{lang="years"}</option>
|
|
</select>
|
|
{{if $options['initialTerm']}}
|
|
{lang="or"}
|
|
<input type="checkbox"
|
|
role="checkbox"
|
|
data-control="unlimited {{if $options['unlimitedTogglesOn'] or $options['unlimitedTogglesOff']}}toggle{{endif}}"
|
|
{{if $options['unlimitedTogglesOn']}}data-togglesOn="{expression="implode( ',', $options['unlimitedTogglesOn'] )"}"{{endif}}
|
|
{{if $options['unlimitedTogglesOff']}}data-togglesOff="{expression="implode( ',', $options['unlimitedTogglesOff'] )"}"{{endif}}
|
|
name="{$name}[unlimited]" id="{$name}_unlimited"
|
|
{{if ( $value or $options['lockPrice'] ) and !$term}}checked{{endif}}
|
|
aria-labelledby="{$name}_unlimited_label"
|
|
class="ipsInput ipsInput--toggle"
|
|
>
|
|
<label for="{$name}_unlimited" id="{$name}_unlimited_label" class="ipsField_unlimited">{lang="$options['initialTermLang']"}</label>
|
|
{{endif}}
|
|
{{if !isset( $options['lockPrice'] ) or !$options['lockPrice']}}
|
|
</li>
|
|
{{if $options['addToBase']}}
|
|
<li data-step='{lang="and"}'>
|
|
<input type="checkbox" name="{$name}[add]" id="{$name}_add" {{if $value and $value->addToBase}}checked{{endif}}> {lang="add_to_purchase_price"}<br>
|
|
</li>
|
|
{{endif}}
|
|
</ol>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="forms" template_name="stateSelect" template_data="$name, $value, $unlimited=NULL" template_location="global" template_app="nexus"><![CDATA[<!-- @todo [future] Is there a better UI for this? -->
|
|
{{if $unlimited !== NULL}}
|
|
<input type="checkbox" name="{$name}_unlimited" value="1" {{if $value === '*'}}checked{{endif}}> {lang="$unlimited"} {lang="or"}<br>
|
|
{{endif}}
|
|
<select class="ipsInput ipsInput--select" name="{$name}[]" multiple size="20">
|
|
{{foreach \IPS\GeoLocation::$countries as $country}}
|
|
{{if isset( \IPS\GeoLocation::$states[ $country ] )}}
|
|
<optgroup label="{lang="country-{$country}"}">
|
|
{{foreach \IPS\GeoLocation::$states[ $country ] as $state}}
|
|
<option value="{$country}-{$state}" {{if isset( $value[ $country ] ) and ( ( $value[ $country ] == "*" ) or ( \in_array( $state, $value[ $country ] ) ) )}}selected{{endif}}>{$state}</option>
|
|
{{endforeach}}
|
|
</optgroup>
|
|
{{else}}
|
|
<option value="{$country}" {{if isset( $value[ $country ] )}}selected{{endif}}>{lang="country-{$country}"}</option>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</select>]]></template>
|
|
<template template_group="forms" template_name="usernamePassword" template_data="$name, $value" template_location="global" template_app="nexus"><![CDATA[<ul class='ipsForm'>
|
|
<li class='ipsFieldRow'>
|
|
<div class='ipsFieldList__content'>
|
|
<div class='ipsInputIcon'>
|
|
<span class="ipsInputIcon__icon fa-solid fa-user"></span>
|
|
<input type='text' class='ipsInput ipsInput--text' name="{$name}[un]" placeholder="{lang="username"}" {{if isset( $value['un'] )}}value="{$value['un']}"{{endif}}>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
<li class='ipsFieldRow'>
|
|
<div class='ipsFieldList__content'>
|
|
<div class='ipsInputIcon'>
|
|
<span class="ipsInputIcon__icon fa-solid fa-lock"></span>
|
|
<input type='password' class='ipsInput ipsInput--text' name="{$name}[pw]" placeholder="{lang="password"}" {{if isset( $value['pw'] )}}value="{$value['pw']}"{{endif}}>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
</ul>]]></template>
|
|
<template template_group="forms" template_name="usernamePasswordDisplay" template_data="$value" template_location="global" template_app="nexus"><![CDATA[{{if $value}}
|
|
<ul class="ipsList ipsList--inline">
|
|
<li><i class="fa-solid fa-user"></i> <span class="i-font-family_monospace">{$value['un']}</span></li>
|
|
<li><i class="fa-solid fa-lock"></i> <span class="i-font-family_monospace">{$value['pw']}</span></li>
|
|
</ul>
|
|
{{endif}}]]></template>
|
|
<template template_group="global" template_name="commentTableHeader" template_data="$comment, $package, $item" template_location="front" template_app="nexus"><![CDATA[
|
|
<div class='i-flex i-gap_2'>
|
|
<div class='i-flex_00 i-basis_60'>
|
|
{template="thumbImage" group="global" app="core" params="$package->image, $package->_title, 'small', '', 'view_this', $package->url()"}
|
|
</div>
|
|
<div class='i-flex_11'>
|
|
<h3 class='ipsTitle ipsTitle--h3'><a href="{$package->url()}" data-role='productLink'>{$package->_title}</a></h3>
|
|
<p class='i-color_soft i-link-color_inherit'>{lang="in"} <a href='{$item->container()->url()}'>{$item->container()->_title}</a></p>
|
|
<div class='ipsTruncate_1'>
|
|
{template="packageBlockPrice" app="nexus" group="store" params="$package->fullPriceInfo()"}
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="global" template_name="embedProduct" template_data="$item, $renewalTerm=NULL, $url=NULL, $image=NULL" template_location="front" template_app="nexus"><![CDATA[
|
|
{{$asNode = \IPS\nexus\Package::load( $item->id );}}
|
|
<div class='ipsRichEmbed ipsRichEmbed--commerce-product cNexusEmbed'>
|
|
<div class='ipsRichEmbed_header'>
|
|
<div>
|
|
<p class='i-font-weight_600 i-color_hard ipsTruncate_1'>
|
|
<a href='{$item->url()}'>{lang="a_product_in_our_store"}</a>
|
|
</p>
|
|
<p class='i-color_soft i-link-color_inherit ipsTruncate_1'>
|
|
{$item->container()->_title}
|
|
</p>
|
|
</div>
|
|
<a href='{$item->url()}' class='ipsRichEmbed_openItem'><i class='fa-solid fa-arrow-up-right-from-square'></i></a>
|
|
</div>
|
|
{{if $images = $item->images() and \count( $images )}}
|
|
{{foreach $images as $image}}
|
|
<a href='{$item->url()}' class='ipsRichEmbed_masthead' data-imageID='{$item->id}'>
|
|
<img src='{$image}' alt='{$item->mapped('title')}' loading="lazy">
|
|
</a>
|
|
{{break;}}
|
|
{{endforeach}}
|
|
{{else}}
|
|
<div class='ipsRichEmbed_masthead'></div>
|
|
{{endif}}
|
|
<div class='ipsRichEmbed__content'>
|
|
<div class='ipsRichEmbed_itemTitle ipsTruncate_1'>
|
|
<a href='{$item->url()}'>{$item->mapped('title')}</a>
|
|
{{if \IPS\IPS::classUsesTrait( $item, 'IPS\Content\Ratings' ) and $rating = $item->averageRating()}}
|
|
{template="rating" app="core" params="'large', $rating, 5" group="global"}
|
|
{{elseif isset( $item::$reviewClass ) AND $rating = $item->averageReviewRating()}}
|
|
{template="rating" app="core" params="'large', $rating, \IPS\Settings::i()->reviews_rating_out_of" group="global"}<span class='i-color_soft'>{{if $item->reviews}}({lang="from_num_reviews" pluralize="$item->reviews"}){{else}}{lang="no_reviews_yet"}{{endif}}</span>
|
|
{{endif}}
|
|
</div>
|
|
<div>
|
|
{template="packageBlockPrice" app="nexus" group="store" params="$asNode->fullPriceInfo()"}
|
|
</div>
|
|
{{if $asNode->stock === 0}}
|
|
<span class='ipsButton ipsButton--primary ipsButton--small ipsButton--wide ipsButton--disabled i-cursor_not-allowed'>{lang="out_of_stock"}</span>
|
|
{{else}}
|
|
<a href='{$asNode->url()->setQueryString( 'purchase', 1 )}' class='ipsButton ipsButton--primary ipsButton--wide ipsButton--small' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title='{lang="store_quick_view"}' data-ipsDialog-forceReload>
|
|
<i class='fa-solid fa-cart-shopping'></i> {lang="add_to_cart"}
|
|
</a>
|
|
{{endif}}
|
|
{{if $desc = $item->truncated(TRUE)}}
|
|
<div class='ipsRichEmbed__snippet'>
|
|
{$desc|raw}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="global" template_name="embedProductReview" template_data="$comment, $item, $renewalTerm, $url" template_location="front" template_app="nexus"><![CDATA[
|
|
{{$asNode = \IPS\nexus\Package::load( $item->id );}}
|
|
<div class='ipsRichEmbed ipsRichEmbed--commerce-review cNexusEmbed'>
|
|
{template="embedHeader" group="embed" app="core" params="$comment, \IPS\Member::loggedIn()->language()->addToStack( 'x_reviewed_product', FALSE, array( 'sprintf' => array( $comment->author()->name ) ) ), $comment->mapped('date'), $url"}
|
|
<div class='ipsRichEmbed__content'>
|
|
<div class='ipsRichEmbed_originalItem'>
|
|
<div>
|
|
{{if $images = $item->images() and \count( $images )}}
|
|
{{foreach $images as $image}}
|
|
<a href='{$url}' title="{$item->mapped('title')}" class='ipsRichEmbed_masthead'>
|
|
<img src='{$image}' alt="{$item->mapped('title')}" loading="lazy">
|
|
</a>
|
|
{{break;}}
|
|
{{endforeach}}
|
|
{{else}}
|
|
<div class='ipsRichEmbed_masthead'></div>
|
|
{{endif}}
|
|
<div class='i-padding_3'>
|
|
<h3 class='ipsRichEmbed_itemTitle ipsTruncate_1'>
|
|
<a href='{$url}' title="{$item->mapped('title')}">{$item->mapped('title')}</a>
|
|
</h3>
|
|
<div>
|
|
{template="packageBlockPrice" app="nexus" group="store" params="$asNode->fullPriceInfo()"}
|
|
</div>
|
|
<div class='ipsRichEmbed__snippet'>
|
|
{$item->truncated(TRUE)|raw}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{template="rating" app="core" params="'veryLarge', $comment->mapped('rating')" group="global"}
|
|
{{if $comment->mapped('votes_total')}}
|
|
<p>{$comment->helpfulLine()|raw}</p>
|
|
{{endif}}
|
|
<div class='ipsRichEmbed__snippet'>
|
|
{$comment->truncated(TRUE)|raw}
|
|
</div>
|
|
|
|
{{if settings.reputation_enabled and \IPS\IPS::classUsesTrait( $comment, 'IPS\Content\Reactable' ) and \count( $comment->reactions() )}}
|
|
<ul class='ipsList ipsList--inline i-margin-top_2'>
|
|
<li>
|
|
{template="reactionOverview" app="core" group="global" params="$comment, TRUE, 'small'"}
|
|
</li>
|
|
</ul>
|
|
{{endif}}
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="global" template_name="mobileFooterBar" template_data="" template_location="front" template_app="nexus"><![CDATA[<li data-el='cart' class="ipsMobileFooter__item" id="elCart_mobileFooterContainer" {{if !(isset( $_SESSION['cart'] ) and \count( $_SESSION['cart'] ))}}hidden{{endif}}>
|
|
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class="ipsMobileFooter__link">
|
|
<span class="ipsMobileFooter__icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="18" viewBox="0 0 576 512"><path d="M253.3 35.1c6.1-11.8 1.5-26.3-10.2-32.4s-26.3-1.5-32.4 10.2L117.6 192H32c-17.7 0-32 14.3-32 32s14.3 32 32 32L83.9 463.5C91 492 116.6 512 146 512H430c29.4 0 55-20 62.1-48.5L544 256c17.7 0 32-14.3 32-32s-14.3-32-32-32H458.4L365.3 12.9C359.2 1.2 344.7-3.4 332.9 2.7s-16.3 20.6-10.2 32.4L404.3 192H171.7L253.3 35.1zM192 304v96c0 8.8-7.2 16-16 16s-16-7.2-16-16V304c0-8.8 7.2-16 16-16s16 7.2 16 16zm96-16c8.8 0 16 7.2 16 16v96c0 8.8-7.2 16-16 16s-16-7.2-16-16V304c0-8.8 7.2-16 16-16zm128 16v96c0 8.8-7.2 16-16 16s-16-7.2-16-16V304c0-8.8 7.2-16 16-16s16 7.2 16 16z"/></svg>
|
|
</span>
|
|
<span class='ipsNotification'>
|
|
{{if isset( $_SESSION['cart'] ) and \count( $_SESSION['cart'] ) }}
|
|
{expression="\IPS\nexus\Application::cartCount()"}
|
|
{{else}}
|
|
0
|
|
{{endif}}
|
|
</span>
|
|
<span class="ipsMobileFooter__text">{lang="your_cart"}</span>
|
|
</a>
|
|
</li>]]></template>
|
|
<template template_group="global" template_name="mobileHeaderBar" template_data="" template_location="front" template_app="nexus"><![CDATA[{{if isset( $_SESSION['cart'] ) and \count( $_SESSION['cart'] ) }}
|
|
<li data-el='cart'>
|
|
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class="ipsMobileNavIcons__button">
|
|
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="18" viewBox="0 0 576 512"><path d="M253.3 35.1c6.1-11.8 1.5-26.3-10.2-32.4s-26.3-1.5-32.4 10.2L117.6 192H32c-17.7 0-32 14.3-32 32s14.3 32 32 32L83.9 463.5C91 492 116.6 512 146 512H430c29.4 0 55-20 62.1-48.5L544 256c17.7 0 32-14.3 32-32s-14.3-32-32-32H458.4L365.3 12.9C359.2 1.2 344.7-3.4 332.9 2.7s-16.3 20.6-10.2 32.4L404.3 192H171.7L253.3 35.1zM192 304v96c0 8.8-7.2 16-16 16s-16-7.2-16-16V304c0-8.8 7.2-16 16-16s16 7.2 16 16zm96-16c8.8 0 16 7.2 16 16v96c0 8.8-7.2 16-16 16s-16-7.2-16-16V304c0-8.8 7.2-16 16-16zm128 16v96c0 8.8-7.2 16-16 16s-16-7.2-16-16V304c0-8.8 7.2-16 16-16s16 7.2 16 16z"/></svg>
|
|
<span class='ipsNotification'>{expression="\IPS\nexus\Application::cartCount()"}</span>
|
|
<span class="ipsInvisible">{lang="your_cart"}</span>
|
|
</a>
|
|
</li>
|
|
{{endif}}]]></template>
|
|
<template template_group="global" template_name="referralRulesCommission" template_data="$rules" template_location="front" template_app="nexus"><![CDATA[{{if settings.nexus_com_rules AND \count( $rules )}}
|
|
<div class="ipsBox i-margin-bottom_3">
|
|
<div class="i-background_2 i-padding_3">
|
|
<strong><i class="fa-solid fa-basket-shopping"></i> {lang="referrals_title"}</strong>
|
|
</div>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--referrals">
|
|
{{foreach $rules as $rule}}
|
|
<li class='ipsData__item'>
|
|
<div class='i-flex_00'>
|
|
<span class='cReferralBadge'>{$rule->commission}%</span>
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<strong class='ipsData__title'>{$rule->description()}</strong>
|
|
{{$limit = $rule->commissionLimit();}}
|
|
{{if $rule->purchase_packages or $limit != ''}}<p class='i-color_soft'>({{endif}}
|
|
{{if $rule->purchase_packages}}
|
|
{{if $rule->purchase_package_limit}}
|
|
{lang="ref_comm_limit_yes"}
|
|
{{else}}
|
|
{lang="ref_comm_limit_no"}
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if $rule->commission_limit}}
|
|
{$rule->commissionLimit()}
|
|
{{endif}}
|
|
{{if $rule->purchase_packages or $limit != ''}})</p>{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="global" template_name="searchResultProductSnippet" template_data="$indexData, $itemData, $image, $url, $priceInfo, $condensed" template_location="front" template_app="nexus"><![CDATA[{{if $image}}
|
|
<div class='ipsStreamItem__content-thumb ipsStreamItem__content-thumb--commerce'>
|
|
{template="thumbImage" group="global" app="core" location="front" params="$image, $indexData['index_title'], 'medium', '', 'view_this', $url, 'nexus_Products', '', true"}
|
|
</div>
|
|
{{endif}}
|
|
{{if !$condensed}}
|
|
<div class='ipsStreamItem__content-content ipsStreamItem__content-content--commerce'>
|
|
<div {{if !( \IPS\Dispatcher::i()->application->directory == 'core' and \IPS\Dispatcher::i()->module and \IPS\Dispatcher::i()->module->key == 'search' )}}class='ipsRichText ipsTruncate_3'{{else}}class='ipsRichText' data-searchable data-findTerm{{endif}}>
|
|
{lang="nexus_package_{$indexData['index_item_id']}_desc"}
|
|
</div>
|
|
<div class='cNexusPrice'>
|
|
{template="packageBlockPrice" app="nexus" group="store" params="$priceInfo"}
|
|
</div>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="global" template_name="userLink" template_data="$member" template_location="admin" template_app="nexus"><![CDATA[{{if $member->member_id}}
|
|
<a href="{$member->acpUrl()}">{{if $member->cm_name}}{$member->cm_name}{{else}}{$member->name}{{endif}}</a>
|
|
{{else}}
|
|
{lang="guest"}
|
|
{{endif}}]]></template>
|
|
<template template_group="global" template_name="userNav" template_data="" template_location="front" template_app="nexus"><![CDATA[{{if isset( $_SESSION['cart'] ) and \count( $_SESSION['cart'] )}}
|
|
{{$subtotal = new \IPS\Math\Number('0');}}
|
|
<li data-el='cart' id='elCart_container'>
|
|
<button type="button" id="elCart" popovertarget="elCart_menu" class="ipsUserNav__link" data-ipsTooltip title='{lang="your_cart"}'>
|
|
<i class="fa-solid fa-basket-shopping ipsUserNav__icon"></i>
|
|
<span class='ipsNotification'>{expression="\IPS\nexus\Application::cartCount()"}</span>
|
|
<span class="ipsUserNav__text ipsInvisible">{lang="cart"}</span>
|
|
</button>
|
|
<i-dropdown popover id="elCart_menu">
|
|
<div class="iDropdown">
|
|
<div class="iDropdown__header">
|
|
<h4>{lang="your_cart"}</h4>
|
|
</div>
|
|
<div class='iDropdown__content'>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--compact ipsData--cart-dropdown" data-role='cartList' id='elCartContent'>
|
|
{{foreach $_SESSION['cart'] as $id => $item}}
|
|
<li class='ipsData__item'>
|
|
<div class='ipsData__image' aria-hidden="true">
|
|
{{if $image = $item->image()}}
|
|
<img src="{$image->url}" alt="{$item->name}" loading="lazy">
|
|
{{elseif $icon = $item::$icon}}
|
|
<i class='fa fa-solid fa-{$icon}'></i>
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>{$item->name}</div>
|
|
<p class="ipsData__meta">×{$item->quantity}</p>
|
|
</div>
|
|
<div class='cNexusPrice'>
|
|
<strong>
|
|
{{$location = NULL;}}
|
|
{{if settings.nexus_show_tax}}
|
|
{{$location = $location ?: \IPS\nexus\Customer::loggedIn()->estimatedLocation();}}
|
|
{{$linePrice = $item->grossLinePrice( $location );}}
|
|
{{else}}
|
|
{{$linePrice = $item->linePrice();}}
|
|
{{endif}}
|
|
{$linePrice}
|
|
{{$subtotal = $subtotal->add( $linePrice->amount );}}
|
|
</strong>
|
|
{{if $item->quantity > 1}}
|
|
<p class='i-font-size_-2 i-color_soft'>
|
|
{lang="each_short" sprintf="$item->price"}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
<li class='ipsData__item cNexusMenuCart_totalRow'>
|
|
<div class='ipsData__main i-font-size_2 i-text-align_end'>
|
|
<strong>{lang="subtotal"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 cNexusPrice i-font-size_2 i-text-align_end'>
|
|
<strong>{money="$subtotal"}</strong>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class='iDropdown__footer'>{lang="review_and_checkout"}</a>
|
|
</div>
|
|
</i-dropdown>
|
|
</li>
|
|
{{else}}
|
|
<li class='ipsHide' id='elCart_container'></li>
|
|
{{endif}}]]></template>
|
|
<template template_group="global" template_name="vatNumber" template_data="$number" template_location="admin" template_app="nexus"><![CDATA[{{if $details = \IPS\nexus\Tax::validateVAT( $number )}}
|
|
{{if $details['address']}}
|
|
<span title="{$details['name']}, {$details['address']}" data-ipsTooltip class="cVatNumber">{$details['countryCode']}{$details['vatNumber']}</span>
|
|
{{else}}
|
|
{$details['countryCode']}{$details['vatNumber']}
|
|
{{endif}}
|
|
{{else}}
|
|
{$number}
|
|
{{endif}}]]></template>
|
|
<template template_group="invoices" template_name="generate" template_data="$summary, $itemTypes, $url" template_location="admin" template_app="nexus"><![CDATA[<div class="i-padding_3">
|
|
<ul class="ipsButtons ipsButtons--end ipsButtons--generate-invoice i-margin-bottom_2">
|
|
<li>
|
|
<button type="button" id="el_addItem" popovertarget="el_addItem_menu" class="ipsButton ipsButton--secondary ipsButton--small"><i class="fa-solid fa-plus"></i> {lang="invoice_add_item"} <i class="fa-solid fa-caret-down"></i></button>
|
|
<i-dropdown popover id="el_addItem_menu">
|
|
<div class="iDropdown">
|
|
<ul class="iDropdown__items">
|
|
{{foreach $itemTypes as $k => $class}}
|
|
{{if method_exists( $class, 'form' )}}
|
|
<li><a href="{$url->setQueryString('add', $k )}" data-ipsDialog data-ipsDialog-title="{lang="$class::$title"}"><i class="fa-solid fa-{$class::$icon}"></i> {lang="$class::$title"}</a></li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
<li><a href="{$url->setQueryString('addRenewal', 1 )}" data-ipsDialog data-ipsDialog-title="{lang="renewal"}"><i class="fa-solid fa-rotate-right"></i> {lang="renewal"}</a></li>
|
|
</ul>
|
|
</div>
|
|
</i-dropdown>
|
|
</li>
|
|
</ul>
|
|
<table class="ipsTable ipsTable_zebra">
|
|
<thead>
|
|
<tr>
|
|
<th>{lang="invoice_item"}</th>
|
|
<th>{lang="invoice_unit_price"}</th>
|
|
<th>{lang="invoice_quantity"}</th>
|
|
<th>{lang="invoice_line_price"}</th>
|
|
<th></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{foreach $summary['items'] as $itemId => $item}}
|
|
<tr>
|
|
<td>
|
|
<span title="{lang="$item::$title"}" data-ipsTooltip><i class="fa-solid fa-{$item::$icon}"></i></span>
|
|
{{if $itemUrl = $item->acpUrl()}}
|
|
<a href="{$itemUrl}">{$item->name}</a>
|
|
{{else}}
|
|
{$item->name}
|
|
{{endif}}
|
|
{{if \count( $item->details )}}
|
|
<br>
|
|
<span class="i-color_soft">
|
|
{{foreach $item->details as $k => $v}}
|
|
{lang="nexus_pfield_{$k}"}: {expression="\IPS\nexus\Package\CustomField::load( $k )->displayValue( $v, TRUE )" raw="true"}<br>
|
|
{{endforeach}}
|
|
</span>
|
|
{{endif}}
|
|
</td>
|
|
<td>
|
|
{$item->price}
|
|
{{if isset( $item->renewalTerm ) and $item->renewalTerm}}
|
|
<br>
|
|
<span class="i-color_soft">
|
|
{lang="and_renewal" sprintf="$item->renewalTerm"}
|
|
</span>
|
|
{{endif}}
|
|
</td>
|
|
<td>{$item->quantity}</td>
|
|
<td>
|
|
{$item->linePrice()}
|
|
{{if isset( $item->renewalTerm ) and $item->renewalTerm}}
|
|
<br>
|
|
<span class="i-color_soft">
|
|
{lang="and_renewal" sprintf="$item->renewalTerm->times( $item->quantity )"}
|
|
</span>
|
|
{{endif}}
|
|
</td>
|
|
<td>
|
|
<ul class="ipsControlStrip" data-ipscontrolstrip>
|
|
<li class="ipsControlStrip_button ">
|
|
<a href="{$url->setQueryString('remove', $itemId)}" data-ipsTooltip title="{lang="delete"}" data-confirm data-confirmSubMessage="{lang="invoice_remove_item_warn"}"> <!-- @todo [Future] It would be nice if it could recalculate prices automatically rather than show that warning -->
|
|
<i class="ipsControlStrip_icon fa-solid fa-xmark-circle"></i>
|
|
<span class="ipsControlStrip_item">{lang="delete"}</span>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
{{endforeach}}
|
|
</tbody>
|
|
<tfoot>
|
|
<tr>
|
|
<td colspan="3"><strong>{lang="subtotal"}</strong></td>
|
|
<td><strong>{$summary['subtotal']}</strong></td>
|
|
<td></td>
|
|
</tr>
|
|
{{foreach $summary['tax'] as $taxId => $tax}}
|
|
<tr>
|
|
<td colspan="3">{lang="nexus_tax_{$taxId}"} ({expression="$tax['rate']*100"}%)</td>
|
|
<td>{$tax['amount']}</td>
|
|
<td></td>
|
|
</tr>
|
|
{{endforeach}}
|
|
<tr>
|
|
<td colspan="3"><strong class="i-font-size_2">{lang="total"}</strong></td>
|
|
<td><strong class="i-font-size_2">{$summary['total']}</strong></td>
|
|
<td></td>
|
|
</tr>
|
|
</tfoot>
|
|
</table>
|
|
</div>
|
|
<div class="ipsSubmitRow">
|
|
<form action="{$url}" method="post">
|
|
<input type="hidden" name="continue" value="1">
|
|
<button type="submit" class="ipsButton ipsButton--primary">{lang="save"}</button>
|
|
</form>
|
|
</div>]]></template>
|
|
<template template_group="invoices" template_name="invoiceTimeline" template_data="" template_location="admin" template_app="nexus"><![CDATA[<div class="i-padding_3">
|
|
<ul class="cNexusInvoiceExplain">
|
|
{{if settings.cm_invoice_warning}}
|
|
<li>
|
|
<p class="time">
|
|
{{if \IPS\Settings::i()->cm_invoice_warning % 24 == 0}}
|
|
{lang="invoice_timeline_warning_time" pluralize="\IPS\Settings::i()->cm_invoice_warning / 24"}
|
|
{{else}}
|
|
{lang="invoice_timeline_warning_time_h" pluralize="\IPS\Settings::i()->cm_invoice_warning"}
|
|
{{endif}}
|
|
</p>
|
|
<p class="event">{lang="invoice_timeline_credit"}</p>
|
|
</li>
|
|
{{endif}}
|
|
<li>
|
|
<p class="time">
|
|
{{if \IPS\Settings::i()->cm_invoice_generate % 24 == 0}}
|
|
{lang="invoice_timeline_generate_time" pluralize="\IPS\Settings::i()->cm_invoice_generate / 24"}
|
|
{{else}}
|
|
{lang="invoice_timeline_generate_time_h" pluralize="\IPS\Settings::i()->cm_invoice_generate"}
|
|
{{endif}}
|
|
</p>
|
|
<p class="event">{lang="invoice_timeline_generate_event"}</p>
|
|
</li>
|
|
{{if settings.cm_invoice_warning and \count( \IPS\nexus\Gateway::billingAgreementGateways() )}}
|
|
<li>
|
|
<p class="time">
|
|
{{if \IPS\Settings::i()->cm_invoice_warning % 24 == 0}}
|
|
{lang="invoice_timeline_generate_time" pluralize="\IPS\Settings::i()->cm_invoice_warning / 24"}
|
|
{{else}}
|
|
{lang="invoice_timeline_generate_time_h" pluralize="\IPS\Settings::i()->cm_invoice_warning"}
|
|
{{endif}}
|
|
</p>
|
|
<p class="event">{lang="invoice_timeline_ba_warn_event"}</p>
|
|
</li>
|
|
{{endif}}
|
|
<li>
|
|
<p class="time">{lang="invoice_timeline_grace_time"}</p>
|
|
<p class="event">{lang="invoice_timeline_grace_event"}</p>
|
|
</li>
|
|
<li>
|
|
<p class="time">{lang="invoice_timeline_expire_time"}</p>
|
|
<p class="event">{lang="invoice_timeline_expire_event"}</p>
|
|
</li>
|
|
{{if settings.cm_invoice_expireafter}}
|
|
<li>
|
|
<p class="time">{lang="invoice_timeline_invoice_exp_time" pluralize="\IPS\Settings::i()->cm_invoice_expireafter"}</p>
|
|
<p class="event">{lang="invoice_timeline_invoice_exp_event"}</p>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>]]></template>
|
|
<template template_group="invoices" template_name="link" template_data="$invoice, $number=FALSE" template_location="admin" template_app="nexus"><![CDATA[<a href="{$invoice->acpUrl()}">{{if $number}}{lang="invoice_number" sprintf="$invoice->id"}{{else}}{$invoice->title}{{endif}}</a>]]></template>
|
|
<template template_group="invoices" template_name="packageFields" template_data="$item" template_location="global" template_app="nexus"><![CDATA[{{if \count( $item->details )}}
|
|
<br><span class="i-color_soft">
|
|
{{foreach $item->details as $k => $v}}
|
|
{{if $displayValue = trim( \IPS\nexus\Package\CustomField::load( $k )->displayValue( $v, TRUE ) )}}
|
|
{lang="nexus_pfield_{$k}"}: {$displayValue|raw}<br>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</span>
|
|
{{endif}}]]></template>
|
|
<template template_group="invoices" template_name="packageSelector" template_data="" template_location="admin" template_app="nexus"><![CDATA[<div class="i-padding_3">
|
|
<noscript>
|
|
<p class="ipsMessage ipsMessage--error">{lang="invoice_enable_js"}</p>
|
|
</noscript>
|
|
<div data-controller="nexus.admin.store.productselector" data-url="{url="app=nexus&module=payments&controller=invoices&do=productTree"}" class="ipsJS_show">
|
|
<ul class='ipsTree ipsTree_node'>
|
|
{{foreach \IPS\nexus\Package\Group::roots() as $group}}
|
|
{template="packageSelectorGroup" group="invoices" params="$group"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="invoices" template_name="packageSelectorGroup" template_data="$group" template_location="admin" template_app="nexus"><![CDATA[<li>
|
|
<div class='ipsTree_row {{if $group->hasChildren()}}ipsTree_parent{{endif}}' data-role="group" data-groupId="{$group->id}">
|
|
<div class='ipsTree_rowData'>
|
|
<h4 class="ipsTree_title">{$group->_title}</h4>
|
|
</div>
|
|
</div>
|
|
<ul class='ipsTree ipsTree_node'></ul>
|
|
</li>]]></template>
|
|
<template template_group="invoices" template_name="packageSelectorProduct" template_data="$product" template_location="admin" template_app="nexus"><![CDATA[<li>
|
|
<div class='ipsTree_row' data-role="product">
|
|
<div class='ipsTree_rowData'>
|
|
<h4 class="ipsTree_title"><input name="invoice_products[{$product->id}]" type="number" class="ipsInput ipsField_tiny" value="0"> {$product->_title}</h4>
|
|
</div>
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="invoices" template_name="printInvoice" template_data="$invoice, $summary, $address" template_location="global" template_app="nexus"><![CDATA[<div class="ipsPrint">
|
|
{setting="nexus_invoice_header"}
|
|
<h1>{lang="invoice_number" sprintf="$invoice->id"}</h1>
|
|
<div class="i-flex i-flex-wrap_wrap i-gap_3 i-margin-bottom_3 i-margin-top_3">
|
|
<div class="i-flex_11">
|
|
{{if $invoice->po}}
|
|
{lang="invoice_po_number"}: {$invoice->po}<br>
|
|
<br>
|
|
{{endif}}
|
|
{{if $invoice->member->member_id}}
|
|
{$invoice->member->cm_name}
|
|
{{else}}
|
|
{$invoice->guest_data['member']['name']}
|
|
{{endif}}
|
|
<br>
|
|
{{if $address}}
|
|
{$address->toString('<br>')|raw}
|
|
{{if isset( $address->vat ) and $address->vat}}
|
|
<br><br>
|
|
{lang="cm_checkout_vat_number"}: {expression="mb_strtoupper( preg_replace( '/[^A-Z0-9]/', '', $address->vat ) )"}
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
<div>
|
|
<strong>{setting="board_name"}</strong><br>
|
|
{expression="\IPS\GeoLocation::buildFromJson( \IPS\Settings::i()->site_address )->toString('<br>')" raw="true"}<br>
|
|
<br>
|
|
{$invoice->date->localeDate()}
|
|
</div>
|
|
</div>
|
|
{{if $invoice->notes}}
|
|
<div class="i-margin-bottom_3">
|
|
{expression="nl2br( htmlspecialchars( $invoice->notes, ENT_QUOTES | ENT_DISALLOWED, 'UTF-8', FALSE ) )" raw="true"}
|
|
</div>
|
|
{{endif}}
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>{lang="invoice_item"}</th>
|
|
<th>{lang="invoice_unit_price"}</th>
|
|
<th>{lang="invoice_quantity"}</th>
|
|
<th>{lang="invoice_line_price"}</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{foreach $summary['items'] as $k => $item}}
|
|
<tr>
|
|
<td>{$item->name} {$item->detailsForDisplay( 'print' )|raw}</td>
|
|
<td>{$item->price}</td>
|
|
<td>{$item->quantity}</td>
|
|
<td>{$item->linePrice()}</td>
|
|
</tr>
|
|
{{endforeach}}
|
|
</tbody>
|
|
<tfoot>
|
|
<tr>
|
|
<td colspan="3"><strong>{lang="subtotal"}</strong></td>
|
|
<td><strong>{$summary['subtotal']}</strong></td>
|
|
</tr>
|
|
{{foreach $summary['tax'] as $taxId => $tax}}
|
|
<tr>
|
|
<td colspan="3">{lang="nexus_tax_{$taxId}"} ({expression="$tax['rate']*100"}%)</td>
|
|
<td>{$tax['amount']}</td>
|
|
</tr>
|
|
{{endforeach}}
|
|
<tr class="i-font-size_2">
|
|
<td colspan="3"><strong>{lang="total"}</strong></td>
|
|
<td><strong>{$summary['total']}</strong></td>
|
|
</tr>
|
|
</tfoot>
|
|
</table>
|
|
{setting="nexus_invoice_footer"}
|
|
</div>]]></template>
|
|
<template template_group="invoices" template_name="status" template_data="$status" template_location="admin" template_app="nexus"><![CDATA[<span class="ipsBadge {{if $status == \IPS\nexus\Invoice::STATUS_PAID}}ipsBadge--positive{{elseif $status == \IPS\nexus\Invoice::STATUS_PENDING}} {{elseif $status == \IPS\nexus\Invoice::STATUS_CANCELED}}ipsBadge--locked{{elseif $status == \IPS\nexus\Invoice::STATUS_EXPIRED}}ipsBadge--warning{{endif}}">
|
|
{lang="istatus_{$status}"}
|
|
</span>]]></template>
|
|
<template template_group="invoices" template_name="transactionsTable" template_data="$table, $headers, $rows, $quickSearch" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{if \count( $rows )}}
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--transactions-table">
|
|
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
|
</ul>
|
|
</i-data>
|
|
{{else}}
|
|
<p class='i-color_soft i-padding_3'>{lang="no_related_transactions"}</p>
|
|
{{endif}}]]></template>
|
|
<template template_group="invoices" template_name="transactionsTableRows" template_data="$table, $headers, $rows" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{foreach $rows as $row}}
|
|
<li class='ipsData__item'>
|
|
<div class='ipsData__main'>
|
|
<h3 class='ipsTitle ipsTitle--h3'><strong>{$row['t_method']}</strong> {$row['t_status']|raw}</h3><br>
|
|
<span class='cNexusPrice'>{$row['t_amount']}</span>
|
|
</div>
|
|
<div class='i-basis_120 i-text-align_end'>
|
|
{template="controlStrip" params="$row['_buttons']" group="global" app="core"}
|
|
</div>
|
|
</li>
|
|
{{endforeach}}]]></template>
|
|
<template template_group="invoices" template_name="unpaidConsequences" template_data="$invoice" template_location="admin" template_app="nexus"><![CDATA[{{if ( $consequences = $invoice->unpaidConsequences() and \count( $consequences ) )}}
|
|
<div class="i-margin-top_1 ipsMessage ipsMessage--general">
|
|
{lang="invoice_unpaid_consequences"}
|
|
<ul class="cInvoiceUnpaidConsequences">
|
|
{{foreach $consequences as $k => $v}}
|
|
{{if $k !== 'unassociate'}}
|
|
<li>
|
|
{{if \is_array( $v )}}
|
|
{{if isset( $v['message'] )}}
|
|
{$v['message']}
|
|
<span class="cInvoiceUnpaidConsequences_warning">{$v['warning']}</span>
|
|
{{else}}
|
|
{lang="invoice_unpaid_$k"}
|
|
<ul>
|
|
{{foreach $v as $k2 => $v2}}
|
|
<li>
|
|
{{if \is_array( $v2 )}}
|
|
{$v2['message']|raw}
|
|
<span class="cInvoiceUnpaidConsequences_warning">{$v2['warning']}</span>
|
|
{{else}}
|
|
{$v2|raw}
|
|
{{if $k === 'purchases' and isset( $consequences['unassociate'] ) and isset( $consequences['unassociate'][ $k2 ] ) and $childPurchases = array_filter( $consequences['unassociate'][ $k2 ], function( $c ) use( $consequences ) { return !array_key_exists( $c, $consequences['purchases'] ); }, ARRAY_FILTER_USE_KEY )}}
|
|
{lang="invoice_unpaid_unassociate"}
|
|
<ul>
|
|
{{foreach $childPurchases as $child}}
|
|
<li>{$child|raw}</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endif}}
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endif}}
|
|
{{else}}
|
|
{$v}
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="invoices" template_name="view" template_data="$invoice, $summary, $transactions" template_location="admin" template_app="nexus"><![CDATA[
|
|
<div class='ipsPhotoPanel ipsPhotoPanel_mini i-margin-block_3 ipsResponsive_showPhone'>
|
|
{template="userPhoto" group="global" app="core" location="front" params="$invoice->member, 'mini'"}
|
|
<div>
|
|
<h3 class='ipsTitle ipsTitle--h3'>
|
|
<strong>
|
|
{{if $invoice->member->member_id}}
|
|
<a class="i-link-color_inherit" href="{$invoice->member->acpUrl()}">{$invoice->member->cm_name}</a>
|
|
{{else}}
|
|
{$invoice->member->cm_name}
|
|
{{endif}}
|
|
</strong>
|
|
</h3>
|
|
{{if $invoice->member->email}}
|
|
<p class='i-font-weight_normal i-font-size_1 i-color_soft'>{$invoice->member->email}</p>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class='ipsSpanGrid'>
|
|
<div class='ipsSpanGrid__4'>
|
|
<div class='ipsBox i-padding_3 i-text-align_center i-margin-bottom_1 cInvoiceStatus'>
|
|
{{if $invoice->status == 'paid'}}
|
|
<i class='fa-solid fa-check-circle i-font-size_6'></i>
|
|
{{elseif $invoice->status == 'pend'}}
|
|
<i class='fa-regular fa-clock i-font-size_6'></i>
|
|
{{elseif $invoice->status == 'expd'}}
|
|
<i class='fa-solid fa-circle-exclamation i-font-size_6'></i>
|
|
{{elseif $invoice->status == 'canc'}}
|
|
<i class='fa-solid fa-xmark-circle i-font-size_6'></i>
|
|
{{endif}}
|
|
<br>
|
|
<p class='ipsTitle ipsTitle--h3'><strong>{lang="istatus_{$invoice->status}"}</strong></p>
|
|
<p class='i-font-size_1'>{lang="istatus_{$invoice->status}_desc"}</p>
|
|
|
|
{{if $invoice->status_extra and isset( $invoice->status_extra['type'] )}}
|
|
<p class='i-font-size_1 i-margin-top_1'>
|
|
{{if $invoice->status_extra['type'] === 'manual'}}
|
|
{lang="invoice_status_extra" sprintf="\IPS\Member::load( $invoice->status_extra['setByID'] )->name, \IPS\DateTime::ts( $invoice->status_extra['date'] )"}
|
|
{{elseif $invoice->status_extra['type'] === 'zero'}}
|
|
{lang="invoice_status_zero"}
|
|
{{endif}}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
|
|
<div class='ipsBox i-margin-bottom_1'>
|
|
<h2 class="ipsBox__header">{lang="invoice_notes"}</h2>
|
|
<div class='i-padding_3'>
|
|
<p>
|
|
{{if $invoice->notes}}
|
|
{$invoice->notes}
|
|
{{else}}
|
|
<span class='i-color_soft'>
|
|
{lang="no_invoice_notes"}
|
|
</span>
|
|
{{endif}}
|
|
</p>
|
|
|
|
<p class='i-font-size_1 i-margin-top_1'>
|
|
<a href="{$invoice->acpUrl()->setQueryString( array( 'do' => 'notes' ) )}" data-ipsDialog data-ipsDialog-title="{lang="invoice_notes"}" class='ipsButton ipsButton--inherit ipsButton--tiny'>{lang="edit"}</a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
{{if $transactions}}
|
|
<div class='i-margin-bottom_1 ipsBox'>
|
|
<h2 class="ipsBox__header">{lang="invoice_transactions"}</h2>
|
|
{$transactions|raw}
|
|
</div>
|
|
{{endif}}
|
|
|
|
</div>
|
|
<div class='ipsSpanGrid__8'>
|
|
|
|
<div class='ipsPhotoPanel ipsPhotoPanel_mini i-margin-bottom_1 ipsResponsive_hidePhone'>
|
|
{template="userPhoto" group="global" app="core" location="front" params="$invoice->member, 'mini'"}
|
|
<div>
|
|
<h3 class='ipsTitle ipsTitle--h3'>
|
|
<strong>
|
|
{{if $invoice->member->member_id}}
|
|
<a class="i-link-color_inherit" href="{$invoice->member->acpUrl()}">{$invoice->member->cm_name}</a>
|
|
{{else}}
|
|
{$invoice->member->cm_name}
|
|
{{endif}}
|
|
</strong>
|
|
</h3>
|
|
{{if $invoice->member->email}}
|
|
<p class='i-font-weight_normal i-font-size_1 i-color_soft'>{$invoice->member->email}</p>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class='ipsBox'>
|
|
<h2 class='ipsBox__header'>{lang="invoice"}</h2>
|
|
<div class='i-padding_3'>
|
|
<div class='ipsSpanGrid i-margin-bottom_1'>
|
|
<div class='ipsSpanGrid__7'>
|
|
{{if $invoice->billaddress}}
|
|
<h3 class="i-font-weight_600 i-color_hard i-font-size_3">{lang="invoice_billedto"}</h3>
|
|
<p>
|
|
{$invoice->billaddress->toString('<br>')|raw}
|
|
</p>
|
|
{{if isset( $invoice->billaddress->vat ) and $invoice->billaddress->vat}}
|
|
<p class='i-margin-top_1'>
|
|
{lang="cm_checkout_vat_number"}: {template="vatNumber" group="global" params="$invoice->billaddress->vat"}
|
|
</p>
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsSpanGrid__5'>
|
|
<h3 class="i-font-weight_600 i-color_hard i-font-size_3">{lang="invoice_date"}</h3>
|
|
<p class='i-margin-bottom_1'>
|
|
{$invoice->date}
|
|
</p>
|
|
|
|
<h3 class="i-font-weight_600 i-color_hard i-font-size_3">{lang="invoice_paiddate"}</h3>
|
|
<p class='i-margin-bottom_1'>
|
|
{$invoice->paid}
|
|
</p>
|
|
|
|
<h3 class="i-font-weight_600 i-color_hard i-font-size_3">{lang="invoice_po_number"}</h3>
|
|
<p class='i-margin-bottom_1'>
|
|
{{if $invoice->po}}
|
|
{$invoice->po}
|
|
{{else}}
|
|
<span class='i-color_soft'>{lang="none"}</span>
|
|
{{endif}}
|
|
|
|
<a href="{$invoice->acpUrl()->setQueryString( array( 'do' => 'poNumber' ) )}" data-ipsDialog class='i-font-size_-1'>({lang="edit"})</a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class='i-background_1'>
|
|
<table class="ipsTable ipsTable_zebra">
|
|
<thead>
|
|
<tr>
|
|
<th>{lang="invoice_item"}</th>
|
|
<th>{lang="invoice_unit_price"}</th>
|
|
<th>{lang="invoice_quantity"}</th>
|
|
<th>{lang="invoice_line_price"}</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{foreach $summary['items'] as $k => $item}}
|
|
<tr>
|
|
<td class="ipsTable_wrap">
|
|
<span title="{lang="$item->_title"}" data-ipsTooltip><i class="fa-solid fa-{$item->_icon}"></i></span>
|
|
{{if $url = $item->acpUrl()}}
|
|
<a href="{$url}">{$item->name}</a>
|
|
{{else}}
|
|
{$item->name}
|
|
{{endif}}
|
|
{{if \count( $item->details )}}
|
|
<span class="i-color_soft">
|
|
{{foreach $item->details as $k => $v}}
|
|
{{if $displayValue = trim( \IPS\nexus\Package\CustomField::load( $k )->displayValue( $v, TRUE ) )}}
|
|
{lang="nexus_pfield_{$k}"}: {$displayValue|raw}<br>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</span>
|
|
{{endif}}
|
|
</td>
|
|
<td>{$item->price}</td>
|
|
<td>{$item->quantity}</td>
|
|
<td>
|
|
{{if $item->payTo}}
|
|
<a href="#" data-ipsDialog data-ipsDialog-content="#el_item{$k}_commission" data-ipsDialog-title="{$item->name}{{if $item->quantity > 1}} x{$item->quantity}{{endif}}">
|
|
{$item->linePrice()}
|
|
</a>
|
|
<div id="el_item{$k}_commission" class="ipsHide">
|
|
{{$recipientAmounts = $item->recipientAmounts();}}
|
|
<table class="ipsTable ipsTable_zebra">
|
|
<thead>
|
|
<tr>
|
|
<th></th>
|
|
<th>{lang="invoice_unit_price"}</th>
|
|
<th>{lang="invoice_line_price"}</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td></td>
|
|
<td>{$item->price}</td>
|
|
<td>{$item->linePrice()}</td>
|
|
</tr>
|
|
{{if $item->commission and $item->fee}}
|
|
<tr>
|
|
<td>{lang="invoice_site_commission" sprintf="$item->commission"}</td>
|
|
<td>{$recipientAmounts['site_commission_unit']}</td>
|
|
<td>{$recipientAmounts['site_commission_line']}</td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">{lang="invoice_site_fee"}</td>
|
|
<td>{$item->fee}</td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2"><strong>{lang="invoice_site_total"}</strong></td>
|
|
<td><strong class="">{$recipientAmounts['site_total']}</strong></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2"><strong>{lang="invoice_amount_recipient" sprintf="$item->payTo->name"}</strong></td>
|
|
<td><strong class="">{$recipientAmounts['recipient_final']}</strong></td>
|
|
</tr>
|
|
{{elseif $item->commission}}
|
|
<tr>
|
|
<td>{lang="invoice_site_commission" sprintf="$item->commission"}</td>
|
|
<td>{$recipientAmounts['site_commission_unit']}</td>
|
|
<td>{$recipientAmounts['site_commission_line']}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>{lang="invoice_amount_recipient" sprintf="$item->payTo->name"}</td>
|
|
<td>{$recipientAmounts['recipient_unit']}</td>
|
|
<td>{$recipientAmounts['recipient_line']}</td>
|
|
</tr>
|
|
{{elseif $item->fee}}
|
|
<tr>
|
|
<td colspan="2">{lang="invoice_site_fee"}</td>
|
|
<td>{$item->fee}</td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">{lang="invoice_amount_recipient" sprintf="$item->payTo->name"}</td>
|
|
<td>{$recipientAmounts['recipient_final']}</td>
|
|
</tr>
|
|
{{endif}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{{else}}
|
|
{$item->linePrice()}
|
|
{{endif}}
|
|
</td>
|
|
</tr>
|
|
{{endforeach}}
|
|
</tbody>
|
|
<tfoot>
|
|
<tr class='cInvoice_subtotal'>
|
|
<td colspan="3"><strong>{lang="subtotal"}</strong></td>
|
|
<td><strong>{$summary['subtotal']}</strong></td>
|
|
</tr>
|
|
{{foreach $summary['tax'] as $taxId => $tax}}
|
|
<tr>
|
|
<td colspan="3">
|
|
{lang="nexus_tax_{$taxId}"}
|
|
{{if $tax['type'] !== 'single'}}
|
|
{{if $tax['type'] === 'eu' and $invoice->billaddress->business and $invoice->billaddress->vat}}
|
|
({lang="tax_rate_eu"}: {expression="$tax['rate']*100"}%)
|
|
{{elseif $invoice->billaddress->business}}
|
|
({lang="tax_rate_business"}: {expression="$tax['rate']*100"}%)
|
|
{{else}}
|
|
({lang="tax_rate_consumer"}: {expression="$tax['rate']*100"}%)
|
|
{{endif}}
|
|
{{else}}
|
|
({expression="$tax['rate']*100"}%)
|
|
{{endif}}
|
|
</td>
|
|
<td>{$tax['amount']}</td>
|
|
</tr>
|
|
{{endforeach}}
|
|
<tr class='cInvoice_subtotal'>
|
|
<td colspan="3"><strong class="i-font-size_2">{lang="total"}</strong></td>
|
|
<td><strong class="i-font-size_2">{$summary['total']}</strong></td>
|
|
</tr>
|
|
{{$recipients = $invoice->payToRecipients();}}
|
|
{{$commission = $invoice->commission( $invoice->total->amount->subtract( \IPS\Math\Number::sum( $recipients ) ) );}}
|
|
{{if $recipients or ( $commission AND settings.ref_on )}}
|
|
{{$totalForSite = $summary['total']->amount->subtract( \IPS\Math\Number::sum( $recipients ) );}}
|
|
{{foreach $recipients as $recipient => $amount}}
|
|
{{$customer = \IPS\nexus\Customer::load( $recipient );}}
|
|
<tr>
|
|
<td colspan="3">
|
|
<div class='ipsPhotoPanel ipsPhotoPanel--tiny'>
|
|
<a href="{$customer->acpUrl()}"><img src='{$customer->photo}' class='ipsUserPhoto ipsUserPhoto--tiny' loading="lazy" alt=""></a>
|
|
<div>
|
|
<a href="{$customer->acpUrl()}" class="i-link-color_inherit"><strong>{lang="invoice_amount_recipient" sprintf="\IPS\Member::load( $recipient )->name"}</strong></a>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
<td><strong>{money="$amount" currency="$invoice->currency"}</strong></td>
|
|
</tr>
|
|
{{endforeach}}
|
|
|
|
{{if isset( $commission ) and $commission['rule']}}
|
|
{{$totalForSite = $totalForSite->subtract( $commission['amount']->amount );}}
|
|
<tr>
|
|
<td colspan="3">
|
|
<div class='ipsPhotoPanel ipsPhotoPanel--tiny'>
|
|
<a href="{$commission['referrer']->acpUrl()}"><img src='{$commission['referrer']->photo}' class='ipsUserPhoto ipsUserPhoto--tiny' loading='lazy' alt=''></a>
|
|
<div>
|
|
<a href="{$commission['referrer']->acpUrl()}"><strong>{lang="invoice_amount_commission" sprintf="$commission['referrer']->name"}</strong></a>
|
|
<br>{$commission['rule']->_title}
|
|
</div>
|
|
</div>
|
|
</td>
|
|
<td><strong>{$commission['amount']}</strong></td>
|
|
</tr>
|
|
{{endif}}
|
|
<tr class='cInvoice_subtotal'>
|
|
<td colspan="3"><strong class="">{lang="invoice_site_total"}</strong></td>
|
|
<td><strong class="">{money="$totalForSite" currency="$invoice->currency"}</strong></td>
|
|
</tr>
|
|
{{endif}}
|
|
</tfoot>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="livesearch" template_name="customer" template_data="$member" template_location="admin" template_app="nexus"><![CDATA[<li class='ipsPhotoPanel ipsPhotoPanel_mini i-padding_2' data-role='result'>
|
|
<a href="{$member->acpUrl()}" class="ipsUserPhoto ipsUserPhoto--mini" target="_blank" rel='noopener'>
|
|
<img src='{$member->photo}' alt="" loading="lazy">
|
|
</a>
|
|
<div class="ipsPhotoPanel__text">
|
|
<h2 class='ipsPhotoPanel__primary'><a href='{$member->acpUrl()}'>{$member->cm_name}</a></h2>
|
|
<p class='ipsPhotoPanel__secondary'>{$member->email}</p>
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="livesearch" template_name="invoice" template_data="$invoice" template_location="admin" template_app="nexus"><![CDATA[<li class='ipsPhotoPanel ipsPhotoPanel_mini i-padding_2' data-role='result'>
|
|
<div class="ipsPhotoPanel__text">
|
|
<h2 class='ipsPhotoPanel__primary'>
|
|
<a href='{$invoice->acpUrl()}'>{$invoice->title}</a>
|
|
{template="status" group="invoices" app="nexus" params="$invoice->status"}
|
|
</h2>
|
|
<p class='ipsPhotoPanel__secondary'>{lang="invoice_number" sprintf="$invoice->id"} · {$invoice->total} · {$invoice->member->cm_name}</p>
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="livesearch" template_name="licensekey" template_data="$lkey" template_location="admin" template_app="nexus"><![CDATA[<li class='ipsPhotoPanel ipsPhotoPanel_mini i-padding_2' data-role='result'>
|
|
<div class="ipsPhotoPanel__text">
|
|
<h2 class='ipsPhotoPanel__primary'><a href='{$lkey->purchase->acpUrl()}'>{$lkey->key}</a></h2>
|
|
<p class='ipsPhotoPanel__secondary'>{$lkey->purchase->name} · {lang="purchase_number" sprintf="$lkey->purchase->id"} · {$lkey->purchase->member->cm_name}</p>
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="livesearch" template_name="purchase" template_data="$purchase" template_location="admin" template_app="nexus"><![CDATA[<li class='ipsPhotoPanel ipsPhotoPanel_mini i-padding_2' data-role='result'>
|
|
<div class="ipsPhotoPanel__text">
|
|
<h2 class='ipsPhotoPanel__primary'>
|
|
<a href='{$purchase->acpUrl()}'>{$purchase->name}</a>
|
|
|
|
{{if $purchase->cancelled}}
|
|
<span class="ipsBadge ipsBadge--style5">{lang="purchase_canceled"}</span>
|
|
{{elseif !$purchase->active}}
|
|
<span class="ipsBadge ipsBadge--style6">{lang="purchase_expired"}</span>
|
|
{{endif}}
|
|
</h2>
|
|
<p class='ipsPhotoPanel__secondary'>{lang="purchase_number" sprintf="$purchase->id"} · {$purchase->member->cm_name}</p>
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="livesearch" template_name="transaction" template_data="$transaction" template_location="admin" template_app="nexus"><![CDATA[<li class='ipsPhotoPanel ipsPhotoPanel_mini i-padding_2' data-role='result'>
|
|
<div class="ipsPhotoPanel__text">
|
|
<h2 class='ipsPhotoPanel__primary'>
|
|
<a href='{$transaction->acpUrl()}'>{lang="transaction_number" sprintf="$transaction->id"}</a>
|
|
|
|
{template="status" group="transactions" app="nexus" params="$transaction->status"}
|
|
</h2>
|
|
<p class='ipsPhotoPanel__secondary'>{$transaction->amount} · {{if $transaction->method}}{$transaction->method->_title}{{else}}{lang="account_credit"}{{endif}} · {$transaction->member->cm_name}</p>
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="notifications" template_name="baCancellationError" template_data="$agreements" template_location="admin" template_app="nexus"><![CDATA[<div class="ipsRichText">
|
|
<p>{lang="acp_notification_nexus_bacancelerror_desc"}</p>
|
|
<ul>
|
|
{{foreach $agreements as $agreement}}
|
|
<li>{$agreement}</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>]]></template>
|
|
<template template_group="notifications" template_name="maxmind" template_data="" template_location="admin" template_app="nexus"><![CDATA[<div class="ipsRichText">
|
|
{lang="acp_notification_nexus_maxmind_body"}
|
|
</div>
|
|
<ul class='ipsList ipsList--inline i-margin-top_1'>
|
|
<li>
|
|
<a href='{url="app=core&module=applications&controller=enhancements&do=edit&id=nexus_MaxMind" base="admin"}' class='ipsButton ipsButton--small ipsButton--inherit'>{lang="help_me_fix_this"}</a>
|
|
</li>
|
|
</ul>]]></template>
|
|
<template template_group="notifications" template_name="paymentMethodError" template_data="$method" template_location="admin" template_app="nexus"><![CDATA[<div class="ipsRichText">
|
|
<p>{lang="acp_notification_nexus_config_error_paymethod_desc" sprintf="$method->_title"}</p>
|
|
</div>
|
|
<div class="i-margin-top_3">
|
|
<a href='{url="app=nexus&module=payments&controller=paymentsettings&tab=gateways&do=form&id={$method->_id}"}' class="ipsButton ipsButton--primary ipsButton--tiny">{lang="help_me_fix_this"}</a>
|
|
</div>]]></template>
|
|
<template template_group="notifications" template_name="payoutSettingsError" template_data="$gatewayName" template_location="admin" template_app="nexus"><![CDATA[<div class="ipsRichText">
|
|
<p>{lang="acp_notification_nexus_config_error_payoutmethod_desc" sprintf="$gatewayName"}</p>
|
|
</div>
|
|
<div class="i-margin-top_3">
|
|
<a href='{url="app=nexus&module=payments&controller=payouts&do=settings"}' class="ipsButton ipsButton--primary ipsButton--tiny">{lang="help_me_fix_this"}</a>
|
|
</div>]]></template>
|
|
<template template_group="notifications" template_name="transactions" template_data="$transactions" template_location="admin" template_app="nexus"><![CDATA[
|
|
<div class="ipsSpanGrid" data-controller="nexus.admin.notifications.pendingTransactions">
|
|
{{foreach $transactions as $transaction}}
|
|
<div class="ipsSpanGrid__3 ipsBox i-margin-bottom_1">
|
|
<h3 class="ipsBox__header">
|
|
<a href="{$transaction->acpUrl()}">{$transaction->invoice->title} <span class="i-font-size_-1">#{$transaction->id}</span></a>
|
|
</h3>
|
|
<div class="i-padding_2">
|
|
<div class='ipsSpanGrid i-padding_2'>
|
|
<div class="ipsSpanGrid__3 i-text-align_center">
|
|
<span class='i-font-size_2'>{$transaction->amount}</span>
|
|
</div>
|
|
<div class="ipsSpanGrid__7">
|
|
{{if $transaction->method}}
|
|
{{if \in_array( $transaction->status, array( \IPS\nexus\Transaction::STATUS_PENDING, \IPS\nexus\Transaction::STATUS_WAITING ) )}}
|
|
{lang="transaction_method_pending" sprintf="$transaction->method->_title"}
|
|
{{else}}
|
|
{lang="transaction_method" sprintf="$transaction->method->_title"}
|
|
{{endif}}
|
|
{{else}}
|
|
{lang="payment_received"}
|
|
{{endif}}
|
|
<br>
|
|
<span class='i-font-size_-1'>
|
|
{$transaction->date}
|
|
{{if $transaction->gw_id}}
|
|
<br>
|
|
{lang="payment_reference"}: {{if $transaction->method and $url = $transaction->method->gatewayUrl( $transaction )}}<a href="{$url}" target="_blank" rel="noreferrer">{$transaction->gw_id}</a>{{else}}{$transaction->gw_id}{{endif}}<br>
|
|
{{endif}}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<hr class="ipsHr ipsHr_small">
|
|
<div class='ipsSpanGrid i-padding_2'>
|
|
<div class="ipsSpanGrid__3 i-text-align_center">
|
|
<a href="{$transaction->member->acpUrl()}"><img src='{$transaction->member->photo}' class='ipsUserPhoto ipsUserPhoto--tiny'></a>
|
|
</div>
|
|
<div class="ipsSpanGrid__7">
|
|
<a class="i-link-color_inherit" href="{$transaction->member->acpUrl()}">{$transaction->member->cm_name}</a><br>
|
|
<span class='i-font-size_-1'>
|
|
{$transaction->member->email}<br>
|
|
{lang="transaction_customer_since" sprintf="$transaction->member->joined->localeDate()"}<br>
|
|
{lang="transaction_spent" sprintf="$transaction->member->totalSpent()"}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
{{if $transaction->fraud or $transaction->fraud_blocked}}
|
|
<hr class="ipsHr ipsHr_small">
|
|
<div class="i-text-align_center">
|
|
{{if $transaction->fraud}}
|
|
<div class="{{if ( $transaction->fraud->riskScore !== NULL and $transaction->fraud->riskScore > 80 ) or ( $transaction->fraud->riskScore === NULL and $transaction->fraud->score > 8 )}}i-color_warning{{endif}} i-margin-block_1">
|
|
{{if $transaction->fraud->riskScore !== NULL}}
|
|
{$transaction->fraud->riskScore}%
|
|
{{else}}
|
|
{expression="round( $transaction->fraud->score * 10 )"}%
|
|
{{endif}}
|
|
{lang="possibility_of_fraud"}
|
|
</div>
|
|
{{endif}}
|
|
{{if $transaction->fraud_blocked}}
|
|
{$transaction->fraud_blocked->name}
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
{{if $buttons = array_filter( $transaction->buttons('n'), function( $k ) { return \in_array( $k, array( 'approve', 'review', 'void', 'refund' ) ); }, ARRAY_FILTER_USE_KEY )}}
|
|
<hr class="ipsHr ipsHr_small">
|
|
<div class="i-text-align_center i-margin-top_1">
|
|
<ul class='ipsButton_split' data-role="buttons">
|
|
{{foreach $buttons as $k => $button}}
|
|
<li><a {{if !isset( $button['data']['ipsDialog'] )}}data-action="quickAction"{{else}}{{foreach $button['data'] as $_k => $v}}data-{$_k}="{$v}"{{endforeach}}{{endif}} title="{lang="$button['title']"}" data-ipsTooltip class="ipsButton ipsButton--small {{if $k === 'approve'}}ipsButton--positive{{elseif $k === 'review'}}ipsButton--primary{{else}}ipsButton--negative{{endif}}" href="{$button['link']->setQueryString( 'queueStatus', $transaction->status )}"><i class="fa-solid fa-{$button['icon']}"></i></a></li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{endforeach}}
|
|
</div>]]></template>
|
|
<template template_group="payouts" template_name="link" template_data="$payout" template_location="admin" template_app="nexus"><![CDATA[<a href="{$payout->acpUrl()}">{$payout->amount}</a>]]></template>
|
|
<template template_group="payouts" template_name="Manual" template_data="$payout" template_location="admin" template_app="nexus"><![CDATA[<pre>{$payout->data}</pre>]]></template>
|
|
<template template_group="payouts" template_name="maximumLimits" template_data="$amount, $periodValue, $periodType" template_location="admin" template_app="nexus"><![CDATA[{$amount|raw}
|
|
{lang="every"}
|
|
<input name="nexus_payout_maximum[0]" size="5" class="ipsInput ipsField_short ipsField_tiny" min="1" step="any" type="number" value='{$periodValue}'>
|
|
<select class="ipsInput ipsInput--select" name='nexus_payout_maximum[1]'>
|
|
<option value='day'{{if $periodType == 'day'}} selected{{endif}}>{lang="days"}</option>
|
|
<option value='week'{{if $periodType == 'week'}} selected{{endif}}>{lang="weeks"}</option>
|
|
<option value='month'{{if $periodType == 'month'}} selected{{endif}}>{lang="months"}</option>
|
|
</select>
|
|
]]></template>
|
|
<template template_group="payouts" template_name="PayPal" template_data="$payout" template_location="admin" template_app="nexus"><![CDATA[<div class="i-text-align_center">
|
|
<span class="i-font-size_2">{$payout->data}</span>
|
|
</div>
|
|
<br>]]></template>
|
|
<template template_group="payouts" template_name="status" template_data="$status" template_location="admin" template_app="nexus"><![CDATA[<span class="ipsBadge ipsBadge--style{{if $status == \IPS\nexus\Payout::STATUS_COMPLETE}}4{{elseif $status == \IPS\nexus\Payout::STATUS_PENDING}}1{{elseif $status == \IPS\nexus\Payout::STATUS_CANCELED}}5{{elseif $status == \IPS\nexus\Payout::STATUS_PROCESSING}}7{{endif}}">
|
|
{lang="postatus_{$status}"}
|
|
</span>]]></template>
|
|
<template template_group="payouts" template_name="Stripe" template_data="$payout" template_location="admin" template_app="nexus"></template>
|
|
<template template_group="payouts" template_name="view" template_data="$payout" template_location="admin" template_app="nexus"><![CDATA[<div class="ipsSpanGrid" data-ips-template="view">
|
|
<div class="ipsSpanGrid__7 i-background_3">
|
|
<h2 class="ipsBox__header">{lang="payout_status"}</h2>
|
|
<div class="i-padding_3">
|
|
<div class="i-background_2 i-padding_3 i-text-align_center">
|
|
<p>{$payout->date}</p>
|
|
<p>
|
|
<span class="i-font-size_6">{$payout->amount}</span><br>
|
|
{lang="payout_method" sprintf="$payout->gateway"}
|
|
</p>
|
|
<p class="i-color_soft"><a class="i-link-color_inherit" href="{url="app=core&module=members&controller=ip&ip={$payout->ip}"}">{lang="transaction_ip" sprintf="$payout->ip"}</a></p>
|
|
</div>
|
|
<div class="i-text-align_center i-font-size_6">
|
|
<i class="fa-solid fa-arrow-down"></i>
|
|
</div>
|
|
{{if $payout->status === $payout::STATUS_CANCELED}}
|
|
<div class="i-background_2 i-padding_3 i-text-align_center">
|
|
<p>
|
|
{$payout->completed}
|
|
{{if $payout->processed_by}}
|
|
{lang="by"} {$payout->processed_by->name}
|
|
{{endif}}
|
|
</p>
|
|
<p>
|
|
<span class="i-font-size_6"><i class="fa-solid fa-xmark"></i></span><br>
|
|
<span class="i-font-size_2">{lang="payout_canceled"}</span>
|
|
</p>
|
|
</div>
|
|
{{elseif $payout->status === $payout::STATUS_COMPLETE}}
|
|
<div class="i-background_2 i-padding_3 i-text-align_center">
|
|
<p>
|
|
{$payout->completed}
|
|
{{if $payout->processed_by}}
|
|
{lang="by"} {$payout->processed_by->name}
|
|
{{endif}}
|
|
</p>
|
|
<p>
|
|
<span class="i-font-size_6"><i class="fa-solid fa-check-circle"></i></span><br>
|
|
<span class="i-font-size_2">{lang="payout_processed"}</span>
|
|
</p>
|
|
{{if $payout->gw_id}}
|
|
<p>{$payout->gw_id}</p>
|
|
{{endif}}
|
|
</div>
|
|
{{elseif $payout->status === $payout::STATUS_PROCESSING}}
|
|
<div class="i-background_2 i-padding_3 i-text-align_center">
|
|
<p>
|
|
{{if $payout->processed_by}}
|
|
{lang="by"} {$payout->processed_by->name}
|
|
{{endif}}
|
|
</p>
|
|
<p>
|
|
<span class="i-font-size_6"><i class="fa-solid fa-circle-o-notch fa-spin"></i></span><br>
|
|
<span class="i-font-size_2">{lang="payout_processing"}</span>
|
|
</p>
|
|
{{if $payout->gw_id}}
|
|
<p>{$payout->gw_id}</p>
|
|
{{endif}}
|
|
</div>
|
|
{{else}}
|
|
<div class="i-background_2 i-padding_3 i-text-align_center">
|
|
<p>
|
|
<span class="i-font-size_6"><i class="fa-solid fa-pause"></i></span><br>
|
|
<span class="i-font-size_2">{lang="payout_pending"}</span>
|
|
</p>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
<div class="ipsSpanGrid__5">
|
|
<div class="i-background_2">
|
|
<h2 class="ipsBox__header"><a href="{$payout->member->acpUrl()}">{lang="po_member"}</a></h2>
|
|
<div class='i-padding_2 ipsPhotoPanel ipsPhotoPanel_large'>
|
|
<a href="{$payout->member->acpUrl()}"><img src='{$payout->member->photo}' class='ipsUserPhoto ipsUserPhoto--medium' loading="lazy" alt=""></a>
|
|
<div>
|
|
<span class="i-font-size_2"><a class="i-link-color_inherit" href="{$payout->member->acpUrl()}">{$payout->member->cm_name}</a></span><br>
|
|
{$payout->member->email}<br>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<br><br>
|
|
{{if $extra = $payout->acpHtml()}}
|
|
<div class="i-background_2">
|
|
<h2 class="ipsBox__header">{lang="payout__data_{$payout->gateway}"}</h2>
|
|
<div class='i-padding_3'>
|
|
{$extra|raw}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="purchases" template_name="advertisement" template_data="$purchase, $advertisement" template_location="admin" template_app="nexus"><![CDATA[<div class="ipsSpanGrid i-padding_2 i-text-align_center i-margin-bottom_1">
|
|
<div class="ipsSpanGrid__6">
|
|
<span class="i-font-size_6">{$advertisement->impressions}{{if $advertisement->maximum_unit == 'i' and $advertisement->maximum_value != -1}} / {$advertisement->maximum_value}{{endif}}</span>
|
|
<br>
|
|
{lang="impressions"}
|
|
</div>
|
|
<div class="ipsSpanGrid__6">
|
|
<span class="i-font-size_6">{$advertisement->clicks}{{if $advertisement->maximum_unit == 'c' and $advertisement->maximum_value != -1}} / {$advertisement->maximum_value}{{endif}}</span>
|
|
<br>
|
|
{lang="clicks"}
|
|
</div>
|
|
</div>
|
|
<div class="ips{expression="\IPS\IPS::mb_ucfirst(\IPS\SUITE_UNIQUE_KEY)"}">
|
|
{{$images = array_filter( json_decode( $advertisement->images, TRUE ) );}}
|
|
{{$link = \IPS\Http\Url::external( $advertisement->link );}}
|
|
|
|
{{if \count( $images ) > 1}}
|
|
<i-tabs class='ipsTabs acpFormTabBar' id='ipsTabs_adView' data-ipsTabBar data-ipsTabBar-contentArea='#ipsTabs_adView_content' data-ipsTabBar-updateURL='false'>
|
|
<div role='tablist'>
|
|
{{foreach $images as $key => $image}}
|
|
<button type="button" id='ipsTabs_adView_{$key}' class="ipsTabs__tab" title='{$key}' role="tab" aria-controls='ipsTabs_adView_{$key}_panel' aria-selected="{{if $key == "large"}}true{{else}}false{{endif}}">
|
|
{{if $key === 'large'}}{lang="ad_image"}{{else}}{lang="ad_image_{$key}"}{{endif}}
|
|
</button>
|
|
{{endforeach}}
|
|
</div>
|
|
{template="tabScrollers" app="core" group="global" location="global"}
|
|
</i-tabs>
|
|
<section id='ipsTabs_adView_content' class='acpFormTabContent'>
|
|
{{foreach $images as $key => $image}}
|
|
<div id='ipsTabs_adView_{$key}_panel' class="ipsTabs__panel" role="tabpanel" aria-labelledby="ipsTabs_adView_{$key}" {{if $key != "large"}}hidden{{endif}}>
|
|
<div class="i-padding_3">
|
|
<a href="{$link}" target='_blank' rel='nofollow noreferrer'><img src="{file="$image" extension="$advertisement->storageExtension()"}" class="ipsImage"></a>
|
|
</div>
|
|
</div>
|
|
{{endforeach}}
|
|
</section>
|
|
{{else}}
|
|
<div class="i-padding_3">
|
|
{{foreach $images as $key => $image}}
|
|
<a href="{$link}" target='_blank' rel='nofollow noreferrer'><img src="{file="$image" extension="$advertisement->storageExtension()"}" class="ipsImage"></a>
|
|
{{endforeach}}
|
|
</div>
|
|
{{endif}}
|
|
<div class="i-font-size_-1"><a href="{$link}" rel="noreferrer">{$advertisement->link}</a></div>
|
|
</div>]]></template>
|
|
<template template_group="purchases" template_name="advertisement" template_data="$purchase, $advertisement" template_location="front" template_app="nexus"><![CDATA[{{if $advertisement->active == -1}}
|
|
<p class="ipsMessage ipsMessage--info">{lang="advertisement_pending_approval"}</p>
|
|
{{elseif $advertisement->active == 1}}
|
|
<p class="ipsMessage ipsMessage--success">{lang="advertisement_active"}</p>
|
|
{{else}}
|
|
<p class="ipsMessage ipsMessage--info">{lang="advertisement_expired"}</p>
|
|
{{endif}}
|
|
|
|
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--advertisement">
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120"><strong>{lang="advertisement_url"}</strong></span>
|
|
<span class="ipsData__main">{$advertisement->link}</span>
|
|
</li>
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120"><strong>{lang="ad_image_alt"}</strong></span>
|
|
<span class="ipsData__main">{$advertisement->image_alt}</span>
|
|
</li>
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120"><strong>{lang="ads_ad_impressions"}</strong></span>
|
|
<span class="ipsData__main">{$advertisement->impressions}{{if $advertisement->maximum_unit == 'i' and $advertisement->maximum_value != -1}} / {$advertisement->maximum_value}{{endif}}</span>
|
|
</li>
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120"><strong>{lang="ads_ad_clicks"}</strong></span>
|
|
<span class="ipsData__main">{$advertisement->clicks}{{if $advertisement->maximum_unit == 'c' and $advertisement->maximum_value != -1}} / {$advertisement->maximum_value}{{endif}}</span>
|
|
</li>
|
|
</ul>
|
|
</i-data>
|
|
|
|
<div class="ips{expression="\IPS\IPS::mb_ucfirst(\IPS\SUITE_UNIQUE_KEY)"}">
|
|
<ul class="i-text-align_center">
|
|
{{foreach json_decode( $advertisement->images, TRUE ) as $k => $image}}
|
|
{{if $image}}
|
|
<li>
|
|
<div class='ips{expression="\IPS\IPS::mb_ucfirst(\IPS\SUITE_UNIQUE_KEY)"}_{$k} i-background_2 i-padding_2'>
|
|
<div class='i-background_1 i-padding_2'>
|
|
<a href="{file="$image" extension="core_Advertisements"}" class='ipsImage ipsThumb_{$k}' data-ipsLightbox data-ipsLightbox-group="ads" data-ipsLightbox-meta="{lang="$k"}"><img src="{file="$image" extension="core_Advertisements"}" loading='lazy' alt='' ></a>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>]]></template>
|
|
<template template_group="purchases" template_name="advertisementType" template_data="$purchase, $advertisement" template_location="front" template_app="nexus"><![CDATA[<div class='i-font-size_-1'>
|
|
{{if $advertisement->type == \IPS\core\Advertisement::AD_EMAIL}}{lang="advertisements_emails"}{{else}}{lang="advertisements_site"}{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="purchases" template_name="giftVoucher" template_data="$purchase, $data" template_location="admin" template_app="nexus"><![CDATA[
|
|
<div class='i-padding_3 i-background_2'>
|
|
<div class='ipsColumns'>
|
|
<div class='ipsColumns__secondary i-basis_280'>
|
|
<h2 class='ipsMinorTitle'>{lang="gift_voucher"}</h2>
|
|
<p class='i-font-size_2 cNexusGiftCardPrice'>
|
|
{money="$data['amount']" currency="$data['currency']"}
|
|
</p>
|
|
<div class='i-font-size_2'>
|
|
<strong>{$data['code']}</strong>
|
|
</div>
|
|
<p class='i-font-size_1'>
|
|
{{if $data['method'] === 'email'}}
|
|
{lang="sent_to"} {$data['recipient_email']}
|
|
{{else}}
|
|
<a href='{$purchase->url()->setQueryString( 'do', 'extra' )}'>{lang="printable_version"}</a>
|
|
{{endif}}
|
|
</p>
|
|
</div>
|
|
<div class='ipsColumns__primary i-background_1'>
|
|
<div class='i-padding_3 i-font-size_1'>
|
|
{{if $data['recipient_name']}}
|
|
<strong>{$data['recipient_name']},</strong>
|
|
<br>
|
|
<br>
|
|
{{endif}}
|
|
{{if $data['message']}}
|
|
{expression="nl2br( htmlspecialchars( $data['message'], ENT_DISALLOWED, 'UTF-8', FALSE ) )" raw="true"}
|
|
{{endif}}
|
|
{{if $data['sender']}}
|
|
<br><br>
|
|
<strong>{lang="from"} {$data['sender']}</strong>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="purchases" template_name="giftvoucher" template_data="$purchase, $data" template_location="front" template_app="nexus"><![CDATA[{{if $data['method'] === 'print'}}
|
|
<p class='ipsMessage ipsMessage--info'>
|
|
{lang="gift_voucher_pending_print"}
|
|
</p>
|
|
<a href="{$purchase->url()->setQueryString( 'do', 'extra' )}" class='ipsButton ipsButton--primary'>{lang="print_giftvoucher"}</a>
|
|
{{else}}
|
|
<p class='ipsMessage ipsMessage--info'>
|
|
{lang="gift_voucher_pending_email"}
|
|
</p>
|
|
{{endif}}
|
|
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--gift-voucher i-margin-top_3">
|
|
<li class='ipsData__item'>
|
|
<strong class='i-basis_120 i-text-align_end'>
|
|
To
|
|
</strong>
|
|
<span class='ipsData__main'>
|
|
{$data['recipient_name']}{{if $data['recipient_email']}} ({$data['recipient_email']}){{endif}}
|
|
</span>
|
|
</li>
|
|
<li class='ipsData__item'>
|
|
<strong class='i-basis_120 i-text-align_end'>
|
|
Amount
|
|
</strong>
|
|
<span class='ipsData__main'>
|
|
{money="$data['amount']" currency="$data['currency']"}
|
|
</span>
|
|
</li>
|
|
<li class='ipsData__item'>
|
|
<strong class='i-basis_120 i-text-align_end'>
|
|
Message
|
|
</strong>
|
|
<div class='ipsData__main'>
|
|
<div class=''>
|
|
{{if $data['message']}}
|
|
{$data['message']}
|
|
{{else}}
|
|
<em class='i-color_soft'>No message</em>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</i-data>]]></template>
|
|
<template template_group="purchases" template_name="giftvoucherPrint" template_data="$data" template_location="front" template_app="nexus"><![CDATA[
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>{lang="print_gift_card"}</title>
|
|
<style type='text/css'>
|
|
body {
|
|
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
font-size: 13px;
|
|
line-height: 18px;
|
|
margin: 0;
|
|
padding: 30px;
|
|
text-align: center;
|
|
}
|
|
|
|
#elNexusGiftcard_border {
|
|
position: relative;
|
|
border: 1px dashed #000;
|
|
padding: 20px;
|
|
display: inline-block;
|
|
text-align: start;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
#elNexusGiftcard {
|
|
width: 400px;
|
|
border-radius: 10px;
|
|
margin: 0 auto;
|
|
position: relative;
|
|
}
|
|
|
|
#elNexusGiftcard_card {
|
|
height: 230px;
|
|
border-radius: 10px;
|
|
position: relative;
|
|
}
|
|
|
|
#icon {
|
|
position: absolute;
|
|
display: block;
|
|
background: #fff;
|
|
border-radius: 50px;
|
|
width: 100px;
|
|
height: 100px;
|
|
top: 15px;
|
|
left: 15px;
|
|
font-size: 60px;
|
|
line-height: 100px;
|
|
text-align: center;
|
|
z-index: 5000;
|
|
}
|
|
|
|
#title {
|
|
position: absolute;
|
|
top: 30px;
|
|
right: 15px;
|
|
font-size: 20px;
|
|
font-weight: 400;
|
|
color: rgba(255,255,255,0.6);
|
|
}
|
|
|
|
#elNexusGiftcard_card h2 {
|
|
position: absolute;
|
|
right: 15px;
|
|
bottom: 80px;
|
|
color: #fff;
|
|
font-weight: 400;
|
|
font-size: 40px;
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
|
|
#value {
|
|
position: absolute;
|
|
right: 15px;
|
|
bottom: 30px;
|
|
color: rgba(255,255,255,0.8);
|
|
font-weight: 300;
|
|
font-size: 52px;
|
|
}
|
|
|
|
#message {
|
|
margin: 10px 0;
|
|
}
|
|
|
|
#scissors_top,
|
|
#scissors_bottom {
|
|
position: absolute;
|
|
font-size: 22px;
|
|
left: 50%;
|
|
}
|
|
|
|
#scissors_top {
|
|
top: -13px;
|
|
}
|
|
|
|
#scissors_bottom {
|
|
bottom: -13px;
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
#elNexusGiftcard_personalize {
|
|
font-size: 14px;
|
|
padding: 15px;
|
|
color: #333;
|
|
}
|
|
|
|
#elNexusGiftcard_personalize hr {
|
|
border: 0;
|
|
border-top: 1px solid #999999;
|
|
height: 1px;
|
|
margin-top: 15px;
|
|
margin-bottom: 15px;
|
|
}
|
|
|
|
#redeem, #code {
|
|
font-size: 12px;
|
|
text-align: center;
|
|
}
|
|
|
|
#code strong {
|
|
font-size: 16px;
|
|
}
|
|
|
|
#redeem {
|
|
color: #626262;
|
|
margin-top: 5px;
|
|
}
|
|
</style>
|
|
<link rel='stylesheet' href='{url="applications/core/interface/static/fontawesome/css/regular.min.css?v=6.3.0" base="none" noprotocol="true"}'>
|
|
<link rel='stylesheet' href='{url="applications/core/interface/static/fontawesome/css/solid.min.css?v=6.3.0" base="none" noprotocol="true"}'>
|
|
<link rel='stylesheet' href='{url="applications/core/interface/static/fontawesome/css/fontawesome.min.css?v=6.3.0" base="none" noprotocol="true"}'>
|
|
<link rel='stylesheet' href='{url="applications/core/interface/static/fontawesome/css/brands.min.css?v=6.3.0" base="none" noprotocol="true"}'>
|
|
</head>
|
|
<body>
|
|
<div id='elNexusGiftcard_border'>
|
|
<i class='fa-solid fa-scissors' id='scissors_top'></i>
|
|
<i class='fa-solid fa-scissors' id='scissors_bottom'></i>
|
|
<div id='elNexusGiftcard'>
|
|
<div id='elNexusGiftcard_card' style='background-color: {$data['color']}'>
|
|
<span id='icon'><i class='fa-solid fa-gift'></i></span>
|
|
<h2>{lang="gift_voucher"}</h2>
|
|
<strong id='title'>{setting="board_name"}</strong>
|
|
<strong id='value'>{money="$data['amount']" currency="$data['currency']"}</strong>
|
|
</div>
|
|
<div id='elNexusGiftcard_personalize'>
|
|
{{if $data['recipient_name']}}
|
|
<div>
|
|
<strong>{lang="to"} {$data['recipient_name']}</strong>,
|
|
</div>
|
|
{{endif}}
|
|
{{if $data['message']}}
|
|
<div id='message'>
|
|
{expression="nl2br( htmlspecialchars( $data['message'], ENT_DISALLOWED, 'UTF-8', FALSE ) )" raw="true"}
|
|
</div>
|
|
{{endif}}
|
|
{{if $data['sender']}}
|
|
<div><strong>{lang="from"} {$data['sender']}</strong></div>
|
|
{{endif}}
|
|
<hr>
|
|
<div id='code'>
|
|
{lang="redemption_code"}<br>
|
|
<strong>{$data['code']}</strong>
|
|
</div>
|
|
<div id='redeem'>
|
|
{lang="to_redeem_visit"}<br>
|
|
{url="app=nexus&module=store&controller=gifts&do=redeem" seoTemplate="store_giftvouchers_redeem"}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>]]></template>
|
|
<template template_group="purchases" template_name="hovercard" template_data="$purchase" template_location="admin" template_app="nexus"><![CDATA[<div class="ipsPageHead_special">
|
|
{$purchase->name} (#{$purchase->id})
|
|
</div>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--purchases-hovercard">
|
|
{{foreach $purchase->custom_fields as $k => $v}}
|
|
{{if $displayValue = trim( \IPS\nexus\Package\CustomField::load( $k )->displayValue( $v, TRUE ) )}}
|
|
<li class="ipsData__item">
|
|
<span class=""><strong>{lang="nexus_pfield_{$k}"}</strong></span>
|
|
<span class="">{$displayValue|raw}</span>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>]]></template>
|
|
<template template_group="purchases" template_name="link" template_data="$purchase, $number=FALSE, $icon=FALSE, $shortName=FALSE" template_location="admin" template_app="nexus"><![CDATA[{{if $icon}}<i class="fa-solid fa-box-archive"></i> {{endif}}<a href='{$purchase->acpUrl()}' data-ipsHover data-ipsHover-target="{$purchase->acpUrl()->setQueryString( 'hovercard', 1 )}">{{if $number}}{lang="purchase_number" sprintf="$purchase->id"}{{elseif $shortName}}{$purchase->_name}{{else}}{$purchase->name}{{endif}}</a>]]></template>
|
|
<template template_group="purchases" template_name="lkey" template_data="$licensekey" template_location="admin" template_app="nexus"><![CDATA[<div class='i-padding_3 i-background_2 i-text-align_center i-margin-bottom_1'>
|
|
<h2 class='ipsMinorTitle i-margin-bottom_1'>{lang="license_key"}</h2>
|
|
<div class='i-font-size_2 i-font-family_monospace cNexusLicenseKey i-margin-bottom_1'>
|
|
{$licensekey->key}
|
|
</div>
|
|
{{if $licensekey->max_uses != 0}}
|
|
<strong>
|
|
{{if $licensekey->max_uses == -1}}
|
|
{lang="lkey_using_x_of_unlimited_uses" sprintf="$licensekey->uses"}
|
|
{{else}}
|
|
{lang="lkey_using_x_of_x_uses" sprintf="$licensekey->uses, $licensekey->max_uses" pluralize="$licensekey->max_uses"}
|
|
{{endif}}
|
|
</strong>
|
|
{{endif}}
|
|
|
|
{{if member.hasAcpRestriction( 'nexus', 'customers', 'lkeys_reset' ) || $licensekey->uses}}
|
|
<ul class='ipsList ipsList--inline i-margin-top_1'>
|
|
{{if member.hasAcpRestriction( 'nexus', 'customers', 'lkeys_reset' )}}
|
|
<li>
|
|
<a href="{$licensekey->purchase->acpUrl()->setQueryString( array( 'do' => 'extra', 'act' => 'lkeyReset' ) )->csrf()}" data-confirm class="ipsButton ipsButton--inherit ipsButton--tiny">{lang="generate_new_key"}</a>
|
|
</li>
|
|
{{endif}}
|
|
{{if $licensekey->uses}}
|
|
<li>
|
|
<a href='#elLicenseUses' class='ipsButton ipsButton--tiny ipsButton--inherit' data-ipsDialog data-ipsDialog-content='#elLicenseUses' data-ipsDialog-title='{lang="license_key_uses"}'>{lang="see_license_usage"}</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
{{endif}}
|
|
</div>
|
|
|
|
{{if $licensekey->uses}}
|
|
<div id='elLicenseUses' class='ipsHide i-padding_3'>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--lkey">
|
|
{{foreach $licensekey->activate_data as $k => $use}}
|
|
<li class='ipsData__item'>
|
|
<div class='ipsData__icon'>
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--neutral'>{$k}</span>
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
{{if \is_countable( $use['extra'] ) AND \count( $use['extra'] )}}
|
|
<ul>
|
|
{{foreach $use['extra'] as $k => $v}}
|
|
<li>
|
|
<strong>{$k}:</strong> {$v}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endif}}
|
|
<div class='ipsData__meta'>
|
|
{{if $use['last_checked']}}
|
|
{lang="lkey_use_info" htmlsprintf="\IPS\DateTime::ts( $use['activated'] )->html( false ), htmlspecialchars( $use['ip'], ENT_DISALLOWED, 'UTF-8', FALSE ), \IPS\DateTime::ts( $use['last_checked'] )->html( false )"}
|
|
{{else}}
|
|
{lang="lkey_use_info_nocheck" htmlsprintf="\IPS\DateTime::ts( $use['activated'] )->html( false ), htmlspecialchars( $use['ip'], ENT_DISALLOWED, 'UTF-8', FALSE )"}
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="purchases" template_name="noLkey" template_data="$purchase" template_location="admin" template_app="nexus"><![CDATA[
|
|
<div class='i-padding_3 i-background_2 i-text-align_center i-margin-bottom_1'>
|
|
<h2 class='ipsMinorTitle i-margin-bottom_1'>{lang="license_key"}</h2>
|
|
<div class='i-font-size_2 i-margin-bottom_1'>
|
|
{lang="no_license_key_generated"}
|
|
</div>
|
|
|
|
{{if member.hasAcpRestriction( 'nexus', 'customers', 'lkeys_reset' ) || ( $purchase->licenseKey() and $purchase->licenseKey()->uses )}}
|
|
<ul class='ipsList ipsList--inline i-margin-top_1'>
|
|
{{if member.hasAcpRestriction( 'nexus', 'customers', 'lkeys_reset' )}}
|
|
<li>
|
|
<a href="{$purchase->acpUrl()->setQueryString( array( 'do' => 'extra', 'act' => 'lkeyReset' ) )->csrf()}" data-confirm class="ipsButton ipsButton--inherit ipsButton--tiny">{lang="generate_new_key"}</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="purchases" template_name="package" template_data="$package, $customFieldsForm, $reactivateUrl, $upgradeDowngradeUrl, $upgradeDowngradeLang, $associatedFiles" template_location="front" template_app="nexus"><![CDATA[
|
|
<hr class='ipsHr i-margin-top_3'>
|
|
{{if $reactivateUrl or $upgradeDowngradeUrl or \IPS\nexus\Package\Item::load( $package->id )->canReview()}}
|
|
<ul class='ipsList ipsList--inline'>
|
|
{{if $reactivateUrl}}
|
|
<li><a href="{$reactivateUrl}" class=''>{lang="reactivate_package"}</a></li>
|
|
{{endif}}
|
|
{{if $upgradeDowngradeUrl}}
|
|
<li><a href="{$upgradeDowngradeUrl}" class=''>{lang="$upgradeDowngradeLang"}</a></li>
|
|
{{endif}}
|
|
{{if \IPS\nexus\Package\Item::load( $package->id )->canReview()}}
|
|
<li><a href="{$package->url()}" class=''>{lang="write_package_review"}</a></li>
|
|
{{endif}}
|
|
</ul>
|
|
<hr class='ipsHr i-margin-bottom_4'>
|
|
{{endif}}
|
|
|
|
{{if \count( $associatedFiles )}}
|
|
<h2 class='ipsTitle ipsTitle--h3 i-margin-bottom_2'>{lang="package_downloads"}</h2>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--associatedFiles ipsData--grid ipsData--carousel i-basis_200' id='commerce-package-downloads' tabindex="0">
|
|
{{foreach $associatedFiles as $idx => $file}}
|
|
{template="indexBlock" app="downloads" group="browse" params="$file"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
{template="carouselNavigation" group="global" app="core" params="'commerce-package-downloads'"}
|
|
{{endif}}
|
|
|
|
{$customFieldsForm|raw}
|
|
]]></template>
|
|
<template template_group="purchases" template_name="view" template_data="$purchase, $customer, $children, $customFields" template_location="admin" template_app="nexus"><![CDATA[{{if $billingAgreement = $purchase->billing_agreement AND !$purchase->billing_agreement->canceled}}
|
|
<p class="ipsMessage ipsMessage--info">{lang="billing_agreement_purchase_info" sprintf="$billingAgreement->acpUrl()"}</p>
|
|
{{endif}}
|
|
<div class="ipsSpanGrid" data-ips-template="view">
|
|
<div class='ipsSpanGrid__4'>
|
|
{{if $purchase->cancelled}}
|
|
<p class='i-background_negative i-padding_3 i-text-align_center i-margin-bottom_3'>
|
|
<span class='ipsTitle ipsTitle--h3'><i class='fa-solid fa-xmark-circle'></i> {lang="purchase_canceled"}</span>
|
|
<br>
|
|
{{if $purchase->can_reactivate}}
|
|
{lang="purchase_canceled_ra"}
|
|
{{else}}
|
|
{lang="purchase_canceled_no_ra"}
|
|
{{endif}}
|
|
</p>
|
|
{{elseif !$purchase->active}}
|
|
<p class='i-background_3 i-padding_3 i-text-align_center i-margin-bottom_3'>
|
|
<span class='ipsTitle ipsTitle--h3'><i class='fa-solid fa-circle-exclamation'></i> {lang="purchase_expired"}</span>
|
|
</p>
|
|
{{elseif $purchase->expire}}
|
|
{{if $purchase->grace_period and $purchase->expire->getTimestamp() < time()}}
|
|
<p class='i-background_3 i-padding_3 i-text-align_center i-margin-bottom_3'>
|
|
<span class='ipsTitle ipsTitle--h3'><i class='fa-regular fa-clock'></i> {lang="purchase_in_grace_period"}</span>
|
|
</p>
|
|
{{else}}
|
|
<p class='i-background_positive i-padding_3 i-text-align_center i-margin-bottom_3'>
|
|
<span class='ipsTitle ipsTitle--h3'><i class='fa-solid fa-check-circle'></i> {lang="purchase_active"}</span>
|
|
</p>
|
|
{{endif}}
|
|
{{endif}}
|
|
|
|
<div class="ipsBox">
|
|
<h2 class='ipsBox__header'>{lang="purchase_details"}</h2>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--purchase-details">
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120">
|
|
<strong>{lang="ps_start"}</strong>
|
|
</span>
|
|
<span class="">
|
|
{$purchase->start->localeDate()}
|
|
</span>
|
|
</li>
|
|
{{if $purchase->expire}}
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120">
|
|
<strong>{lang="ps_expire"}</strong>
|
|
</span>
|
|
<span class="">
|
|
{$purchase->expire->localeDate()}
|
|
</span>
|
|
</li>
|
|
{{endif}}
|
|
{{if $purchase->grace_period}}
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120">
|
|
<strong>{lang="p_grace_period"}</strong>
|
|
</span>
|
|
<span class="">
|
|
{{$grace = new \DateInterval( 'PT' . $purchase->grace_period . 'S' );}}
|
|
{expression="\IPS\DateTime::formatInterval( \IPS\DateTime::create()->diff( \IPS\DateTime::create()->add( $grace ) ), 0 )"}
|
|
{{if $purchase->expire}}
|
|
<span class="i-color_soft i-font-size_-1">{$purchase->expire->add( $grace )->localeDate()}</span>
|
|
{{endif}}
|
|
</span>
|
|
</li>
|
|
{{endif}}
|
|
{{if $purchase->renewals}}
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120">
|
|
<strong>{lang="ps_renewals"}</strong>
|
|
</span>
|
|
<span class="">
|
|
{$purchase->renewals}{{if $purchase->renewals->tax}}{lang="plus_tax_rate" sprintf="$purchase->renewals->tax->_title"}{{endif}} {{if $purchase->grouped_renewals}}({lang="purchase_grouped"}){{endif}}
|
|
{{if $purchase->pay_to and $purchase->commission < 100}}
|
|
<br>
|
|
{{if $purchase->fee}}
|
|
{lang="purchase_renewal_commission_fee" htmlsprintf="100 - $purchase->commission, $purchase->fee, $purchase->pay_to->link()"}
|
|
{{else}}
|
|
{lang="purchase_renewal_commission" htmlsprintf="100 - $purchase->commission, $purchase->pay_to->link()"}
|
|
{{endif}}
|
|
{{endif}}
|
|
</span>
|
|
</li>
|
|
{{if $purchase->billing_agreement}}
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120">
|
|
<strong>{lang="ps_billing_agreement"}</strong>
|
|
</span>
|
|
<span class="">
|
|
<a href="{$purchase->billing_agreement->acpUrl()}">{$purchase->billing_agreement->gw_id}</a>
|
|
{{if $purchase->billing_agreement->canceled}}
|
|
({lang="billing_agreement_canceled"})
|
|
{{endif}}
|
|
</span>
|
|
</li>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if $parent = $purchase->parent()}}
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120">
|
|
<strong>{lang="ps_parent"}</strong>
|
|
</span>
|
|
<span class="">
|
|
<a href="{$parent->acpUrl()}">{$parent->name}</a>
|
|
</span>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
<br>
|
|
|
|
<div class="ipsBox">
|
|
<h2 class="ipsBox__header">{lang="purchase_customer_info"}</h2>
|
|
{{if $customer}}
|
|
<div class='i-padding_3 ipsPhotoPanel ipsPhotoPanel_small'>
|
|
<a href="{$purchase->member->acpUrl()}"><img src='{$purchase->member->photo}' class='ipsUserPhoto ipsUserPhoto--small' loading="lazy" alt=""></a>
|
|
<div>
|
|
<h3 class='i-font-size_2 i-link-color_inherit'><strong><a href="{$purchase->member->acpUrl()}">{$purchase->member->cm_name}</a></strong></h3>
|
|
{$purchase->member->email}<br>
|
|
{lang="transaction_customer_since" sprintf="$purchase->member->joined->localeDate()"}<br>
|
|
{lang="transaction_spent" sprintf="$purchase->member->totalSpent()"}
|
|
</div>
|
|
</div>
|
|
{{else}}
|
|
<div class='i-padding_3'>
|
|
<p class="ipsMessage ipsMessage--error">{lang="purchase_no_member"}</p>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
<br><br>
|
|
</div>
|
|
<div class='ipsSpanGrid__8'>
|
|
{{if $content = $purchase->acpPage()}}
|
|
{$content|raw}
|
|
{{endif}}
|
|
|
|
{{if \count( $customFields )}}
|
|
<div class="ipsBox i-margin-bottom_1">
|
|
<h2 class='ipsBox__header'>{lang="p_custom_fields"}</h2>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--customfields">
|
|
{{foreach $customFields as $k => $v}}
|
|
<li class="ipsData__item">
|
|
<span class="i-basis_120">
|
|
<strong>{lang="nexus_pfield_{$k}"}</strong>
|
|
</span>
|
|
<span class="">
|
|
{$v|raw}
|
|
</span>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if $purchase->childrenCount()}}
|
|
<div class='ipsBox i-margin-bottom_1'>
|
|
<h2 class="ipsBox__header">{lang="child_purchases"}</h2>
|
|
{$children|raw}
|
|
</div>
|
|
{{endif}}
|
|
|
|
<div data-controller='core.admin.members.lazyLoadingProfileBlock' data-url='{url="app=nexus&module=customers&controller=purchases&do=showInvoices&id="}{$purchase->id}'>
|
|
<div class="i-margin-bottom_1 i-text-align_center">
|
|
<img src="{resource="tiny_loading.gif" app="core"}">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="adPackageExpire" template_data="$field" template_location="admin" template_app="nexus"><![CDATA[{lang="after"} <input type="number" name="{$field->name}[0]}" value="{$field->value[0]}"> <select class="ipsInput ipsInput--select" name="{$field->name}[1]"><option value="i" {{if $field->value[1] == 'i'}}selected{{endif}}>{lang="impressions"}</option><option value="c" {{if $field->value[1] == 'c'}}selected{{endif}}>{lang="clicks"}</option></select> {lang="or"} <input type="checkbox" name="{$field->name}[2]" {{if !$field->Value[0]}}checked{{endif}} data-role="unlimited"> {lang="never"}]]></template>
|
|
<template template_group="store" template_name="cart" template_data="$location, $currency" template_location="front" template_app="nexus"><![CDATA[
|
|
<div class='ipsBox ipsBox--cart'>
|
|
<div class='i-text-align_center i-padding_3 i-border-bottom_3'>
|
|
<i class='i-font-size_6 fa-solid fa-cart-shopping i-margin-bottom_2 i-color_soft'></i>
|
|
<h1 class='i-font-size_5 i-font-weight_600 i-color_hard i-text-align_center'>{lang="your_cart"}</h1>
|
|
</div>
|
|
<div data-controller='nexus.front.store.cartReview'>
|
|
<div data-role="cart">
|
|
{template="cartContents" group="store" params="$location, $currency"}
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="cartContents" template_data="$location, $currency" template_location="front" template_app="nexus"><![CDATA[{{$subtotal = new \IPS\Math\Number('0');}}
|
|
{{if \count( $_SESSION['cart'] )}}
|
|
<div id='elNexusCart'>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--cart-contents">
|
|
{{foreach $_SESSION['cart'] as $id => $item}}
|
|
<li id='elCartItem_{$id}' class="ipsData__item">
|
|
<div class="ipsData__image" aria-hidden="true">
|
|
{{if $image = $item->image()}}
|
|
<img src="{$image->url}" alt='' loading='lazy'>
|
|
{{elseif $icon = $item::$icon}}
|
|
<i class='fa-solid fa-{$icon}'></i>
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<h2 class='ipsData__title'>{{if $item->canChangeQuantity()}}<span class='i-color_soft'>{$item->quantity} x</span> {{endif}}{$item->name}</h2>
|
|
{$item->detailsForDisplay( 'checkout' )|raw}
|
|
<div class='ipsData__meta'>
|
|
<ul class='ipsList ipsList--inline i-font-size_-2'>
|
|
<li><a href='{url="app=nexus&module=store&controller=cart&do=quantities&item[$id]=0" csrf="1"}' title='{lang="remove_from_cart_title"}' data-action='removeFromCart'>{lang="remove_from_cart"}</a></li>
|
|
{{if $item->canChangeQuantity()}}
|
|
<li><button type="button" id="elItemRow{$id}_quantity" popovertarget="elItemRow{$id}_quantity_menu" title='{lang="change_quantity_title"}'>{lang="change_quantity"} <i class='fa-solid fa-caret-down'></i></button></li>
|
|
{{endif}}
|
|
</ul>
|
|
<i-dropdown popover id="elItemRow{$id}_quantity_menu">
|
|
<div class="iDropdown">
|
|
<form action="{url="app=nexus&module=store&controller=cart&do=quantities" seoTemplate="store_cart" csrf="1"}" method="post" data-role='quantityForm' class="ipsForm">
|
|
<label class="ipsFieldRow">
|
|
<span class="ipsFieldRow__label">{lang="change_quantity"}</span>
|
|
<input class="ipsInput ipsInput--number" type='number' name="item[{$id}]" value='{$item->quantity}' min="0">
|
|
</label>
|
|
<div class="ipsSubmitRow"><button type='submit' class='ipsButton ipsButton--primary ipsButton--wide'>{lang="update"}</button></div>
|
|
</form>
|
|
</div>
|
|
</i-dropdown>
|
|
</div>
|
|
</div>
|
|
<div class='i-basis_180'>
|
|
<span class='cNexusPrice i-font-size_3'>
|
|
{{if settings.nexus_show_tax}}
|
|
{{$location = $location ?: \IPS\nexus\Customer::loggedIn()->estimatedLocation();}}
|
|
{{$itemPrice = $item->grossPrice( $location );}}
|
|
{{$linePrice = $item->grossLinePrice( $location );}}
|
|
{{else}}
|
|
{{$itemPrice = $item->price;}}
|
|
{{$linePrice = $item->linePrice();}}
|
|
{{endif}}
|
|
{$linePrice}
|
|
{{$subtotal = $subtotal->add( $linePrice->amount );}}
|
|
</span>
|
|
{{if $item->renewalTerm}}
|
|
<p class='i-font-size_-2 i-color_soft'>
|
|
{lang="and_renewal" sprintf="$item->renewalTerm->toDisplay( NULL, $item->quantity )"}
|
|
</p>
|
|
{{endif}}
|
|
{{if $item->quantity > 1}}
|
|
<p class='i-font-size_-2 i-color_soft'>
|
|
{{if $item->renewalTerm}}
|
|
{lang="each_short_with_renewal" sprintf="$itemPrice, $item->renewalTerm"}
|
|
{{else}}
|
|
{lang="each_short" sprintf="$itemPrice"}
|
|
{{endif}}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
<div class='cNexusCart_totals i-text-align_end'>
|
|
{lang="cart_subtotal"}: <span class='cNexusPrice'>{money="$subtotal" currency="$currency"}</span>
|
|
</div>
|
|
<ul class="ipsSubmitRow ipsButtons">
|
|
<li>
|
|
<a class="ipsButton ipsButton--inherit" href="{url="app=nexus&module=store" seoTemplate="store"}"><i class="fa-solid fa-store"></i> {lang="continue_shopping"}</a>
|
|
</li>
|
|
<li>
|
|
<a class="ipsButton ipsButton--text i-margin-end_auto" href="{url="app=nexus&module=store&controller=cart&do=clear" seoTemplate="store_cart" csrf="true"}" data-confirm><i class="fa-regular fa-trash-can"></i> {lang="empty_cart"}</a>
|
|
</li>
|
|
<li>
|
|
<a class="ipsButton ipsButton--primary" href="{url="app=nexus&module=store&controller=cart&do=checkout" seoTemplate="store_cart" csrf="true"}" data-action="checkout"><i class="fa-solid fa-circle-check"></i> {lang="checkout"}</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
{{else}}
|
|
<div class='ipsBox i-padding_3 i-text-align_center i-font-size_2 i-color_soft'>
|
|
{lang="your_cart_empty"}
|
|
<br><br>
|
|
<a href='{url="app=nexus&module=store" seoTemplate="store"}' title='{lang="start_shopping"}' class='ipsButton ipsButton--primary'>{lang="start_shopping"}</a>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="store" template_name="cartHeader" template_data="" template_location="front" template_app="nexus"><![CDATA[{{$location = NULL;}}
|
|
{{if isset( $_SESSION['cart'] ) and \count( $_SESSION['cart'] ) and \IPS\Member::loggedIn()->canAccessModule( \IPS\Application\Module::get( 'nexus', 'store' ) )}}
|
|
{{$subtotal = new \IPS\Math\Number('0');}}
|
|
<li data-el='cart' id='elCart_container'>
|
|
<button type="button" id="elCart" popovertarget="elCart_menu" class="ipsUserNav__link" data-ipsTooltip title='{lang="your_cart"}'>
|
|
<i class="fa-solid fa-basket-shopping ipsUserNav__icon"></i>
|
|
<span class="ipsUserNav__text">{lang="cart"}</span>
|
|
<span class='ipsNotification'>{expression="\IPS\nexus\Application::cartCount()"}</span>
|
|
</button>
|
|
<i-dropdown popover id="elCart_menu">
|
|
<div class="iDropdown">
|
|
<div class="iDropdown__header">
|
|
<h4>{lang="your_cart"}</h4>
|
|
</div>
|
|
<div class='iDropdown__content'>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--compact ipsData--cart-dropdown" data-role='cartList' id='elCartContent'>
|
|
{{foreach $_SESSION['cart'] as $id => $item}}
|
|
<li class='ipsData__item'>
|
|
<div class='ipsData__image' aria-hidden="true">
|
|
{{if $image = $item->image()}}
|
|
<img src="{$image->url}" alt="{$item->name}" loading="lazy">
|
|
{{elseif $icon = $item::$icon}}
|
|
<i class='fa fa-solid fa-{$icon}'></i>
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>{$item->name}</div>
|
|
<p class="ipsData__meta">×{$item->quantity}</p>
|
|
</div>
|
|
<div class='cNexusPrice'>
|
|
<strong>
|
|
{{if settings.nexus_show_tax}}
|
|
{{$location = $location ?: \IPS\nexus\Customer::loggedIn()->estimatedLocation();}}
|
|
{{$linePrice = $item->grossLinePrice( $location );}}
|
|
{{else}}
|
|
{{$linePrice = $item->linePrice();}}
|
|
{{endif}}
|
|
{$linePrice}
|
|
{{$subtotal = $subtotal->add( $linePrice->amount );}}
|
|
</strong>
|
|
{{if $item->quantity > 1}}
|
|
<p class='i-font-size_-2 i-color_soft'>
|
|
{lang="each_short" sprintf="$item->price"}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
<li class='ipsData__item cNexusMenuCart_totalRow'>
|
|
<div class='ipsData__main i-font-size_2 i-text-align_end'>
|
|
<strong>{lang="subtotal"}</strong>
|
|
</div>
|
|
<div class='i-basis_100 cNexusPrice i-font-size_2 i-text-align_end'>
|
|
<strong>{money="$subtotal"}</strong>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class='iDropdown__footer'>{lang="review_and_checkout"}</a>
|
|
</div>
|
|
</i-dropdown>
|
|
</li>
|
|
{{endif}}]]></template>
|
|
<template template_group="store" template_name="cartHeaderMobile" template_data="" template_location="front" template_app="nexus"><![CDATA[<li data-el='cart' id="elCart_mobileHeaderContainer">
|
|
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class="ipsMobileNavIcons__button">
|
|
<i class="fa-solid fa-basket-shopping"></i>
|
|
<span class='ipsNotification'>{expression="\IPS\nexus\Application::cartCount()"}</span>
|
|
<span class='ipsInvisible'>{lang="your_cart"}</span>
|
|
</a>
|
|
</li>]]></template>
|
|
<template template_group="store" template_name="cartReview" template_data="$package, $quantity, $upsell" template_location="front" template_app="nexus"><![CDATA[{template="pixel" app="core" group="global" params="array( 'AddToCart' => array( 'content_type' => 'product', 'content_ids' => array( $package->id ) ) )"}
|
|
{{if \IPS\Request::i()->registerCheckout}}
|
|
<div class='i-text-align_center i-padding_3 i-color_soft i-font-size_2 ipsBox'>
|
|
{lang="package_added_to_cart" sprintf="$package->_title"}
|
|
<br><br>
|
|
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' class='ipsButton ipsButton--primary'>{lang="continue_to_registration"}</a>
|
|
</div>
|
|
{{else}}
|
|
<div>
|
|
<div class='i-padding_3 i-text-align_center'>
|
|
<h3 class='i-font-weight_700 i-font-size_3 i-margin-bottom_2 i-color_positive'><i class='fa-regular fa-check-circle'></i> {lang="product_added_to_cart"}</h3>
|
|
<h4 class='i-font-size_3 i-font-weight_700 i-color_hard'>{$package->_title}</h4>
|
|
<p class="i-color_soft i-font-weight_600">{lang="quantity"}: {$quantity}</p>
|
|
</div>
|
|
<div class='ipsSubmitRow ipsButtons'>
|
|
<button type="button" data-action='dialogClose' class='ipsButton ipsButton--soft'><i class="fa-solid fa-store"></i> {lang="continue_shopping"}</button>
|
|
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}' title="{lang="review_cart_title"}" class='ipsButton ipsButton--primary'><i class="fa-solid fa-basket-shopping"></i> {lang="review_and_checkout"}</a>
|
|
</div>
|
|
{{if \count( $upsell )}}
|
|
<hr class='ipsHr'>
|
|
<h2 class='ipsTitle ipsTitle--h3'>{lang="related_products_you_might_like"}</h2>
|
|
<ul class='ipsCarousel ipsCarousel--commerce-related-products i-basis_300' id='commerce-related-products' tabindex="0">
|
|
{{foreach $upsell as $upsellPackage}}
|
|
{template="packageBlock" group="store" params="$upsellPackage, 'carousel'"}
|
|
{{endforeach}}
|
|
</ul>
|
|
{template="carouselNavigation" group="global" app="core" params="'commerce-related-products'"}
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="store" template_name="category" template_data="$category, $subcategories, $packages, $pagination, $packagesWithCustomFields, $totalCount" template_location="front" template_app="nexus"><![CDATA[
|
|
<header class="ipsPageHeader ipsBox">
|
|
<h1 class="ipsPageHeader__title">{$category->_title}</h1>
|
|
{{if $category->description}}
|
|
<div class="ipsPageHeader__desc">{template="richText" group="global" app="core" location="global" params="$category->description, array('')"}</div>
|
|
{{endif}}
|
|
</header>
|
|
|
|
{{if \count( $subcategories )}}
|
|
<section class='ipsBox ipsBox--commerceSubcategories ipsPull'>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--wallpaper ipsData--carousel ipsData--commerceCategories'>
|
|
{{foreach $subcategories as $group}}
|
|
<li class="ipsData__item">
|
|
<a href='{$group->url()}' class='ipsLinkPanel' aria-hidden="true" tabindex="-1"><span>{$group->_title}</span></a>
|
|
<div class="ipsData__image" aria-hidden="true">
|
|
{{if $group->image}}
|
|
<img src='{expression="str_replace( array( '(', ')' ), array( '\(', '\)' ), $group->image )"}' alt='' loading='lazy'>
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsData__content">
|
|
<div class="ipsData__main">
|
|
<h3 class="ipsData__title">{$group->_title}</h3>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</section>
|
|
<br>
|
|
{{endif}}
|
|
|
|
<div data-role="packageListContainer">
|
|
{template="categoryContents" group="store" params="$category, $subcategories, $packages, $pagination, $packagesWithCustomFields, $totalCount"}
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="categoryContents" template_data="$category, $subcategories, $packages, $pagination, $packagesWithCustomFields, $totalCount" template_location="front" template_app="nexus"><![CDATA[{{if \count( $packages )}}
|
|
<section class='ipsBox ipsBox--commerceCategoryContents'>
|
|
<h2 class='ipsBox__header'>{lang="products_count" pluralize="$totalCount"}</h2>
|
|
<div class="ipsButtonBar ipsButtonBar--top">
|
|
{{if $pagination}}
|
|
<div class='ipsButtonBar__pagination'>{$pagination|raw}</div>
|
|
{{endif}}
|
|
<div class="ipsButtonBar__end">
|
|
<ul class="ipsDataFilters">
|
|
<li>
|
|
<button type="button" id="elSortByMenu_products" popovertarget="elSortByMenu_products_menu" class="ipsDataFilters__button" data-role="sortButton"><span>{lang="sort_by"}</span><i class="fa-solid fa-caret-down"></i></button>
|
|
<i-dropdown popover id="elSortByMenu_products_menu" data-i-dropdown-selectable="radio">
|
|
<div class="iDropdown">
|
|
<ul class="iDropdown__items">
|
|
{{foreach array( 'default', 'name', 'price_low', 'price_high', 'rating' ) as $k}}
|
|
<li>
|
|
<a data-action="filter" {{if $k === 'default'}}href="{$category->url()}"{{else}}href="{$category->url()->setQueryString( 'sortby', $k )}"{{endif}} {{if ( request.sortby and request.sortby == $k ) or ( !request.sortby and $k === 'default' )}}aria-selected="true"{{endif}} data-ipsmenuvalue="{$k}">
|
|
<i class="iDropdown__input"></i>{lang="products_sort_{$k}"}
|
|
</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</i-dropdown>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
{{if \count( $packages )}}
|
|
{{if \IPS\Member::loggedIn()->getLayoutValue( 'store_view' ) == 'list'}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table ipsData--commerce-products" data-role="packageList">
|
|
{{foreach $packages as $package}}
|
|
{template="packageRow" group="store" params="$package, \in_array( $package->id, $packagesWithCustomFields )"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{else}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--grid ipsData--commerce-products" data-role="packageList">
|
|
{{foreach $packages as $package}}
|
|
{template="packageBlock" group="store" params="$package, 'grid'"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if trim( $pagination ) != ''}}
|
|
<div class="ipsButtonBar ipsButtonBar--bottom">
|
|
<div class="ipsButtonBar__pagination">
|
|
{$pagination|raw}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</section>
|
|
{{elseif ( !\count( $subcategories ) )}}
|
|
<div class="ipsEmptyMessage" data-role="packageList">{lang="store_empty"}</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="store" template_name="categorySidebar" template_data="$category=NULL, $subcategories=NULL, $url=NULL, $havePackages=FALSE, $currency=NULL, $havePackagesWhichAcceptReviews = FALSE, $havePackagesWhichUseStockLevels = FALSE" template_location="front" template_app="nexus"><![CDATA[
|
|
<div data-role="categorySidebar">
|
|
{{if !\IPS\nexus\Package\Group::theOnlyNode( array(), TRUE, FALSE )}}
|
|
<div class='ipsWidget' id='elNexusCategoriesBox'>
|
|
<h2 class='ipsWidget__header'>{lang="categories"}</h2>
|
|
<div class='ipsWidget__content i-padding_2'>
|
|
{{if $subcategories !== NULL AND \count( $subcategories )}}
|
|
<div class='ipsSideMenu ipsSideMenu--truncate ipsSideMenu--pseudoRadios' id='elCategories_menu'>
|
|
<h3 class='ipsSideMenu__view'>
|
|
<a href='#elCategories_menu' data-action='openSideMenu'><i class='fa-solid fa-bars'></i><span>{lang="categories"}</span></a>
|
|
</h3>
|
|
<div class="ipsSideMenu__menu">
|
|
<div class='cNexusCategoriesBox_back'>
|
|
{{if $category && $category->parent()}}
|
|
<a href='{$category->parent()->url()}' class='ipsButton ipsButton--small ipsButton--inherit'><i class="fa-solid fa-arrow-left-long"></i><span>{$category->parent()->_title}</span></a>
|
|
{{else}}
|
|
<a href='{url="app=nexus&module=store&controller=store" seoTemplate="store"}' class='ipsButton ipsButton--small ipsButton--inherit'><i class="fa-solid fa-arrow-left-long"></i><span>{lang="all_categories"}</span></a>
|
|
{{endif}}
|
|
</div>
|
|
<hr class='ipsHr'>
|
|
<h4 class='ipsSideMenu__title'>{$category->_title}</h4>
|
|
<ul class='ipsSideMenu__list'>
|
|
{{foreach $subcategories as $idx => $subcategory}}
|
|
<li>
|
|
<a href='{$subcategory->url()}' class='ipsSideMenu_item'><span class='ipsSideMenu__toggle'></span><span class='ipsSideMenu__text'>{$subcategory->_title}</span></a>
|
|
{{if $subcategory->hasSubgroups()}}
|
|
<ul class='ipsSideMenu__list'>
|
|
{{foreach $subcategory->children( 'view', NULL, FALSE ) as $cidx => $child}}
|
|
<li>
|
|
{{if $cidx >= 5}}
|
|
<a href='{$subcategory->url()}' class='ipsSideMenu_item'>
|
|
<span class='i-color_soft i-font-size_-2'>{lang="and_x_more" pluralize="\count( $subcategory->children( 'view', NULL, FALSE ) ) - 5"}</span>
|
|
</a>
|
|
{{break;}}
|
|
{{else}}
|
|
<a href="{$child->url()}" class='ipsSideMenu_item'><span class='ipsSideMenu__text'>{$child->_title}</span></a>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
{{elseif $category && $category->parent()}}
|
|
{{$siblings = $category->parent()->children( 'view', NULL, FALSE );}}
|
|
<div class='ipsSideMenu ipsSideMenu--truncate ipsSideMenu--pseudoRadios' id='elCategories_menu'>
|
|
<h3 class='ipsSideMenu__view'>
|
|
<a href='#elCategories_menu' data-action='openSideMenu'><i class='fa-solid fa-bars'></i><span>{lang="categories"}</span></a>
|
|
</h3>
|
|
<div class="ipsSideMenu__menu">
|
|
<div class='cNexusCategoriesBox_back'>
|
|
<a href='{$category->parent()->url()}' class='ipsButton ipsButton--small ipsButton--inherit'><i class="fa-solid fa-arrow-left-long"></i><span>{$category->parent()->_title}</span></a>
|
|
</div>
|
|
<hr class='ipsHr'>
|
|
<h4 class='ipsSideMenu__title'>{$category->parent()->_title}</h4>
|
|
<ul class='ipsSideMenu__list'>
|
|
{{foreach $siblings as $idx => $sibling}}
|
|
<li>
|
|
<a href='{$sibling->url()}' class='ipsSideMenu_item {{if $category && $category == $sibling}}ipsSideMenu_itemActive{{endif}}'><span class='ipsSideMenu__toggle'></span class='ipsSideMenu__text'>{$sibling->_title}</a>
|
|
{{if $sibling instanceof \IPS\nexus\Package\Group && $sibling->hasSubgroups()}}
|
|
<ul class='ipsSideMenu__list'>
|
|
{{$cidx = 0;}}
|
|
{{foreach $sibling->children( 'view', NULL, FALSE ) as $child}}
|
|
{{if $child->hasPackages( NULL, array(), TRUE ) OR $child->hasSubgroups()}}
|
|
{{$cidx++;}}
|
|
<li>
|
|
{{if $cidx >= 5}}
|
|
<a href='{$sibling->url()}' class='ipsSideMenu_item'><span class='i-color_soft i-font-size_-2'>{lang="and_x_more" pluralize="\count( $sibling->children( 'view', NULL, FALSE ) ) - 5"}</span></a>
|
|
{{break;}}
|
|
{{else}}
|
|
<a href="{$child->url()}" class='ipsSideMenu_item'><span class='ipsSideMenu__toggle'></span><span class='ipsSideMenu__text'>{$child->_title}</span></a>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
{{else}}
|
|
<div class='ipsSideMenu ipsSideMenu--truncate ipsSideMenu--pseudoRadios' id='elCategories_menu'>
|
|
<h3 class='ipsSideMenu__view'>
|
|
<a href='#elCategories_menu' data-action='openSideMenu'><i class='fa-solid fa-bars'></i><span>{lang="categories"}</span></a>
|
|
</h3>
|
|
<div class="ipsSideMenu__menu">
|
|
<ul class='ipsSideMenu__list'>
|
|
{{foreach \IPS\nexus\Package\Group::rootsWithViewablePackages() as $group}}
|
|
<li>
|
|
<a href='{$group->url()}' class='ipsSideMenu_item {{if $category && $category == $group}}ipsSideMenu_itemActive{{endif}}'><span class='ipsSideMenu__toggle'></span><span class='ipsSideMenu__text'>{$group->_title}</span></a>
|
|
{{if $group->hasSubgroups()}}
|
|
<ul class='ipsSideMenu__list'>
|
|
{{$idx = 0;}}
|
|
{{foreach $group->children( 'view', NULL, FALSE ) as $child}}
|
|
{{if $child->hasPackages( NULL, array(), TRUE ) OR $child->hasSubgroups()}}
|
|
{{$idx++;}}
|
|
<li>
|
|
{{if $idx >= 5}}
|
|
<a href='{$group->url()}' class='ipsSideMenu_item'><span class='i-color_soft i-font-size_-2'>{lang="and_x_more" pluralize="\count( $group->children( 'view', NULL, FALSE ) ) - 5"}</span></a>
|
|
{{break;}}
|
|
{{else}}
|
|
<a href="{$child->url()}" class='ipsSideMenu_item'><span class='ipsSideMenu__toggle'></span><span class='ipsSideMenu__text'>{$child->_title}</span></a>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if $category and ( $havePackages or request.filter or request.minPrice or request.maxPrice or request.minRating or request.inStock )}}
|
|
<div class='ipsWidget' id='elNexusFiltersBox'>
|
|
|
|
<h2 class='ipsWidget__header'>
|
|
{lang="store_filter_by"}
|
|
{{if request.filter or request.minPrice or request.maxPrice or request.minRating or request.inStock}}
|
|
<a href="{$category->url()}" data-action="filter" class="ipsWidget__header-secondary">{lang="store_clear_filters"}</a>
|
|
{{endif}}
|
|
</h2>
|
|
<div class='ipsWidget__content i-padding_2'>
|
|
{{foreach $category->filters( \IPS\Member::loggedIn()->language() ) as $filterId => $values}}
|
|
<div class="ipsSideMenu ipsSideMenu--truncate ipsSideMenu--pseudoRadios">
|
|
<h4 class='ipsSideMenu__title'>{lang="nexus_product_filter_{$filterId}_public"}</h4>
|
|
<ul class='ipsSideMenu__list'>
|
|
{{foreach $values as $valueId => $value}}
|
|
<li>
|
|
{{$active = ( isset( request.filter[ $filterId ] ) and \in_array( $valueId, explode( ',', request.filter[ $filterId ] ) ) );}}
|
|
<a data-action="filter" href='{{if $active}}{$url->setQueryString( 'filter', \IPS\nexus\Package\Filter::queryString( \IPS\Request::i()->filter, $filterId, NULL, $valueId ) )}{{else}}{$url->setQueryString( 'filter', \IPS\nexus\Package\Filter::queryString( ( \IPS\Request::i()->filter ?? array() ), $filterId, $valueId ) )}{{endif}}' class='ipsSideMenu_item {{if $active}}ipsSideMenu_itemActive{{endif}}'>
|
|
<span class="ipsSideMenu__toggle"></span>
|
|
<span class='ipsSideMenu__text'>{$value}</span>
|
|
</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
{{endforeach}}
|
|
<div class="ipsSideMenu ipsSideMenu--truncate ipsSideMenu--pseudoRadios">
|
|
<h4 class='ipsSideMenu__title'>{lang="price"}</h4>
|
|
<ul class='ipsSideMenu__list'>
|
|
{{$haveCategoryPriceFilters = ( $category->price_filters and $priceFilters = json_decode( $category->price_filters, TRUE ) and isset( $priceFilters[ $currency ] ) and \count( $priceFilters[ $currency ] ) ); $lastAmount = 0; $activePriceFilter = FALSE;}}
|
|
{{if $haveCategoryPriceFilters}}
|
|
{{foreach $priceFilters[ $currency ] as $amount}}
|
|
<li>
|
|
{{if $lastAmount}}
|
|
{{if request.minPrice and request.maxPrice and request.minPrice == $lastAmount and request.maxPrice == $amount}}
|
|
{{$activePriceFilter = TRUE;}}
|
|
<a data-action="filter" href='{$url->setQueryString( 'minPrice', NULL )->setQueryString( 'maxPrice', NULL )}' class='ipsSideMenu_item ipsSideMenu_itemActive'>
|
|
{{else}}
|
|
<a data-action="filter" href='{$url->setQueryString( 'minPrice', $lastAmount )->setQueryString( 'maxPrice', $amount )}' class='ipsSideMenu_item'>
|
|
{{endif}}
|
|
<span class="ipsSideMenu__toggle"></span>
|
|
<span class='ipsSideMenu__text'>{money="$lastAmount" currency="$currency"}–{money="$amount" currency="$currency"}</span>
|
|
</a>
|
|
{{else}}
|
|
{{if request.maxPrice and request.maxPrice == $amount and !request.minPrice}}
|
|
{{$activePriceFilter = TRUE;}}
|
|
<a data-action="filter" href='{$url->setQueryString( 'maxPrice', NULL )->setQueryString( 'minPrice', NULL )}' class='ipsSideMenu_item ipsSideMenu_itemActive'>
|
|
{{else}}
|
|
<a data-action="filter" href='{$url->setQueryString( 'maxPrice', $amount )->setQueryString( 'minPrice', NULL )}' class='ipsSideMenu_item'>
|
|
{{endif}}
|
|
<span class="ipsSideMenu__toggle"></span>
|
|
<span class='ipsSideMenu__text'>{money="0" currency="$currency"}–{money="$amount" currency="$currency"}</span>
|
|
</a>
|
|
{{endif}}
|
|
</li>
|
|
{{$lastAmount = $amount;}}
|
|
{{endforeach}}
|
|
<li>
|
|
{{if request.minPrice and request.minPrice == $lastAmount and !request.maxPrice}}
|
|
{{$activePriceFilter = TRUE;}}
|
|
<a data-action="filter" href='{$url->setQueryString( 'minPrice', NULL )->setQueryString( 'maxPrice', NULL )}' class='ipsSideMenu_item ipsSideMenu_itemActive'>
|
|
{{else}}
|
|
<a data-action="filter" href='{$url->setQueryString( 'minPrice', $lastAmount )->setQueryString( 'maxPrice', NULL )}' class='ipsSideMenu_item'>
|
|
{{endif}}
|
|
<span class="ipsSideMenu__toggle"></span>
|
|
<span class='ipsSideMenu__text'>{money="$lastAmount" currency="$currency"}+</span>
|
|
</a>
|
|
</li>
|
|
{{endif}}
|
|
{{if !$activePriceFilter and ( request.minPrice or request.maxPrice )}}
|
|
<li>
|
|
<a data-action="filter" href='{$url->setQueryString( 'minPrice', NULL )->setQueryString( 'maxPrice', NULL )}' class='ipsSideMenu_item ipsSideMenu_itemActive'>
|
|
<span class="ipsSideMenu__toggle"></span>
|
|
{{if request.minPrice and request.maxPrice}}
|
|
{money="\IPS\Request::i()->minPrice" currency="$currency"}–{money="\IPS\Request::i()->maxPrice" currency="$currency"}
|
|
{{elseif request.minPrice}}
|
|
{money="\IPS\Request::i()->minPrice" currency="$currency"}+
|
|
{{else}}
|
|
{money="0" currency="$currency"}–{money="\IPS\Request::i()->maxPrice" currency="$currency"}
|
|
{{endif}}
|
|
</a>
|
|
</li>
|
|
{{endif}}
|
|
<li>
|
|
<a href='{$url->setQueryString( 'do', 'priceFilter' )}' data-ipsDialog data-ipsDialog-size="narrow" data-ipsDialog-title="{lang="price_filter_set"}" class='ipsSideMenu_item'>
|
|
<span class="ipsSideMenu__toggle"></span>
|
|
<span class='ipsSideMenu__text'>{lang="custom_price_filter"}</span>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
{{if $havePackagesWhichAcceptReviews}}
|
|
<div class="ipsSideMenu ipsSideMenu--truncate ipsSideMenu--pseudoRadios">
|
|
<h4 class='ipsSideMenu__title'>{lang="minRating"}</h4>
|
|
<ul class='ipsSideMenu__list'>
|
|
{{foreach range( 5, 1 ) as $minRating}}
|
|
<li>
|
|
<a data-action="filter" href="{$url->setQueryString( 'minRating', \IPS\Request::i()->minRating == $minRating ? NULL : $minRating )}" class='ipsSideMenu_item {{if request.minRating and request.minRating == $minRating}}ipsSideMenu_itemActive{{endif}}'>
|
|
<span class="ipsSideMenu__toggle"></span>
|
|
<span class='ipsSideMenu__text'>{template="rating" group="global" app="core" params="'large', $minRating, \IPS\Settings::i()->reviews_rating_out_of"}</span>
|
|
</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
{{if $havePackagesWhichUseStockLevels}}
|
|
<div class="ipsSideMenu ipsSideMenu--truncate ipsSideMenu--pseudoRadios">
|
|
<h4 class='ipsSideMenu__title'>{lang="nexus_stock"}</h4>
|
|
<ul class='ipsSideMenu__list'>
|
|
<li>
|
|
<a data-action="filter" href="{$url->setQueryString( 'inStock', \IPS\Request::i()->inStock ? NULL : 1 )}" class='ipsSideMenu_item {{if request.inStock}}ipsSideMenu_itemActive{{endif}}'>
|
|
<span class="ipsSideMenu__toggle"></span>
|
|
<span class='ipsSideMenu__text'>{lang="in_stock_only"}</span>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
|
|
{template="chooseCurrency" group="store" params="$category ? $category->url() : \IPS\Http\Url::internal('app=nexus&module=store&controller=store', 'front', 'store')"}
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="chooseCurrency" template_data="$baseUrl" template_location="front" template_app="nexus"><![CDATA[{{if \count( \IPS\nexus\Money::currencies() ) > 1}}
|
|
{{$memberCurrency = ( ( isset( \IPS\Request::i()->cookie['currency'] ) and \in_array( \IPS\Request::i()->cookie['currency'], \IPS\nexus\Money::currencies() ) ) ? \IPS\Request::i()->cookie['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency() );}}
|
|
<div class='i-text-align_center ipsBox i-padding_3 i-margin-top_2' {{if isset( $_SESSION['cart'] ) and \count( $_SESSION['cart'] )}}data-controller="nexus.front.store.currencySelect"{{endif}}>
|
|
<span>{lang="show_prices_in"}</span><br>
|
|
<form action="{$baseUrl}" method="post">
|
|
<input type="hidden" name="csrfKey" value="{expression="\IPS\Session::i()->csrfKey"}">
|
|
<ul class='ipsButtons i-link-color_inherit i-margin-top_2'>
|
|
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
|
<li>
|
|
{{if $currency == $memberCurrency}}
|
|
<button type="submit" name="currency" value="{$currency}" class='ipsButton ipsButton--primary ipsButton--small'><i class='fa fa-check'></i> {$currency}</button>
|
|
{{else}}
|
|
<button type="submit" name="currency" value="{$currency}" class='ipsButton ipsButton--soft ipsButton--small' title='{lang="set_currency_to" sprintf="$currency"}'> {$currency}</button>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</form>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="store" template_name="fraudRuleDesc" template_data="$conditions, $results, $warning" template_location="admin" template_app="nexus"><![CDATA[<div class="i-margin-top_1">
|
|
{{for $i = 0; $i < \count( $conditions ); $i++}}
|
|
{$conditions[ $i ]}{{if $i != ( \count( $conditions ) - 1 )}}{lang="f_blurb_join"}<br>{{endif}}
|
|
{{endfor;}}
|
|
<br>
|
|
{{for $i = 0; $i < \count( $results ); $i++}}
|
|
{$results[ $i ]}{{if $i != ( \count( $results ) - 1 )}}{lang="f_blurb_join"}<br>{{endif}}
|
|
{{endfor;}}
|
|
</div>
|
|
{{if $warning}}
|
|
<div class="i-color_warning i-margin-top_1"><i class="fa-solid fa-circle-exclamation"></i> {lang="fraud_rule_conflict" sprintf="$warning->_title"}</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="store" template_name="giftCard" template_data="$form" template_location="front" template_app="nexus"><![CDATA[<header class="ipsPageHeader">
|
|
<div class="ipsPageHeader__row">
|
|
<div class="ipsPageHeader__primary">
|
|
<h1 class="ipsPageHeader__title">
|
|
{lang="buy_gift_voucher"}
|
|
</h1>
|
|
</div>
|
|
<ul class="ipsButtons">
|
|
<li>
|
|
<a href="{url="app=nexus&module=store&controller=gifts&do=redeem" seoTemplate="store_giftvouchers_redeem"}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="redeem_gift_voucher"}' class='ipsButton ipsButton--primary'>{lang="redeem_gift_voucher"}</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</header>
|
|
|
|
<div class='ipsBox ipsBox--padding' data-controller='nexus.front.store.giftCard' data-formatCurrencyUrl="{url="app=nexus&module=store&controller=gifts&do=formatCurrency"}">
|
|
{$form|raw}
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="giftCardForm" template_data="$id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar=NULL, $form=NULL" template_location="front" template_app="nexus"><![CDATA[{{if $form->error}}
|
|
<div class="ipsMessage ipsMessage--error i-margin-bottom_3">
|
|
{$form->error}
|
|
</div>
|
|
{{endif}}
|
|
<form accept-charset='utf-8' class="ipsFormWrap ipsFormWrap--gift-card" action="{$action}" method="post" {{if $uploadField}}enctype="multipart/form-data"{{endif}} data-ipsForm>
|
|
<input type="hidden" name="{$id}_submitted" value="1">
|
|
{{foreach $hiddenValues as $k => $v}}
|
|
<input type="hidden" name="{$k}" value="{$v}">
|
|
{{endforeach}}
|
|
{{if $uploadField}}
|
|
<input type="hidden" name="MAX_FILE_SIZE" value="{$uploadField}">
|
|
<input type="hidden" name="plupload" value="{expression="md5( mt_rand() )"}">
|
|
{{endif}}
|
|
<div class='ipsSpanGrid'>
|
|
<div class='ipsSpanGrid__6'>
|
|
<div class="ipsColumns cNexusStep_block">
|
|
<div class="ipsColumns__secondary i-basis_50">
|
|
<span class="cNexusStep_step">1</span>
|
|
</div>
|
|
<div class="ipsColumns__primary">
|
|
<h2 class="ipsTitle ipsTitle--h3">{lang="gift_voucher_personalize"}</h2>
|
|
<p>
|
|
{lang="gift_voucher_personalize_desc"}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<hr class='ipsHr'>
|
|
<ul class='ipsForm {$class} ipsForm--vertical ipsForm--gift-card'>
|
|
<li class="ipsFieldRow">
|
|
<div class="ipsFieldRow__content">
|
|
<input type='hidden' name='gift_voucher_color' value='{expression="str_replace( '#', '', $elements['']['gift_voucher_color']->value )"}'>
|
|
<ul class='ipsList ipsList--inline i-gap_0 cNexusGiftcard_swatches'>
|
|
<li class='i-background_2'><a href='#' data-color='3b3b3b' style='background-color: #3b3b3b'> </a></li>
|
|
<li class='i-background_2'><a href='#' data-color='16a085' style='background-color: #16a085'> </a></li>
|
|
<li class='i-background_2'><a href='#' data-color='27ae60' style='background-color: #27ae60'> </a></li>
|
|
<li class='i-background_2'><a href='#' data-color='2980b9' style='background-color: #2980b9'> </a></li>
|
|
<li class='i-background_2'><a href='#' data-color='2c3e50' style='background-color: #2c3e50'> </a></li>
|
|
<li class='i-background_2'><a href='#' data-color='8e44ad' style='background-color: #8e44ad'> </a></li>
|
|
<li class='i-background_2'><a href='#' data-color='f39c12' style='background-color: #f39c12'> </a></li>
|
|
<li class='i-background_2'><a href='#' data-color='d35400' style='background-color: #d35400'> </a></li>
|
|
<li class='i-background_2'><a href='#' data-color='c0392b' style='background-color: #c0392b'> </a></li>
|
|
<li class='i-background_2'><a href='#' data-color='7f8c8d' style='background-color: #7f8c8d'> </a></li>
|
|
</ul>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
<div id='elNexusGiftcard' class='ipsInnerBox i-margin-top_3' data-role='giftCardArea'>
|
|
<div id='elNexusGiftcard_card' data-role='giftCard'>
|
|
<span data-role='icon'><i class='fa-solid fa-gift'></i></span>
|
|
<h2>{lang="gift_voucher"}</h2>
|
|
<strong data-role='siteName'>{setting="board_name"}</strong>
|
|
<strong data-role='value' class='cNexusGiftcard_content'></strong>
|
|
<span data-role='redeem' class='cNexusGiftcard_redeem ipsResponsive_hidePhone'>{lang="gift_voucher_redeem"}</span>
|
|
</div>
|
|
<div class='i-padding_3' id='elNexusGiftcard_personalize'>
|
|
<div class='cNexusGiftcard_content' data-role='to'>
|
|
{lang="to"} <input type='text' class='ipsInput ipsInput--text' name='gift_voucher_recipient' value='{$elements['']['gift_voucher_recipient']->value}' placeholder="{lang="gift_voucher_recipient"}">,
|
|
</div>
|
|
<div class='cNexusGiftcard_content i-margin-block_2' data-role='message'>
|
|
<textarea class='ipsInput ipsInput--text' name='gift_voucher_message' rows='3' placeholder='{lang="gift_voucher_message"}'>{$elements['']['gift_voucher_message']->value}</textarea>
|
|
</div>
|
|
<div class='cNexusGiftcard_content'>{lang="from"} <input type='text' class='ipsInput ipsInput--text' name='gift_voucher_sender' value='{$elements['']['gift_voucher_sender']->value}' placeholder='{lang="gift_voucher_sender"}'></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class='ipsSpanGrid__6'>
|
|
<div class="ipsColumns cNexusStep_block ">
|
|
<div class="ipsColumns__secondary i-basis_50">
|
|
<span class="cNexusStep_step">2</span>
|
|
</div>
|
|
<div class="ipsColumns__primary">
|
|
<h2 class="ipsTitle ipsTitle--h3">{lang="gift_voucher_choose_amount"}</h2>
|
|
<p>
|
|
{lang="gift_voucher_choose_amount_desc"}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<hr class='ipsHr'>
|
|
<ul class='ipsForm ipsForm--vertical ipsForm--gift-card-summary'>
|
|
{{foreach $elements as $collection}}
|
|
{{foreach $collection as $inputName => $input}}
|
|
{{if !\in_array( $inputName, array( 'gift_voucher_color', 'gift_voucher_recipient', 'gift_voucher_message', 'gift_voucher_sender') )}}
|
|
{$input|raw}
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endforeach}}
|
|
</ul>
|
|
|
|
<div class='i-text-align_start i-margin-top_3'>
|
|
<button type='submit' class='ipsButton ipsButton--primary'>{lang="add_gift_voucher_to_cart"}</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>]]></template>
|
|
<template template_group="store" template_name="index" template_data="$credits, $newProducts, $popularProducts" template_location="front" template_app="nexus"><![CDATA[
|
|
{template="pageHeader" group="global" app="core" params="\IPS\Member::loggedIn()->language()->addToStack('store')"}
|
|
|
|
{{if $credits->amount->isGreaterThanZero()}}
|
|
<div class='ipsMessage ipsMessage--info'>
|
|
{lang="store_credit_message" sprintf="$credits"}
|
|
</div>
|
|
{{endif}}
|
|
|
|
<section class='ipsBox ipsBox--commerceCategories ipsPull'>
|
|
<header class='ipsBox__header'>
|
|
<h2>{lang="categories"}</h2>
|
|
{template="carouselNavigation" group="global" app="core" params="'carousel--commerce-categories'"}
|
|
</header>
|
|
<nav class='ipsBox__content'>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--wallpaper ipsData--carousel ipsData--commerceCategories' id='carousel--commerce-categories' tabindex="0">
|
|
{{foreach \IPS\nexus\Package\Group::rootsWithViewablePackages() as $group}}
|
|
<li class="ipsData__item">
|
|
<a href='{$group->url()}' class='ipsLinkPanel' aria-hidden="true" tabindex="-1"><span>{$group->_title}</span></a>
|
|
<div class="ipsData__image" aria-hidden="true">
|
|
{{if $group->image}}
|
|
<img src='{expression="str_replace( array( '(', ')' ), array( '\(', '\)' ), $group->image )"}' alt='' loading='lazy'>
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsData__content">
|
|
<div class="ipsData__main">
|
|
<h3 class="ipsData__title">{$group->_title}</h3>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</nav>
|
|
</section>
|
|
|
|
{{if \count( \IPS\nexus\Package\Item::featured() )}}
|
|
<section class='ipsBox ipsBox--commerceFeaturedProducts ipsPull'>
|
|
<header class='ipsBox__header'>
|
|
<h2>{lang="featured_products"}</h2>
|
|
{template="carouselNavigation" group="global" app="core" params="'carousel--commerce-featured'"}
|
|
</header>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--grid ipsData--carousel ipsData--commerce-featured ipsBox__content' id='carousel--commerce-featured' tabindex="0">
|
|
{{foreach \IPS\nexus\Package\Item::featured() as $package}}
|
|
{template="packageBlock" group="store" params="$package, 'carousel'"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</section>
|
|
{{endif}}
|
|
|
|
{{if \count( $newProducts )}}
|
|
<section class='ipsBox ipsBox--commerceNewProducts ipsPull'>
|
|
<header class='ipsBox__header'>
|
|
<h2>{lang="new_products"}</h2>
|
|
{template="carouselNavigation" group="global" app="core" params="'carousel--commerce-new'"}
|
|
</header>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--grid ipsData--carousel ipsData--commerce-new ipsBox__content' id='carousel--commerce-new' tabindex="0">
|
|
{{foreach $newProducts as $package}}
|
|
{template="packageBlock" group="store" params="$package, 'carousel'"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</section>
|
|
{{endif}}
|
|
|
|
{{if \count( $popularProducts )}}
|
|
<section class='ipsBox ipsBox--commercePopularProducts ipsPull'>
|
|
<header class='ipsBox__header'>
|
|
<h2>{lang="popular_products"}</h2>
|
|
{template="carouselNavigation" group="global" app="core" params="'carousel--commerce-popular'"}
|
|
</header>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--grid ipsData--carousel ipsData--commerce-popular i-basis_300 ipsBox__content' id='carousel--commerce-popular' tabindex="0">
|
|
{{foreach $popularProducts as $package}}
|
|
{template="packageBlock" group="store" params="$package, 'carousel'"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</section>
|
|
{{endif}}]]></template>
|
|
<template template_group="store" template_name="package" template_data="$package, $item, $purchaseForm, $inCart, $renewalTerm, $initialTerm" template_location="front" template_app="nexus"><![CDATA[
|
|
<div class='ipsBox ipsBox--commercePackage ipsPull'>
|
|
<section class='cNexusProduct_header ipsFluid i-basis_400 i-gap_lines' data-controller='nexus.front.store.packagePage' data-itemTitle="{$package->_title}">
|
|
{{if $images = $item->images() and \count( $images )}}
|
|
<div class='i-background_2'>
|
|
{{$donePrimary = false;}}
|
|
{{foreach $images as $image}}
|
|
{{if !$donePrimary}}
|
|
<a href='{$image}' class='cNexusProduct_primaryImage' data-ipsLightbox data-ipsLightbox-group='product' style='background-image:url("{$image}")'><img src='{$image}' alt=''></a>
|
|
{{$donePrimary = true;}}
|
|
{{endif}}
|
|
{{endforeach}}
|
|
<div class='cNexusProduct_images'>
|
|
<ul class='ipsCarousel ipsCarousel--images ipsCarousel--commerce-product-images' id="carousel--commerce-product-images" tabindex="0">
|
|
{{foreach $images as $image}}
|
|
<li>
|
|
<a href='{$image}' data-action='toggleImage'><img src='{$image}' alt='' loading='lazy'></a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{template="carouselNavigation" group="global" app="core" params="'carousel--commerce-product-images'"}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
<div class='i-padding_3'>
|
|
<div class='i-flex i-align-items_center i-justify-content_space-between i-flex-wrap_wrap i-gap_2'>
|
|
<h1 class='ipsTitle ipsTitle--h1'>{$item->mapped('title')}</h1>
|
|
{{if $package->reviewable}}
|
|
<div>
|
|
{template="rating" group="global" app="core" params="'large', $item->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $item->memberReviewRating()"} <span class='i-color_soft'>({lang="num_reviews" pluralize="$item->reviews"})</span>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
|
|
{{$priceDetails = $package->fullPriceInfo();}}
|
|
{{if $priceDetails === NULL}}
|
|
<div>
|
|
<em class='cNexusPrice_tax i-color_soft'>{lang="nexus_no_price_info_desc"}</em>
|
|
</div>
|
|
{{elseif $priceDetails['initialTerm']}}
|
|
<ul class='i-flex i-align-items_center i-flex-wrap_wrap i-gap_3'>
|
|
<li>
|
|
<div><span data-role="initialTerm">{lang="package_initial_term_title" sprintf="$priceDetails['initialTerm']"}</span></div>
|
|
<span class="cNexusPrice">
|
|
<span data-role="price">
|
|
{$priceDetails['primaryPrice']}
|
|
{{if $priceDetails['primaryPriceDiscountedFrom']}}
|
|
<s>{$priceDetails['primaryPriceDiscountedFrom']}</s>
|
|
{{endif}}
|
|
</span>
|
|
</span>
|
|
{{if !$priceDetails['primaryPriceIsZero'] and \IPS\Member::loggedIn()->language()->checkKeyExists('nexus_tax_explain_val')}}<span class='cNexusPrice_tax i-color_soft'>{lang="nexus_tax_explain_val"}</span>{{endif}}
|
|
</li>
|
|
{{if $priceDetails['renewalPrice']}}
|
|
<li>
|
|
<div>{lang="package_subsequent_term_title"}</div>
|
|
<span class="cNexusPrice">
|
|
<span data-role="renewalTerm">
|
|
{$priceDetails['renewalPrice']}
|
|
</span>
|
|
</span>
|
|
{{if \IPS\Member::loggedIn()->language()->checkKeyExists('nexus_tax_explain_val')}}<span class='cNexusPrice_tax i-color_soft'>{lang="nexus_tax_explain_val"}</span>{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
{{else}}
|
|
<span class="cNexusPrice">
|
|
{{if $priceDetails['renewalPrice']}}
|
|
<span data-role="renewalTerm">
|
|
{$priceDetails['renewalPrice']}
|
|
</span>
|
|
{{else}}
|
|
<span data-role="price">
|
|
{$priceDetails['primaryPrice']}
|
|
{{if $priceDetails['primaryPriceDiscountedFrom']}}
|
|
<s>{$priceDetails['primaryPriceDiscountedFrom']}</s>
|
|
{{endif}}
|
|
</span>
|
|
{{endif}}
|
|
</span>
|
|
{{if \IPS\Member::loggedIn()->language()->checkKeyExists('nexus_tax_explain_val')}}<span class='cNexusPrice_tax i-color_soft'>{lang="nexus_tax_explain_val"}</span>{{endif}}
|
|
{{endif}}
|
|
|
|
{{if settings.nexus_show_stock and $package->stock != -1}}
|
|
<br><span data-role="stock">{{if $package->stock == -2}}{{else}}{lang="x_in_stock" pluralize="$package->stock - $inCart"}{{endif}}</span>
|
|
{{endif}}
|
|
|
|
{template="richText" group="global" app="core" location="global" params="$package->description, array('i-margin-top_3')"}
|
|
|
|
<div class='i-background_2 i-border-radius_box i-margin-block_3'>
|
|
{$purchaseForm|raw}
|
|
</div>
|
|
|
|
{{if \count( $item->shareLinks() )}}
|
|
{template="shareButton" app="core" group="sharelinks" params="$item"}
|
|
{{endif}}
|
|
</div>
|
|
</section>
|
|
</div>
|
|
|
|
{{if $package->reviewable}}
|
|
<section class="ipsBox ipsBox--packageReviews ipsPull">
|
|
<h2 class="ipsBox__header">{lang="product_reviews_pl"}</h2>
|
|
<div class="ipsBox__content">
|
|
{template="reviews" group="store" app="nexus" params="$item"}
|
|
</div>
|
|
</section>
|
|
{{endif}}]]></template>
|
|
<template template_group="store" template_name="packageBlock" template_data="$package, $layout='grid', $isCarousel=false" template_location="front" template_app="nexus"><![CDATA[
|
|
<li class='ipsData__item {$package->ui( "css" )}' {$package->ui( 'dataAttributes' )}>
|
|
<a href='{$package->url()}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$package->_title}</span></a>
|
|
<a href='{$package->url()}' class='ipsData__image' aria-hidden="true" tabindex="-1">
|
|
{{if $package->image}}
|
|
<img src="{$package->image}" alt='{$package->_title}' loading='lazy'>
|
|
{{else}}
|
|
<i class="fa-solid fa-box-open"></i>
|
|
{{endif}}
|
|
</a>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class="ipsData__title">
|
|
<h3>
|
|
<a href="{$package->url()}" data-role='productLink'>{$package->_title}</a>
|
|
</h3>
|
|
</div>
|
|
{template="packageBlockPrice" app="nexus" group="store" params="$package->fullPriceInfo()"}
|
|
{{$stockLevel = $package->stockLevel();}}
|
|
{{if $stockLevel === 0}}
|
|
<span class='ipsCommerceStock ipsCommerceStock--out'>{lang="out_of_stock"}</span>
|
|
{{else}}
|
|
<span class='ipsCommerceStock ipsCommerceStock--in'>
|
|
{{if $stockLevel and settings.nexus_show_stock}}
|
|
{lang="x_in_stock" pluralize="$stockLevel"}
|
|
{{else}}
|
|
{lang="in_stock"}
|
|
{{endif}}
|
|
</span>
|
|
{{endif}}
|
|
{{if $package->reviewable}}
|
|
<div class='i-margin-top_2'>
|
|
{template="rating" group="global" app="core" params="'medium', $package->item()->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $package->item()->memberReviewRating()"}
|
|
<span class='i-color_soft'>({$package->item()->reviews})</span>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="store" template_name="packageBlockPrice" template_data="$details" template_location="front" template_app="nexus"><![CDATA[<div class='ipsCommercePrices'>
|
|
{{if $details === NULL}}
|
|
<div hidden>
|
|
<small class='ipsCommercePrice__tax'>{lang="nexus_no_price_info"}</small>
|
|
</div>
|
|
|
|
{{elseif $details['primaryPriceIsZero'] AND $details['initialTerm']}}
|
|
|
|
<div>
|
|
<span class="ipsCommercePrice">{$details['renewalPrice']}</span>
|
|
{{if \IPS\Member::loggedIn()->language()->checkKeyExists('nexus_tax_explain_val')}}
|
|
<small class='ipsCommercePrice__tax'>{lang="nexus_tax_explain_val"}</small>
|
|
{{endif}}
|
|
</div>
|
|
<div>
|
|
{$details['primaryPrice']}
|
|
{{if $details['initialTerm']}}
|
|
{lang="package_initial_term" sprintf="$details['initialTerm']"}
|
|
{{endif}}
|
|
</div>
|
|
|
|
{{else}}
|
|
|
|
<div>
|
|
<span class="ipsCommercePrice">
|
|
{$details['primaryPrice']}
|
|
{{if $details['primaryPriceDiscountedFrom']}}
|
|
<s>{$details['primaryPriceDiscountedFrom']}</s>
|
|
{{endif}}
|
|
</span>
|
|
{{if !$details['primaryPriceIsZero'] and \IPS\Member::loggedIn()->language()->checkKeyExists('nexus_tax_explain_val')}}
|
|
<small class='ipsCommercePrice__tax'>{lang="nexus_tax_explain_val"}</small>
|
|
{{endif}}
|
|
{{if $details['initialTerm']}}
|
|
<span>{lang="package_initial_term" sprintf="$details['initialTerm']"}</span><br>
|
|
{{endif}}
|
|
</div>
|
|
{{if $details['initialTerm']}}
|
|
<div>
|
|
<span class="ipsCommercePrice">{$details['renewalPrice']}</span>
|
|
{{if \IPS\Member::loggedIn()->language()->checkKeyExists('nexus_tax_explain_val')}}
|
|
<small class='ipsCommercePrice__tax'>{lang="nexus_tax_explain_val"}</small>
|
|
{{endif}}
|
|
<span>{lang="package_subsequent_term"}</span>
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="packageBlockWidget" template_data="$package, $mini=FALSE, $showAddToCart=FALSE" template_location="front" template_app="nexus"><![CDATA[<li class="ipsData__item cNexusWidgetProduct {{if $mini}}cNexusProduct_mini{{endif}}">
|
|
<a href="{$package->url()}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$package->_title}</span></a>
|
|
<a href='{$package->url()}' class='ipsData__image' aria-hidden="true" tabindex="-1">
|
|
{{if $package->image}}
|
|
<img src="{$package->image}" alt='{$package->_title}' loading='lazy'>
|
|
{{else}}
|
|
<i class="fa-solid fa-box-open"></i>
|
|
{{endif}}
|
|
</a>
|
|
<div class="ipsData__content">
|
|
<div class='ipsData__main'>
|
|
<h2 class='ipsData__title'>
|
|
<a href="{$package->url()}" data-role='productLink'>{$package->_title}</a>
|
|
</h2>
|
|
{template="packageBlockPrice" app="nexus" group="store" params="$package->fullPriceInfo()"}
|
|
{{$stockLevel = $package->stockLevel();}}
|
|
{{if $stockLevel === 0}}
|
|
<span class='ipsCommerceStock ipsCommerceStock--out'>{lang="out_of_stock"}</span>
|
|
{{else}}
|
|
<span class='ipsCommerceStock ipsCommerceStock--in'>
|
|
{{if $stockLevel and settings.nexus_show_stock}}
|
|
{lang="x_in_stock" pluralize="$stockLevel"}
|
|
{{else}}
|
|
{lang="in_stock"}
|
|
{{endif}}
|
|
</span>
|
|
{{endif}}
|
|
{{if $package->reviewable}}
|
|
<div class="i-flex i-gap_1 i-align-items_baseline">
|
|
{template="rating" group="global" app="core" params="'small', $package->item()->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of"}
|
|
<span class='i-color_soft i-font-weight_500 i-font-size_-1'>({$package->item()->reviews})</span>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="store" template_name="packageRow" template_data="$package, $hasCustomFields=FALSE" template_location="front" template_app="nexus"><![CDATA[
|
|
<li class='ipsData__item {$package->ui( 'css' )}' {$package->ui( 'dataAttributes' )}>
|
|
<a href='{$package->url()}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$package->_title}</span></a>
|
|
<a href='{$package->url()}' class='ipsData__image cNexusProduct_image' aria-hidden="true" tabindex="-1">
|
|
{{if $package->image}}
|
|
<img src="{$package->image}" alt="{$package->_title}" loading="lazy">
|
|
{{else}}
|
|
<span class='ipsIcon ipsIcon--fa' aria-hidden="true"><i class="fa-solid fa-box-open"></i></span>
|
|
{{endif}}
|
|
</a>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>
|
|
<h2><a href="{$package->url()}">{$package->_title}</a></h2>
|
|
{{if $package->featured}}<span class="ipsBadge ipsBadge--icon ipsBadge--positive" data-ipsTooltip title='{lang="featured"}'><i class='fa-solid fa-star'></i></span>{{endif}}
|
|
</div>
|
|
{template="packageBlockPrice" app="nexus" group="store" params="$package->fullPriceInfo()"}
|
|
<div class="ipsData__desc">{$package->description}</div>
|
|
{{if $package->reviewable}}
|
|
<div class='i-margin-top_2'>
|
|
{template="rating" group="global" app="core" params="'large', $package->item()->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $package->item()->memberReviewRating()"} <span class='i-color_soft'>({lang="num_reviews" pluralize="$package->item()->reviews"})</span>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
<div class="i-flex_00">
|
|
{{if $package->stock === 0}}
|
|
<span class='ipsButton ipsButton--primary' aria-disabled="true">{lang="out_of_stock"}</span>
|
|
{{else}}
|
|
<a href='{$package->url()->setQueryString( 'purchase', 1 )}' class='ipsButton ipsButton--primary' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title='{lang="store_quick_view"}' data-ipsDialog-forceReload data-ipsDialog-destructOnClose='true'>
|
|
<i class='fa-solid fa-cart-shopping'></i>
|
|
<span>
|
|
{{if $hasCustomFields}}
|
|
{lang="add_and_choose_options"}
|
|
{{else}}
|
|
{lang="add_to_cart"}
|
|
{{endif}}
|
|
</span>
|
|
</a>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="store" template_name="price" template_data="$price, $priceMayChange, $includePriceDescription=TRUE, $class='cNexusPrice'" template_location="front" template_app="nexus"><![CDATA[{{if $class !== NULL}}<span class='{$class}'>{{endif}}
|
|
{{if $priceMayChange}}
|
|
{lang="price_from" sprintf="$price"}
|
|
{{else}}
|
|
{$price}
|
|
{{endif}}
|
|
{{if $class !== NULL}}</span>{{endif}}
|
|
{{if $includePriceDescription and \IPS\Member::loggedIn()->language()->checkKeyExists('nexus_tax_explain_val')}}
|
|
<span class='{$class}_tax i-color_soft'>{lang="nexus_tax_explain_val"}</span>
|
|
{{endif}}]]></template>
|
|
<template template_group="store" template_name="priceDiscounted" template_data="$original, $discounted, $priceMayChange, $includePriceDescription=TRUE, $class='cNexusPrice'" template_location="front" template_app="nexus"><![CDATA[{{if $class !== NULL}}<span class='{$class}'>{{endif}}
|
|
{{if $priceMayChange}}
|
|
{lang="price_from" sprintf="$discounted"}
|
|
{{else}}
|
|
{$discounted}
|
|
{{endif}}
|
|
<s>{$original}</s>
|
|
{{if $class !== NULL}}</span>{{endif}}
|
|
{{if $includePriceDescription and \IPS\Member::loggedIn()->language()->checkKeyExists('nexus_tax_explain_val')}}
|
|
<span class='{$class}_tax i-color_soft'>{lang="nexus_tax_explain_val"}</span>
|
|
{{endif}}]]></template>
|
|
<template template_group="store" template_name="productDeleteWarning" template_data="$package, $active, $expiredRenewable, $expredNonRenewable, $canceledCanBeReactivated, $canceledCannotBeReactivated, $upgradeTo" template_location="admin" template_app="nexus"><![CDATA[<p class="ipsMessage ipsMessage--error i-font-size_2">{lang="product_delete_blurb"}</p>
|
|
<div class="ipsBox" data-ips-template="productDeleteWarning">
|
|
<h2 class="ipsBox__header">
|
|
{lang="product_delete_review"}
|
|
</h2>
|
|
<div class="i-padding_3">
|
|
<p>{lang="product_delete_review_desc"}</p>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--delete-review i-margin-top_1">
|
|
<li class="ipsData__item">
|
|
{{if $active}}
|
|
<div class="ipsData__icon i-color_warning i-font-size_2"><i class="fa-solid fa-xmark"></i></div>
|
|
<div class="i-color_warning">
|
|
{{else}}
|
|
<div class="ipsData__icon i-color_positive i-font-size_2"><i class="fa-solid fa-check"></i></div>
|
|
<div class="i-color_positive">
|
|
{{endif}}
|
|
{{if $expiredRenewable or $expredNonRenewable or $package->renew_options}}
|
|
{lang="product_count_active" pluralize="$active"}
|
|
{{else}}
|
|
{lang="product_count_purchases" pluralize="$active"}
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{if $expiredRenewable or $expredNonRenewable}}
|
|
<li class="ipsData__item">
|
|
{{if $expiredRenewable}}
|
|
<div class="ipsData__icon i-color_warning i-font-size_2"><i class="fa-solid fa-xmark"></i></div>
|
|
<div class="i-color_warning">
|
|
{{else}}
|
|
<div class="ipsData__icon i-color_positive i-font-size_2"><i class="fa-solid fa-check"></i></div>
|
|
<div class="i-color_positive">
|
|
{{endif}}
|
|
{lang="product_count_expired_split" pluralize="$expiredRenewable, $expredNonRenewable"}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{if $canceledCanBeReactivated or $canceledCannotBeReactivated}}
|
|
<li class="ipsData__item">
|
|
{{if $canceledCanBeReactivated}}
|
|
<div class="ipsData__icon i-color_warning i-font-size_2"><i class="fa-solid fa-xmark"></i></div>
|
|
<div class="i-color_warning">
|
|
{{else}}
|
|
<div class="ipsData__icon i-color_positive i-font-size_2"><i class="fa-solid fa-check"></i></div>
|
|
<div class="i-color_positive">
|
|
{{endif}}
|
|
{lang="product_count_canceled_split" pluralize="$canceledCanBeReactivated, $canceledCannotBeReactivated"}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</i-data>
|
|
<div class="i-margin-top_1">
|
|
<a href="{url="app=nexus&module=store&controller=packages&do=massManagePurchases&id={$package->_id}"}" class="ipsButton ipsButton--primary" data-ipsDialog data-ipsDialog-title="{$package->_title}">{lang="mass_change_all_purchases"}</a>
|
|
<a href="{url="app=nexus&module=store&controller=packages&do=viewPurchases&id={$package->_id}"}" class="ipsButton ipsButton--secondary">{lang="view_purchases"}</a>
|
|
</div>
|
|
<p class="i-margin-top_1">{lang="product_delete_review_complete"}</p>
|
|
</div>
|
|
</div>
|
|
<div class="ipsBox i-margin-top_1">
|
|
<h2 class="ipsBox__header">
|
|
{lang="product_delete_hide"}
|
|
</h2>
|
|
<div class="i-padding_3">
|
|
<p>{lang="product_delete_hide_desc"}</p>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--hide-product i-margin-top_1">
|
|
<li class="ipsData__item">
|
|
{{if $package->store}}
|
|
<div class="ipsData__icon i-color_warning i-font-size_2"><i class="fa-solid fa-xmark"></i></div>
|
|
<div class="i-color_warning">
|
|
{{else}}
|
|
<div class="ipsData__icon i-color_positive i-font-size_2"><i class="fa-solid fa-check"></i></div>
|
|
<div class="i-color_positive">
|
|
{{endif}}
|
|
{lang="product_delete_hide_1"}
|
|
</div>
|
|
</li>
|
|
<li class="ipsData__item">
|
|
{{if $package->reg}}
|
|
<div class="ipsData__icon i-color_warning i-font-size_2"><i class="fa-solid fa-xmark"></i></div>
|
|
<div class="i-color_warning">
|
|
{{else}}
|
|
<div class="ipsData__icon i-color_positive i-font-size_2"><i class="fa-solid fa-check"></i></div>
|
|
<div class="i-color_positive">
|
|
{{endif}}
|
|
{lang="product_delete_hide_2"}
|
|
</div>
|
|
</li>
|
|
<li class="ipsData__item">
|
|
{{if $upgradeTo}}
|
|
<div class="ipsData__icon i-color_warning i-font-size_2"><i class="fa-solid fa-xmark"></i></div>
|
|
<div class="i-color_warning">
|
|
{{else}}
|
|
<div class="ipsData__icon i-color_positive i-font-size_2"><i class="fa-solid fa-check"></i></div>
|
|
<div class="i-color_positive">
|
|
{{endif}}
|
|
{lang="product_delete_hide_3"}
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</i-data>
|
|
<div class="i-margin-top_1">
|
|
<a href="{url="app=nexus&module=store&controller=packages&subnode=1&do=form&id={$package->_id}"}" target="_blank" class="ipsButton ipsButton--primary">{lang="product_delete_edit"}</a>
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="productOptions" template_data="$input, $fields, $package" template_location="admin" template_app="nexus"><![CDATA[<li class="ipsFieldRow" id="{$input->htmlId}" data-controller="nexus.admin.store.productoptions" data-url="{url="app=nexus&module=store&controller=packages&do=productoptions&package={$package->id}"}">
|
|
<div class="ipsFieldRow__label">
|
|
{lang="p_stock_dynamic_fields"}
|
|
<span class="ipsFieldRow__required">{lang="required"}</span>
|
|
</div>
|
|
<div class="ipsFieldRow__content">
|
|
<ul class="ipsFieldList">
|
|
{{foreach $fields as $field}}
|
|
<li>
|
|
<input type="checkbox" class="ipsInput ipsInput--toggle" id="elCheckbox_{$input->name}_{$field->id}" data-role="field" data-id="{$field->id}" {{if \in_array( $field->id, $input->value )}}checked{{endif}} >
|
|
<div class='ipsFieldList__content'>
|
|
<label for='elCheckbox_{$input->name}_{$field->id}' id='elField_{$input->name}_label'>{$field->_title}</label>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
<div class="ipsFieldRow__desc">{lang="p_stock_dynamic_fields_desc"}</div>
|
|
<div class="ipsJS_show ipsBox i-margin-top_1" data-role='table'></div>
|
|
</div>
|
|
<noscript>
|
|
<p class="ipsMessage ipsMessage--error">{lang="p_stock_dynamic_fields_noscript"}</p>
|
|
</noscript>
|
|
</li>]]></template>
|
|
<template template_group="store" template_name="productOptionsChanged" template_data="$products" template_location="admin" template_app="nexus"><![CDATA[<p class="i-font-size_1">{lang="cm_fields_modified"}</p>
|
|
<div class="ipsTree_wrapper">
|
|
<div class="ipsTree_rows">
|
|
<ol class="ipsTree ipsTree_node">
|
|
{{foreach $products as $product}}
|
|
<li>
|
|
<div class="ipsTree_row ipsTree_noRoot">
|
|
<div class="ipsTree_rowData">
|
|
<h4 class="ipsTree_title"><a href="{url="app=nexus&module=store&controller=packages&subnode=1&do=form&id={$product->_id}"}" target="_blank" rel='noopener'>{$product->_title}</a></h4>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ol>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="productOptionsTable" template_data="$fields, $combinations, $existingValues, $renews" template_location="admin" template_app="nexus"><![CDATA[<table class="ipsTable">
|
|
<thead>
|
|
<tr>
|
|
{{foreach $fields as $field}}
|
|
<th>{$field->_title}</th>
|
|
{{endforeach}}
|
|
<th>{lang="p_stock"}</th>
|
|
<th>
|
|
{lang="base_price_adjustment"}<br>
|
|
<span class="i-color_soft i-font-size_-1">{lang="base_price_adjustment_desc"}</span>
|
|
</th>
|
|
{{if $renews}}
|
|
<th>
|
|
{lang="renew_price_adjustment"}<br>
|
|
<span class="i-color_soft i-font-size_-1">{lang="renew_price_adjustment_desc"}</span>
|
|
</th>
|
|
{{endif}}
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{foreach $combinations as $k => $options}}
|
|
<tr>
|
|
{{foreach $options as $option}}
|
|
<td>{$option}</td>
|
|
{{endforeach}}
|
|
<td data-role="unlimitedCatch">
|
|
<input type="number" name="custom_fields[{$k}][stock]" class="ipsInput ipsField_short" {{if isset( $existingValues[ $k ] ) and $existingValues[ $k ]['opt_stock'] != -1}}value="{$existingValues[ $k ]['opt_stock']}"{{endif}}><br>
|
|
{lang="or"}
|
|
<input type="checkbox" class="ipsInput ipsInput--toggle" name="custom_fields[{$k}][unlimitedStock]" id="custom_fields_{$k}_unlimitedStock" data-control="unlimited" {{if isset( $existingValues[ $k ] ) and $existingValues[ $k ]['opt_stock'] == -1}}checked{{endif}}>
|
|
<label for="custom_fields_{$k}_unlimitedStock" class='ipsField_unlimited'>{lang="unlimited"}</label>
|
|
</td>
|
|
<td>
|
|
{{$values = isset( $existingValues[ $k ] ) ? json_decode( $existingValues[ $k ]['opt_base_price'], TRUE ) : array();}}
|
|
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
|
<input type="number" name="custom_fields[{$k}][bpa][{$currency}]" class="ipsInput ipsField_short" step="any" value="{{if isset( $values[$currency] )}}{$values[$currency]}{{else}}0{{endif}}"> {$currency}<br>
|
|
{{endforeach}}
|
|
</td>
|
|
{{if $renews}}
|
|
<td>
|
|
{{$values = isset( $existingValues[ $k ] ) ? json_decode( $existingValues[ $k ]['opt_renew_price'], TRUE ) : array();}}
|
|
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
|
<input type="number" name="custom_fields[{$k}][rpa][{$currency}]" class="ipsInput ipsField_short" step="any" value="{{if isset( $values[$currency] )}}{$values[$currency]}{{else}}0{{endif}}"> {$currency}<br>
|
|
{{endforeach}}
|
|
</td>
|
|
{{endif}}
|
|
</tr>
|
|
{{endforeach}}
|
|
</tbody>
|
|
</table>]]></template>
|
|
<template template_group="store" template_name="productRowHtml" template_data="$package, $active, $expired, $canceled" template_location="admin" template_app="nexus"><![CDATA[<div class="ipsTree_row_cells i-margin-top_1">
|
|
<span class="ipsTree_row_cell">
|
|
{{if $package->store or $package->reg}}
|
|
{{$stockLevel = $package->stockLevel();}}
|
|
{{if $stockLevel === NULL}}
|
|
<span class="i-color_positive"><i class="fa-solid fa-check"></i> {lang="product_purchasable"}</span>
|
|
{{elseif $stockLevel}}
|
|
<span class="i-color_positive"><i class="fa-solid fa-check"></i> {lang="x_in_stock" pluralize="$stockLevel"}</span>
|
|
{{else}}
|
|
<span class="i-color_issue"><i class="fa-solid fa-xmark"></i> {lang="x_in_stock" pluralize="$stockLevel"}</span>
|
|
{{endif}}
|
|
{{else}}
|
|
<span class="i-color_negative"><i class="fa-solid fa-xmark"></i> {lang="product_not_purchasable"}</span>
|
|
{{endif}}
|
|
</span>
|
|
{{if $package->show}}
|
|
<span class="ipsTree_row_cell">
|
|
{{if $package->allow_upgrading or $package->allow_downgrading}}
|
|
<span class="i-color_positive"><i class="fa-solid fa-check"></i> {{if !$package->allow_upgrading and $package->allow_downgrading}}{lang="product_downgradeable"}{{else}}{lang="product_upgradeable"}{{endif}}</span>
|
|
{{else}}
|
|
<span class="i-color_negative"><i class="fa-solid fa-xmark"></i> {lang="product_not_upgradeable"}</span>
|
|
{{endif}}
|
|
</span>
|
|
{{endif}}
|
|
<span class="ipsTree_row_cell i-color_soft">
|
|
<a href="{url="app=nexus&module=store&controller=packages&do=viewPurchases&id={$package->_id}&filter=purchase_tab_active"}">
|
|
{{if $expired or $package->renew_options}}
|
|
{lang="product_count_active" pluralize="$active"}
|
|
{{else}}
|
|
{lang="product_count_purchases" pluralize="$active"}
|
|
{{endif}}
|
|
</a>
|
|
</span>
|
|
{{if $expired or $package->renew_options}}
|
|
<span class="ipsTree_row_cell i-color_soft">
|
|
<a href="{url="app=nexus&module=store&controller=packages&do=viewPurchases&id={$package->_id}&filter=purchase_tab_expired"}">
|
|
{lang="product_count_expired" pluralize="$expired"}
|
|
</a>
|
|
</span>
|
|
{{endif}}
|
|
{{if $canceled}}
|
|
<span class="ipsTree_row_cell i-color_soft">
|
|
<a href="{url="app=nexus&module=store&controller=packages&do=viewPurchases&id={$package->_id}&filter=purchase_tab_canceled"}">
|
|
{lang="product_count_canceled" pluralize="$canceled"}
|
|
</a>
|
|
</span>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="productTaxWarning" template_data="" template_location="admin" template_app="nexus"><![CDATA[<div id="elProductTaxWarningContainer">
|
|
<div class="ipsMessage ipsMessage--warning i-margin-top_1" id="elProductTaxWarning">
|
|
{lang="product_ba_warning_tax"}
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="purchaseForm" template_data="$package, $item, $purchaseForm" template_location="front" template_app="nexus"><![CDATA[
|
|
<div class='i-padding_3' data-controller='nexus.front.store.packagePage' data-itemTitle="{$package->_title}">
|
|
<div class='ipsColumns'>
|
|
<div class='ipsColumns__secondary i-basis_200'>
|
|
{{if $images = $item->images() and \count( $images )}}
|
|
{{$donePrimary = false;}}
|
|
{{foreach $images as $image}}
|
|
{{if !$donePrimary}}
|
|
<a href='{$image}' class='cNexusProduct_primaryImage'><img src='{$image}' class="ipsImage ipsImage_thumb"></a>
|
|
{{$donePrimary = true;}}
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsColumns__primary'>
|
|
<h1 class='ipsTitle ipsTitle--h3'>{$item->mapped('title')}</h1>
|
|
<hr class='ipsHr'>
|
|
{$purchaseForm|raw}
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="register" template_data="$packages" template_location="front" template_app="nexus"><![CDATA[
|
|
<div class='ipsBox ipsBox--commerceRegister ipsPull'>
|
|
<div class="i-padding_3 i-border-bottom_3">
|
|
<h1 class='i-font-size_4 i-font-weight_600 i-color_hard'>{lang='sign_up'}: {lang="choose_product"}</h1>
|
|
<p class='i-font-size_2 i-font-weight_500 i-color_soft'>
|
|
{{if settings.nexus_reg_force}}
|
|
{lang="store_forced_purchase"}
|
|
{{else}}
|
|
{lang="store_optional_purchase"}
|
|
{{endif}}
|
|
</p>
|
|
{{if isset( $_SESSION['cart'] ) and \count( $_SESSION['cart'] )}}
|
|
<p class='i-font-size_2 i-text-align_center i-color_soft'>
|
|
<a href='{url="app=nexus&module=store&controller=cart" seoTemplate="store_cart"}'>{lang="continue_to_registration"} <i class='fa-solid fa-caret-right'></i></a>
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
<section data-controller='nexus.front.store.register'>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--grid ipsData--carousel ipsData--commerce-registration-products' id='commerce-registration-products' tabindex="0">
|
|
{{foreach $packages as $package}}
|
|
{template="packageBlock" group="store" params="$package, 'carousel'"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
{template="carouselNavigation" group="global" app="core" params="'commerce-registration-products'"}
|
|
<div data-role='productInformationWrapper' class='ipsHide cNexusRegister_info'>
|
|
<hr class='ipsHr'>
|
|
<a href='#' class='cNexusRegister_close ipsHide' data-action='closeInfo'>×</a>
|
|
<div class='i-margin-top_3' data-role='productInformation'></div>
|
|
</div>
|
|
</section>
|
|
|
|
{{if !settings.nexus_reg_force}}
|
|
<p class="i-text-align_end i-padding_2 i-border-top_2 i-font-weight_600"><a href='{url="app=core&module=system&controller=register&noPurchase=1" seoTemplate="register"}'>{lang="continue_without_purchasing"} <i class='fa-solid fa-caret-right'></i></a></p>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="reviews" template_data="$item" template_location="front" template_app="nexus"><![CDATA[
|
|
<div data-controller='core.front.core.commentFeed' {{if settings.auto_polling_enabled}}data-autoPoll{{endif}} data-baseURL='{$item->url()}' {{if $item->isLastPage('reviews')}}data-lastPage{{endif}} data-feedID='{$item->reviewFeedId}' id='reviews'>
|
|
{{if $item->reviewForm()}}
|
|
<div id='elProductReviewForm'>
|
|
{$item->reviewForm()|raw}
|
|
</div>
|
|
{{else}}
|
|
{{if $item->hasReviewed()}}
|
|
<!-- Already reviewed -->
|
|
{{elseif \IPS\Member::loggedin()->restrict_post}}
|
|
{{if \IPS\Member::loggedIn()->restrict_post == -1}}
|
|
{template="reviewUnavailable" group="forms" location="front" app="core" params="'restricted_cannot_comment'"}
|
|
{{else}}
|
|
{template="reviewUnavailable" group="forms" location="front" app="core" params="'restricted_cannot_comment', \IPS\Member::loggedIn()->warnings(5,NULL,'rpa'), \IPS\Member::loggedIn()->restrict_post"}
|
|
{{endif}}
|
|
{{elseif \IPS\Member::loggedIn()->members_bitoptions['unacknowledged_warnings']}}
|
|
{template="reviewUnavailable" group="forms" location="front" app="core" params="'unacknowledged_warning_cannot_post', \IPS\Member::loggedIn()->warnings( 1, FALSE )"}
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if $reviews = $item->reviews( NULL, NULL, NULL, 'desc', NULL, NULL, NULL, NULL, isset( \IPS\Request::i()->showDeleted ) ) AND \count( $reviews )}}
|
|
{{if !$item->hasReviewed()}}<hr class='ipsHr'>{{endif}}
|
|
<div class="ipsButtonBar ipsButtonBar--top">
|
|
{{if $item->reviewPageCount() > 1}}
|
|
<div class="ipsButtonBar__pagination">
|
|
{$item->reviewPagination( array( 'tab', 'sort' ) )|raw}
|
|
</div>
|
|
{{endif}}
|
|
<div class='ipsButtonBar__end'>
|
|
{template="commentMultimodHeader" app="core" group="global" params="$item, '#reviews', 'review'"}
|
|
<ul class='ipsDataFilters'>
|
|
<li data-action="tableFilter">
|
|
<a href="{$item->url()->setQueryString( array( 'tab' => 'reviews', 'sort' => 'helpful' ) )->setPage('page',1)}" class="ipsDataFilters__button {{if !isset( request.sort ) or request.sort != 'newest'}}ipsDataFilters__button--active{{endif}}" data-action="filterClick">{lang="most_helpful"}</a>
|
|
</li>
|
|
<li data-action="tableFilter">
|
|
<a href="{$item->url()->setQueryString( array( 'tab' => 'reviews', 'sort' => 'newest' ) )->setPage('page',1)}" class="ipsDataFilters__button {{if isset( request.sort ) and request.sort == 'newest'}}ipsDataFilters__button--active{{endif}}" data-action="filterClick">{lang="newest"}</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div data-role='commentFeed' data-controller='core.front.core.moderation'>
|
|
<form action="{$item->url()->csrf()->setQueryString( 'do', 'multimodReview' )->setPage('page',\IPS\Request::i()->page)}" method="post" data-ipsPageAction data-role='moderationTools'>
|
|
{{foreach $reviews as $review}}
|
|
{$review->html()|raw}
|
|
{{endforeach}}
|
|
{template="commentMultimod" app="core" group="global" params="$item, 'review'"}
|
|
</form>
|
|
</div>
|
|
{{if $item->reviewPageCount() > 1}}
|
|
<div>
|
|
{$item->reviewPagination( array( 'tab', 'sort' ) )|raw}
|
|
</div>
|
|
{{endif}}
|
|
{{elseif !$item->canReview()}}
|
|
<p class="ipsEmptyMessage" data-role="noReviews">{lang="no_reviews"}</p>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="store" template_name="storeIndexProductsSetting" template_data="$key, $name, $value" template_location="admin" template_app="nexus"><![CDATA[{lang="$key" htmlsprintf="'<input type=\'number\' name=\'' . $name . '[0]\' value=\'' . $value[0] . '\' class=\'ipsInput ipsField_tiny\'>', '<input type=\'number\' name=\'' . $name . '[1]\' value=\'' . ( isset( $value[1] ) ? $value[1] : '' ). '\' class=\'ipsInput ipsField_tiny\'>'"}]]></template>
|
|
<template template_group="store" template_name="subscriptionPurchase" template_data="$purchase" template_location="front" template_app="nexus"><![CDATA[
|
|
<ul class='ipsList ipsList--inline'>
|
|
<li>
|
|
<strong class="ipsMinorTitle">{lang="ps_start"}</strong>
|
|
<br>{$purchase->start->localeDate()}
|
|
</li>
|
|
{{if $purchase->expire}}
|
|
<li>
|
|
<strong class="ipsMinorTitle">{lang="ps_expire"}</strong>
|
|
<br>{$purchase->expire->localeDate()}
|
|
</li>
|
|
{{endif}}
|
|
{{if $purchase->renewals and !$purchase->grouped_renewals}}
|
|
<li>
|
|
<strong class="ipsMinorTitle">{lang="purchase_renewal_terms"}</strong>
|
|
<br>{$purchase->renewals->toDisplay( $purchase->member )}
|
|
</li>
|
|
{{endif}}
|
|
{{if $purchase->billing_agreement AND !$purchase->billing_agreement->canceled}}
|
|
<li>
|
|
<strong class="ipsMinorTitle">{lang="ps_billing_agreement"}</strong>
|
|
<br><a href='{$purchase->billing_agreement->url()}' class="i-color_inherit">{$purchase->billing_agreement->gw_id}</a>
|
|
</li>
|
|
{{endif}}
|
|
|
|
</ul>
|
|
|
|
<ul class='ipsList ipsList--inline i-margin-top_3'>
|
|
<li>
|
|
<a href="{$purchase->url()}" class="ipsButton ipsButton--primary">{lang="nexus_subs_view_purchase"}</a>
|
|
</li>
|
|
{{if $pendingInvoice = $purchase->invoice_pending and $pendingInvoice->status === $pendingInvoice::STATUS_PENDING}}
|
|
<li>
|
|
<a href="{$pendingInvoice->checkoutUrl()}" class='ipsButton ipsButton--primary' title="{lang="purchase_renew_now_title"}">{lang="purchase_renew_now"}</a>
|
|
</li>
|
|
{{elseif $purchase->expire AND $canRenewUntil = $purchase->canRenewUntil(NULL,TRUE)}}
|
|
<li>
|
|
<a href="{url="app=nexus&module=clients&controller=purchases&do=renew&id={$purchase->id}" base="front" csrf="true" seoTemplate="clientspurchaserenew" seoTitle="\IPS\Http\Url\Friendly::seoTitle( $purchase->name )"}" class='ipsButton ipsButton--primary' title="{lang="purchase_renew_now_title"}" {{if $canRenewUntil === TRUE or $canRenewUntil > 1}}data-ipsDialog data-ipsDialog-size='narrow'{{endif}}>{lang="purchase_renew_now"}</a>
|
|
</li>
|
|
{{endif}}
|
|
{{if $purchase->canCancel()}}
|
|
<li>
|
|
<a href="{url="app=nexus&module=clients&controller=purchases&do=cancel&id={$purchase->id}" base="front" csrf="true" seoTemplate="clientspurchasecancel" seoTitle="\IPS\Http\Url\Friendly::seoTitle( $purchase->name )"}" class='ipsButton ipsButton--negative' data-confirm data-confirmSubMessage="{lang="purchase_cancel_renewal_confirm"}">{lang="purchase_cancel_renewal"}</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
]]></template>
|
|
<template template_group="subscription" template_name="clientArea" template_data="$package" template_location="front" template_app="nexus"><![CDATA[{{if $package->description}}
|
|
<div class='i-padding_3'>
|
|
<div class="ipsRichText i-margin-block_2">{$package->description|raw}</div>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="subscription" template_name="convert" template_data="$form, $package" template_location="admin" template_app="nexus"><![CDATA[<div class="ipsMessage ipsMessage--general">
|
|
{lang="nexus_subs_convert_message" sprintf="$package->_title"}
|
|
</div>
|
|
{$form|raw}]]></template>
|
|
<template template_group="subscription" template_name="current" template_data="$subscription" template_location="front" template_app="nexus"><![CDATA[{{if $package = $subscription->package}}
|
|
<div class="ipsBox cSubscription_current i-padding_3">
|
|
{$subscription = $subscription->currentBlurb()}
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="subscription" template_name="disabled" template_data="" template_location="admin" template_app="nexus"><![CDATA[<div class='ipsBox i-padding_3'>
|
|
<p class="i-font-size_2">{lang="nexus_subs_off_text"}</p>
|
|
<br>
|
|
<a href="{url="app=nexus&module=subscriptions&controller=subscriptions&do=enable" csrf="true"}" class="ipsButton ipsButton--positive">{lang="enable"}</a>
|
|
</div>]]></template>
|
|
<template template_group="subscription" template_name="packageLink" template_data="$package" template_location="admin" template_app="nexus"><![CDATA[<a href="{$package->url()}" target="_blank" rel='noopener'>{$package->_title}</a>]]></template>
|
|
<template template_group="subscription" template_name="profileSubscription" template_data="$member" template_location="front" template_app="nexus"><![CDATA[{{if $subscription = \IPS\nexus\Subscription::loadActiveByMember( $member )}}
|
|
<div class='ipsProfileWidget'>
|
|
<a href='{url="app=nexus&module=subscriptions&controller=subscriptions" seoTemplate="nexus_subscriptions"}' class='cProfileSubscription {{if $subscription->package->_image}}cProfileSubscription--with-image{{else}}cProfileSubscription--no-image{{endif}}'>
|
|
{{if $subscription->package->_image}}
|
|
<img src="{expression="str_replace( array( '(', ')' ), array( '\(', '\)' ), $subscription->package->_image->url )"}" loading='lazy' alt=''>
|
|
<div class='cProfileSubscription__gradient'></div>
|
|
{{endif}}
|
|
<span class='cProfileSubscription__text'><i class="fa-solid fa-award"></i> {lang="nexus_subs_subscriber" sprintf="$subscription->package->_title"}</span>
|
|
</a>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="subscription" template_name="row" template_data="$package, $subscription, $showImagePlaceholder=FALSE" template_location="front" template_app="nexus"><![CDATA[<!--{$package->id}-->
|
|
<div class='ipsData__item cSubscriptions {{if isset( \IPS\Request::i()->id ) and \IPS\Request::i()->id == $package->id}}cSubscription--highlighted{{endif}} {{if $subscription and $subscription->package and $subscription->package->id === $package->id}}cSubscription--active {{if !$subscription->active}}cSubscription--expired{{endif}}{{endif}} {$package->ui( 'css' )}' {$package->ui( 'dataAttributes' )} data-ips-hook="block">
|
|
{{if $package->_image || $showImagePlaceholder}}
|
|
<div class='ipsData__image' aria-hidden='true'>
|
|
{{if $package->_image}}
|
|
<img src='{$package->_image->url}' loading='lazy' alt=''>
|
|
{{else}}
|
|
<i class="fa-solid fa-box"></i>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
<div class='ipsData__content'>
|
|
<div class="ipsData__main" data-ips-hook="header">
|
|
<h2 class='ipsData__title'>{$package->_title}</h2>
|
|
<div>
|
|
{{if $priceInfo = $package->priceInfo() and $priceInfo['primaryPrice']}}
|
|
{template="packageBlockPrice" app="nexus" group="store" params="$priceInfo"}
|
|
{{else}}
|
|
<span class="cNexusPrice">{lang="nexus_sub_cost_unavailable"}</span>
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsRichText ipsData__desc ipsData__desc--all">{$package->description}</div>
|
|
</div>
|
|
|
|
{{if $subscription and $subscription->package and $subscription->package->id === $package->id}}
|
|
<div class='cSubscriptionRenew {{if $subscription->active}}i-color_positive{{else}}i-color_negative{{endif}} i-text-align_center i-font-weight_600 i-margin-bottom_2'>{$subscription->currentBlurb()}</div>
|
|
{{endif}}
|
|
|
|
{{if $subscription}}
|
|
{{if $subscription->package and $subscription->purchase }}
|
|
{{$upgradeCost = (!( $subscription->purchase->billing_agreement and !$subscription->purchase->billing_agreement->canceled ) )? $package->costToUpgradeIncludingTax( $subscription->package, \IPS\nexus\Customer::loggedIn() ) : NULL;}}
|
|
{{if $subscription->package->id === $package->id}}
|
|
{{if $subscription->purchase->expire and ( $canRenewUntil = $subscription->purchase->canRenewUntil( NULL,TRUE ) or ( $subscription->purchase->can_reactivate ) or ( $pendingInvoice = $subscription->purchase->invoice_pending and $pendingInvoice->status === $pendingInvoice::STATUS_PENDING ) or $subscription->purchase->canCancel())}}
|
|
<div class='cSubscriptionInfo' data-ips-hook="infoActivePurchase">
|
|
<ul class='ipsButtons ipsButtons--fill'>
|
|
{{if $pendingInvoice = $subscription->purchase->invoice_pending and $pendingInvoice->status === $pendingInvoice::STATUS_PENDING}}
|
|
<li>
|
|
<a href="{$pendingInvoice->checkoutUrl()}" class='ipsButton ipsButton--positive' title="{lang="order_pay_now_title"}">
|
|
{lang="purchase_renew_now"}
|
|
</a>
|
|
</li>
|
|
{{elseif $canRenewUntil}}
|
|
<li>
|
|
<a href='{url="app=nexus&module=clients&controller=purchases&do=renew&id={$subscription->purchase->id}" base="front" csrf="true" seoTemplate="clientspurchaserenew" seoTitle="\IPS\Http\Url\Friendly::seoTitle( $subscription->purchase->name )"}' class='ipsButton ipsButton--positive' title='{lang="purchase_renew_now_title"}' {{if $canRenewUntil === TRUE or $canRenewUntil > 1}}data-ipsDialog data-ipsDialog-size='narrow'{{endif}}>
|
|
{lang="purchase_renew_now"}
|
|
</a>
|
|
</li>
|
|
{{elseif $renewOptions = json_decode( $package->renew_options, TRUE ) and \count( $renewOptions ) and $subscription->purchase->can_reactivate and ( !$subscription->purchase->billing_agreement or $subscription->purchase->billing_agreement->canceled )}}
|
|
<li>
|
|
<a href='{url="app=nexus&module=subscriptions&controller=subscriptions&do=reactivate&id={$package->id}" base="front" csrf="true" seoTemplate="nexus_subscription"}' class='ipsButton ipsButton--positive' title='{lang="purchase_renew_now_title"}'>
|
|
{lang="reactivate_package"}
|
|
</a>
|
|
</li>
|
|
{{endif}}
|
|
{{if $subscription->purchase->canCancel()}}
|
|
<li>
|
|
<a href='{url="app=nexus&module=clients&controller=purchases&do=cancel&id={$subscription->purchase->id}" base="front" csrf="true" seoTemplate="clientspurchasecancel" seoTitle="\IPS\Http\Url\Friendly::seoTitle( $subscription->purchase->name )"}&ref={expression="base64_encode( \IPS\Http\Url::internal( 'app=nexus&module=subscriptions&controller=subscriptions', 'front', 'nexus_subscriptions' ) )"}' class="ipsButton ipsButton--negative" data-confirm data-confirmSubMessage='{lang="purchase_cancel_renewal_confirm"}'>
|
|
{lang="purchase_cancel_renewal"}
|
|
</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
{{elseif $upgradeCost !== NULL}}
|
|
<div class='cSubscriptionInfo' data-ips-hook="infoExpiredPurchase">
|
|
<ul class='ipsButtons ipsButtons--fill'>
|
|
{{if $upgradeCost->amount->isGreaterThanZero() or ( $upgradeCost->amount->isZero() and $package->price() >= $subscription->package->price())}}
|
|
<li>
|
|
{{if $upgradeCost->amount->isZero()}}
|
|
<a href='{url="app=nexus&module=subscriptions&controller=subscriptions&do=change&id={$package->id}" csrf="true" seoTemplate="nexus_subscription"}' class="ipsButton ipsButton--inherit" data-change-subscription data-change-message='{lang="nexus_sub_change_no_charge"}'>
|
|
{{elseif !$subscription->active}}
|
|
<a href='{url="app=nexus&module=subscriptions&controller=subscriptions&do=change&id={$package->id}" csrf="true" seoTemplate="nexus_subscription"}' class="ipsButton ipsButton--inherit" data-change-subscription data-change-message='{lang="nexus_sub_change_confirm_switch" sprintf="$subscription->package->_title, $package->_title, $upgradeCost"}'>
|
|
{{else}}
|
|
<a href='{url="app=nexus&module=subscriptions&controller=subscriptions&do=change&id={$package->id}" csrf="true" seoTemplate="nexus_subscription"}' class="ipsButton ipsButton--inherit" data-change-subscription data-change-message='{lang="nexus_sub_change_confirm_upgrade" sprintf="$subscription->package->_title, $package->_title, $upgradeCost"}'>
|
|
{{endif}}
|
|
{{if $subscription->active}}
|
|
{lang="nexus_subs_upgrade_button"}
|
|
{{else}}
|
|
{lang="nexus_subs_switch_button"}
|
|
{{endif}}
|
|
</a>
|
|
</li>
|
|
{{else}}
|
|
<li>
|
|
{{if $upgradeCost->amount->isZero()}}
|
|
<a href='{url="app=nexus&module=subscriptions&controller=subscriptions&do=change&id={$package->id}" csrf="true" seoTemplate="nexus_subscription"}' class="ipsButton ipsButton--negative" data-change-subscription data-change-message='{lang="nexus_sub_change_no_charge"}'>
|
|
{{elseif !$subscription->active}}
|
|
{{$upgradeCost = new \IPS\nexus\Money( $upgradeCost->amount->absolute(), $upgradeCost->currency );}}
|
|
<a href='{url="app=nexus&module=subscriptions&controller=subscriptions&do=change&id={$package->id}" csrf="true" seoTemplate="nexus_subscription"}' class="ipsButton ipsButton--negative" data-change-subscription data-change-message='{lang="nexus_sub_change_confirm_switch" sprintf="$subscription->package->_title, $package->_title, $upgradeCost"}'>
|
|
{{else}}
|
|
{{$upgradeCost = new \IPS\nexus\Money( $upgradeCost->amount->absolute(), $upgradeCost->currency );}}
|
|
<a href='{url="app=nexus&module=subscriptions&controller=subscriptions&do=change&id={$package->id}" csrf="true" seoTemplate="nexus_subscription"}' class="ipsButton ipsButton--negative" data-change-subscription data-change-message='"{lang="nexus_sub_change_confirm_downgrade" sprintf="$subscription->package->_title, $package->_title, $upgradeCost"}'>
|
|
{{endif}}
|
|
{{if $subscription->active}}
|
|
{lang="nexus_subs_downgrade_button"}
|
|
{{else}}
|
|
{lang="nexus_subs_switch_button"}
|
|
{{endif}}
|
|
</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{else}}
|
|
<div class='cSubscriptionInfo' data-ips-hook="infoNoPurchase">
|
|
<a href='{url="app=nexus&module=subscriptions&controller=subscriptions&do=purchase&id={$package->id}" csrf="true" seoTemplate="nexus_subscription"}' class="ipsButton ipsButton--primary">{lang="nexus_subs_buy"}</a>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="subscription" template_name="rowHtml" template_data="$package, $price, $active, $inactive" template_location="admin" template_app="nexus"><![CDATA[<div class="ipsTree_row_cells i-margin-top_1">
|
|
<span class="ipsTree_row_cell i-color_soft"><a href="{url="app=nexus&module=subscriptions&controller=subscribers&nexus_sub_package_id={$package->id}&filter=nexus_subs_filter_active"}">{lang="nexus_sub_package_count_active" sprintf="$active"}</a></span>
|
|
<span class="ipsTree_row_cell i-color_soft"><a href="{url="app=nexus&module=subscriptions&controller=subscribers&nexus_sub_package_id={$package->id}&filter=nexus_subs_filter_inactive"}">{lang="nexus_sub_package_count_inactive" sprintf="$inactive"}</a></span>
|
|
<span class="ipsTree_row_cell i-color_soft">{$price}</span>
|
|
</div>]]></template>
|
|
<template template_group="subscription" template_name="rows" template_data="$table, $headers, $rows" template_location="front" template_app="nexus"><![CDATA[
|
|
{{$forcePlaceholders = FALSE;}}
|
|
{{if \count( $rows )}}
|
|
{{foreach $rows as $row}}
|
|
{{if $row->_image}}
|
|
{{$forcePlaceholders = TRUE;}}
|
|
{{break;}}
|
|
{{endif}}
|
|
{{endforeach}}
|
|
|
|
{{foreach $rows as $row}}
|
|
{template="row" params="$row, $table->activeSubscription, $forcePlaceholders" app="nexus" group="subscription"}
|
|
{{endforeach}}
|
|
{{endif}}]]></template>
|
|
<template template_group="subscription" template_name="status" template_data="$active" template_location="admin" template_app="nexus"><![CDATA[<span class="ipsBadge {{if $active}}ipsBadge--positive{{else}}ipsBadge--neutral{{endif}}">{{if $active}}{lang="active"}{{else}}{lang="inactive"}{{endif}}</span>]]></template>
|
|
<template template_group="subscription" template_name="table" template_data="$table, $headers, $rows, $quickSearch" template_location="front" template_app="nexus"><![CDATA[<section class='ipsBox ipsBox--commerceSubscription ipsPull'>
|
|
<header class='ipsPageHeader'>
|
|
<div class="ipsPageHeader__row">
|
|
<div class='ipsPageHeader__primary'>
|
|
{{if isset( \IPS\Request::i()->register ) and \IPS\Settings::i()->nexus_subs_register and (int) \IPS\Request::i()->register === 1}}
|
|
<h1 class='ipsPageHeader__title'>{lang="nexus_sub_sign_up_title"}</h1>
|
|
<p class="ipsPageHeader__desc">{lang="nexus_sub_sign_up_desc"}</p>
|
|
{{elseif isset( \IPS\Request::i()->register ) and \IPS\Settings::i()->nexus_subs_register and (int) \IPS\Request::i()->register === 2}}
|
|
<h1 class='ipsPageHeader__title'>{lang="nexus_sub_needed_title"}</h1>
|
|
<p class="ipsPageHeader__desc">{lang="nexus_sub_needed_desc"}</p>
|
|
{{else}}
|
|
<h1 class='ipsPageHeader__title'>{lang="nexus_front_subscriptions"}</h1>
|
|
{{if $table->activeSubscription and $table->activeSubscription->purchase->billing_agreement and !$table->activeSubscription->purchase->billing_agreement->canceled}}
|
|
<p class="ipsMessage ipsMessage--info">
|
|
{lang="nexus_sub_active_billingagreement_desc" sprintf="$table->activeSubscription->purchase->billing_agreement->url()"}
|
|
</p>
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
{{if \count( \IPS\nexus\Money::currencies() ) > 1}}
|
|
<div class='ipsButtons'>
|
|
{{$baseUrl = \IPS\Http\Url::internal('app=nexus&module=subscriptions&controller=subscriptions', 'front', 'nexus_subscriptions');}}
|
|
{{if isset( \IPS\Request::i()->register )}}
|
|
{{$baseUrl = $baseUrl->setQueryString( 'register', (int) \IPS\Request::i()->register );}}
|
|
{{endif}}
|
|
{{$memberCurrency = ( ( isset( \IPS\Request::i()->cookie['currency'] ) and \in_array( \IPS\Request::i()->cookie['currency'], \IPS\nexus\Money::currencies() ) ) ? \IPS\Request::i()->cookie['currency'] : \IPS\nexus\Customer::loggedIn()->defaultCurrency() );}}
|
|
<button type="button" id="elCurrencyChooser" popovertarget="elCurrencyChooser_menu" class='ipsButton ipsButton--soft'><span>{$memberCurrency}</span><i class='fa-solid fa-caret-down'></i></button>
|
|
<i-dropdown popover id="elCurrencyChooser_menu">
|
|
<div class="iDropdown">
|
|
<ul class="iDropdown__items">
|
|
{{foreach \IPS\nexus\Money::currencies() as $currency}}
|
|
<li>
|
|
<a href='{$baseUrl->setQueryString( 'currency', $currency )->csrf()}' title='{lang="set_currency_to" sprintf="$currency"}' {{if $currency == $memberCurrency}}data-selected aria-selected="true"{{endif}}>
|
|
<i class="iDropdown__input"></i>{$currency}
|
|
</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</i-dropdown>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</header>
|
|
{{if $table->pages > 1}}
|
|
<div class="ipsButtonBar ipsButtonBar--top" data-role="tablePagination">
|
|
<div class="ipsButtonBar__pagination">
|
|
{template="pagination" group="global" app="core" location="global" params="$table->baseUrl, $table->pages, $table->page, $table->limit, TRUE, $table->getPaginationKey()"}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if \is_array( $rows ) AND \count( $rows )}}
|
|
<i-data>
|
|
<div class='ipsData ipsData--grid ipsData--subscriptions i-basis_300 {{foreach $table->classes as $class}}{$class} {{endforeach}}' id='elTable_{$table->uniqueId}' data-controller='nexus.front.subscriptions.main' data-role='tableRows'>
|
|
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
|
</div>
|
|
</i-data>
|
|
{{else}}
|
|
<p class="ipsEmptyMessage">{lang="nexus_subs_non_available"}</p>
|
|
{{endif}}
|
|
|
|
{{if $table->pages > 1}}
|
|
<div class="ipsButtonBar ipsButtonBar--bottom" data-role="tablePagination">
|
|
<div class="ipsButtonBar__pagination">
|
|
{template="pagination" group="global" app="core" location="global" params="$table->baseUrl, $table->pages, $table->page, $table->limit, TRUE, $table->getPaginationKey()"}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</section>]]></template>
|
|
<template template_group="transactions" template_name="dspd" template_data="$transaction, $log" template_location="admin" template_app="nexus"><![CDATA[
|
|
{{if $extraData = $transaction->method->disputeData( $transaction, $log )}}
|
|
{$extraData|raw}
|
|
{{else}}
|
|
<li class='cTransaction_intermediate'>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-rotate-left'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h3 class="ipsTitle ipsTitle--h3">
|
|
<strong>
|
|
{lang="tstatus_dspd_set"}
|
|
</strong>
|
|
</h3>
|
|
<br>
|
|
|
|
{{if isset( $log['on'] ) and $log['on']}}
|
|
{expression="\IPS\DateTime::ts( $log['on'] )"}
|
|
{{if isset( $log['by'] ) and $log['by']}}
|
|
<br>
|
|
<span class='i-font-size_1 i-color_soft'>
|
|
{lang="byline_nodate" sprintf="\IPS\Member::load( $log['by'] )->name"}
|
|
</span>
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endif}}]]></template>
|
|
<template template_group="transactions" template_name="fail" template_data="$transaction, $log" template_location="admin" template_app="nexus"><![CDATA[
|
|
<li class='cTransaction_negative'>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-xmark'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h3 class="ipsTitle ipsTitle--h3">
|
|
<strong>
|
|
{lang="tstatus_fail_set"}
|
|
</strong>
|
|
</h3>
|
|
<br>
|
|
{{if isset( $log['on'] ) and $log['on']}}
|
|
{expression="\IPS\DateTime::ts( $log['on'] )"}
|
|
{{if isset( $log['by'] ) and $log['by']}}
|
|
<br>
|
|
<span class='i-font-size_1 i-color_soft'>
|
|
{lang="byline_nodate" sprintf="\IPS\Member::load( $log['by'] )->name"}
|
|
</span>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if isset( $log['note'] ) and $log['note']}}
|
|
<p class='cTransaction_note'>
|
|
{lang="trans_extra_{$log['note']}"}
|
|
</p>
|
|
{{endif}}
|
|
{{if isset( $log['noteRaw'] ) and $log['noteRaw']}}
|
|
<p class='cTransaction_note'>
|
|
{$log['noteRaw']}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="transactions" template_name="hold" template_data="$transaction, $log" template_location="admin" template_app="nexus"><![CDATA[
|
|
<li>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-triangle-exclamation'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<span class="i-font-size_2">{lang="tstatus_hold_set"}</span>
|
|
<br>
|
|
{{if isset( $log['on'] ) and $log['on']}}
|
|
{expression="\IPS\DateTime::ts( $log['on'] )"}
|
|
{{if isset( $log['by'] ) and $log['by']}}
|
|
<br>
|
|
<span class='i-font-size_1 i-color_soft'>
|
|
{lang="byline_nodate" sprintf="\IPS\Member::load( $log['by'] )->name"}
|
|
</span>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if isset( $log['note'] ) and $log['note']}}
|
|
<p class='cTransaction_note'>
|
|
{$log['note']}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="transactions" template_name="link" template_data="$transaction" template_location="admin" template_app="nexus"><![CDATA[<a href="{$transaction->acpUrl()}">{lang="transaction_number" sprintf="$transaction->id"}</a>]]></template>
|
|
<template template_group="transactions" template_name="okay" template_data="$transaction, $log" template_location="admin" template_app="nexus"><![CDATA[
|
|
<li class='cTransaction_positive'>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-check'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h3 class="ipsTitle ipsTitle--h3">
|
|
<strong>
|
|
{lang="tstatus_okay_set"}
|
|
</strong>
|
|
</h3>
|
|
|
|
{{if isset( $log['on'] ) and $log['on']}}
|
|
{expression="\IPS\DateTime::ts( $log['on'] )"}
|
|
{{if isset( $log['by'] ) and $log['by']}}
|
|
<br>
|
|
<span class='i-font-size_1 i-color_soft'>
|
|
{lang="byline_nodate" sprintf="\IPS\Member::load( $log['by'] )->name"}
|
|
</span>
|
|
{{endif}}
|
|
{{else}}
|
|
<br>
|
|
{lang="tstatus_okay_desc"}
|
|
{{endif}}
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="transactions" template_name="paypalStatus" template_data="$transaction" template_location="admin" template_app="nexus"><![CDATA[{{if isset( $transaction->extra['verified'] )}}
|
|
<p>
|
|
{lang="paypal_payer_status" sprintf="$transaction->extra['verified']"}
|
|
</p>
|
|
{{endif}}
|
|
|
|
{{if isset( $transaction->extra['processor_response'] )}}
|
|
{{$responseCode = $transaction->extra['processor_response']['response_code'];}}
|
|
<p>
|
|
{lang="processor_response_avs"}: {$transaction->extra['processor_response']['avs_code']} <span class="i-color_soft">({lang="processor_response_avs__{$transaction->extra['processor_response']['avs_code']}"})</span>
|
|
<br>
|
|
{lang="processor_response_cvv"}: {$transaction->extra['processor_response']['cvv_code']} <span class="i-color_soft">({lang="processor_response_cvv__{$transaction->extra['processor_response']['cvv_code']}"})</span>
|
|
<br>
|
|
{lang="processor_response_code"}: {$responseCode} {{if \is_numeric( $responseCode )}}{{$responseCode = (int)$responseCode;}}{{endif}}
|
|
<br>
|
|
<span class="i-color_soft">{lang="processor_response_code__{$responseCode}"}</span>
|
|
</p>
|
|
{{endif}}]]></template>
|
|
<template template_group="transactions" template_name="prfd" template_data="$transaction, $log" template_location="admin" template_app="nexus"><![CDATA[
|
|
<li class='cTransaction_intermediate'>
|
|
<div class='cTransaction_icon'>
|
|
{{if $log['to'] === 'credit'}}
|
|
<i class='fa-solid fa-reply'></i>
|
|
{{else}}
|
|
<i class='fa-solid fa-reply-all'></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h3 class="ipsTitle ipsTitle--h3">
|
|
<strong>
|
|
{{if $log['to'] === 'credit'}}
|
|
{lang="tstatus_credited"}
|
|
{{else}}
|
|
{lang="tstatus_prfd_set"}
|
|
{{endif}}
|
|
</strong>
|
|
</h3>
|
|
<br>
|
|
|
|
{{if isset( $log['amount'] )}}
|
|
{{if $transaction->amount->amount->compare( new \IPS\Math\Number( $log['amount'] ) ) !== 0}}
|
|
<p class='i-font-size_2'>
|
|
<span class='cNexusPrice'>{money="$log['amount']" currency="$transaction->currency"}</span>
|
|
</p>
|
|
{{endif}}
|
|
{{endif}}
|
|
|
|
{{if isset( $log['ref'] ) and $log['ref']}}
|
|
<p>
|
|
{$log['ref']}
|
|
</p>
|
|
{{endif}}
|
|
{{if isset( $log['on'] ) and $log['on']}}
|
|
{expression="\IPS\DateTime::ts( $log['on'] )"}
|
|
{{if isset( $log['by'] ) and $log['by']}}
|
|
<br>
|
|
<span class='i-font-size_1 i-color_soft'>
|
|
{lang="byline_nodate" sprintf="\IPS\Member::load( $log['by'] )->name"}
|
|
</span>
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="transactions" template_name="revw" template_data="$transaction, $log" template_location="admin" template_app="nexus"><![CDATA[
|
|
<li class='cTransaction_intermediate'>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-flag'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<span class="i-font-size_2">{lang="tstatus_revw_set"}</span>
|
|
<br>
|
|
{{if isset( $log['on'] ) and $log['on']}}
|
|
{expression="\IPS\DateTime::ts( $log['on'] )"}
|
|
{{if isset( $log['by'] ) and $log['by']}}
|
|
<br>
|
|
<span class='i-font-size_1 i-color_soft'>
|
|
{lang="byline_nodate" sprintf="\IPS\Member::load( $log['by'] )->name"}
|
|
</span>
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="transactions" template_name="rfnd" template_data="$transaction, $log" template_location="admin" template_app="nexus"><![CDATA[
|
|
<li class='cTransaction_negative'>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-reply-all'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h3 class="ipsTitle ipsTitle--h3">
|
|
<strong>
|
|
{{if $log['to'] === 'credit'}}
|
|
{lang="tstatus_credited"}
|
|
{{else}}
|
|
{lang="tstatus_rfnd_set"}
|
|
{{endif}}
|
|
</strong>
|
|
</h3>
|
|
<br>
|
|
|
|
{{if isset( $log['ref'] ) and $log['ref']}}
|
|
<p class='i-font-size_1'>
|
|
{$log['ref']}
|
|
</p>
|
|
{{endif}}
|
|
{{if isset( $log['on'] ) and $log['on']}}
|
|
{expression="\IPS\DateTime::ts( $log['on'] )"}
|
|
{{if isset( $log['by'] ) and $log['by']}}
|
|
<br>
|
|
<span class='i-font-size_1 i-color_soft'>
|
|
{lang="byline_nodate" sprintf="\IPS\Member::load( $log['by'] )->name"}
|
|
</span>
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="transactions" template_name="status" template_data="$status" template_location="admin" template_app="nexus"><![CDATA[<span class="ipsBadge {{if $status == \IPS\nexus\Transaction::STATUS_PAID}}ipsBadge--positive{{elseif $status == \IPS\nexus\Transaction::STATUS_HELD}}ipsBadge--pending{{elseif $status == \IPS\nexus\Transaction::STATUS_REVIEW or $status == \IPS\nexus\Transaction::STATUS_DISPUTED}}ipsBadge--warning{{elseif $status == \IPS\nexus\Transaction::STATUS_REFUSED}}ipsBadge--negative{{elseif $status == \IPS\nexus\Transaction::STATUS_REFUNDED or $status == \IPS\nexus\Transaction::STATUS_PART_REFUNDED}}ipsBadge--neutral{{else}}ipsBadge--intermediary{{endif}}">
|
|
{lang="tstatus_{$status}"}
|
|
</span>]]></template>
|
|
<template template_group="transactions" template_name="stripeData" template_data="$response=NULL, $error=NULL" template_location="admin" template_app="nexus"><![CDATA[{{if isset( $response['outcome'] )}}
|
|
<div class="i-margin-top_1 i-margin-bottom_1">
|
|
<p>
|
|
<i class="fa-solid fa-shield"></i> {lang="stripe_risk_level" sprintf="$response['outcome']['risk_level']"}
|
|
</p>
|
|
</div>
|
|
{{endif}}
|
|
{{if isset( $response['source']['card'] )}}
|
|
<div class="i-margin-bottom_1">
|
|
<p class='ipsTruncate ipsTruncate_line'>
|
|
{{if isset( $response['source']['card']['tokenization_method'] )}}
|
|
{{if $response['source']['card']['tokenization_method'] == 'apple_pay'}}
|
|
<i class="fa-brands fa-apple"></i> {lang="stripe_tokenization_apple_pay"}
|
|
{{elseif $response['source']['card']['tokenization_method'] == 'android_pay'}}
|
|
<i class="fa-brands fa-google"></i> {lang="stripe_tokenization_android_pay"}
|
|
{{else}}
|
|
{lang="stripe_tokenization_other"} {$response['source']['card']['tokenization_method']}
|
|
{{endif}}
|
|
|
|
{{endif}}
|
|
{{if $response['source']['card']['brand'] == 'Visa' or $response['source']['card']['brand'] == 'visa'}}
|
|
<i class="fa-brands fa-cc-visa" data-ipsTooltip title="{lang="card_type_visa"}"></i>
|
|
{{elseif $response['source']['card']['brand'] == 'MasterCard' or $response['source']['card']['brand'] == 'mastercard'}}
|
|
<i class="fa-brands fa-cc-mastercard" data-ipsTooltip title="{lang="card_type_mastercard"}"></i>
|
|
{{elseif $response['source']['card']['brand'] == 'Discover' or $response['source']['card']['brand'] == 'discover'}}
|
|
<i class="fa-brands fa-cc-discover" data-ipsTooltip title="{lang="card_type_discover"}"></i>
|
|
{{elseif $response['source']['card']['brand'] == 'American Express' or $response['source']['card']['brand'] == 'amex'}}
|
|
<i class="fa-brands fa-cc-amex" data-ipsTooltip title="{lang="card_type_american_express"}"></i>
|
|
{{elseif $response['source']['card']['brand'] == 'Diners Club' or $response['source']['card']['brand'] == 'diners'}}
|
|
<i class="fa-brands fa-cc-diners-club" data-ipsTooltip title="{lang="card_type_diners_club"}"></i>
|
|
{{elseif $response['source']['card']['brand'] == 'JCB' or $response['source']['card']['brand'] == 'jcb'}}
|
|
<i class="fa-brands fa-cc-jcb" data-ipsTooltip title="{lang="card_type_jcb"}"></i>
|
|
{{else}}
|
|
<i class="fa-solid fa-credit-card"></i>
|
|
{{endif}}
|
|
····{$response['source']['card']['last4']}
|
|
|
|
<span class="i-font-size_-1">
|
|
{lang="card_expires"} {expression="str_pad( $response['source']['card']['exp_month'], 2, '0', STR_PAD_LEFT )"}/{$response['source']['card']['exp_year']}
|
|
|
|
{lang="card_origin"} {lang="country-{$response['source']['card']['country']}"}
|
|
</span>
|
|
</p>
|
|
{{foreach array( 'cvc_check', 'address_line1_check', 'address_postal_code_check' ) as $k}}
|
|
<p class='ipsTruncate ipsTruncate_line'>
|
|
{{if $response['source']['card'][ $k ] == 'pass'}}
|
|
<span class="i-color_positive"><i class="fa-solid fa-check"></i> {lang="stripe_{$k}_pass"}</span>
|
|
{{elseif $response['source']['card'][ $k ] == 'fail'}}
|
|
<span class="i-color_warning"><i class="fa-solid fa-triangle-exclamation"></i> {lang="stripe_{$k}_fail"}</span>
|
|
{{else}}
|
|
<span class="i-color_issue"><i class="fa-solid fa-circle-info"></i> {{if $response['source']['card'][ $k ]}}{lang="stripe_{$k}_{$response['source']['card'][ $k ]}"}{{else}}{lang="stripe_{$k}_unchecked"}{{endif}}</span>
|
|
{{endif}}
|
|
</p>
|
|
{{endforeach}}
|
|
{{if isset( $response['source']['three_d_secure'] )}}
|
|
{{if isset( $response['source']['three_d_secure']['authenticated'] ) and $response['source']['three_d_secure']['authenticated']}}
|
|
<span class="i-color_positive"><i class="fa-solid fa-check"></i> {lang="stripe_3ds_pass"}</span>
|
|
{{else}}
|
|
<span class="i-color_warning"><i class="fa-solid fa-triangle-exclamation"></i> {lang="stripe_3ds_fail"}</span>
|
|
{{endif}}
|
|
{{elseif isset( $response['source']['card'] ) and isset( $response['source']['card']['three_d_secure'] ) and \is_array( $response['source']['card']['three_d_secure'] )}}
|
|
{{if isset( $response['source']['card']['three_d_secure']['result'] ) and $response['source']['card']['three_d_secure']['result'] == 'authenticated'}}
|
|
<span class="i-color_positive"><i class="fa-solid fa-check"></i> {lang="stripe_3ds_pass_version" sprintf="$response['source']['card']['three_d_secure']['version']"}</span>
|
|
{{else}}
|
|
<span class="i-color_warning"><i class="fa-solid fa-triangle-exclamation"></i> {lang="stripe_3ds_fail_version" sprintf="$response['source']['card']['three_d_secure']['version']"}</span>
|
|
{{endif}}
|
|
{{else}}
|
|
{{if !isset( $response['card']['three_d_secure'] ) or $response['card']['three_d_secure'] == 'not_supported'}}
|
|
<span class="i-color_soft"><i class="fa-solid fa-circle-info"></i> {lang="stripe_3ds_not_supported"}</span>
|
|
{{else}}
|
|
<i class="fa-solid fa-circle-info"></i> {lang="stripe_3ds_not_checked"}
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
{{if $error}}
|
|
<p class='ipsMessage ipsMessage--error'>
|
|
{lang="stripe_details_error"}
|
|
</p>
|
|
{{endif}}]]></template>
|
|
<template template_group="transactions" template_name="stripeDispute" template_data="$transaction, $log, $response=NULL, $error=NULL" template_location="admin" template_app="nexus"><![CDATA[
|
|
<li class='cTransaction_intermediate'>
|
|
<div class='cTransaction_icon'>
|
|
{{if isset( $response['status'] ) and \in_array( $response['status'], array( 'warning_needs_response', 'warning_under_review', 'warning_closed', 'charge_refunded' ) )}}
|
|
<i class='fa-solid fa-triangle-exclamation'></i>
|
|
{{else}}
|
|
<i class='fa-solid fa-rotate-left'></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h3 class="ipsTitle ipsTitle--h3">
|
|
{{if isset( $response['status'] ) and \in_array( $response['status'], array( 'warning_needs_response', 'warning_under_review', 'warning_closed', 'charge_refunded' ) )}}
|
|
<strong>
|
|
{lang="tstatus_dspd_inquiry_set"}
|
|
</strong>
|
|
{{else}}
|
|
<strong>
|
|
{lang="tstatus_dspd_set"}
|
|
</strong>
|
|
{{endif}}
|
|
</h3>
|
|
<br>
|
|
|
|
{{if isset( $log['on'] ) and $log['on']}}
|
|
{expression="\IPS\DateTime::ts( $log['on'] )"}
|
|
{{if isset( $log['by'] ) and $log['by']}}
|
|
<br>
|
|
<span class='i-font-size_1 i-color_soft'>
|
|
{lang="byline_nodate" sprintf="\IPS\Member::load( $log['by'] )->name"}
|
|
</span>
|
|
{{endif}}
|
|
{{endif}}
|
|
|
|
{{if isset( $response['reason'] )}}
|
|
<p>
|
|
{lang="stripe_dispute_reason_{$response['reason']}"}
|
|
</p>
|
|
{{endif}}
|
|
|
|
{{if isset( $response['status'] ) and \in_array( $response['status'], array( 'needs_response', 'under_review', 'warning_needs_response', 'warning_under_review' ) )}}
|
|
<p class='i-font-weight_bold i-color_warning i-margin-top_1'>
|
|
{lang="stripe_dispute_status_{$response['status']}"}
|
|
</p>
|
|
{{endif}}
|
|
{{if $error}}
|
|
<p class='ipsMessage ipsMessage--error'>
|
|
{lang="stripe_dispute_error"}
|
|
</p>
|
|
{{endif}}
|
|
{{if isset( $response['status'] ) and $response['status'] == 'won'}}
|
|
</div>
|
|
</li>
|
|
<li class='cTransaction_positive'>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-repeat'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h3 class="ipsTitle ipsTitle--h3">
|
|
<strong>
|
|
{lang="transaction_dispute_won"}
|
|
</strong>
|
|
</h3>
|
|
<p>
|
|
{lang="transaction_dispute_won_desc"}
|
|
</p>
|
|
{{if $transaction->status === $transaction::STATUS_DISPUTED}}
|
|
<div class="i-margin-top_1">
|
|
<a href="{$transaction->acpUrl()->setQueryString( array( 'do' => 'approve', 'r' => 'v' ) )->csrf()}" class="ipsButton ipsButton--positive ipsButton--tiny" data-confirm data-confirmSubMessage="{lang="transaction_approve_from_dispute"}">{lang="transaction_approve"}</a>
|
|
<a href="{$transaction->acpUrl()->setQueryString( array( 'do' => 'refund', 'r' => 'v' ) )}" class="ipsButton ipsButton--negative ipsButton--tiny" data-ipsDialog data-ipsDialog-title="{lang="transaction_refund_credit_title" sprintf="$transaction->amount"}">{lang="transaction_refund_credit"}</a>
|
|
</div>
|
|
{{endif}}
|
|
{{elseif isset( $response['status'] ) and $response['status'] == 'warning_closed'}}
|
|
</div>
|
|
</li>
|
|
<li class='cTransaction_positive'>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-check'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h3 class="ipsTitle ipsTitle--h3">
|
|
<strong>
|
|
{lang="transaction_dispute_warning_closed"}
|
|
</strong>
|
|
</h3>
|
|
<p>
|
|
{lang="transaction_dispute_warning_closed_desc"}
|
|
</p>
|
|
{{elseif isset( $response['status'] ) and $response['status'] == 'lost'}}
|
|
</div>
|
|
</li>
|
|
<li class='cTransaction_negative'>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-xmark'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h3 class="ipsTitle ipsTitle--h3">
|
|
<strong>
|
|
{lang="transaction_dispute_lost"}
|
|
</strong>
|
|
</h3>
|
|
<p>
|
|
{lang="transaction_dispute_lost_desc"}
|
|
</p>
|
|
{{endif}}
|
|
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="transactions" template_name="undo_credit" template_data="$transaction, $log" template_location="admin" template_app="nexus"><![CDATA[
|
|
<li class='cTransaction_intermediate'>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-forward-fast'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h3 class="ipsTitle ipsTitle--h3">
|
|
<strong>
|
|
{lang="tstatus_credited_undo"}
|
|
</strong>
|
|
</h3>
|
|
<br>
|
|
|
|
{{if isset( $log['amount'] )}}
|
|
{{if $transaction->amount->amount->compare( new \IPS\Math\Number( $log['amount'] ) ) !== 0}}
|
|
<p class='i-font-size_2'>
|
|
<span class='cNexusPrice'>{money="$log['amount']" currency="$transaction->currency"}</span>
|
|
</p>
|
|
{{endif}}
|
|
{{endif}}
|
|
|
|
{{if isset( $log['on'] ) and $log['on']}}
|
|
{expression="\IPS\DateTime::ts( $log['on'] )"}
|
|
{{if isset( $log['by'] ) and $log['by']}}
|
|
<br>
|
|
<span class='i-font-size_1 i-color_soft'>
|
|
{lang="byline_nodate" sprintf="\IPS\Member::load( $log['by'] )->name"}
|
|
</span>
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="transactions" template_name="view" template_data="$transaction" template_location="admin" template_app="nexus"><![CDATA[
|
|
<div class='ipsColumns'>
|
|
<div class='ipsColumns__secondary i-basis_280'>
|
|
<div class="ipsBox i-text-align_center i-padding_3 i-position_sticky-top" style="--_i-sticky-margin: 15px">
|
|
<h2 class='ipsMinorTitle'>{lang="transaction_total"}</h2>
|
|
<span class="i-font-size_6">{$transaction->amount}</span>
|
|
{{if $transaction->status === $transaction::STATUS_PART_REFUNDED}}
|
|
{{if $transaction->partial_refund->amount->isGreaterThanZero()}}
|
|
<div class="i-margin-top_1">
|
|
<h2 class='ipsMinorTitle'>{lang="amount_refunded"}</h2>
|
|
<span class="i-font-size_2">{$transaction->partial_refund}</span>
|
|
</div>
|
|
{{endif}}
|
|
{{if $transaction->credit->amount->isGreaterThanZero()}}
|
|
<div class="i-margin-top_1">
|
|
<h2 class='ipsMinorTitle'>{lang="amount_credited"}</h2>
|
|
<span class="i-font-size_2">{$transaction->credit}</span>
|
|
</div>
|
|
{{endif}}
|
|
{{endif}}
|
|
<hr class='ipsHr'>
|
|
|
|
<ul class='ipsButtons ipsButtons--view-transaction'>
|
|
{{foreach $transaction->buttons('v') as $k => $button}}
|
|
<li>
|
|
<a href='{$button['link']}' class='ipsButton ipsButton--wide {{if $k === 'approve'}}ipsButton--positive{{elseif $k === 'void'}} ipsButton--negative{{elseif $k === 'delete'}}ipsButton--text{{else}} ipsButton--inherit{{endif}}' {{if isset( $button['data'] )}}{{foreach $button['data'] as $k => $v}}data-{$k}="{$v}"{{endforeach}}{{endif}}><i class='fa-solid fa-{$button['icon']}'></i> {lang="$button['title']"}</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class='ipsColumns__primary'>
|
|
|
|
<div class="ipsMessage i-margin-bottom_1 {{if $transaction->status == \IPS\nexus\Transaction::STATUS_PAID}}ipsMessage--success{{elseif $transaction->status == \IPS\nexus\Transaction::STATUS_HELD}}ipsMessage--warning{{elseif $transaction->status == \IPS\nexus\Transaction::STATUS_REVIEW}}ipsMessage--warning{{elseif $transaction->status == \IPS\nexus\Transaction::STATUS_REFUSED or $transaction->status == \IPS\nexus\Transaction::STATUS_DISPUTED}}ipsMessage--error{{else}}ipsMessage--info{{endif}}">
|
|
{{if $transaction->auth and \in_array( $transaction->status, array( \IPS\nexus\Transaction::STATUS_HELD, \IPS\nexus\Transaction::STATUS_REVIEW ) )}}
|
|
{lang="tstatus_{$transaction->status}_nc_desc"}
|
|
{{else}}
|
|
{lang="tstatus_{$transaction->status}_desc"}
|
|
{{endif}}
|
|
</div>
|
|
|
|
{{if isset( $transaction->extra['admin'] )}}
|
|
<div class='ipsMessage ipsMessage--info i-margin-bottom_1'>
|
|
{lang="transaction_admin_manual" sprintf="\IPS\Member::load( $transaction->extra['admin'] )->name"}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if $transaction->fraud}}
|
|
{{if $transaction->fraud->id}}
|
|
<div class='ipsBox i-margin-bottom_1'>
|
|
<h2 class='ipsBox__header'>{lang="maxmind_title"}</h2>
|
|
<div class='i-padding_3'>
|
|
{{if $errorMessage = $transaction->fraud->error()}}
|
|
<div class='ipsMessage ipsMessage--error'>
|
|
<h3 class='ipsMessage__title'>{lang="error_from_maxmind"}</h3>
|
|
<p>
|
|
{$transaction->fraud->error}
|
|
</p>
|
|
</div>
|
|
{{else}}
|
|
{{if $warning = $transaction->fraud->warning()}}
|
|
<div class='ipsMessage ipsMessage--error'>
|
|
<h3 class='ipsMessage__title'>{lang="warning_from_maxmind"}</h3>
|
|
<p>
|
|
{$transaction->fraud->error}
|
|
</p>
|
|
</div>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if !$errorMessage}}
|
|
<div class="i-margin-bottom_3 i-flex">
|
|
<h3 class='cTransactionFraud_riskScore {{if $transaction->fraud->risk_score > 80}}i-color_warning{{endif}}'>{$transaction->fraud->risk_score}%</h3>
|
|
<p class='cTransactionFraud_riskInfo i-flex_11'>
|
|
<span class='i-font-size_2'>{lang="possibility_of_fraud"}</span><br>
|
|
<span class='i-color_soft'>{lang="checked_by_maxmind"}</span>
|
|
</p>
|
|
</div>
|
|
|
|
<div class='ipsSpanGrid'>
|
|
<div class='ipsSpanGrid__4 i-background_1'>
|
|
<h3 class='acpBlock_title acpBlock_titleSmall'>{lang="maxmind_geo_ip"}</h3>
|
|
<div class='i-padding_3'>
|
|
{{if $transaction->fraud->ip_address['location']['latitude'] AND $transaction->fraud->ip_address['location']['longitude']}}
|
|
{{if \IPS\GeoLocation::enabled()}}
|
|
{{$map = \IPS\GeoLocation::getByLatLong( $transaction->fraud->ip_address['location']['latitude'], $transaction->fraud->ip_address['location']['longitude'] )->map()->render( 600, 200 );}}
|
|
<div class="i-padding_2">{$map|raw}</div>
|
|
{{else}}
|
|
<p>{$transaction->fraud->ip_address['location']['latitude']},{$transaction->fraud->ip_address['location']['longitude']}</p>
|
|
{{endif}}
|
|
{{endif}}
|
|
<p class="i-margin-top_1">{lang="maxmind_distance" sprintf="$transaction->fraud->billing_address['distance_to_ip_location']"}</p>
|
|
<p class="i-font-size_-1 i-color_soft">{{if $transaction->fraud->ip_address['location']['accuracy_radius']}}{lang="maxmind_ip_accuracyRadius" sprintf="$transaction->fraud->ip_address['location']['accuracy_radius']"}{{else}}{lang="maxmind_distance_estimated"}{{endif}}</p>
|
|
|
|
<ul class='i-margin-bottom_1 cTransactionFraud_geoip i-margin-top_1'>
|
|
{{if isset( $transaction->fraud->ip_address['city'] )}}
|
|
<li>
|
|
<span {{if $transaction->fraud->ip_address['city']['confidence']}}class='cTransactionFraud_geoInfo' title='{lang="maxmind_ip_accuracy" sprintf="$transaction->fraud->ip_address['city']['confidence']"}' data-ipsTooltip{{endif}}>
|
|
{$transaction->fraud->ip_address['city']['names']['en']}
|
|
</span>
|
|
{{if isset( $transaction->fraud->ip_address['location']['metro_code'] )}}<span class='i-color_soft'>({$transaction->fraud->ip_address['location']['metro_code']})</span>{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{if $transaction->fraud->ip_postalCode}}
|
|
<li>
|
|
<span {{if $transaction->fraud->ip_address['postal']['confidence']}}class='cTransactionFraud_geoInfo' title='{lang="maxmind_ip_accuracy" sprintf="$transaction->fraud->ip_address['postal']['confidence']"}' data-ipsTooltip{{endif}}>
|
|
{{if $transaction->fraud->ip_address['postal']['code']}}{$transaction->fraud->ip_address['postal']['code']}{{endif}}
|
|
</span>
|
|
</li>
|
|
{{endif}}
|
|
{{if isset( $transaction->fraud->ip_address['country'] )}}
|
|
<li>
|
|
<span {{if $transaction->fraud->ip_address['country']['confidence']}}class='cTransactionFraud_geoInfo' title='{lang="maxmind_ip_accuracy" sprintf="$transaction->fraud->ip_countryConf"}' data-ipsTooltip{{endif}}>
|
|
{lang="country-{$transaction->fraud->ip_address['country']['iso_code']}"}
|
|
</span>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
|
|
<ul class='cTransactionFraud'>
|
|
{{if isset( $transaction->fraud->billing_address['is_in_ip_country'] )}}
|
|
{{if $transaction->fraud->billing_address['is_in_ip_country']}}
|
|
<li class='cTransactionFraud_positive'>
|
|
<i class="fa-solid fa-check"></i>
|
|
<p>{lang="maxmind_countryMatch_y"}</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-triangle-exclamation"></i>
|
|
<p>{lang="maxmind_countryMatch_n"}</p>
|
|
</li>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if isset( $transaction->fraud->ip_address['country']['is_high_risk'] ) and $transaction->fraud->ip_address['country']['is_high_risk']}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-triangle-exclamation"></i>
|
|
<p>{lang="maxmind_highRiskCountry_y"}</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_positive'>
|
|
<i class="fa-solid fa-check"></i>
|
|
<p>{lang="maxmind_highRiskCountry_n"}</p>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class='ipsSpanGrid__4 i-background_1'>
|
|
<h3 class='acpBlock_title acpBlock_titleSmall'>{lang="maxmind_ip"}</h3>
|
|
<div class='i-padding_3'>
|
|
<div class="ipsProgress">
|
|
<div class="ipsProgress__progress {{if $transaction->fraud->ip_address['risk'] > 75}}ipsProgress__progress--warning{{endif}}" style="width: {$transaction->fraud->ip_address['risk']}%">{$transaction->fraud->ip_address['risk']}%</div>
|
|
</div>
|
|
<p class='i-font-size_1 i-margin-top_1'>{lang="maxmind_proxyScore"}</p>
|
|
<p class='i-font-size_-1 i-color_soft'>{lang="maxmind_proxyScore_desc"}</p>
|
|
|
|
<ul class='cTransactionFraud i-margin-top_1'>
|
|
{{if isset( $transaction->fraud->ip_address['traits']['is_anonymous_proxy'] ) and $transaction->fraud->ip_address['traits']['is_anonymous_proxy']}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-circle-exclamation"></i>
|
|
<p>
|
|
<span class='cTransactionFraud_geoInfo' title="{lang="maxmind_anonymousProxy_desc"}" data-ipsTooltip>
|
|
{lang="maxmind_anonymousProxy_y"}
|
|
</span>
|
|
</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_success'>
|
|
<i class="fa-solid fa-check-circle"></i>
|
|
<p>
|
|
<span class='cTransactionFraud_geoInfo' title="{lang="maxmind_anonymousProxy_desc"}" data-ipsTooltip>
|
|
{lang="maxmind_anonymousProxy_n"}
|
|
</span>
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if isset( $transaction->fraud->ip_address['traits']['is_tor_exit_node'] ) and $transaction->fraud->ip_address['traits']['is_tor_exit_node']}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-circle-exclamation"></i>
|
|
<p>
|
|
<span class='cTransactionFraud_geoInfo' title="{lang="maxmind_torExit_desc"}" data-ipsTooltip>
|
|
{lang="maxmind_torExit_y"}
|
|
</span>
|
|
</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_success'>
|
|
<i class="fa-solid fa-check-circle"></i>
|
|
<p>
|
|
<span class='cTransactionFraud_geoInfo' title="{lang="maxmind_torExit_desc"}" data-ipsTooltip>
|
|
{lang="maxmind_torExit_n"}
|
|
</span>
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
|
|
{{if isset( $transaction->fraud->ip_address['traits']['isp'] )}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{lang="maxmind_ip_isp"}: {$transaction->fraud->ip_address['traits']['isp']}
|
|
{{if $transaction->fraud->ip_address['traits']['organization'] and $transaction->fraud->ip_address['traits']['organization'] != $transaction->fraud->ip_address['traits']['isp']}}
|
|
<br><span class="i-color_soft i-font-size_-1">({$transaction->fraud->ip_address['traits']['organization']})</span>
|
|
{{endif}}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if isset( $transaction->fraud->ip_address['traits']['user_type'] )}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{lang="maxmind_ip_userType_{$transaction->fraud->ip_address['traits']['user_type']}"}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if isset( $transaction->fraud->ip_address['traits']['organization'] )}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{lang="maxmind_ip_timeZone"}: {$transaction->fraud->ip_address['location']['time_zone']}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if $transaction->fraud->ip_domain}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{lang="maxmind_ip_domain"}: {$transaction->fraud->ip_domain}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if isset( $transaction->fraud->ip_address['traits']['autonomous_system_number'] )}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{lang="maxmind_ip_asnum"}: {$transaction->fraud->ip_address['traits']['autonomous_system_number']}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class='ipsSpanGrid__4 i-background_1'>
|
|
{{if $transaction->fraud->credit_card}}
|
|
<h3 class='acpBlock_title acpBlock_titleSmall'>{lang="maxmind_card_issuer"}</h3>
|
|
<div class='i-padding_3'>
|
|
{{if isset( $transaction->fraud->credit_card['issuer']['name'] )}}
|
|
<p class='i-font-size_2'>
|
|
<strong>{$transaction->fraud->credit_card['issuer']['name']}</strong>
|
|
</p>
|
|
{{if isset( $transaction->fraud->credit_card['country'] ) || isset( $transaction->fraud->credit_card['issuer']['phone_number'] )}}
|
|
<ul class='cTransactionFraud i-margin-top_1'>
|
|
{{if isset( $transaction->fraud->credit_card['country'] )}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-earth-americas"></i>
|
|
<p>
|
|
{lang="country-{$transaction->fraud->credit_card['country']}"}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if isset( $transaction->fraud->credit_card['issuer']['phone_number'] )}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-phone"></i>
|
|
<p>
|
|
{$transaction->fraud->credit_card['issuer']['phone_number']}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
<h3 class='acpBlock_title acpBlock_titleSmall'>{lang="maxmind_customer_information"}</h3>
|
|
<div class='i-padding_3'>
|
|
<ul class='cTransactionFraud'>
|
|
{{foreach array( 'disposable', 'free', 'high_risk' ) as $k}}
|
|
{{if !$transaction->fraud->email['is_' . $k]}}
|
|
<li class='cTransactionFraud_positive'>
|
|
<i class="fa-solid fa-check-circle"></i>
|
|
<p>{lang="maxmind_{$k}_n"}</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-circle-exclamation"></i>
|
|
<p>{lang="maxmind_{$k}_y"}</p>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<hr class='ipsHr'>
|
|
<p class='i-font-size_1 i-color_soft'>
|
|
{lang="maxmind_footer_insights" sprintf="$transaction->fraud->id"} ({lang="maxmind_queries" sprintf="$transaction->fraud->queries_remaining"})
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{else}}
|
|
<div class='ipsBox i-margin-bottom_1'>
|
|
<h2 class='ipsBox__header'>{lang="maxmind_title"}</h2>
|
|
<div class='i-padding_3'>
|
|
{{if $errorMessage = $transaction->fraud->error()}}
|
|
<div class='ipsMessage ipsMessage--error'>
|
|
<h3 class='ipsMessage__title'>{lang="error_from_maxmind"}</h3>
|
|
<p>
|
|
{$transaction->fraud->error}
|
|
</p>
|
|
</div>
|
|
{{else}}
|
|
{{if $warning = $transaction->fraud->warning()}}
|
|
<div class='ipsMessage ipsMessage--error'>
|
|
<h3 class='ipsMessage__title'>{lang="warning_from_maxmind"}</h3>
|
|
<p>
|
|
{$transaction->fraud->error}
|
|
</p>
|
|
</div>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if !$errorMessage}}
|
|
<div class="i-margin-bottom_3 i-flex">
|
|
{{if $transaction->fraud->riskScore !== NULL}}
|
|
<h3 class='cTransactionFraud_riskScore {{if $transaction->fraud->riskScore > 80}}i-color_warning{{endif}}'>{$transaction->fraud->riskScore}%</h3>
|
|
{{else}}
|
|
<h3 class='cTransactionFraud_riskScore {{if $transaction->fraud->score > 8}}i-color_warning{{endif}}'>{expression="round( $transaction->fraud->score * 10 )"}%</h3>
|
|
{{endif}}
|
|
<p class='cTransactionFraud_riskInfo i-flex_11'>
|
|
<span class='i-font-size_2'>{lang="possibility_of_fraud"}</span><br>
|
|
<span class='i-color_soft'>{lang="checked_by_maxmind"}</span>
|
|
</p>
|
|
</div>
|
|
|
|
<div class='ipsSpanGrid'>
|
|
<div class='ipsSpanGrid__4 i-background_1'>
|
|
<h3 class='acpBlock_title acpBlock_titleSmall'>{lang="maxmind_geo_ip"}</h3>
|
|
<div class='i-padding_3'>
|
|
{{if $transaction->fraud->ip_latitude AND $transaction->fraud->ip_longitude}}
|
|
{{if \IPS\GeoLocation::enabled()}}
|
|
{{$map = \IPS\GeoLocation::getByLatLong( $transaction->fraud->ip_latitude, $transaction->fraud->ip_longitude )->map()->render( 600, 200 );}}
|
|
<div class="i-padding_2">{$map|raw}</div>
|
|
{{else}}
|
|
<p>{$transaction->fraud->ip_latitude},{$transaction->fraud->ip_longitude}</p>
|
|
{{endif}}
|
|
{{endif}}
|
|
<p class="i-margin-top_1">{lang="maxmind_distance" sprintf="$transaction->fraud->distance"}</p>
|
|
<p class="i-font-size_-1 i-color_soft">{{if $transaction->fraud->ip_accuracyRadius}}{lang="maxmind_ip_accuracyRadius" sprintf="$transaction->fraud->ip_accuracyRadius"}{{else}}{lang="maxmind_distance_estimated"}{{endif}}</p>
|
|
|
|
<ul class='i-margin-bottom_1 cTransactionFraud_geoip i-margin-top_1'>
|
|
<li>
|
|
<span {{if $transaction->fraud->ip_cityConf}}class='cTransactionFraud_geoInfo' title='{lang="maxmind_ip_accuracy" sprintf="$transaction->fraud->ip_cityConf"}' data-ipsTooltip{{endif}}>
|
|
{$transaction->fraud->ip_city}
|
|
</span>
|
|
{{if isset( $transaction->fraud->ip_metroCode )}}<span class='i-color_soft'>({$transaction->fraud->ip_metroCode})</span>{{endif}}
|
|
</li>
|
|
{{if $transaction->fraud->ip_regionName || $transaction->fraud->ip_region || $transaction->fraud->ip_postalCode}}
|
|
<li>
|
|
{{if $transaction->fraud->ip_regionName || $transaction->fraud->ip_region}}
|
|
<span {{if $transaction->fraud->ip_regionConf}}class='cTransactionFraud_geoInfo' title='{lang="maxmind_ip_accuracy" sprintf="$transaction->fraud->ip_regionConf"}' data-ipsTooltip{{endif}}>
|
|
{{if $transaction->fraud->ip_regionName}}{$transaction->fraud->ip_regionName}{{elseif $transaction->fraud->ip_region}}{$transaction->fraud->ip_region}{{endif}}
|
|
</span>
|
|
{{endif}}
|
|
{{if $transaction->fraud->ip_postalCode}}
|
|
<span {{if $transaction->fraud->ip_postalConf}}class='cTransactionFraud_geoInfo' title='{lang="maxmind_ip_accuracy" sprintf="$transaction->fraud->ip_postalConf"}' data-ipsTooltip{{endif}}>
|
|
{{if $transaction->fraud->ip_postalCode}}{$transaction->fraud->ip_postalCode}{{endif}}
|
|
</span>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{if $transaction->fraud->ip_countryName || $transaction->fraud->countryCode}}
|
|
<li>
|
|
<span {{if $transaction->fraud->ip_countryConf}}class='cTransactionFraud_geoInfo' title='{lang="maxmind_ip_accuracy" sprintf="$transaction->fraud->ip_countryConf"}' data-ipsTooltip{{endif}}>
|
|
{{if $transaction->fraud->ip_countryName}}{$transaction->fraud->ip_countryName}{{elseif $transaction->fraud->countryCode}}{lang="country-{$transaction->fraud->countryCode}"}{{endif}}
|
|
</span>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
|
|
<ul class='cTransactionFraud'>
|
|
{{if $transaction->fraud->countryMatch == 'Yes'}}
|
|
<li class='cTransactionFraud_positive'>
|
|
<i class="fa-solid fa-check"></i>
|
|
<p>{lang="maxmind_countryMatch_y"}</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-triangle-exclamation"></i>
|
|
<p>{lang="maxmind_countryMatch_n"}</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if $transaction->fraud->highRiskCountry == 'No'}}
|
|
<li class='cTransactionFraud_positive'>
|
|
<i class="fa-solid fa-check"></i>
|
|
<p>{lang="maxmind_highRiskCountry_n"}</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-triangle-exclamation"></i>
|
|
<p>{lang="maxmind_highRiskCountry_y"}</p>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class='ipsSpanGrid__4 i-background_1'>
|
|
<h3 class='acpBlock_title acpBlock_titleSmall'>{lang="maxmind_ip"}</h3>
|
|
<div class='i-padding_3'>
|
|
<div class="ipsProgress">
|
|
<div class="ipsProgress__progress {{if $transaction->fraud->proxyScorePercentage() > 75}}ipsProgress__progress--warning{{endif}}" style="width: {$transaction->fraud->proxyScorePercentage()}%">{$transaction->fraud->proxyScorePercentage()}%</div>
|
|
</div>
|
|
<p class='i-font-size_1 i-margin-top_1'>{lang="maxmind_proxyScore"}</p>
|
|
<p class='i-font-size_-1 i-color_soft'>{lang="maxmind_proxyScore_desc"}</p>
|
|
|
|
<ul class='cTransactionFraud i-margin-top_1'>
|
|
{{if $transaction->fraud->anonymousProxy == 'No'}}
|
|
<li class='cTransactionFraud_success'>
|
|
<i class="fa-solid fa-check-circle"></i>
|
|
<p>
|
|
<span class='cTransactionFraud_geoInfo' title="{lang="maxmind_anonymousProxy_desc"}" data-ipsTooltip>
|
|
{lang="maxmind_anonymousProxy_n"}
|
|
</span>
|
|
</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-circle-exclamation"></i>
|
|
<p>
|
|
<span class='cTransactionFraud_geoInfo' title="{lang="maxmind_anonymousProxy_desc"}" data-ipsTooltip>
|
|
{lang="maxmind_anonymousProxy_y"}
|
|
</span>
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
|
|
{{foreach array( 'isTransProxy', 'ip_corporateProxy' ) as $k}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{{if $transaction->fraud->$k == 'No'}}
|
|
{lang="maxmind_{$k}_n"}
|
|
{{else}}
|
|
{lang="maxmind_{$k}_y"}
|
|
{{endif}}
|
|
</p>
|
|
</li>
|
|
{{endforeach}}
|
|
|
|
{{if $transaction->fraud->ip_isp}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{lang="maxmind_ip_isp"}: {$transaction->fraud->ip_isp}
|
|
{{if $transaction->fraud->ip_org and $transaction->fraud->ip_org != $transaction->fraud->ip_isp}}
|
|
<br><span class="i-color_soft i-font-size_-1">({$transaction->fraud->ip_org})</span>
|
|
{{endif}}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if $transaction->fraud->ip_userType}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{lang="maxmind_ip_userType_{$transaction->fraud->ip_userType}"}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if $transaction->fraud->ip_timeZone}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{lang="maxmind_ip_timeZone"}: {$transaction->fraud->ip_timeZone}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if $transaction->fraud->ip_netSpeedCell}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{lang="maxmind_ip_netSpeedCell"}: {$transaction->fraud->ip_netSpeedCell}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if $transaction->fraud->ip_domain}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{lang="maxmind_ip_domain"}: {$transaction->fraud->ip_domain}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if $transaction->fraud->ip_asnum}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-info"></i>
|
|
<p>
|
|
{lang="maxmind_ip_asnum"}: {$transaction->fraud->ip_asnum}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class='ipsSpanGrid__4 i-background_1'>
|
|
{{if $transaction->fraud->binMatch !== 'NA' and $transaction->fraud->binMatch !== 'NotFound'}}
|
|
<h3 class='acpBlock_title acpBlock_titleSmall'>{lang="maxmind_card_issuer"}</h3>
|
|
<div class='i-padding_3'>
|
|
{{if $transaction->fraud->binName}}
|
|
<p class='i-font-size_2'>
|
|
<strong>{$transaction->fraud->binName}</strong>
|
|
</p>
|
|
{{if $transaction->fraud->binCountry || $transaction->fraud->binPhone}}
|
|
<ul class='cTransactionFraud i-margin-top_1'>
|
|
{{if $transaction->fraud->binCountry}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-earth-americas"></i>
|
|
<p>
|
|
{lang="country-{$transaction->fraud->binCountry}"}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
{{if $transaction->fraud->binPhone}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-phone"></i>
|
|
<p>
|
|
{$transaction->fraud->binPhone}
|
|
</p>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
{{endif}}
|
|
{{endif}}
|
|
|
|
<ul class='cTransactionFraud {{if $transaction->fraud->binName}}i-margin-top_1{{endif}}'>
|
|
{{if $transaction->fraud->binMatch == 'Yes'}}
|
|
<li class='cTransactionFraud_success'>
|
|
<i class="fa-solid fa-check-circle"></i>
|
|
<p>{lang="maxmind_binMatch_y"}</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-circle-exclamation"></i>
|
|
<p>{lang="maxmind_binMatch_n"}</p>
|
|
</li>
|
|
{{endif}}
|
|
<li class='cTransactionFraud_neutral'>
|
|
<i class="fa-solid fa-circle-exclamation"></i>
|
|
<p>
|
|
{{if $transaction->fraud->prepaid == 'Yes'}}
|
|
{lang="maxmind_binMatch_y"}
|
|
{{else}}
|
|
{lang="maxmind_binMatch_n"}
|
|
{{endif}}
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
|
|
<h3 class='acpBlock_title acpBlock_titleSmall'>{lang="maxmind_customer_information"}</h3>
|
|
<div class='i-padding_3'>
|
|
<ul class='cTransactionFraud'>
|
|
{{if $transaction->fraud->custPhoneInBillingLoc and $transaction->fraud->custPhoneInBillingLoc != 'NotFound'}}
|
|
{{if $transaction->fraud->custPhoneInBillingLoc == 'No'}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-circle-exclamation"></i>
|
|
<p>{lang="maxmind_custPhoneInBillingLoc_n"}</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_positive'>
|
|
<i class="fa-solid fa-check-circle"></i>
|
|
<p>{lang="maxmind_custPhoneInBillingLoc_y"}</p>
|
|
</li>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if $transaction->fraud->cityPostalMatch}}
|
|
{{if $transaction->fraud->cityPostalMatch == 'No'}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-circle-exclamation"></i>
|
|
<p>{lang="maxmind_cityPostalMatch_n"}</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_positive'>
|
|
<i class="fa-solid fa-check-circle"></i>
|
|
<p>{lang="maxmind_cityPostalMatch_y"}</p>
|
|
</li>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{foreach array( 'freeMail', 'carderEmail' ) as $k}}
|
|
{{if $transaction->fraud->$k == 'No'}}
|
|
<li class='cTransactionFraud_positive'>
|
|
<i class="fa-solid fa-check-circle"></i>
|
|
<p>{lang="maxmind_{$k}_n"}</p>
|
|
</li>
|
|
{{else}}
|
|
<li class='cTransactionFraud_negative'>
|
|
<i class="fa-solid fa-circle-exclamation"></i>
|
|
<p>{lang="maxmind_{$k}_y"}</p>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<hr class='ipsHr'>
|
|
<p class='i-font-size_1 i-color_soft'>
|
|
{{if $transaction->fraud->minfraud_version}}
|
|
{lang="maxmind_footer" sprintf="$transaction->fraud->service_level, $transaction->fraud->minfraud_version, $transaction->fraud->maxmindID"} ({lang="maxmind_queries" sprintf="$transaction->fraud->queriesRemaining"})
|
|
{{endif}}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
{{endif}}
|
|
|
|
<div class='ipsSpanGrid'>
|
|
<div class='ipsSpanGrid__6'>
|
|
<div class="ipsBox">
|
|
<h2 class="ipsBox__header">{lang="transaction_history"}</h2>
|
|
<div class='i-padding_3'>
|
|
<ul class='cTransaction'>
|
|
<li>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-cart-shopping'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h2 class='ipsTitle ipsTitle--h3'>
|
|
{{if $transaction->method}}
|
|
{{if \in_array( $transaction->status, array( \IPS\nexus\Transaction::STATUS_PENDING, \IPS\nexus\Transaction::STATUS_WAITING ) )}}
|
|
{lang="transaction_method_pending" sprintf="$transaction->method->_title"}
|
|
{{else}}
|
|
{lang="transaction_method" sprintf="$transaction->method->_title"}
|
|
{{endif}}
|
|
{{else}}
|
|
{{if $transaction->method !== 0 }}
|
|
{lang="tstatus_okay_deleted"}
|
|
{{else}}
|
|
{lang="tstatus_okay_credit"}
|
|
{{endif}}
|
|
{{endif}}
|
|
</h2>
|
|
<p class="i-color_soft">
|
|
{$transaction->date}
|
|
</p>
|
|
{{if $transaction->gw_id}}
|
|
<p class="i-color_soft">
|
|
{lang="payment_reference"}: {{if $transaction->method AND $url = $transaction->method->gatewayUrl( $transaction )}}<a href="{$url}" target="_blank" rel='noreferrer'>{$transaction->gw_id}</a>{{else}}{$transaction->gw_id}{{endif}}<br>
|
|
</p>
|
|
{{endif}}
|
|
{{if $transaction->method and $extraData = $transaction->method->extraData( $transaction )}}
|
|
{$extraData|raw}
|
|
{{endif}}
|
|
{{if $transaction->billing_agreement}}
|
|
<p>
|
|
<a href="{$transaction->billing_agreement->acpUrl()}">{lang="billing_agreement" sprintf="$transaction->billing_agreement->gw_id"}</a><br>
|
|
</p>
|
|
{{endif}}
|
|
{{if $transaction->ip}}
|
|
<span class='i-font-size_1 i-color_soft'>
|
|
<a class="i-link-color_inherit" href="{url="app=core&module=members&controller=ip&ip={$transaction->ip}"}">{lang="transaction_ip" sprintf="$transaction->ip"}</a>
|
|
</span>
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
|
|
{{if $transaction->fraud_blocked}}
|
|
<li>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-solid fa-circle-exclamation'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<h2 class='ipsTitle ipsTitle--h3'><strong>{lang="triggered_fraud_rule"}</strong></h2>
|
|
<p>
|
|
{$transaction->fraud_blocked->name}
|
|
</p>
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
|
|
{{foreach $transaction->history() as $log}}
|
|
{template="$log['s']" group="transactions" params="$transaction, $log"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class='ipsSpanGrid__6'>
|
|
{{if $transaction->member AND $transaction->member->member_id}}
|
|
<div class='ipsBox i-margin-bottom_1'>
|
|
<h2 class="ipsBox__header">{lang="transaction_customer"}</h2>
|
|
<div class='i-padding_3'>
|
|
<div class='ipsPhotoPanel ipsPhotoPanel_small'>
|
|
<a href="{$transaction->member->acpUrl()}" class='ipsUserPhoto ipsUserPhoto--small'><img src='{$transaction->member->photo}' loading="lazy" alt=""></a>
|
|
<div class="ipsPhotoPanel__text">
|
|
<h3 class="ipsPhotoPanel__primary">
|
|
<strong><a class="i-link-color_inherit" href="{$transaction->member->acpUrl()}">{$transaction->member->cm_name}</a></strong>
|
|
</h3>
|
|
<p class="ipsPhotoPanel__secondary">
|
|
<span class='i-color_soft'>{$transaction->member->email}</span><br>
|
|
</p>
|
|
</div>
|
|
{{if member.hasAcpRestriction( 'nexus', 'customers', 'customers_void' )}}
|
|
<a href="{url="app=nexus&module=customers&controller=view&do=void&id={$transaction->member->member_id}&rt={$transaction->id}"}" class="ipsButton ipsButton--inherit ipsButton--small" data-ipsDialog data-ipsDialog-title="{lang="void_account"}">{lang="void_account"}</a>
|
|
{{endif}}
|
|
</div>
|
|
<ul class="ipsList ipsList--inline ipsList--sep i-margin-top_2">
|
|
<li><strong>{lang="transaction_spent" sprintf="$transaction->member->totalSpent()"}</strong></li>
|
|
<li>{lang="transaction_customer_since" sprintf="$transaction->member->joined->localeDate()"}</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
{{else}}
|
|
<div class='ipsBox i-margin-bottom_1'>
|
|
<h2 class="ipsBox__header">{lang="transaction_customer"}</h2>
|
|
<div class='i-padding_3'>
|
|
<div class='i-background_2 i-padding_3 ipsPhotoPanel ipsPhotoPanel_large'>
|
|
<img src='{resource="default_photo.png" app="core" location="global"}' class='ipsUserPhoto'>
|
|
<div>
|
|
{{if $transaction->invoice AND !empty( $transaction->invoice->guest_data )}}
|
|
<h3 class="ipsTitle ipsTitle--h3">
|
|
<strong>
|
|
{{if isset( $transaction->invoice->guest_data['member']['name'] )}}
|
|
{$transaction->invoice->guest_data['member']['name']}
|
|
{{elseif isset( $transaction->invoice->guest_data['member']['cm_first_name'] )}}
|
|
{$transaction->invoice->guest_data['member']['cm_first_name']} {$transaction->invoice->guest_data['member']['cm_last_name']}
|
|
{{endif}}
|
|
</strong>
|
|
<span class='i-color_soft'>{$transaction->invoice->guest_data['member']['email']}</span>
|
|
</h3>
|
|
{{elseif !$transaction->member}}
|
|
<span class="i-font-size_2">{lang="deleted_member"}</span>
|
|
{{else}}
|
|
<span class="i-font-size_2">{lang="guest"}</span>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if $transaction->invoice}}
|
|
<div class="ipsBox i-margin-bottom_1">
|
|
<h2 class="ipsBox__header">{lang="invoice_number" sprintf="$transaction->invoice->id"}</h2>
|
|
<div class='i-padding_3'>
|
|
{{$summary = $transaction->invoice->summary();}}
|
|
<i-data>
|
|
<ul class="ipsData ipsData--table ipsData--compact ipsData--invoice">
|
|
{{foreach $summary['items'] as $item}}
|
|
<li class="ipsData__item">
|
|
<div class="ipsData__main">
|
|
{$item->name}{{if $item->quantity > 1}} x{$item->quantity}{{endif}}
|
|
{{if \count( $item->details )}}
|
|
<br>
|
|
<span class="i-color_soft">
|
|
{{foreach $item->details as $k => $v}}
|
|
{lang="nexus_pfield_{$k}"}: {$v}<br>
|
|
{{endforeach}}
|
|
</span>
|
|
{{endif}}
|
|
</div>
|
|
<div class="i-basis_100 i-text-align_end">
|
|
{$item->linePrice()}
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
<li class="ipsData__item cTransactionInvoice_subtotal">
|
|
<div class="ipsData__main">
|
|
<strong>{lang="subtotal"}</strong>
|
|
</div>
|
|
<div class="i-basis_100 i-text-align_end">
|
|
<strong>{$summary['subtotal']}</strong>
|
|
</div>
|
|
</li>
|
|
{{foreach $summary['tax'] as $taxId => $tax}}
|
|
<li class="ipsData__item">
|
|
<div class="ipsData__main">
|
|
{lang="nexus_tax_{$taxId}"}
|
|
{{if $tax['type'] !== 'single'}}
|
|
{{if $tax['type'] === 'eu' and $transaction->invoice->billaddress->business and $transaction->invoice->billaddress->vat}}
|
|
({lang="tax_rate_eu"}: {expression="$tax['rate']*100"}%)
|
|
{{elseif $transaction->invoice->billaddress->business}}
|
|
({lang="tax_rate_business"}: {expression="$tax['rate']*100"}%)
|
|
{{else}}
|
|
({lang="tax_rate_consumer"}: {expression="$tax['rate']*100"}%)
|
|
{{endif}}
|
|
{{else}}
|
|
({expression="$tax['rate']*100"}%)
|
|
{{endif}}
|
|
</div>
|
|
<div class="i-basis_100 i-text-align_end">
|
|
{$tax['amount']}
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
<li class="ipsData__item i-font-size_2 cTransactionInvoice_subtotal">
|
|
<div class="ipsData__main">
|
|
<strong>{lang="total"}</strong>
|
|
</div>
|
|
<div class="i-basis_100 i-text-align_end">
|
|
<strong>{$summary['total']}</strong>
|
|
</div>
|
|
</li>
|
|
</ul>
|
|
</i-data>
|
|
<a href="{$transaction->invoice->acpUrl()}" class="i-margin-top_1 ipsButton ipsButton--inherit ipsButton--wide">
|
|
{lang="invoice_view"} <i class='fa-solid fa-angle-right'></i>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
{{if $transaction->invoice->billaddress}}
|
|
<div class="ipsBox">
|
|
<h3 class='ipsBox__header'>{lang="invoice_addresses"}</h3>
|
|
<div class='i-padding_3'>
|
|
{{if $transaction->invoice->billaddress}}
|
|
<div class='ipsSpanGrid i-margin-bottom_1'>
|
|
{{if \IPS\GeoLocation::enabled()}}
|
|
<div class='ipsSpanGrid__6'>
|
|
{$transaction->invoice->billaddress->map()->render( 350, 150 )|raw}
|
|
</div>
|
|
<div class='ipsSpanGrid__6'>
|
|
{{else}}
|
|
<div class='ipsSpanGrid__12'>
|
|
{{endif}}
|
|
<h4 class='ipsMinorTitle'>{lang="billing_address"}</h4>
|
|
<p>
|
|
{$transaction->invoice->billaddress->toString('<br>')|raw}
|
|
</p>
|
|
{{if isset( $transaction->invoice->billaddress->vat ) and $transaction->invoice->billaddress->vat}}
|
|
<p class='i-margin-top_1'>
|
|
{lang="cm_checkout_vat_number"}: {template="vatNumber" group="global" params="$transaction->invoice->billaddress->vat"}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
{{else}}
|
|
<br>
|
|
<div class="ipsMessage ipsMessage--info">
|
|
{lang="trans_invoice_deleted"}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div> ]]></template>
|
|
<template template_group="transactions" template_name="wait" template_data="$transaction, $log" template_location="admin" template_app="nexus"><![CDATA[
|
|
<li>
|
|
<div class='cTransaction_icon'>
|
|
<i class='fa-regular fa-clock'></i>
|
|
</div>
|
|
<div class='cTransaction_info'>
|
|
<span class="i-font-size_2">{lang="tstatus_wait"}</span>
|
|
{{if isset( $log['on'] ) and $log['on']}}
|
|
<br>
|
|
{expression="\IPS\DateTime::ts( $log['on'] )"}
|
|
{{if isset( $log['by'] ) and $log['by']}}
|
|
<br>
|
|
<span class='i-font-size_1 i-color_soft'>
|
|
{lang="byline_nodate" sprintf="\IPS\Member::load( $log['by'] )->name"}
|
|
</span>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if isset( $log['note'] ) and $log['note']}}
|
|
<p class='cTransaction_note'>
|
|
{$log['note']}
|
|
</p>
|
|
{{endif}}
|
|
</div>
|
|
</li>]]></template>
|
|
<template template_group="widgets" template_name="bestSellers" template_data="$packages, $layout='grid-carousel', $isCarousel=false" template_location="front" template_app="nexus"><![CDATA[{{if !empty( $packages ) }}
|
|
<header class='ipsWidget__header'>
|
|
<h3>{lang="block_latestProducts"}</h3>
|
|
{{if $isCarousel}}
|
|
{{$carouselID = 'widget--commerce-best-sellers_' . mt_rand();}}
|
|
{template="carouselNavigation" group="global" app="core" params="$carouselID"}
|
|
{{endif}}
|
|
</header>
|
|
<div class='ipsWidget__content'>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--{$layout} {{if $isCarousel}}ipsData--carousel{{endif}} ipsData--commerce-best-sellers' {{if $isCarousel}}id='{$carouselID}' tabindex="0"{{endif}}>
|
|
{{foreach $packages as $package}}
|
|
{template="packageBlockWidget" app="nexus" group="store" params="$package, TRUE"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="widgets" template_name="donations" template_data="$layout='table', $isCarousel=false" template_location="front" template_app="nexus"><![CDATA[<h3 class="ipsWidget__header">{lang="current_donation_goals"}</h3>
|
|
<div class='ipsWidget__content'>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--table ipsData--donations'>
|
|
{{foreach \IPS\nexus\Donation\Goal::roots() as $goal}}
|
|
<li class="ipsData__item">
|
|
{{if member.member_id }}
|
|
<a href="{$goal->url()}" data-ipsDialog data-ipsDialog-title="{$goal->_title}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$goal->_title}</span></a>
|
|
{{endif}}
|
|
<div class='ipsData__main'>
|
|
<div class="i-flex i-align-items_center">
|
|
<div class='ipsData__title i-flex_11'>{$goal->_title}</div>
|
|
{{if $goal->goal}}
|
|
<span class="i-color_soft">{expression="number_format( 100/$goal->goal*$goal->current, 0, '.', '')"}%</span>
|
|
{{endif}}
|
|
</div>
|
|
{{if $goal->goal}}
|
|
<progress class="ipsProgress i-margin-top_2" value='{expression="number_format( 100/$goal->goal*$goal->current, 0, '.', '')"}' max="100"></progress>
|
|
<div class="i-color_soft i-font-size_-1 i-margin-top_1">
|
|
{lang="donate_progress" sprintf="new \IPS\nexus\Money( $goal->current, $goal->currency ), new \IPS\nexus\Money( $goal->goal, $goal->currency )"}
|
|
</div>
|
|
{{else}}
|
|
<div class="i-color_soft i-font-size_-1">
|
|
{lang="donate_sofar" sprintf="new \IPS\nexus\Money( $goal->current, $goal->currency )"}
|
|
</div>
|
|
{{endif}}
|
|
<div class="i-flex i-justify-content_space-between">
|
|
{{if $goal->current}}
|
|
<ul class='ipsCaterpillar'>
|
|
{{foreach $goal->donors( \IPS\nexus\Donation\Goal::DONATE_PUBLIC, 5, FALSE ) as $member}}
|
|
<li>
|
|
{template="userPhoto" app="core" group="global" params="$member, 'mini'"}
|
|
</li>
|
|
{{endforeach}}
|
|
{{$count = $goal->donors( \IPS\nexus\Donation\Goal::DONATE_PUBLIC + \IPS\nexus\Donation\Goal::DONATE_ANONYMOUS, NULL, TRUE );}}
|
|
{{if $count > 5}}
|
|
<li>+{$count - 5}</li>
|
|
{{endif}}
|
|
</ul>
|
|
{{endif}}
|
|
{{if member.member_id }}
|
|
<a href="{$goal->url()}" data-ipsDialog data-ipsDialog-title="{$goal->_title}" class='ipsButton ipsButton--primary ipsButton--small'><span>{lang="commerce_donate_now"}</span><i class="fa-solid fa-arrow-right"></i></a>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</div>]]></template>
|
|
<template template_group="widgets" template_name="featuredProduct" template_data="$packages, $layout='grid-carousel', $isCarousel=false" template_location="front" template_app="nexus"><![CDATA[{{if !empty( $packages ) }}
|
|
<header class='ipsWidget__header'>
|
|
<h3>{lang="block_featuredProduct"}</h3>
|
|
{{if $isCarousel}}
|
|
{{$carouselID = 'widget--commerce-featured-products_' . mt_rand();}}
|
|
{template="carouselNavigation" group="global" app="core" params="$carouselID"}
|
|
{{endif}}
|
|
</header>
|
|
<div class='ipsWidget__content'>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--{$layout} {{if $isCarousel}}ipsData--carousel{{endif}} ipsData--commerce-featured-products' {{if $isCarousel}}id='{$carouselID}' tabindex="0"{{endif}}>
|
|
{{foreach $packages as $package}}
|
|
{template="packageBlockWidget" app="nexus" group="store" params="$package, TRUE, TRUE"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="widgets" template_name="latestProducts" template_data="$packages, $layout='grid-carousel', $isCarousel=false" template_location="front" template_app="nexus"><![CDATA[{{if !empty( $packages ) }}
|
|
<header class='ipsWidget__header'>
|
|
<h3>{lang="block_latestProducts"}</h3>
|
|
{{if $isCarousel}}
|
|
{{$carouselID = 'widget--commerce-latest-products_' . mt_rand();}}
|
|
{template="carouselNavigation" group="global" app="core" params="$carouselID"}
|
|
{{endif}}
|
|
</header>
|
|
<div class='ipsWidget__content'>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--{$layout} {{if $isCarousel}}ipsData--carousel{{endif}} ipsData--commerce-latest-products' {{if $isCarousel}}id='{$carouselID}' tabindex="0"{{endif}}>
|
|
{{foreach $packages as $package}}
|
|
{template="packageBlockWidget" app="nexus" group="store" params="$package, TRUE"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="widgets" template_name="pendingActions" template_data="$pendingTransactions, $pendingWithdrawals, $pendingAdvertisements, $layout='table', $isCarousel=false" template_location="front" template_app="nexus"><![CDATA[
|
|
<h3 class="ipsWidget__header">{lang="block_pendingActions"}</h3>
|
|
<i-data>
|
|
{{if $pendingTransactions OR $pendingWithdrawals OR $pendingAdvertisements}}
|
|
<ul class="ipsData ipsData--table ipsData--pending-actions" id='elNexusActions'>
|
|
{{if $pendingTransactions !== NULL}}
|
|
<li class="ipsData__item">
|
|
<a href="{url="app=nexus&module=payments&controller=transactions&filter=tstatus_hold" base="admin"}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{lang="pending_transactions"}</span></a>
|
|
<span class='cNexusActionBadge {{if $pendingTransactions < 1}}cNexusActionBadge_off{{endif}}'>{{if $pendingTransactions > 99}}99+{{else}}{number="$pendingTransactions"}{{endif}}</span>
|
|
<div class='ipsData__main'>
|
|
{lang="pending_transactions"}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{if $pendingWithdrawals !== NULL}}
|
|
<li class="ipsData__item">
|
|
<a href="{url="app=nexus&module=payments&controller=payouts&filter=postatus_pend" base="admin"}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{lang="pending_widthdrawals"}</span></a>
|
|
<span class='cNexusActionBadge {{if $pendingWithdrawals < 1}}cNexusActionBadge_off{{endif}}'>{{if $pendingWithdrawals > 99}}99+{{else}}{number="$pendingWithdrawals"}{{endif}}</span>
|
|
<div class='ipsData__main'>
|
|
{lang="pending_widthdrawals"}
|
|
</div>
|
|
</a>
|
|
</li>
|
|
{{endif}}
|
|
{{if $pendingAdvertisements !== NULL}}
|
|
<li class="ipsData__item">
|
|
<a href="{url="app=core&module=promotion&controller=advertisements" base="admin"}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{lang="pending_advertisements"}</span></a>
|
|
<span class='cNexusActionBadge {{if $pendingAdvertisements < 1}}cNexusActionBadge_off{{endif}}'>{{if $pendingAdvertisements > 99}}99+{{else}}{number="$pendingAdvertisements"}{{endif}}</span>
|
|
<div class='ipsData__main'>
|
|
{lang="pending_advertisements"}
|
|
</div>
|
|
</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
{{else}}
|
|
<p class="ipsEmpty">{lang="no_pending_items"}</p>
|
|
{{endif}}
|
|
</i-data>]]></template>
|
|
<template template_group="widgets" template_name="recentCommerceReviews" template_data="$reviews, $layout='table', $isCarousel=false" template_location="front" template_app="nexus"><![CDATA[<header class='ipsWidget__header'>
|
|
<h3>{lang="block_recentCommerceReviews"}</h3>
|
|
{{if $isCarousel}}
|
|
{{$carouselID = 'widget-recent-commerce-reviews_' . mt_rand();}}
|
|
{template="carouselNavigation" group="global" app="core" params="$carouselID"}
|
|
{{endif}}
|
|
</header>
|
|
<div class='ipsWidget__content'>
|
|
{{if !empty( $reviews ) }}
|
|
<i-data>
|
|
<ul class='ipsData ipsData--{$layout} {{if $isCarousel}}ipsData--carousel{{endif}} ipsData--widget-recent-commerce-reviews' {{if $isCarousel}}id='{$carouselID}' tabindex="0"{{endif}}>
|
|
{{foreach $reviews as $review}}
|
|
{{$package = \IPS\nexus\Package::load( $review->item()->id );}}
|
|
<li class='ipsData__item'>
|
|
<a href="{$package->url()}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$package->_title}</span></a>
|
|
<a href='{$review->url()}' class='ipsData__image' aria-hidden="true" tabindex="-1">
|
|
{{if $package->image}}
|
|
<img src="{$package->image}" alt="{$package->_title}" loading="lazy">
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</a>
|
|
<div class="ipsData__content">
|
|
<div class='ipsData__main'>
|
|
<h4 class='ipsData__title'>
|
|
<a href="{$review->url()}" title='{lang="view_this_product" sprintf="$review->item()->title"}'>{$review->item()->title}</a>
|
|
</h4>
|
|
<div class="i-flex i-gap_2">
|
|
<div class='cNexusWidgetPrice'>{$package->price()}</div>
|
|
{template="rating" group="global" location="front" app="core" params="'small', $review->rating, \IPS\Settings::i()->reviews_rating_out_of"}
|
|
<span class='i-color_soft'>({$package->item()->reviews})</span>
|
|
</div>
|
|
<div class='ipsData__desc ipsRichText'>
|
|
{$review->truncated(TRUE, 100)|raw}
|
|
</div>
|
|
</div>
|
|
<div class="ipsData__last">
|
|
<div class="ipsData__last-text">
|
|
<div class="ipsData__last-primary">{lang="byline" htmlsprintf="$review->author()->link()"}</div>
|
|
<div class="ipsData__last-secondary">{datetime="$review->mapped('date')"}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
{{else}}
|
|
<div class='ipsEmptyMessage'>{lang="no_recent_reviews"}</div>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="widgets" template_name="subscriptions" template_data="$layout='wallpaper', $isCarousel=false" template_location="front" template_app="nexus"><![CDATA[<header class='ipsWidget__header'>
|
|
<h3>{lang="nexus_subs_widget_title"}</h3>
|
|
{{if $isCarousel}}
|
|
{{$carouselID = 'widget--subscriptions_' . mt_rand();}}
|
|
{template="carouselNavigation" group="global" app="core" params="$carouselID"}
|
|
{{endif}}
|
|
</header>
|
|
<div class='ipsWidget__content'>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--{$layout} {{if $isCarousel}}ipsData--carousel{{endif}} ipsData--subscriptions-widget" {{if $isCarousel}}id='{$carouselID}' tabindex="0"{{endif}}>
|
|
{{foreach \IPS\nexus\Subscription\Package::roots() as $package}}
|
|
{{if $package->enabled }}
|
|
<li class="ipsData__item">
|
|
<a href="{$package->url()}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{lang="nexus_subs_widget_title_and_price" sprintf="$package->_title, $package->priceBlurb()"}</span></a>
|
|
<div class="ipsData__image" aria-hidden="true">
|
|
{{if $package->_image}}
|
|
<img src='{expression="str_replace( array( '(', ')' ), array( '\(', '\)' ), $package->_image->url )"}' alt='' loading='lazy'>
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsData__content">
|
|
<div class='ipsData__main'>
|
|
<h4 class="ipsData__title"><a href="{$package->url()}">{expression="$package->_title"}</a></h4>
|
|
<div class="ipsData__meta">{expression="$package->priceBlurb()"} {{if \IPS\Member::loggedIn()->language()->checkKeyExists('nexus_tax_explain_val')}}{lang="nexus_tax_explain_val"}{{endif}}</div>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
<p class='cWidgetSubscription_linkbox i-background_2 i-border-end-start-radius_box i-border-end-end-radius_box i-border-top_3 i-padding_2 i-font-weight_600 i-text-align_end i-font-size_-2'>
|
|
<a href='{url="app=nexus&module=subscriptions&controller=subscriptions" seoTemplate="nexus_subscriptions"}'>{lang="nexus_subs_show_all_subs"} <i class="fa-solid fa-arrow-right"></i></a>
|
|
</p>
|
|
</div>
|
|
]]></template>
|
|
<css css_location="front" css_app="nexus" css_attributes="" css_path="." css_name="cart.css">.cNexusMenuCart_totalRow {
|
|
border-top: 1px solid var(--i-background_4);
|
|
}</css>
|
|
<css css_location="front" css_app="nexus" css_attributes="" css_path="." css_name="checkout.css">.cNexusCheckout_addresses .ipsSpanGrid__6 {
|
|
margin-bottom: 15px;
|
|
}
|
|
|
|
.cNexusCheckout_addresses .ipsSpanGrid__6 input[type="radio"] {
|
|
margin-top: 4px;
|
|
}
|
|
|
|
.cNexusCheckout_addresses .ipsFieldList {
|
|
padding-top: 0;
|
|
}
|
|
|
|
.cVenmoButton {
|
|
background-color: #3D95CE !important;
|
|
border: none !important;
|
|
}
|
|
|
|
.cVenmoButton img {
|
|
height: 15px;
|
|
}
|
|
|
|
input[type="text"][name="cm_checkout_vat_number"] {
|
|
width: auto;
|
|
}</css>
|
|
<css css_location="front" css_app="nexus" css_attributes="" css_path="." css_name="clients.css">.cNexusInvoiceView .cNexusPrice {
|
|
font-size: var(--i-font-size_6);
|
|
line-height: 1.2;
|
|
font-weight: 500;
|
|
vertical-align: middle;
|
|
}
|
|
|
|
/* Payment cards */
|
|
.cNexusCards li {
|
|
width: 250px;
|
|
height: 155px;
|
|
border-radius: 8px;
|
|
margin-bottom: 15px;
|
|
background: #617178;
|
|
background: linear-gradient(135deg, #617178 0%,#859ca5 100%);
|
|
position: relative;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_type.cPayment {
|
|
position: absolute;
|
|
bottom: 10px;
|
|
inset-inline-end: 10px;
|
|
width: 60px;
|
|
height: 36px;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_number,
|
|
.cNexusCards .cNexusCards_exp,
|
|
.cNexusCards .cNexusCards_name {
|
|
color: #f7f7f7;
|
|
font-weight: bold;
|
|
text-shadow: 0px 1px 0px rgba(0,0,0,0.8);
|
|
}
|
|
.cNexusCards .cNexusCards_number,
|
|
.cNexusCards .cNexusCards_exp {
|
|
position: absolute;
|
|
inset-inline-start: 20px;
|
|
font-family: 'courier new', monospace;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_number {
|
|
bottom: 55px;
|
|
font-size: 18px;
|
|
}
|
|
.cNexusCards .cNexusCards_name {
|
|
margin-top: 75px;
|
|
margin-inline-start: 10px;
|
|
margin-inline-end: 10px;
|
|
font-size: 14px;
|
|
width: 230px;
|
|
text-overflow: ellipsis;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_expTitle {
|
|
font-size: 9px;
|
|
color: #000;
|
|
text-transform: uppercase;
|
|
position: absolute;
|
|
bottom: 30px;
|
|
inset-inline-start: 20px;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_exp {
|
|
bottom: 15px;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_delete {
|
|
position: absolute;
|
|
inset-inline-end: -5px;
|
|
top: -5px;
|
|
background: #333;
|
|
color: #fff;
|
|
width: 30px;
|
|
height: 30px;
|
|
border-radius: 30px;
|
|
font-size: 20px;
|
|
line-height: 26px;
|
|
text-align: center;
|
|
}
|
|
|
|
/* Account credit */
|
|
.cNexusCredit_total {
|
|
font-size: 54px;
|
|
line-height: 1.3;
|
|
font-weight: 300;
|
|
}
|
|
|
|
.cNexusCredit_total.cNexusCredit_contact {
|
|
font-size: 34px;
|
|
}
|
|
|
|
/* Purchase list */
|
|
.cNexusPurchaseList .cNexusPurchaseList_image {
|
|
width: 115px;
|
|
height: 115px;
|
|
}
|
|
|
|
.cNexusPurchaseList .cNexusPurchaseList_image,
|
|
.cNexusPurchase .cNexusPurchase_image {
|
|
background-color: var(--i-background_1);
|
|
background-repeat: no-repeat;
|
|
background-size: cover;
|
|
background-position: 50% 50%;
|
|
border: 1px solid var(--i-background_3);
|
|
}
|
|
|
|
.cNexusPurchaseSubList {
|
|
padding-top: 15px;
|
|
margin-inline-start: 30px;
|
|
padding-inline-start: 30px;
|
|
border-inline-start: 3px solid var(--i-background_3);
|
|
}
|
|
|
|
.cNexusPurchaseSubList .cNexusPurchaseList .cNexusPurchaseList_image {
|
|
width: 100px;
|
|
height: 100px;
|
|
}
|
|
|
|
|
|
/* Purchase view */
|
|
.cNexusPurchase .cNexusPurchase_image {
|
|
width: 200px;
|
|
height: 200px;
|
|
display: block;
|
|
}
|
|
|
|
.cNexusLicenseKey {
|
|
font-size: 24px;
|
|
}
|
|
|
|
/* Referrals */
|
|
.cReferralBadge {
|
|
display: block;
|
|
width: 50px;
|
|
height: 50px;
|
|
border-radius: 50px;
|
|
line-height: 50px;
|
|
text-align: center;
|
|
font-size: 14px;
|
|
font-weight: 500;
|
|
background: var(--i-background_primary);
|
|
color: var(--i-color_primary-contrast);
|
|
}</css>
|
|
<css css_location="admin" css_app="nexus" css_attributes="" css_path="." css_name="customer.css"><![CDATA[#acpPageHeader.cNexusSupportHeader {
|
|
padding-top: 15px;
|
|
}
|
|
|
|
#acpPageHeader.cNexusSupportHeader .ipsUserPhoto {
|
|
width: 60%;
|
|
margin-left: auto;
|
|
margin-right: auto;
|
|
}
|
|
|
|
#acpPageHeader.cNexusSupportHeader .acpToolbar {
|
|
margin-top: -30px;
|
|
}
|
|
|
|
#elCustomerIncome {
|
|
width: 100%;
|
|
height: 55px;
|
|
background: rgba(0,0,0,0.03);
|
|
text-align: center;
|
|
font-size: 18px;
|
|
color: rgba(0,0,0,0.3);
|
|
}
|
|
|
|
/* Customer standing box */
|
|
#elCustomerStanding {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
#elCustomerStanding > div {
|
|
flex-grow: 1;
|
|
min-width: 150px;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
.cCustomerStanding_value {
|
|
display: block;
|
|
margin-bottom: 5px;
|
|
font-size: 24px;
|
|
}
|
|
|
|
.cCustomerStanding_value + .ipsMinorTitle {
|
|
font-weight: 400;
|
|
color: var(--i-color_soft);
|
|
}
|
|
|
|
.cCustomerStanding_positive {
|
|
color: var(--i-color_positive);
|
|
}
|
|
.cCustomerStanding_negative {
|
|
color: var(--i-color_negative);
|
|
}
|
|
|
|
.cCustomerStanding_arrow {
|
|
width: 18px;
|
|
height: 18px;
|
|
line-height: 18px;
|
|
display: inline-block;
|
|
font-size: 9px;
|
|
text-align: center;
|
|
vertical-align: middle;
|
|
border-radius: 14px;
|
|
color: #fff;
|
|
margin-top: -5px;
|
|
}
|
|
|
|
.cCustomerStanding_positive .cCustomerStanding_arrow {
|
|
background: var(--i-background_positive);
|
|
}
|
|
.cCustomerStanding_negative .cCustomerStanding_arrow {
|
|
background: var(--i-background_negative);
|
|
}
|
|
|
|
/* Customer standing popup */
|
|
.cCustomerStanding_progressIndicator {
|
|
position: relative;
|
|
}
|
|
|
|
.cCustomerStanding_progress {
|
|
background: rgb(52,128,187);
|
|
background: linear-gradient(to right, rgba(52,128,187,1) 0%,rgba(102,187,106,1) 92%);
|
|
height: 16px;
|
|
border: 1px solid rgba(0,0,0,0.1);
|
|
width: 100%;
|
|
}
|
|
|
|
.cCustomerStanding_markers {
|
|
margin: -5px -5px 0;
|
|
height: 18px;
|
|
}
|
|
|
|
.cCustomerStanding_markers > span {
|
|
font-size: 18px;
|
|
color: #000;
|
|
position: absolute;
|
|
width: 30px;
|
|
margin-inline-start: -15px;
|
|
text-align: center;
|
|
}
|
|
|
|
.cCustomerStanding_markers span.cCustomerStanding_markerAvg {
|
|
color: #919191;
|
|
}
|
|
|
|
.cCustomerStanding_markers > span span {
|
|
font-size: 10px;
|
|
margin-top: 8px;
|
|
position: relative;
|
|
top: -10px;
|
|
}
|
|
|
|
/* Account credit */
|
|
.cCustomerCredit.i-background_positive .ipsMinorTitle {
|
|
color: rgba(255,255,255,0.6);
|
|
}
|
|
|
|
.cCustomerCredit.i-background_positive a {
|
|
color: #fff;
|
|
}
|
|
|
|
/* Other info box */
|
|
.cCustomerOther {
|
|
/*height: 180px;*/
|
|
overflow: hidden;
|
|
}
|
|
|
|
.cCustomerOther .cCustomerOther_icon {
|
|
font-size: 20px;
|
|
line-height: 1.2;
|
|
}
|
|
|
|
.cCustomerOther .cCustomerOther_list {
|
|
height: 90px;
|
|
margin-top: 5px;
|
|
}
|
|
|
|
.cCustomerOther li {
|
|
margin-top: 5px;
|
|
position: relative;
|
|
}
|
|
|
|
.cCustomerOther li:first-child {
|
|
margin-top: 0;
|
|
}
|
|
|
|
.cCustomerOther ul li:nth-child(2):after {
|
|
position: absolute;
|
|
inset: 0;
|
|
content: '';
|
|
display: block;
|
|
background: linear-gradient(to bottom, rgba(250,250,250,0) 0%,rgba(250,250,250,1) 100%);
|
|
}
|
|
|
|
.ipsApp .cCustomerOther .ipsButton {
|
|
line-height: 26px;
|
|
}
|
|
|
|
/* Customer info tabs */
|
|
.ipsTabs--customerTabs .ipsTabs__tab {
|
|
position: relative;
|
|
}
|
|
|
|
.ipsTabs--customerTabs .ipsTabs__tab .ipsNotification {
|
|
inset-inline-end: auto;
|
|
inset-inline-start: 50%;
|
|
top: 0;
|
|
margin-inline-start: 3px;
|
|
}
|
|
|
|
/* PHONES */
|
|
@media screen and (max-width: 767px) {
|
|
html[dir] .ipsTabs--customerTabs .ipsTabs__tab .ipsNotification {
|
|
position: relative;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
}
|
|
}
|
|
|
|
/* main column */
|
|
.cNexusCustomerInvoice {
|
|
display: block;
|
|
margin-bottom: 5px;
|
|
font-size: 20px;
|
|
}
|
|
|
|
.ipsApp .cNotesBox.ipsBox {
|
|
background-color: #FFF8E1;
|
|
color: #514930;
|
|
border-color: #ded5ba;
|
|
}
|
|
|
|
.ipsApp .cNotesBox.ipsBox .ipsBox__header {
|
|
background: #FFECB3;
|
|
color: #514930;
|
|
border-color: #ded5ba;
|
|
}
|
|
|
|
.ipsApp .cNotesBox.ipsBox .ipsBox__header a {
|
|
color: #c5651c;
|
|
}
|
|
|
|
.cNotesBox .i-color_soft{
|
|
color: inherit;
|
|
opacity: .8;
|
|
}
|
|
|
|
.ipsApp .cCustomerNotes_none {
|
|
background: transparent;
|
|
padding-left: 0;
|
|
padding-right: 0;
|
|
}
|
|
|
|
/* Customer addresses */
|
|
.cCustomerAddresses .ipsControlStrip {
|
|
float: none;
|
|
margin-top: 10px;
|
|
}
|
|
|
|
/* Payment cards */
|
|
.cNexusCards li {
|
|
width: 250px;
|
|
height: 155px;
|
|
border-radius: 8px;
|
|
margin-bottom: 15px;
|
|
background: #617178;
|
|
background: linear-gradient(135deg, #617178 0%,#859ca5 100%);
|
|
position: relative;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_type.cPayment {
|
|
position: absolute;
|
|
bottom: 10px;
|
|
inset-inline-end: 10px;
|
|
width: 60px;
|
|
height: 36px;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_number,
|
|
.cNexusCards .cNexusCards_exp,
|
|
.cNexusCards .cNexusCards_name {
|
|
color: #f7f7f7;
|
|
font-weight: bold;
|
|
text-shadow: 0px 1px 0px rgba(0,0,0,0.8);
|
|
}
|
|
.cNexusCards .cNexusCards_number,
|
|
.cNexusCards .cNexusCards_exp {
|
|
position: absolute;
|
|
inset-inline-start: 20px;
|
|
font-family: 'courier new', monospace;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_number {
|
|
bottom: 55px;
|
|
font-size: 18px;
|
|
}
|
|
.cNexusCards .cNexusCards_name {
|
|
margin-top: 75px;
|
|
margin-left: 10px;
|
|
margin-right: 10px;
|
|
font-size: 14px;
|
|
width: 230px;
|
|
text-overflow: ellipsis;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_expTitle {
|
|
font-size: 9px;
|
|
color: #000;
|
|
text-transform: uppercase;
|
|
position: absolute;
|
|
bottom: 30px;
|
|
inset-inline-start: 20px;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_exp {
|
|
bottom: 15px;
|
|
}
|
|
|
|
.cNexusCards .cNexusCards_delete {
|
|
position: absolute;
|
|
inset-inline-end: -5px;
|
|
top: -5px;
|
|
background: #333;
|
|
color: #fff;
|
|
width: 30px;
|
|
height: 30px;
|
|
border-radius: 30px;
|
|
font-size: 20px;
|
|
line-height: 26px;
|
|
text-align: center;
|
|
}
|
|
|
|
.cPayment {
|
|
display: inline-block;
|
|
width: 66px;
|
|
height: 42px;
|
|
border: 1px solid rgba(0,0,0,0.1);
|
|
line-height: 40px;
|
|
white-space: nowrap;
|
|
font-size: 9px;
|
|
font-weight: bold;
|
|
padding: 0 5px;
|
|
text-align: center;
|
|
text-transform: uppercase;
|
|
text-overflow: ellipsis;
|
|
overflow: hidden;
|
|
background-color: #f8f8f8;
|
|
}
|
|
|
|
.cPayment_cardTypeList {
|
|
margin-inline-start: 345px;
|
|
}
|
|
|
|
.cPayment_visa,
|
|
.cPayment_mastercard,
|
|
.cPayment_american_express,
|
|
.cPayment_discover,
|
|
.cPayment_diners_club,
|
|
.cPayment_jcb,
|
|
.cPayment_paypal,
|
|
.cPayment_venmo {
|
|
text-indent: 100%;
|
|
padding: 0;
|
|
background-repeat: no-repeat;
|
|
}
|
|
.cPayment_visa,
|
|
.cPayment_mastercard,
|
|
.cPayment_american_express,
|
|
.cPayment_discover,
|
|
.cPayment_diners_club,
|
|
.cPayment_jcb,
|
|
.cPayment_paypal {
|
|
background-size: 64px 40px;
|
|
background-position: center center;
|
|
}
|
|
.cPayment_venmo {
|
|
background-size: 50px 26px;
|
|
background-position: 5px 5px;
|
|
}
|
|
|
|
.cPayment_visa { background-image: url( "{resource="cards/visa@2x.png" inCss="true" app="nexus" location="front"}" ); }
|
|
.cPayment_mastercard { background-image: url( "{resource="cards/mastercard@2x.png" inCss="true" app="nexus" location="front"}" ); }
|
|
.cPayment_american_express { background-image: url( "{resource="cards/amex@2x.png" inCss="true" app="nexus" location="front"}" ); }
|
|
.cPayment_discover { background-image: url( "{resource="cards/discover@2x.png" inCss="true" app="nexus" location="front"}" ); }
|
|
.cPayment_diners_club { background-image: url( "{resource="cards/dinersclub@2x.png" inCss="true" app="nexus" location="front"}" ); }
|
|
.cPayment_jcb { background-image: url( "{resource="cards/jcb@2x.png" inCss="true" app="nexus" location="front"}" ); }
|
|
.cPayment_paypal { background-image: url( "{resource="cards/paypal@2x.png" inCss="true" app="nexus" location="front"}" ); }
|
|
.cPayment_venmo { background-image: url( "{resource="cards/venmo.svg" inCss="true" app="nexus" location="front"}" ); }
|
|
|
|
|
|
/* PHONES */
|
|
@media screen and (max-width: 767px) {
|
|
#elCustomerStanding {
|
|
height: auto;
|
|
}
|
|
|
|
#elCustomerStanding > div {
|
|
width: 50%;
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
#elCustomerStanding + .ipsHr {
|
|
margin-top: 0;
|
|
}
|
|
|
|
.cCustomerStanding_value {
|
|
font-size: 18px;
|
|
}
|
|
|
|
#acpPageHeader.cNexusSupportHeader .acpToolbar {
|
|
margin-top: 15px;
|
|
}
|
|
}]]></css>
|
|
<css css_location="front" css_app="nexus" css_attributes="" css_path="." css_name="embed.css">.ipsCommercePrice{
|
|
font-weight: 600;
|
|
font-size: 1.1em;
|
|
color: var(--i-color_primary);
|
|
}
|
|
|
|
.ipsCommercePrices small{
|
|
color: var(--i-color_soft);
|
|
font-size: inherit;
|
|
}
|
|
|
|
.ipsCommercePrices s{
|
|
filter: grayscale(1) opacity(.4);
|
|
}</css>
|
|
<css css_location="admin" css_app="nexus" css_attributes="" css_path="." css_name="invoice.css"><![CDATA[.cInvoiceStatus .fa {
|
|
font-size: 54px;
|
|
line-height: 60px;
|
|
}
|
|
|
|
.cInvoice_note {
|
|
border-top: 3px solid #d99c1a;
|
|
padding: 7px;
|
|
margin-top: 7px;
|
|
background: #efebe3;
|
|
color: #968562;
|
|
}
|
|
|
|
ul.cInvoiceUnpaidConsequences {
|
|
margin: 5px 0px;
|
|
padding: 0;
|
|
list-style-position: inside;
|
|
list-style-type: disc;
|
|
}
|
|
|
|
ul.cInvoiceUnpaidConsequences > li {
|
|
padding: 5px;
|
|
}
|
|
|
|
ul.cInvoiceUnpaidConsequences ul {
|
|
margin: 5px 0px;
|
|
padding-inline-start: 20px;
|
|
list-style-position: inside;
|
|
list-style-type: square;
|
|
}
|
|
|
|
.cInvoiceUnpaidConsequences_warning {
|
|
display: block;
|
|
margin-top: 3px;
|
|
margin-inline-start: 10px;
|
|
color: #a52638;
|
|
}
|
|
|
|
.cInvoiceUnpaidConsequences_warning:before {
|
|
font-family: var(--i-font-awesome);
|
|
-webkit-font-smoothing: antialiased;
|
|
text-rendering: auto;
|
|
font-weight: 900;
|
|
content: '\f06a';
|
|
margin-inline-end: 3px;
|
|
}]]></css>
|
|
<css css_location="admin" css_app="nexus" css_attributes="" css_path="." css_name="invoiceTimeline.css"> .cNexusInvoiceExplain {
|
|
margin-inline-start: 250px;
|
|
border-inline-start: 3px solid black;
|
|
padding-top: 5px;
|
|
padding-inline-start: 15px;
|
|
}
|
|
.cNexusInvoiceExplain li {
|
|
position: relative;
|
|
margin-bottom: 20px;
|
|
}
|
|
.cNexusInvoiceExplain li p {
|
|
margin: 0;
|
|
}
|
|
.cNexusInvoiceExplain li .time {
|
|
position: absolute;
|
|
inset-inline-start: -375px;
|
|
top: 0px;
|
|
text-align: end;
|
|
width: 340px;
|
|
}
|
|
.cNexusInvoiceExplain li::before {
|
|
position: absolute;
|
|
top: 0px;
|
|
inset-inline-start: -22px;
|
|
font-family: var(--i-font-awesome);
|
|
-webkit-font-smoothing: antialiased;
|
|
text-rendering: auto;
|
|
font-weight: 900;
|
|
content: '\f111';
|
|
color: black;
|
|
}</css>
|
|
<css css_location="admin" css_app="nexus" css_attributes="" css_path="." css_name="nexus.css"><![CDATA[.cNexusPrice {
|
|
color: var(--i-primary);
|
|
font-weight: 500;
|
|
}
|
|
|
|
.cNexusPrice s {
|
|
color: #9a9a9a;
|
|
font-weight: normal;
|
|
}
|
|
|
|
.cNexusStack {
|
|
padding-top: 5px;
|
|
border: 1px solid rgba(0,0,0,0.1);
|
|
padding: 7px;
|
|
background: var(--i-background_2);
|
|
border-radius: 4px;
|
|
margin-bottom: 7px;
|
|
}
|
|
|
|
html[dir] .cNexusStack select,
|
|
html[dir] .cNexusStack input[type="text"],
|
|
html[dir] .cNexusStack input[type="number"],
|
|
html[dir] .cNexusStack input[type="checkbox"],
|
|
html[dir] .cNexusStack input[type="radio"] {
|
|
margin: 3px 0;
|
|
}
|
|
|
|
.cNexusStack .ipsSelectTree {
|
|
margin: 6px 0 0 0;
|
|
}
|
|
|
|
.cNexusStack .i-font-size_1 {
|
|
line-height: 1;
|
|
}
|
|
|
|
.cNexusStack > ol > li {
|
|
margin-bottom: 7px;
|
|
padding: 5px 7px;
|
|
padding-inline-start: 60px;
|
|
position: relative;
|
|
border-radius: 3px;
|
|
background: var(--i-background_1);
|
|
}
|
|
|
|
.cNexusStack > ol > li:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.cNexusStack > ol > li::before {
|
|
content: attr(data-step);
|
|
display: block;
|
|
width: 50px;
|
|
border-radius: 3px;
|
|
text-align: center;
|
|
background: #4e5b62;
|
|
background: var(--i-background_dark);
|
|
position: absolute;
|
|
inset-inline-start: 0px;
|
|
top: 0;
|
|
bottom: 0;
|
|
font-size: 11px;
|
|
text-transform: uppercase;
|
|
color: #fff;
|
|
font-weight: 500;
|
|
padding-top: 5px;
|
|
}
|
|
|
|
/* move the button over and restyle the X */
|
|
.ipsField_stack[data-ipsstack-fieldname="p_bulk_discounts"] .ipsField_stackDelete,
|
|
.ipsField_stack[data-ipsstack-fieldname="p_loyalty_discounts"] .ipsField_stackDelete,
|
|
.ipsField_stack[data-ipsstack-fieldname="p_usergroup_discounts"] .ipsField_stackDelete,
|
|
.ipsField_stack[data-ipsstack-fieldname="p_renew_options"] .ipsField_stackDelete {
|
|
/* background-color: #222;
|
|
width: 18px;
|
|
height: 18px;
|
|
line-height: 18px;
|
|
border-radius: 18px;
|
|
color: #fff;
|
|
font-size: 11px;
|
|
z-index: 1000;
|
|
top: -5px;
|
|
inset-inline-end: -5px; */
|
|
}
|
|
|
|
.cVatNumber {
|
|
text-decoration: underline;
|
|
text-decoration-style: dashed;
|
|
}
|
|
|
|
#elNexusActions > li > a:hover {
|
|
background: var(--i-background_2);
|
|
}
|
|
|
|
.cNexusActionBadge {
|
|
background: var(--i-primary);
|
|
}
|
|
|
|
.cNexusActionBadge_off {
|
|
background: var(--i-background_4);
|
|
}
|
|
|
|
.cNexusPrimaryRadio {
|
|
background: var(--i-background_1);
|
|
border-radius: 40px;
|
|
position: absolute;
|
|
top: .8em;
|
|
inset-inline-start: .8em;
|
|
padding: .3em;
|
|
padding-inline-end: .6em;
|
|
font-size: 11px;
|
|
}
|
|
|
|
.ipsUploader__row.ipsAttach_error .cNexusPrimaryRadio {
|
|
display: none;
|
|
}]]></css>
|
|
<css css_location="front" css_app="nexus" css_attributes="" css_path="." css_name="nexus.css">/* Category thumbnails */
|
|
.ipsData--commerceCategories{
|
|
--i-data--basis: 320px;
|
|
--i-data--wallpaper-height: calc((16 / 10) * 100% - 100%);
|
|
text-align: center;
|
|
}
|
|
|
|
.cNexusPrice {
|
|
font-weight: 500;
|
|
}
|
|
|
|
.cNexusPrice s {
|
|
color: var(--i-color_soft);
|
|
font-weight: normal;
|
|
}
|
|
|
|
.cPayment {
|
|
display: inline-block;
|
|
width: 66px;
|
|
height: 42px;
|
|
border: 1px solid;
|
|
border-color: color-mix(in srgb, currentColor 10%, transparent);
|
|
background-color: var(--i-background_3);
|
|
background-size: cover;
|
|
background-position: 50%;
|
|
}
|
|
|
|
.cPayment_visa { background-image: url('{resource="cards/visa@2x.png" inCss="true" app="nexus" location="front" noprotocol="true"}'); }
|
|
.cPayment_mastercard { background-image: url('{resource="cards/mastercard@2x.png" inCss="true" app="nexus" location="front" noprotocol="true"}'); }
|
|
.cPayment_american_express { background-image: url('{resource="cards/amex@2x.png" inCss="true" app="nexus" location="front" noprotocol="true"}'); }
|
|
.cPayment_discover { background-image: url('{resource="cards/discover@2x.png" inCss="true" app="nexus" location="front" noprotocol="true"}'); }
|
|
.cPayment_diners_club { background-image: url('{resource="cards/dinersclub@2x.png" inCss="true" app="nexus" location="front" noprotocol="true"}'); }
|
|
.cPayment_jcb { background-image: url('{resource="cards/jcb@2x.png" app="nexus" inCss="true" location="front" noprotocol="true"}'); }
|
|
.cPayment_paypal { background-image: url('{resource="cards/paypal@2x.png" app="nexus" inCss="true" location="front" noprotocol="true"}'); }
|
|
.cPayment_venmo { background-image: url('{resource="cards/venmo.svg" app="nexus" inCss="true" location="front" noprotocol="true"}'); background-size: 80% auto; }
|
|
|
|
.cNexusCard_expiry select {
|
|
width: 45%;
|
|
}
|
|
|
|
.cNexusPaymentLog .ipsData__icon {
|
|
font-size: 30px;
|
|
}
|
|
|
|
/* ORDERS */
|
|
.cNexusOrderList .cNexusOrderBadge {
|
|
margin-inline-end: 15px;
|
|
}
|
|
|
|
.cNexusOrderBadge {
|
|
display: inline-block;
|
|
padding: 0 10px;
|
|
border-radius: 4px;
|
|
vertical-align: middle;
|
|
font-size: 12px;
|
|
line-height: 20px;
|
|
font-weight: 500;
|
|
color: #fff;
|
|
background: #000;
|
|
}
|
|
|
|
.cNexusOrderBadge.cNexusOrderBadge_paid {
|
|
background: #7e9e64;
|
|
}
|
|
|
|
.cNexusOrderBadge.cNexusOrderBadge_expd {
|
|
background: #c8c9c1;
|
|
}
|
|
|
|
.cNexusOrderBadge.cNexusOrderBadge_pend {
|
|
background: #7C6146;
|
|
}
|
|
|
|
|
|
|
|
/* v5 todo: The below code is for v5. Above is v4. */
|
|
.ipsCommercePrices:not(:last-child){
|
|
margin-bottom: 1em;
|
|
}
|
|
.ipsCommercePrice{
|
|
font-weight: 600;
|
|
font-size: 1.1em;
|
|
color: var(--i-color_primary);
|
|
}
|
|
|
|
.ipsCommercePrices small{
|
|
color: var(--i-color_soft);
|
|
font-size: inherit;
|
|
}
|
|
|
|
.ipsCommercePrices s{
|
|
filter: grayscale(1) opacity(.4);
|
|
}
|
|
|
|
.ipsCommerceStock--in{
|
|
font-weight: 600;
|
|
}
|
|
.ipsCommerceStock--out{
|
|
font-weight: 500;
|
|
color: var(--i-color_negative);
|
|
}
|
|
|
|
|
|
/* Remove isolation from cart rows since it breaks the "Change quantity" menus while viewing the cart */
|
|
.ipsData--cart-contents .ipsData__item{
|
|
isolation: auto;
|
|
}
|
|
|
|
.ipsStreamItem .cNexusPrice {
|
|
color: var(--i-color_primary);
|
|
font-weight: bold;
|
|
font-size: 1.1em;
|
|
}
|
|
|
|
.ipsStreamItem .cNexusPrice s {
|
|
color: color-mix(in srgb, var(--i-color_soft) 70%, transparent);
|
|
font-weight: normal;
|
|
}
|
|
|
|
.ipsStreamItem .cNexusPrice :is(small, s) {
|
|
font-size: max(.8em, 11px);
|
|
}
|
|
|
|
|
|
[data-role="paymentMethodForm"] .ipsInput--dummy:not(#x) {
|
|
display: block;
|
|
}</css>
|
|
<css css_location="admin" css_app="nexus" css_attributes="" css_path="." css_name="purchases.css">.cNexusLicenseKey {
|
|
font-size: 24px;
|
|
}
|
|
|
|
.cNexusGiftCardPrice {
|
|
font-size: 40px;
|
|
line-height: 1.1 !important;
|
|
font-weight: 300;
|
|
}
|
|
</css>
|
|
<css css_location="front" css_app="nexus" css_attributes="" css_path="." css_name="store.css"><![CDATA[/* Allow sidebar category filters inherit grid/gap styles */
|
|
[data-role="categorySidebar"]{
|
|
display: contents;
|
|
}
|
|
|
|
.cNexusProduct .cNexusPrice {
|
|
font-size: var(--i-font-size_1);
|
|
font-weight: 600;
|
|
}
|
|
|
|
.cNexusProduct_selected {
|
|
border: 1px solid rgba(0,0,0,0.05);
|
|
background: var(--i-background_selected);
|
|
}
|
|
|
|
.cNexusRegister_info {
|
|
position: relative;
|
|
}
|
|
|
|
.cNexusRegister_close {
|
|
background: #333;
|
|
width: 30px;
|
|
height: 30px;
|
|
border-radius: 30px;
|
|
line-height: 26px;
|
|
position: absolute;
|
|
top: 5px;
|
|
inset-inline-end: -10px;
|
|
z-index: 2000;
|
|
text-align: center;
|
|
color: #fff;
|
|
font-size: 20px;
|
|
}
|
|
|
|
/* PRODUCT VIEW */
|
|
.cNexusProduct_header form + .ipsLoading {
|
|
position: absolute;
|
|
background-color: var(--i-background_3);
|
|
background-color: color-mix(in srgb, var(--i-background_3) 80%, transparent);
|
|
}
|
|
|
|
.cNexusProduct_header [type="number"][name="quantity"] {
|
|
width: 11ch;
|
|
}
|
|
|
|
.cNexusProduct_header [type="submit"]{
|
|
width: 100%;
|
|
}
|
|
|
|
.cNexusProduct_header .cNexusPrice {
|
|
display: inline-block;
|
|
font-size: var(--i-font-size_4);
|
|
line-height: 28px;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.cNexusProduct_primaryImage {
|
|
background-color: var(--i-background_2);
|
|
display: block;
|
|
aspect-ratio: 1;
|
|
width: 100%;
|
|
max-height: 550px;
|
|
cursor: zoom-in;
|
|
background-size: cover;
|
|
background-position: 50%;
|
|
}
|
|
|
|
.cNexusProduct_primaryImage img {
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: scale-down;
|
|
position: relative;
|
|
-webkit-backdrop-filter: blur(50px) brightness(.6);
|
|
backdrop-filter: blur(50px) brightness(.6);
|
|
}
|
|
|
|
.ipsCarousel--commerce-product-images{
|
|
--i-carousel--pa: 1em; /* Prevent cropping of selected outline */
|
|
--i-column-gap: 1em;
|
|
}
|
|
|
|
.ipsCarousel--commerce-product-images > :first-child{ margin-inline-start: auto; }
|
|
.ipsCarousel--commerce-product-images > :last-child{ margin-inline-end: auto; }
|
|
|
|
.cNexusProduct_images a {
|
|
display: block;
|
|
border-radius: min(var(--i-design-radius), 5px);
|
|
overflow: hidden;
|
|
}
|
|
|
|
.cNexusProduct_imageSelected {
|
|
outline: 2px solid var(--i-base-contrast_5);
|
|
outline-offset: 2px;
|
|
}
|
|
|
|
.cNexusProduct_images img{
|
|
height: 90px;
|
|
width: auto;
|
|
}
|
|
|
|
/* GIFT CARD */
|
|
#elNexusGiftcard {
|
|
width: 400px;
|
|
border-radius: 10px;
|
|
}
|
|
#elNexusGiftcard_card {
|
|
width: 400px;
|
|
height: 230px;
|
|
border-radius: 10px;
|
|
background: #000;
|
|
position: relative;
|
|
}
|
|
|
|
#elNexusGiftcard_card span[data-role="icon"] {
|
|
position: absolute;
|
|
display: block;
|
|
background: #fff;
|
|
border-radius: 50px;
|
|
width: 100px;
|
|
height: 100px;
|
|
top: 15px;
|
|
inset-inline-start: 15px;
|
|
font-size: 60px;
|
|
line-height: 100px;
|
|
text-align: center;
|
|
z-index: 5000;
|
|
}
|
|
|
|
#elNexusGiftcard_card strong[data-role="siteName"] {
|
|
position: absolute;
|
|
top: 30px;
|
|
inset-inline-end: 15px;
|
|
font-size: 20px;
|
|
font-weight: 400;
|
|
color: rgba(255,255,255,0.6);
|
|
}
|
|
|
|
#elNexusGiftcard_card strong[data-role="value"] {
|
|
position: absolute;
|
|
inset-inline-end: 15px;
|
|
bottom: 30px;
|
|
color: rgba(255,255,255,0.8);
|
|
font-weight: 300;
|
|
font-size: 52px;
|
|
}
|
|
|
|
#elNexusGiftcard_card h2 {
|
|
position: absolute;
|
|
inset-inline-end: 15px;
|
|
bottom: 80px;
|
|
color: #fff;
|
|
font-weight: 400;
|
|
font-size: 40px;
|
|
}
|
|
|
|
.cNexusGiftcard_swatches li {
|
|
padding: 4px;
|
|
border: 1px solid rgba(0,0,0,0.1);
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.cNexusGiftcard_swatches li[data-selected] {
|
|
border-color: #000;
|
|
}
|
|
|
|
.cNexusGiftcard_swatches a {
|
|
display: block;
|
|
width: 30px;
|
|
height: 30px;
|
|
}
|
|
|
|
.cNexusGiftcard_content:empty {
|
|
display: none;
|
|
}
|
|
|
|
#elNexusGiftcard_personalize input[type="text"],
|
|
#elNexusGiftcard_personalize textarea {
|
|
border: 1px solid rgba(0,0,0,0.2);
|
|
padding: 3px;
|
|
}
|
|
|
|
#elNexusGiftcard_personalize input[type="text"] {
|
|
width: 150px;
|
|
margin-inline-start: 5px;
|
|
}
|
|
|
|
/* Redeem button - doesn't use standard button class so that emails can show it the same way */
|
|
.cNexusGiftcard_redeem {
|
|
font-size: var(--i-font-size_-1);
|
|
font-weight: 500;
|
|
text-align: center;
|
|
text-decoration: none;
|
|
text-shadow: none;
|
|
white-space: nowrap;
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
padding: 10px 20px;
|
|
border-radius: 3px;
|
|
border: 1px solid rgba(0,0,0,0.1);
|
|
background-color: rgba(51,51,51,0.8);
|
|
color: #fff;
|
|
position: absolute;
|
|
inset-inline-start: 15px;
|
|
bottom: 15px;
|
|
}
|
|
|
|
/* STEPS */
|
|
.cNexusStep_step {
|
|
display: block;
|
|
width: 50px;
|
|
height: 50px;
|
|
text-align: center;
|
|
line-height: 50px;
|
|
font-size: 26px;
|
|
border-radius: 50px;
|
|
background: var(--i-background_primary);
|
|
color: var(--i-color_primary-contrast);
|
|
}
|
|
|
|
/* CART */
|
|
#elNexusCart .cNexusCart_totals {
|
|
font-size: var(--i-font-size_4);
|
|
padding: 15px;
|
|
}
|
|
|
|
|
|
|
|
/* PHONES */
|
|
@media screen and (max-width: 767px) {
|
|
|
|
/* Store */
|
|
.cNexusProduct {
|
|
text-align: center;
|
|
}
|
|
|
|
/* Gift cards */
|
|
#elNexusGiftcard {
|
|
width: 100%;
|
|
}
|
|
|
|
#elNexusGiftcard_card {
|
|
width: 100%;
|
|
height: 190px;
|
|
}
|
|
|
|
#elNexusGiftcard_card span[data-role="icon"] {
|
|
width: 50px;
|
|
height: 50px;
|
|
font-size: 30px;
|
|
line-height: 50px;
|
|
top: 10px;
|
|
inset-inline-start: 10px;
|
|
}
|
|
|
|
#elNexusGiftcard_card strong[data-role="siteName"] {
|
|
top: 20px;
|
|
}
|
|
|
|
#elNexusGiftcard_card strong[data-role="value"] {
|
|
font-size: 42px;
|
|
}
|
|
|
|
#elNexusGiftcard_card h2 {
|
|
font-size: 30px;
|
|
bottom: 70px;
|
|
}
|
|
|
|
#elNexusFiltersBox .ipsSideMenu .ipsSideMenu__title,
|
|
#elNexusFiltersBox .ipsSideMenu .ipsSideMenu__list {
|
|
display: block;
|
|
}
|
|
|
|
}]]></css>
|
|
<css css_location="admin" css_app="nexus" css_attributes="" css_path="." css_name="transaction.css">.cTransaction {
|
|
border-inline-start: 2px solid var(--i-background_4);
|
|
margin-inline-start: 20px;
|
|
display: grid;
|
|
gap: 30px;
|
|
}
|
|
|
|
.cTransaction li {
|
|
display: flex;
|
|
gap: 20px;
|
|
margin-inline-start: -21px;
|
|
}
|
|
|
|
.cTransaction_icon {
|
|
flex: 0 0 auto;
|
|
width: 40px;
|
|
height: 40px;
|
|
display: grid;
|
|
place-content: center;
|
|
font-size: 16px;
|
|
background: var(--i-background_1);
|
|
border-radius: 40px;
|
|
border: 2px solid var(--i-background_4);
|
|
}
|
|
|
|
.cTransaction_info{
|
|
flex: 1 1 auto;
|
|
align-self: center;
|
|
}
|
|
|
|
.cTransaction_note {
|
|
border-inline-start: 3px solid #d99c1a;
|
|
padding: .5em;
|
|
margin-top: .5em;
|
|
background: #efebe3;
|
|
color: #968562;
|
|
}
|
|
|
|
.cTransaction_positive .cTransaction_icon {
|
|
background-color: var(--i-background_positive);
|
|
border-color: var(--i-background_positive);
|
|
color: var(--i-color_positive-soft);
|
|
}
|
|
|
|
.cTransaction_intermediate .cTransaction_icon {
|
|
background-color: var(--i-secondary);
|
|
border-color: var(--i-secondary);
|
|
color: var(--i-secondary-contrast);
|
|
}
|
|
|
|
.cTransaction_negative .cTransaction_icon {
|
|
background-color: var(--i-background_negative);
|
|
border-color: var(--i-background_negative);
|
|
color: var(--i-color_negative-soft);
|
|
}
|
|
|
|
.cTransaction_positive .cTransaction_icon,
|
|
.cTransaction_intermediate .cTransaction_icon,
|
|
.cTransaction_negative .cTransaction_icon {
|
|
border-color: rgba(0,0,0,0.2);
|
|
}
|
|
|
|
/* MaxMind stuff */
|
|
.cTransactionFraud li {
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.cTransactionFraud li.cTransactionFraud_positive {
|
|
color: var(--i-color_positive);
|
|
}
|
|
|
|
.cTransactionFraud li.cTransactionFraud_negative {
|
|
color: var(--i-color_negative);
|
|
font-weight: bold;
|
|
}
|
|
|
|
.cTransactionFraud li .fa {
|
|
font-size: 20px;
|
|
float: left;
|
|
}
|
|
|
|
[dir="rtl"] .cTransactionFraud li .fa{
|
|
float: right;
|
|
}
|
|
|
|
.cTransactionFraud li .fa + p {
|
|
margin-inline-start: 30px;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.cTransactionFraud_geoInfo {
|
|
border-bottom: 1px dotted #4d4d4d;
|
|
}
|
|
|
|
.cTransactionFraud_riskScore {
|
|
font-size: 54px;
|
|
font-weight: 500;
|
|
line-height: 1;
|
|
margin-inline-end: 10px;
|
|
}
|
|
|
|
.cTransactionFraud_riskInfo {
|
|
padding-top: 5px;
|
|
line-height: 1.8;
|
|
}</css>
|
|
<css css_location="front" css_app="nexus" css_attributes="" css_path="." css_name="widgets.css">.cNexusActionBadge {
|
|
width: 2.4em;
|
|
height: 2.4em;
|
|
display: grid;
|
|
place-content: center;
|
|
border-radius: 100px;
|
|
font-weight: 600;
|
|
background: var(--i-base-contrast_5);
|
|
color: var(--i-background_5);
|
|
}
|
|
|
|
.cNexusActionBadge_off {
|
|
opacity: .2;
|
|
}</css>
|
|
<resource name="maxmind.png" app="nexus" location="admin" path="/enhancements/">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</resource>
|
|
<resource name="venmo_white.svg" app="nexus" location="front" path="/cards/">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTI2cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDEyNiAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNDYuMSAoNDQ0NjMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPndoaXRlX2xvZ29zdmcvPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9IndoaXRlX2xvZ28iIGZpbGw9IiNGRkZGRkYiPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIxLjIwMzM1ODMsMC4wOTY0NTkzMzAxIEMyMi4wNDk1ODQzLDEuNDk0MDMzMzYgMjIuNDMxMDkyMSwyLjkzMzUzNjc5IDIyLjQzMTA5MjEsNC43NTE5MjU1MSBDMjIuNDMxMDkyMSwxMC41NTE2NTE0IDE3LjQ3OTk2MzcsMTguMDg1OTA3MiAxMy40NjE1MzA2LDIzLjM3NjM5NzMgTDQuMjgzMTgyNTUsMjMuMzc2Mzk3MyBMMC42MDIxNTM1NjcsMS4zNjYyODk5MyBMOC42Mzg4MDI1MiwwLjYwMzMwNTMxNSBMMTAuNTg1MDEzOCwxNi4yNjQ5MTE0IEMxMi40MDM0NzY0LDEzLjMwMjQ4MDMgMTQuNjQ3NTUwNiw4LjY0NzAxNDEgMTQuNjQ3NTUwNiw1LjQ3Mjk4MDczIEMxNC42NDc1NTA2LDMuNzM1NjI2NTQgMTQuMzQ5OTA1LDIuNTUyMjYxNzQgMTMuODg0NzUyMiwxLjU3Nzg5MjE1IEwyMS4yMDMzNTgzLDAuMDk2NDU5MzMwMSBMMjEuMjAzMzU4MywwLjA5NjQ1OTMzMDEgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMzEuNjE5MjE2OCw5Ljc4ODQ0OTUgQzMzLjA5ODEwMjgsOS43ODg0NDk1IDM2LjgyMTI4MDEsOS4xMTE5MzA2OSAzNi44MjEyODAxLDYuOTk1OTA4NDQgQzM2LjgyMTI4MDEsNS45Nzk4MjY3MiAzNi4xMDI4MDI3LDUuNDcyOTgwNzMgMzUuMjU2MTQyMSw1LjQ3Mjk4MDczIEMzMy43NzQ4NjYzLDUuNDcyOTgwNzMgMzEuODMxMDQ0OSw3LjI0OTIyMjgxIDMxLjYxOTIxNjgsOS43ODg0NDk1IEwzMS42MTkyMTY4LDkuNzg4NDQ5NSBaIE0zMS40NDk3NTQ0LDEzLjk3OTIxNjMgQzMxLjQ0OTc1NDQsMTYuNTYyOTc5NCAzMi44ODY0OTE5LDE3LjU3NjY3MTQgMzQuNzkxMjA2NiwxNy41NzY2NzE0IEMzNi44NjUzODM4LDE3LjU3NjY3MTQgMzguODUxMzUzNiwxNy4wNjk4MjU0IDQxLjQzMjYxNDYsMTUuNzU4MDY1NCBMNDAuNDYwMzc4LDIyLjM1OTg4MSBDMzguNjQxNjk4MSwyMy4yNDg0MzY2IDM1LjgwNzMyOTcsMjMuODQxMzEzOCAzMy4wNTYxNzE3LDIzLjg0MTMxMzggQzI2LjA3NzU3NjksMjMuODQxMzEzOCAyMy41Nzk5NjA4LDE5LjYwOTI2OTQgMjMuNTc5OTYwOCwxNC4zMTg1NjIgQzIzLjU3OTk2MDgsNy40NjEyNTk1NCAyNy42NDI3MTQ4LDAuMTgwMTAwODY2IDM2LjAxODcyMzIsMC4xODAxMDA4NjYgQzQwLjYzMDI3NSwwLjE4MDEwMDg2NiA0My4yMDg5Mjg5LDIuNzYzNjQ2NzEgNDMuMjA4OTI4OSw2LjM2MTEwMTc3IEM0My4yMDkzNjM0LDEyLjE2MDYxMDQgMzUuNzY1NjE1OCwxMy45MzcyODcgMzEuNDQ5NzU0NCwxMy45NzkyMTYzIEwzMS40NDk3NTQ0LDEzLjk3OTIxNjMgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjYuNDAxNjA1OCw1LjI2MTM3ODUxIEM2Ni40MDE2MDU4LDYuMTA3Nzg3NCA2Ni4yNzMyMDU0LDcuMzM1NDcxMzYgNjYuMTQ1NDU2OCw4LjEzNzc3ODM1IEw2My43MzM4NzU1LDIzLjM3NjE4IEw1NS45MDg0MDI4LDIzLjM3NjE4IEw1OC4xMDgxNTYsOS40MDczOTE3IEM1OC4xNDk4Njk5LDkuMDI4NTA2NCA1OC4yNzgwNTMsOC4yNjU3MzkwNCA1OC4yNzgwNTMsNy44NDI1MzQ1OSBDNTguMjc4MDUzLDYuODI2NDUyODYgNTcuNjQzMjIwNiw2LjU3MjkyMTI1IDU2Ljg3OTk4NzcsNi41NzI5MjEyNSBDNTUuODY2MjU0NSw2LjU3MjkyMTI1IDU0Ljg1MDEzMTUsNy4wMzgwNTUwOSA1NC4xNzMzNjc5LDcuMzc3NjE4IEw1MS42NzgzNTg5LDIzLjM3NjM5NzMgTDQzLjgwODc4MjYsMjMuMzc2Mzk3MyBMNDcuNDAzOTk0LDAuNTYxODEwNDIzIEw1NC4yMTUwODE3LDAuNTYxODEwNDIzIEw1NC4zMDEzMzM4LDIuMzgyODA2MTYgQzU1LjkwODE4NTYsMS4zMjQ3OTUwMyA1OC4wMjQwNzY2LDAuMTgwNTM1MzY4IDYxLjAyNjE2OTQsMC4xODA1MzUzNjggQzY1LjAwMzU0MDQsMC4xODAxMDA4NjYgNjYuNDAxNjA1OCwyLjIxMjQ4MTU3IDY2LjQwMTYwNTgsNS4yNjEzNzg1MSBMNjYuNDAxNjA1OCw1LjI2MTM3ODUxIFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTg5LjYzMzE3MjIsMi42Nzc2MTU0MSBDOTEuODc0NDIyLDEuMDcwODI4OTIgOTMuOTkwNzQ3NSwwLjE4MDEwMDg2NiA5Ni45MDg3NjA5LDAuMTgwMTAwODY2IEMxMDAuOTI2OTc3LDAuMTgwMTAwODY2IDEwMi4zMjQ2MDgsMi4yMTI0ODE1NyAxMDIuMzI0NjA4LDUuMjYxMzc4NTEgQzEwMi4zMjQ2MDgsNi4xMDc3ODc0IDEwMi4xOTY2NDIsNy4zMzU0NzEzNiAxMDIuMDY4ODkzLDguMTM3Nzc4MzUgTDk5LjY2MDEzNjEsMjMuMzc2MTggTDkxLjgzMjQ5MDksMjMuMzc2MTggTDk0LjA3NDE3NTIsOS4xMTIxNDc5NCBDOTQuMTE1NDU0NSw4LjczMDg3Mjg4IDk0LjIwMjE0MTEsOC4yNjU3MzkwNCA5NC4yMDIxNDExLDcuOTcwNzEyNTMgQzk0LjIwMjE0MTEsNi44MjY2NzAxMiA5My41NjcwOTEzLDYuNTcyOTIxMjUgOTIuODA0MDc1Nyw2LjU3MjkyMTI1IEM5MS44MzIwNTY0LDYuNTcyOTIxMjUgOTAuODYwNDcxNSw2Ljk5NjEyNTcgOTAuMTM5MTY5OCw3LjM3NzYxOCBMODcuNjQ0NTk1MywyMy4zNzYzOTczIEw3OS44MTg5MDU0LDIzLjM3NjM5NzMgTDgyLjA2MDU4OTcsOS4xMTIzNjUxOSBDODIuMTAxODY5LDguNzMxMDkwMTMgODIuMTg1OTQ4NSw4LjI2NTk1NjI5IDgyLjE4NTk0ODUsNy45NzA5Mjk3OCBDODIuMTg1OTQ4NSw2LjgyNjg4NzM3IDgxLjU1MDY4MTUsNi41NzMxMzg1IDgwLjc5MDI3Myw2LjU3MzEzODUgQzc5Ljc3NDM2NzIsNi41NzMxMzg1IDc4Ljc2MDQxNjgsNy4wMzgyNzIzNCA3OC4wODM2NTMyLDcuMzc3ODM1MjUgTDc1LjU4NjY4ODksMjMuMzc2NjE0NSBMNjcuNzE5NzE5NywyMy4zNzY2MTQ1IEw3MS4zMTQ0OTY2LDAuNTYyMDI3Njc0IEw3OC4wNDIzNzM5LDAuNTYyMDI3Njc0IEw3OC4yNTM3Njc0LDIuNDY2NjY0OTQgQzc5LjgxODkwNTQsMS4zMjUyMjk1NCA4MS45MzMwNTgzLDAuMTgwOTY5ODY5IDg0Ljc2NzIwOTUsMC4xODA5Njk4NjkgQzg3LjIyMTE1NjQsMC4xODAxMDA4NjYgODguODI3NzkxLDEuMjM4MzI5MjQgODkuNjMzMTcyMiwyLjY3NzYxNTQxIEw4OS42MzMxNzIyLDIuNjc3NjE1NDEgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE3Ljg5ODY0Myw5LjMyMzc1MDE2IEMxMTcuODk4NjQzLDcuNDYxMjU5NTQgMTE3LjQzMjgzOCw2LjE5MTQyODk0IDExNi4wMzgwMzIsNi4xOTE0Mjg5NCBDMTEyLjk0OTY4Nyw2LjE5MTQyODk0IDExMi4zMTU1MDYsMTEuNjUxMTU3NCAxMTIuMzE1NTA2LDE0LjQ0NDEzMjkgQzExMi4zMTU1MDYsMTYuNTYyOTc5NCAxMTIuOTA4NDA4LDE3Ljg3NDMwNDkgMTE0LjMwMjc4LDE3Ljg3NDMwNDkgQzExNy4yMjE4NzksMTcuODc0MzA0OSAxMTcuODk4NjQzLDEyLjExNjUwODUgMTE3Ljg5ODY0Myw5LjMyMzc1MDE2IEwxMTcuODk4NjQzLDkuMzIzNzUwMTYgWiBNMTA0LjM2MjcyLDE0LjEwNjk1OTggQzEwNC4zNjI3Miw2LjkxMjI2NjkxIDEwOC4xNjkxMDcsMC4xODAxMDA4NjYgMTE2LjkyNjg0MSwwLjE4MDEwMDg2NiBDMTIzLjUyNTg4MywwLjE4MDEwMDg2NiAxMjUuOTM4MTE2LDQuMDc1MTg5NDUgMTI1LjkzODExNiw5LjQ1MTQ5MzYgQzEyNS45MzgxMTYsMTYuNTYyNzYyMiAxMjIuMTcyNzkxLDIzLjkyNzEyNzkgMTEzLjIwMzg4MSwyMy45MjcxMjc5IEMxMDYuNTYyMjU2LDIzLjkyNzEyNzkgMTA0LjM2MjcyLDE5LjU2NjkwNTUgMTA0LjM2MjcyLDE0LjEwNjk1OTggTDEwNC4zNjI3MiwxNC4xMDY5NTk4IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=</resource>
|
|
<resource name="discover.png" app="nexus" location="front" path="/cards/">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</resource>
|
|
<resource name="visa@2x.png" app="nexus" location="front" path="/cards/">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</resource>
|
|
<resource name="paypal@2x.png" app="nexus" location="front" path="/cards/">iVBORw0KGgoAAAANSUhEUgAAAIAAAABQCAYAAADRAH3kAAAHRElEQVR42u2aaUxUVxTHab+0adJ9SfuhbWj6qUmbtBbrUrXWpbWaxkQTWq2mplYrCCpIxYqKQnFBhEK1IotsKssoiuCCCMiwFEFWB9kRhn3YmQG+nb5z5T3vnRkcNK1NeOcl/+jc++59z3t+9yz3aWdHF114jY2N2UtKkGSUBKQpKeO4je2tGd9AC6QaGQQIpB8aWhTVScMDYKIFUZ1MPAC0ICoUAUAAEAAEAAFAANBiEAC0IAQAiQAgEQAkAoBEAJAIABIBQCIASAQAiQAgEQAkAoBEAJAIABIBQCIASAQAiQAgEQAkAoBEADyaho0mqGlqt6r+weH/bUFGR8egpbMPmtp7BBn6hsA0MkoA/Fta6hoMdtM2TKj3vv0NvI4nQ9/A0BN9L9+YbJi2IdSqHH45CSv2JMDx5EIYGDI+9jNuVbXALOdwNucMp3C4JwHmGZoOhboWSMqqhNT8u6Ata5y6AAwOG+GZGU4PBUDWrHUHwWgaeWLvtsg9ZkIAeP3ge455scd5hl/sTQEqhCn6agkUVN6DOn03xGeUg0YCYcoCkF10VzDy6wvdYZNfHKz3iYaPHPdZQHDuRvETea96vUEw8ucuEbDz5HWmFbvjLSC4oNU91nNW+WiUOfDv2JaWXw03Sxugq3eQeQjUlAXANzxVMHDY+ZtcDB6FOesPC/0+YZdYX+QFLaz0+AumrfaFd5Z6witfboN3l3nCTMlLbA9MhEZ9F7vvaFw6mwPlfjTR4vkt7QZw9AxV7tkWEM/ak3N0goHDLhUJucHWkMtCf0BCHuvLKKoDr/AMWOt3HpZ5noYlv8ayP388kAz+Z7XQ2GZQ5sHdjrtengO9gepyAPP4X93UJvSjJ+D70aB36vQ2wwV6ktbOHljnfUpor2/pEOZf7Bwo9J/QZLH2fVFZgoFvV+uFcSHnCoR+/N3dNwjTOYNa01zXSGhq62FzoJvn+1Jyq9QFAO5w3Lny4r/1lYfQjwbENt5A2pIa5iWenekM8zceAacDceAZrIE1uyOEuVBRKbkQEHtNaEvJLlXmx3DC9zms+R1GxrN73s1jksbnHoPDJli5N0Ew3o3iOsiW3DYCsO5gMvhICWRQUj7sPZVpkUtEXr7N5kGvwrfLYKgGgPKaZsEAb3+zA67kVkCatgz8ItPYb74fDY7jeqVqwFpFEH+tULg/Ni0fruZVCG2Hoq4oySdWF3L7U59uhLyyWtaHO5k3zPytUcwDlNS0sszccV+S0O/oncgAGZLA6B2wLFsLdc3C/XHp9yF0DX4QRhZvj1FfGXg8MXNS2T/q41U+zCPIY+uaOyA8OQdcDp+BFVIuMH2tH7y2wE0Yg6FC32EQ2tbuiWTj90u5BN+OoUaeG3fzZLJ/1FIpvmPCKI/tMAyw0g13/44T6fDToQvwtUesMEZO6ha4RSttbn9eUR8A6LZtGR5DABprYOj+ztLV62GJyx9sxz5s3BuL3JXnvMqFBnTzmCA+N3uz0vbyF1uhratXuT8wMc+m4ee4RMLB0znMW+CYtu5+Vr872MgBZmwKY57CvMqISC1WHwDvL98lGO27nSdZpu4dmgKhmmzIL69TYjIKDccb84W5rrDBN4ZVBDcKdUK+sNztmDJu3s/+Svvzc1xg2ZYQ4bkh8RnCe2EM543jHJgKh87ksEz/lBS/8WAG8wD5/p7+IeYJ5Ptnb45gsR/DRW5Fk5AvYDWAYy5qq6x6BdUAgOUXbwQ0kq0xWN7xY27daZhwvsPRD1wqJooTeYpPpNDCQ4YHOngiJxsGk0Fb74UHN7wxs0rqJ5wPvYv5KSMmjjxQqgDAPGHzOpZsc4z5zm1u6x7fgYMW5WJuae2kcg2sKvhnFN1tEYyJ2byt9zIvGauaOpVqIVhTYFEtYN/3+5OEk0TVfQvY4n9WMMRlbbnNMau9woUxGMc/dPRmJaF5O1+2mZ82mieEvDAWP2ptfiQ+VxgzUyobsVLAmt88B8CcwfwACHMJ1QGwcNNRxRAvztvCSjtbY4p1jexec0Ni7oAngvJv9BT8uO7eAYsxL0nzYIVg/gw86pUN85mUsOHXQFvvhR9wFrpHWxh7c1AarPe/aLHTS2tbhfsyb9erDwCM2YWVDUzWDDHhYktuH+O7R1ASHIm5ChW195OnhpZOSC+ohIy/dVbPCMzBCTp93er8+q4+dkKHamid/HvhuX3stVIIkLxBZFoxlNe1KdWBPB8mi/JRMoYabKtsaKfPwf+1yqqb4WmHB2UjfmQyjYzAVPt3EgATfdZ1Es/7M29VkcHVAsB5s/P+VbvCyNhqAuCDlXsV47+5eDvLPcjYKgIA63xMDlGdPf1kaPpfwSQCgEQAkAgAEgFAIgBIBACJACARACQCgAAgAAgAAoAAoMUgAGhBCAASAUAiAEgEAIkAIBEAJAKARACQCACSGgAw0YKoTiYeAA0tiOqk4QGwl2SgRVGN0Nb2dvw1DkGCJCMt0JSVcdzGovHpUu/1DwJhZ7if5Ki6AAAAAElFTkSuQmCC</resource>
|
|
<resource name="visa.png" app="nexus" location="front" path="/cards/">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</resource>
|
|
<resource name="dinersclub@2x.png" app="nexus" location="front" path="/cards/">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</resource>
|
|
<resource name="venmo.svg" app="nexus" location="front" path="/cards/">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTI2cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDEyNiAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNDYuMSAoNDQ0NjMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPmJsdWVfbG9nb3N2Zy88L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iYmx1ZV9sb2dvIiBmaWxsPSIjM0Q5NUNFIj4KICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMS4yMDMzNTgzLDAuMDk2NDU5MzMwMSBDMjIuMDQ5NTg0MywxLjQ5NDAzMzM2IDIyLjQzMTA5MjEsMi45MzM1MzY3OSAyMi40MzEwOTIxLDQuNzUxOTI1NTEgQzIyLjQzMTA5MjEsMTAuNTUxNjUxNCAxNy40Nzk5NjM3LDE4LjA4NTkwNzIgMTMuNDYxNTMwNiwyMy4zNzYzOTczIEw0LjI4MzE4MjU1LDIzLjM3NjM5NzMgTDAuNjAyMTUzNTY3LDEuMzY2Mjg5OTMgTDguNjM4ODAyNTIsMC42MDMzMDUzMTUgTDEwLjU4NTAxMzgsMTYuMjY0OTExNCBDMTIuNDAzNDc2NCwxMy4zMDI0ODAzIDE0LjY0NzU1MDYsOC42NDcwMTQxIDE0LjY0NzU1MDYsNS40NzI5ODA3MyBDMTQuNjQ3NTUwNiwzLjczNTYyNjU0IDE0LjM0OTkwNSwyLjU1MjI2MTc0IDEzLjg4NDc1MjIsMS41Nzc4OTIxNSBMMjEuMjAzMzU4MywwLjA5NjQ1OTMzMDEgTDIxLjIwMzM1ODMsMC4wOTY0NTkzMzAxIFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTMxLjYxOTIxNjgsOS43ODg0NDk1IEMzMy4wOTgxMDI4LDkuNzg4NDQ5NSAzNi44MjEyODAxLDkuMTExOTMwNjkgMzYuODIxMjgwMSw2Ljk5NTkwODQ0IEMzNi44MjEyODAxLDUuOTc5ODI2NzIgMzYuMTAyODAyNyw1LjQ3Mjk4MDczIDM1LjI1NjE0MjEsNS40NzI5ODA3MyBDMzMuNzc0ODY2Myw1LjQ3Mjk4MDczIDMxLjgzMTA0NDksNy4yNDkyMjI4MSAzMS42MTkyMTY4LDkuNzg4NDQ5NSBMMzEuNjE5MjE2OCw5Ljc4ODQ0OTUgWiBNMzEuNDQ5NzU0NCwxMy45NzkyMTYzIEMzMS40NDk3NTQ0LDE2LjU2Mjk3OTQgMzIuODg2NDkxOSwxNy41NzY2NzE0IDM0Ljc5MTIwNjYsMTcuNTc2NjcxNCBDMzYuODY1MzgzOCwxNy41NzY2NzE0IDM4Ljg1MTM1MzYsMTcuMDY5ODI1NCA0MS40MzI2MTQ2LDE1Ljc1ODA2NTQgTDQwLjQ2MDM3OCwyMi4zNTk4ODEgQzM4LjY0MTY5ODEsMjMuMjQ4NDM2NiAzNS44MDczMjk3LDIzLjg0MTMxMzggMzMuMDU2MTcxNywyMy44NDEzMTM4IEMyNi4wNzc1NzY5LDIzLjg0MTMxMzggMjMuNTc5OTYwOCwxOS42MDkyNjk0IDIzLjU3OTk2MDgsMTQuMzE4NTYyIEMyMy41Nzk5NjA4LDcuNDYxMjU5NTQgMjcuNjQyNzE0OCwwLjE4MDEwMDg2NiAzNi4wMTg3MjMyLDAuMTgwMTAwODY2IEM0MC42MzAyNzUsMC4xODAxMDA4NjYgNDMuMjA4OTI4OSwyLjc2MzY0NjcxIDQzLjIwODkyODksNi4zNjExMDE3NyBDNDMuMjA5MzYzNCwxMi4xNjA2MTA0IDM1Ljc2NTYxNTgsMTMuOTM3Mjg3IDMxLjQ0OTc1NDQsMTMuOTc5MjE2MyBMMzEuNDQ5NzU0NCwxMy45NzkyMTYzIFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTY2LjQwMTYwNTgsNS4yNjEzNzg1MSBDNjYuNDAxNjA1OCw2LjEwNzc4NzQgNjYuMjczMjA1NCw3LjMzNTQ3MTM2IDY2LjE0NTQ1NjgsOC4xMzc3NzgzNSBMNjMuNzMzODc1NSwyMy4zNzYxOCBMNTUuOTA4NDAyOCwyMy4zNzYxOCBMNTguMTA4MTU2LDkuNDA3MzkxNyBDNTguMTQ5ODY5OSw5LjAyODUwNjQgNTguMjc4MDUzLDguMjY1NzM5MDQgNTguMjc4MDUzLDcuODQyNTM0NTkgQzU4LjI3ODA1Myw2LjgyNjQ1Mjg2IDU3LjY0MzIyMDYsNi41NzI5MjEyNSA1Ni44Nzk5ODc3LDYuNTcyOTIxMjUgQzU1Ljg2NjI1NDUsNi41NzI5MjEyNSA1NC44NTAxMzE1LDcuMDM4MDU1MDkgNTQuMTczMzY3OSw3LjM3NzYxOCBMNTEuNjc4MzU4OSwyMy4zNzYzOTczIEw0My44MDg3ODI2LDIzLjM3NjM5NzMgTDQ3LjQwMzk5NCwwLjU2MTgxMDQyMyBMNTQuMjE1MDgxNywwLjU2MTgxMDQyMyBMNTQuMzAxMzMzOCwyLjM4MjgwNjE2IEM1NS45MDgxODU2LDEuMzI0Nzk1MDMgNTguMDI0MDc2NiwwLjE4MDUzNTM2OCA2MS4wMjYxNjk0LDAuMTgwNTM1MzY4IEM2NS4wMDM1NDA0LDAuMTgwMTAwODY2IDY2LjQwMTYwNTgsMi4yMTI0ODE1NyA2Ni40MDE2MDU4LDUuMjYxMzc4NTEgTDY2LjQwMTYwNTgsNS4yNjEzNzg1MSBaIiBpZD0iU2hhcGUiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik04OS42MzMxNzIyLDIuNjc3NjE1NDEgQzkxLjg3NDQyMiwxLjA3MDgyODkyIDkzLjk5MDc0NzUsMC4xODAxMDA4NjYgOTYuOTA4NzYwOSwwLjE4MDEwMDg2NiBDMTAwLjkyNjk3NywwLjE4MDEwMDg2NiAxMDIuMzI0NjA4LDIuMjEyNDgxNTcgMTAyLjMyNDYwOCw1LjI2MTM3ODUxIEMxMDIuMzI0NjA4LDYuMTA3Nzg3NCAxMDIuMTk2NjQyLDcuMzM1NDcxMzYgMTAyLjA2ODg5Myw4LjEzNzc3ODM1IEw5OS42NjAxMzYxLDIzLjM3NjE4IEw5MS44MzI0OTA5LDIzLjM3NjE4IEw5NC4wNzQxNzUyLDkuMTEyMTQ3OTQgQzk0LjExNTQ1NDUsOC43MzA4NzI4OCA5NC4yMDIxNDExLDguMjY1NzM5MDQgOTQuMjAyMTQxMSw3Ljk3MDcxMjUzIEM5NC4yMDIxNDExLDYuODI2NjcwMTIgOTMuNTY3MDkxMyw2LjU3MjkyMTI1IDkyLjgwNDA3NTcsNi41NzI5MjEyNSBDOTEuODMyMDU2NCw2LjU3MjkyMTI1IDkwLjg2MDQ3MTUsNi45OTYxMjU3IDkwLjEzOTE2OTgsNy4zNzc2MTggTDg3LjY0NDU5NTMsMjMuMzc2Mzk3MyBMNzkuODE4OTA1NCwyMy4zNzYzOTczIEw4Mi4wNjA1ODk3LDkuMTEyMzY1MTkgQzgyLjEwMTg2OSw4LjczMTA5MDEzIDgyLjE4NTk0ODUsOC4yNjU5NTYyOSA4Mi4xODU5NDg1LDcuOTcwOTI5NzggQzgyLjE4NTk0ODUsNi44MjY4ODczNyA4MS41NTA2ODE1LDYuNTczMTM4NSA4MC43OTAyNzMsNi41NzMxMzg1IEM3OS43NzQzNjcyLDYuNTczMTM4NSA3OC43NjA0MTY4LDcuMDM4MjcyMzQgNzguMDgzNjUzMiw3LjM3NzgzNTI1IEw3NS41ODY2ODg5LDIzLjM3NjYxNDUgTDY3LjcxOTcxOTcsMjMuMzc2NjE0NSBMNzEuMzE0NDk2NiwwLjU2MjAyNzY3NCBMNzguMDQyMzczOSwwLjU2MjAyNzY3NCBMNzguMjUzNzY3NCwyLjQ2NjY2NDk0IEM3OS44MTg5MDU0LDEuMzI1MjI5NTQgODEuOTMzMDU4MywwLjE4MDk2OTg2OSA4NC43NjcyMDk1LDAuMTgwOTY5ODY5IEM4Ny4yMjExNTY0LDAuMTgwMTAwODY2IDg4LjgyNzc5MSwxLjIzODMyOTI0IDg5LjYzMzE3MjIsMi42Nzc2MTU0MSBMODkuNjMzMTcyMiwyLjY3NzYxNTQxIFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTExNy44OTg2NDMsOS4zMjM3NTAxNiBDMTE3Ljg5ODY0Myw3LjQ2MTI1OTU0IDExNy40MzI4MzgsNi4xOTE0Mjg5NCAxMTYuMDM4MDMyLDYuMTkxNDI4OTQgQzExMi45NDk2ODcsNi4xOTE0Mjg5NCAxMTIuMzE1NTA2LDExLjY1MTE1NzQgMTEyLjMxNTUwNiwxNC40NDQxMzI5IEMxMTIuMzE1NTA2LDE2LjU2Mjk3OTQgMTEyLjkwODQwOCwxNy44NzQzMDQ5IDExNC4zMDI3OCwxNy44NzQzMDQ5IEMxMTcuMjIxODc5LDE3Ljg3NDMwNDkgMTE3Ljg5ODY0MywxMi4xMTY1MDg1IDExNy44OTg2NDMsOS4zMjM3NTAxNiBMMTE3Ljg5ODY0Myw5LjMyMzc1MDE2IFogTTEwNC4zNjI3MiwxNC4xMDY5NTk4IEMxMDQuMzYyNzIsNi45MTIyNjY5MSAxMDguMTY5MTA3LDAuMTgwMTAwODY2IDExNi45MjY4NDEsMC4xODAxMDA4NjYgQzEyMy41MjU4ODMsMC4xODAxMDA4NjYgMTI1LjkzODExNiw0LjA3NTE4OTQ1IDEyNS45MzgxMTYsOS40NTE0OTM2IEMxMjUuOTM4MTE2LDE2LjU2Mjc2MjIgMTIyLjE3Mjc5MSwyMy45MjcxMjc5IDExMy4yMDM4ODEsMjMuOTI3MTI3OSBDMTA2LjU2MjI1NiwyMy45MjcxMjc5IDEwNC4zNjI3MiwxOS41NjY5MDU1IDEwNC4zNjI3MiwxNC4xMDY5NTk4IEwxMDQuMzYyNzIsMTQuMTA2OTU5OCBaIiBpZD0iU2hhcGUiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+</resource>
|
|
<resource name="mastercard@2x.png" app="nexus" location="front" path="/cards/">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</resource>
|
|
<resource name="discover@2x.png" app="nexus" location="front" path="/cards/">iVBORw0KGgoAAAANSUhEUgAAAIAAAABQCAYAAADRAH3kAAAIp0lEQVR4AezSsQ2DUBBEQVr55SPRGYmRID6via4G36w0W8Hb3pl9rmvFHnfUX+KOPVZsP+/FijOKEc5YPYAjilGOHsATxShPD6AYSQCdABAAAkAACAABIAAEgAAQAAJAAAgAASAABIAAEAACQAAIAAEgAASAABDATAL4tnPN8XFsf3R/tu1f3We/2rZt201t221q23Zsp4ptJzszG+edt+ez7f1Msttnzs4fZzJzNZl7zvd+UXztSEpJRXZu7qeOS0lLw+OwcKRnZOpEfxcEMH/1BvznnYYCteu3RLu+Q7HZ8QAyMrMqjW3TZwjHcA6fkV9QgOWbtuOvr74Pw1+r4Uf/qIHGXfrgxr2Hlebl5edjz5ETeLN5B44TeK91F9x39VCNLYDR/xzkAz2grKgOZVUtM2pD3tsJktdhFOTncRxWbt7B3wP/f68JYhMSrb4pNT0dteq14BgsWLMRl2/d5b1NsO+Bm0eltv++0wgNO/XGmm27kZmdjYTEROx1dERgUJD2BDDeYRHJsIl/vdUAzh7eYuzrTduxnXP4jEVrN4uxP/1Xbfzq/6/xHn977QNh4RQRBfWyd6zdvseyfm4W5JMjQOJNW+qh0LEtig50Jcz37WDaWh/ykX4oyEpF6NNn+MHfqoPzV23ZafVN2/YdFuv7BYfi1MWrL30/+27ed3ppf6teg+Dr54c5Dg64efOmdgVQp0FLcLPuOLlg3sr1+OX/XgXbf1vjDYQ8eWpTAH+o9Tb4TIJJdE5eHpZu2IrbD53F+v3HThGbOWTSTPAddBW+QSHoN2ayEIB8bhJo7YW7W6Ho+EAUX5yEkmuzCfP9ZBSdGITCPa0hnxgBjm/bdwi4Zs16zXkSqb9JnDTNu/fncyUBePkF0AUJUKhqATx6Foan4ZEYOnmWaLvn4o74hAS+R7sCILnqdjdvX/z8P3XZh+7DxloJgMf6D/9eg8+YsmCZrbV5eohNnL5ohc0xMfEJMCaHQVn+fxTubIbik0NRcmM+Sp03ocxzjxmOKHXZjJKbC1B8ajgKd7WAMdoPF67ferE2CRTrOXl4ifbTl65ZCSAxOcXqd1ALgKJgW0RMrGhzPHJSjLUbARCT5i1hH3727zq0lKongHgm2vcbRn9ayUomzLGs/buab4p4whaMgRdhWv8Gig73osWj1G07yoPPouLZLVSE3UJ5yDmUue9EyfU5KDrSB5LXEQqQMUAlgRKDJ85gG/04x1gJYP+JM3wW4HfZEsC1O/dF2/lrt+xTAOeu3RSb4B8SaiUAD19/xglsE6jbsJWwyNa9B7MNLXsO/MTfQXLfTx+P4lPDUHpvBcoCjqMi6iE+Sg7CRynB5nsnlAeeROn9VSg+PQKy83YRDHL9n/yzFqLj4mnd+Pl/67KNfWJ92zGAILySAMbNXoAB46cKF/i/dxszENQFEBj62EoARFZODvYePYl67buzTxDiExD02QXgcQCF2xuj+MwolD5ca7H+OE8gKwrIjkZFvBfKQ86j1Gk9is+OgexiITc+KUm4KWYj63fu5T1FwD6bAqjfoQcade4tEBkTazMIZFDbbehYPAmL4Br2KQBaA/t+Xe11Em1TACrQL4vo3GHZms/lAmyfAMG2TwBf4ZMxaMJ0vgPV3m/KQJb3GDZlluj/vDHAmJnzhABEBmSHAmAwJaxr+NTZNrMARvsJScnqeaImwPjhobun2NgZi1e+PAhMegbT+jetY4Aw2zGAMTZQHaxaWa+nX8AXFQCzANYyRBzB77MLATCdcvexRNfTFi4XvpSE0r9WFQADI1oJj1SSwI1avXWX2EgWfjin98iJoo2+1dXLhyTQRVROA0+PYRbAU0CVBTiizEuVBZweDuWKsG6B99t0Fe9gAUf0WQuAaS5jFwFWMKsGgUwDeerxudOgkerA1r4KQTU+bEaibBWCuHkiULIxTxz5jLIZC3xqISgnHfLRQTbqAA7P6wCDoVyahoLs1KrfwBhErHfs3EWr/s9RCBJZwPb9R0QbK4J2UwomyZ0Hj+IGfFopmCJgsUX4/R//oyYthjl0pXm5eZZS8LutO4ux/NmgYy+WYSHGFuRD8j4G5fhQVv+eVwK7wXRuPCS/06IUXBWM0v9c91384416LEZZ9X+eUnBYZJSY13PEeLah+gdNmQV9I+QbE58QBgMvbPg+ICMri9Eyf37aWJLFyFv8wdFXhajYOMYTvP9+IjcT8p2VMK2uSRgMvLBDh/YhBV2CsrU+TCv+9wIGAy/a/nAdxlh/KEf7CeLtRAA6jCmRkC9MhmnF/0m23QhAR1Yq5NsrYFpdW5BtDwLQkZcDyW0PTBveEiTbiwB04j0PQNlaT5BrBwLQwXqF5HMcyraGglRdAHZl8SKlswcB6GARR3LdDWXz+4JEexCAjoxEyPfWqoM7exCADmPSU8hXHdTpnD0IQIcxzAnyqRHqAo4uAM0jLwuS91Eoe9qoCdIFoP1ybbjlT+c2Cv+uC0Dz4N9HCLkO5fgg9TGvC0DrMKbFQLq/HsqWD9Uk6ALQNPKyIQVehHJ8MEwrq4nN1wWgcRijfSFfmwfThjfVG64LQMswpkZBctkOZU9r9SbrAtA0MpMsdflDPdUBnS4ATSMnHZL/WSgnhsK0qrp6Q3UBaBZZyZD8TkI+Ocy6NKsLQKNIj4fkeRDKsQHWlq4LQJswxgdDct4O5VAP67RNF4A2a/DGx7eZskHZ1kDrhBO6APhfxUhehyz+fE0drZOsC4CpGqtx8uVZULY30jyxugByM2F8cg/yrWVQ9nb4DPm5LgDT993CjaHXLYTv7wLTqho6uZ+GNXUIg8F8oQAuft9KrizEyFccoOxu9QUsXIdyqFeKGQaD+UIBVDMj+7v6z5x4nEtOWyCfGgllywc6gV8WG96skG8vb2qGwcAL8VwE58xQvtWULNIDkrsj5POToOxsppP1VWJtXSiHeye9IF8IwH6h42NsZMrI1OOHwgAAAABJRU5ErkJggg==</resource>
|
|
<resource name="jcb.png" app="nexus" location="front" path="/cards/">iVBORw0KGgoAAAANSUhEUgAAAEAAAAAoCAYAAABOzvzpAAAFKUlEQVR4Ae3aA7zzShqA8f87SXH4+fLD2rZt27Zt27Zt27Zt2z5qm2Rmd6/9w6pne58yTp4xYjQaLeEmuJrZ4k14SY2b4NFYMFucExKugQWzxwKukVDMLuVEAWacZMap/YeIoIpQpQCQS9F0BUiJqiIlR9A05CyEKiWVRECgGHfN5hDQq0KK8NuViT+uNyZtUSeWBrUDl/sMBspoJP/il6yuAoiDDlQtb9GLym9Hf/HH8d+McmPStXqpdrrl3apIijK9AuoU/rzRuu87f+QtX/+D1UknI5rOZc+4y+tuflbtpz9r45GPlb/zXSXnI0J/4alP5GpX9qCvvNpzv/9uK+1YVuTc2jZc9rVLP9nO/pK2dNMpIIIc3PktP/DKj/+CYU0AJp2VUum++z0bt76d7me/YH4eKIXx2HDUeNrPPuzhX3kJqU+qgNJZbcYmuRGBYjoF9FLyoz9teOPXf89cTQpHkEKaG2o+9BH5pz9nedkRlCJVtdV27DU//yRRUfU4gqKKNP2lQAQbk0w5gR1GEyKOc1tTOqN2QqTNWwxGHPI5ftLxbwykiP/fekCbi1KKmNWKUNdlJVWkMC3U/hs0mXFr0mXRqymU0YicSQmU8UQqxSS3tCNKIYJSKJ22nt+EAgqC85ximwMWenbsv2jy/UbkrHeuc0i7dzMaKevrqsLGsO90Swfbve8CItUyhqm20qz73spvdCVvsiRQijqFZ17jtN58y7O60TkOsDppLT7m4ba+7Y3mbng9ZdLQtmLnDqspu+nJLubdF3+I8+06jb+u/e4fv6f2wUs8zNPPcQttzkop0y2gFDbGHbmAgi4X0I0nqtOfTv8WN6VprNzlHibverfJJz5t9PJX86e/qHt9sKU374C5bfYfbgXf/OvPdCULMb0CcinmB5XbXXCP+bmacadrs34VIOeiVDUR5EKXSUmkALpGFQHWu7G/tWM/Xfs9ONeOU1qshzpluvOAjaZzwZNtddbdy17x6V+6+Ol2OvPBS37x17G3f/+v7v3tb5n85Pv/jAWHJIX1Jz1VyVlv135ieYvSZbDejv1pvGK9m4Azbt1rXm+6k0CK0OXixq/6pjd+5bfOetKtqhTu/tbvueBTPuejP/qLuYrV+9zfX65wNaNXv04sLUmLi8ramvmSvOhHH3KVDz/SV/78YwcvH+zHK79xlY88yqU/9HB/bdZVKU13DKgiRIT3fPW3h3wUR3Ce3TswIFWaL36JUkgVirQx0rv8pXz1rz/1jR9/mmpIBCVTOv3BFrkUSUx/MZgC/WNUeJps0mY5ElUSgwERQCkiFyVCP9XUc1R9R1A6vVRpcre5a4IpCIVZrQr3qiSloMyigFIOERBxgvuc4KY6pU0sIBfb52uDKinHuT2Lfv94n36+Hlioh7I83ZngETW/XBxBV8AVT7dD/0vkthVdd0Rjp6ytq05zaukiF9Z+7xuUziEfQeloNlzv1FeyY7Cs7ZppLwaZ6yVRyKhw4Pa+21xgtxudYZv1LyYWFhgOEKKuVec5t+H976Pdt9fSd3sWegtUPVGK5d68a+09v4ee4Tpy6RSmV8Cky3ZvHfrQbc4Cxm0x30/2bB3YvtjTNBPVFS5n8Tznou2IEFu2iF07Rb+vHo+8/nx3t9aOQBXJUm/ezsGyLnfa3Pl3E6PR6MO4iH8TEfSrBAQKXS6HfAqkRF0fsU0pdB05gzoqKY4+mNKVrCj+A3zkCAFmk48kM86JAhBmlzhRAN6ANbPHGt5Q4yUwq9Pk/g7s7EiyTKA2OgAAAABJRU5ErkJggg==</resource>
|
|
<resource name="dinersclub.png" app="nexus" location="front" path="/cards/">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</resource>
|
|
<resource name="jcb@2x.png" app="nexus" location="front" path="/cards/">iVBORw0KGgoAAAANSUhEUgAAAIAAAABQCAMAAADm3o3WAAAC3FBMVEX////4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjr8fXP4u7I3uy61ui+2OnJ3uzk7fP36uv1zc71wcP219jp8+7T69/D5tW6486u38aq3sSz4crq8fV2sdckhMMAcLqLvN349fXznZ/tQkjrHCPwbHGc2bolsWoApFELqFjN4e0dgMGHutz35ubuUVfvX2T19/Zaw47x9vPi7PIXfcB8tNn48/PuSU7uUlhxyp3o8+5epNLyl5oDpVPs8vUGc7vuR015zaLsKTBPv4ZNvoV6s9hsq9XsNTvtNz1HmM2Fu96QweF9ttzvTVL0gob1jpH0gITvXmNQv4eA0qh0zaAjsGmqz+j////sJiz5ubv+9fb3p6rzd3vybHH0hYn83N3xc3dYwo3g9Op+0ad90aao4MT8/v32/Pkrs26w0+pyr9f5vL784eKn4MOH1K1urdbwWl/xXGFcxJABpFKh3b9RwYigyuVgpdL1i47+8PDrHiXuTlNjxpTn9u+w48ms4cbY8eRmqdT+7+/rHSTtRUrW8OOF06yB0qma27r0+/fX8eQttHDR4++92u241+wkhMTG3/D7/f5dpNHyaW7wVlug3b5VwovZ8eXu9fHK3uykzOY9ksv+/v9co9H6wcP82dqq4cXu+fMJdbxcpNNBlMx2str0+fzP5PIRer/5urz95OXzfIDwVVrxZWr5wMLwYWZgxpNqypnv+fSO17JClcymzefY6fTr9Pr8/f7w9/vE3u9vrtgHdLzvRkzuUldXwoyN1rGQ17NlyJYCpVLr9O/tOT/i8OlPm87Z7eNNms1ZodDc7uVvrdaDuNvv9fKx0ebvWl8qsm0Mdr30uLqL06+EudvvZWots2/w9fP39/jvWF337/AvtHDd7+bM4O1Mms271unrISjzo6b49vYEpVQytXLv8/aszuW51eiqzeWy0ubL3+3x9Pb23Nz2z9D1ycr1w8T23t/t9PHn8u3h8Oj29/c+0B0iAAAACHRSTlMAIan0/+us9eldGvQAAAKVSURBVHgB7doDrGRXHMDh7z94743Wu7VtM6jNqI1qu0GNqG6j2m6D2rZt23a7NiY3XJ+e4n7ReH7XlFsQk8hhwiSIei2beqCnllGPipBRoJaViszKgDKgDCgDyoCaWVOLyYjhoBUB4nfQPyJEiB/SBAyLCEAMZ4GIoAhYtHiaJmDJ+FNXm2ViuK4my8cIXRNWfDPBPLBSs/h/Das2h1M81Rih0JdiDPR9iULPtygMqKVeCtatTTd9hR9SB7z26XS/Wcm9Hoj/25qwDBiQOyCU80A9d0DkCSj3iLB8hBgNy0VgQoXQbwVdEW8kDegERrNmjKcak4yrhf7Daf02ICJ+M2DD11MGDP4ZSz5q8I8M/fBDMAS0nsbmv/m1k34eqFv2R9Q/BBgI2KYHA5MGdKBPHxZvADbRxICddt6s8wXj7kg/BpreQaMb0AB9fW/O37c6a++VIuCEQw87HMyP9QfaFG8NVGDA1W9ddWWHl9q7JgjofPhcC45v492Wu7ZAa2EFLfgEzUMTLAVHnjPyoUOHRcRt7Bh/ce1+N7t3/whx9W4BRpwm3ln+OgZJEOAE58UkV+wZEXudyOfHXfTzdddDXH2oTTYNsJ4DRSQJ4CDwrK79dD3t5C8VPLxx+m3BCabjSOkDHjEdZyUPWN50VZIHVP73+4SRO+CN3AGX5w5oma5q8oBTTNdhmWfCbc79u9cD2ypg13VTB9xx2HSneVXqgOqzCty+hgK31JIeF2CZmgJ3hwJ3xnIpxsArAIs++tijK+nyUPPhxgq6PPjQjWNn4f+FmpnzaSztgxAR84NvQiz50fjqql+BH+MtWDEGmhVjlVdOy4AyoAwoA8oAVRlVVUyQ0QQVY0I2MUaVCeS6mW38BNlNBPp7ipWZ2WxfAAAAAElFTkSuQmCC</resource>
|
|
<resource name="amex@2x.png" app="nexus" location="front" path="/cards/">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</resource>
|
|
<resource name="amex.png" app="nexus" location="front" path="/cards/">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</resource>
|
|
<resource name="mastercard.png" app="nexus" location="front" path="/cards/">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</resource>
|
|
<resource name="paypal.png" app="nexus" location="front" path="/cards/">iVBORw0KGgoAAAANSUhEUgAAAEAAAAAoCAYAAABOzvzpAAAFYUlEQVR42u1a61OUVRg/04f60Lf+ABtn7ENNF7swqWnKTM44ZA41ZWgT2QCl3Lw1RTMaUcSEiYgyGHJRQMkUVBBvjASuCCjIJVJkBZPrstwWWHbfvf96nsMuyGhTAuLUvu/MM+fd95z3nPP7Pdez8wpBl81mW2C1WmNIolkURfn2/ygefIyVMTN2YTabF1osFge87GLMjF0wG+4HJhKbl4iJMTN2JiDaTQB3wEvE5iYgWiWAg4O3EsDYVQJUAlQCVAJUAlQCVAKmRgC9OyHT3JSiTMh/ggCr1QKH3S7FTkKnK1iIiKluyk7v2+022dqsVprrn9fncdZxmUUCeLFRkxmduj509fRBp++HYWgENiKCN2M2KyRmt4xZx9gzZZL1cL/F3dfTb4Cuz4D+wWGMGE2SUDmXooy/a3ZbGq/P744YR2GiffBezA9G/tQJ4IUBF4rLrkCIjyBeXU9tIOYsi0TqoSJpwtw/cbmkpuByynsPeKfDMT6u/FoznvxkH17+fD+eCEzBW5sOIOdUlQTlcnrGkbgckhQLSUJ2CYKjD0NTewsXqlm0MNHe/qUlTNMFrDbEJOYQ8BU4eKwYpZdr8ZLfVvrtj5rGW6ht1CKvoASFZ0pRWlEHw7ARFTV/yHvWpMNhR1NLG46f0aCtS4+sggqIJfESdPk1Lfy/zIbw24X6m+240dKFwpJanCmrk30joyYYR81YHJ6BkB+OoUtvQFevAZ09g5Ms7KERwBow0iZ8A7bjmeWbYFLI/2x2rAqOhXh6HfLOVyEgfAeCopLh+3EMkbIESQcKsHpzkiSsQ9dLZj4EsTCCfq9B8+1ObE44KbVvJAAulwuRO09ArNmL4qom6juBL/YU4dPYYxCvxyO7sBLaNj3EO4nIyL9E453kLlYZOx66C3hMt6mlHeL5EMxZEobvd+dg8YfbCMwi7M08DqNJQd31FhRrriElq5Cev0ttAQ7nF9P9YlSThRzKO0/383D2tyr0D43ihZCfsWhDGvYdKUNQ7FGIBfFIzi3FKBHSdLsbl0jzuafJ5d5PQsbxcmhqmiGejcPFq020c6c0/QfMHlMjYMz/gQuaagKwCsvXbsMHEQmISciGprIeg0NG/JRyhDQVhoiYNIRGsdbfQGVNIyqvNkiStu/MxtxlEVgZFCsDXVVDC4T/bqz+OgchP+YjNu2cBDZEgTAjvxw+Yen4JvUcovacgli6A2XUd/TsVYgVCWi+oyOF2KViZiUN8kJ2soDUrJMExgcll+vgJJM1W6ySmNKKenr+ODJyTpL2LIhPzqXffmht16Hmdy3dr8Vj84OpDcCVuib5zq+nqyBejENZ9U1pzhzl+aq+/ifE3FhpFTx/ep4GYmUi6ps7sJXcwjcycyxbcFCcrTqA/Z9TTsDGXXjqzQiZBlkDnIo4sDXcIG3ODYF4ZT0CtyRSGwq/dTEyOHVTqpzvt4XAv4e4PblEpF1G+a/2FmFecCradf1yLrYy9mctaXf+hnQ899l+bEwogE94JoK+O4L27n74kLvEZRbLbPBICqGO7l4C3ysJ8VSA3HIho6WgdvFKI/R9gzLCt5Nw3BgwDMPnbSLgtVC0derHTbdDNyDB352+2J95rjtdfeQiregdGKJoP0gkDkrSWjv0NN/IVLU/fQLGqr/7R10Gxjmb++U40qaDCEg7RD4sBPKKLsp+TxHkkOPunUtx93HuH68S3eN4DY78j6wU9tT/f9cnqz/FMj6GXST5YAEyfzkt/XaS5dw17r5zKco954QZOHvM/mmQy2SH0zkJvNcdh2fi1Kj+H6ASoBKgEqASoBKgEjBzBKjfB6gEePknMl7/kZS3fyb3F28rlUSuZ/2mAAAAAElFTkSuQmCC</resource>
|
|
</theme>
|