From 655d816bf8ab12f8ed2a6339715db5fdaef2dddd Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 2 Jan 2024 23:34:17 +0000 Subject: [PATCH] update --- Admin/Hooks/Web/Api.php | 22 ++++ Admin/Install/ClientManagement.php | 43 +++++++ Admin/Install/Coa/skr03_balance_ifrs.json | 0 .../Coa/skr03_pl_de_gaap_totalcost.json | 2 +- Admin/Install/Navigation.install.json | 33 ++++- Admin/Install/SupplierManagement.php | 43 +++++++ Admin/Install/db.json | 14 +++ Admin/Installer.php | 41 ++++++- Admin/Routes/Web/Backend.php | 100 +++++++++++++++ Controller/ApiController.php | 75 +++++++++-- Controller/BackendController.php | 112 +++++++++++++---- Docs/Dev/img/er.png | Bin 0 -> 23724 bytes Models/AccountAbstract.php | 18 +++ Models/Balance.php | 90 -------------- Models/BalanceL11n.php | 116 ------------------ Models/CostCenter.php | 59 +++++++-- Models/CostCenterL11n.php | 116 ------------------ Models/CostCenterL11nMapper.php | 13 +- Models/CostCenterMapper.php | 3 +- Models/CostObject.php | 59 +++++++-- Models/CostObjectL11n.php | 116 ------------------ Models/CostObjectL11nMapper.php | 13 +- Models/CostObjectMapper.php | 3 +- Models/PermissionCategory.php | 6 +- Theme/Backend/Lang/de.lang.php | 1 + Theme/Backend/Lang/en.lang.php | 1 + Theme/Backend/coa-list.tpl.php | 8 +- Theme/Backend/costcenter-list.tpl.php | 6 +- Theme/Backend/costobject-list.tpl.php | 6 +- Theme/Backend/entries.tpl.php | 111 ++++++++++------- .../Backend/personal-list.tpl.php | 0 info.json | 5 +- 32 files changed, 675 insertions(+), 560 deletions(-) create mode 100644 Admin/Hooks/Web/Api.php create mode 100644 Admin/Install/ClientManagement.php delete mode 100644 Admin/Install/Coa/skr03_balance_ifrs.json create mode 100644 Admin/Install/SupplierManagement.php create mode 100644 Docs/Dev/img/er.png delete mode 100755 Models/Balance.php delete mode 100755 Models/BalanceL11n.php delete mode 100755 Models/CostCenterL11n.php delete mode 100755 Models/CostObjectL11n.php rename Admin/Install/Coa/skr03_balance_de_gaap.json => Theme/Backend/personal-list.tpl.php (100%) diff --git a/Admin/Hooks/Web/Api.php b/Admin/Hooks/Web/Api.php new file mode 100644 index 0000000..0e4175d --- /dev/null +++ b/Admin/Hooks/Web/Api.php @@ -0,0 +1,22 @@ + [ + 'callback' => ['\Modules\Accounting\Controller\ApiController:hookPersonalAccountCreate'], + ], + 'POST:Module:SupplierManagement-supplier-create' => [ + 'callback' => ['\Modules\Accounting\Controller\ApiController:hookPersonalAccountCreate'], + ], +]; diff --git a/Admin/Install/ClientManagement.php b/Admin/Install/ClientManagement.php new file mode 100644 index 0000000..e670d94 --- /dev/null +++ b/Admin/Install/ClientManagement.php @@ -0,0 +1,43 @@ +id; + $account = \is_array($responseData['response']) + ? $responseData['response'] + : $responseData['response']->toArray(); + + $accountId = $account['id']; for ($i = 1; $i < $languages; ++$i) { $response = new HttpResponse(); @@ -115,4 +120,38 @@ final class Installer extends InstallerAbstract \fclose($fp); } + + /** + * Import accounts + * + * @param ApplicationAbstract $app Application + * @param string $type Personal account type + * + * @return void + * + * @since 1.0.0 + */ + public static function importPersonalAccounts(ApplicationAbstract $app, string $type) : void + { + /** @var \Modules\Accounting\Controller\ApiController $module */ + $module = $app->moduleManager->getModuleInstance('Accounting', 'Api'); + + $mapper = $type === 'client' + ? \Modules\ClientManagement\Models\ClientMapper::class + : \Modules\SupplierManagement\Models\SupplierMapper::class; + + foreach ($mapper::yield() as $person) { + $response = new HttpResponse(); + $request = new HttpRequest(new HttpUri('')); + + // @todo define default account number format for clients, if number -> consider number as starting value + // @todo define default account number format for suppliers, if number -> consider number as starting value + + $request->header->account = 1; + $request->setData('account', $person->number); + $request->setData('content', \rtrim($person->account->name1 . ' ' . $person->account->name2)); + $request->setData('language', ISO639x1Enum::_EN); + $module->apiAccountCreate($request, $response); + } + } } diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index 3d68af2..c6fbb8a 100755 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -117,6 +117,17 @@ return [ ], ], ], + '^.*/accounting/coa/profile.*$' => [ + [ + 'dest' => '\Modules\Accounting\Controller\BackendController:viewAccountProfile', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::ACCOUNT, + ], + ], + ], '^.*/accounting/coa/list.*$' => [ [ 'dest' => '\Modules\Accounting\Controller\BackendController:viewCOAList', @@ -217,4 +228,93 @@ return [ ], ], ], + '^.*/accounting/costcenter/profile.*$' => [ + [ + 'dest' => '\Modules\Accounting\Controller\BackendController:viewCostCenterProfile', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::COST_CENTER, + ], + ], + ], + '^.*/accounting/costobject/profile.*$' => [ + [ + 'dest' => '\Modules\Accounting\Controller\BackendController:viewCostObjectProfile', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::COST_OBJECT, + ], + ], + ], + + '^.*/accounting/supplier/list.*$' => [ + [ + 'dest' => '\Modules\Accounting\Controller\BackendController:viewSupplierList', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::SUPPLIER, + ], + ], + ], + '^.*/accounting/client/list.*$' => [ + [ + 'dest' => '\Modules\Accounting\Controller\BackendController:viewClientList', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::CLIENT, + ], + ], + ], + '^.*/accounting/supplier/profile.*$' => [ + [ + 'dest' => '\Modules\Accounting\Controller\BackendController:viewSupplierProfile', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::SUPPLIER, + ], + ], + ], + '^.*/accounting/client/profile.*$' => [ + [ + 'dest' => '\Modules\Accounting\Controller\BackendController:viewClientProfile', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::CLIENT, + ], + ], + ], + '^.*/accounting/supplier/entries.*$' => [ + [ + 'dest' => '\Modules\Accounting\Controller\BackendController:viewSupplierProfile', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::SUPPLIER, + ], + ], + ], + '^.*/accounting/client/entries.*$' => [ + [ + 'dest' => '\Modules\Accounting\Controller\BackendController:viewClientProfile', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::CLIENT, + ], + ], + ], ]; diff --git a/Controller/ApiController.php b/Controller/ApiController.php index aef3cad..f4b1203 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -17,6 +17,10 @@ namespace Modules\Accounting\Controller; use Modules\Accounting\Models\AccountAbstract; use Modules\Accounting\Models\AccountAbstractMapper; use Modules\Accounting\Models\AccountL11nMapper; +use Modules\Accounting\Models\CostCenter; +use Modules\Accounting\Models\CostCenterMapper; +use Modules\Accounting\Models\CostObject; +use Modules\Accounting\Models\CostObjectMapper; use phpOMS\Localization\BaseStringL11n; use phpOMS\Localization\ISO639x1Enum; use phpOMS\Message\Http\RequestStatusCode; @@ -36,6 +40,11 @@ use phpOMS\Model\Message\FormValidation; */ final class ApiController extends Controller { + public function hookPersonalAccountCreate(...$data) + { + \var_dump($data); + } + /** * Api method to create an account * @@ -124,9 +133,9 @@ final class ApiController extends Controller return; } - $contractTypeL11n = $this->createAccountL11nFromRequest($request); - $this->createModel($request->header->account, $contractTypeL11n, AccountL11nMapper::class, 'contract_type_l11n', $request->getOrigin()); - $this->createStandardCreateResponse($request, $response, $contractTypeL11n); + $accountL11n = $this->createAccountL11nFromRequest($request); + $this->createModel($request->header->account, $accountL11n, AccountL11nMapper::class, 'account_l11n', $request->getOrigin()); + $this->createStandardCreateResponse($request, $response, $accountL11n); } /** @@ -140,14 +149,14 @@ final class ApiController extends Controller */ private function createAccountL11nFromRequest(RequestAbstract $request) : BaseStringL11n { - $contractTypeL11n = new BaseStringL11n(); - $contractTypeL11n->ref = $request->getDataInt('ref') ?? 0; - $contractTypeL11n->setLanguage( + $accountL11n = new BaseStringL11n(); + $accountL11n->ref = $request->getDataInt('ref') ?? 0; + $accountL11n->setLanguage( $request->getDataString('language') ?? $request->header->l11n->language ); - $contractTypeL11n->content = $request->getDataString('content') ?? ''; + $accountL11n->content = $request->getDataString('content') ?? ''; - return $contractTypeL11n; + return $accountL11n; } /** @@ -235,6 +244,10 @@ final class ApiController extends Controller return; } + + $costcenter = $this->createCostCenterFromRequest($request); + $this->createModel($request->header->account, $costcenter, CostCenterMapper::class, 'costcenter', $request->getOrigin()); + $this->createStandardCreateResponse($request, $response, $costcenter); } /** @@ -249,7 +262,7 @@ final class ApiController extends Controller private function validateCostCenterCreate(RequestAbstract $request) : array { $val = []; - if (($val['name'] = !$request->hasData('name')) + if (($val['code'] = !$request->hasData('code')) ) { return $val; } @@ -257,6 +270,25 @@ final class ApiController extends Controller return []; } + /** + * Method to create costcenter from request. + * + * @param RequestAbstract $request Request + * + * @return CostCenter + * + * @since 1.0.0 + */ + private function createCostCenterFromRequest(RequestAbstract $request) : CostCenter + { + $costcenter = new CostCenter(); + $costcenter->code = $request->getDataString('code') ?? ''; + $costcenter->setL11n($request->getDataString('content') ?? '', $request->getDataString('language') ?? ISO639x1Enum::_EN); + $costcenter->unit = $request->getDataInt('unit') ?? 1; + + return $costcenter; + } + /** * Api method to update an cost center * @@ -321,6 +353,29 @@ final class ApiController extends Controller return; } + + $costobject = $this->createCostObjectFromRequest($request); + $this->createModel($request->header->account, $costobject, CostObjectMapper::class, 'costobject', $request->getOrigin()); + $this->createStandardCreateResponse($request, $response, $costobject); + } + + /** + * Method to create costobject from request. + * + * @param RequestAbstract $request Request + * + * @return CostObject + * + * @since 1.0.0 + */ + private function createCostObjectFromRequest(RequestAbstract $request) : CostObject + { + $costobject = new CostObject(); + $costobject->code = $request->getDataString('code') ?? ''; + $costobject->setL11n($request->getDataString('content') ?? '', $request->getDataString('language') ?? ISO639x1Enum::_EN); + $costobject->unit = $request->getDataInt('unit') ?? 1; + + return $costobject; } /** @@ -335,7 +390,7 @@ final class ApiController extends Controller private function validateCostObjectCreate(RequestAbstract $request) : array { $val = []; - if (($val['name'] = !$request->hasData('name')) + if (($val['code'] = !$request->hasData('code')) ) { return $val; } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index c48b27c..755a61f 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -17,6 +17,8 @@ namespace Modules\Accounting\Controller; use Modules\Accounting\Models\AccountAbstractMapper; use Modules\Accounting\Models\CostCenterMapper; use Modules\Accounting\Models\CostObjectMapper; +use Modules\ClientManagement\Models\ClientMapper; +use Modules\SupplierManagement\Models\SupplierMapper; use phpOMS\Contract\RenderableInterface; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; @@ -34,7 +36,7 @@ use phpOMS\Views\View; final class BackendController extends Controller { /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -55,7 +57,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -76,7 +78,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -97,7 +99,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -118,7 +120,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -139,7 +141,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -160,7 +162,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -181,7 +183,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -207,7 +209,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -228,7 +230,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -249,7 +251,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -270,7 +272,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -291,7 +293,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -312,7 +314,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -329,19 +331,27 @@ final class BackendController extends Controller $view->setTemplate('/Modules/Accounting/Theme/Backend/costcenter-list'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1002602001, $request, $response); + $mapper = CostCenterMapper::getAll() + ->with('l11n') + ->where('l11n/language', $response->header->l11n->language) + ->limit(25); + if ($request->getData('ptype') === 'p') { - $view->data['costcenter'] = CostCenterMapper::getAll()->where('id', $request->getDataInt('id') ?? 0, '<')->limit(25)->execute(); + $view->data['costcenter'] = $mapper->where('id', $request->getDataInt('id') ?? 0, '<') + ->execute(); } elseif ($request->getData('ptype') === 'n') { - $view->data['costcenter'] = CostCenterMapper::getAll()->where('id', $request->getDataInt('id') ?? 0, '>')->limit(25)->execute(); + $view->data['costcenter'] = $mapper->where('id', $request->getDataInt('id') ?? 0, '>') + ->execute(); } else { - $view->data['costcenter'] = CostCenterMapper::getAll()->where('id', 0, '>')->limit(25)->execute(); + $view->data['costcenter'] = $mapper->where('id', 0, '>') + ->execute(); } return $view; } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -358,14 +368,74 @@ final class BackendController extends Controller $view->setTemplate('/Modules/Accounting/Theme/Backend/costobject-list'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1002603001, $request, $response); + $mapper = CostObjectMapper::getAll() + ->with('l11n') + ->where('l11n/language', $response->header->l11n->language) + ->limit(25); + if ($request->getData('ptype') === 'p') { - $view->data['costobject'] = CostObjectMapper::getAll()->where('id', $request->getDataInt('id') ?? 0, '<')->limit(25)->execute(); + $view->data['costobject'] = $mapper->where('id', $request->getDataInt('id') ?? 0, '<') + ->execute(); } elseif ($request->getData('ptype') === 'n') { - $view->data['costobject'] = CostObjectMapper::getAll()->where('id', $request->getDataInt('id') ?? 0, '>')->limit(25)->execute(); + $view->data['costobject'] = $mapper->where('id', $request->getDataInt('id') ?? 0, '>') + ->execute(); } else { - $view->data['costobject'] = CostObjectMapper::getAll()->where('id', 0, '>')->limit(25)->execute(); + $view->data['costobject'] = $mapper->where('id', 0, '>') + ->execute(); } return $view; } + + /** + * Routing end-point for application behavior. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewSupplierList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + { + $view = new View($this->app->l11nManager, $request, $response); + $view->setTemplate('/Modules/Accounting/Theme/Backend/personal-list'); + $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1002604001, $request, $response); + + $accounts = SupplierMapper::getAll() + ->execute(); + + $view->data['accounts'] = $accounts; + + return $view; + } + + /** + * Routing end-point for application behavior. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewClientList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + { + $view = new View($this->app->l11nManager, $request, $response); + $view->setTemplate('/Modules/Accounting/Theme/Backend/personal-list'); + $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1002604001, $request, $response); + + $accounts = ClientMapper::getAll() + ->execute(); + + $view->data['accounts'] = $accounts; + + return $view; + } } diff --git a/Docs/Dev/img/er.png b/Docs/Dev/img/er.png new file mode 100644 index 0000000000000000000000000000000000000000..abb1a2b3f64d9d16567e6a5f7d7dd1e7cde445ac GIT binary patch literal 23724 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 v? $this->id, + ]; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() : mixed + { + return $this->toArray(); + } } diff --git a/Models/Balance.php b/Models/Balance.php deleted file mode 100755 index ad811a6..0000000 --- a/Models/Balance.php +++ /dev/null @@ -1,90 +0,0 @@ -l11n = new BalanceL11n(); - } - - /** - * Get balance id - * - * @return int - * - * @since 1.0.0 - */ - public function getId() : int - { - return $this->id; - } - - /** - * {@inheritdoc} - */ - public function toArray() : array - { - return [ - 'id' => $this->id, - ]; - } - - /** - * {@inheritdoc} - */ - public function jsonSerialize() : mixed - { - return $this->toArray(); - } -} diff --git a/Models/BalanceL11n.php b/Models/BalanceL11n.php deleted file mode 100755 index df056af..0000000 --- a/Models/BalanceL11n.php +++ /dev/null @@ -1,116 +0,0 @@ -language; - } - - /** - * Set language - * - * @param string $language Language - * - * @return void - * - * @since 1.0.0 - */ - public function setLanguage(string $language) : void - { - $this->language = $language; - } - - /** - * {@inheritdoc} - */ - public function toArray() : array - { - return [ - 'id' => $this->id, - 'name' => $this->name, - 'description' => $this->description, - 'balance' => $this->balance, - 'language' => $this->language, - ]; - } - - /** - * {@inheritdoc} - */ - public function jsonSerialize() : mixed - { - return $this->toArray(); - } -} diff --git a/Models/CostCenter.php b/Models/CostCenter.php index e310897..c96bb5b 100755 --- a/Models/CostCenter.php +++ b/Models/CostCenter.php @@ -14,6 +14,9 @@ declare(strict_types=1); namespace Modules\Accounting\Models; +use phpOMS\Localization\BaseStringL11n; +use phpOMS\Localization\ISO639x1Enum; + /** * Cost center class. * @@ -40,13 +43,13 @@ class CostCenter */ public string $code = ''; - /** - * Localization. + /* + * String l11n * - * @var CostCenterL11n + * @var string | BaseStringL11n * @since 1.0.0 */ - public CostCenterL11n $l11n; + public string | BaseStringL11n $l11n = ''; /** * Parent. @@ -56,15 +59,7 @@ class CostCenter */ public $parent = null; - /** - * Constructor. - * - * @since 1.0.0 - */ - public function __construct() - { - $this->l11n = new CostCenterL11n(); - } + public int $unit = 0; /** * Get balance id @@ -78,6 +73,44 @@ class CostCenter return $this->id; } + /** + * Set l11n + * + * @param string|BaseStringL11n $l11n Tag article l11n + * @param string $lang Language + * + * @return void + * + * @since 1.0.0 + */ + public function setL11n(string | BaseStringL11n $l11n, string $lang = ISO639x1Enum::_EN) : void + { + if ($l11n instanceof BaseStringL11n) { + $this->l11n = $l11n; + } elseif (isset($this->l11n) && $this->l11n instanceof BaseStringL11n) { + $this->l11n->content = $l11n; + $this->l11n->setLanguage($lang); + } else { + $this->l11n = new BaseStringL11n(); + $this->l11n->content = $l11n; + $this->l11n->setLanguage($lang); + } + } + + /** + * @return string + * + * @since 1.0.0 + */ + public function getL11n() : string + { + if (!isset($this->l11n)) { + return ''; + } + + return $this->l11n instanceof BaseStringL11n ? $this->l11n->content : $this->l11n; + } + /** * {@inheritdoc} */ diff --git a/Models/CostCenterL11n.php b/Models/CostCenterL11n.php deleted file mode 100755 index 6ec9c5a..0000000 --- a/Models/CostCenterL11n.php +++ /dev/null @@ -1,116 +0,0 @@ -language; - } - - /** - * Set language - * - * @param string $language Language - * - * @return void - * - * @since 1.0.0 - */ - public function setLanguage(string $language) : void - { - $this->language = $language; - } - - /** - * {@inheritdoc} - */ - public function toArray() : array - { - return [ - 'id' => $this->id, - 'name' => $this->name, - 'description' => $this->description, - 'costcenter' => $this->costcenter, - 'language' => $this->language, - ]; - } - - /** - * {@inheritdoc} - */ - public function jsonSerialize() : mixed - { - return $this->toArray(); - } -} diff --git a/Models/CostCenterL11nMapper.php b/Models/CostCenterL11nMapper.php index 60e5af2..635bc21 100755 --- a/Models/CostCenterL11nMapper.php +++ b/Models/CostCenterL11nMapper.php @@ -38,9 +38,8 @@ final class CostCenterL11nMapper extends DataMapperFactory */ public const COLUMNS = [ 'accounting_costcenter_l11n_id' => ['name' => 'accounting_costcenter_l11n_id', 'type' => 'int', 'internal' => 'id'], - 'accounting_costcenter_l11n_name' => ['name' => 'accounting_costcenter_l11n_name', 'type' => 'string', 'internal' => 'name', 'autocomplete' => true], - 'accounting_costcenter_l11n_description' => ['name' => 'accounting_costcenter_l11n_description', 'type' => 'string', 'internal' => 'description', 'autocomplete' => true], - 'accounting_costcenter_l11n_costcenter' => ['name' => 'accounting_costcenter_l11n_costcenter', 'type' => 'int', 'internal' => 'costcenter'], + 'accounting_costcenter_l11n_name' => ['name' => 'accounting_costcenter_l11n_name', 'type' => 'string', 'internal' => 'content', 'autocomplete' => true], + 'accounting_costcenter_l11n_costcenter' => ['name' => 'accounting_costcenter_l11n_costcenter', 'type' => 'int', 'internal' => 'ref'], 'accounting_costcenter_l11n_language' => ['name' => 'accounting_costcenter_l11n_language', 'type' => 'string', 'internal' => 'language'], ]; @@ -59,4 +58,12 @@ final class CostCenterL11nMapper extends DataMapperFactory * @since 1.0.0 */ public const PRIMARYFIELD = 'accounting_costcenter_l11n_id'; + + /** + * Model to use by the mapper. + * + * @var class-string + * @since 1.0.0 + */ + public const MODEL = BaseStringL11n::class; } diff --git a/Models/CostCenterMapper.php b/Models/CostCenterMapper.php index 09b215b..7e42f7c 100755 --- a/Models/CostCenterMapper.php +++ b/Models/CostCenterMapper.php @@ -38,6 +38,7 @@ final class CostCenterMapper extends DataMapperFactory public const COLUMNS = [ 'accounting_costcenter_id' => ['name' => 'accounting_costcenter_id', 'type' => 'int', 'internal' => 'id'], 'accounting_costcenter_code' => ['name' => 'accounting_costcenter_code', 'type' => 'string', 'internal' => 'code'], + 'accounting_costcenter_unit' => ['name' => 'accounting_costcenter_unit', 'type' => 'int', 'internal' => 'unit'], ]; /** @@ -51,7 +52,7 @@ final class CostCenterMapper extends DataMapperFactory 'mapper' => CostCenterL11nMapper::class, 'table' => 'accounting_costcenter_l11n', 'self' => 'accounting_costcenter_l11n_costcenter', - 'conditional' => true, + 'column' => 'content', 'external' => null, ], ]; diff --git a/Models/CostObject.php b/Models/CostObject.php index c3c2f33..ec6a884 100755 --- a/Models/CostObject.php +++ b/Models/CostObject.php @@ -14,6 +14,9 @@ declare(strict_types=1); namespace Modules\Accounting\Models; +use phpOMS\Localization\BaseStringL11n; +use phpOMS\Localization\ISO639x1Enum; + /** * Cost object class. * @@ -40,13 +43,13 @@ class CostObject */ public string $code = ''; - /** - * Localization. + /* + * String l11n * - * @var CostObjectL11n + * @var string | BaseStringL11n * @since 1.0.0 */ - public CostObjectL11n $l11n; + public string | BaseStringL11n $l11n = ''; /** * Parent. @@ -56,15 +59,7 @@ class CostObject */ public $parent = null; - /** - * Constructor. - * - * @since 1.0.0 - */ - public function __construct() - { - $this->l11n = new CostObjectL11n(); - } + public int $unit = 0; /** * Get balance id @@ -78,6 +73,44 @@ class CostObject return $this->id; } + /** + * Set l11n + * + * @param string|BaseStringL11n $l11n Tag article l11n + * @param string $lang Language + * + * @return void + * + * @since 1.0.0 + */ + public function setL11n(string | BaseStringL11n $l11n, string $lang = ISO639x1Enum::_EN) : void + { + if ($l11n instanceof BaseStringL11n) { + $this->l11n = $l11n; + } elseif (isset($this->l11n) && $this->l11n instanceof BaseStringL11n) { + $this->l11n->content = $l11n; + $this->l11n->setLanguage($lang); + } else { + $this->l11n = new BaseStringL11n(); + $this->l11n->content = $l11n; + $this->l11n->setLanguage($lang); + } + } + + /** + * @return string + * + * @since 1.0.0 + */ + public function getL11n() : string + { + if (!isset($this->l11n)) { + return ''; + } + + return $this->l11n instanceof BaseStringL11n ? $this->l11n->content : $this->l11n; + } + /** * {@inheritdoc} */ diff --git a/Models/CostObjectL11n.php b/Models/CostObjectL11n.php deleted file mode 100755 index 9dac07a..0000000 --- a/Models/CostObjectL11n.php +++ /dev/null @@ -1,116 +0,0 @@ -language; - } - - /** - * Set language - * - * @param string $language Language - * - * @return void - * - * @since 1.0.0 - */ - public function setLanguage(string $language) : void - { - $this->language = $language; - } - - /** - * {@inheritdoc} - */ - public function toArray() : array - { - return [ - 'id' => $this->id, - 'name' => $this->name, - 'description' => $this->description, - 'costobject' => $this->costobject, - 'language' => $this->language, - ]; - } - - /** - * {@inheritdoc} - */ - public function jsonSerialize() : mixed - { - return $this->toArray(); - } -} diff --git a/Models/CostObjectL11nMapper.php b/Models/CostObjectL11nMapper.php index 38fd829..5857290 100755 --- a/Models/CostObjectL11nMapper.php +++ b/Models/CostObjectL11nMapper.php @@ -38,9 +38,8 @@ final class CostObjectL11nMapper extends DataMapperFactory */ public const COLUMNS = [ 'accounting_costobject_l11n_id' => ['name' => 'accounting_costobject_l11n_id', 'type' => 'int', 'internal' => 'id'], - 'accounting_costobject_l11n_name' => ['name' => 'accounting_costobject_l11n_name', 'type' => 'string', 'internal' => 'name', 'autocomplete' => true], - 'accounting_costobject_l11n_description' => ['name' => 'accounting_costobject_l11n_description', 'type' => 'string', 'internal' => 'description', 'autocomplete' => true], - 'accounting_costobject_l11n_costobject' => ['name' => 'accounting_costobject_l11n_costobject', 'type' => 'int', 'internal' => 'costobject'], + 'accounting_costobject_l11n_name' => ['name' => 'accounting_costobject_l11n_name', 'type' => 'string', 'internal' => 'content', 'autocomplete' => true], + 'accounting_costobject_l11n_costobject' => ['name' => 'accounting_costobject_l11n_costobject', 'type' => 'int', 'internal' => 'ref'], 'accounting_costobject_l11n_language' => ['name' => 'accounting_costobject_l11n_language', 'type' => 'string', 'internal' => 'language'], ]; @@ -59,4 +58,12 @@ final class CostObjectL11nMapper extends DataMapperFactory * @since 1.0.0 */ public const PRIMARYFIELD = 'accounting_costobject_l11n_id'; + + /** + * Model to use by the mapper. + * + * @var class-string + * @since 1.0.0 + */ + public const MODEL = BaseStringL11n::class; } diff --git a/Models/CostObjectMapper.php b/Models/CostObjectMapper.php index 19c1704..4e99eab 100755 --- a/Models/CostObjectMapper.php +++ b/Models/CostObjectMapper.php @@ -38,6 +38,7 @@ final class CostObjectMapper extends DataMapperFactory public const COLUMNS = [ 'accounting_costobject_id' => ['name' => 'accounting_costobject_id', 'type' => 'int', 'internal' => 'id'], 'accounting_costobject_code' => ['name' => 'accounting_costobject_code', 'type' => 'string', 'internal' => 'code'], + 'accounting_costobject_unit' => ['name' => 'accounting_costobject_unit', 'type' => 'int', 'internal' => 'unit'], ]; /** @@ -51,7 +52,7 @@ final class CostObjectMapper extends DataMapperFactory 'mapper' => CostObjectL11nMapper::class, 'table' => 'accounting_costobject_l11n', 'self' => 'accounting_costobject_l11n_costobject', - 'conditional' => true, + 'column' => 'content', 'external' => null, ], ]; diff --git a/Models/PermissionCategory.php b/Models/PermissionCategory.php index fec0729..36b44e3 100755 --- a/Models/PermissionCategory.php +++ b/Models/PermissionCategory.php @@ -17,7 +17,7 @@ namespace Modules\Accounting\Models; use phpOMS\Stdlib\Base\Enum; /** - * Permision state enum. + * Permission category enum. * * @package Modules\Accounting\Models * @license OMS License 2.0 @@ -43,4 +43,8 @@ abstract class PermissionCategory extends Enum public const ACCOUNT = 8; public const ENTRY = 9; + + public const SUPPLIER = 10; + + public const CLIENT = 11; } diff --git a/Theme/Backend/Lang/de.lang.php b/Theme/Backend/Lang/de.lang.php index d2c8aa3..8ac55c6 100755 --- a/Theme/Backend/Lang/de.lang.php +++ b/Theme/Backend/Lang/de.lang.php @@ -17,6 +17,7 @@ return ['Accounting' => [ 'Accounts' => 'Konten', 'BatchPostings' => 'Chargenbuchungen', 'Charts' => 'Charts', + 'COA' => 'Chart of Accounts (COA)', 'Code' => 'Code', 'ContraAccount' => 'Gegenkonto', 'CostCenter' => 'Kostenstelle', diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index ceb2a5a..dcd03f3 100755 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -17,6 +17,7 @@ return ['Accounting' => [ 'Accounts' => 'Accounts', 'BatchPostings' => 'Batch Postings', 'Charts' => 'Charts', + 'COA' => 'Chart of Accounts (COA)', 'Code' => 'Code', 'ContraAccount' => 'Contra Account', 'CostCenter' => 'Cost Center', diff --git a/Theme/Backend/coa-list.tpl.php b/Theme/Backend/coa-list.tpl.php index 1de2716..15d6f38 100644 --- a/Theme/Backend/coa-list.tpl.php +++ b/Theme/Backend/coa-list.tpl.php @@ -12,6 +12,8 @@ */ declare(strict_types=1); +use phpOMS\Uri\UriFactory; + /** * @var \phpOMS\Views\View $this */ @@ -22,7 +24,7 @@ echo $this->data['nav']->render(); ?>
-
getHtml('Chart of Accounts (COA)'); ?>download
+
getHtml('COA'); ?>download
@@ -32,8 +34,8 @@ echo $this->data['nav']->render(); ?> $value) : ++$c; - $url = \phpOMS\Uri\UriFactory::build('{/base}/admin/group/settings?{?}&id=' . $value->id); ?> - + $url = UriFactory::build('{/base}/accounting/coa/profile?{?}&id=' . $value->id); ?> + - -
printHtml($value->account); ?> printHtml($value->getL11n()); ?> diff --git a/Theme/Backend/costcenter-list.tpl.php b/Theme/Backend/costcenter-list.tpl.php index 4a83d1b..8ac68b2 100755 --- a/Theme/Backend/costcenter-list.tpl.php +++ b/Theme/Backend/costcenter-list.tpl.php @@ -37,8 +37,10 @@ echo $this->data['nav']->render(); ?> $value) : ++$count; $url = UriFactory::build('{/base}/tag/single?{?}&id=' . $value->id); ?>
printHtml($value->code); ?> - printHtml($value->l11n->name); ?> + + printHtml($value->code); ?> + + printHtml($value->getL11n()); ?>
getHtml('Empty', '0', '0'); ?> diff --git a/Theme/Backend/costobject-list.tpl.php b/Theme/Backend/costobject-list.tpl.php index 68befef..d21918e 100755 --- a/Theme/Backend/costobject-list.tpl.php +++ b/Theme/Backend/costobject-list.tpl.php @@ -37,8 +37,10 @@ echo $this->data['nav']->render(); ?> $value) : ++$count; $url = UriFactory::build('{/base}/tag/single?{?}&id=' . $value->id); ?>
printHtml($value->code); ?> - printHtml($value->l11n->name); ?> + + printHtml($value->code); ?> + + printHtml($value->getL11n()); ?>
getHtml('Empty', '0', '0'); ?> diff --git a/Theme/Backend/entries.tpl.php b/Theme/Backend/entries.tpl.php index aebfcef..3b5682f 100755 --- a/Theme/Backend/entries.tpl.php +++ b/Theme/Backend/entries.tpl.php @@ -24,41 +24,56 @@ $footerView->setResults(1);
-
-
+
+
- - - -
- + +
+ + + - + +
- + + + +
- - - -
+ + + + +
+
+ +
@@ -66,18 +81,19 @@ $footerView->setResults(1);
-
- - +
+
getHtml('Entries'); ?>download
+
+
getHtml('Entries'); ?>download
getHtml('EntryDate'); ?> @@ -102,17 +118,19 @@ $footerView->setResults(1); getHtml('Empty', '0', '0'); ?>
-
+
+
-
+
-
- - +
+
getHtml('Accounts'); ?>download
+
+
getHtml('Accounts'); ?>download
getHtml('Account'); ?> @@ -127,12 +145,14 @@ $footerView->setResults(1); getHtml('Empty', '0', '0'); ?>
-
+
+
-
- - +
+
getHtml('CostCenter'); ?>download
+
+
getHtml('CostCenter'); ?>download
getHtml('CostCenter'); ?> @@ -147,15 +167,17 @@ $footerView->setResults(1); getHtml('Empty', '0', '0'); ?>
-
+
+
-
- - +
+
getHtml('CostObject'); ?>download
+
+
getHtml('CostObject'); ?>download
- @@ -167,7 +189,8 @@ $footerView->setResults(1);
getHtml('Account'); ?> + getHtml('CostObject'); ?> getHtml('Name'); ?> getHtml('Total'); ?>
getHtml('Empty', '0', '0'); ?>
-
+
+
diff --git a/Admin/Install/Coa/skr03_balance_de_gaap.json b/Theme/Backend/personal-list.tpl.php similarity index 100% rename from Admin/Install/Coa/skr03_balance_de_gaap.json rename to Theme/Backend/personal-list.tpl.php diff --git a/info.json b/info.json index 6e7a5f3..8cb0be9 100755 --- a/info.json +++ b/info.json @@ -14,13 +14,14 @@ "name": "Jingga", "website": "jingga.app" }, - "description": "Accounting module.", "directory": "Accounting", "dependencies": { "Admin": "1.0.0" }, "providing": { - "Navigation": "*" + "Navigation": "*", + "ClientManagement": "*", + "SupplierManagement": "*" }, "load": [ {