akaunting 3.0 (the last dance)

This commit is contained in:
Burak Civan
2022-06-01 10:15:55 +03:00
parent cead09f6d4
commit d9c0764572
3812 changed files with 126831 additions and 102949 deletions

View File

@ -0,0 +1,7 @@
@include($class->views['detail.content.header'])
@foreach($class->tables as $table_key => $table_name)
@include($class->views['detail.table'])
@endforeach
@include($class->views['detail.content.footer'])

View File

@ -0,0 +1,7 @@
<div class="overflow-x-visible mb-8">
<table class="w-full rp-border-collapse">
@include($class->views['detail.table.header'])
@include($class->views['detail.table.body'])
@include($class->views['detail.table.footer'])
</table>
</div>

View File

@ -0,0 +1,13 @@
<tbody>
@if (!empty($class->row_values[$table_key]))
@foreach($class->row_tree_nodes[$table_key] as $id => $node)
@include($class->views['detail.table.row'], ['tree_level' => 0])
@endforeach
@else
<tr>
<td colspan="{{ count($class->dates) + 2 }}">
<div class="text-muted pl-0">{{ trans('general.no_records') }}</div>
</td>
</tr>
@endif
</tbody>

View File

@ -0,0 +1,11 @@
@php $grand_total = array_sum($class->footer_totals[$table_key]); @endphp
<tfoot>
<tr class="px-3">
<th class="{{ $class->column_name_width }} text-uppercase text-left">{{ trans_choice('general.totals', 1) }}</th>
@foreach($class->footer_totals[$table_key] as $total)
<th class="{{ $class->column_value_width }} text-right px-0">{{ $class->has_money ? money($total, default_currency(), true) : $total }}</th>
@endforeach
<th class="{{ $class->column_name_width }} text-right pl-0 pr-4">{{ $class->has_money ? money($grand_total, default_currency(), true) : $grand_total }}</th>
</tr>
</tfoot>

View File

@ -0,0 +1,13 @@
<thead class="thead-light">
<tr>
@if (($table_key == 'default') && !empty($class->groups))
<th class="{{ $class->column_name_width }}">{{ $class->groups[$class->model->settings->group] }}</th>
@else
<th class="{{ $class->column_name_width }}">{{ $table_name }}</th>
@endif
@foreach($class->dates as $date)
<th class="{{ $class->column_value_width }} text-right px-0">{{ $date }}</th>
@endforeach
<th class="{{ $class->column_name_width }} text-right pl-0 pr-4">{{ trans_choice('general.totals', 1) }}</th>
</tr>
</thead>

View File

@ -0,0 +1,87 @@
<!-- if it HAS NOT subcategories -->
@if (is_null($node))
@php
$rows = $class->row_values[$table_key][$id];
@endphp
@if ($row_total = array_sum($rows))
@if (isset($parent_id))
<tr class="collapse-sub" data-collapse="child-{{ $parent_id }}">
<td class="{{ $class->column_name_width }} py-top text-left text-black-400" style="padding-left: {{ $tree_level * 20 }}px;" title="{{ $class->row_names[$table_key][$id] }}">{{ $class->row_names[$table_key][$id] }}</td>
@else
<tr>
<td class="{{ $class->column_name_width }} py-top text-left text-black-400" title="{{ $class->row_names[$table_key][$id] }}">{{ $class->row_names[$table_key][$id] }}</td>
@endif
@foreach($rows as $row)
<td class="{{ $class->column_value_width }} py-top ltr:text-right rtl:text-left text-alignment-right text-black-400 text-xs">{{ $class->has_money ? money($row, default_currency(), true) : $row }}</td>
@endforeach
<td class="{{ $class->column_name_width }} py-top ltr:text-right rtl:text-left text-alignment-right text-black-400 text-xs uppercase">{{ $class->has_money ? money($row_total, default_currency(), true) : $row }}</td>
</tr>
@endif
@endif
<!-- if it HAS subcategories -->
@if (is_array($node))
<!-- parent part -->
@php
$parent_row_values = $class->row_values[$table_key][$id];
array_walk_recursive($node, function ($value, $key) use ($class, $table_key, $id, &$parent_row_values) {
if ($key == $id) {
return;
}
foreach($class->row_values[$table_key][$key] as $date => $amount) {
$parent_row_values[$date] += $amount;
}
});
@endphp
@if ($row_total = array_sum($parent_row_values))
@if (isset($parent_id))
<tr class="collapse-sub" data-collapse="child-{{ $parent_id }}">
<td class="{{ $class->column_name_width }} py-top text-left text-black-400" style="padding-left: {{ $tree_level * 20 }}px;" title="{{ $class->row_names[$table_key][$id] }}">
@else
<tr>
<td class="{{ $class->column_name_width }} py-top text-left text-black-400" title="{{ $class->row_names[$table_key][$id] }}">
@endif
{{ $class->row_names[$table_key][$id] }}
@if (array_sum($parent_row_values) != array_sum($class->row_values[$table_key][$id]))
<button type="button" class="align-text-top" node="child-{{ $id }}" onClick="toggleSub('child-{{ $id }}', event)">
<span class="material-icons transform transition-all rotate-90 text-lg leading-none">navigate_next</span>
</button>
@endif
</td>
@foreach($parent_row_values as $row)
<td class="{{ $class->column_value_width }} py-top ltr:text-right rtl:text-left text-alignment-right text-black-400 text-xs">{{ $class->has_money ? money($row, default_currency(), true) : $row }}</td>
@endforeach
<td class="{{ $class->column_name_width }} py-top ltr:text-right rtl:text-left text-alignment-right text-black-400 text-xs uppercase">{{ $class->has_money ? money($row_total, default_currency(), true) : $row }}</td>
</tr>
@endif
<!-- no categories part -->
@php $rows = $class->row_values[$table_key][$id]; @endphp
@if (($row_total = array_sum($rows)) && array_sum($parent_row_values) != array_sum($rows))
<tr class="collapse-sub" data-collapse="child-{{ $id }}">
<td class="{{ $class->column_name_width }} py-top text-left text-black-400" style="padding-left: {{ ($tree_level + 1) * 20 }}px;" title="{{ $class->row_names[$table_key][$id] }}">{{ $class->row_names[$table_key][$id] }}</td>
@foreach($rows as $row)
<td class="{{ $class->column_value_width }} py-top ltr:text-right rtl:text-left text-alignment-right text-black-400 text-xs">{{ $class->has_money ? money($row, default_currency(), true) : $row }}</td>
@endforeach
<td class="{{ $class->column_name_width }} py-top ltr:text-right rtl:text-left text-alignment-right text-black-400 text-xs uppercase">{{ $class->has_money ? money($row_total, default_currency(), true) : $row }}</td>
</tr>
@endif
<!-- subcategories part -->
@php
$parent_id = $id;
$tree_level++;
@endphp
@foreach($node as $id => $node)
@if ($parent_id != $id)
@include($class->views['detail.table.row'], ['parent_id' => $parent_id, 'tree_level' => $tree_level])
@endif
@endforeach
@endif

View File

@ -0,0 +1,102 @@
@foreach($fields as $field)
@php $type = $field['type']; @endphp
@switch($type)
@case('text')
@case('textGroup')
<x-form.group.text
name="{{ $field['name'] }}"
label="{{ $field['title'] }}"
data-field="settings"
:dynamic-attributes="$field['attributes']"
/>
@break
@case('email')
@case('emailGroup')
<x-form.group.email
name="{{ $field['name'] }}"
label="{{ $field['title'] }}"
data-field="settings"
:dynamic-attributes="$field['attributes']"
/>
@break
@case('password')
@case('passwordGroup')
<x-form.group.email
name="{{ $field['name'] }}"
label="{{ $field['title'] }}"
data-field="settings"
:dynamic-attributes="$field['attributes']"
/>
@break
@case('textarea')
@case('textareaGroup')
<x-form.group.textarea
name="{{ $field['name'] }}"
label="{{ $field['title'] }}"
data-field="settings"
:dynamic-attributes="$field['attributes']"
/>
@break
@case('date')
@case('dateGroup')
<x-form.group.date
name="{{ $field['name'] }}"
label="{{ $field['title'] }}"
data-field="settings"
:dynamic-attributes="array_merge([
'model' => 'form.settings'.'.'.$field['name'],
'show-date-format' => company_date_format(),
], $field['attributes'])"
/>
@break
@case('select')
@case('selectGroup')
<x-form.group.select
name="{{ $field['name'] }}"
label="{{ $field['title'] }}"
:options="$field['values']"
:selected="$field['selected']"
data-field="settings"
:dynamic-attributes="$field['attributes']"
/>
@break
@case('radio')
@case('radioGroup')
<x-form.group.radio
name="{{ $field['name'] }}"
label="{{ $field['title'] }}"
:dynamic-attributes="array_merge([
'data-field' => 'settings'
], $field['attributes'])"
/>
@break
@case('checkbox')
@case('checkboxGroup')
<x-form.group.checkbox
name="{{ $field['name'] }}"
label="{{ $field['title'] }}"
:dynamic-attributes="array_merge([
'data-field' => 'settings'
], $field['attributes'])"
/>
@break
@default
<x-form.group.text
name="{{ $field['name'] }}"
label="{{ $field['title'] }}"
:dynamic-attributes="array_merge([
'data-field' => 'settings'
], $field['attributes'])"
/>
@endswitch
@endforeach

View File

@ -0,0 +1,94 @@
<x-form id="report-show" action="{{ route('reports.show', $class->model->id) }}">
@php
$filters = [];
$filtered = [];
$skipped = [
'keys', 'names', 'types', 'routes', 'defaults'
];
foreach ($class->filters as $filter_name => $filter_values) {
if (in_array($filter_name, $skipped)) {
continue;
}
$key = $filter_name;
if (isset($class->filters['keys']) && !empty($class->filters['keys'][$filter_name])) {
$key = $class->filters['keys'][$filter_name];
} else if ($key == 'years') {
$key = 'year';
} else if ($key == 'customers' || $key == 'vendors') {
$key = 'contact_id';
} else {
$key = Str::singular($key) . '_id';
}
$value = '';
if (isset($class->filters['names']) && !empty($class->filters['names'][$filter_name])) {
$value = $class->filters['names'][$filter_name];
} else if (trans('reports.' . $filter_name) != 'reports.' . $filter_name) {
$value = (strpos(trans('reports.' . $filter_name), '|') !== false) ? trans_choice('reports.' . $filter_name, 1) : trans('reports.' . $filter_name);
} else {
$value = (strpos(trans('general.' . $filter_name), '|') !== false) ? trans_choice('general.' . $filter_name, 1) : trans('general.' . $filter_name);
}
if ($key == 'year') {
$value = trans('general.financial_year');
}
$type = 'select';
if (isset($class->filters['types']) && !empty($class->filters['types'][$filter_name])) {
$type = $class->filters['types'][$filter_name];
}
$url = '';
if (isset($class->filters['routes']) && !empty($class->filters['routes'][$filter_name])) {
$route = $class->filters['routes'][$filter_name];
$url = (is_array($route)) ? route($route[0], $route[1]) : route($route);
}
$default_value = null;
if (isset($class->filters['defaults']) && !empty($class->filters['defaults'][$filter_name])) {
$default_value = $class->filters['defaults'][$filter_name];
}
if ($key == 'year') {
$default_value = \Date::now()->year;
}
$filters[] = [
'key' => $key,
'value' => $value,
'type' => $type,
'url' => $url,
'values' => $filter_values,
];
if (!is_null($default_value)) {
$filtered[] = [
'option' => $key,
'operator' => '=',
'value' => $default_value,
];
}
if (old($key) || request()->get($key)) {
$filtered[] = [
'option' => $key,
'operator' => '=',
'value' => old($key, request()->get($key)),
];
}
}
@endphp
<div class="items-center">
<x-search-string :filters="$filters" :filtered="$filtered" />
</div>
</x-form>

View File

@ -0,0 +1,13 @@
<x-layouts.print>
<x-slot name="title">
{{ $class->model->name }}
</x-slot>
<x-slot name="content">
<h2>{{ $class->model->name }}</h2>
{{ setting('company.name') }}
@include($class->views[$class->type])
</x-slot>
</x-layouts.print>

View File

@ -0,0 +1,31 @@
<x-layouts.admin>
<x-slot name="title">
{{ $class->model->name }}
</x-slot>
<x-slot name="favorite"
title="{{ $class->model->name }}"
icon="{{ $class->icon }}"
:route="['reports.show', $class->model->id]"
></x-slot>
<x-slot name="buttons">
<x-link href="{{ url($class->getUrl('print')) }}" target="_blank">
{{ trans('general.print') }}
</x-link>
<x-link href="{{ url($class->getUrl('export')) }}">
{{ trans('general.export') }}
</x-link>
</x-slot>
<x-slot name="content">
<div class="my-10">
@include($class->views['filter'])
@include($class->views[$class->type])
</div>
</x-slot>
<x-script folder="common" file="reports" />
</x-layouts.admin>

View File

@ -0,0 +1,10 @@
@include($class->views['summary.content.header'])
@foreach($class->tables as $table_key => $table_name)
<div class="flex flex-col lg:flex-row mt-12">
@include($class->views['summary.table'])
@include($class->views['summary.chart'])
</div>
@endforeach
@include($class->views['summary.content.footer'])

View File

@ -0,0 +1,30 @@
@php $charts = $class->getCharts($table_key); @endphp
<div class="w-full lg:w-6/12 lg:ltr:pl-24 lg:rtl:pr-24">
<div class="relative mb-10" x-data="{ toggle: 'donut' }">
<div class="flex border-b pb-2">
<div class="w-full lg:w-11/12 text-xl text-left text-black-400">
<h2 x-show="toggle === 'donut'">{{ trans('general.timeline') }}</h2>
<h2 x-show="toggle === 'bar'">{{ trans('general.distribution') }}</h2>
</div>
<div class="w-full lg:w-1/12 flex items-center justify-center text-right cursor-pointer hover:shadow-lg hover:translate-y-0 hover:rounded-md" x-on:click="toggle === 'bar' ? toggle = 'donut' : toggle = 'bar'">
<span class="material-icons-outlined" x-bind:class="toggle === 'donut' ? 'block': 'hidden'" title="{{ trans('general.distribution') }}">donut_small</span>
<span class="material-icons" x-bind:class="toggle === 'bar' ? 'block': 'hidden'" title="{{ trans('general.timeline') }}">signal_cellular_alt</span>
</div>
</div>
<div x-show="toggle === 'donut'">
{!! $charts['bar']->container() !!}
</div>
<div x-show="toggle === 'bar'">
{!! $charts['donut']->container() !!}
</div>
</div>
</div>
@push('body_scripts')
{!! $charts['bar']->script() !!}
{!! $charts['donut']->script() !!}
@endpush

View File

@ -0,0 +1,7 @@
@php $grand_total = array_sum($class->footer_totals[$table_key]); @endphp
<div class="w-full lg:w-6/12">
@include($class->views['summary.table.header'])
@include($class->views['summary.table.body'])
@include($class->views['summary.table.footer'])
</div>

View File

@ -0,0 +1,19 @@
<div>
<div class="flex items-center justify-between text-xl text-black-400 border-b pb-2">
<h2>{{ $table_name }}</h2>
<span>{{ $class->has_money ? money($grand_total, default_currency(), true) : $grand_total }}</span>
</div>
@if (!empty($class->row_values[$table_key]))
<ul class="space-y-2 my-3">
@foreach($class->row_tree_nodes[$table_key] as $id => $node)
@include($class->views['summary.table.row'], ['tree_level' => 0])
@endforeach
</ul>
@else
<tr>
<td colspan="{{ count($class->dates) + 2 }}">
<div class="text-muted pl-0">{{ trans('general.no_records') }}</div>
</td>
</tr>
@endif
</div>

View File

@ -0,0 +1,88 @@
<!-- if it HAS NOT subcategories -->
@if (is_null($node))
@php
$rows = $class->row_values[$table_key][$id];
@endphp
@if ($row_total = array_sum($rows))
@if (isset($parent_id))
<li class="collapse-sub" data-collapse="child-{{ $parent_id }}">
@else
<li>
@endif
<div class="flex justify-between border-0 m-0 p-0">
@if (isset($parent_id))
<div class="flex items-center" style="padding-left: {{ $tree_level * 20 }}px;">
@else
<div class="flex items-center">
@endif
<span>{{ $class->row_names[$table_key][$id] }}</span>
</div>
<span>{{ $class->has_money ? money($row_total, default_currency(), true) : $row_total }}</span>
</div>
</li>
@endif
@endif
<!-- if it HAS subcategories -->
@if (is_array($node))
<!-- parent part -->
@php
$parent_row_values = $class->row_values[$table_key][$id];
array_walk_recursive($node, function ($value, $key) use ($class, $table_key, $id, &$parent_row_values) {
if ($key == $id) {
return;
}
foreach($class->row_values[$table_key][$key] as $date => $amount) {
$parent_row_values[$date] += $amount;
}
});
@endphp
@if ($row_total = array_sum($parent_row_values))
@if (isset($parent_id))
<li class="collapse-sub" data-collapse="child-{{ $parent_id }}">
@else
<li>
@endif
<div class="flex justify-between border-0 m-0 p-0">
<div class="flex items-center" style="padding-left: {{ $tree_level * 20 }}px;">
<span>{{ $class->row_names[$table_key][$id] }}</span>
@if (array_sum($parent_row_values) != array_sum($class->row_values[$table_key][$id]))
<button type="button" class="align-text-top" node="child-{{ $id }}" onClick="toggleSub('child-{{ $id }}', event)">
<span class="material-icons transform transition-all rotate-90 text-lg leading-none">navigate_next</span>
</button>
@endif
</div>
<span>{{ $class->has_money ? money($row_total, setting('default.currency'), true) : $row_total }}</span>
</div>
</li>
@endif
<!-- no categories part -->
@php $rows = $class->row_values[$table_key][$id]; @endphp
@if (($row_total = array_sum($rows)) && array_sum($parent_row_values) != array_sum($rows))
<li class="collapse-sub" data-collapse="child-{{ $id }}">
<div class="flex justify-between border-0 m-0 p-0">
<div class="flex items-center" style="padding-left: {{ ($tree_level + 1) * 20 }}px;">
<span>{{ $class->row_names[$table_key][$id] }}</span>
</div>
<span>{{ $class->has_money ? money($row_total, setting('default.currency'), true) : $row_total }}</span>
</div>
</li>
@endif
<!-- subcategories part -->
@php
$parent_id = $id;
$tree_level++;
@endphp
@foreach($node as $id => $node)
@if ($parent_id != $id)
@include($class->views['summary.table.row'], ['parent_id' => $parent_id, 'tree_level' => $tree_level])
@endif
@endforeach
@endif