commit 08-2025
This commit is contained in:
parent
9b54eb0512
commit
02f2a4c23e
184 changed files with 31653 additions and 22327 deletions
|
|
@ -20,7 +20,7 @@
|
|||
{{ __('Create/Edit Kategorien') }}
|
||||
</h4>
|
||||
|
||||
{!! Form::open(['url' => route('admin_product_category_store'), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
{!! Form::open(['action' => route('admin_product_category_store'), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
|
||||
<input type="hidden" name="id" id="id" value="@if($category->id>0){{$category->id}}@else new @endif">
|
||||
<input type="hidden" name="action" value="save-form">
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
{!! Form::open(['url' => route('admin_lead_change_mail', [$user->id]) ]) !!}
|
||||
{!! Form::open(['action' => route('admin_lead_change_mail', [$user->id]) ]) !!}
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-form-label col-sm-2 text-sm-right">{{__('New E-Mail Address')}}*</label>
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
{{ __('Create/Edit Land') }}
|
||||
</h4>
|
||||
|
||||
{!! Form::open(['url' => route('admin_country_store'), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
{!! Form::open(['action' => route('admin_country_store'), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
|
||||
<input type="hidden" name="id" id="id" value="@if($country->id>0){{$country->id}}@else new @endif">
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<a href="{{route('admin_customer_detail', [$shopping_user->id])}}" class="btn btn-sm btn-default float-right">zurück</a>
|
||||
{{ __('Kunden Details') }} bearbeiten
|
||||
</h4>
|
||||
{!! Form::open(['url' => route('admin_customer_edit', [$shopping_user->id]), 'class' => 'form-horizontal', 'id'=>'lead-form-validation']) !!}
|
||||
{!! Form::open(['action' => route('admin_customer_edit', [$shopping_user->id]), 'class' => 'form-horizontal', 'id'=>'lead-form-validation']) !!}
|
||||
@include('admin.customer._edit')
|
||||
<div class="text-left mt-3">
|
||||
<button type="submit" class="btn btn-secondary" name="action" value="shopping-user-store">{{ __('save changes') }}</button>
|
||||
|
|
|
|||
|
|
@ -1,114 +0,0 @@
|
|||
@extends('layouts.layout-2')
|
||||
|
||||
@section('content')
|
||||
|
||||
@if ($errors->any())
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="alert alert-danger">
|
||||
<ul>
|
||||
@foreach ($errors->all() as $error)
|
||||
<li>{{ $error }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="card">
|
||||
<h5 class="card-header">
|
||||
{{ __('navigation.products') }} {{ __('navigation.sales_volumes') }}
|
||||
</h5>
|
||||
<div class="card-body">
|
||||
{!! Form::open(['url' => route('admin_evaluation_sales_volumes_download'), 'class' => '']) !!}
|
||||
{!! Form::hidden('key', 'value') !!}
|
||||
<button type="submit" name="action" value="export" class="btn btn-md btn-primary mb-2"><i class="ion ion-md-download"></i> Export als xls</button>
|
||||
<hr>
|
||||
<div class="form-row align-items-center px-0 pb-2 pt-0">
|
||||
<div class="col-6 col-sm-4 col-md-4 col-lg-4 mb-1">
|
||||
<select class="custom-select on_change_select_filter" name="product_sales_vol_filter_month">
|
||||
@foreach($filter_months as $key=>$value)
|
||||
<option value="{{$key}}" @if(session('product_sales_vol_filter_month') == $key) selected @endif>{{$value}}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-6 col-sm-4 col-md-4 col-lg-4 mb-1">
|
||||
<select class="custom-select on_change_select_filter" name="product_sales_vol_filter_year">
|
||||
@foreach($filter_years as $key=>$value)
|
||||
<option value="{{$value}}" @if(session('product_sales_vol_filter_year') == $value) selected @endif>{{$value}}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
{!! Form::close() !!}
|
||||
|
||||
<div class="card">
|
||||
<div class="card-datatable table-responsive">
|
||||
<table class="table table-striped table-bordered" id="datatable-sales-volume">
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{__('#') }}</th>
|
||||
<th>{{__('tables.product')}}</th>
|
||||
<th>{{__('tables.article_no')}}</th>
|
||||
<th>{{__('tables.quantity')}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
$( document ).ready(function() {
|
||||
|
||||
|
||||
var oTable = $('#datatable-sales-volume').DataTable({
|
||||
"processing": true,
|
||||
"serverSide": true,
|
||||
"stateSave": true,
|
||||
"searching": false,
|
||||
ajax: {
|
||||
url: '{!! route('admin_evaluation_sales_volumes_datatable') !!}',
|
||||
data: function(d) {
|
||||
d.product_sales_vol_filter_month = $('select[name=product_sales_vol_filter_month]').val();
|
||||
d.product_sales_vol_filter_year = $('select[name=product_sales_vol_filter_year]').val();
|
||||
}
|
||||
},
|
||||
"order": [[0, "asc" ]],
|
||||
"columns": [
|
||||
{ data: 'id', orderable: true, searchable: false },
|
||||
{ data: 'name', name: 'name', orderable: true, searchable: false },
|
||||
{ data: 'number', name: 'number', orderable: true, searchable: false },
|
||||
{ data: 'value', name: 'value', orderable: true, searchable: false },
|
||||
|
||||
],
|
||||
"bLengthChange": false,
|
||||
"iDisplayLength": 100,
|
||||
"language": {
|
||||
"url": "/js/datatables-{{ \App::getLocale() }}.json"
|
||||
}
|
||||
});
|
||||
|
||||
$('select.on_change_select_filter').on('change', function(){
|
||||
oTable.draw();
|
||||
});
|
||||
|
||||
$('input.on_keyup_input_filter').on('keyup', function(){
|
||||
oTable.draw();
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
|
|
@ -20,7 +20,7 @@
|
|||
{{ __('Create/Edit Inhaltsstoff') }}
|
||||
</h4>
|
||||
|
||||
{!! Form::open(['url' => route('admin_product_ingredient_store'), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
{!! Form::open(['action' => route('admin_product_ingredient_store'), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
|
||||
<input type="hidden" name="id" id="id" value="@if($model->id>0){{$model->id}}@else new @endif">
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
@endif
|
||||
</h4>
|
||||
|
||||
{!! Form::open(['url' => route('admin_lead_store')."?show=".$show, 'class' => 'form-horizontal', 'id'=>'lead-form-validation']) !!}
|
||||
{!! Form::open(['action' => route('admin_lead_store')."?show=".$show, 'class' => 'form-horizontal', 'id'=>'lead-form-validation']) !!}
|
||||
|
||||
<div class="text-left mt-0 mb-2">
|
||||
<button type="submit" class="btn btn-submit btn-primary">{{ __('save') }}</button>
|
||||
|
|
@ -56,7 +56,7 @@
|
|||
<!-- Modal template -->
|
||||
<div class="modal fade" id="modal-user-vat-validation">
|
||||
<div class="modal-dialog">
|
||||
{!! Form::open(['url' => route('admin_lead_store'), 'class' => 'modal-content']) !!}
|
||||
{!! Form::open(['action' => route('admin_lead_store'), 'class' => 'modal-content']) !!}
|
||||
<input type="hidden" name="user_id" id="user_id" value="@if($user->id>0){{$user->id}}@else new @endif">
|
||||
|
||||
<div class="modal-header">
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
{!! Form::open(['url' => route('admin_lead_download'), 'class' => '']) !!}
|
||||
{!! Form::open(['action' => route('admin_lead_download'), 'class' => '']) !!}
|
||||
<div class="form-row align-items-center">
|
||||
<div class="col-sm-5 col-md-5">
|
||||
<label class="form-label" for="filter_user_shop_id">Art Vertriebspartner</label>
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
</div>
|
||||
</h5>
|
||||
<div class="card-body">
|
||||
{!! Form::open(['url' => route('admin_lead_update')."?show=".$show, 'class' => 'form-horizontal', 'id'=>'white-label-form']) !!}
|
||||
{!! Form::open(['action' => route('admin_lead_update')."?show=".$show, 'class' => 'form-horizontal', 'id'=>'white-label-form']) !!}
|
||||
<input type="hidden" name="user_id" value="{{$user->id}}">
|
||||
<div class="form-row">
|
||||
<div class="form-group col-md-12">
|
||||
|
|
|
|||
|
|
@ -1,58 +0,0 @@
|
|||
@if($m_data_error)
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="alert alert-danger">
|
||||
<ul>
|
||||
<li>{{ $m_data_error }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
<div class="card-body m-0 p-0">
|
||||
<div class="table-responsive">
|
||||
<table class="table card-table m-0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th style="width: 33%">{{ __('Name') }}</th>
|
||||
<th style="width: 66%">{{ __('Account ID') }}</th>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ \App\Services\HTMLHelper::getSalutationLang($user->account->m_salutation) }} {{ $user->account->m_first_name }} {{ $user->account->m_last_name }}</td>
|
||||
<td>{{ $user->account->m_account }}</td>
|
||||
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="table card-table m-0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th style="width: 33%">{{ __('Art Vertriebspartner') }}</th>
|
||||
<th style="width: 33%">{{ __('Rolle') }}</th>
|
||||
<th style="width: 33%">{{ __('Sponsor') }}</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>@if($user->lead_type) {{ $user->lead_type->name }} @else Standard @endif</td>
|
||||
<td>@if($user->user_level){{ $user->user_level->name }}@endif</td>
|
||||
<td>@if($user->m_sponsor){{ $user->getMUserSponsor() }}@endif</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@if($user->account->m_notes)
|
||||
<table class="table card-table m-0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>{{ __('weitere Daten') }}</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{$user->account->m_notes}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
|
@ -25,7 +25,7 @@
|
|||
</div>
|
||||
|
||||
<div class="card mb-2">
|
||||
{!! Form::open(['url' => route('admin_level_store',), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
{!! Form::open(['action' => route('admin_level_store',), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
<input type="hidden" name="id" value="@if($value->id>0){{$value->id}}@else new @endif">
|
||||
<h5 class="card-header">
|
||||
{{ __('Rolle') }}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{!! Form::open(['url' => route('admin_payments_credit'), 'class' => 'modal-content form-prevent-multiple-submits', 'enctype' => 'multipart/form-data']) !!}
|
||||
{!! Form::open(['action' => route('admin_payments_credit'), 'class' => 'modal-content form-prevent-multiple-submits', 'enctype' => 'multipart/form-data']) !!}
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">
|
||||
{{ __('Gutschrift') }}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{!! Form::open(['url' => route('admin_payments_paycredit'), 'class' => 'modal-content form-prevent-multiple-submits', 'enctype' => 'multipart/form-data']) !!}
|
||||
{!! Form::open(['action' => route('admin_payments_paycredit'), 'class' => 'modal-content form-prevent-multiple-submits', 'enctype' => 'multipart/form-data']) !!}
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">
|
||||
{{ __('Einkaufsguthaben') }}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{!! Form::open(['url' => route('admin_sales_customers_detail', [$current->id]), 'class' => 'modal-content', 'enctype' => 'multipart/form-data']) !!}
|
||||
{!! Form::open(['action' => route('admin_sales_detail', [$current->id]), 'class' => 'modal-content', 'enctype' => 'multipart/form-data']) !!}
|
||||
|
||||
<input type="hidden" name="action" value="{{$data['action']}}">
|
||||
<input type="hidden" name="id" value="{{$data['id']}}">
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{!! Form::open(['url' => $route, 'class' => 'modal-content', 'enctype' => 'multipart/form-data']) !!}
|
||||
{!! Form::open(['action' => $route, 'class' => 'modal-content', 'enctype' => 'multipart/form-data']) !!}
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">
|
||||
{{ __('Vertriebspartner') }}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{!! Form::open(['url' => route('admin_promotion_detail', [$data['promotion_id']]), 'class' => 'modal-content form-prevent-multiple-submits', 'enctype' => 'multipart/form-data']) !!}
|
||||
{!! Form::open(['action' => route('admin_promotion_detail', [$data['promotion_id']]), 'class' => 'modal-content form-prevent-multiple-submits', 'enctype' => 'multipart/form-data']) !!}
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">
|
||||
{{ __('Produkt') }} <span class="font-weight-light">hinzufügen / bearbeiten</span>
|
||||
|
|
|
|||
|
|
@ -1,45 +0,0 @@
|
|||
{!! Form::open(['url' => route('admin_payments_credit'), 'class' => 'modal-content form-prevent-multiple-submits', 'enctype' => 'multipart/form-data']) !!}
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">
|
||||
{{ __('Gutschrift') }}
|
||||
<span class="font-weight-light">hinzufügen</span>
|
||||
</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input type="hidden" name="action" value="{{$data['action']}}">
|
||||
<input type="hidden" name="id" value="{{$data['id']}}">
|
||||
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group col-12">
|
||||
<label for="member_id" class="form-label">{{ __('Vertriebspartner auswählen') }}*</label>
|
||||
<select class="selectpicker" name="member_id" data-style="btn-light" data-live-search="true" required>
|
||||
{!! HTMLHelper::getMembersOptions(0, true) !!}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group col-12">
|
||||
<label class="form-label" for="credit">{{ __('Betrag') }} netto*</label>
|
||||
{{ Form::text('credit', '', array('placeholder'=>__('in Euro'), 'class'=>'form-control', 'required'=>true)) }}
|
||||
</div>
|
||||
|
||||
<div class="form-group col-12">
|
||||
<label class="form-label" for="message">{{ __('Mitteilung') }}*</label>
|
||||
{{ Form::textarea('message', '' , array('placeholder'=>__('Mitteilung'), 'class'=>'form-control', 'rows'=>4, 'required'=>true)) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">schließen</button>
|
||||
<button type="submit" class="btn btn-primary button-prevent-multiple-submits">{{__('Gutschrift hinzufügen')}}</button>
|
||||
|
||||
</div>
|
||||
{!! Form::close() !!}
|
||||
|
||||
<script type="text/javascript">
|
||||
$( document ).ready(function() {
|
||||
|
||||
});
|
||||
</script>
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
{!! Form::open(['url' => route('admin_payments_credit_create'), 'class' => 'modal-content', 'enctype' => 'multipart/form-data']) !!}
|
||||
{!! Form::open(['action' => route('admin_payments_credit_create'), 'class' => 'modal-content', 'enctype' => 'multipart/form-data']) !!}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
<td><div class="no-line-break">{{ formatDate($user_pay_credit->created_at) }}</div></td>
|
||||
|
||||
@if($user_pay_credit->shopping_order_id)
|
||||
<td><a class="btn btn-secondary btn-xs" href="{{ route('admin_sales_users_detail', [$user_pay_credit->shopping_order_id]) }}"><i class="ion ion-md-eye"></i></a></td>
|
||||
<td><a class="btn btn-secondary btn-xs" href="{{ route('admin_sales_detail', [$user_pay_credit->shopping_order_id]) }}"><i class="ion ion-md-eye"></i></a></td>
|
||||
@else
|
||||
@if($user_pay_credit->status === 3 && $deleteTime = $user_pay_credit->deleteTime())
|
||||
<td>
|
||||
|
|
|
|||
|
|
@ -1,37 +0,0 @@
|
|||
<div class="td-entry-table-margin">
|
||||
{!! $entry->badge !!}
|
||||
|
||||
@if($entry->link)
|
||||
<a href="{{ $entry->link }}">
|
||||
@else
|
||||
<span>
|
||||
@endif
|
||||
|
||||
{!! $entry->name !!} /
|
||||
|
||||
@if($entry->reference)
|
||||
{!! $entry->reference !!} /
|
||||
@endif
|
||||
|
||||
@if($entry->total)
|
||||
({!! $entry->total !!})
|
||||
@endif
|
||||
|
||||
@if($entry->date)
|
||||
{!! $entry->date !!} /
|
||||
@endif
|
||||
|
||||
@if(isset($entry->price_formatted))
|
||||
<strong>{!! $entry->price_formatted !!} €</strong>
|
||||
@endif
|
||||
|
||||
@if($entry->link)
|
||||
</a>
|
||||
@else
|
||||
</span>
|
||||
@endif
|
||||
|
||||
@if(isset($entry->delete))
|
||||
{!! $entry->delete !!}
|
||||
@endif
|
||||
</div>
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
<div class="td-entry-table-margin">
|
||||
{!! $entry->badge !!}
|
||||
|
||||
@if($entry->link)
|
||||
<a href="{{ $entry->link }}">
|
||||
@else
|
||||
<span>
|
||||
@endif
|
||||
|
||||
{!! $entry->name !!} /
|
||||
|
||||
@if($entry->reference)
|
||||
{!! $entry->reference !!} /
|
||||
@endif
|
||||
|
||||
@if($entry->total)
|
||||
({!! $entry->total !!})
|
||||
@endif
|
||||
|
||||
@if($entry->date)
|
||||
{!! $entry->date !!} /
|
||||
@endif
|
||||
|
||||
@if(isset($entry->price_formatted))
|
||||
<strong>{!! $entry->price_formatted !!} €</strong>
|
||||
@endif
|
||||
|
||||
@if($entry->link)
|
||||
</a>
|
||||
@else
|
||||
</span>
|
||||
@endif
|
||||
|
||||
@if(isset($entry->delete))
|
||||
{!! $entry->delete !!}
|
||||
@endif
|
||||
</div>
|
||||
|
|
@ -117,7 +117,7 @@
|
|||
Zahlungen / erstellte Gutschriften
|
||||
</h6>
|
||||
<div class="col-sm-6 mb-0 mt-2">
|
||||
{!! Form::open(['url' => route('admin_payments_credit'), 'class' => 'form-horizontal', 'id'=>'form_filter_sales_year']) !!}
|
||||
{!! Form::open(['action' => route('admin_payments_credit'), 'class' => 'form-horizontal', 'id'=>'form_filter_sales_year']) !!}
|
||||
|
||||
<label class="form-label" for="filter_sales_year">Filter Jahr</label>
|
||||
<select class="custom-select" name="filter_sales_year" id="filter_sales_year">
|
||||
|
|
|
|||
|
|
@ -257,7 +257,7 @@
|
|||
Zahlungen / erstellte Gutschriften
|
||||
</h6>
|
||||
<div class="col-sm-6 mb-0 mt-2">
|
||||
{!! Form::open(['url' => route('admin_payments_credit'), 'class' => 'form-horizontal', 'id'=>'form_filter_sales_year']) !!}
|
||||
{!! Form::open(['action' => route('admin_payments_credit'), 'class' => 'form-horizontal', 'id'=>'form_filter_sales_year']) !!}
|
||||
|
||||
<label class="form-label" for="filter_sales_year">Filter Jahr</label>
|
||||
<select class="custom-select" name="filter_sales_year" id="filter_sales_year">
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
Zahlungen / Rechnungen
|
||||
</h6>
|
||||
<div class="col-sm-6 mb-0 mt-2">
|
||||
{!! Form::open(['url' => route('admin_payments_invoice'), 'class' => 'form-horizontal', 'id'=>'form_filter_sales_year']) !!}
|
||||
{!! Form::open(['action' => route('admin_payments_invoice'), 'class' => 'form-horizontal', 'id'=>'form_filter_sales_year']) !!}
|
||||
|
||||
<label class="form-label" for="filter_sales_year">Filter Jahr</label>
|
||||
<select class="custom-select" name="filter_sales_year" id="filter_sales_year">
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
</div>
|
||||
</h6>
|
||||
{{-- <div class="col-sm-6 mb-0 mt-2">
|
||||
{!! Form::open(['url' => route('admin_payments_paycredit'), 'class' => 'form-horizontal', 'id'=>'form_filter_user_status']) !!}
|
||||
{!! Form::open(['action' => route('admin_payments_paycredit'), 'class' => 'form-horizontal', 'id'=>'form_filter_user_status']) !!}
|
||||
<label class="form-label" for="filter_user_status">Filter User</label>
|
||||
<select class="custom-select" name="filter_user_status" id="filter_user_status">
|
||||
<option value="all" @if($filter_user_status === 'all') selected @endif>alle</option>
|
||||
|
|
|
|||
107
resources/views/admin/payment/reminder/edit.blade.php
Normal file
107
resources/views/admin/payment/reminder/edit.blade.php
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
@extends('layouts.layout-2')
|
||||
|
||||
@section('content')
|
||||
|
||||
@if ($errors->any())
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="alert alert-danger">
|
||||
<ul>
|
||||
@foreach ($errors->all() as $error)
|
||||
<li>{{ $error }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<h4 class="font-weight-bold py-2 mb-2">
|
||||
{{ __('Erinnerung') }} {{ $reminder->id > 0 ? 'bearbeiten' : 'erstellen' }}
|
||||
</h4>
|
||||
|
||||
<div class="text-left mt-0 mb-2">
|
||||
<a href="{{ route('admin_payments_reminder') }}" class="btn btn-default">{{ __('back') }}</a>
|
||||
</div>
|
||||
|
||||
<div class="card mb-2">
|
||||
{!! Form::open(['action' => route('admin_payments_reminder_store',), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
<input type="hidden" name="id" value="@if($reminder->id>0){{$reminder->id}}@else new @endif">
|
||||
<div class="card-body">
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group col">
|
||||
<label for="title" class="form-label">{{__('Titel')}}*</label>
|
||||
{{ Form::text('title', $reminder->title, array('placeholder'=>__('Titel'), 'class'=>'form-control', 'required')) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group col">
|
||||
<label for="subject" class="form-label">{{__('Betreff')}}*</label>
|
||||
{{ Form::text('subject', $reminder->subject, array('placeholder'=>__('Betreff'), 'class'=>'form-control', 'required')) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group col">
|
||||
<label for="message" class="form-label">{{__('Nachricht')}}</label>
|
||||
{{ Form::textarea('message', $reminder->message, array('placeholder'=>__('Nachricht'), 'class'=>'form-control summernote-small')) }}
|
||||
<p> <i>Platzhalter: {billing_first_name}, {billing_last_name}, {order_number}, {order_date}, {order_total}</i></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group col">
|
||||
<label for="interval" class="form-label">{{__('Interval (in Tagen nach der Bestellung)')}}*</label>
|
||||
{{ Form::number('interval', $reminder->interval, array('placeholder'=>__('Interval'), 'class'=>'form-control', 'required')) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group col">
|
||||
<label for="clearingtype" class="form-label">{{__('Typ')}}*</label>
|
||||
{{ Form::select('clearingtype', \App\Models\PaymentReminder::returnClearingtypes(), $reminder->clearingtype, array('placeholder'=>__('Typ'), 'class'=>'form-control custom-select', 'required')) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group col-12">
|
||||
<label class="custom-control custom-checkbox m-2">
|
||||
{!! Form::checkbox('action', 'set_order_status_cancelled', $reminder->action == 'set_order_status_cancelled', ['class'=>'custom-control-input']) !!}
|
||||
<span class="custom-control-label">Action: Bestellung auf "storniert" setzen</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="form-group col-12">
|
||||
<label class="custom-control custom-checkbox m-2">
|
||||
{!! Form::checkbox('active', 1, $reminder->active, ['class'=>'custom-control-input']) !!}
|
||||
<span class="custom-control-label">{{__('active')}}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@if($reminder->id > 0)
|
||||
<div class="float-right">
|
||||
<a href="{{ route('admin_payments_reminder_delete', $reminder->id) }}" class="btn btn-danger btn-sm" onclick="return confirm('{{ __('Are you sure you want to delete this reminder?') }}')"><i class="fa fa-trash"></i> {{ __('delete') }}</a>
|
||||
</div>
|
||||
@endif
|
||||
<div class="text-left mt-0 mb-2">
|
||||
<button type="submit" class="btn btn-secondary">{{ __('save') }}</button>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
{!! Form::close() !!}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="text-left mt-2 mb-2">
|
||||
<a href="{{ route('admin_payments_reminder') }}" class="btn btn-default">{{ __('back') }}</a>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
@endsection
|
||||
582
resources/views/admin/payment/reminder/index.blade.php
Normal file
582
resources/views/admin/payment/reminder/index.blade.php
Normal file
|
|
@ -0,0 +1,582 @@
|
|||
@extends('layouts.layout-2')
|
||||
|
||||
@section('content')
|
||||
|
||||
<style>
|
||||
/* Optimierte Reminder Badge Styles */
|
||||
.reminder-badge {
|
||||
transition: all 0.3s ease;
|
||||
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.reminder-badge:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 4px 8px rgba(0,0,0,0.15);
|
||||
}
|
||||
|
||||
.reminder-badge.badge-warning {
|
||||
background: linear-gradient(45deg, #ffc107, #ffb300);
|
||||
border: 1px solid #ffa000;
|
||||
}
|
||||
|
||||
.reminder-badge.badge-danger {
|
||||
background: linear-gradient(45deg, #dc3545, #c82333);
|
||||
border: 1px solid #bd2130;
|
||||
}
|
||||
|
||||
.reminder-badge.badge-dark {
|
||||
background: linear-gradient(45deg, #343a40, #23272b);
|
||||
border: 1px solid #1d2124;
|
||||
}
|
||||
|
||||
.reminder-badge.badge-light {
|
||||
background: linear-gradient(45deg, #f8f9fa, #e9ecef);
|
||||
border: 1px solid #dee2e6;
|
||||
color: #6c757d !important;
|
||||
}
|
||||
|
||||
/* Tooltip Verbesserungen */
|
||||
.tooltip-inner {
|
||||
background-color: #343a40;
|
||||
color: white;
|
||||
border-radius: 6px;
|
||||
padding: 8px 12px;
|
||||
font-size: 12px;
|
||||
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
|
||||
}
|
||||
|
||||
.tooltip.bs-tooltip-top .arrow::before {
|
||||
border-top-color: #343a40;
|
||||
}
|
||||
|
||||
.tooltip.bs-tooltip-bottom .arrow::before {
|
||||
border-bottom-color: #343a40;
|
||||
}
|
||||
|
||||
/* Reminder Datum Styling */
|
||||
.reminder-date {
|
||||
font-size: 11px;
|
||||
opacity: 0.8;
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
.reminder-date:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Countdown Styling */
|
||||
.countdown-info {
|
||||
font-size: 10px;
|
||||
font-weight: 500;
|
||||
padding: 2px 6px;
|
||||
border-radius: 12px;
|
||||
background: rgba(0,0,0,0.05);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.countdown-info:hover {
|
||||
background: rgba(0,0,0,0.1);
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
.countdown-info.text-info {
|
||||
background: rgba(23, 162, 184, 0.1);
|
||||
border: 1px solid rgba(23, 162, 184, 0.2);
|
||||
}
|
||||
|
||||
.countdown-info.text-danger {
|
||||
background: rgba(220, 53, 69, 0.1);
|
||||
border: 1px solid rgba(220, 53, 69, 0.2);
|
||||
animation: pulse 2s infinite;
|
||||
}
|
||||
|
||||
.countdown-info.text-success {
|
||||
background: rgba(40, 167, 69, 0.1);
|
||||
border: 1px solid rgba(40, 167, 69, 0.2);
|
||||
}
|
||||
|
||||
.countdown-days {
|
||||
font-weight: bold;
|
||||
color: #17a2b8;
|
||||
}
|
||||
|
||||
/* Pulse Animation für fällige Erinnerungen */
|
||||
@keyframes pulse {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(220, 53, 69, 0.7);
|
||||
}
|
||||
70% {
|
||||
box-shadow: 0 0 0 10px rgba(220, 53, 69, 0);
|
||||
}
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(220, 53, 69, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Responsive Anpassungen */
|
||||
@media (max-width: 768px) {
|
||||
.reminder-badge {
|
||||
font-size: 0.75rem;
|
||||
padding: 0.25rem 0.5rem;
|
||||
}
|
||||
|
||||
.reminder-date {
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.countdown-info {
|
||||
font-size: 9px;
|
||||
padding: 1px 4px;
|
||||
}
|
||||
|
||||
.countdown-days {
|
||||
font-size: 9px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Info Box Styling */
|
||||
.info-box {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
border-radius: 10px;
|
||||
padding: 20px;
|
||||
margin-bottom: 30px;
|
||||
color: white;
|
||||
box-shadow: 0 8px 32px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.info-box h5 {
|
||||
color: white;
|
||||
margin-bottom: 15px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.info-box .feature-list {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.info-box .feature-list li {
|
||||
padding: 8px 0;
|
||||
border-bottom: 1px solid rgba(255,255,255,0.1);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.info-box .feature-list li:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.info-box .feature-list li i {
|
||||
margin-right: 10px;
|
||||
width: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.info-box .workflow-steps {
|
||||
background: rgba(255,255,255,0.1);
|
||||
border-radius: 8px;
|
||||
padding: 15px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.info-box .workflow-steps h6 {
|
||||
color: white;
|
||||
margin-bottom: 10px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.info-box .step {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 8px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.info-box .step-number {
|
||||
background: rgba(255,255,255,0.2);
|
||||
border-radius: 50%;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-right: 10px;
|
||||
font-weight: bold;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.info-box .cron-info {
|
||||
background: rgba(255,255,255,0.1);
|
||||
border-radius: 8px;
|
||||
padding: 15px;
|
||||
margin-top: 15px;
|
||||
font-family: 'Courier New', monospace;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.info-box .cron-info code {
|
||||
background: rgba(0,0,0,0.3);
|
||||
padding: 2px 6px;
|
||||
border-radius: 4px;
|
||||
color: #ffd700;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h4 class="card-title">
|
||||
<i class="fas fa-envelope"></i> Erinnerungen
|
||||
</h4>
|
||||
<div class="float-right">
|
||||
<a href="{{ route('admin_payments_reminder_create') }}" class="btn btn-sm btn-primary">
|
||||
<span class="far fa-plus-circle"></span> Erinnerung hinzufügen
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="card-datatable table-responsive pt-2">
|
||||
<table class="datatables-style table table-striped table-bordered" id="datatable-pay-credit">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>{{__('Titel')}}</th>
|
||||
<th>{{__('Interval') }}</th>
|
||||
<th>{{__('Typ') }}</th>
|
||||
<th>{{__('Action') }}</th>
|
||||
<th>{{__('Aktiv') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@foreach($reminders as $reminder)
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ route('admin_payments_reminder_edit', $reminder->id) }}" class="btn icon-btn btn-sm btn-primary"><span class="fa fa-edit"></span></a>
|
||||
</td>
|
||||
<td>{{ $reminder->title }}</td>
|
||||
<td>{{ $reminder->interval }}</td>
|
||||
<td>{{ $reminder->getClearingtype() }}</td>
|
||||
<td>{{ $reminder->action }}</td>
|
||||
<td>{!! get_active_badge($reminder->active) !!}</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="row mt-4">
|
||||
<div class="col-12">
|
||||
<!-- Offene Zahlungen Übersicht -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h4 class="card-title">
|
||||
<i class="fas fa-clock"></i> Offene Zahlungen - Übersicht
|
||||
</h4>
|
||||
<div class="card-tools">
|
||||
<span class="badge badge-primary">{{ $totalPayments }} offene Zahlungen</span>
|
||||
<span class="badge badge-warning">{{ number_format($totalAmount, 2, ',', '.') }} € Gesamtbetrag</span>
|
||||
</div>
|
||||
<div class="float-right">
|
||||
<a href="{{ route('admin_payments_reminder_logs') }}" class="btn btn-sm btn-info mr-2">
|
||||
<i class="fas fa-chart-line"></i> Logs & Statistiken
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
||||
|
||||
<!-- Detaillierte Tabelle -->
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-striped" id="payment-reminders-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Bestell-ID</th>
|
||||
<th>Betrag</th>
|
||||
<th>Erstellt am</th>
|
||||
<th>Tage alt</th>
|
||||
<th>Name</th>
|
||||
<th>Email</th>
|
||||
<th>Zahlungsart</th>
|
||||
<th>Versand</th>
|
||||
<th>Erinnerung</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($detailedData as $payment)
|
||||
<tr>
|
||||
<td data-order="{{ $payment['order_id'] }}">
|
||||
|
||||
|
||||
<a class="btn btn-sm btn-outline-primary" href="{{ route('admin_sales_detail', $payment['order_id']) }}" target="_blank">
|
||||
<i class="fa fa-eye"></i> {{ $payment['order_id'] }}
|
||||
</a>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<span class="text-danger font-weight-bold">
|
||||
{{ number_format($payment['amount']/100, 2, ',', '.') }} €
|
||||
</span>
|
||||
</td>
|
||||
<td>{{ $payment['created_at'] }}</td>
|
||||
<td>
|
||||
@if($payment['days_old'] > 30)
|
||||
<span class="badge badge-danger">{{ $payment['days_old'] }} Tage</span>
|
||||
@elseif($payment['days_old'] > 14)
|
||||
<span class="badge badge-warning">{{ $payment['days_old'] }} Tage</span>
|
||||
@else
|
||||
<span class="badge badge-info">{{ $payment['days_old'] }} Tage</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>{{ $payment['name'] }}</td>
|
||||
<td>{{ $payment['email'] }}</td>
|
||||
<td>
|
||||
@if($payment['clearingtype'] == 'fnc')
|
||||
<span class="badge badge-primary">{{ $payment['clearingtype_name'] }}</span>
|
||||
@else
|
||||
<span class="badge badge-warning">{{ $payment['clearingtype_name'] }}</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>{!! $payment['shipped'] !!}</td>
|
||||
<td>
|
||||
@if($payment['reminder'] > 0)
|
||||
<div class="d-flex flex-column align-items-start">
|
||||
<!-- Reminder Badge mit verbesserter Darstellung -->
|
||||
<span class="badge badge-pill reminder-badge badge-{{ $payment['reminder'] == 1 ? 'warning' : ($payment['reminder'] == 2 ? 'danger' : 'dark') }} mb-1"
|
||||
data-toggle="tooltip"
|
||||
data-placement="top"
|
||||
title="{{ $payment['reminder'] }}. Zahlungserinnerung gesendet">
|
||||
<i class="fas fa-envelope-open-text mr-1"></i>
|
||||
<strong>{{ $payment['reminder'] }}.</strong>
|
||||
@if($payment['reminder'] == 1)
|
||||
<i class="fas fa-exclamation-triangle ml-1"></i>
|
||||
@elseif($payment['reminder'] >= 2)
|
||||
<i class="fas fa-exclamation-circle ml-1"></i>
|
||||
@endif
|
||||
</span>
|
||||
|
||||
<!-- Datum mit verbesserter Formatierung -->
|
||||
@if($payment['reminder_date'])
|
||||
<small class="text-muted reminder-date"
|
||||
data-toggle="tooltip"
|
||||
data-placement="bottom"
|
||||
title="Letzte Erinnerung gesendet">
|
||||
<i class="far fa-clock mr-1"></i>
|
||||
{{ \Carbon\Carbon::parse($payment['reminder_date'])->diffForHumans() }}
|
||||
</small>
|
||||
@endif
|
||||
|
||||
<!-- Countdown für nächste Erinnerung -->
|
||||
@if(isset($payment['countdown']) && $payment['countdown'])
|
||||
@if($payment['countdown']['type'] == 'countdown')
|
||||
<small class="text-info countdown-info mt-1"
|
||||
data-toggle="tooltip"
|
||||
data-placement="bottom"
|
||||
title="Nächste Erinnerung am {{ \Carbon\Carbon::parse($payment['countdown']['next_reminder_date'])->format('d.m.Y') }}">
|
||||
<i class="fas fa-hourglass-half mr-1"></i>
|
||||
<span class="countdown-days">{{ $payment['countdown']['days_left'] }}</span> Tage
|
||||
</small>
|
||||
@elseif($payment['countdown']['type'] == 'overdue')
|
||||
<small class="text-danger countdown-info mt-1"
|
||||
data-toggle="tooltip"
|
||||
data-placement="bottom"
|
||||
title="Nächste Erinnerung war fällig am {{ \Carbon\Carbon::parse($payment['countdown']['next_reminder_date'])->format('d.m.Y') }}">
|
||||
<i class="fas fa-exclamation-triangle mr-1"></i>
|
||||
Fällig!
|
||||
</small>
|
||||
@elseif($payment['countdown']['type'] == 'completed')
|
||||
<small class="text-success countdown-info mt-1"
|
||||
data-toggle="tooltip"
|
||||
data-placement="bottom"
|
||||
title="Alle verfügbaren Erinnerungen wurden gesendet">
|
||||
<i class="fas fa-check-circle mr-1"></i>
|
||||
Alle gesendet
|
||||
</small>
|
||||
@endif
|
||||
@endif
|
||||
</div>
|
||||
@else
|
||||
<span class="badge badge-pill reminder-badge badge-light text-muted"
|
||||
data-toggle="tooltip"
|
||||
data-placement="top"
|
||||
title="Noch keine Erinnerung gesendet">
|
||||
<i class="fas fa-envelope mr-1"></i>
|
||||
0
|
||||
</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
<div class="btn-group">
|
||||
<a href="{{ route('admin_payments_reminder_action', ['action' => 'send_reminder', 'id' => $payment['payment_id']]) }}" class="btn btn-sm btn-outline-primary"
|
||||
onclick="return confirm('Möchten Sie wirklich eine Zahlungserinnerung senden?')">
|
||||
<i class="fas fa-envelope"></i> Erinnerung senden
|
||||
</a>
|
||||
<a href="{{ route('admin_payments_reminder_action', ['action' => 'no_payment', 'id' => $payment['payment_id']]) }}" class="btn btn-sm btn-outline-danger"
|
||||
onclick="return confirm('Soll die Zahlung als nicht bezahlt markiert werden?')">
|
||||
<i class="fas fa-trash"></i> keine Zahlung
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="9" class="text-center text-muted">
|
||||
<i class="fas fa-check-circle"></i> Keine offenen Zahlungen gefunden
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
{{-- <div class="info-box mt-4">
|
||||
<h5><i class="fas fa-info-circle mr-2"></i>Zahlungserinnerungen System - Übersicht & Funktionsweise</h5>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h6><i class="fas fa-cogs mr-2"></i>System-Features:</h6>
|
||||
<ul class="feature-list">
|
||||
<li><i class="fas fa-check text-success"></i>Dynamisch konfigurierbare Erinnerungsintervalle</li>
|
||||
<li><i class="fas fa-check text-success"></i>Automatische E-Mail-Versendung via Cron-Job</li>
|
||||
<li><i class="fas fa-check text-success"></i>Intelligente Fälligkeitsberechnung</li>
|
||||
<li><i class="fas fa-check text-success"></i>Detailliertes Logging & Statistiken</li>
|
||||
<li><i class="fas fa-check text-success"></i>Manuelle & automatische Aktionen</li>
|
||||
<li><i class="fas fa-check text-success"></i>Responsive Admin-Interface</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<h6><i class="fas fa-clock mr-2"></i>Workflow:</h6>
|
||||
<div class="workflow-steps">
|
||||
<div class="step">
|
||||
<span class="step-number">1</span>
|
||||
<span>Offene Zahlung wird erkannt</span>
|
||||
</div>
|
||||
<div class="step">
|
||||
<span class="step-number">2</span>
|
||||
<span>Intervall-basierte Fälligkeitsprüfung</span>
|
||||
</div>
|
||||
<div class="step">
|
||||
<span class="step-number">3</span>
|
||||
<span>Automatische E-Mail-Versendung</span>
|
||||
</div>
|
||||
<div class="step">
|
||||
<span class="step-number">4</span>
|
||||
<span>Logging & Status-Update</span>
|
||||
</div>
|
||||
<div class="step">
|
||||
<span class="step-number">5</span>
|
||||
<span>Nächste Erinnerung planen</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mt-3">
|
||||
<div class="col-md-6">
|
||||
<h6><i class="fas fa-calendar-alt mr-2"></i>Reminder-Erstellung:</h6>
|
||||
<p style="font-size: 14px; line-height: 1.5;">
|
||||
Erstellen Sie neue Erinnerungen über den "Erinnerung hinzufügen" Button.
|
||||
Jeder Reminder kann individuell konfiguriert werden mit:
|
||||
</p>
|
||||
<ul class="feature-list" style="font-size: 13px;">
|
||||
<li><i class="fas fa-arrow-right text-info"></i>Titel & Beschreibung</li>
|
||||
<li><i class="fas fa-arrow-right text-info"></i>Intervall in Tagen (z.B. 7, 14, 30)</li>
|
||||
<li><i class="fas fa-arrow-right text-info"></i>Zahlungsart-Filter (FNC, PayPal, etc.)</li>
|
||||
<li><i class="fas fa-arrow-right text-info"></i>E-Mail-Template & Betreff</li>
|
||||
<li><i class="fas fa-arrow-right text-info"></i>Automatische Aktionen</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<h6><i class="fas fa-robot mr-2"></i>Automatisierung:</h6>
|
||||
<div class="cron-info">
|
||||
<strong>Cron-Job Konfiguration:</strong><br>
|
||||
<code>0 9 * * *</code> php /path/to/artisan payments:reminders<br><br>
|
||||
<strong>Ausführung:</strong> Täglich um 9:00 Uhr<br>
|
||||
<strong>Funktion:</strong> Prüft alle aktiven Reminder und sendet fällige E-Mails
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mt-3">
|
||||
<div class="col-12">
|
||||
<h6><i class="fas fa-chart-line mr-2"></i>Monitoring & Statistiken:</h6>
|
||||
<p style="font-size: 14px; line-height: 1.5;">
|
||||
Überwachen Sie die Performance Ihres Reminder-Systems über die "Logs & Statistiken" Seite.
|
||||
Dort finden Sie detaillierte Auswertungen zu Versandraten, Erfolgsquoten,
|
||||
durchschnittlichen Reaktionszeiten und mehr. Das System loggt jeden Schritt
|
||||
automatisch für vollständige Transparenz.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div> --}}
|
||||
</div>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// Tooltips initialisieren
|
||||
$('[data-toggle="tooltip"]').tooltip();
|
||||
|
||||
// DataTable für Payment Reminder Einstellungen
|
||||
$('#payment-reminders-settings-table').DataTable({
|
||||
"language": {
|
||||
"url": "//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json"
|
||||
},
|
||||
"pageLength": 25,
|
||||
"responsive": true
|
||||
});
|
||||
|
||||
// DataTable für offene Zahlungen
|
||||
$('#payment-reminders-table').DataTable({
|
||||
"language": {
|
||||
"url": "//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json"
|
||||
},
|
||||
"order": [[3, "desc"]], // Sortiere nach "Tage alt" absteigend
|
||||
"pageLength": 50,
|
||||
"responsive": true,
|
||||
"columnDefs": [
|
||||
{
|
||||
"targets": [8], // Reminder Spalte
|
||||
"orderable": true,
|
||||
"searchable": false
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
// Tooltips nach DataTable-Initialisierung neu initialisieren
|
||||
$('#payment-reminders-table').on('draw.dt', function() {
|
||||
$('[data-toggle="tooltip"]').tooltip();
|
||||
});
|
||||
});
|
||||
|
||||
function sendReminder(paymentId) {
|
||||
if (confirm('Möchten Sie wirklich eine Zahlungserinnerung senden?')) {
|
||||
// TODO: Implementiere Erinnerung senden
|
||||
alert('Erinnerung für Payment ID ' + paymentId + ' würde gesendet werden');
|
||||
}
|
||||
}
|
||||
|
||||
function viewDetails(paymentId) {
|
||||
// TODO: Implementiere Detail-Ansicht
|
||||
alert('Details für Payment ID ' + paymentId + ' würden angezeigt werden');
|
||||
}
|
||||
</script>
|
||||
@endsection
|
||||
|
||||
|
||||
333
resources/views/admin/payment/reminder/logs.blade.php
Normal file
333
resources/views/admin/payment/reminder/logs.blade.php
Normal file
|
|
@ -0,0 +1,333 @@
|
|||
@extends('layouts.layout-2')
|
||||
|
||||
@section('content')
|
||||
|
||||
<style>
|
||||
/* Statistik Cards */
|
||||
.stats-card {
|
||||
transition: all 0.3s ease;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.stats-card:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 20px rgba(0,0,0,0.15);
|
||||
}
|
||||
|
||||
.stats-number {
|
||||
font-size: 2rem;
|
||||
font-weight: bold;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.stats-label {
|
||||
font-size: 0.9rem;
|
||||
color: #6c757d;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
/* Log Tabelle */
|
||||
.log-table {
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
.log-level {
|
||||
padding: 2px 8px;
|
||||
border-radius: 12px;
|
||||
font-size: 0.75rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.log-level.info { background: rgba(23, 162, 184, 0.1); color: #17a2b8; }
|
||||
.log-level.warning { background: rgba(255, 193, 7, 0.1); color: #ffc107; }
|
||||
.log-level.error { background: rgba(220, 53, 69, 0.1); color: #dc3545; }
|
||||
.log-level.notice { background: rgba(40, 167, 69, 0.1); color: #28a745; }
|
||||
|
||||
/* Filter Form */
|
||||
.filter-form {
|
||||
background: #f8f9fa;
|
||||
border-radius: 8px;
|
||||
padding: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
/* Responsive */
|
||||
@media (max-width: 768px) {
|
||||
.stats-number {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.log-table {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="container-fluid">
|
||||
<!-- Header -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h1 class="h3 mb-0">
|
||||
<i class="fas fa-chart-line"></i> Payment Reminder Logs & Statistiken
|
||||
</h1>
|
||||
<a href="{{ route('admin_payments_reminder') }}" class="btn btn-secondary">
|
||||
<i class="fas fa-arrow-left"></i> Zurück zur Übersicht
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Statistiken Übersicht -->
|
||||
{{-- <div class="row mb-4">
|
||||
<!-- 7 Tage -->
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="card stats-card bg-primary text-white">
|
||||
<div class="card-body text-center">
|
||||
<div class="stats-number">{{ $stats7Days['summary']['total_logs'] }}</div>
|
||||
<div class="stats-label">Logs (7 Tage)</div>
|
||||
<div class="mt-2">
|
||||
<small>
|
||||
<i class="fas fa-envelope"></i> {{ $stats7Days['summary']['emails_sent'] }} gesendet |
|
||||
<i class="fas fa-exclamation-triangle"></i> {{ $stats7Days['summary']['emails_failed'] }} fehlgeschlagen
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 30 Tage -->
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="card stats-card bg-success text-white">
|
||||
<div class="card-body text-center">
|
||||
<div class="stats-number">{{ $stats30Days['summary']['total_logs'] }}</div>
|
||||
<div class="stats-label">Logs (30 Tage)</div>
|
||||
<div class="mt-2">
|
||||
<small>
|
||||
<i class="fas fa-envelope"></i> {{ $stats30Days['summary']['emails_sent'] }} gesendet |
|
||||
<i class="fas fa-exclamation-triangle"></i> {{ $stats30Days['summary']['emails_failed'] }} fehlgeschlagen
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 90 Tage -->
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="card stats-card bg-info text-white">
|
||||
<div class="card-body text-center">
|
||||
<div class="stats-number">{{ $stats90Days['summary']['total_logs'] }}</div>
|
||||
<div class="stats-label">Logs (90 Tage)</div>
|
||||
<div class="mt-2">
|
||||
<small>
|
||||
<i class="fas fa-envelope"></i> {{ $stats90Days['summary']['emails_sent'] }} gesendet |
|
||||
<i class="fas fa-exclamation-triangle"></i> {{ $stats90Days['summary']['emails_failed'] }} fehlgeschlagen
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
--}}
|
||||
|
||||
<!-- Filter -->
|
||||
<div class="card filter-form">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title mb-3">
|
||||
<i class="fas fa-filter"></i> Filter
|
||||
</h5>
|
||||
<form method="GET" action="{{ route('admin_payments_reminder_logs') }}" class="row">
|
||||
<div class="col-md-3 mb-2">
|
||||
<label for="order_id" class="form-label">Order ID</label>
|
||||
<input type="number" class="form-control" id="order_id" name="order_id" value="{{ $orderId }}" placeholder="Order ID">
|
||||
</div>
|
||||
<div class="col-md-3 mb-2">
|
||||
<label for="action" class="form-label">Aktion</label>
|
||||
<select class="form-control custom-select" id="action" name="action">
|
||||
<option value="">Alle Aktionen</option>
|
||||
<option value="email_sent" {{ $action == 'email_sent' ? 'selected' : '' }}>E-Mail gesendet</option>
|
||||
<option value="email_exception" {{ $action == 'email_exception' ? 'selected' : '' }}>E-Mail Fehler</option>
|
||||
<option value="reminder_completed" {{ $action == 'reminder_completed' ? 'selected' : '' }}>Erinnerung abgeschlossen</option>
|
||||
<option value="action_completed" {{ $action == 'action_completed' ? 'selected' : '' }}>Aktion abgeschlossen</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-2 mb-2">
|
||||
<label for="start_date" class="form-label">Von</label>
|
||||
<input type="date" class="form-control" id="start_date" name="start_date" value="{{ $startDate }}">
|
||||
</div>
|
||||
<div class="col-md-2 mb-2">
|
||||
<label for="end_date" class="form-label">Bis</label>
|
||||
<input type="date" class="form-control" id="end_date" name="end_date" value="{{ $endDate }}">
|
||||
</div>
|
||||
<div class="col-md-2 mb-2 d-flex align-items-end">
|
||||
<button type="submit" class="btn btn-primary me-2">
|
||||
<i class="fas fa-search"></i> Filtern
|
||||
</button>
|
||||
<a href="{{ route('admin_payments_reminder_logs') }}" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-times"></i> Reset
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Logs Tabelle -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-list"></i>
|
||||
@if($filteredLogs)
|
||||
Gefilterte Logs ({{ $filteredLogs->count() }} Einträge)
|
||||
@else
|
||||
Neueste Logs ({{ $recentLogs->count() }} Einträge)
|
||||
@endif
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped log-table" id="logs-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Datum</th>
|
||||
<th>Aktion</th>
|
||||
<th>Level</th>
|
||||
<th>Model</th>
|
||||
<th>Model ID</th>
|
||||
<th>Nachricht</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse(($filteredLogs ?: $recentLogs) as $log)
|
||||
<tr>
|
||||
<td>
|
||||
<small>{{ $log->created_at->format('d.m.Y H:i:s') }}</small>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge badge-secondary">{{ $log->action }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="log-level {{ $log->getLevelType() }}">
|
||||
{{ ucfirst($log->getLevelType()) }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<small>{{ $log->model ?: '-' }}</small>
|
||||
</td>
|
||||
<td>
|
||||
@if($log->model_id)
|
||||
<a href="{{ route('admin_sales_detail', $log->model_id) }}" target="_blank" class="btn btn-sm btn-outline-primary">
|
||||
{{ $log->model_id }}
|
||||
</a>
|
||||
@else
|
||||
<small>-</small>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
<small>{{ Str::limit($log->message, 100) }}</small>
|
||||
@if(strlen($log->message) > 100)
|
||||
<button type="button" class="btn btn-sm btn-link" data-toggle="tooltip" data-placement="top" title="{{ $log->message }}">
|
||||
<i class="fas fa-eye"></i>
|
||||
</button>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="6" class="text-center text-muted">
|
||||
<i class="fas fa-inbox"></i> Keine Logs gefunden
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Detaillierte Statistiken -->
|
||||
<div class="row mt-4">
|
||||
<div class="col-md-6">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-chart-pie"></i> Aktionen (30 Tage)
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Aktion</th>
|
||||
<th>Level</th>
|
||||
<th>Anzahl</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($stats30Days['detailed_stats'] as $stat)
|
||||
<tr>
|
||||
<td><small>{{ $stat->action }}</small></td>
|
||||
<td>
|
||||
<span class="log-level {{ $stat->level == 2 ? 'info' : ($stat->level == 5 ? 'error' : 'notice') }}">
|
||||
{{ $stat->level == 2 ? 'Info' : ($stat->level == 5 ? 'Error' : 'Notice') }}
|
||||
</span>
|
||||
</td>
|
||||
<td><strong>{{ $stat->count }}</strong></td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="card-title mb-0">
|
||||
<i class="fas fa-chart-bar"></i> Erfolgsrate (30 Tage)
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
@php
|
||||
$totalEmails = $stats30Days['summary']['emails_sent'] + $stats30Days['summary']['emails_failed'];
|
||||
$successRate = $totalEmails > 0 ? round(($stats30Days['summary']['emails_sent'] / $totalEmails) * 100, 1) : 0;
|
||||
@endphp
|
||||
|
||||
<div class="text-center">
|
||||
<div class="display-4 text-success">{{ $successRate }}%</div>
|
||||
<div class="text-muted">Erfolgsrate</div>
|
||||
<div class="mt-3">
|
||||
<div class="progress">
|
||||
<div class="progress-bar bg-success" style="width: {{ $successRate }}%"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<small class="text-muted">
|
||||
{{ $stats30Days['summary']['emails_sent'] }} erfolgreich / {{ $totalEmails }} gesamt
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// DataTable für Logs
|
||||
$('#logs-table').DataTable({
|
||||
"language": {
|
||||
"url": "//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json"
|
||||
},
|
||||
"order": [[0, "desc"]], // Sortiere nach Datum absteigend
|
||||
"pageLength": 50,
|
||||
"responsive": true
|
||||
});
|
||||
|
||||
// Tooltips initialisieren
|
||||
$('[data-toggle="tooltip"]').tooltip();
|
||||
});
|
||||
</script>
|
||||
|
||||
@endsection
|
||||
176
resources/views/admin/payment/reminder/overview.blade.php
Normal file
176
resources/views/admin/payment/reminder/overview.blade.php
Normal file
|
|
@ -0,0 +1,176 @@
|
|||
@extends('layouts.layout-2')
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">
|
||||
<i class="fas fa-clock"></i> Payment Reminders
|
||||
</h3>
|
||||
<div class="card-tools">
|
||||
<span class="badge badge-primary">{{ $totalPayments }} offene Zahlungen</span>
|
||||
<span class="badge badge-warning">{{ number_format($totalAmount, 2, ',', '.') }} € Gesamtbetrag</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
||||
<!-- Statistiken -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-3">
|
||||
<div class="info-box">
|
||||
<span class="info-box-icon bg-info"><i class="fas fa-list"></i></span>
|
||||
<div class="info-box-content">
|
||||
<span class="info-box-text">Offene Zahlungen</span>
|
||||
<span class="info-box-number">{{ $totalPayments }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="info-box">
|
||||
<span class="info-box-icon bg-warning"><i class="fas fa-euro-sign"></i></span>
|
||||
<div class="info-box-content">
|
||||
<span class="info-box-text">Gesamtbetrag</span>
|
||||
<span class="info-box-number">{{ number_format($totalAmount, 2, ',', '.') }} €</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="info-box">
|
||||
<span class="info-box-icon bg-success"><i class="fas fa-credit-card"></i></span>
|
||||
<div class="info-box-content">
|
||||
<span class="info-box-text">Zahlungsarten</span>
|
||||
<span class="info-box-number">{{ count($clearingTypes) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="info-box">
|
||||
<span class="info-box-icon bg-danger"><i class="fas fa-calendar"></i></span>
|
||||
<div class="info-box-content">
|
||||
<span class="info-box-text">Letzte Aktualisierung</span>
|
||||
<span class="info-box-number">{{ now()->format('d.m.Y H:i') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Übersicht nach Zahlungsarten -->
|
||||
<div class="row mb-4">
|
||||
@foreach($summaryData as $clearingtype => $data)
|
||||
<div class="col-md-4">
|
||||
<div class="small-box bg-info">
|
||||
<div class="inner">
|
||||
<h3>{{ $data['count'] }}</h3>
|
||||
<p>{{ strtoupper($clearingtype) }} - {{ $data['interval'] }} Tage</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="fas fa-credit-card"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<!-- Detaillierte Tabelle -->
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-striped" id="payment-reminders-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Zahlungsart</th>
|
||||
<th>Intervall (Tage)</th>
|
||||
<th>Bestell-ID</th>
|
||||
<th>Zahlungs-ID</th>
|
||||
<th>Betrag</th>
|
||||
<th>Erstellt am</th>
|
||||
<th>Tage alt</th>
|
||||
<th>Grenzdatum</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($detailedData as $payment)
|
||||
<tr>
|
||||
<td>
|
||||
<span class="badge badge-primary">{{ strtoupper($payment['clearingtype']) }}</span>
|
||||
</td>
|
||||
<td>{{ $payment['interval_days'] }}</td>
|
||||
<td>
|
||||
<a href="{{ route('admin_sales_detail', $payment['order_id']) }}" target="_blank">
|
||||
#{{ $payment['order_id'] }}
|
||||
</a>
|
||||
</td>
|
||||
<td>{{ $payment['payment_id'] }}</td>
|
||||
<td>
|
||||
<span class="text-danger font-weight-bold">
|
||||
{{ number_format($payment['amount'], 2, ',', '.') }} €
|
||||
</span>
|
||||
</td>
|
||||
<td>{{ $payment['created_at'] }}</td>
|
||||
<td>
|
||||
@if($payment['days_old'] > 30)
|
||||
<span class="badge badge-danger">{{ $payment['days_old'] }} Tage</span>
|
||||
@elseif($payment['days_old'] > 14)
|
||||
<span class="badge badge-warning">{{ $payment['days_old'] }} Tage</span>
|
||||
@else
|
||||
<span class="badge badge-info">{{ $payment['days_old'] }} Tage</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>{{ $payment['date_limit'] }}</td>
|
||||
<td>
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-sm btn-outline-primary"
|
||||
onclick="sendReminder({{ $payment['payment_id'] }})">
|
||||
<i class="fas fa-envelope"></i> Erinnerung senden
|
||||
</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-info"
|
||||
onclick="viewDetails({{ $payment['payment_id'] }})">
|
||||
<i class="fas fa-eye"></i> Details
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="9" class="text-center text-muted">
|
||||
<i class="fas fa-check-circle"></i> Keine offenen Zahlungen gefunden
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#payment-reminders-table').DataTable({
|
||||
"language": {
|
||||
"url": "//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json"
|
||||
},
|
||||
"order": [[6, "desc"]], // Sortiere nach "Tage alt" absteigend
|
||||
"pageLength": 25,
|
||||
"responsive": true
|
||||
});
|
||||
});
|
||||
|
||||
function sendReminder(paymentId) {
|
||||
if (confirm('Möchten Sie wirklich eine Zahlungserinnerung senden?')) {
|
||||
// TODO: Implementiere Erinnerung senden
|
||||
alert('Erinnerung für Payment ID ' + paymentId + ' würde gesendet werden');
|
||||
}
|
||||
}
|
||||
|
||||
function viewDetails(paymentId) {
|
||||
// TODO: Implementiere Detail-Ansicht
|
||||
alert('Details für Payment ID ' + paymentId + ' würden angezeigt werden');
|
||||
}
|
||||
</script>
|
||||
@endsection
|
||||
|
||||
|
||||
|
|
@ -20,7 +20,7 @@
|
|||
{{ __('Create/Edit Produkt') }}
|
||||
</h4>
|
||||
|
||||
{!! Form::open(['url' => route('admin_product_store'), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
{!! Form::open(['action' => route('admin_product_store'), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
<input type="hidden" name="id" id="id" value="@if($product->id>0){{$product->id}}@else new @endif">
|
||||
|
||||
<div class="text-left mt-0 mb-2">
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
{{ __('Create/Edit Promotion') }}
|
||||
</h4>
|
||||
|
||||
{!! Form::open(['url' => route('admin_promotion_detail', $promotion->id), 'class' => 'form-horizontal']) !!}
|
||||
{!! Form::open(['action' => route('admin_promotion_detail', $promotion->id), 'class' => 'form-horizontal']) !!}
|
||||
<input type="hidden" name="id" id="id" value="@if($promotion->id>0){{$promotion->id}}@else new @endif">
|
||||
|
||||
<div class="text-left mt-0 mb-2">
|
||||
|
|
|
|||
|
|
@ -3,14 +3,14 @@
|
|||
<!-- Status -->
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-3 mb-1">
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 mb-1">
|
||||
<strong class="mr-2">Status:</strong>
|
||||
<span class="text-big">
|
||||
{!! \App\Services\Payment::getPaymentForTypeBadge($shopping_order) !!}
|
||||
{!! \App\Services\Payment::getShoppingOrderBadge($shopping_order) !!}
|
||||
</span>
|
||||
</div>
|
||||
<div class="col-md-3 mb-1">
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 mb-1">
|
||||
<strong class="mr-2">Versand:</strong>
|
||||
@if($isAdmin)
|
||||
<button type="button" class="btn btn-sm btn-{{$shopping_order->getShippedColor()}}" data-toggle="modal" data-target="#modals-shipped"
|
||||
|
|
@ -26,7 +26,7 @@
|
|||
</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="col-md-3 mb-1">
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 mb-1">
|
||||
<strong class="mr-2">Rechnung:</strong>
|
||||
@if($isAdmin)
|
||||
@if(App\Services\Invoice::isInvoice($shopping_order))
|
||||
|
|
@ -59,7 +59,7 @@
|
|||
@endif
|
||||
</div>
|
||||
|
||||
<div class="col-md-3 mb-1">
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 mb-1">
|
||||
@if ($isAdmin)
|
||||
<strong class="mr-2">Lieferschein:</strong>
|
||||
@if (App\Services\Invoice::isDelivery($shopping_order))
|
||||
|
|
@ -70,10 +70,14 @@
|
|||
|
||||
<a href="{{ route('storage_file', [$shopping_order->id, 'invoice_delivery', 'download']) }}"
|
||||
class="btn btn-dark btn-sm"><i class="fa fa-file-download"></i><i class="fa fa-file-download"></i></a>
|
||||
@endif
|
||||
|
||||
<a href="{{ route('admin_sales_send_logistic_mail', [$shopping_order->id]) }}"
|
||||
class="btn btn-info btn-sm"><i class="fa fa-envelope"></i></a>
|
||||
@endif
|
||||
|
||||
@endif
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
|
@ -96,9 +100,8 @@
|
|||
{{$shopping_order->getFormattedTotalShipping()}} €
|
||||
</div>
|
||||
<div class="col-md-3 mb-3">
|
||||
{{-- <div class="text-muted small">Points gesamt</div>
|
||||
{{ $shopping_order->points }}
|
||||
--}}
|
||||
<div class="text-muted small">White Label</div>
|
||||
{{ $shopping_order->user_white_label ? 'Ja' : 'Nein' }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -134,7 +137,7 @@
|
|||
<button type="button" class="btn btn-xs btn-outline-info" data-toggle="modal" data-target="#modals-load-content"
|
||||
data-id="{{$shopping_order->shopping_user->id}}"
|
||||
data-action="shopping-user-is-like-member"
|
||||
data-back="{{route('admin_sales_customers_detail', [$shopping_order->id])}}"
|
||||
data-back="{{route('admin_sales_detail', [$shopping_order->id])}}"
|
||||
data-modal="modal-xl"
|
||||
data-route="{{route('modal_load')}}"><span class="fa fa-edit"></span> Vertriebspartner zuordnen</button>
|
||||
@else
|
||||
|
|
|
|||
15
resources/views/admin/sales/detail.blade.php
Normal file
15
resources/views/admin/sales/detail.blade.php
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
@extends('layouts.layout-2')
|
||||
|
||||
@section('content')
|
||||
<h4 class="font-weight-bold py-2 mb-2">
|
||||
<a href="{{route('admin_sales')}}" class="btn btn-sm btn-default float-right">zurück</a>
|
||||
@if($isView === 'sales_customer')
|
||||
{{ __('Bestellung Kunde') }} <span class="text-muted">#{{$shopping_order->id}}</span>
|
||||
@elseif($isView === 'sales_user')
|
||||
{{ __('Bestellung Vertriebspartner') }} <span class="text-muted">#{{$shopping_order->id}}</span>
|
||||
@endif
|
||||
</h4>
|
||||
@include('admin.sales._detail')
|
||||
<a href="{{route('admin_sales')}}" class="btn btn-sm btn-default mt-2 float-right">zurück</a>
|
||||
|
||||
@endsection
|
||||
128
resources/views/admin/sales/index.blade.php
Normal file
128
resources/views/admin/sales/index.blade.php
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
@extends('layouts.layout-2')
|
||||
|
||||
@section('content')
|
||||
|
||||
|
||||
<h4 class="font-weight-bold py-2 mb-2">
|
||||
{{ __('Bestellungen Kunden') }}
|
||||
</h4>
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="form-row align-items-center">
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 mb-2">
|
||||
<label class="form-label" for="filter_member_id">Filter zugewiesener Vertriebspartner</label>
|
||||
<select class="custom-select" name="filter_member_id" id="filter_member_id">
|
||||
<option value="">Filter aus</option>
|
||||
@foreach($filter_members as $member)
|
||||
<option value="{{$member->id}}" @if(get_user_attr('filter_member_id') == $member->id) selected @endif>{{$member->first_name}} {{$member->last_name}} |{{$member->email}}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 mb-2">
|
||||
<label class="form-label" for="filter_txaction">Filter Status</label>
|
||||
<select class="custom-select" name="filter_txaction" id="filter_txaction">
|
||||
<option value="">Filter aus</option>
|
||||
@foreach(\App\Services\Payment::$txaction_text as $id=>$name)
|
||||
<option value="{{$id}}" @if(get_user_attr('filter_txaction') == $id) selected @endif>{{$name}}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 mb-2">
|
||||
<label class="form-label" for="filter_shipped">Filter Versand</label>
|
||||
<select class="custom-select" name="filter_shipped" id="filter_shipped">
|
||||
<option value="">Filter aus</option>
|
||||
@foreach(\App\Models\ShoppingOrder::$shippedTypes as $id=>$name)
|
||||
<option value="{{$id}}" @if(get_user_attr('filter_shipped') === $id) selected @endif>{{$name}}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-sm-6 col-md-4 col-lg-2 mb-2">
|
||||
<label class="form-label" for="filter_art">Filter Art</label>
|
||||
<select class="custom-select" name="filter_art" id="filter_art">
|
||||
<option value="">Filter aus</option>
|
||||
@foreach(\App\Services\PaymentService::$txaction_art as $id=>$name)
|
||||
<option value="{{$id}}" @if(get_user_attr('filter_art') == $id) selected @endif>{{$name}}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-sm-1 col-md-1 col-lg-1 mb-2 mt-4">
|
||||
<a href="{{ route('admin_sales') }}?reset=filter" data-toggle="tooltip" data-placement="top" title="Reset Filter" class="btn icon-btn btn-sm btn-outline-dark float-right">
|
||||
<span class="fa fa-sync"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="card-datatable table-responsive">
|
||||
<table class="datatable-customers table table-striped table-bordered" id="datatable-customers">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>{{__('Datum')}}</th>
|
||||
<th>{{__('Betrag')}}</th>
|
||||
<th>{{__('Zahlung')}}</th>
|
||||
<th>{{__('Status')}}</th>
|
||||
<th>{{__('Versand')}}</th>
|
||||
<th>{{__('Art')}}</th>
|
||||
<th>{{__('First name')}}</th>
|
||||
<th>{{__('Last name')}}</th>
|
||||
<th>{{__('E-Mail')}}</th>
|
||||
<th>{{__('zugewiesener Vertriebspartner')}}</th>
|
||||
<th>{{__('Rf-Nr.')}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$( document ).ready(function() {
|
||||
var oTable = $('#datatable-customers').DataTable({
|
||||
"processing": true,
|
||||
"serverSide": true,
|
||||
ajax: {
|
||||
url: '{!! route( 'admin_sales_datatable') !!}',
|
||||
data: function(d) {
|
||||
d.filter_member_id = $('select[name=filter_member_id]').val();
|
||||
d.filter_txaction = $('select[name=filter_txaction]').val();
|
||||
d.filter_art = $('select[name=filter_art]').val();
|
||||
d.filter_shipped = $('select[name=filter_shipped]').val();
|
||||
}
|
||||
},
|
||||
"order": [[0, "desc" ]],
|
||||
"columns": [
|
||||
{ data: 'id', searchable: false },
|
||||
{ data: 'created_at', name: 'shopping_orders.created_at' },
|
||||
{ data: 'total_shipping', name: 'total_shipping' },
|
||||
{ data: 'payment', name: 'payment', orderable: false },
|
||||
{ data: 'txaction', name: 'txaction' },
|
||||
{ data: 'shipped', name: 'shipped' },
|
||||
{ data: 'payment_for', name: 'payment_for' },
|
||||
{ data: 'shopping_user.billing_firstname', name: 'shopping_user.billing_firstname' },
|
||||
{ data: 'shopping_user.billing_lastname', name: 'shopping_user.billing_lastname' },
|
||||
{ data: 'shopping_user.billing_email', name: 'shopping_user.billing_email' },
|
||||
{ data: 'member_id', name: 'member_id', searchable: false, orderable: false },
|
||||
{ data: 'reference', name: 'reference' },
|
||||
],
|
||||
"bLengthChange": false,
|
||||
"iDisplayLength": 100,
|
||||
"language": {
|
||||
"url": "/js/German.json"
|
||||
}
|
||||
});
|
||||
$('#filter_member_id').on('change', function(){
|
||||
oTable.draw();
|
||||
});
|
||||
$('#filter_txaction').on('change', function(){
|
||||
oTable.draw();
|
||||
});
|
||||
$('#filter_art').on('change', function(){
|
||||
oTable.draw();
|
||||
});
|
||||
$('#filter_shipped').on('change', function(){
|
||||
oTable.draw();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
<h4 class="font-weight-bold py-2 mb-2">
|
||||
{{ __('Einstellungen') }}
|
||||
</h4>
|
||||
{!! Form::open(['url' => route('admin_setting_store'), 'class' => 'form-horizontal']) !!}
|
||||
{!! Form::open(['action' => route('admin_setting_store'), 'class' => 'form-horizontal']) !!}
|
||||
|
||||
<div class="card mb-2">
|
||||
<div class="card-body">
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
</div>
|
||||
|
||||
<div class="card mb-2">
|
||||
{!! Form::open(['url' => route('admin_shipping_store'), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
{!! Form::open(['action' => route('admin_shipping_store'), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
<input type="hidden" name="id" value="@if($value->id>0){{$value->id}}@else new @endif">
|
||||
<h5 class="card-header">
|
||||
{{ __('Versandkosten') }}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
{{ __('Edit Startseite') }}
|
||||
</h4>
|
||||
|
||||
{!! Form::open(['url' => route('admin_sites_store', [$site]), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
{!! Form::open(['action' => route('admin_sites_store', [$site]), 'class' => 'form-horizontal', 'id'=>'']) !!}
|
||||
|
||||
<div class="text-left mt-0 mb-2">
|
||||
<button type="submit" class="btn btn-submit btn-primary">{{ __('save') }}</button>
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
{{ __('navigation.products') }} {{ __('navigation.sales_volumes') }}
|
||||
</h5>
|
||||
<div class="card-body">
|
||||
{!! Form::open(['url' => route('admin_stats_sales_volumes_download'), 'class' => '']) !!}
|
||||
{!! Form::open(['action' => route('admin_stats_sales_volumes_download'), 'class' => 'form-horizontal']) !!}
|
||||
{!! Form::hidden('key', 'value') !!}
|
||||
<button type="submit" name="action" value="export" class="btn btn-md btn-primary mb-2"><i class="ion ion-md-download"></i> Export als xls</button>
|
||||
<hr>
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
{{ __('Create/Edit Contact') }}
|
||||
</h4>
|
||||
|
||||
{!! Form::open(['url' => route('admin_user_store'), 'class' => 'form-horizontal', 'id'=>'lead-form-validation']) !!}
|
||||
{!! Form::open(['action' => route('admin_user_store'), 'class' => 'form-horizontal', 'id'=>'lead-form-validation']) !!}
|
||||
<input type="hidden" name="user_id" id="user_id" value="@if($user->id>0){{$user->id}}@else new @endif">
|
||||
|
||||
{{-- @include('user.form') --}}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue