diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json index 06aef84..b4a5d48 100644 --- a/Admin/Install/Navigation.install.json +++ b/Admin/Install/Navigation.install.json @@ -15,7 +15,7 @@ "children": [ { "id": 1001002001, - "pid": "/", + "pid": "/businessexpenses/expense", "type": 3, "subtype": 1, "name": "List", @@ -31,14 +31,14 @@ }, { "id": 1001002002, - "pid": "/", + "pid": "/businessexpenses/expense", "type": 3, "subtype": 1, "name": "Create", "uri": "{/base}/businessexpenses/expense/create", "target": "self", "icon": null, - "order": 40, + "order": 45, "from": "BusinessExpenses", "permission": { "permission": 2, "type": null, "element": null }, "parent": 1001001001, @@ -63,14 +63,14 @@ "children": [ { "id": 1001004001, - "pid": "/", + "pid": "/businessexpenses", "type": 3, "subtype": 1, "name": "List", "uri": "{/base}/businessexpenses/expense/list", "target": "self", "icon": null, - "order": 40, + "order": 1, "from": "BusinessExpenses", "permission": { "permission": 2, "type": null, "element": null }, "parent": 1001003001, @@ -79,19 +79,35 @@ }, { "id": 1001004002, - "pid": "/", + "pid": "/businessexpenses", "type": 3, "subtype": 1, "name": "Create", "uri": "{/base}/businessexpenses/expense/create", "target": "self", "icon": null, - "order": 40, + "order": 5, "from": "BusinessExpenses", "permission": { "permission": 2, "type": null, "element": null }, "parent": 1001003001, "children": [ ] + }, + { + "id": 1001004003, + "pid": "/businessexpenses", + "type": 3, + "subtype": 1, + "name": "Types", + "uri": "{/base}/businessexpenses/type/list", + "target": "self", + "icon": null, + "order": 10, + "from": "BusinessExpenses", + "permission": { "permission": 2, "type": null, "element": null }, + "parent": 1001003001, + "children": [], + "status": 3 } ] } diff --git a/Admin/Install/elementtypes.json b/Admin/Install/elementtypes.json index 697e366..41427d3 100644 --- a/Admin/Install/elementtypes.json +++ b/Admin/Install/elementtypes.json @@ -6,6 +6,13 @@ "de": "Kraftstoff" } }, + { + "name": "parking", + "l11n": { + "en": "Parking", + "de": "Parken" + } + }, { "name": "entertainment", "l11n": { @@ -54,6 +61,13 @@ "en": "Present", "de": "Geschenk" } + }, + { + "name": "postage", + "l11n": { + "en": "Postage", + "de": "Porto" + } }, { "name": "other", diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 9c2d70e..e9e6be6 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -374,6 +374,8 @@ final class ApiController extends Controller $expense->type = new NullBaseStringL11nType((int) $request->getDataInt('type')); $expense->status = ExpenseStatus::tryFromValue($request->getDataInt('status')) ?? ExpenseStatus::DRAFT; $expense->description = $request->getDataString('description') ?? ''; + $expense->start = $request->getDataDateTime('start') ?? $expense->start; + $expense->end = $request->getDataDateTime('end') ?? $expense->end; $country = $request->getDataString('country') ?? ''; if (empty($country)) { diff --git a/Controller/BackendController.php b/Controller/BackendController.php index f101acc..fe32274 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -14,6 +14,8 @@ declare(strict_types=1); namespace Modules\BusinessExpenses\Controller; +use Modules\BusinessExpenses\Models\ExpenseElementMapper; +use Modules\BusinessExpenses\Models\ExpenseElementTypeMapper; use Modules\BusinessExpenses\Models\ExpenseMapper; use Modules\BusinessExpenses\Models\ExpenseTypeMapper; use phpOMS\Contract\RenderableInterface; @@ -86,6 +88,7 @@ final class BackendController extends Controller ->with('elements/type') ->with('elements/type/l11n') ->where('id', (int) $request->getData('id')) + ->where('elements/type/l11n/language', $response->header->l11n->language) ->execute(); $view->data['expense-notes'] = new \Modules\Editor\Theme\Backend\Components\Compound\BaseView($this->app->l11nManager, $request, $response); @@ -93,6 +96,41 @@ final class BackendController extends Controller return $view; } + /** + * Routing end-point for application behavior. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return RenderableInterface Returns a renderable object + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewBusinessExpensesElement(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + { + $view = new View($this->app->l11nManager, $request, $response); + + $view->setTemplate('/Modules/BusinessExpenses/Theme/Backend/element-view'); + $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1001001001, $request, $response); + + $view->data['element'] = ExpenseElementMapper::get() + ->with('notes') + ->where('id', (int) $request->getData('id')) + ->execute(); + + $view->data['types'] = ExpenseElementTypeMapper::getAll() + ->with('l11n') + ->where('l11n/language', $response->header->l11n->language) + ->executeGetArray(); + + $view->data['expense-notes'] = new \Modules\Editor\Theme\Backend\Components\Compound\BaseView($this->app->l11nManager, $request, $response); + $view->data['media-upload'] = new \Modules\Media\Theme\Backend\Components\Upload\BaseView($this->app->l11nManager, $request, $response); + + return $view; + } + /** * Routing end-point for application behavior. * @@ -121,7 +159,32 @@ final class BackendController extends Controller ->where('id', (int) $request->getData('id')) ->execute(); - $view->data['expense-notes'] = new \Modules\Editor\Theme\Backend\Components\Compound\BaseView($this->app->l11nManager, $request, $response); + return $view; + } + + /** + * Routing end-point for application behavior. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return RenderableInterface Returns a renderable object + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewBusinessExpensesElementCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + { + $view = new View($this->app->l11nManager, $request, $response); + + $view->setTemplate('/Modules/BusinessExpenses/Theme/Backend/element-view'); + $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1001001001, $request, $response); + + $view->data['types'] = ExpenseElementTypeMapper::getAll() + ->with('l11n') + ->where('l11n/language', $response->header->l11n->language) + ->executeGetArray(); return $view; } diff --git a/Theme/Backend/Lang/Navigation.ar.lang.php b/Theme/Backend/Lang/Navigation.ar.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.ar.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.cs.lang.php b/Theme/Backend/Lang/Navigation.cs.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.cs.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.da.lang.php b/Theme/Backend/Lang/Navigation.da.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.da.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.el.lang.php b/Theme/Backend/Lang/Navigation.el.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.el.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.es.lang.php b/Theme/Backend/Lang/Navigation.es.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.es.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.fi.lang.php b/Theme/Backend/Lang/Navigation.fi.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.fi.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.fr.lang.php b/Theme/Backend/Lang/Navigation.fr.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.fr.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.hu.lang.php b/Theme/Backend/Lang/Navigation.hu.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.hu.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.it.lang.php b/Theme/Backend/Lang/Navigation.it.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.it.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.ja.lang.php b/Theme/Backend/Lang/Navigation.ja.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.ja.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.ko.lang.php b/Theme/Backend/Lang/Navigation.ko.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.ko.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.no.lang.php b/Theme/Backend/Lang/Navigation.no.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.no.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.pl.lang.php b/Theme/Backend/Lang/Navigation.pl.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.pl.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.pt.lang.php b/Theme/Backend/Lang/Navigation.pt.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.pt.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.ru.lang.php b/Theme/Backend/Lang/Navigation.ru.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.ru.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.sv.lang.php b/Theme/Backend/Lang/Navigation.sv.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.sv.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.th.lang.php b/Theme/Backend/Lang/Navigation.th.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.th.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.tr.lang.php b/Theme/Backend/Lang/Navigation.tr.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.tr.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.uk.lang.php b/Theme/Backend/Lang/Navigation.uk.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.uk.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/Navigation.zh.lang.php b/Theme/Backend/Lang/Navigation.zh.lang.php deleted file mode 100644 index e4658b0..0000000 --- a/Theme/Backend/Lang/Navigation.zh.lang.php +++ /dev/null @@ -1,17 +0,0 @@ - [ - 'BusinessExpenses' => '', -]]; diff --git a/Theme/Backend/Lang/de.lang.php b/Theme/Backend/Lang/de.lang.php index 53e1a0a..563c927 100644 --- a/Theme/Backend/Lang/de.lang.php +++ b/Theme/Backend/Lang/de.lang.php @@ -21,17 +21,22 @@ return ['BusinessExpenses' => [ 'CreatedAt' => 'Erstellt', 'Description' => 'Beschreibung', 'End' => 'Ende', + 'Element' => 'Element', 'Expenses' => 'Kosten', 'From' => 'Von', 'Gross' => 'Brutto', + 'Back' => 'Zurück', + 'Files' => 'Dateien', 'Net' => 'Netto', 'Notes' => 'Notizen', 'Paid' => 'Bezahlt', 'Report' => 'Bericht', + 'Total' => 'Gesamt', 'Start' => 'Start', 'Status' => 'Status', 'Overview' => 'Übersicht', 'Clocking' => 'Zeiterfassung', 'Type' => 'Typ', + 'Costs' => 'Kosten', 'Upload' => 'Hochladen', ]]; diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index 07b9ca4..904e57b 100644 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -21,17 +21,22 @@ return ['BusinessExpenses' => [ 'CreatedAt' => 'Created At', 'Description' => 'Description', 'End' => 'End', + 'Element' => 'Element', 'Expenses' => 'Expenses', 'From' => 'From', 'Gross' => 'Gross', + 'Files' => 'Files', + 'Back' => 'Back', 'Net' => 'Net', 'Notes' => 'Notes', 'Paid' => 'Paid', 'Report' => 'Report', + 'Total' => 'Total', 'Start' => 'Start', 'Status' => 'Status', 'Overview' => 'Overview', 'Clocking' => 'Clocking', 'Type' => 'Type', + 'Costs' => 'Costs', 'Upload' => 'Upload', ]]; diff --git a/Theme/Backend/element-view.tpl.php b/Theme/Backend/element-view.tpl.php new file mode 100644 index 0000000..8e24a76 --- /dev/null +++ b/Theme/Backend/element-view.tpl.php @@ -0,0 +1,108 @@ +data['element'] ?? new NullExpense(); +$isNew = $element->id === 0; + +echo $this->data['nav']->render(); ?> +
| - | = $this->getHtml('ID', '0', '0'); ?> - - - | = $this->getHtml('Start'); ?> | = $this->getHtml('End'); ?> | = $this->getHtml('Type'); ?> + | = $this->getHtml('Costs'); ?> |
| - | = $element->id; ?> - | = $element->start->format('Y-m-d H:i'); ?> - | = $element->end?->format('Y-m-d H:i'); ?> - | = $this->printHtml($element->type->l11n); ?> - + | |
| = $element->start->format('Y-m-d H:i'); ?> + | = $element->end?->format('Y-m-d H:i'); ?> + | = $this->printHtml($element->type->l11n); ?> + | = $this->getCurrency($element->gross, symbol: ''); ?> + add($element->gross->value); + $costs['week']->add($element->gross->value); + $costs['day']->add($element->gross->value); + + $element = \next($elements); + if ($element === false) { + $element = new NullExpenseElement(); + } + + // Required to handle multiple elements in one day + if ($element->id !== 0 && $element->start->format('Y-m-d') === $current->format('Y-m-d')) { + $current->smartModify(0, 0, -1); + } + ?> + + | ||
| = $current->format('Y-m-d'); ?> + | + + + | ||||
| = $this->getHtml('Total'); ?> + | = $costs['total']->getAmount(); ?> | ||||