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(); ?> +
+ +
+ +
+ +
+ request->uri->fragment === 'c-tab-1' ? ' checked' : ''; ?>> +
+
+
+ + + +
+
+
getHtml('Element'); ?>
+
+
+ + +
+ +
+ + +
+ +
+ +
printHtml($element->description); ?>
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ + + + + +
+
+
+
+
+
+ + + +
+
+ data['media-upload']->render('item-file', 'files', '', $element->files); ?> +
+
+ +
+
diff --git a/Theme/Backend/expense-view.tpl.php b/Theme/Backend/expense-view.tpl.php index 51271ac..558eb69 100644 --- a/Theme/Backend/expense-view.tpl.php +++ b/Theme/Backend/expense-view.tpl.php @@ -14,14 +14,20 @@ declare(strict_types=1); use Modules\BusinessExpenses\Models\NullExpense; +use Modules\BusinessExpenses\Models\NullExpenseElement; +use phpOMS\Stdlib\Base\FloatInt; +use phpOMS\Stdlib\Base\SmartDateTime; use phpOMS\Uri\UriFactory; /** @var \phpOMS\Views\View $this */ -$expense = $this->getData('expense') ?? new NullExpense(); +$expense = $this->data['expense'] ?? new NullExpense(); $sessions = $this->data['sessions'] ?? []; +$isNew = $expense->id === 0; + echo $this->data['nav']->render(); ?>
+
+
- request->uri->fragment === 'c-tab-1' ? ' checked' : ''; ?>> + request->uri->fragment === 'c-tab-1' ? ' checked' : ''; ?>>
@@ -64,6 +71,7 @@ echo $this->data['nav']->render(); ?>
+
getHtml('Report'); ?>
@@ -88,15 +96,23 @@ echo $this->data['nav']->render(); ?>
- +
-
+
+ + + + + +
+
+ request->uri->fragment === 'c-tab-2' ? ' checked' : ''; ?>>
data['expense-notes']->render('expense-notes', '', $expense->notes); ?> @@ -104,6 +120,23 @@ echo $this->data['nav']->render(); ?> request->uri->fragment === 'c-tab-3' ? ' checked' : ''; ?>>
+ new FloatInt(), + 'week' => new FloatInt(), + 'day' => new FloatInt(), + ]; + + $elements = $expense->elements; + + $current = SmartDateTime::createFromDateTime($expense->start); + $current->smartModify(0, 0, -1); + + $end = clone $expense->end; + $element = empty($elements) + ? new NullExpenseElement() + : \reset($elements); + ?>
@@ -119,33 +152,47 @@ echo $this->data['nav']->render(); ?> - - elements as $element) : + format('Y-m-d') !== $end->format('Y-m-d')) : + $current->smartModify(0, 0, 1); + + if ($element->id !== 0 && $element->start->format('Y-m-d') === $current->format('Y-m-d')) : $url = UriFactory::build('{/base}/businessexpenses/expense/element/view?{?}&id=' . $element->id); ?> - - + + +
- getHtml('ID', '0', '0'); ?> - - - getHtml('Start'); ?> getHtml('End'); ?> getHtml('Type'); ?> + getHtml('Costs'); ?>
- id; ?> - start->format('Y-m-d H:i'); ?> - end?->format('Y-m-d H:i'); ?> - printHtml($element->type->l11n); ?> - +
start->format('Y-m-d H:i'); ?> + end?->format('Y-m-d H:i'); ?> + printHtml($element->type->l11n); ?> + 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); + } + ?> + +
format('Y-m-d'); ?> + + + +
getHtml('Total'); ?> + getAmount(); ?>
@@ -275,10 +322,10 @@ echo $this->data['nav']->render(); ?> format('Y/m/d'); ?> - format('Y/m/d'); ?> h m createModify(0, 0, -7); - $busy['week'] = 0; - endif; + $endWeek = $startWeek; + $startWeek = $startWeek->createModify(0, 0, -7); + $busy['week'] = 0; + endif; ?> busy; @@ -289,10 +336,10 @@ echo $this->data['nav']->render(); ?> format('Y/m/d'); ?> - format('Y/m/d'); ?> h m createModify(0, -1, 0); - $busy['month'] = 0; - endif; + $endMonth = $startMonth; + $startMonth = $startMonth->createModify(0, -1, 0); + $busy['month'] = 0; + endif; ?> @@ -304,5 +351,6 @@ echo $this->data['nav']->render(); ?>
+
\ No newline at end of file