From 0a83906a49249723d40049a85ba600a7cab778eb Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 7 Feb 2021 12:47:08 +0100 Subject: [PATCH] update composer and some item/client impl. --- .directory | 6 ++ .github/workflows/main.yml | 37 +++++++++- Controller.js | 40 +++++----- Controller/BackendController.php | 27 +++++++ Theme/Backend/client-profile.tpl.php | 106 ++++++++++++++++++++++++++- composer.json | 1 + composer.lock | 10 +-- 7 files changed, 200 insertions(+), 27 deletions(-) create mode 100644 .directory diff --git a/.directory b/.directory new file mode 100644 index 0000000..b6f68a5 --- /dev/null +++ b/.directory @@ -0,0 +1,6 @@ +[Dolphin] +Timestamp=2021,2,7,12,37,8 +Version=4 + +[Settings] +HiddenFilesShown=true diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index efaa87c..1146340 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,7 +3,42 @@ name: CI/CD on: [push] jobs: - codestyle-tests: + autoformat: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, 'NO_CI')" + strategy: + fail-fast: false + max-parallel: 3 + steps: + - name: Checkout Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + - name: Get Composer Cache Directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + - name: Cache dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + - name: Setup Composer + run: composer install + - name: Autoformat + run: 'vendor/bin/php-cs-fixer fix ./ --rules=''{"array_syntax": {"syntax": "short"}, "blank_line_after_namespace": true, "binary_operator_spaces": {"operators": {"=": "align", ".=": "align", "+=": "align", "-=": "align", "*=": "align", "/=": "align", "|=": "align", "&=": "align", "=>": "align", "??=": "align"}}, "cast_spaces": {"space": "single"}, "class_attributes_separation": { "elements": ["const", "method", "property"] }, "combine_consecutive_issets": true, "compact_nullable_typehint": true, "declare_strict_types": true, "declare_equal_normalize": {"space": "none"}, "elseif": true, "encoding": true, "explicit_indirect_variable": true, "explicit_string_variable": true, "function_to_constant": true, "implode_call": true, "increment_style": {"style": "pre"}, "is_null": {"use_yoda_style": false}, "line_ending": true, "logical_operators": true, "lowercase_cast": true, "lowercase_constants": true, "lowercase_keywords": true, "modernize_types_casting": true, "native_constant_invocation": true, "native_function_casing": true, "native_function_invocation": true, "new_with_braces": true, "no_extra_blank_lines": ["break", "case", "continue", "curly_brace_block", "extra", "return", "switch", "throw", "use"], "no_spaces_after_function_name": true, "no_alias_functions": true, "no_closing_tag": true, "no_empty_comment": true, "no_empty_phpdoc": true, "no_empty_statement": true, "no_homoglyph_names": true, "no_mixed_echo_print": {"use": "echo"}, "no_php4_constructor": true, "no_singleline_whitespace_before_semicolons": true, "no_spaces_inside_parenthesis": true, "no_trailing_whitespace": true, "no_unneeded_final_method": true, "no_unused_imports": true, "no_useless_return": true, "no_whitespace_before_comma_in_array": true, "no_whitespace_in_blank_line": true, "non_printable_character": true, "normalize_index_brace": true, "ordered_imports": {"sort_algorithm": "alpha"}, "ordered_interfaces": {"order": "alpha"}, "php_unit_construct": true, "php_unit_internal_class": true, "php_unit_ordered_covers": true, "php_unit_set_up_tear_down_visibility": true, "phpdoc_indent": true, "phpdoc_align": {"align": "vertical"}, "phpdoc_annotation_without_dot": true, "phpdoc_scalar": true, "phpdoc_return_self_reference": {"this": "self"}, "phpdoc_trim": true, "phpdoc_trim_consecutive_blank_line_separation": true, "random_api_migration": true, "self_accessor": true, "return_type_declaration": {"space_before": "one"}, "semicolon_after_instruction": true, "set_type_to_cast": true, "short_scalar_cast": true, "single_blank_line_at_eof": true, "single_line_after_imports": true, "standardize_increment": true, "trailing_comma_in_multiline_array": true, "trim_array_spaces": true, "visibility_required": true, "void_return": true}'' --allow-risky=yes' + - name: Check for modified files + id: git-check + run: echo ::set-output name=modified::$(if git diff-index --quiet HEAD --; then echo "false"; else echo "true"; fi) + - name: Push changes + if: steps.git-check.outputs.modified == 'true' + run: | + git config --global user.name 'Formatter Bot' + git config --global user.email 'formatter.bot@orange-management.email' + git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} + git commit -am "Automated formatting changes" + git push + code-tests: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, 'NO_CI')" strategy: diff --git a/Controller.js b/Controller.js index 73cf423..147206f 100644 --- a/Controller.js +++ b/Controller.js @@ -17,26 +17,32 @@ jsOMS.Modules.ClientManager = class { bind (id) { - /* - const map = document.getElementById('iMap'); - fetch(map.src).then(res => res.text()).then(data => { - const parser = new DOMParser(); - const svg = parser.parseFromString(data, 'image/svg+xml').querySelector('svg'); + const e = typeof id === 'undefined' ? document.getElementsByTagName('canvas') : [document.getElementById(id)], + length = e.length; - if (map.id) svg.id = map.id; - if (map.className) svg.classList = map.classList; + for (let i = 0; i < length; ++i) { + if (e[i].getAttribute('data-chart') === null + && e[i].getAttribute('data-chart') !== 'undefined' + ) { + continue; + } - map.parentNode.replaceChild(svg, map); + this.bindElement(e[i]); + } + }; - return svg; - }) - .then(svg => { - //svg.setAttribute('width', 100); - //svg.setAttribute('height', 136); - //svg.setAttribute('viewbox', '0 0 1000 1360'); - //svg.style.width = '100%'; - }); - */ + bindElement (chart) + { + if (typeof chart === 'undefined' || !chart) { + jsOMS.Log.Logger.instance.error('Invalid chart: ' + chart, 'ClientManagementController'); + + return; + } + + const self = this; + const data = JSON.parse(chart.getAttribute('data-chart')); + + const myChart = new Chart(chart.getContext('2d'), data); }; }; diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 2fd3fee..f884acf 100644 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -20,6 +20,10 @@ use phpOMS\Contract\RenderableInterface; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Views\View; +use Modules\Billing\Models\BillMapper; +use phpOMS\Stdlib\Base\SmartDateTime; +use phpOMS\Localization\Money; +use Modules\Billing\Models\BillTypeL11n; /** * ClientManagement class. @@ -91,6 +95,8 @@ final class BackendController extends Controller public function viewClientManagementClientProfile(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface { $head = $response->get('Content')->getData('head'); + $head->addAsset(AssetType::CSS, 'Resources/chartjs/Chartjs/chart.css'); + $head->addAsset(AssetType::JSLATE, 'Resources/chartjs/Chartjs/chart.js'); $head->addAsset(AssetType::JSLATE, 'Modules/ClientManagement/Controller.js', ['type' => 'module']); $view = new View($this->app->l11nManager, $request, $response); @@ -100,6 +106,27 @@ final class BackendController extends Controller $client = ClientMapper::get((int) $request->getData('id')); $view->setData('client', $client); + // stats + if ($this->app->moduleManager->isActive('Billing')) { + $ytd = BillMapper::getSalesByClientId($client->getId(), new SmartDateTime('Y-01-01'), new SmartDateTime('now')); + $mtd = BillMapper::getSalesByClientId($client->getId(), new SmartDateTime('Y-m-01'), new SmartDateTime('now')); + $lastOrder = BillMapper::getLastOrderDateByClientId($client->getId()); + $newestInvoices = BillMapper::withConditional('language', $response->getLanguage(), [BillTypeL11n::class])::getNewestClientInvoices($client->getId(), 5); + $monthlySalesCosts = BillMapper::getClientMonthlySalesCosts($client->getId(), (new SmartDateTime('now'))->createModify(-1), new SmartDateTime('now')); + } else { + $ytd = new Money(); + $mtd = new Money(); + $lastOrder = null; + $newestInvoices = []; + $monthlySalesCosts = []; + } + + $view->addData('ytd', $ytd); + $view->addData('mtd', $mtd); + $view->addData('lastOrder', $lastOrder); + $view->addData('newestInvoices', $newestInvoices); + $view->addData('monthlySalesCosts', $monthlySalesCosts); + return $view; } diff --git a/Theme/Backend/client-profile.tpl.php b/Theme/Backend/client-profile.tpl.php index 4522b11..61f308b 100644 --- a/Theme/Backend/client-profile.tpl.php +++ b/Theme/Backend/client-profile.tpl.php @@ -23,6 +23,9 @@ $countries = \phpOMS\Localization\ISO3166NameEnum::getConstants(); */ $client = $this->getData('client'); +$newestInvoices = $this->getData('newestInvoices') ?? []; +$monthlySalesCosts = $this->getData('monthlySalesCosts') ?? []; + /** * @var \phpOMS\Views\View $this */ @@ -195,8 +198,25 @@ echo $this->getData('nav')->render();
-
Invoices
-
+
Recent Invoices
+ + + + + getId()); + ?> + +
Number + Name + Net + Date +
getNumber(); ?> + billTo; ?> + net->getCurrency(); ?> + createdAt->format('Y-m-d'); ?> + +
@@ -209,10 +229,88 @@ echo $this->getData('nav')->render(); -
+
Sales
-
+
+ + + ], + "datasets": [ + { + "label": "Margin", + "type": "line", + "data": [ + + + ], + "yAxisID": "axis-2", + "fill": false, + "borderColor": "rgb(255, 99, 132)", + "backgroundColor": "rgb(255, 99, 132)" + }, + { + "label": "Sales", + "type": "bar", + "data": [ + + + ], + "yAxisID": "axis-1", + "backgroundColor": "rgb(54, 162, 235)" + } + ] + }, + "options": { + "scales": { + "yAxes": [ + { + "id": "axis-1", + "display": true, + "position": "left" + }, + { + "id": "axis-2", + "display": true, + "position": "right", + "scaleLabel": { + "display": true, + "labelString": "Margin %" + }, + "gridLines": { + "display": false + }, + "beginAtZero": true, + "ticks": { + "min": 0, + "max": 100, + "stepSize": 10 + } + } + ] + } + } + }'> +
diff --git a/composer.json b/composer.json index a05b50d..8f2fb6d 100755 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ ], "require-dev": { "phpunit/phpunit": ">=9.4", + "friendsofphp/php-cs-fixer": ">=2.18", "squizlabs/php_codesniffer": ">=3.5", "phpmd/phpmd": ">=2.9", "phpstan/phpstan": ">=0.12.58", diff --git a/composer.lock b/composer.lock index dc5824b..c9e52d3 100755 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a0329f9e25747913538e4732dc3d6e86", + "content-hash": "8d5a08d70bf2ff5887d7b84ca7117218", "packages": [], "packages-dev": [ { @@ -3792,12 +3792,12 @@ "version": "1.9.1", "source": { "type": "git", - "url": "https://github.com/webmozart/assert.git", + "url": "https://github.com/webmozarts/assert.git", "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", "shasum": "" }, @@ -3835,8 +3835,8 @@ "validate" ], "support": { - "issues": "https://github.com/webmozart/assert/issues", - "source": "https://github.com/webmozart/assert/tree/master" + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.9.1" }, "time": "2020-07-08T17:02:28+00:00" }