10.April 2026
This commit is contained in:
parent
a00c42e770
commit
f58c709945
208 changed files with 19280 additions and 2914 deletions
|
|
@ -1,196 +1,278 @@
|
|||
{!! Form::open(['action' => route('portal.my_subscriptions.create', 5), 'method' => 'POST', 'class' => '']) !!}
|
||||
|
||||
<div class="card-body">
|
||||
@if(Yard::instance('subscription')->content()->count())
|
||||
<style>
|
||||
.cart-item {
|
||||
position: relative;
|
||||
padding: 15px 0;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
.cart-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
.cart-item .product-image {
|
||||
max-width: 80px;
|
||||
}
|
||||
.cart-item .product-title {
|
||||
font-size: 1.1em;
|
||||
font-weight: 500;
|
||||
color: #393939;
|
||||
}
|
||||
.cart-item .product-details {
|
||||
font-size: 0.9em;
|
||||
color: #666;
|
||||
}
|
||||
.cart-item .quantity-input {
|
||||
width: 80px;
|
||||
text-align: center;
|
||||
}
|
||||
.cart-summary {
|
||||
background: #f8f9fa;
|
||||
padding: 20px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.cart-summary .table {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.cart-summary .table td {
|
||||
border-top: none;
|
||||
padding: 8px 0;
|
||||
}
|
||||
.cart-summary .total-row {
|
||||
font-weight: bold;
|
||||
border-top: 1px solid #ddd;
|
||||
}
|
||||
</style>
|
||||
@if (Yard::instance('subscription')->content()->count())
|
||||
<style>
|
||||
.cart-item {
|
||||
position: relative;
|
||||
padding: 15px 0;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.cart-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.cart-item .product-image {
|
||||
max-width: 80px;
|
||||
}
|
||||
|
||||
.cart-item .product-title {
|
||||
font-size: 1.1em;
|
||||
font-weight: 500;
|
||||
color: #393939;
|
||||
}
|
||||
|
||||
.cart-item .product-details {
|
||||
font-size: 0.9em;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.cart-item .quantity-input {
|
||||
width: 80px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.cart-summary {
|
||||
background: #f8f9fa;
|
||||
padding: 20px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.cart-summary .table {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.cart-summary .table td {
|
||||
border-top: none;
|
||||
padding: 8px 0;
|
||||
}
|
||||
|
||||
.cart-summary .total-row {
|
||||
font-weight: bold;
|
||||
border-top: 1px solid #ddd;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="cart-overview">
|
||||
<h4 class="mb-4">{{ __('abo.abo_order_hl') }}</h4>
|
||||
@if (isset($error))
|
||||
<div class="alert alert-danger">
|
||||
<strong>{{ $error }}</strong>
|
||||
</div>
|
||||
@endif
|
||||
@foreach (Yard::instance('subscription')->getContentByOrder() as $row)
|
||||
@php($product = \App\Models\Product::find($row->id))
|
||||
<div class="cart-item">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-3 col-sm-2">
|
||||
@if ($row->options->has('image'))
|
||||
<img src="{{ route('product_image', [$row->options->image]) }}" class="product-image"
|
||||
alt="{{ $row->name }}">
|
||||
@endif
|
||||
</div>
|
||||
<div class="col-9 col-sm-10">
|
||||
<div class="row">
|
||||
<div class="col-12 col-sm-6 col-md-7">
|
||||
<div class="product-title">
|
||||
{{ $row->name }}
|
||||
|
||||
<div class="cart-overview">
|
||||
<h4 class="mb-4">{{ __('abo.abo_order_hl') }}</h4>
|
||||
@if(isset($error))
|
||||
<div class="alert alert-danger">
|
||||
<strong>{{ $error }}</strong>
|
||||
</div>
|
||||
@endif
|
||||
@foreach(Yard::instance('subscription')->getContentByOrder() as $row)
|
||||
@php($product = \App\Models\Product::find($row->id))
|
||||
<div class="cart-item">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-3 col-sm-2">
|
||||
@if($row->options->has('image'))
|
||||
<img src="{{ route('product_image', [$row->options->image]) }}" class="product-image" alt="{{ $row->name }}">
|
||||
@endif
|
||||
</div>
|
||||
<div class="col-9 col-sm-10">
|
||||
<div class="row">
|
||||
<div class="col-12 col-sm-6 col-md-7">
|
||||
<div class="product-title">
|
||||
{{ $row->name }}
|
||||
|
||||
{!! get_abo_type_badge_by_product($product) !!}
|
||||
|
||||
|
||||
</div>
|
||||
<div class="product-details">
|
||||
<div>{{ __('order.content') }}: {{ $product->contents }}</div>
|
||||
<div>{{ __('order.art_no') }}: {{ $product->number }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="product-details">
|
||||
<div>{{ __('order.content') }}: {{ $product->contents }}</div>
|
||||
<div>{{ __('order.art_no') }}: {{ $product->number }}</div>
|
||||
<div class="col-6 col-sm-3 col-md-2">
|
||||
<div class="price-single">
|
||||
<div style="">{{ $row->price() }} €
|
||||
{{ Yard::instance('subscription')->getUserTaxFree() }}</div>
|
||||
@if (Yard::instance('subscription')->isPriceCurrency())
|
||||
<span
|
||||
class="small">~{{ Yard::instance('subscription')->getCurrencyByKey('price', $row, 2) }}
|
||||
{{ Yard::instance('subscription')->getPriceCurrencyUnit() }} </span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 col-md-2">
|
||||
<div class="price-single">
|
||||
<div style="">{{ $row->price() }} € {{ Yard::instance('subscription')->getUserTaxFree() }}</div>
|
||||
@if(Yard::instance('subscription')->isPriceCurrency())
|
||||
<span class="small">~{{ Yard::instance('subscription')->getCurrencyByKey('price', $row, 2) }} {{ Yard::instance('subscription')->getPriceCurrencyUnit() }} </span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 col-sm-3 col-md-3">
|
||||
<div class="quantity-select text-right">
|
||||
@if($row->options->comp)
|
||||
<span class="text-right">1 x</span>
|
||||
@else
|
||||
<span class="text-right">{{ $row->qty }} x</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="price-total text-right mt-2">
|
||||
<span class="font-bold text-price-total"><strong>{{ $row->subtotal() }} € </strong></span>
|
||||
@if(Yard::instance('subscription')->isPriceCurrency())
|
||||
<br>
|
||||
<span class="small">~{{ Yard::instance('subscription')->getCurrencyByKey('subtotal', $row, 2) }} {{ Yard::instance('subscription')->getPriceCurrencyUnit() }} </span> @endif
|
||||
<div class="col-6 col-sm-3 col-md-3">
|
||||
<div class="quantity-select text-right">
|
||||
@if ($row->options->comp)
|
||||
<span class="text-right">1 x</span>
|
||||
@else
|
||||
<span class="text-right">{{ $row->qty }} x</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="price-total text-right mt-2">
|
||||
<span class="font-bold text-price-total"><strong>{{ $row->subtotal() }} €
|
||||
</strong></span>
|
||||
@if (Yard::instance('subscription')->isPriceCurrency())
|
||||
<br>
|
||||
<span
|
||||
class="small">~{{ Yard::instance('subscription')->getCurrencyByKey('subtotal', $row, 2) }}
|
||||
{{ Yard::instance('subscription')->getPriceCurrencyUnit() }} </span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
@endforeach
|
||||
|
||||
<div class="cart-summary mt-4">
|
||||
<table class="table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ __('order.subtotal') }}:</td>
|
||||
<td class="text-right">
|
||||
{{ Yard::instance('subscription')->total() }} €
|
||||
@if(Yard::instance('subscription')->isPriceCurrency())
|
||||
<span class="small">~{{ Yard::instance('subscription')->getCurrencyByKey('subtotal') }} {{ Yard::instance('subscription')->getPriceCurrencyUnit() }}</span>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ __('Delivery country') }}:</td>
|
||||
<td class="text-right">
|
||||
{{ Yard::instance('subscription')->getShippingCountryName() }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ __('order.shipping_costs') }}:</td>
|
||||
<td class="text-right">
|
||||
{{ Yard::instance('subscription')->shipping() }} €
|
||||
</td>
|
||||
</tr>
|
||||
@if(Yard::instance('subscription')->getUserTaxFree())
|
||||
<tr>
|
||||
<td class="">{{ __('order.sum_net') }}:</td>
|
||||
<td class="text-right">{{ Yard::instance('subscription')->subtotalWithShipping() }} €</td>
|
||||
</tr>
|
||||
@else
|
||||
<tr>
|
||||
<td class="">{{ __('order.total_without_VAT') }}:</td>
|
||||
<td class="text-right">{{ Yard::instance('subscription')->subtotalWithShipping() }} €</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="">{{ __('order.plus_VAT') }}:</td>
|
||||
<td class="text-right">{{ Yard::instance('subscription')->taxWithShipping() }} €</td>
|
||||
</tr>
|
||||
@endif
|
||||
|
||||
<tr class="total-row">
|
||||
<td>
|
||||
@if(Yard::instance('subscription')->getUserTaxFree())
|
||||
{{ __('order.total_net') }}:
|
||||
@else
|
||||
{{ __('order.total_gross') }}:
|
||||
@endif
|
||||
</td>
|
||||
<td class="text-right">
|
||||
{{ Yard::instance('subscription')->totalWithShipping() }} €
|
||||
@if(Yard::instance('subscription')->isPriceCurrency())
|
||||
<span class="small">~{{ Yard::instance('subscription')->getCurrencyByKey('totalWithShipping') }} {{ Yard::instance('subscription')->getPriceCurrencyUnit() }}</span>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="cart-summary mt-4">
|
||||
<table class="table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ __('order.subtotal') }}:</td>
|
||||
<td class="text-right">
|
||||
{{ Yard::instance('subscription')->total() }} €
|
||||
@if (Yard::instance('subscription')->isPriceCurrency())
|
||||
<span
|
||||
class="small">~{{ Yard::instance('subscription')->getCurrencyByKey('subtotal') }}
|
||||
{{ Yard::instance('subscription')->getPriceCurrencyUnit() }}</span>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ __('Delivery country') }}:</td>
|
||||
<td class="text-right">
|
||||
{{ Yard::instance('subscription')->getShippingCountryName() }}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ __('order.shipping_costs') }}:</td>
|
||||
<td class="text-right">
|
||||
{{ Yard::instance('subscription')->shipping() }} €
|
||||
</td>
|
||||
</tr>
|
||||
@if (Yard::instance('subscription')->getUserTaxFree())
|
||||
<tr>
|
||||
<td class="">{{ __('order.sum_net') }}:</td>
|
||||
<td class="text-right">{{ Yard::instance('subscription')->subtotalWithShipping() }} €
|
||||
</td>
|
||||
</tr>
|
||||
@else
|
||||
<tr>
|
||||
<td class="">{{ __('order.total_without_VAT') }}:</td>
|
||||
<td class="text-right">{{ Yard::instance('subscription')->subtotalWithShipping() }} €
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="">{{ __('order.plus_VAT') }}:</td>
|
||||
<td class="text-right">{{ Yard::instance('subscription')->taxWithShipping() }} €</td>
|
||||
</tr>
|
||||
@endif
|
||||
|
||||
<tr class="total-row">
|
||||
<td>
|
||||
@if (Yard::instance('subscription')->getUserTaxFree())
|
||||
{{ __('order.total_net') }}:
|
||||
@else
|
||||
{{ __('order.total_gross') }}:
|
||||
@endif
|
||||
</td>
|
||||
<td class="text-right">
|
||||
{{ Yard::instance('subscription')->totalWithShipping() }} €
|
||||
@if (Yard::instance('subscription')->isPriceCurrency())
|
||||
<span
|
||||
class="small">~{{ Yard::instance('subscription')->getCurrencyByKey('totalWithShipping') }}
|
||||
{{ Yard::instance('subscription')->getPriceCurrencyUnit() }}</span>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="abo-settings mt-4 text-right">
|
||||
<div class="alert alert-info text-left">
|
||||
<h4>{{ __('abo.abo_settings') }}</h4>
|
||||
<div class="form-row">
|
||||
<div class="col-6 col-sm-8 col-md-9 col-lg-9 mb-1"></div>
|
||||
<div class="col-12 col-sm-4 col-md-3 col-lg-3 mb-1 text-right">
|
||||
<label class="form-label">{{ __('abo.delivery_day') }}*</label>
|
||||
<select class="custom-select" name="abo_interval" id="abo_interval_select">
|
||||
{!! HTMLHelper::getAboDeliveryOptions() !!}
|
||||
</select>
|
||||
<div id="abo_interval_info" class="alert alert-info mt-2 small d-none"></div>
|
||||
<div id="abo_interval_warning" class="alert alert-warning mt-2 small d-none"></div>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var select = document.getElementById('abo_interval_select');
|
||||
var info = document.getElementById('abo_interval_info');
|
||||
var warning = document.getElementById('abo_interval_warning');
|
||||
if (!select || !info || !warning) return;
|
||||
|
||||
var infoTpl = @json(__('abo.info_next_execution_select', ['placeholder_days' => '__DAYS__', 'placeholder_date' => '__DATE__']));
|
||||
var warnTpl = @json(__('abo.warning_next_date_soon_select', ['placeholder_days' => '__DAYS__', 'placeholder_date' => '__DATE__']));
|
||||
|
||||
function checkDays() {
|
||||
var option = select.options[select.selectedIndex];
|
||||
var days = parseInt(option.getAttribute('data-days'), 10);
|
||||
var date = option.getAttribute('data-date') || '';
|
||||
if (isNaN(days)) {
|
||||
return;
|
||||
}
|
||||
var showWarning = days < 20;
|
||||
if (showWarning) {
|
||||
info.innerHTML = '';
|
||||
info.classList.add('d-none');
|
||||
warning.innerHTML =
|
||||
'<i class="fa fa-exclamation-triangle"></i> ' +
|
||||
warnTpl.replace('__DAYS__', days).replace('__DATE__', date);
|
||||
warning.classList.remove('d-none');
|
||||
} else {
|
||||
warning.classList.add('d-none');
|
||||
info.innerHTML =
|
||||
'<i class="fa fa-info-circle"></i> ' +
|
||||
infoTpl.replace('__DAYS__', days).replace('__DATE__', date);
|
||||
info.classList.remove('d-none');
|
||||
}
|
||||
}
|
||||
select.addEventListener('change', checkDays);
|
||||
checkDays();
|
||||
});
|
||||
</script>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-md-4 col-lg-6 mb-1"></div>
|
||||
<div class="col-12 col-sm-12 col-md-8 col-lg-6 mb-1">
|
||||
<div class="text-right">
|
||||
<em class="small"><i>{!! __('abo.abo_order_info_check') !!}</i></em>
|
||||
<hr class="my-2" style="border-color: #b4b4b4;">
|
||||
<em class="font-weight-bold"><i>{!! __('abo.abo_order_info_check_2') !!}</i></em>
|
||||
<hr class="my-2" style="border-color: #b4b4b4;">
|
||||
<em class="small"><i>{!! __('abo.abo_order_info_check_3', [
|
||||
'abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration'),
|
||||
]) !!}</i></em>
|
||||
<hr class="my-2" style="border-color: #b4b4b4;">
|
||||
<label class="switcher switcher-success d-inline-flex align-items-center">
|
||||
<input type="checkbox" class="switcher-input" name="abo_order_info_checkbox"
|
||||
value="true" required>
|
||||
<span class="switcher-indicator">
|
||||
<span class="switcher-yes"><span class="ion ion-md-checkmark"></span></span>
|
||||
<span class="switcher-no"><span class="ion ion-md-close"></span></span>
|
||||
</span>
|
||||
<span class="switcher-label"><strong>{{ __('abo.abo_order_info_checkbox') }}</strong></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="abo-settings mt-4">
|
||||
<h5>{{ __('abo.abo_settings') }}</h5>
|
||||
<div class="form-group">
|
||||
<label>{{ __('abo.delivery_day') }}*</label>
|
||||
<select class="form-control custom-select" name="abo_interval">
|
||||
{!! HTMLHelper::getAboDeliveryOptions() !!}
|
||||
</select>
|
||||
</div>
|
||||
<div class="alert alert-info">
|
||||
<i class="fa fa-info-circle"></i> {!! __('abo.abo_order_info_check') !!}
|
||||
<hr>
|
||||
<i class="fa fa-info-circle"></i> {!! __('abo.abo_order_info_check_2') !!}
|
||||
<hr>
|
||||
<i class="fa fa-info-circle"></i> {!! __('abo.abo_order_info_check_3', ['abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration')]) !!}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
@endif
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<button type="submit" class="btn btn-default" name="action" value="back">{{ __('abo.back') }}</button>
|
||||
<div class="float-right">
|
||||
<button type="submit" class="btn btn-secondary" name="action" value="checkout"><i class="ion ion-ios-redo"></i> {{ __('order.confirm_and_proceed_to_checkout') }}</button>
|
||||
<button type="submit" class="btn btn-secondary" name="action" value="checkout"><i
|
||||
class="ion ion-ios-redo"></i> {{ __('order.confirm_and_send_order') }}</button>
|
||||
</div>
|
||||
<br><br>
|
||||
<div class="text-right">
|
||||
<em class="small"> <i class="fa fa-lock"></i> {!! __('payment.checkout_ssl_server') !!}</em>
|
||||
<em class="small"><i class="fa fa-info-circle"></i> {!! __('order.confirm_send_order_info') !!}</em>
|
||||
</div>
|
||||
</div>
|
||||
{!! Form::close() !!}
|
||||
|
||||
|
|
@ -7,7 +7,6 @@
|
|||
<ul class="sidenav-inner{{ empty($layout_sidenav_horizontal) ? ' py-1' : '' }}">
|
||||
|
||||
@if (Auth::guard('customers')->check())
|
||||
|
||||
<li class="sidenav-item{{ Request::is('portal/dashboard') ? ' active' : '' }}">
|
||||
<a href="{{ route('portal.dashboard') }}" class="sidenav-link"><i
|
||||
class="sidenav-icon ion ion-ios-home"></i>
|
||||
|
|
@ -26,14 +25,12 @@
|
|||
<div>{{ __('navigation.my_orders') }}</div>
|
||||
</a>
|
||||
</li>
|
||||
@if (Auth::user()->is_admin || Util::isTestSystem(true))
|
||||
<li class="sidenav-item{{ Request::is('portal/subscriptions') ? ' active' : '' }}">
|
||||
<a href="{{ route('portal.my_subscriptions') }}" class="sidenav-link"><i
|
||||
class="sidenav-icon ion ion-md-refresh-circle"></i>
|
||||
<div>{{ __('navigation.myabo') }} <span class="badge badge-warning">DEV</span></div>
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
<li class="sidenav-item{{ Request::is('portal/subscriptions') ? ' active' : '' }}">
|
||||
<a href="{{ route('portal.my_subscriptions') }}" class="sidenav-link"><i
|
||||
class="sidenav-icon ion ion-md-refresh-circle"></i>
|
||||
<div>{{ __('navigation.myabo') }} </div>
|
||||
</a>
|
||||
</li>
|
||||
{{--
|
||||
<li class="sidenav-item{{ Request::is('portal/settings') ? ' active' : '' }}">
|
||||
<a href="{{ route('portal.settings') }}" class="sidenav-link"><i class="sidenav-icon ion ion-md-settings"></i><div>{{ __('navigation.settings') }}</div></a>
|
||||
|
|
|
|||
|
|
@ -271,6 +271,7 @@
|
|||
@endif
|
||||
</div>
|
||||
<hr class="m-0">
|
||||
@if (! $shopping_order->is_abo)
|
||||
<div class="card-body">
|
||||
<h6 class="font-weight-semibold">
|
||||
{{ __('order.reorder') }}
|
||||
|
|
@ -288,6 +289,7 @@
|
|||
|
||||
</div>
|
||||
<hr class="m-0">
|
||||
@endif
|
||||
|
||||
<div class="card-body">
|
||||
<h6 class="font-weight-semibold">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue