diff --git a/app/DataTables/Shop/ArticlePriceGenericsDataTable.php b/app/DataTables/Shop/ArticlePriceGenericsDataTable.php deleted file mode 100644 index 1737d603..00000000 --- a/app/DataTables/Shop/ArticlePriceGenericsDataTable.php +++ /dev/null @@ -1,30 +0,0 @@ -title('Nom'), - Column::make('price')->title('Prix HT')->class('text-right'), - Column::make('price_taxed')->title('Prix TTC')->class('text-right'), - Column::make('article_prices_count')->title('Nb de tarifs')->class('text-right'), - self::makeColumnButtons(), - ]; - } - -} diff --git a/app/DataTables/Shop/PriceGenericsDataTable.php b/app/DataTables/Shop/PriceGenericsDataTable.php new file mode 100644 index 00000000..57f19d63 --- /dev/null +++ b/app/DataTables/Shop/PriceGenericsDataTable.php @@ -0,0 +1,31 @@ +withCount('prices'); + return self::buildQuery($model); + } + + protected function getColumns() + { + return [ + Column::make('category.name')->title('Catégorie'), + Column::make('name')->title('Nom'), + Column::make('price_by_unit.price')->title('Prix HT')->class('text-right'), + Column::make('price_by_unit.price_taxed')->title('Prix TTC')->class('text-right'), + Column::make('prices_count')->title('Nb articles')->class('text-right'), + self::makeColumnButtons(), + ]; + } + +} diff --git a/app/Http/Controllers/Shop/Admin/ArticlePriceGenericController.php b/app/Http/Controllers/Shop/Admin/ArticlePriceGenericController.php deleted file mode 100644 index 18301e80..00000000 --- a/app/Http/Controllers/Shop/Admin/ArticlePriceGenericController.php +++ /dev/null @@ -1,59 +0,0 @@ -render('Shop.Admin.ArticlePriceGenerics.list'); - } - - public function getDatatable(Request $request) - { - return ArticlePriceGenerics::getTables($request->all()); - } - - public function create() - { - $data['taxes'] = Taxes::getOptions(); - return view('Shop.Admin.ArticlePriceGenerics.create',$data); - } - - public function store(Request $request) - { - $ret = ArticlePriceGenerics::store($request->all()); - return redirect()->route('Shop.Admin.ArticlePriceGenerics.index'); - } - - public function show($id) - { - $data = ArticlePriceGenerics::get($id); - return view('Shop.Admin.ArticlePriceGenerics.view', $data); - } - - public function edit($id) - { - $data['generic'] = ArticlePriceGenerics::get($id); - $data['taxes'] = Taxes::getOptions(); - return view('Shop.Admin.ArticlePriceGenerics.edit', $data); - } - - public function update(Request $request) - { - // - } - - public function destroy($id) - { - return ArticlePriceGenerics::destroy($id); - } -} diff --git a/app/Http/Controllers/Shop/Admin/PriceGenericController.php b/app/Http/Controllers/Shop/Admin/PriceGenericController.php new file mode 100644 index 00000000..283df252 --- /dev/null +++ b/app/Http/Controllers/Shop/Admin/PriceGenericController.php @@ -0,0 +1,57 @@ +render('Shop.Admin.PriceGenerics.list'); + } + + public function getDatatable(Request $request) + { + return PriceGenerics::getTables($request->all()); + } + + public function create() + { + $data['taxes'] = Taxes::getOptions(); + $data['categories'] = PriceGenericCategories::getOptions(); + return view('Shop.Admin.PriceGenerics.create',$data); + } + + public function edit($id) + { + $data['generic'] = PriceGenerics::get($id)->toArray(); + $data['taxes'] = Taxes::getOptions(); + $data['categories'] = PriceGenericCategories::getOptions(); + return view('Shop.Admin.PriceGenerics.edit', $data); + } + + public function store(Request $request) + { + $ret = PriceGenerics::store($request->all()); + return redirect()->route('Shop.Admin.PriceGenerics.index'); + } + + public function show($id) + { + $data = PriceGenerics::get($id); + return view('Shop.Admin.PriceGenerics.view', $data); + } + + public function destroy($id) + { + return PriceGenerics::destroy($id); + } +} diff --git a/app/Menu/Shop.php b/app/Menu/Shop.php index 63a8c41a..1e35c72f 100644 --- a/app/Menu/Shop.php +++ b/app/Menu/Shop.php @@ -34,8 +34,8 @@ class Shop $menu->addTo('shop', 'Stock', [ 'route' => 'Shop.Admin.ArticleAttributeValues.index', 'permission' => 'backend_access' ]) ->activeIfRoute(['Shop.Admin.ArticleAttributeValues.*'])->order(9); */ - $menu->addTo('shop', 'Prix génériques', [ 'route' => 'Shop.Admin.ArticlePriceGenerics.index', 'permission' => 'backend_access' ]) - ->activeIfRoute(['Shop.Admin.ArticlePriceGenerics.*'])->order(10); + $menu->addTo('shop', 'Prix génériques', [ 'route' => 'Shop.Admin.PriceGenerics.index', 'permission' => 'backend_access' ]) + ->activeIfRoute(['Shop.Admin.PriceGenerics.*'])->order(10); } diff --git a/app/Models/Shop/PriceGeneric.php b/app/Models/Shop/PriceGeneric.php index b0592a64..0ae25e7e 100644 --- a/app/Models/Shop/PriceGeneric.php +++ b/app/Models/Shop/PriceGeneric.php @@ -12,9 +12,14 @@ class PriceGeneric extends Model protected $guarded = ['id']; protected $table = 'shop_price_generics'; + public function category() + { + return $this->hasOne('App\Models\Shop\PriceGenericCategory','id','category_id'); + } + public function prices() { - return $this->hasMany('App\Models\Shop\Price'); + return $this->hasMany('App\Models\Shop\Price','price_id')->where('price_type','App\Models\Shop\PriceGeneric'); } public function values() @@ -22,9 +27,19 @@ class PriceGeneric extends Model return $this->hasMany('App\Models\Shop\PriceGenericValue'); } + public function priceByUnit() + { + return $this->hasOne('App\Models\Shop\PriceGenericValue')->orderBy('quantity','asc'); + } + public function articles() { return $this->hasManyThrough('App\Models\Shop\Article','App\Models\Shop\Price'); } + public function scopeByCategory($query, $id) + { + return $query->where('category_id', $id); + } + } \ No newline at end of file diff --git a/app/Models/Shop/PriceGenericCategory.php b/app/Models/Shop/PriceGenericCategory.php new file mode 100644 index 00000000..988ebc49 --- /dev/null +++ b/app/Models/Shop/PriceGenericCategory.php @@ -0,0 +1,18 @@ +hasMany('App\Models\Shop\PriceGeneric','category_id'); + } + +} \ No newline at end of file diff --git a/app/Repositories/Shop/PriceGenericCategories.php b/app/Repositories/Shop/PriceGenericCategories.php new file mode 100644 index 00000000..8a394ccd --- /dev/null +++ b/app/Repositories/Shop/PriceGenericCategories.php @@ -0,0 +1,61 @@ +make(true); + } + + public static function getAll() + { + return PriceGenericCategory::orderBy('name','asc')->get(); + } + + public static function get($id) + { + return PriceGenericCategory::find($id); + } + + public static function getOptions() + { + return PriceGenericCategory::get()->pluck('name','id')->toArray(); + } + + public static function store($data) + { + $id = isset($data['id']) ? $data['id'] : false; + $category = $id ? self::update($data) : self::create($data); + return $category->id; + } + + public static function create($data) + { + return PriceGenericCategory::create($data); + } + + public static function update($data, $id = false) + { + $id = isset($data['id']) ? $data['id'] : false; + $category = PriceGenericCategory::find($id); + $category->update($data); + return $category; + } + + public static function destroy($id) + { + return PriceGenericCategory::destroy($id); + } + +} diff --git a/app/Repositories/Shop/PriceGenericValues.php b/app/Repositories/Shop/PriceGenericValues.php index cd85ac85..0dd27f93 100644 --- a/app/Repositories/Shop/PriceGenericValues.php +++ b/app/Repositories/Shop/PriceGenericValues.php @@ -33,6 +33,15 @@ class PriceGenericValues return PriceGenericValue::find($id); } + public static function storePrices($generic_id, $values) + { + foreach ($values as $value) + { + $value['price_generic_id'] = $generic_id; + self::store($value); + } + } + public static function store($data) { $id = isset($data['id']) ? $data['id'] : false; diff --git a/app/Repositories/Shop/PriceGenerics.php b/app/Repositories/Shop/PriceGenerics.php index 63ec4fc5..5fd2ef3c 100644 --- a/app/Repositories/Shop/PriceGenerics.php +++ b/app/Repositories/Shop/PriceGenerics.php @@ -36,14 +36,17 @@ class PriceGenerics public static function get($id) { - return PriceGeneric::find($id); + return PriceGeneric::with("values")->find($id); } public static function store($data) { $id = isset($data['id']) ? $data['id'] : false; - $price = $id ? self::update($data) : self::create($data); - return $price->id; + $prices = isset($data['prices']) ? $data['prices'] : false; + unset($data['prices']); + $generic = $id ? self::update($data) : self::create($data); + PriceGenericValues::storePrices($generic->id, $prices); + return $generic->id; } public static function create($data) @@ -54,9 +57,9 @@ class PriceGenerics public static function update($data, $id = false) { $id = isset($data['id']) ? $data['id'] : false; - $article = PriceGeneric::find($id); - $article->update($data); - return $article; + $generic = PriceGeneric::find($id); + $generic->update($data); + return $generic; } public static function destroy($id) diff --git a/resources/views/Shop/Admin/ArticlePriceGenerics/create.blade.php b/resources/views/Shop/Admin/ArticlePriceGenerics/create.blade.php deleted file mode 100644 index acc6f802..00000000 --- a/resources/views/Shop/Admin/ArticlePriceGenerics/create.blade.php +++ /dev/null @@ -1,28 +0,0 @@ -@extends('layout.index', [ - 'title' => __('article_price_generics.title'), - 'subtitle' => __('article_price_generics.create.title'), - 'breadcrumb' => [__('article_price_generics.title'), __('article_price_generics.create.title')] -]) - -@include('boilerplate::load.fileinput') - -@section('content') - - {{ Form::open(['route' => 'Shop.Admin.ArticlePriceGenerics.store', 'id' => 'article-price-generic-form', 'autocomplete' => 'off', 'files' => true]) }} - -
-
- - {{ __('article_price_generics.list.title') }} - - - - @include('components.button-save') - -
-
- - @include('Shop.Admin.ArticlePriceGenerics.form') - - -@endsection diff --git a/resources/views/Shop/Admin/ArticlePriceGenerics/edit.blade.php b/resources/views/Shop/Admin/ArticlePriceGenerics/edit.blade.php deleted file mode 100644 index 5536a285..00000000 --- a/resources/views/Shop/Admin/ArticlePriceGenerics/edit.blade.php +++ /dev/null @@ -1,14 +0,0 @@ -@extends('layout.index', [ - 'title' => __('article_price_generics.title'), - 'subtitle' => __('article_price_generics.edit.title'), - 'breadcrumb' => [__('article_price_generics.title'), __('article_price_generics.edit.title')] -]) - -@section('content') - - {{ Form::open(['route' => 'Shop.Admin.ArticlePriceGenerics.update', 'id' => 'article-price-generic-form', 'autocomplete' => 'off', 'files' => true]) }} - - @include('Shop.Admin.ArticlePriceGenerics.form') - - -@endsection diff --git a/resources/views/Shop/Admin/ArticlePriceGenerics/form.blade.php b/resources/views/Shop/Admin/ArticlePriceGenerics/form.blade.php deleted file mode 100644 index 5b9efdf6..00000000 --- a/resources/views/Shop/Admin/ArticlePriceGenerics/form.blade.php +++ /dev/null @@ -1,64 +0,0 @@ - -
-
- {{ Form::label('name', 'Nom') }} - @include('components.input', ['name' => 'name', 'value' => $generic['name'] ?? null, 'required' => true]) -
-
- -
-
-
-
- {{ Form::label('tax_id', 'TVA') }} - @include('components.select', ['name' => 'tax_id', 'value' => $generic['tax_id'] ?? null, 'list' => $taxes ?? null, 'class' => 'tva', 'required' => true]) -
-
- {{ Form::label('price', 'Prix HT') }} - @include('components.input', ['name' => 'price', 'value' => $generic['price'] ?? null, 'class' => 'price', 'required' => true]) -
-
- {{ Form::label('price_taxed', 'Prix TTC') }} - @include('components.input', ['name' => 'price_taxed', 'value' => $generic['price_taxed'] ?? null, 'class' => 'price_taxed', 'required' => true]) -
-
-
-
- - -
-
-
- @include('components.button-save') -
-
-
- -@push('js') - -@endpush \ No newline at end of file diff --git a/resources/views/Shop/Admin/ArticlePriceGenerics/list.blade.php b/resources/views/Shop/Admin/ArticlePriceGenerics/list.blade.php deleted file mode 100644 index 2d672283..00000000 --- a/resources/views/Shop/Admin/ArticlePriceGenerics/list.blade.php +++ /dev/null @@ -1,8 +0,0 @@ -@extends('layout.index', [ - 'title' => __('article_price_generics.title'), - 'subtitle' => __('article_price_generics.list.title'), - 'breadcrumb' => [__('article_price_generics.title')] -]) -@section('content') - @include('components.datatable', ['route' => route('Shop.Admin.ArticlePriceGenerics.index'), 'model' => 'article-price-generics']) -@endsection diff --git a/resources/views/Shop/Admin/PriceGenerics/create.blade.php b/resources/views/Shop/Admin/PriceGenerics/create.blade.php new file mode 100644 index 00000000..0e2ddd8c --- /dev/null +++ b/resources/views/Shop/Admin/PriceGenerics/create.blade.php @@ -0,0 +1,26 @@ +@extends('layout.index', [ + 'title' => __('price_generics.title'), + 'subtitle' => __('price_generics.create.title'), + 'breadcrumb' => [__('price_generics.title'), __('price_generics.create.title')] +]) + +@section('content') + + {{ Form::open(['route' => 'Shop.Admin.PriceGenerics.store', 'id' => 'price-generic-form', 'autocomplete' => 'off']) }} + +
+
+ + {{ __('price_generics.list.title') }} + + + + @include('components.button-save') + +
+
+ + @include('Shop.Admin.PriceGenerics.form') + + +@endsection diff --git a/resources/views/Shop/Admin/PriceGenerics/edit.blade.php b/resources/views/Shop/Admin/PriceGenerics/edit.blade.php new file mode 100644 index 00000000..995dbd6b --- /dev/null +++ b/resources/views/Shop/Admin/PriceGenerics/edit.blade.php @@ -0,0 +1,14 @@ +@extends('layout.index', [ + 'title' => __('price_generics.title'), + 'subtitle' => __('price_generics.edit.title'), + 'breadcrumb' => [__('price_generics.title'), __('price_generics.edit.title')] +]) + +@section('content') + + {{ Form::open(['route' => 'Shop.Admin.PriceGenerics.store', 'id' => 'price-generic-form', 'autocomplete' => 'off']) }} + + @include('Shop.Admin.PriceGenerics.form') + + +@endsection diff --git a/resources/views/Shop/Admin/PriceGenerics/form.blade.php b/resources/views/Shop/Admin/PriceGenerics/form.blade.php new file mode 100644 index 00000000..9ca52124 --- /dev/null +++ b/resources/views/Shop/Admin/PriceGenerics/form.blade.php @@ -0,0 +1,23 @@ +
+
+ {{ Form::label('name', 'Catégorie') }} + @include('components.select', ['name' => 'category_id', 'list' => $categories, 'value' => $generic['category_id'] ?? null, 'required' => true]) +
+
+ +
+
+ {{ Form::label('name', 'Nom') }} + @include('components.input', ['name' => 'name', 'value' => $generic['name'] ?? null, 'required' => true]) +
+
+ +@include('Shop.Admin.PriceGenerics.partials.prices', ['prices' => $generic['values'] ?? null ]) + +
+
+
+ @include('components.button-save') +
+
+
diff --git a/resources/views/Shop/Admin/PriceGenerics/list.blade.php b/resources/views/Shop/Admin/PriceGenerics/list.blade.php new file mode 100644 index 00000000..32689abc --- /dev/null +++ b/resources/views/Shop/Admin/PriceGenerics/list.blade.php @@ -0,0 +1,8 @@ +@extends('layout.index', [ + 'title' => __('price_generics.title'), + 'subtitle' => __('price_generics.list.title'), + 'breadcrumb' => [__('price_generics.title')] +]) +@section('content') + @include('components.datatable', ['route' => route('Shop.Admin.PriceGenerics.index'), 'model' => 'price-generics']) +@endsection diff --git a/resources/views/Shop/Admin/PriceGenerics/partials/block_price.blade.php b/resources/views/Shop/Admin/PriceGenerics/partials/block_price.blade.php new file mode 100644 index 00000000..d94589e5 --- /dev/null +++ b/resources/views/Shop/Admin/PriceGenerics/partials/block_price.blade.php @@ -0,0 +1,42 @@ +
+ + + +
+
+ +
+ +
+ {{ Form::label('quantity', 'Qté.') }}
+ @include('components.number', ['name' => "prices[$key][quantity]", 'value' => $price['quantity'] ?? 1, 'required' => true, 'class' => 'form-control-sm']) +
+ +
+ {{ Form::label('tax_id', 'TVA') }}
+ @include('components.select', ['name' => "prices[$key][tax_id]", 'value' => $price['tax_id'] ?? null, 'list' => $taxes ?? null, 'required' => true, 'class' => 'form-control-sm']) +
+ +
+ {{ Form::label('price', 'Prix HT') }} + @include('components.money', ['name' => "prices[$key][price]", 'value' => $price['price'] ?? 0, 'required' => true, 'class' => 'form-control-sm price-item']) +
+ +
+ {{ Form::label('price_taxed', 'Prix TTC') }} + @include('components.money', ['name' => "prices[$key][price_taxed]", 'value' => $price['price_taxed'] ?? 0, 'required' => true, 'class' => 'form-control-sm price-taxed-item']) +
+ +
+
+ +
+ +
+ +
+ +
+
\ No newline at end of file diff --git a/resources/views/Shop/Admin/PriceGenerics/partials/block_price_new.blade.php b/resources/views/Shop/Admin/PriceGenerics/partials/block_price_new.blade.php new file mode 100644 index 00000000..a109880e --- /dev/null +++ b/resources/views/Shop/Admin/PriceGenerics/partials/block_price_new.blade.php @@ -0,0 +1,43 @@ +
+ + + +
+
+ +
+ +
+ {{ Form::label('quantity', 'Quantité') }}
+ @include('components.number', ['name' => 'prices[0][quantity]', 'value' => $quantity ?? 1, 'required' => true, 'class' => 'form-control-sm']) +
+ + +
+ {{ Form::label('tax_id', 'TVA') }}
+ @include('components.select', ['name' => 'prices[0][tax_id]', 'value' => $tax_id ?? null, 'list' => $taxes ?? null, 'required' => true, 'class' => 'form-control-sm']) +
+ +
+ {{ Form::label('price', 'Prix HT') }} + @include('components.money', ['name' => 'prices[0][price]', 'value' => $price ?? 0, 'required' => true, 'class' => 'form-control-sm price-item']) +
+ +
+ {{ Form::label('price_taxed', 'Prix TTC') }} + @include('components.money', ['name' => 'prices[0][price_taxed]', 'value' => $price_taxed ?? 0, 'required' => true, 'class' => 'form-control-sm price-taxed-item']) +
+ +
+
+ +
+ +
+ +
+ +
+
\ No newline at end of file diff --git a/resources/views/Shop/Admin/PriceGenerics/partials/list-prices.blade.php b/resources/views/Shop/Admin/PriceGenerics/partials/list-prices.blade.php new file mode 100644 index 00000000..59209886 --- /dev/null +++ b/resources/views/Shop/Admin/PriceGenerics/partials/list-prices.blade.php @@ -0,0 +1,16 @@ +@if (isset($prices) && (count($prices))) + @for ($i = 0; $i < count($prices); $i++) + @include('Shop.Admin.PriceGenerics.partials.block_price', ['key' => $i, 'price' => $prices[$i]]) + @endfor +@endif + +@push('js') + +@endpush + diff --git a/resources/views/Shop/Admin/PriceGenerics/partials/prices.blade.php b/resources/views/Shop/Admin/PriceGenerics/partials/prices.blade.php new file mode 100644 index 00000000..01f6a524 --- /dev/null +++ b/resources/views/Shop/Admin/PriceGenerics/partials/prices.blade.php @@ -0,0 +1,67 @@ +@include('Shop.Admin.PriceGenerics.partials.block_price_new') + +
+ @include('Shop.Admin.PriceGenerics.partials.list-prices') +
+ + + +@push('js') + +@endpush diff --git a/resources/views/Shop/Admin/ArticlePriceGenerics/show.blade.php b/resources/views/Shop/Admin/PriceGenerics/show.blade.php similarity index 100% rename from resources/views/Shop/Admin/ArticlePriceGenerics/show.blade.php rename to resources/views/Shop/Admin/PriceGenerics/show.blade.php diff --git a/routes/Shop/Admin/ArticlePriceGenerics.php b/routes/Shop/Admin/ArticlePriceGenerics.php deleted file mode 100644 index d64d0c0e..00000000 --- a/routes/Shop/Admin/ArticlePriceGenerics.php +++ /dev/null @@ -1,12 +0,0 @@ -name('ArticlePriceGenerics.')->group(function () { - Route::get('', 'ArticlePriceGenericController@index')->name('index'); - Route::get('create', 'ArticlePriceGenericController@create')->name('create'); - Route::delete('destroy', 'ArticlePriceGenericController@destroy')->name('destroy'); - Route::post('update', 'ArticlePriceGenericController@update')->name('update'); - Route::post('store', 'ArticlePriceGenericController@store')->name('store'); - Route::get('edit/{id}', 'ArticlePriceGenericController@edit')->name('edit'); - -}); - diff --git a/routes/Shop/Admin/PriceGenerics.php b/routes/Shop/Admin/PriceGenerics.php new file mode 100644 index 00000000..d1abe878 --- /dev/null +++ b/routes/Shop/Admin/PriceGenerics.php @@ -0,0 +1,12 @@ +name('PriceGenerics.')->group(function () { + Route::get('', 'PriceGenericController@index')->name('index'); + Route::get('create', 'PriceGenericController@create')->name('create'); + Route::delete('destroy', 'PriceGenericController@destroy')->name('destroy'); + Route::post('update', 'PriceGenericController@update')->name('update'); + Route::post('store', 'PriceGenericController@store')->name('store'); + Route::get('edit/{id}', 'PriceGenericController@edit')->name('edit'); + +}); + diff --git a/routes/Shop/Admin/route.php b/routes/Shop/Admin/route.php index afc95212..77a3fc2a 100644 --- a/routes/Shop/Admin/route.php +++ b/routes/Shop/Admin/route.php @@ -2,22 +2,21 @@ Route::middleware('auth')->prefix('Admin')->namespace('Admin')->name('Admin.')->group(function () { Route::get('dashboard', 'DashboardController@index')->name('dashboard'); - include( __DIR__ . '/ArticleAttributeFamilies.php'); - include( __DIR__ . '/ArticleAttributeValues.php'); - include( __DIR__ . '/ArticleAttributes.php'); - include( __DIR__ . '/ArticleFamilies.php'); - include( __DIR__ . '/ArticlePriceGenerics.php'); - include( __DIR__ . '/ArticlePrices.php'); - include( __DIR__ . '/Articles.php'); - include( __DIR__ . '/Categories.php'); - include( __DIR__ . '/Customers.php'); - include( __DIR__ . '/Inventories.php'); - include( __DIR__ . '/InventoryPlaces.php'); - include( __DIR__ . '/InvoiceItems.php'); - include( __DIR__ . '/Invoices.php'); - include( __DIR__ . '/OrderPayments.php'); - include( __DIR__ . '/Orders.php'); - include( __DIR__ . '/Tags.php'); - include( __DIR__ . '/TagGroups.php'); - + include __DIR__ . '/ArticleAttributeFamilies.php'; + include __DIR__ . '/ArticleAttributeValues.php'; + include __DIR__ . '/ArticleAttributes.php'; + include __DIR__ . '/ArticleFamilies.php'; + include __DIR__ . '/ArticlePrices.php'; + include __DIR__ . '/Articles.php'; + include __DIR__ . '/Categories.php'; + include __DIR__ . '/Customers.php'; + include __DIR__ . '/Inventories.php'; + include __DIR__ . '/InventoryPlaces.php'; + include __DIR__ . '/InvoiceItems.php'; + include __DIR__ . '/Invoices.php'; + include __DIR__ . '/OrderPayments.php'; + include __DIR__ . '/Orders.php'; + include __DIR__ . '/PriceGenerics.php'; + include __DIR__ . '/Tags.php'; + include __DIR__ . '/TagGroups.php'; });