mirror of
https://github.com/Karaka-Management/oms-ClientManagement.git
synced 2026-01-11 15:28:41 +00:00
update composer and some item/client impl.
This commit is contained in:
parent
dcb35e94dd
commit
0a83906a49
6
.directory
Normal file
6
.directory
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
[Dolphin]
|
||||
Timestamp=2021,2,7,12,37,8
|
||||
Version=4
|
||||
|
||||
[Settings]
|
||||
HiddenFilesShown=true
|
||||
37
.github/workflows/main.yml
vendored
37
.github/workflows/main.yml
vendored
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
|||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head">Invoices</div>
|
||||
<div class="portlet-body"></div>
|
||||
<div class="portlet-head">Recent Invoices</div>
|
||||
<table id="iSalesItemList" class="default">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Number
|
||||
<td class="wf-100">Name
|
||||
<td>Net
|
||||
<td>Date
|
||||
<tbody>
|
||||
<?php foreach ($newestInvoices as $invoice) :
|
||||
$url = UriFactory::build('{/prefix}sales/invoice?{?}&id=' . $invoice->getId());
|
||||
?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="<?= $url; ?>"><?= $invoice->getNumber(); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $invoice->billTo; ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $invoice->net->getCurrency(); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $invoice->createdAt->format('Y-m-d'); ?></a>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -209,10 +229,88 @@ echo $this->getData('nav')->render();
|
|||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<div class="col-xs-12 col-lg-6">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head">Sales</div>
|
||||
<div class="portlet-body"></div>
|
||||
<div class="portlet-body">
|
||||
<canvas id="sales-region" data-chart='{
|
||||
"type": "bar",
|
||||
"data": {
|
||||
"labels": [
|
||||
<?php
|
||||
$temp = [];
|
||||
foreach ($monthlySalesCosts as $monthly) {
|
||||
$temp[] = $monthly['month'] . '/' . \substr((string) $monthly['year'], -2);
|
||||
}
|
||||
?>
|
||||
<?= '"' . \implode('", "', $temp) . '"'; ?>
|
||||
],
|
||||
"datasets": [
|
||||
{
|
||||
"label": "Margin",
|
||||
"type": "line",
|
||||
"data": [
|
||||
<?php
|
||||
$temp = [];
|
||||
foreach ($monthlySalesCosts as $monthly) {
|
||||
$temp[] = \round(((((int) $monthly['net_sales']) - ((int) $monthly['net_costs'])) / ((int) $monthly['net_sales'])) * 100, 2);
|
||||
}
|
||||
?>
|
||||
<?= \implode(',', $temp); ?>
|
||||
],
|
||||
"yAxisID": "axis-2",
|
||||
"fill": false,
|
||||
"borderColor": "rgb(255, 99, 132)",
|
||||
"backgroundColor": "rgb(255, 99, 132)"
|
||||
},
|
||||
{
|
||||
"label": "Sales",
|
||||
"type": "bar",
|
||||
"data": [
|
||||
<?php
|
||||
$temp = [];
|
||||
foreach ($monthlySalesCosts as $monthly) {
|
||||
$temp[] = ((int) $monthly['net_sales']) / 1000;
|
||||
}
|
||||
?>
|
||||
<?= \implode(',', $temp); ?>
|
||||
],
|
||||
"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
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}'></canvas>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
10
composer.lock
generated
10
composer.lock
generated
|
|
@ -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"
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user