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/Admin/Install/Media/bill.pdf.php b/Admin/Install/Media/bill.pdf.php new file mode 100644 index 0000000..b4994de --- /dev/null +++ b/Admin/Install/Media/bill.pdf.php @@ -0,0 +1,287 @@ +getData('bill'); + +$mpdf = new Mpdf([ + 'mode' => 'utf-8', + 'format' => 'A4-L', + 'orientation' => 'L', + 'margin_left' => 0, + 'margin_right' => 0, + 'margin_top' => 0, + 'margin_bottom' => 0, + 'margin_header' => 0, + 'margin_footer' => 0, +]); + +$mpdf->SetDisplayMode('fullpage'); +$mpdf->SetTitle($bill->getNumber()); +$mpdf->SetAuthor('Orange Management'); + +$mpdf->AddPage(); + +$mpdf->SetHTMLHeader(' +'); + +$mpdf->SetHTMLFooter(' +'); + +$mpdf->WriteHTML(' + + + + + + +
Date: 13th November 2008
+ + + + +
SOLD TO:

345 Anotherstreet
Little Village
Their City
CB22 6SO
 SHIP TO:

345 Anotherstreet
Little Village
Their City
CB22 6SO
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Ref. No.QuantityDescriptionUnit PriceAmount
MF123456710Large pack Hoover bags£2.56£25.60
MX378019821Womans waterproof jacket
Options - Red and charcoal.
£102.11£102.11
MR700929825Steel nails; oval head; 30mm x 3mm. Packs of 1000.£12.26£325.60
MF123456710Large pack Hoover bags£2.56£25.60
MX378019821Womans waterproof jacket
Options - Red and charcoal.
£102.11£102.11
MR700929825Steel nails; oval head; 30mm x 3mm. Packs of 1000.£12.26£325.60
MF123456710Large pack Hoover bags£2.56£25.60
MX378019821Womans waterproof jacket
Options - Red and charcoal.
£102.11£102.11
MR700929825Steel nails; oval head; 30mm x 3mm. Packs of 1000.£12.26£325.60
MF123456710Large pack Hoover bags£2.56£25.60
MX378019821Womans waterproof jacket
Options - Red and charcoal.
£102.11£102.11
MR700929825Steel nails; oval head; 30mm x 3mm. Packs of 1000.£12.26£325.60
MF123456710Large pack Hoover bags£2.56£25.60
MX378019821Womans waterproof jacket
Options - Red and charcoal.
£102.11£102.11
MF123456710Large pack Hoover bags£2.56£25.60
MX378019821Womans waterproof jacket
Options - Red and charcoal.
£102.11£102.11
MR700929825Steel nails; oval head; 30mm x 3mm. Packs of 1000.£12.26£325.60
MR700929825Steel nails; oval head; 30mm x 3mm. Packs of 1000.£12.26£325.60
MF123456710Large pack Hoover bags£2.56£25.60
MX378019821Womans waterproof jacket
Options - Red and charcoal.
£102.11£102.11
MR700929825Steel nails; oval head; 30mm x 3mm. Packs of 1000.£12.26£325.60
Subtotal:£1825.60
Tax:£18.25
Shipping:£42.56
TOTAL:£1882.56
Deposit:£100.00
Balance due:£1782.56
+
Payment terms: payment due in 30 days
+ + +'); + +$mpdf->Output(); diff --git a/Admin/Install/Media/logo.png b/Admin/Install/Media/logo.png new file mode 100755 index 0000000..27d7f3c Binary files /dev/null and b/Admin/Install/Media/logo.png differ diff --git a/Admin/Installer.php b/Admin/Installer.php index 448301b..b5f274a 100644 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -64,6 +64,19 @@ final class Installer extends InstallerAbstract ItemAttributeTypeL11nMapper::create(new ItemAttributeTypeL11n($itemAttrType['color']->getId(), 'Color', ISO639x1Enum::_EN)); ItemAttributeTypeL11nMapper::create(new ItemAttributeTypeL11n($itemAttrType['color']->getId(), 'Farbe', ISO639x1Enum::_DE)); + // weight + // segment_level_1 + // segment_level_2 + // segment_level_3 + // segment_level_4 + // product_group + // consumable + // packaging + // service + // machine + // spare part + // transportation + return $itemAttrType; } diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 3e0ed4b..f883a35 100644 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -93,6 +93,7 @@ final class ApiController extends Controller $item->number = $request->getData('number') ?? ''; $item->salesPrice = new Money($request->getData('salesprice', 'int') ?? 0); $item->purchasePrice = new Money($request->getData('purchaseprice', 'int') ?? 0); + $item->info = $request->getData('info') ?? ''; return $item; } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index cb0d537..c39ade5 100644 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -17,6 +17,7 @@ namespace Modules\ItemManagement\Controller; use Model\SettingsEnum; use Modules\Admin\Models\LocalizationMapper; use Modules\Billing\Models\BillMapper; +use Modules\ItemManagement\Models\ItemL11nTypeMapper; use Modules\ItemManagement\Models\ItemMapper; use phpOMS\Contract\RenderableInterface; use phpOMS\Message\RequestAbstract; @@ -25,6 +26,9 @@ use phpOMS\Views\View; use phpOMS\Stdlib\Base\SmartDateTime; use phpOMS\Localization\Money; use phpOMS\Asset\AssetType; +use Modules\ItemManagement\Models\ItemL11nMapper; +use Modules\ItemManagement\Models\ItemAttributeMapper; +use Modules\Billing\Models\BillTypeL11n; /** * ItemManagement controller class. @@ -200,12 +204,22 @@ final class BackendController extends Controller $view->setData('defaultlocalization', LocalizationMapper::get((int) $settings['id'])); + $itemL11n = ItemL11nMapper::withConditional('language', $response->getLanguage()) + ::withConditional('item', $item->getId())::getAll(); + $view->addData('itemL11n', $itemL11n); + + $itemAttribute = ItemAttributeMapper::withConditional('language', $response->getLanguage()) + ::withConditional('item', $item->getId())::getAll(); + $view->addData('itemAttribute', $itemAttribute); + + // stats if ($this->app->moduleManager->isActive('Billing')) { $ytd = BillMapper::getSalesByItemId($item->getId(), new SmartDateTime('Y-01-01'), new SmartDateTime('now')); $mtd = BillMapper::getSalesByItemId($item->getId(), new SmartDateTime('Y-m-01'), new SmartDateTime('now')); $avg = BillMapper::getAvgSalesPriceByItemId($item->getId(), (new SmartDateTime('now'))->smartModify(-1), new SmartDateTime('now')); $lastOrder = BillMapper::getLastOrderDateByItemId($item->getId()); - $newestInvoices = BillMapper::getNewestItemInvoices($item->getId(), 5); + // @todo: why is the conditional array necessary, shouldn't the mapper realize when it mustn't use the conditional (when the field doesn't exist in the mapper) + $newestInvoices = BillMapper::withConditional('language', $response->getLanguage(), [BillTypeL11n::class])::getNewestItemInvoices($item->getId(), 5); $topCustomers = BillMapper::getItemTopCustomers($item->getId(), new SmartDateTime('Y-01-01'), new SmartDateTime('now'), 5); $regionSales = BillMapper::getItemRegionSales($item->getId(), new SmartDateTime('Y-01-01'), new SmartDateTime('now')); $countrySales = BillMapper::getItemCountrySales($item->getId(), new SmartDateTime('Y-01-01'), new SmartDateTime('now'), 5); diff --git a/Models/ItemAttributeType.php b/Models/ItemAttributeType.php index 9ede1cc..9f7a9fd 100644 --- a/Models/ItemAttributeType.php +++ b/Models/ItemAttributeType.php @@ -41,7 +41,7 @@ class ItemAttributeType implements \JsonSerializable, ArrayableInterface * @var string * @since 1.0.0 */ - protected string $name = ''; + protected string $name = ''; // @todo: currently not filled, should be used as identifier or if not required removed (at the moment it seems like it is useless?!) /** * Which field data type is required (string, int, ...) in the value @@ -120,6 +120,16 @@ class ItemAttributeType implements \JsonSerializable, ArrayableInterface } } + /** + * @return string + * + * @since 1.0.0 + */ + public function getL11n() : string + { + return $this->l11n instanceof ItemAttributeTypeL11n ? $this->l11n->title : $this->l11n; + } + /** * Set fields * diff --git a/Models/ItemAttributeValue.php b/Models/ItemAttributeValue.php index 4e19aa3..ffb4520 100644 --- a/Models/ItemAttributeValue.php +++ b/Models/ItemAttributeValue.php @@ -153,6 +153,21 @@ class ItemAttributeValue implements \JsonSerializable, ArrayableInterface } } + public function getValue() : mixed + { + if (!empty($this->valueStr)) { + return $this->valueStr; + } elseif (!empty($this->valueInt)) { + return $this->valueInt; + } elseif (!empty($this->valueDec)) { + return $this->valueDec; + } elseif ($this->valueDat instanceof \DateTimeInterface) { + return $this->valueDat; + } + + return null; + } + /** * Set language * diff --git a/Theme/Backend/sales-item-list.tpl.php b/Theme/Backend/sales-item-list.tpl.php index 15f5852..386ca74 100644 --- a/Theme/Backend/sales-item-list.tpl.php +++ b/Theme/Backend/sales-item-list.tpl.php @@ -66,7 +66,7 @@ echo $this->getData('nav')->render(); ?> printHtml($value->getL11n('name1')->description); ?> printHtml($value->getL11n('name2')->description); ?> printHtml($value->getL11n('name3')->description); ?> - + printHtml($value->salesPrice->getCurrency()); ?> diff --git a/Theme/Backend/sales-item-profile.tpl.php b/Theme/Backend/sales-item-profile.tpl.php index 689f5d9..fca95ec 100644 --- a/Theme/Backend/sales-item-profile.tpl.php +++ b/Theme/Backend/sales-item-profile.tpl.php @@ -16,18 +16,22 @@ use Modules\Media\Models\NullMedia; use phpOMS\Localization\NullLocalization; use phpOMS\Uri\UriFactory; use phpOMS\Localization\Money; +use phpOMS\Localization\ISO639Enum; /** * @var \Modules\ItemManagement\Models\Item $item */ $item = $this->getData('item'); +$itemL11n = $this->getData('itemL11n'); +$itemAttribute = $this->getData('itemAttribute'); + $newestInvoices = $this->getData('newestInvoices') ?? []; $topCustomers = $this->getData('topCustomers') ?? []; $regionSales = $this->getData('regionSales') ?? []; $countrySales = $this->getData('countrySales') ?? []; $monthlySalesCosts = $this->getData('monthlySalesCosts') ?? []; -$languages = \phpOMS\Localization\ISO639Enum::getConstants(); +$languages = ISO639Enum::getConstants(); $l11n = $this->getData('defaultlocalization') ?? new NullLocalization(); @@ -175,12 +179,14 @@ echo $this->getData('nav')->render(); Net Date - - - getNumber(); ?> - billTo; ?> - net->getCurrency(); ?> - createdAt->format('Y-m-d'); ?> + getId()); + ?> + + getNumber(); ?> + billTo; ?> + net->getCurrency(); ?> + createdAt->format('Y-m-d'); ?> @@ -279,6 +285,9 @@ echo $this->getData('nav')->render(); "display": true, "labelString": "Margin %" }, + "gridLines": { + "display": false + }, "beginAtZero": true, "ticks": { "min": 0, @@ -367,12 +376,10 @@ echo $this->getData('nav')->render();
-
-
-

getHtml('Description'); ?>

-
-
-
+
+ +
getHtml('Description'); ?>
+
@@ -397,37 +404,39 @@ echo $this->getData('nav')->render(); -
-
- -
+
+
+
- - - - - - $value) : ++$c; - $url = \phpOMS\Uri\UriFactory::build('{/prefix}admin/group/settings?{?}&id=' . $value->getId()); ?> - - + $value) : ++$c; + $url = UriFactory::build('{/prefix}admin/group/settings?{?}&id=' . $value->getId()); ?> + + +
getHtml('Groups'); ?>
- getHtml('ID', '0', '0'); ?> - getHtml('Name'); ?> -
- getId(); ?> - printHtml($value->name); ?> - - +
+
getHtml('Localizations'); ?>
+ + -
getHtml('Empty', '0', '0'); ?> - -
+
+ getHtml('ID', '0', '0'); ?> + getHtml('Name'); ?> + getHtml('Localization'); ?> +
+ getId(); ?> + printHtml($value->type->title); ?> + printHtml($value->description); ?> + + +
getHtml('Empty', '0', '0'); ?> + +
+
@@ -435,12 +444,10 @@ echo $this->getData('nav')->render();
-
-
-

getHtml('Attribute'); ?>

-
-
-
+
+
getHtml('Attribute'); ?>
+
+ @@ -483,28 +490,31 @@ echo $this->getData('nav')->render();
-
- - - - - $value) : ++$c; - $url = \phpOMS\Uri\UriFactory::build('{/prefix}admin/group/settings?{?}&id=' . $value->getId()); ?> - - + $value) : ++$c; + $url = UriFactory::build('{/prefix}admin/group/settings?{?}&id=' . $value->getId()); ?> + + +
getHtml('Groups'); ?>
- getHtml('ID', '0', '0'); ?> - getHtml('Name'); ?> -
- getId(); ?> - printHtml($value->name); ?> - - +
+
getHtml('Groups'); ?>
+ + -
getHtml('Empty', '0', '0'); ?> - -
+
+ getHtml('ID', '0', '0'); ?> + getHtml('Name'); ?> + getHtml('Name'); ?> +
+ getId(); ?> + printHtml($value->type->getL11n()); ?> + value->getValue() instanceof \DateTime ? $value->value->getValue()->format('Y-m-d') : $this->printHtml((string) $value->value->getValue()); ?> + + +
getHtml('Empty', '0', '0'); ?> + +
+
@@ -517,7 +527,7 @@ echo $this->getData('nav')->render();

getHtml('Customer'); ?>

- + @@ -573,7 +583,7 @@ echo $this->getData('nav')->render(); $value) : ++$c; - $url = \phpOMS\Uri\UriFactory::build('{/prefix}admin/group/settings?{?}&id=' . $value->getId()); ?> + $url = UriFactory::build('{/prefix}admin/group/settings?{?}&id=' . $value->getId()); ?>
getId(); ?> @@ -596,7 +606,7 @@ echo $this->getData('nav')->render();

getHtml('Purchase'); ?>

- + @@ -635,7 +645,7 @@ echo $this->getData('nav')->render();

getHtml('Supplier'); ?>

- +
@@ -703,7 +713,7 @@ echo $this->getData('nav')->render(); $value) : ++$c; - $url = \phpOMS\Uri\UriFactory::build('{/prefix}admin/group/settings?{?}&id=' . $value->getId()); ?> + $url = UriFactory::build('{/prefix}admin/group/settings?{?}&id=' . $value->getId()); ?>
getId(); ?> @@ -736,7 +746,7 @@ echo $this->getData('nav')->render();

getHtml('General'); ?>

- + @@ -791,7 +801,7 @@ echo $this->getData('nav')->render();

getHtml('General'); ?>

- +
diff --git a/composer.json b/composer.json index ed93ea9..be46f49 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 e8a2b05..94a5250 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": "38570a7f31334ef1b0fd42df055bafe2", + "content-hash": "a2683b12c2f52a958b7692f4827e52d4", "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" }