mirror of
https://github.com/Karaka-Management/oms-ItemManagement.git
synced 2026-01-10 19:28:41 +00:00
bump
This commit is contained in:
parent
91871b73a9
commit
99167eff50
35
.github/dev_bug_report.md
vendored
35
.github/dev_bug_report.md
vendored
|
|
@ -1,35 +0,0 @@
|
|||
---
|
||||
name: Dev Bug Report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: stat_backlog, type_bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
# Bug Description
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
# How to Reproduce
|
||||
|
||||
Steps to reproduce the behavior:
|
||||
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
## Minimal Code Example
|
||||
|
||||
```
|
||||
// your code ...
|
||||
```
|
||||
|
||||
# Expected Behavior
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
# Screenshots
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
# Additional Information
|
||||
Add any other context about the problem here.
|
||||
18
.github/dev_feature_request.md
vendored
18
.github/dev_feature_request.md
vendored
|
|
@ -1,18 +0,0 @@
|
|||
---
|
||||
name: Dev Feature Request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: stat_backlog, type_feature
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
# What is the feature you request
|
||||
* A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
* A clear and concise description of what you want to happen.
|
||||
|
||||
# Alternatives
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
# Additional Information
|
||||
Add any other context or screenshots about the feature request here.
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
[
|
||||
{
|
||||
"description": "Default item segmentation (segment, section, sales group, product group)",
|
||||
"type": "setting",
|
||||
"name": "1004800001",
|
||||
"content": "{\"segment\":1, \"section\":1, \"sales_group\":1, \"product_group\":1}",
|
||||
"pattern": "",
|
||||
"module": "ItemManagement"
|
||||
}
|
||||
]
|
||||
27
Admin/Install/Admin.install.php
Normal file
27
Admin/Install/Admin.install.php
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
/**
|
||||
* Jingga
|
||||
*
|
||||
* PHP Version 8.1
|
||||
*
|
||||
* @package Modules\ItemManagement\Admin
|
||||
* @copyright Dennis Eichhorn
|
||||
* @license OMS License 2.0
|
||||
* @version 1.0.0
|
||||
* @link https://jingga.app
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
use Modules\ItemManagement\Controller\ApiController;
|
||||
use Modules\ItemManagement\Models\SettingsEnum;
|
||||
|
||||
return [
|
||||
[
|
||||
"description" => "Default item segmentation (segment, section, sales group, product group)",
|
||||
'type' => 'setting',
|
||||
'name' => SettingsEnum::DEFAULT_SEGMENTATION,
|
||||
'content' => '{"segment":1, "section":1, "sales_group":1, "product_group":1}',
|
||||
'pattern' => '',
|
||||
'module' => ApiController::NAME,
|
||||
],
|
||||
];
|
||||
|
|
@ -42,6 +42,6 @@ class Admin
|
|||
// This requires that these settings are already available
|
||||
// However, this install script runs AFTER the primary installer runs.
|
||||
// This causes problems for the item installation and is therefore moved to the "Installer".
|
||||
// \Modules\Admin\Admin\Installer::installExternal($app, ['path' => __DIR__ . '/Admin.install.json']);
|
||||
// \Modules\Admin\Admin\Installer::installExternal($app, ['path' => __DIR__ . '/Admin.install.php']);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@
|
|||
"type": 2,
|
||||
"subtype": 1,
|
||||
"name": "Items",
|
||||
"uri": "{/base}/item/list",
|
||||
"uri": "{/base}/item/list?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 10,
|
||||
|
|
@ -79,7 +79,7 @@
|
|||
"type": 3,
|
||||
"subtype": 1,
|
||||
"name": "List",
|
||||
"uri": "{/base}/item/list",
|
||||
"uri": "{/base}/item/list?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 1,
|
||||
|
|
@ -144,7 +144,7 @@
|
|||
"type": 2,
|
||||
"subtype": 1,
|
||||
"name": "Items",
|
||||
"uri": "{/base}/sales/item/list",
|
||||
"uri": "{/base}/sales/item/list?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 10,
|
||||
|
|
@ -158,7 +158,7 @@
|
|||
"type": 3,
|
||||
"subtype": 1,
|
||||
"name": "List",
|
||||
"uri": "{/base}/sales/item/list",
|
||||
"uri": "{/base}/sales/item/list?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 1,
|
||||
|
|
@ -206,7 +206,7 @@
|
|||
"type": 2,
|
||||
"subtype": 1,
|
||||
"name": "Items",
|
||||
"uri": "{/base}/purchase/item/list",
|
||||
"uri": "{/base}/purchase/item/list?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 10,
|
||||
|
|
@ -220,7 +220,7 @@
|
|||
"type": 3,
|
||||
"subtype": 1,
|
||||
"name": "List",
|
||||
"uri": "{/base}/purchase/item/list",
|
||||
"uri": "{/base}/purchase/item/list?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 1,
|
||||
|
|
@ -268,7 +268,7 @@
|
|||
"type": 2,
|
||||
"subtype": 1,
|
||||
"name": "Items",
|
||||
"uri": "{/base}/warehouse/item/list",
|
||||
"uri": "{/base}/warehouse/item/list?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 10,
|
||||
|
|
@ -282,7 +282,7 @@
|
|||
"type": 3,
|
||||
"subtype": 1,
|
||||
"name": "List",
|
||||
"uri": "{/base}/warehouse/item/list",
|
||||
"uri": "{/base}/warehouse/item/list?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 1,
|
||||
|
|
@ -330,7 +330,7 @@
|
|||
"type": 2,
|
||||
"subtype": 1,
|
||||
"name": "Items",
|
||||
"uri": "{/base}/production/item/list",
|
||||
"uri": "{/base}/production/item/list?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 5,
|
||||
|
|
@ -344,7 +344,7 @@
|
|||
"type": 3,
|
||||
"subtype": 1,
|
||||
"name": "List",
|
||||
"uri": "{/base}/production/item/list",
|
||||
"uri": "{/base}/production/item/list?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 1,
|
||||
|
|
@ -392,7 +392,7 @@
|
|||
"type": 3,
|
||||
"subtype": 1,
|
||||
"name": "Item",
|
||||
"uri": "{/base}/purchase/analysis/item",
|
||||
"uri": "{/base}/purchase/analysis/item?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 10,
|
||||
|
|
|
|||
|
|
@ -25,19 +25,6 @@
|
|||
"default_value": "",
|
||||
"values": []
|
||||
},
|
||||
{
|
||||
"name": "primary_supplier",
|
||||
"l11n": {
|
||||
"en": "Primary Supplier",
|
||||
"de": "Hauptlieferant"
|
||||
},
|
||||
"value_type": 1,
|
||||
"is_custom_allowed": true,
|
||||
"validation_pattern": "",
|
||||
"is_required": false,
|
||||
"default_value": "",
|
||||
"values": []
|
||||
},
|
||||
{
|
||||
"name": "lead_time",
|
||||
"l11n": {
|
||||
|
|
@ -52,10 +39,10 @@
|
|||
"values": []
|
||||
},
|
||||
{
|
||||
"name": "qc_time",
|
||||
"name": "admin_time",
|
||||
"l11n": {
|
||||
"en": "QC time",
|
||||
"de": "QC Zeit"
|
||||
"en": "Admin time",
|
||||
"de": "Verabeitungszeit"
|
||||
},
|
||||
"value_type": 1,
|
||||
"is_custom_allowed": true,
|
||||
|
|
@ -569,9 +556,9 @@
|
|||
"values": []
|
||||
},
|
||||
{
|
||||
"name": "hc_code",
|
||||
"name": "hs_code",
|
||||
"l11n": {
|
||||
"en": "HC-code",
|
||||
"en": "HS-code",
|
||||
"de": "Zolltarifnummer"
|
||||
},
|
||||
"value_type": 2,
|
||||
|
|
@ -731,7 +718,7 @@
|
|||
"values": []
|
||||
},
|
||||
{
|
||||
"name": "releasedate",
|
||||
"name": "release_date",
|
||||
"value_type": 4,
|
||||
"is_custom_allowed": true,
|
||||
"validation_pattern": "",
|
||||
|
|
|
|||
|
|
@ -4,9 +4,13 @@
|
|||
"l11ns": {
|
||||
"name1": {
|
||||
"en": "Freight",
|
||||
"de": "Freight"
|
||||
"de": "Transportkosten"
|
||||
},
|
||||
"description_short": {}
|
||||
"description_short": {},
|
||||
"internal_matchcodes": {
|
||||
"en": "fuel, handling, freight, shipping",
|
||||
"de": "versand, transport, fracht"
|
||||
}
|
||||
},
|
||||
"primary_image": "",
|
||||
"keywords": {},
|
||||
|
|
@ -24,7 +28,103 @@
|
|||
"l11ns": {
|
||||
"name1": {
|
||||
"en": "Insurance",
|
||||
"de": "Insurance"
|
||||
"de": "Versicherung"
|
||||
},
|
||||
"description_short": {},
|
||||
"internal_matchcodes": {
|
||||
"en": "insurance",
|
||||
"de": "versicherung"
|
||||
}
|
||||
},
|
||||
"primary_image": "",
|
||||
"keywords": {},
|
||||
"attributes": [
|
||||
{
|
||||
"type": "bill_fees",
|
||||
"value": 1,
|
||||
"custom": false
|
||||
}
|
||||
],
|
||||
"variants": []
|
||||
},
|
||||
{
|
||||
"number": "3",
|
||||
"l11ns": {
|
||||
"name1": {
|
||||
"en": "Customs",
|
||||
"de": "Einfuhrsteuer"
|
||||
},
|
||||
"description_short": {},
|
||||
"internal_matchcodes": {
|
||||
"en": "customs",
|
||||
"de": "zoll, einfuhrumsatz"
|
||||
}
|
||||
},
|
||||
"primary_image": "",
|
||||
"keywords": {},
|
||||
"attributes": [
|
||||
{
|
||||
"type": "bill_fees",
|
||||
"value": 1,
|
||||
"custom": false
|
||||
}
|
||||
],
|
||||
"variants": []
|
||||
},
|
||||
{
|
||||
"number": "4",
|
||||
"l11ns": {
|
||||
"name1": {
|
||||
"en": "Other invoice fees",
|
||||
"de": "Sonstige Gebühren"
|
||||
},
|
||||
"description_short": {},
|
||||
"internal_matchcodes": {
|
||||
"en": "fee, surcharge",
|
||||
"de": "gebühr"
|
||||
}
|
||||
},
|
||||
"primary_image": "",
|
||||
"keywords": {},
|
||||
"attributes": [
|
||||
{
|
||||
"type": "bill_fees",
|
||||
"value": 1,
|
||||
"custom": false
|
||||
}
|
||||
],
|
||||
"variants": []
|
||||
},
|
||||
{
|
||||
"number": "5",
|
||||
"l11ns": {
|
||||
"name1": {
|
||||
"en": "Packaging materials",
|
||||
"de": "Verpackungsmaterial"
|
||||
},
|
||||
"description_short": {},
|
||||
"internal_matchcodes": {
|
||||
"en": "packaging",
|
||||
"de": "verpackung"
|
||||
}
|
||||
},
|
||||
"primary_image": "",
|
||||
"keywords": {},
|
||||
"attributes": [
|
||||
{
|
||||
"type": "bill_fees",
|
||||
"value": 1,
|
||||
"custom": false
|
||||
}
|
||||
],
|
||||
"variants": []
|
||||
},
|
||||
{
|
||||
"number": "99",
|
||||
"l11ns": {
|
||||
"name1": {
|
||||
"en": "Discount",
|
||||
"de": "Rabatt"
|
||||
},
|
||||
"description_short": {}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -11,6 +11,10 @@
|
|||
"name": "info",
|
||||
"is_required": false
|
||||
},
|
||||
{
|
||||
"name": "internal_matchcodes",
|
||||
"is_required": false
|
||||
},
|
||||
{
|
||||
"name": "description_short",
|
||||
"is_required": false
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ final class Installer extends InstallerAbstract
|
|||
$attrTypes = self::createAttributeTypes($app, $attributes);
|
||||
$attrValues = self::createAttributeValues($app, $attrTypes, $attributes);
|
||||
|
||||
$data = \json_decode(\file_get_contents(__DIR__ . '/Install/Admin.install.json'), true);
|
||||
$data = include __DIR__ . '/Install/Admin.install.php';
|
||||
$content = \json_decode($data[0]['content'], true);
|
||||
|
||||
foreach ($content as $type => $_) {
|
||||
|
|
@ -126,10 +126,10 @@ final class Installer extends InstallerAbstract
|
|||
$itemArray = [];
|
||||
|
||||
/** @var \Modules\ItemManagement\Controller\ApiController $module */
|
||||
$module = $app->moduleManager->getModuleInstance('ItemManagement');
|
||||
$module = $app->moduleManager->get('ItemManagement');
|
||||
|
||||
/** @var \Modules\ItemManagement\Controller\ApiAttributeController $module2 */
|
||||
$module2 = $app->moduleManager->getModuleInstance('ItemManagement', 'ApiAttribute');
|
||||
$module2 = $app->moduleManager->get('ItemManagement', 'ApiAttribute');
|
||||
|
||||
/** @var \Modules\Attribute\Models\AttributeType[] $attributeTypes */
|
||||
$attributeTypes = ItemAttributeTypeMapper::getAll()->with('defaults')->execute();
|
||||
|
|
@ -246,7 +246,7 @@ final class Installer extends InstallerAbstract
|
|||
$l11nTypes = [];
|
||||
|
||||
/** @var \Modules\ItemManagement\Controller\ApiController $module */
|
||||
$module = $app->moduleManager->getModuleInstance('ItemManagement');
|
||||
$module = $app->moduleManager->get('ItemManagement');
|
||||
|
||||
foreach ($l11ns as $l11n) {
|
||||
$response = new HttpResponse();
|
||||
|
|
@ -287,7 +287,7 @@ final class Installer extends InstallerAbstract
|
|||
$relations = [];
|
||||
|
||||
/** @var \Modules\ItemManagement\Controller\ApiController $module */
|
||||
$module = $app->moduleManager->getModuleInstance('ItemManagement');
|
||||
$module = $app->moduleManager->get('ItemManagement');
|
||||
|
||||
foreach ($rels as $rel) {
|
||||
$response = new HttpResponse();
|
||||
|
|
@ -327,7 +327,7 @@ final class Installer extends InstallerAbstract
|
|||
$itemAttrType = [];
|
||||
|
||||
/** @var \Modules\ItemManagement\Controller\ApiAttributeController $module */
|
||||
$module = $app->moduleManager->getModuleInstance('ItemManagement', 'ApiAttribute');
|
||||
$module = $app->moduleManager->get('ItemManagement', 'ApiAttribute');
|
||||
|
||||
/** @var array $attribute */
|
||||
foreach ($attributes as $attribute) {
|
||||
|
|
@ -395,7 +395,7 @@ final class Installer extends InstallerAbstract
|
|||
$itemAttrValue = [];
|
||||
|
||||
/** @var \Modules\ItemManagement\Controller\ApiAttributeController $module */
|
||||
$module = $app->moduleManager->getModuleInstance('ItemManagement', 'ApiAttribute');
|
||||
$module = $app->moduleManager->get('ItemManagement', 'ApiAttribute');
|
||||
|
||||
foreach ($attributes as $attribute) {
|
||||
$itemAttrValue[$attribute['name']] = [];
|
||||
|
|
@ -468,7 +468,7 @@ final class Installer extends InstallerAbstract
|
|||
$itemMaterialType = [];
|
||||
|
||||
/** @var \Modules\ItemManagement\Controller\ApiController $module */
|
||||
$module = $app->moduleManager->getModuleInstance('ItemManagement', 'Api');
|
||||
$module = $app->moduleManager->get('ItemManagement', 'Api');
|
||||
|
||||
/** @var array $type */
|
||||
foreach ($types as $type) {
|
||||
|
|
|
|||
|
|
@ -18,6 +18,17 @@ use phpOMS\Account\PermissionType;
|
|||
use phpOMS\Router\RouteVerb;
|
||||
|
||||
return [
|
||||
'^.*/item/list(\?.*$|$)' => [
|
||||
[
|
||||
'dest' => '\Modules\ItemManagement\Controller\ApiController:apiItemListExport',
|
||||
'verb' => RouteVerb::GET,
|
||||
'permission' => [
|
||||
'module' => ApiController::NAME,
|
||||
'type' => PermissionType::READ,
|
||||
'state' => PermissionCategory::SALES_ITEM,
|
||||
],
|
||||
],
|
||||
],
|
||||
'^.*/item/find(\?.*$|$)' => [
|
||||
[
|
||||
'dest' => '\Modules\ItemManagement\Controller\ApiController:apiItemFind',
|
||||
|
|
|
|||
|
|
@ -57,6 +57,12 @@ use phpOMS\System\MimeType;
|
|||
* @license OMS License 2.0
|
||||
* @link https://jingga.app
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @todo Import item prices from csv/excel sheet
|
||||
* https://github.com/Karaka-Management/oms-ItemManagement/issues/15
|
||||
*
|
||||
* @todo Perform inflation increase on all items
|
||||
* https://github.com/Karaka-Management/oms-ItemManagement/issues/16
|
||||
*/
|
||||
final class ApiController extends Controller
|
||||
{
|
||||
|
|
@ -75,33 +81,79 @@ final class ApiController extends Controller
|
|||
*/
|
||||
public function apiItemFind(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void
|
||||
{
|
||||
// @question How to handle empty search?
|
||||
// 1. Return empty
|
||||
// 2. Return normal item list with default limit
|
||||
|
||||
/** @var BaseStringL11n[] $l11n */
|
||||
$l11n = ItemL11nMapper::getAll()
|
||||
->with('type')
|
||||
->where('type/title', ['name1', 'name2', 'name3'], 'IN')
|
||||
->where('language', $request->header->l11n->language)
|
||||
->where('description', '%' . ($request->getDataString('search') ?? '') . '%', 'LIKE')
|
||||
->where('type/title', ['internal_matchcodes'], 'IN')
|
||||
->where('language', $response->header->l11n->language)
|
||||
->where('content', '%' . ($request->getDataString('search') ?? '') . '%', 'LIKE')
|
||||
->limit($request->getDataInt('limit') ?? 50)
|
||||
->execute();
|
||||
|
||||
$items = [];
|
||||
foreach ($l11n as $item) {
|
||||
$items[] = $item->ref;
|
||||
if (empty($l11n)) {
|
||||
$l11n = ItemL11nMapper::getAll()
|
||||
->with('type')
|
||||
->where('type/title', ['name1', 'name2'], 'IN')
|
||||
->where('language', $response->header->l11n->language)
|
||||
->where('content', '%' . ($request->getDataString('search') ?? '') . '%', 'LIKE')
|
||||
->limit($request->getDataInt('limit') ?? 50)
|
||||
->execute();
|
||||
}
|
||||
|
||||
/** @var \Modules\ItemManagement\Models\Item[] $itemList */
|
||||
$itemList = ItemMapper::getAll()
|
||||
->with('l11n')
|
||||
->with('l11n/type')
|
||||
->where('id', $items, 'IN')
|
||||
->where('l11n/type/title', ['name1', 'name2', 'name3'], 'IN')
|
||||
->where('l11n/language', $request->header->l11n->language)
|
||||
->execute();
|
||||
if (empty($l11n)) {
|
||||
$searches = \explode(' ', $request->getDataString('search') ?? '');
|
||||
foreach ($searches as $search) {
|
||||
$l11n = ItemL11nMapper::getAll()
|
||||
->with('type')
|
||||
->where('type/title', ['internal_matchcodes'], 'IN')
|
||||
->where('language', $response->header->l11n->language)
|
||||
->where('content', '%' . $search . '%', 'LIKE')
|
||||
->limit($request->getDataInt('limit') ?? 50)
|
||||
->execute();
|
||||
|
||||
if (!empty($l11n)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($l11n)) {
|
||||
foreach ($searches as $search) {
|
||||
$l11n = ItemL11nMapper::getAll()
|
||||
->with('type')
|
||||
->where('type/title', ['name1', 'name2'], 'IN')
|
||||
->where('language', $response->header->l11n->language)
|
||||
->where('content', '%' . $search . '%', 'LIKE')
|
||||
->limit($request->getDataInt('limit') ?? 50)
|
||||
->execute();
|
||||
|
||||
if (!empty($l11n)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$itemList = [];
|
||||
if (!empty($l11n)) {
|
||||
$itemIds = \array_map(function (BaseStringL11n $l) {
|
||||
return $l->ref;
|
||||
}, $l11n);
|
||||
|
||||
$itemList = ItemMapper::getAll()
|
||||
->with('l11n')
|
||||
->with('l11n/type')
|
||||
->where('l11n/type/title', ['name1', 'name2'], 'IN')
|
||||
->where('l11n/language', $request->header->l11n->language)
|
||||
->where('id', $itemIds, 'IN')
|
||||
->execute();
|
||||
}
|
||||
|
||||
$response->header->set('Content-Type', MimeType::M_JSON, true);
|
||||
$response->set(
|
||||
$request->uri->__toString(),
|
||||
\array_values($itemList)
|
||||
);
|
||||
$response->set($request->uri->__toString(), \array_values($itemList));
|
||||
|
||||
/*
|
||||
@todo BIG TODO.
|
||||
|
|
@ -112,7 +164,7 @@ final class ApiController extends Controller
|
|||
left join itemmgmt_item_l11n on itemmgmt_item.itemmgmt_item_id = itemmgmt_item_l11n.itemmgmt_item_l11n_item
|
||||
left join itemmgmt_item_l11n_type on itemmgmt_item_l11n.itemmgmt_item_l11n_typeref = itemmgmt_item_l11n_type.itemmgmt_item_l11n_type_id
|
||||
where
|
||||
itemmgmt_item_l11n_type.itemmgmt_item_l11n_type_title IN ("name1", "name2", "name3")
|
||||
itemmgmt_item_l11n_type.itemmgmt_item_l11n_type_title IN ("name1", "name2")
|
||||
AND itemmgmt_item_l11n.itemmgmt_item_l11n_lang = "en"
|
||||
AND itemmgmt_item_l11n.itemmgmt_item_l11n_description LIKE "%Doc%"
|
||||
|
||||
|
|
@ -135,6 +187,26 @@ final class ApiController extends Controller
|
|||
. (empty($item->number) ? $item->id : $item->number);
|
||||
}
|
||||
|
||||
public function apiItemListExport(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void
|
||||
{
|
||||
$items = [];
|
||||
|
||||
/** @var Item $item */
|
||||
foreach (ItemMapper::yield()->execute() as $item) {
|
||||
$items[] = [
|
||||
'id' => $item->id,
|
||||
'name1' => $item->getL11n('name1')->content,
|
||||
'name2' => $item->getL11n('name2')->content,
|
||||
];
|
||||
}
|
||||
|
||||
$report = new \Modules\Exchange\Models\Report();
|
||||
$report->data = $items;
|
||||
|
||||
$this->app->moduleManager->get('Exchange', 'Api')
|
||||
->apiExportReport($request, $response, $report, $request->getDataString('type') ?? 'csv');
|
||||
}
|
||||
|
||||
/**
|
||||
* Api method to create item
|
||||
*
|
||||
|
|
@ -203,6 +275,7 @@ final class ApiController extends Controller
|
|||
$internalRequest->setData('name', 'default');
|
||||
$internalRequest->setData('type', PriceType::PURCHASE);
|
||||
$internalRequest->setData('item', $item->id);
|
||||
$internalRequest->setData('supplier', $request->getDataInt('supplier'));
|
||||
$internalRequest->setData('price_new', $request->getDataString('purchaseprice') ?? 0);
|
||||
|
||||
$billing->apiPriceCreate($internalRequest, $internalResponse);
|
||||
|
|
@ -325,12 +398,12 @@ final class ApiController extends Controller
|
|||
$item->purchasePrice = new FloatInt($request->getDataString('purchaseprice') ?? 0);
|
||||
$item->info = $request->getDataString('info') ?? '';
|
||||
$item->parent = $request->getDataInt('parent');
|
||||
$item->unit = $request->getDataInt('unit');
|
||||
$item->unit = $request->getDataInt('unit') ?? $this->app->unitId;
|
||||
$item->status = ItemStatus::tryFromValue($request->getDataInt('status')) ?? ItemStatus::ACTIVE;
|
||||
|
||||
$container = new Container();
|
||||
$container->name = 'default';
|
||||
$container->quantity = \pow(10, FloatInt::MAX_DECIMALS);
|
||||
$container->quantity = FloatInt::DIVISOR;
|
||||
|
||||
$item->container[] = $container;
|
||||
|
||||
|
|
|
|||
|
|
@ -27,10 +27,12 @@ use Modules\ItemManagement\Models\ItemL11nTypeMapper;
|
|||
use Modules\ItemManagement\Models\ItemMapper;
|
||||
use Modules\ItemManagement\Models\MaterialTypeL11nMapper;
|
||||
use Modules\ItemManagement\Models\MaterialTypeMapper;
|
||||
use Modules\ItemManagement\Models\PermissionCategory;
|
||||
use Modules\Media\Models\MediaMapper;
|
||||
use Modules\Media\Models\MediaTypeMapper;
|
||||
use Modules\Organization\Models\Attribute\UnitAttributeMapper;
|
||||
use Modules\Organization\Models\UnitMapper;
|
||||
use phpOMS\Account\PermissionType;
|
||||
use phpOMS\Asset\AssetType;
|
||||
use phpOMS\Contract\RenderableInterface;
|
||||
use phpOMS\DataStorage\Database\Query\Builder;
|
||||
|
|
@ -51,6 +53,9 @@ use phpOMS\Views\View;
|
|||
* @link https://jingga.app
|
||||
* @since 1.0.0
|
||||
* @codeCoverageIgnore
|
||||
*
|
||||
* @feature Show additional important item information for sales/purchase, currently too controlling/stats focused.
|
||||
* https://github.com/Karaka-Management/oms-ItemManagement/issues/3
|
||||
*/
|
||||
final class BackendController extends Controller
|
||||
{
|
||||
|
|
@ -203,8 +208,9 @@ final class BackendController extends Controller
|
|||
->with('files')
|
||||
->with('files/types')
|
||||
->where('l11n/language', $response->header->l11n->language)
|
||||
->where('l11n/type/title', ['name1', 'name2', 'name3'], 'IN')
|
||||
->where('l11n/type/title', ['name1', 'name2'], 'IN')
|
||||
->where('files/types/name', 'item_profile_image')
|
||||
->where('unit', $this->app->unitId)
|
||||
->limit(50)
|
||||
->execute();
|
||||
|
||||
|
|
@ -381,9 +387,9 @@ final class BackendController extends Controller
|
|||
$head = $response->data['Content']->head;
|
||||
$nonce = $this->app->appSettings->getOption('script-nonce');
|
||||
|
||||
$head->addAsset(AssetType::CSS, 'Resources/chartjs/chart.css');
|
||||
$head->addAsset(AssetType::JSLATE, 'Resources/chartjs/chart.js', ['nonce' => $nonce]);
|
||||
$head->addAsset(AssetType::JSLATE, 'Modules/ItemManagement/Controller.js', ['nonce' => $nonce, 'type' => 'module']);
|
||||
$head->addAsset(AssetType::CSS, 'Resources/chartjs/chart.css?v=' . $this->app->version);
|
||||
$head->addAsset(AssetType::JSLATE, 'Resources/chartjs/chart.js?v=' . $this->app->version, ['nonce' => $nonce]);
|
||||
$head->addAsset(AssetType::JSLATE, 'Modules/ItemManagement/Controller.js?v=' . self::VERSION, ['nonce' => $nonce, 'type' => 'module']);
|
||||
|
||||
$view = new View($this->app->l11nManager, $request, $response);
|
||||
$view->setTemplate('/Modules/ItemManagement/Theme/Backend/item-view');
|
||||
|
|
@ -403,7 +409,7 @@ final class BackendController extends Controller
|
|||
//->with('attributes/value/l11n')
|
||||
->where('id', (int) $request->getData('id'))
|
||||
->where('l11n/language', $response->header->l11n->language)
|
||||
->where('l11n/type/title', ['name1', 'name2', 'name3'], 'IN')
|
||||
->where('l11n/type/title', ['name1', 'name2'], 'IN')
|
||||
->where('attributes/type/l11n/language', $response->header->l11n->language)
|
||||
//->where('attributes/value/l11n/language', $response->header->l11n->language)
|
||||
->execute();
|
||||
|
|
@ -471,6 +477,8 @@ final class BackendController extends Controller
|
|||
/** @var \Modules\Billing\Models\Price\Price[] */
|
||||
$view->data['prices'] = $view->data['hasBilling']
|
||||
? \Modules\Billing\Models\Price\PriceMapper::getAll()
|
||||
->with('supplier')
|
||||
->with('supplier/account')
|
||||
->where('item', $view->data['item']->id)
|
||||
->where('client', null)
|
||||
->execute()
|
||||
|
|
@ -512,12 +520,24 @@ final class BackendController extends Controller
|
|||
|
||||
$view->data['clientSegmentationTypes'] = $clientSegmentationTypes;
|
||||
|
||||
/** @var \Modules\Auditor\Models\Audit[] */
|
||||
$view->data['audits'] = AuditMapper::getAll()
|
||||
->where('type', StringUtils::intHash(ItemMapper::class))
|
||||
->where('module', 'ItemManagement')
|
||||
->where('ref', (string) $view->data['item']->id)
|
||||
->execute();
|
||||
$logs = [];
|
||||
if ($this->app->accountManager->get($request->header->account)->hasPermission(
|
||||
PermissionType::READ,
|
||||
$this->app->unitId,
|
||||
null,
|
||||
self::NAME,
|
||||
PermissionCategory::ITEM_LOG,
|
||||
)
|
||||
) {
|
||||
/** @var \Modules\Auditor\Models\Audit[] */
|
||||
$logs = AuditMapper::getAll()
|
||||
->where('type', StringUtils::intHash(ItemMapper::class))
|
||||
->where('module', 'ItemManagement')
|
||||
->where('ref', (string) $view->data['item']->id)
|
||||
->execute();
|
||||
}
|
||||
|
||||
$view->data['logs'] = $logs;
|
||||
|
||||
// @todo join audit with files, attributes, localization, prices, notes, ...
|
||||
|
||||
|
|
@ -602,9 +622,9 @@ final class BackendController extends Controller
|
|||
$head = $response->data['Content']->head;
|
||||
$nonce = $this->app->appSettings->getOption('script-nonce');
|
||||
|
||||
$head->addAsset(AssetType::CSS, 'Resources/chartjs/chart.css');
|
||||
$head->addAsset(AssetType::JSLATE, 'Resources/chartjs/chart.js', ['nonce' => $nonce]);
|
||||
$head->addAsset(AssetType::JSLATE, 'Modules/Sales/Controller/Controller.js', ['nonce' => $nonce, 'type' => 'module']);
|
||||
$head->addAsset(AssetType::CSS, 'Resources/chartjs/chart.css?v=' . $this->app->version);
|
||||
$head->addAsset(AssetType::JSLATE, 'Resources/chartjs/chart.js?v=' . $this->app->version, ['nonce' => $nonce]);
|
||||
$head->addAsset(AssetType::JSLATE, 'Modules/Sales/Controller/Controller.js?v=' . self::VERSION, ['nonce' => $nonce, 'type' => 'module']);
|
||||
|
||||
$view = new View($this->app->l11nManager, $request, $response);
|
||||
$view->setTemplate('/Modules/ItemManagement/Theme/Backend/item-analysis');
|
||||
|
|
|
|||
4
Docs/Help/de/SUMMARY.md
Normal file
4
Docs/Help/de/SUMMARY.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
# User Content
|
||||
|
||||
* [Attributes]({%}&page=Help/attributes)
|
||||
* [Localization]({%}&page=Help/localization)
|
||||
0
Docs/Help/de/accounting.md
Normal file
0
Docs/Help/de/accounting.md
Normal file
116
Docs/Help/de/attributes.md
Normal file
116
Docs/Help/de/attributes.md
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
# Attributes
|
||||
|
||||
## Default
|
||||
|
||||
The module automatically installs the following default attributes which can be set in the attribute tab in the respective item.
|
||||
|
||||
### General
|
||||
|
||||
| Attribute | Description | Internal default value |
|
||||
| --------- | ----------- | ---------------------- |
|
||||
| default_sales_container | Default sales container to be used | First container created for the item |
|
||||
| default_purchase_container | Default purchase container to be used | First container created for the item |
|
||||
| internal_item | Is the item only meant for internal purposes (e.g. cleaning utilities)? | |
|
||||
| bill_fees | Is special item on invoices (e.g. shipping cost, insurance fees, ...) | |
|
||||
| upc | Universal product code | |
|
||||
| hs_code | Harmonized system code (HS code) | |
|
||||
| hazmat | Hazardous material type | |
|
||||
| color | Item color | |
|
||||
| length | Item length | |
|
||||
| weight | Item weight | |
|
||||
| height | Item height | |
|
||||
| volume | Item volume | |
|
||||
| release_date | Date of first release | |
|
||||
| license | License type | |
|
||||
| it_platform | Is it platform | |
|
||||
| brand | Brand name | |
|
||||
| model | Model description | |
|
||||
| os | Operating system | |
|
||||
| os_version | Operating system version | |
|
||||
| dual_use | Is dual use item | |
|
||||
| contract | Contract id related to this item | |
|
||||
| subscription | Is item with subscription model | |
|
||||
| subscription_interval_types | Interval types of the subscription (e.g. monthly) | |
|
||||
| subscription_interval_value | Interval of the subscription | |
|
||||
| subscription_renewal_type | How does the subscription renew | |
|
||||
| subscription_interval_end | When does the subscription end? | |
|
||||
| one_click_pay_cc | One click payment link for credit card payment | |
|
||||
| one_click_pay_cc_id | One click id for credit card payment | |
|
||||
| one_click_pay_paypal | One click payment link for paypal payment | |
|
||||
| iso_keep_dry | Does the item need to be kept dry? | |
|
||||
| iso_temparature_lower_limit | Lowest temperature for storage/transportation | |
|
||||
| iso_temparature_upper_limit | Highest temperature for storage/transportation | |
|
||||
| iso_shelf_life | What is the shelf life in days? | |
|
||||
| country_of_origin | Country of origin | |
|
||||
| country_of_assembly | Country of assembly | |
|
||||
| country_of_last_processing | Country of last processing | |
|
||||
| consumablefor | Is consumable for other item? Id of item required | |
|
||||
| successorof | Is successor of other item? Id of item required | |
|
||||
| variantof | Is variant of other item? Id of item required | |
|
||||
| accessoryfor | Is accessory for other item? Id of item required | |
|
||||
| sparepartfor | Is sparepart for other item? Id of item required | |
|
||||
| isfamilyfriendly | Is familyfriendly item? | |
|
||||
| item_condition | Condition of the item (e.g. used) | |
|
||||
| gtin | GTIN | |
|
||||
| eu_medical_device_class | EU medical device class | |
|
||||
| fda_medical_regulatory_class | FDA medical regulatory class | |
|
||||
|
||||
### Categories
|
||||
|
||||
Items can be put in categories for horizontal and vertical grouping. By default the system uses segment->section->sales_group->product_group as categories as well as product_type. These categories also get used by other modules. Additional groups can be defined but are not used by other modules by default.
|
||||
|
||||
| Attribute | Description | Internal default value |
|
||||
| --------- | ----------- | ---------------------- |
|
||||
| segment | Level 1 | 1 |
|
||||
| section | Level 2 | 1 |
|
||||
| sales_group | Level 3 | 1 |
|
||||
| product_group | Level 4 | 1 |
|
||||
| product_type | **NOT** hierarchically but to the side (e.g. machine, consumable, spare part, ...) | 1 |
|
||||
|
||||
The following table shows an example item segmentation for the hierarchically categories:
|
||||
|
||||
| Level | > | > | > | > | > | > | Sample |
|
||||
| :---: | :-------------------: | :-------------------: | :-------------------: | :-------------------: | :-------------------: | :-------------------: | :-------------------: |
|
||||
| 1 | > | > | > | > | Segment 1 | > | Segment 2 |
|
||||
| 2 | > | > | Section 1.1 | > | Section 1.2 | > | Section 2.1 |
|
||||
| 3 | Sales Group 1.1.1 | > | Sales Group 1.1.2 | > | Sales Group 1.2.1 | Sales Group 2.1.1 | Sales Group 2.1.2 |
|
||||
| 4 | Product Group 1.1.1.1 | Product Group 1.1.2.1 | Product Group 1.1.2.2 | Product Group 1.2.1.1 | Product Group 1.2.1.2 | Product Group 2.1.1.1 | Product Group 2.1.2.1 |
|
||||
|
||||
> You could consider the item (number) itself `Level 5`.
|
||||
|
||||
### Purchase & Stock
|
||||
|
||||
| Attribute | Description | Internal default value |
|
||||
| --------- | ----------- | ---------------------- |
|
||||
| lead_time | Lead time in days for the procurement. Important for automatic order suggestions. | 3 days |
|
||||
| admin_time | Internal administration time in seconds needed **per quantity** until a delivered item becomes ready for sales (e.g. quality control). Important for automatic order suggestions. | 10 seconds |
|
||||
| maximum_stock_quantity | Maximum stock quantity to limit the automatic order suggestion. Only needed for certain algorithms. | |
|
||||
| minimum_stock_quantity | Minimum stock quantity that should always be in stock. Important for automatic order suggestions. Alternatively, see **minimum_stock_range**. | |
|
||||
| minimum_stock_range | Minimum stock range in days that should always be in stock. Important for automatic order suggestions. Alternatively, see **minimum_stock_quantity**. | 1 day |
|
||||
| minimum_order_quantity | Minimum order quantity when ordering. Important for automatic order suggestions. | |
|
||||
| order_quantity_steps | Minimum quantity increments above the minimum_order_quantity. This allows item purchases in increments of 10, 100 etc. Important for automatic order suggestions. | 1 |
|
||||
| order_suggestion_type | Coming soon | |
|
||||
| order_suggestion_optimization_type | Coming soon | |
|
||||
| order_suggestion_history_duration | Coming soon | |
|
||||
| order_suggestion_averaging_method | Coming soon | |
|
||||
| order_suggestion_comparison_duration_type | Coming soon | |
|
||||
| stock_evaluation_category | How should the item value for the stock evaluation be determined? | Average |
|
||||
|
||||
### Shop
|
||||
|
||||
| Attribute | Description | Internal default value |
|
||||
| --------- | ----------- | ---------------------- |
|
||||
| shop_item | Is the item used in a shop? | |
|
||||
| shop_featured | Is the item a featured item? | |
|
||||
| shop_front | Should the item be shown on the front page of the shop? | |
|
||||
| shop_external_link | Link for the item to an external website (e.g. manufacturer website) | |
|
||||
|
||||
### Accounting
|
||||
|
||||
| Attribute | Description | Internal default value |
|
||||
| --------- | ----------- | ---------------------- |
|
||||
| sales_tax_code | Tax code for sales | |
|
||||
| purchase_tax_code | Tax code for purchase | |
|
||||
| costcenter | Cost center for accounting | |
|
||||
| costobject | Cost object for accounting | |
|
||||
|
||||
54
Docs/Help/de/introduction.md
Normal file
54
Docs/Help/de/introduction.md
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
# Introduction
|
||||
|
||||
The **Item Management** module is an essential module for any ERP application. This module handles basic item management and is deeply integrated into **Billing** and **Warehouse Management**.
|
||||
|
||||
## Target Group
|
||||
|
||||
The target group for this module is anyone who wants to manage their tangible and non-tangible products.
|
||||
|
||||
# Setup
|
||||
|
||||
This module doesn't have any additional setup requirements and can be simply installed through the module interface.
|
||||
|
||||
# Features
|
||||
|
||||
## Item master file
|
||||
|
||||
The module provides basic item data management
|
||||
|
||||
* Attach documents to items
|
||||
* Write notes for items
|
||||
* Overview of most recent notes, documents, invoices and sales statistics (requires **Billing**)
|
||||
|
||||
## Localization
|
||||
|
||||
Localizations allow you to define item names and descriptions in multiple languages. You can also define custom text elements for external use (e.g. descriptions to be exported to other systems such as your own shop system).
|
||||
|
||||
## Attributes
|
||||
|
||||
Attributes allow you to define various item characteristics such as color, medical device class, segmentation, hazardous good, brand, model and many more.
|
||||
|
||||
## Pricing
|
||||
|
||||
By installing the **Billing** module you are can define multiple purchase and sales prices. Prices and discounts can be defined for individual items, customers and suppliers and for customer groups. You may also define quantity based prices.
|
||||
|
||||
## Procurement
|
||||
|
||||
Together with the **Purchase** module you can define stock levels, order conditions and delivery times for automated order suggestion calculations making it a breeze to ensure sufficient stocks.
|
||||
|
||||
## Accounting
|
||||
|
||||
Together with the **Accounting** module you can define cost center, cost object and taxes for every item.
|
||||
|
||||
## Stock
|
||||
|
||||
Together with the **Warehouse Management** module you can also track your stocks and
|
||||
|
||||
# Recommendation
|
||||
|
||||
Other modules that work great with this one together are:
|
||||
|
||||
* [Warehouse Management](WarehouseManagement)
|
||||
* [Supplier Management](SupplierManagement)
|
||||
* [Purchase](Purchase)
|
||||
* [Accounting](Accounting)
|
||||
14
Docs/Help/de/localization.md
Normal file
14
Docs/Help/de/localization.md
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
# Localization
|
||||
|
||||
## Default
|
||||
|
||||
The module automatically installs the following default localizations which can be set in the localization tab in the respective item.
|
||||
|
||||
* name1 - Primary item name
|
||||
* name2 - Secondary item name
|
||||
* info - Internal item info
|
||||
* internal_matchcodes - Match code for finding item based on a specific name or short description
|
||||
* description_short - Short item description
|
||||
* description_long - Long item description
|
||||
* shop_name1 - Primary item name for a shop system
|
||||
* shop_name2 - Secondary item name for a shop system
|
||||
0
Docs/Help/de/pricing.md
Normal file
0
Docs/Help/de/pricing.md
Normal file
0
Docs/Help/de/procurement.md
Normal file
0
Docs/Help/de/procurement.md
Normal file
0
Docs/Help/de/stock.md
Normal file
0
Docs/Help/de/stock.md
Normal file
4
Docs/Help/en/SUMMARY.md
Normal file
4
Docs/Help/en/SUMMARY.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
# User Content
|
||||
|
||||
* [Attributes]({%}&page=Help/attributes)
|
||||
* [Localization]({%}&page=Help/localization)
|
||||
0
Docs/Help/en/accounting.md
Normal file
0
Docs/Help/en/accounting.md
Normal file
116
Docs/Help/en/attributes.md
Normal file
116
Docs/Help/en/attributes.md
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
# Attributes
|
||||
|
||||
## Default
|
||||
|
||||
The module automatically installs the following default attributes which can be set in the attribute tab in the respective item.
|
||||
|
||||
### General
|
||||
|
||||
| Attribute | Description | Internal default value |
|
||||
| --------- | ----------- | ---------------------- |
|
||||
| default_sales_container | Default sales container to be used | First container created for the item |
|
||||
| default_purchase_container | Default purchase container to be used | First container created for the item |
|
||||
| internal_item | Is the item only meant for internal purposes (e.g. cleaning utilities)? | |
|
||||
| bill_fees | Is special item on invoices (e.g. shipping cost, insurance fees, ...) | |
|
||||
| upc | Universal product code | |
|
||||
| hs_code | Harmonized system code (HS code) | |
|
||||
| hazmat | Hazardous material type | |
|
||||
| color | Item color | |
|
||||
| length | Item length | |
|
||||
| weight | Item weight | |
|
||||
| height | Item height | |
|
||||
| volume | Item volume | |
|
||||
| release_date | Date of first release | |
|
||||
| license | License type | |
|
||||
| it_platform | Is it platform | |
|
||||
| brand | Brand name | |
|
||||
| model | Model description | |
|
||||
| os | Operating system | |
|
||||
| os_version | Operating system version | |
|
||||
| dual_use | Is dual use item | |
|
||||
| contract | Contract id related to this item | |
|
||||
| subscription | Is item with subscription model | |
|
||||
| subscription_interval_types | Interval types of the subscription (e.g. monthly) | |
|
||||
| subscription_interval_value | Interval of the subscription | |
|
||||
| subscription_renewal_type | How does the subscription renew | |
|
||||
| subscription_interval_end | When does the subscription end? | |
|
||||
| one_click_pay_cc | One click payment link for credit card payment | |
|
||||
| one_click_pay_cc_id | One click id for credit card payment | |
|
||||
| one_click_pay_paypal | One click payment link for paypal payment | |
|
||||
| iso_keep_dry | Does the item need to be kept dry? | |
|
||||
| iso_temparature_lower_limit | Lowest temperature for storage/transportation | |
|
||||
| iso_temparature_upper_limit | Highest temperature for storage/transportation | |
|
||||
| iso_shelf_life | What is the shelf life in days? | |
|
||||
| country_of_origin | Country of origin | |
|
||||
| country_of_assembly | Country of assembly | |
|
||||
| country_of_last_processing | Country of last processing | |
|
||||
| consumablefor | Is consumable for other item? Id of item required | |
|
||||
| successorof | Is successor of other item? Id of item required | |
|
||||
| variantof | Is variant of other item? Id of item required | |
|
||||
| accessoryfor | Is accessory for other item? Id of item required | |
|
||||
| sparepartfor | Is sparepart for other item? Id of item required | |
|
||||
| isfamilyfriendly | Is familyfriendly item? | |
|
||||
| item_condition | Condition of the item (e.g. used) | |
|
||||
| gtin | GTIN | |
|
||||
| eu_medical_device_class | EU medical device class | |
|
||||
| fda_medical_regulatory_class | FDA medical regulatory class | |
|
||||
|
||||
### Categories
|
||||
|
||||
Items can be put in categories for horizontal and vertical grouping. By default the system uses segment->section->sales_group->product_group as categories as well as product_type. These categories also get used by other modules. Additional groups can be defined but are not used by other modules by default.
|
||||
|
||||
| Attribute | Description | Internal default value |
|
||||
| --------- | ----------- | ---------------------- |
|
||||
| segment | Level 1 | 1 |
|
||||
| section | Level 2 | 1 |
|
||||
| sales_group | Level 3 | 1 |
|
||||
| product_group | Level 4 | 1 |
|
||||
| product_type | **NOT** hierarchically but to the side (e.g. machine, consumable, spare part, ...) | 1 |
|
||||
|
||||
The following table shows an example item segmentation for the hierarchically categories:
|
||||
|
||||
| Level | > | > | > | > | > | > | Sample |
|
||||
| :---: | :-------------------: | :-------------------: | :-------------------: | :-------------------: | :-------------------: | :-------------------: | :-------------------: |
|
||||
| 1 | > | > | > | > | Segment 1 | > | Segment 2 |
|
||||
| 2 | > | > | Section 1.1 | > | Section 1.2 | > | Section 2.1 |
|
||||
| 3 | Sales Group 1.1.1 | > | Sales Group 1.1.2 | > | Sales Group 1.2.1 | Sales Group 2.1.1 | Sales Group 2.1.2 |
|
||||
| 4 | Product Group 1.1.1.1 | Product Group 1.1.2.1 | Product Group 1.1.2.2 | Product Group 1.2.1.1 | Product Group 1.2.1.2 | Product Group 2.1.1.1 | Product Group 2.1.2.1 |
|
||||
|
||||
> You could consider the item (number) itself `Level 5`.
|
||||
|
||||
### Purchase & Stock
|
||||
|
||||
| Attribute | Description | Internal default value |
|
||||
| --------- | ----------- | ---------------------- |
|
||||
| lead_time | Lead time in days for the procurement. Important for automatic order suggestions. | 3 days |
|
||||
| admin_time | Internal administration time in seconds needed **per quantity** until a delivered item becomes ready for sales (e.g. quality control). Important for automatic order suggestions. | 10 seconds |
|
||||
| maximum_stock_quantity | Maximum stock quantity to limit the automatic order suggestion. Only needed for certain algorithms. | |
|
||||
| minimum_stock_quantity | Minimum stock quantity that should always be in stock. Important for automatic order suggestions. Alternatively, see **minimum_stock_range**. | |
|
||||
| minimum_stock_range | Minimum stock range in days that should always be in stock. Important for automatic order suggestions. Alternatively, see **minimum_stock_quantity**. | 1 day |
|
||||
| minimum_order_quantity | Minimum order quantity when ordering. Important for automatic order suggestions. | |
|
||||
| order_quantity_steps | Minimum quantity increments above the minimum_order_quantity. This allows item purchases in increments of 10, 100 etc. Important for automatic order suggestions. | 1 |
|
||||
| order_suggestion_type | Coming soon | |
|
||||
| order_suggestion_optimization_type | Coming soon | |
|
||||
| order_suggestion_history_duration | Coming soon | |
|
||||
| order_suggestion_averaging_method | Coming soon | |
|
||||
| order_suggestion_comparison_duration_type | Coming soon | |
|
||||
| stock_evaluation_category | How should the item value for the stock evaluation be determined? | Average |
|
||||
|
||||
### Shop
|
||||
|
||||
| Attribute | Description | Internal default value |
|
||||
| --------- | ----------- | ---------------------- |
|
||||
| shop_item | Is the item used in a shop? | |
|
||||
| shop_featured | Is the item a featured item? | |
|
||||
| shop_front | Should the item be shown on the front page of the shop? | |
|
||||
| shop_external_link | Link for the item to an external website (e.g. manufacturer website) | |
|
||||
|
||||
### Accounting
|
||||
|
||||
| Attribute | Description | Internal default value |
|
||||
| --------- | ----------- | ---------------------- |
|
||||
| sales_tax_code | Tax code for sales | |
|
||||
| purchase_tax_code | Tax code for purchase | |
|
||||
| costcenter | Cost center for accounting | |
|
||||
| costobject | Cost object for accounting | |
|
||||
|
||||
54
Docs/Help/en/introduction.md
Normal file
54
Docs/Help/en/introduction.md
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
# Introduction
|
||||
|
||||
The **Item Management** module is an essential module for any ERP application. This module handles basic item management and is deeply integrated into **Billing** and **Warehouse Management**.
|
||||
|
||||
## Target Group
|
||||
|
||||
The target group for this module is anyone who wants to manage their tangible and non-tangible products.
|
||||
|
||||
# Setup
|
||||
|
||||
This module doesn't have any additional setup requirements and can be simply installed through the module interface.
|
||||
|
||||
# Features
|
||||
|
||||
## Item master file
|
||||
|
||||
The module provides basic item data management
|
||||
|
||||
* Attach documents to items
|
||||
* Write notes for items
|
||||
* Overview of most recent notes, documents, invoices and sales statistics (requires **Billing**)
|
||||
|
||||
## Localization
|
||||
|
||||
Localizations allow you to define item names and descriptions in multiple languages. You can also define custom text elements for external use (e.g. descriptions to be exported to other systems such as your own shop system).
|
||||
|
||||
## Attributes
|
||||
|
||||
Attributes allow you to define various item characteristics such as color, medical device class, segmentation, hazardous good, brand, model and many more.
|
||||
|
||||
## Pricing
|
||||
|
||||
By installing the **Billing** module you are can define multiple purchase and sales prices. Prices and discounts can be defined for individual items, customers and suppliers and for customer groups. You may also define quantity based prices.
|
||||
|
||||
## Procurement
|
||||
|
||||
Together with the **Purchase** module you can define stock levels, order conditions and delivery times for automated order suggestion calculations making it a breeze to ensure sufficient stocks.
|
||||
|
||||
## Accounting
|
||||
|
||||
Together with the **Accounting** module you can define cost center, cost object and taxes for every item.
|
||||
|
||||
## Stock
|
||||
|
||||
Together with the **Warehouse Management** module you can also track your stocks and
|
||||
|
||||
# Recommendation
|
||||
|
||||
Other modules that work great with this one together are:
|
||||
|
||||
* [Warehouse Management](WarehouseManagement)
|
||||
* [Supplier Management](SupplierManagement)
|
||||
* [Purchase](Purchase)
|
||||
* [Accounting](Accounting)
|
||||
14
Docs/Help/en/localization.md
Normal file
14
Docs/Help/en/localization.md
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
# Localization
|
||||
|
||||
## Default
|
||||
|
||||
The module automatically installs the following default localizations which can be set in the localization tab in the respective item.
|
||||
|
||||
* name1 - Primary item name
|
||||
* name2 - Secondary item name
|
||||
* info - Internal item info
|
||||
* internal_matchcodes - Match code for finding item based on a specific name or short description
|
||||
* description_short - Short item description
|
||||
* description_long - Long item description
|
||||
* shop_name1 - Primary item name for a shop system
|
||||
* shop_name2 - Secondary item name for a shop system
|
||||
0
Docs/Help/en/pricing.md
Normal file
0
Docs/Help/en/pricing.md
Normal file
0
Docs/Help/en/procurement.md
Normal file
0
Docs/Help/en/procurement.md
Normal file
0
Docs/Help/en/stock.md
Normal file
0
Docs/Help/en/stock.md
Normal file
|
|
@ -185,7 +185,7 @@ final class ItemMapper extends DataMapperFactory
|
|||
left join itemmgmt_item_l11n_type
|
||||
on itemmgmt_item_l11n.itemmgmt_item_l11n_typeref = itemmgmt_item_l11n_type.itemmgmt_item_l11n_type_id
|
||||
where
|
||||
itemmgmt_item_l11n_type.itemmgmt_item_l11n_type_title in ('name1', 'name2', 'name3')
|
||||
itemmgmt_item_l11n_type.itemmgmt_item_l11n_type_title in ('name1', 'name2')
|
||||
and itemmgmt_item_l11n.itemmgmt_item_l11n_lang = :lang
|
||||
SQL;
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,9 @@ abstract class ItemStatus extends Enum
|
|||
{
|
||||
public const ACTIVE = 1;
|
||||
|
||||
public const INACTIVE = 2;
|
||||
public const DRAFT = 2;
|
||||
|
||||
public const PREVIEW = 3;
|
||||
public const INACTIVE = 3;
|
||||
|
||||
public const DISCONTINUED = 4;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,4 +37,6 @@ abstract class PermissionCategory extends Enum
|
|||
public const NOTE = 5;
|
||||
|
||||
public const MATERIAL = 6;
|
||||
|
||||
public const ITEM_LOG = 101;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ return ['ItemManagement' => [
|
|||
'Commission' => 'Kommission',
|
||||
'Container' => 'Container',
|
||||
'CostCenter' => 'Kostenstelle',
|
||||
'CostIndicator' => 'Kostenindikator',
|
||||
'CostIndicator' => 'Einkaufssteuerkennzeichen',
|
||||
'CostObject' => 'Kostenträger',
|
||||
'Countries' => 'Länder',
|
||||
'Country' => 'Land',
|
||||
|
|
@ -44,7 +44,7 @@ return ['ItemManagement' => [
|
|||
'DiscountP' => 'Rabatt in%',
|
||||
'Disposal' => 'Entsorgung',
|
||||
'Documents' => 'Unterlagen',
|
||||
'EarningIndicator' => 'Indikator verdienen',
|
||||
'EarningIndicator' => 'Verkaufssteuerkennzeichen',
|
||||
'End' => 'Ende',
|
||||
'Files' => 'Dateien',
|
||||
'General' => 'Allgemein',
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ return ['ItemManagement' => [
|
|||
'Material' => 'Material',
|
||||
'Container' => 'Container',
|
||||
'CostCenter' => 'CostCenter',
|
||||
'CostIndicator' => 'Cost Indicator',
|
||||
'CostIndicator' => 'Purchase tax code',
|
||||
'CostObject' => 'CostObject',
|
||||
'Countries' => 'Countries',
|
||||
'Country' => 'Country',
|
||||
|
|
@ -45,7 +45,7 @@ return ['ItemManagement' => [
|
|||
'DiscountP' => 'Discount in %',
|
||||
'Disposal' => 'Disposal',
|
||||
'Documents' => 'Documents',
|
||||
'EarningIndicator' => 'Earning Indicator',
|
||||
'EarningIndicator' => 'Sales tax code',
|
||||
'End' => 'End',
|
||||
'Files' => 'Files',
|
||||
'General' => 'General',
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-2" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-2' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Property'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -114,7 +114,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</form>
|
||||
</div>
|
||||
</section>
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Language'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -133,7 +133,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</form>
|
||||
</div>
|
||||
</section>
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Language'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -153,7 +153,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Attribute'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -172,7 +172,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</form>
|
||||
</div>
|
||||
</section>
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Language'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -191,7 +191,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</form>
|
||||
</div>
|
||||
</section>
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Language'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -213,7 +213,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-4" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-4' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Sales'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -255,7 +255,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Price'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -291,7 +291,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-5" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-5' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Purchase'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -324,7 +324,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Price'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -348,7 +348,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Stock'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -372,7 +372,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Supplier'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -390,7 +390,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-6" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-6' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Accounting'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -411,7 +411,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-7" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-7' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Production'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -441,7 +441,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-8" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-8' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('StockList'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -459,7 +459,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-9" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-9' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('QM'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -472,7 +472,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-10" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-10' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Packaging'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -504,7 +504,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-11" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-11' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Media'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -520,7 +520,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-12" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-12' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Stock'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -533,7 +533,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Stock'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -557,7 +557,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-13" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-13' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Disposal'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
@ -570,7 +570,7 @@ echo $this->data['nav']->render(); ?>
|
|||
</div>
|
||||
<input type="radio" id="c-tab-14" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-14' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<section class="box w-33 floatLeft">
|
||||
<section class="box w-33 lf">
|
||||
<header><h1><?= $this->getHtml('Files'); ?></h1></header>
|
||||
<div class="inner">
|
||||
<form action="<?= \phpOMS\Uri\UriFactory::build('{/api}...'); ?>" method="post">
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ echo $this->data['nav']->render(); ?>
|
|||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Name'); ?>
|
||||
<td class="wf-100"><?= $this->getHtml('Name'); ?>
|
||||
<label for="iSalesItemList-sort-5">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-5">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
|
|
@ -67,18 +67,6 @@ echo $this->data['nav']->render(); ?>
|
|||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td class="wf-100"><?= $this->getHtml('Name'); ?>
|
||||
<label for="iSalesItemList-sort-7">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-7">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-8">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-8">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Price'); ?>
|
||||
<label for="iSalesItemList-sort-9">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-9">
|
||||
|
|
@ -141,14 +129,13 @@ echo $this->data['nav']->render(); ?>
|
|||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->number); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name1')->content); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name2')->content); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name3')->content); ?></a>
|
||||
<td class="rightText"><a href="<?= $url; ?>"><?= $this->getCurrency($value->salesPrice, symbol: ''); ?></a>
|
||||
<td class="rT"><a href="<?= $url; ?>"><?= $this->getCurrency($value->salesPrice, symbol: ''); ?></a>
|
||||
<?php if ($value->stockIdentifier === StockIdentifierType::NONE) : ?>
|
||||
<td>
|
||||
<td>
|
||||
<td>
|
||||
<?php else : ?>
|
||||
<td class="rightText"><a href="<?= $url; ?>">
|
||||
<td class="rT"><a href="<?= $url; ?>">
|
||||
<?php
|
||||
$sum = 0;
|
||||
foreach ($this->data['dists'][$value->id] ?? [] as $dist) {
|
||||
|
|
@ -159,14 +146,14 @@ echo $this->data['nav']->render(); ?>
|
|||
echo $total->getAmount(\reset($value->container)->quantityDecimals);
|
||||
?></a>
|
||||
|
||||
<td class="rightText"><a href="<?= $url; ?>">
|
||||
<td class="rT"><a href="<?= $url; ?>">
|
||||
<?php
|
||||
$total = new FloatInt($this->data['reserved'][$value->id] ?? 0);
|
||||
|
||||
echo $total->getAmount(\reset($value->container)->quantityDecimals);
|
||||
?></a>
|
||||
|
||||
<td class="rightText"><a href="<?= $url; ?>">
|
||||
<td class="rT"><a href="<?= $url; ?>">
|
||||
<?php
|
||||
$total = new FloatInt($this->data['ordered'][$value->id] ?? 0);
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,8 @@ use phpOMS\Uri\UriFactory;
|
|||
/** @var \Modules\ItemManagement\Models\Item $item */
|
||||
$item = $this->data['item'];
|
||||
|
||||
$logs = $this->data['logs'] ?? [];
|
||||
|
||||
$notes = $item->notes;
|
||||
$files = $item->files;
|
||||
$itemImage = $this->getData('itemImage') ?? new NullMedia();
|
||||
|
|
@ -66,7 +68,7 @@ echo $this->data['nav']->render();
|
|||
<li><label for="c-tab-12"><?= $this->getHtml('Notes'); ?></label>
|
||||
<li><label for="c-tab-13"><?= $this->getHtml('Files'); ?></label>
|
||||
<li><label for="c-tab-14"><?= $this->getHtml('Bills'); ?></label>
|
||||
<li><label for="c-tab-15"><?= $this->getHtml('Logs'); ?></label>
|
||||
<?php if (!empty($logs)) : ?><li><label for="c-tab-15"><?= $this->getHtml('Logs'); ?></label><?php endif; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tab-content">
|
||||
|
|
@ -76,7 +78,7 @@ echo $this->data['nav']->render();
|
|||
<!-- If note warning exists -->
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<section class="portlet highlight-1">
|
||||
<section class="portlet hl-1">
|
||||
<div class="portlet-body"><?= $this->printHtml($warning->plain); ?></div>
|
||||
</section>
|
||||
</div>
|
||||
|
|
@ -95,8 +97,6 @@ echo $this->data['nav']->render();
|
|||
<tr><td><input type="text" id="iName1" name="name1" value="<?= $this->printHtml($item->getL11n('name1')->content); ?>" spellcheck="false" required>
|
||||
<tr><td><label for="iName2"><?= $this->getHtml('Name2'); ?></label>
|
||||
<tr><td><input type="text" id="iName2" name="name2" value="<?= $this->printHtml($item->getL11n('name2')->content); ?>" spellcheck="false">
|
||||
<tr><td><label for="iName3"><?= $this->getHtml('Name3'); ?></label>
|
||||
<tr><td><input type="text" id="iName3" name="name3" value="<?= $this->printHtml($item->getL11n('name3')->content); ?>" spellcheck="false">
|
||||
</table>
|
||||
</div>
|
||||
<div class="portlet-foot">
|
||||
|
|
@ -115,7 +115,7 @@ echo $this->data['nav']->render();
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="portlet highlight-4">
|
||||
<section class="portlet hl-4">
|
||||
<div class="portlet-body">
|
||||
<textarea class="undecorated"></textarea>
|
||||
</div>
|
||||
|
|
@ -125,7 +125,7 @@ echo $this->data['nav']->render();
|
|||
<?php if ($this->data['hasBilling']) : ?>
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-lg-4">
|
||||
<section class="portlet highlight-7">
|
||||
<section class="portlet hl-7">
|
||||
<div class="portlet-body">
|
||||
<table class="wf-100">
|
||||
<tr><td><?= $this->getHtml('YTDSales'); ?>:
|
||||
|
|
@ -140,7 +140,7 @@ echo $this->data['nav']->render();
|
|||
</div>
|
||||
|
||||
<div class="col-xs-12 col-lg-4">
|
||||
<section class="portlet highlight-2">
|
||||
<section class="portlet hl-2">
|
||||
<div class="portlet-body">
|
||||
<table class="wf-100">
|
||||
<tr><td><?= $this->getHtml('LastOrder'); ?>:
|
||||
|
|
@ -155,7 +155,7 @@ echo $this->data['nav']->render();
|
|||
</div>
|
||||
|
||||
<div class="col-xs-12 col-lg-4">
|
||||
<section class="portlet highlight-3">
|
||||
<section class="portlet hl-3">
|
||||
<div class="portlet-body">
|
||||
<table class="wf-100">
|
||||
<tr><td><?= $this->getHtml('SalesPrice'); ?>:
|
||||
|
|
@ -536,9 +536,9 @@ echo $this->data['nav']->render();
|
|||
data-add-tpl="#itemContainerTable tbody .oms-add-tpl-itemContainer">
|
||||
<div class="portlet-head"><?= $this->getHtml('Container'); ?></div>
|
||||
<div class="portlet-body">
|
||||
<input id="iContainerId" class="hidden" name="id" type="number" data-tpl-text="/id" data-tpl-value="/id">
|
||||
<input id="iContainerItemId" class="hidden" name="item" type="text" value="<?= $item->id; ?>">
|
||||
<input id="iContainerItemType" class="hidden" name="type" type="text" value="<?= PriceType::SALES; ?>">
|
||||
<input id="iContainerId" class="vh" name="id" type="number" data-tpl-text="/id" data-tpl-value="/id">
|
||||
<input id="iContainerItemId" class="vh" name="item" type="text" value="<?= $item->id; ?>">
|
||||
<input id="iContainerItemType" class="vh" name="type" type="text" value="<?= PriceType::SALES; ?>">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="iContainerName"><?= $this->getHtml('Name'); ?></label>
|
||||
|
|
@ -577,8 +577,8 @@ echo $this->data['nav']->render();
|
|||
</div>
|
||||
<div class="portlet-foot">
|
||||
<input id="bPriceItemAdd" formmethod="put" type="submit" class="add-form" value="<?= $this->getHtml('Add', '0', '0'); ?>">
|
||||
<input id="bPriceItemSave" formmethod="post" type="submit" class="save-form hidden button save" value="<?= $this->getHtml('Update', '0', '0'); ?>">
|
||||
<input id="bPriceItemCancel" type="submit" class="cancel-form hidden button close" value="<?= $this->getHtml('Cancel', '0', '0'); ?>">
|
||||
<input id="bPriceItemSave" formmethod="post" type="submit" class="save-form vh button save" value="<?= $this->getHtml('Update', '0', '0'); ?>">
|
||||
<input id="bPriceItemCancel" type="submit" class="cancel-form vh button close" value="<?= $this->getHtml('Cancel', '0', '0'); ?>">
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
|
@ -610,7 +610,7 @@ echo $this->data['nav']->render();
|
|||
<tr class="animated medium-duration greenCircleFade" data-id="" draggable="false">
|
||||
<td>
|
||||
<i class="g-icon btn update-form">settings</i>
|
||||
<input id="itemContainerTable-remove-0" type="checkbox" class="hidden">
|
||||
<input id="itemContainerTable-remove-0" type="checkbox" class="vh">
|
||||
<label for="itemContainerTable-remove-0" class="checked-visibility-alt"><i class="g-icon btn form-action">close</i></label>
|
||||
<span class="checked-visibility">
|
||||
<label for="itemContainerTable-remove-0" class="link default"><?= $this->getHtml('Cancel', '0', '0'); ?></label>
|
||||
|
|
@ -636,7 +636,7 @@ echo $this->data['nav']->render();
|
|||
<td>
|
||||
<i class="g-icon btn update-form">settings</i>
|
||||
<?php if ($value->name !== 'default') : ?>
|
||||
<input id="itemContainerTable-remove-<?= $value->id; ?>" type="checkbox" class="hidden">
|
||||
<input id="itemContainerTable-remove-<?= $value->id; ?>" type="checkbox" class="vh">
|
||||
<label for="itemContainerTable-remove-<?= $value->id; ?>" class="checked-visibility-alt"><i class="g-icon btn form-action">close</i></label>
|
||||
<span class="checked-visibility">
|
||||
<label for="itemContainerTable-remove-<?= $value->id; ?>" class="link default"><?= $this->getHtml('Cancel', '0', '0'); ?></label>
|
||||
|
|
@ -675,9 +675,9 @@ echo $this->data['nav']->render();
|
|||
data-add-tpl="#itemSalesPriceTable tbody .oms-add-tpl-itemSalesPrice">
|
||||
<div class="portlet-head"><?= $this->getHtml('Pricing'); ?></div>
|
||||
<div class="portlet-body">
|
||||
<input id="iPriceId" class="hidden" name="id" type="number" data-tpl-text="/id" data-tpl-value="/id">
|
||||
<input id="iPriceItemId" class="hidden" name="item" type="text" value="<?= $item->id; ?>">
|
||||
<input id="iPriceItemType" class="hidden" name="type" type="text" value="<?= PriceType::SALES; ?>">
|
||||
<input id="iPriceId" class="vh" name="id" type="number" data-tpl-text="/id" data-tpl-value="/id">
|
||||
<input id="iPriceItemId" class="vh" name="item" type="text" value="<?= $item->id; ?>">
|
||||
<input id="iPriceItemType" class="vh" name="type" type="text" value="<?= PriceType::SALES; ?>">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="iPriceName"><?= $this->getHtml('Name'); ?></label>
|
||||
|
|
@ -727,8 +727,8 @@ echo $this->data['nav']->render();
|
|||
|
||||
<div>
|
||||
<div class="form-group">
|
||||
<label for="iPriceDiscountP"><?= $this->getHtml('DiscountP'); ?></label>
|
||||
<input id="iPriceDiscountP" name="discountPercentage" type="number" data-tpl-text="/discountp" data-tpl-value="/discountp">
|
||||
<label for="iPriceDiscountR"><?= $this->getHtml('DiscountP'); ?></label>
|
||||
<input id="iPriceDiscountR" name="discountPercentage" type="number" data-tpl-text="/discountr" data-tpl-value="/discountr">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -889,8 +889,8 @@ echo $this->data['nav']->render();
|
|||
</div>
|
||||
<div class="portlet-foot">
|
||||
<input id="bPriceItemAdd" formmethod="put" type="submit" class="add-form" value="<?= $this->getHtml('Add', '0', '0'); ?>">
|
||||
<input id="bPriceItemSave" formmethod="post" type="submit" class="save-form hidden button save" value="<?= $this->getHtml('Update', '0', '0'); ?>">
|
||||
<input id="bPriceItemCancel" type="submit" class="cancel-form hidden button close" value="<?= $this->getHtml('Cancel', '0', '0'); ?>">
|
||||
<input id="bPriceItemSave" formmethod="post" type="submit" class="save-form vh button save" value="<?= $this->getHtml('Update', '0', '0'); ?>">
|
||||
<input id="bPriceItemCancel" type="submit" class="cancel-form vh button close" value="<?= $this->getHtml('Cancel', '0', '0'); ?>">
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
|
@ -934,7 +934,7 @@ echo $this->data['nav']->render();
|
|||
<tr class="animated medium-duration greenCircleFade" data-id="" draggable="false">
|
||||
<td>
|
||||
<i class="g-icon btn update-form">settings</i>
|
||||
<input id="itemSalesPriceTable-remove-0" type="checkbox" class="hidden">
|
||||
<input id="itemSalesPriceTable-remove-0" type="checkbox" class="vh">
|
||||
<label for="itemSalesPriceTable-remove-0" class="checked-visibility-alt"><i class="g-icon btn form-action">close</i></label>
|
||||
<span class="checked-visibility">
|
||||
<label for="itemSalesPriceTable-remove-0" class="link default"><?= $this->getHtml('Cancel', '0', '0'); ?></label>
|
||||
|
|
@ -947,7 +947,7 @@ echo $this->data['nav']->render();
|
|||
<td data-tpl-text="/currency" data-tpl-value="/currency"></td>
|
||||
<td data-tpl-text="/quantity" data-tpl-value="/quantity"></td>
|
||||
<td data-tpl-text="/discount" data-tpl-value="/discount"></td>
|
||||
<td data-tpl-text="/discountp" data-tpl-value="/discountp"></td>
|
||||
<td data-tpl-text="/discountr" data-tpl-value="/discountr"></td>
|
||||
<td data-tpl-text="/bonus" data-tpl-value="/bonus"></td>
|
||||
<td data-tpl-text="/item_segment" data-tpl-value="/item_segment"></td>
|
||||
<td data-tpl-text="/item_section" data-tpl-value="/item_section"></td>
|
||||
|
|
@ -975,7 +975,7 @@ echo $this->data['nav']->render();
|
|||
<td>
|
||||
<i class="g-icon btn update-form">settings</i>
|
||||
<?php if ($value->name !== 'default') : ?>
|
||||
<input id="itemSalesPriceTable-remove-<?= $value->id; ?>" type="checkbox" class="hidden">
|
||||
<input id="itemSalesPriceTable-remove-<?= $value->id; ?>" type="checkbox" class="vh">
|
||||
<label for="itemSalesPriceTable-remove-<?= $value->id; ?>" class="checked-visibility-alt"><i class="g-icon btn form-action">close</i></label>
|
||||
<span class="checked-visibility">
|
||||
<label for="itemSalesPriceTable-remove-<?= $value->id; ?>" class="link default"><?= $this->getHtml('Cancel', '0', '0'); ?></label>
|
||||
|
|
@ -989,7 +989,7 @@ echo $this->data['nav']->render();
|
|||
<td data-tpl-text="/currency" data-tpl-value="/currency"><?= $this->printHtml($value->currency); ?>
|
||||
<td data-tpl-text="/quantity" data-tpl-value="/quantity"><?= $value->quantity->getAmount(); ?>
|
||||
<td data-tpl-text="/discount" data-tpl-value="/discount"><?= $value->discount->getAmount(); ?>
|
||||
<td data-tpl-text="/discountp" data-tpl-value="/discountp"><?= $this->getPercentage($value->discountPercentage->value / 10000 / 100); ?>
|
||||
<td data-tpl-text="/discountr" data-tpl-value="/discountr"><?= $this->getPercentage($value->discountPercentage); ?>
|
||||
<td data-tpl-text="/bonus" data-tpl-value="/bonus"><?= $value->bonus->getAmount(); ?>
|
||||
<td data-tpl-text="/item_segment" data-tpl-value="/item_segment"><?= $this->printHtml((string) $value->itemsegment->getL11n()); ?>
|
||||
<td data-tpl-text="/item_section" data-tpl-value="/item_section"><?= $this->printHtml((string) $value->itemsection->getL11n()); ?>
|
||||
|
|
@ -1023,11 +1023,6 @@ echo $this->data['nav']->render();
|
|||
<form id="itemProcurementForm" action="<?= UriFactory::build('{/api}item/procurement'); ?>" method="post">
|
||||
<div class="portlet-head"><?= $this->getHtml('Procurement'); ?></div>
|
||||
<div class="portlet-body">
|
||||
<div class="form-group">
|
||||
<label for="iPName"><?= $this->getHtml('PrimarySupplier'); ?></label>
|
||||
<input id="iPName" name="pname" type="text" placeholder="">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="iPriceLeadTime"><?= $this->getHtml('LeadTime'); ?></label>
|
||||
<input id="iPriceLeadTime" name="leadtime" type="number" data-tpl-text="/leadtime" data-tpl-value="/leadtime">
|
||||
|
|
@ -1080,9 +1075,9 @@ echo $this->data['nav']->render();
|
|||
data-add-tpl="#itemPurchasePriceTable tbody .oms-add-tpl-itemPurchasePrice">
|
||||
<div class="portlet-head"><?= $this->getHtml('Pricing'); ?><i class="g-icon download btn end-xs">download</i></div>
|
||||
<div class="portlet-body">
|
||||
<input id="iPurchasePriceId" class="hidden" name="id" type="number" data-tpl-text="/id" data-tpl-value="/id">
|
||||
<input id="iPurchasePriceItemId" class="hidden" name="item" type="text" value="<?= $item->id; ?>">
|
||||
<input id="iPurchasePriceItemType" class="hidden" name="type" type="text" value="<?= PriceType::PURCHASE; ?>">
|
||||
<input id="iPurchasePriceId" class="vh" name="id" type="number" data-tpl-text="/id" data-tpl-value="/id">
|
||||
<input id="iPurchasePriceItemId" class="vh" name="item" type="text" value="<?= $item->id; ?>">
|
||||
<input id="iPurchasePriceItemType" class="vh" name="type" type="text" value="<?= PriceType::PURCHASE; ?>">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="iPurchasePriceName"><?= $this->getHtml('Name'); ?></label>
|
||||
|
|
@ -1133,7 +1128,7 @@ echo $this->data['nav']->render();
|
|||
<div>
|
||||
<div class="form-group">
|
||||
<label for="iPurchasePriceDiscountP"><?= $this->getHtml('DiscountP'); ?></label>
|
||||
<input id="iPurchasePriceDiscountP" name="discountPercentage" type="number" data-tpl-text="/discountp" data-tpl-value="/discountp">
|
||||
<input id="iPurchasePriceDiscountP" name="discountPercentage" type="number" data-tpl-text="/discountr" data-tpl-value="/discountr">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1196,7 +1191,7 @@ echo $this->data['nav']->render();
|
|||
<tr class="animated medium-duration greenCircleFade" data-id="" draggable="false">
|
||||
<td>
|
||||
<i class="g-icon btn update-form">settings</i>
|
||||
<input id="itemPurchasePriceTable-remove-0" type="checkbox" class="hidden">
|
||||
<input id="itemPurchasePriceTable-remove-0" type="checkbox" class="vh">
|
||||
<label for="itemPurchasePriceTable-remove-0" class="checked-visibility-alt"><i class="g-icon btn form-action">close</i></label>
|
||||
<span class="checked-visibility">
|
||||
<label for="itemPurchasePriceTable-remove-0" class="link default"><?= $this->getHtml('Cancel', '0', '0'); ?></label>
|
||||
|
|
@ -1209,7 +1204,7 @@ echo $this->data['nav']->render();
|
|||
<td data-tpl-text="/currency" data-tpl-value="/currency"></td>
|
||||
<td data-tpl-text="/quantity" data-tpl-value="/quantity"></td>
|
||||
<td data-tpl-text="/discount" data-tpl-value="/discount"></td>
|
||||
<td data-tpl-text="/discountp" data-tpl-value="/discountp"></td>
|
||||
<td data-tpl-text="/discountr" data-tpl-value="/discountr"></td>
|
||||
<td data-tpl-text="/bonus" data-tpl-value="/bonus"></td>
|
||||
<td data-tpl-text="/item_start" data-tpl-value="/item_start"></td>
|
||||
<td data-tpl-text="/item_end" data-tpl-value="/item_end"></td>
|
||||
|
|
@ -1227,7 +1222,7 @@ echo $this->data['nav']->render();
|
|||
<td>
|
||||
<i class="g-icon btn update-form">settings</i>
|
||||
<?php if ($value->name !== 'default') : ?>
|
||||
<input id="itemPurchasePriceTable-remove-<?= $value->id; ?>" type="checkbox" class="hidden">
|
||||
<input id="itemPurchasePriceTable-remove-<?= $value->id; ?>" type="checkbox" class="vh">
|
||||
<label for="itemPurchasePriceTable-remove-<?= $value->id; ?>" class="checked-visibility-alt"><i class="g-icon btn form-action">close</i></label>
|
||||
<span class="checked-visibility">
|
||||
<label for="itemPurchasePriceTable-remove-<?= $value->id; ?>" class="link default"><?= $this->getHtml('Cancel', '0', '0'); ?></label>
|
||||
|
|
@ -1241,7 +1236,7 @@ echo $this->data['nav']->render();
|
|||
<td data-tpl-text="/currency" data-tpl-value="/currency"><?= $this->printHtml($value->currency); ?>
|
||||
<td data-tpl-text="/quantity" data-tpl-value="/quantity"><?= $value->quantity->getAmount(); ?>
|
||||
<td data-tpl-text="/discount" data-tpl-value="/discount"><?= $value->discount->getAmount(); ?>
|
||||
<td data-tpl-text="/discountp" data-tpl-value="/discountp"><?= $this->getPercentage($value->discountPercentage->value / 10000 / 100); ?>
|
||||
<td data-tpl-text="/discountr" data-tpl-value="/discountr"><?= $this->getPercentage($value->discountPercentage); ?>
|
||||
<td data-tpl-text="/bonus" data-tpl-value="/bonus"><?= $value->bonus->getAmount(); ?>
|
||||
<td data-tpl-text="/item_start" data-tpl-value="/item_start"><?= $value->start?->format('Y-m-d'); ?>
|
||||
<td data-tpl-text="/item_end" data-tpl-value="/item_end"><?= $value->end?->format('Y-m-d'); ?>
|
||||
|
|
@ -1462,6 +1457,7 @@ echo $this->data['nav']->render();
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<?php if (!empty($logs)) : ?>
|
||||
<input type="radio" id="c-tab-15" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
|
|
@ -1493,11 +1489,10 @@ echo $this->data['nav']->render();
|
|||
<tbody>
|
||||
<?php
|
||||
$count = 0;
|
||||
$audits = $this->data['audits'] ?? [];
|
||||
$previous = empty($audits) ? HttpHeader::getAllHeaders()['Referer'] ?? 'admin/module/settings?id={?id}#{\#}' : 'admin/module/settings?{?}&audit=' . \reset($audits)->id . '&ptype=p#{\#}';
|
||||
$next = empty($audits) ? HttpHeader::getAllHeaders()['Referer'] ?? 'admin/module/settings?id={?id}#{\#}' : 'admin/module/settings?{?}&audit=' . \end($audits)->id . '&ptype=n#{\#}';
|
||||
$previous = empty($logs) ? HttpHeader::getAllHeaders()['Referer'] ?? 'admin/module/settings?id={?id}#{\#}' : 'admin/module/settings?{?}&audit=' . \reset($logs)->id . '&ptype=p#{\#}';
|
||||
$next = empty($logs) ? HttpHeader::getAllHeaders()['Referer'] ?? 'admin/module/settings?id={?id}#{\#}' : 'admin/module/settings?{?}&audit=' . \end($logs)->id . '&ptype=n#{\#}';
|
||||
|
||||
foreach ($audits as $key => $audit) : ++$count;
|
||||
foreach ($logs as $key => $audit) : ++$count;
|
||||
$url = UriFactory::build('{/base}/admin/audit/view?{?}&id=' . $audit->id); ?>
|
||||
<tr tabindex="0" data-href="<?= $url; ?>">
|
||||
<td><?= $audit->id; ?>
|
||||
|
|
@ -1522,5 +1517,6 @@ echo $this->data['nav']->render();
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,153 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Jingga
|
||||
*
|
||||
* PHP Version 8.1
|
||||
*
|
||||
* @package Modules\ItemManagement
|
||||
* @copyright Dennis Eichhorn
|
||||
* @license OMS License 2.0
|
||||
* @version 1.0.0
|
||||
* @link https://jingga.app
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
use phpOMS\Uri\UriFactory;
|
||||
|
||||
/** @var \phpOMS\Views\View $this */
|
||||
$items = $this->data['items'];
|
||||
|
||||
echo $this->data['nav']->render(); ?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Items'); ?><i class="g-icon download btn end-xs">download</i></div>
|
||||
<div class="slider">
|
||||
<table id="iPurchaseItemList" class="default sticky">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
<td><?= $this->getHtml('ID', '0', '0'); ?>
|
||||
<label for="iPurchaseItemList-sort-1">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-1">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iPurchaseItemList-sort-2">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-2">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Name'); ?>
|
||||
<label for="iPurchaseItemList-sort-3">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-3">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iPurchaseItemList-sort-4">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-4">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Name'); ?>
|
||||
<label for="iPurchaseItemList-sort-5">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-5">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iPurchaseItemList-sort-6">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-6">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td class="wf-100"><?= $this->getHtml('Name'); ?>
|
||||
<label for="iPurchaseItemList-sort-7">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-7">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iPurchaseItemList-sort-8">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-8">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Price'); ?>
|
||||
<label for="iPurchaseItemList-sort-9">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-9">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iPurchaseItemList-sort-10">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-10">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Available'); ?>
|
||||
<label for="iPurchaseItemList-sort-11">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-11">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iPurchaseItemList-sort-12">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-12">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Reserved'); ?>
|
||||
<label for="iPurchaseItemList-sort-13">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-13">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iPurchaseItemList-sort-14">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-14">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Ordered'); ?>
|
||||
<label for="iPurchaseItemList-sort-15">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-15">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iPurchaseItemList-sort-16">
|
||||
<input type="radio" name="iPurchaseItemList-sort" id="iPurchaseItemList-sort-16">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<tbody>
|
||||
<?php $count = 0; foreach ($items as $key => $value) : ++$count;
|
||||
$url = UriFactory::build('{/base}/purchase/item/view?{?}&id=' . $value->id);
|
||||
$image = $value->getFileByType('backend_image');
|
||||
?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="<?= $url; ?>"><img alt="<?= $this->getHtml('IMG_alt_item'); ?>" width="30" loading="lazy" class="item-image"
|
||||
src="<?= $image->id === 0 ?
|
||||
UriFactory::build('Web/Backend/img/user_default_' . \mt_rand(1, 6) .'.png') :
|
||||
UriFactory::build('{/base}/' . $image->getPath()); ?>"></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->number); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name1')->description); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name2')->description); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name3')->description); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->purchasePrice->getCurrency()); ?></a>
|
||||
<td>
|
||||
<td>
|
||||
<td>
|
||||
<?php endforeach; ?>
|
||||
<?php if ($count === 0) : ?>
|
||||
<tr><td colspan="9" class="empty"><?= $this->getHtml('Empty', '0', '0'); ?>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,155 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Jingga
|
||||
*
|
||||
* PHP Version 8.1
|
||||
*
|
||||
* @package Modules\ItemManagement
|
||||
* @copyright Dennis Eichhorn
|
||||
* @license OMS License 2.0
|
||||
* @version 1.0.0
|
||||
* @link https://jingga.app
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
use phpOMS\Uri\UriFactory;
|
||||
|
||||
/** @var \phpOMS\Views\View $this */
|
||||
/** @var \Modules\ItemManagement\Models\Item[] $items */
|
||||
$items = $this->data['items'];
|
||||
|
||||
echo $this->data['nav']->render(); ?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Items'); ?><i class="g-icon download btn end-xs">download</i></div>
|
||||
<div class="slider">
|
||||
<table id="iSalesItemList" class="default sticky">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
<td><?= $this->getHtml('ID', '0', '0'); ?>
|
||||
<label for="iSalesItemList-sort-1">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-1">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-2">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-2">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Name'); ?>
|
||||
<label for="iSalesItemList-sort-3">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-3">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-4">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-4">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Name'); ?>
|
||||
<label for="iSalesItemList-sort-5">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-5">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-6">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-6">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td class="wf-100"><?= $this->getHtml('Name'); ?>
|
||||
<label for="iSalesItemList-sort-7">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-7">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-8">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-8">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Price'); ?>
|
||||
<label for="iSalesItemList-sort-9">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-9">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-10">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-10">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Available'); ?>
|
||||
<label for="iSalesItemList-sort-11">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-11">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-12">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-12">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Reserved'); ?>
|
||||
<label for="iSalesItemList-sort-13">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-13">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-14">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-14">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Ordered'); ?>
|
||||
<label for="iSalesItemList-sort-15">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-15">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-16">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-16">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
|
||||
<tbody>
|
||||
<?php $count = 0; foreach ($items as $key => $value) : ++$count;
|
||||
$url = UriFactory::build('{/base}/sales/item/view?{?}&id=' . $value->id);
|
||||
$image = $value->getFileByTypeName('item_profile_image');
|
||||
?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="<?= $url; ?>"><img alt="<?= $this->getHtml('IMG_alt_item'); ?>" width="30" loading="lazy" class="item-image"
|
||||
src="<?= $image->id === 0 ?
|
||||
UriFactory::build('Web/Backend/img/user_default_' . \mt_rand(1, 6) .'.png') :
|
||||
UriFactory::build('{/base}/' . $image->getPath()); ?>"></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->number); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name1')->description); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name2')->description); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name3')->description); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->salesPrice->getCurrency()); ?></a>
|
||||
<td>
|
||||
<td>
|
||||
<td>
|
||||
<?php endforeach; ?>
|
||||
<?php if ($count === 0) : ?>
|
||||
<tr><td colspan="9" class="empty"><?= $this->getHtml('Empty', '0', '0'); ?>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,977 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Jingga
|
||||
*
|
||||
* PHP Version 8.1
|
||||
*
|
||||
* @package Modules\ItemManagement
|
||||
* @copyright Dennis Eichhorn
|
||||
* @license OMS License 2.0
|
||||
* @version 1.0.0
|
||||
* @link https://jingga.app
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
use phpOMS\Localization\ISO639Enum;
|
||||
use phpOMS\Localization\Money;
|
||||
use phpOMS\Localization\NullLocalization;
|
||||
use phpOMS\Uri\UriFactory;
|
||||
|
||||
/** @var \Modules\ItemManagement\Models\Item $item */
|
||||
$item = $this->data['item'];
|
||||
|
||||
$itemL11n = $item->getL11ns();
|
||||
$Attribute = $item->attributes;
|
||||
|
||||
$notes = $item->notes;
|
||||
$files = $item->files;
|
||||
|
||||
$newestInvoices = $this->data['newestInvoices'] ?? [];
|
||||
$allInvoices = $this->data['allInvoices'] ?? [];
|
||||
$topCustomers = $this->data['topCustomers'] ?? [];
|
||||
$regionSales = $this->data['regionSales'] ?? [];
|
||||
$countrySales = $this->data['countrySales'] ?? [];
|
||||
$monthlySalesCosts = $this->data['monthlySalesCosts'] ?? [];
|
||||
|
||||
$languages = ISO639Enum::getConstants();
|
||||
|
||||
/** @var \phpOMS\Localization\Localization $l11n */
|
||||
$l11n = $this->getData('default_localization') ?? new NullLocalization();
|
||||
|
||||
echo $this->data['nav']->render();
|
||||
?>
|
||||
|
||||
<div class="tabview tab-2">
|
||||
<div class="box">
|
||||
<ul class="tab-links">
|
||||
<li><label for="c-tab-1"><?= $this->getHtml('Profile'); ?></label>
|
||||
<li><label for="c-tab-2"><?= $this->getHtml('Address'); ?></label>
|
||||
<li><label for="c-tab-3"><?= $this->getHtml('Localization'); ?></label>
|
||||
<li><label for="c-tab-4"><?= $this->getHtml('Attributes'); ?></label>
|
||||
<li><label for="c-tab-5"><?= $this->getHtml('Sales'); ?></label>
|
||||
<li><label for="c-tab-6"><?= $this->getHtml('Purchasing'); ?></label>
|
||||
<li><label for="c-tab-7"><?= $this->getHtml('Production'); ?></label>
|
||||
<li><label for="c-tab-8"><?= $this->getHtml('QA'); ?></label>
|
||||
<li><label for="c-tab-9"><?= $this->getHtml('Packaging'); ?></label>
|
||||
<li><label for="c-tab-10"><?= $this->getHtml('Accounting'); ?></label>
|
||||
<li><label for="c-tab-11"><?= $this->getHtml('Stock'); ?></label>
|
||||
<li><label for="c-tab-12"><?= $this->getHtml('Disposal'); ?></label>
|
||||
<li><label for="c-tab-13"><?= $this->getHtml('Media'); ?></label>
|
||||
<li><label for="c-tab-14"><?= $this->getHtml('Bills'); ?></label>
|
||||
<li><label for="c-tab-15"><?= $this->getHtml('Logs'); ?></label>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tab-content">
|
||||
<input type="radio" id="c-tab-1" name="tabular-2"<?= $this->request->uri->fragment === 'c-tab-1' ? ' checked' : ''; ?>>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-lg-3 last-lg">
|
||||
<section class="portlet">
|
||||
<form>
|
||||
<div class="portlet-body">
|
||||
<table class="layout wf-100">
|
||||
<tr><td><label for="iId"><?= $this->getHtml('ID', '0', '0'); ?></label>
|
||||
<tr><td><span class="input"><button type="button" formaction=""><i class="g-icon">book</i></button><input type="number" id="iId" min="1" name="id" value="<?= $this->printHtml($item->number); ?>" disabled></span>
|
||||
<tr><td><label for="iName1"><?= $this->getHtml('Name1'); ?></label>
|
||||
<tr><td><input type="text" id="iName1" name="name1" value="<?= $this->printHtml($item->getL11n('name1')->content); ?>" spellcheck="false" required>
|
||||
<tr><td><label for="iName2"><?= $this->getHtml('Name2'); ?></label>
|
||||
<tr><td><input type="text" id="iName2" name="name2" value="<?= $this->printHtml($item->getL11n('name2')->content); ?>" spellcheck="false">
|
||||
<tr><td><label for="iName3"><?= $this->getHtml('Name3'); ?></label>
|
||||
<tr><td><input type="text" id="iName3" name="name3" value="<?= $this->printHtml($item->getL11n('name3')->content); ?>" spellcheck="false">
|
||||
</table>
|
||||
</div>
|
||||
<div class="portlet-foot">
|
||||
<input type="submit" value="<?= $this->getHtml('Save', '0', '0'); ?>" name="save-item"> <input type="submit" value="<?= $this->getHtml('Delete', '0', '0'); ?>" name="delete-item">
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<?php $image = $item->getFileByType(0);
|
||||
if ($image->id > 0) : ?>
|
||||
<section class="portlet">
|
||||
<div class="portlet-body">
|
||||
<img alt="<?= $this->printHtml($image->name); ?>" width="100%" loading="lazy" class="item-image"
|
||||
src="<?= UriFactory::build('{/base}/' . $image->getPath()); ?>">
|
||||
</div>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
<section class="portlet highlight-4">
|
||||
<div class="portlet-body">
|
||||
<textarea class="undecorated"></textarea>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-xs-12 col-lg-9 plain-grid">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-lg-4">
|
||||
<section class="portlet highlight-1">
|
||||
<div class="portlet-body">
|
||||
<table class="wf-100">
|
||||
<tr><td><?= $this->getHtml('YTDSales'); ?>:
|
||||
<td><?= $this->getData('ytd')->getCurrency(); ?>
|
||||
<tr><td><?= $this->getHtml('MTDSales'); ?>:
|
||||
<td><?= $this->getData('mtd')->getCurrency(); ?>
|
||||
<tr><td><?= $this->getHtml('ILV'); ?>:
|
||||
<td>
|
||||
<tr><td><?= $this->getHtml('MRR'); ?>:
|
||||
<td>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-lg-4">
|
||||
<section class="portlet highlight-2">
|
||||
<div class="portlet-body">
|
||||
<table class="wf-100">
|
||||
<tr><td><?= $this->getHtml('LastOrder'); ?>:
|
||||
<td><?= $this->getData('lastOrder') !== null ? $this->getData('lastOrder')->format('Y-m-d H:i') : ''; ?>
|
||||
<tr><td><?= $this->getHtml('PriceChange'); ?>:
|
||||
<td>
|
||||
<tr><td><?= $this->getHtml('Created'); ?>:
|
||||
<td><?= $item->createdAt->format('Y-m-d H:i'); ?>
|
||||
<tr><td><?= $this->getHtml('Modified'); ?>:
|
||||
<td>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-lg-4">
|
||||
<section class="portlet highlight-3">
|
||||
<div class="portlet-body">
|
||||
<table class="wf-100">
|
||||
<tr><td><?= $this->getHtml('SalesPrice'); ?>:
|
||||
<td><?= $item->salesPrice->getAmount(); ?>
|
||||
<tr><td><?= $this->getHtml('PurchasePrice'); ?>:
|
||||
<td><?= $item->purchasePrice->getAmount(); ?>
|
||||
<tr><td><?= $this->getHtml('Margin'); ?>:
|
||||
<td><?= $item->salesPrice->getInt() === 0
|
||||
? '0.00'
|
||||
: \round(($item->salesPrice->getInt() - $item->purchasePrice->getInt()) / $item->salesPrice->getInt() * 100, 2); ?> %
|
||||
<tr><td><?= $this->getHtml('AvgPrice'); ?>:
|
||||
<td><?= $this->getData('avg')->getCurrency(); ?>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Notes'); ?></div>
|
||||
<div class="slider">
|
||||
<table id="iNotesItemList" class="default sticky">
|
||||
<thead>
|
||||
<tr>
|
||||
<td class="wf-100"><?= $this->getHtml('Title'); ?>
|
||||
<td><?= $this->getHtml('CreatedAt'); ?>
|
||||
<tbody>
|
||||
<?php foreach ($notes as $note) :
|
||||
$url = UriFactory::build('{/base}/editor/view?{?}&id=' . $note->id);
|
||||
?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($note->title); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($note->createdAt->format('Y-m-d')); ?></a>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Documents'); ?></div>
|
||||
<div class="slider">
|
||||
<table id="iFilesItemList" class="default sticky">
|
||||
<thead>
|
||||
<tr>
|
||||
<td class="wf-100"><?= $this->getHtml('Title'); ?>
|
||||
<td>
|
||||
<td><?= $this->getHtml('CreatedAt'); ?>
|
||||
<tbody>
|
||||
<?php foreach ($files as $file) :
|
||||
$url = UriFactory::build('{/base}/media/view?{?}&id=' . $file->id);
|
||||
?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($file->name); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($file->extension); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($file->createdAt->format('Y-m-d')); ?></a>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('RecentInvoices'); ?></div>
|
||||
<div class="slider">
|
||||
<table id="iSalesItemList" class="default sticky">
|
||||
<thead>
|
||||
<tr>
|
||||
<td><?= $this->getHtml('Number'); ?>
|
||||
<td><?= $this->getHtml('Type'); ?>
|
||||
<td class="wf-100"><?= $this->getHtml('Name'); ?>
|
||||
<td><?= $this->getHtml('Net'); ?>
|
||||
<td><?= $this->getHtml('Date'); ?>
|
||||
<tbody>
|
||||
<?php
|
||||
/** @var \Modules\Billing\Models\Bill $invoice */
|
||||
foreach ($newestInvoices as $invoice) :
|
||||
$url = UriFactory::build('{/base}/sales/bill?{?}&id=' . $invoice->id);
|
||||
?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($invoice->getNumber()); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($invoice->type->getL11n()); ?></a>
|
||||
<td><a class="content" href="<?= UriFactory::build('{/base}/sales/client/view?{?}&id=' . $invoice->client->id); ?>"><?= $this->printHtml($invoice->billTo); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($invoice->netSales->getAmount()); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($invoice->createdAt->format('Y-m-d')); ?></a>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-lg-6">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head">Top Customers</div>
|
||||
<table id="iSalesItemList" class="default sticky">
|
||||
<thead>
|
||||
<tr>
|
||||
<td><?= $this->getHtml('Number'); ?>
|
||||
<td class="wf-100"><?= $this->getHtml('Name'); ?>
|
||||
<td><?= $this->getHtml('Country'); ?>
|
||||
<td><?= $this->getHtml('Net'); ?>
|
||||
<tbody>
|
||||
<?php $i = -1; foreach ($topCustomers as $client) : ++$i;
|
||||
$url = UriFactory::build('{/base}/sales/client/view?id=' . $client->id);
|
||||
?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($client->number); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($client->profile->account->name1); ?> <?= $this->printHtml($client->profile->account->name2); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($client->mainAddress->country); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= (new Money((int) $topCustomers[1][$i]['net_sales']))->getCurrency(); ?></a>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-lg-6">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Sales'); ?></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": "<?= $this->getHtml('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": "<?= $this->getHtml('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": "<?= $this->getHtml('Margin'); ?> %"
|
||||
},
|
||||
"gridLines": {
|
||||
"display": false
|
||||
},
|
||||
"beginAtZero": true,
|
||||
"ticks": {
|
||||
"min": 0,
|
||||
"max": 100,
|
||||
"stepSize": 10
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}'></canvas>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-lg-6">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head">Regions</div>
|
||||
<div class="portlet-body">
|
||||
<canvas id="sales-region" data-chart='{
|
||||
"type": "pie",
|
||||
"data": {
|
||||
"labels": [
|
||||
"Europe", "America", "Asia", "Africa", "CIS", "Other"
|
||||
],
|
||||
"datasets": [{
|
||||
"data": [
|
||||
<?= (int) ($regionSales['Europe'] ?? 0) / 1000; ?>,
|
||||
<?= (int) ($regionSales['America'] ?? 0) / 1000; ?>,
|
||||
<?= (int) ($regionSales['Asia'] ?? 0) / 1000; ?>,
|
||||
<?= (int) ($regionSales['Africa'] ?? 0) / 1000; ?>,
|
||||
<?= (int) ($regionSales['CIS'] ?? 0) / 1000; ?>,
|
||||
<?= (int) ($regionSales['Other'] ?? 0) / 1000; ?>
|
||||
],
|
||||
"backgroundColor": [
|
||||
"rgb(255, 99, 132)",
|
||||
"rgb(255, 159, 64)",
|
||||
"rgb(255, 205, 86)",
|
||||
"rgb(75, 192, 192)",
|
||||
"rgb(54, 162, 235)",
|
||||
"rgb(153, 102, 255)"
|
||||
]
|
||||
}]
|
||||
}
|
||||
}'></canvas>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-lg-6">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Countries'); ?></div>
|
||||
<div class="portlet-body">
|
||||
<canvas id="sales-region" data-chart='{
|
||||
"type": "bar",
|
||||
"data": {
|
||||
"labels": [
|
||||
<?= '"' . \implode('", "', \array_keys($countrySales)) . '"'; ?>
|
||||
],
|
||||
"datasets": [{
|
||||
"label": "YTD",
|
||||
"type": "bar",
|
||||
"data": [
|
||||
<?php
|
||||
$temp = [];
|
||||
foreach ($countrySales as $country) {
|
||||
$temp[] = ((int) $country) / 1000;
|
||||
}
|
||||
?>
|
||||
<?= \implode(',', $temp); ?>
|
||||
],
|
||||
"backgroundColor": "rgb(54, 162, 235)"
|
||||
}]
|
||||
}
|
||||
}'></canvas>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="radio" id="c-tab-2" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="portlet">
|
||||
<form id="item-edit" action="<?= UriFactory::build('{/api}itemmgmt/item'); ?>" method="post">
|
||||
<div class="portlet-head"><?= $this->getHtml('Description'); ?></div>
|
||||
<div class="portlet-body">
|
||||
<table class="layout wf-100">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><label for="iLanguages"><?= $this->getHtml('Language'); ?></label>
|
||||
<tr>
|
||||
<td>
|
||||
<select id="iLanguages" name="settings_1000000020">
|
||||
<?php foreach ($languages as $code => $language) : ?>
|
||||
<option value="<?= $this->printHtml($code); ?>" <?= $this->printHtml(\strtolower($code) === $l11n->language ? ' selected' : ''); ?>><?= $this->printHtml($language); ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<tr>
|
||||
<td><label for="iLanguages"><?= $this->getHtml('Type'); ?></label>
|
||||
<tr>
|
||||
<td>
|
||||
<select id="iLanguages" name="settings_1000000020">
|
||||
<?php foreach ($languages as $code => $language) : ?>
|
||||
<option value="<?= $this->printHtml($code); ?>" <?= $this->printHtml(\strtolower($code) === $l11n->language ? ' selected' : ''); ?>><?= $this->printHtml($language); ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<tr>
|
||||
<td><label for="iText1"><?= $this->getHtml('Text'); ?></label>
|
||||
<tr>
|
||||
<td><textarea id="iText1" name="text1"></textarea>
|
||||
</table>
|
||||
</div>
|
||||
<div class="portlet-foot"><input type="submit" value="<?= $this->getHtml('Add', '0', '0'); ?>"></div>
|
||||
</form>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Localizations'); ?><i class="g-icon download btn end-xs">download</i></div>
|
||||
<table id="groupTable" class="default sticky">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
<td><?= $this->getHtml('ID', '0', '0'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
|
||||
<td><?= $this->getHtml('Name'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
|
||||
<td class="wf-100"><?= $this->getHtml('Localization'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
|
||||
<tbody>
|
||||
<?php $c = 0;
|
||||
foreach ($itemL11n as $key => $value) : ++$c;
|
||||
$url = UriFactory::build('{/base}/admin/group/settings?{?}&id=' . $value->id); ?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="#"><i class="g-icon">close</i></a>
|
||||
<td><a href="<?= $url; ?>"><?= $value->id; ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->type->title); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->description); ?></a>
|
||||
<?php endforeach; ?>
|
||||
<?php if ($c === 0) : ?>
|
||||
<tr>
|
||||
<td colspan="5" class="empty"><?= $this->getHtml('Empty', '0', '0'); ?>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="radio" id="c-tab-3" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Attribute'); ?></div class="portlet-head">
|
||||
<div class="portlet-body">
|
||||
<form id="item-edit" action="<?= UriFactory::build('{/api}itemmgmt/item'); ?>" method="post">
|
||||
<table class="layout wf-100">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><label for="iLanguages"><?= $this->getHtml('Language'); ?></label>
|
||||
<tr>
|
||||
<td>
|
||||
<select id="iLanguages" name="settings_1000000020">
|
||||
<?php foreach ($languages as $code => $language) : ?>
|
||||
<option value="<?= $this->printHtml($code); ?>" <?= $this->printHtml(\strtolower($code) === $l11n->language ? ' selected' : ''); ?>><?= $this->printHtml($language); ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<tr>
|
||||
<td><label for="iLanguages"><?= $this->getHtml('Type'); ?></label>
|
||||
<tr>
|
||||
<td>
|
||||
<select id="iLanguages" name="settings_1000000020">
|
||||
<?php foreach ($languages as $code => $language) : ?>
|
||||
<option value="<?= $this->printHtml($code); ?>" <?= $this->printHtml(\strtolower($code) === $l11n->language ? ' selected' : ''); ?>><?= $this->printHtml($language); ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<tr>
|
||||
<td><label for="iLanguages"><?= $this->getHtml('Unit'); ?></label>
|
||||
<tr>
|
||||
<td>
|
||||
<select id="iLanguages" name="settings_1000000020">
|
||||
<?php foreach ($languages as $code => $language) : ?>
|
||||
<option value="<?= $this->printHtml($code); ?>" <?= $this->printHtml(\strtolower($code) === $l11n->language ? ' selected' : ''); ?>><?= $this->printHtml($language); ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<tr>
|
||||
<td><label for="iText1"><?= $this->getHtml('Value'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iName5" name="name5" type="text" value="<?= $this->printHtml($item->getL11n('name1')->content); ?>">
|
||||
<tr>
|
||||
<td><input type="submit" value="<?= $this->getHtml('Add', '0', '0'); ?>">
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Groups'); ?><i class="g-icon download btn end-xs">download</i></div>
|
||||
<table id="groupTable" class="default sticky">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
<td><?= $this->getHtml('ID', '0', '0'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
|
||||
<td><?= $this->getHtml('Name'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
|
||||
<td class="wf-100"><?= $this->getHtml('Name'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
|
||||
<tbody>
|
||||
<?php $c = 0;
|
||||
foreach ($Attribute as $key => $value) : ++$c;
|
||||
$url = UriFactory::build('{/base}/admin/group/settings?{?}&id=' . $value->id); ?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="#"><i class="g-icon">close</i></a>
|
||||
<td><a href="<?= $url; ?>"><?= $value->id; ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->type->getL11n()); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $value->value->getValue() instanceof \DateTime ? $value->value->getValue()->format('Y-m-d') : $this->printHtml((string) $value->value->getValue()); ?></a>
|
||||
<?php endforeach; ?>
|
||||
<?php if ($c === 0) : ?>
|
||||
<tr>
|
||||
<td colspan="5" class="empty"><?= $this->getHtml('Empty', '0', '0'); ?>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="radio" id="c-tab-4" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="box wf-100">
|
||||
<header>
|
||||
<h1><?= $this->getHtml('Pricing'); ?></h1>
|
||||
</header>
|
||||
<div class="inner">
|
||||
<form id="item-edit" action="<?= UriFactory::build('{/api}itemmgmt/item'); ?>" method="post">
|
||||
<table class="layout wf-100">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><label for="iCustomerGroup"><?= $this->getHtml('CustomerGroup'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iCustomerGroup" name="customergroup" type="text" value="<?= $this->printHtml(''); ?>">
|
||||
<tr>
|
||||
<td><label for="iGeneralPriceStart"><?= $this->getHtml('Start'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iGeneralPriceStart" name="generalpricestart" type="datetime-local" value="<?= $this->printHtml(''); ?>">
|
||||
<tr>
|
||||
<td><label for="iGeneralPriceEnd"><?= $this->getHtml('End'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iGeneralPriceEnd" name="generalpriceend" type="datetime-local" value="<?= $this->printHtml(''); ?>">
|
||||
<tr>
|
||||
<td><label for="iPQuantity"><?= $this->getHtml('Quantity'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iPQuantity" name="quantity" type="text" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iGeneralPrice"><?= $this->getHtml('Price'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iGeneralPrice" name="generalprice" type="number" step="0.0001" value="<?= $this->printHtml('0.00'); ?>">
|
||||
<!-- @todo maybe add promotion key/password here for online shop to provide special prices for certain customer groups -->
|
||||
<tr>
|
||||
<td><label for="iDiscount"><?= $this->getHtml('Discount'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iDiscount" name="discount" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iDiscount"><?= $this->getHtml('DiscountP'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iDiscountP" name="discountp" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iBonus"><?= $this->getHtml('Bonus'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iBonus" name="bonus" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><input type="submit" value="<?= $this->getHtml('Add', '0', '0'); ?>">
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Prices'); ?><i class="g-icon download btn end-xs">download</i></div>
|
||||
<table id="iSalesItemList" class="default sticky">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
<td><?= $this->getHtml('ID', '0', '0'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
|
||||
<td class="wf-100"><?= $this->getHtml('Name'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
|
||||
<tbody>
|
||||
<?php $c = 0;
|
||||
$l11ns = [];
|
||||
foreach ($l11ns as $key => $value) : ++$c;
|
||||
$url = UriFactory::build('{/base}/admin/group/settings?{?}&id=' . $value->id); ?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="#"><i class="g-icon">close</i></a>
|
||||
<td><a href="<?= $url; ?>"><?= $value->id; ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->name); ?></a>
|
||||
<?php endforeach; ?>
|
||||
<?php if ($c === 0) : ?>
|
||||
<tr>
|
||||
<td colspan="5" class="empty"><?= $this->getHtml('Empty', '0', '0'); ?>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="radio" id="c-tab-5" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-6 col-lg-4">
|
||||
<section class="box wf-100">
|
||||
<header>
|
||||
<h1><?= $this->getHtml('Purchase'); ?></h1>
|
||||
</header>
|
||||
<div class="inner">
|
||||
<form action="<?= UriFactory::build('{/api}...'); ?>" method="post">
|
||||
<table class="layout wf-100">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><label for="iPVariation"><?= $this->getHtml('Stock'); ?></label>
|
||||
<tr>
|
||||
<td><select id="iPVariation" name="pvariation">
|
||||
<option value="0">
|
||||
</select>
|
||||
<tr>
|
||||
<td><label for="iPName"><?= $this->getHtml('ReorderLevel'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iPName" name="pname" type="text" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iPName"><?= $this->getHtml('MinimumLevel'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iPName" name="pname" type="text" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iPName"><?= $this->getHtml('MaximumLevel'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iPName" name="pname" type="text" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iPName"><?= $this->getHtml('Leadtime'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iPName" name="pname" type="number" min="0" step="1" placeholder="">
|
||||
<tr>
|
||||
<td><input type="submit" value="<?= $this->getHtml('Save', '0', '0'); ?>" name="save-item">
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-md-6 col-lg-4">
|
||||
<section class="box wf-100">
|
||||
<header>
|
||||
<h1><?= $this->getHtml('Supplier'); ?></h1>
|
||||
</header>
|
||||
<div class="inner">
|
||||
<form id="item-edit" action="<?= UriFactory::build('{/api}itemmgmt/item'); ?>" method="post">
|
||||
<table class="layout wf-100">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><label for="iSupplierGroup"><?= $this->getHtml('ID'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iSupplierGroup" name="Suppliergroup" type="text" value="<?= $this->printHtml(''); ?>">
|
||||
<tr>
|
||||
<td><label for="iGeneralPriceStart"><?= $this->getHtml('Start'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iGeneralPriceStart" name="generalpricestart" type="datetime-local" value="<?= $this->printHtml(''); ?>">
|
||||
<tr>
|
||||
<td><label for="iGeneralPriceEnd"><?= $this->getHtml('End'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iGeneralPriceEnd" name="generalpriceend" type="datetime-local" value="<?= $this->printHtml(''); ?>">
|
||||
<tr>
|
||||
<td><label for="iPQuantity"><?= $this->getHtml('Quantity'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iPQuantity" name="quantity" type="text" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iGeneralPrice"><?= $this->getHtml('Price'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iGeneralPrice" name="generalprice" type="number" step="0.0001" value="<?= $this->printHtml('0.00'); ?>">
|
||||
<!-- @todo maybe add promotion key/password here for online shop to provide special prices for certain customer groups -->
|
||||
<tr>
|
||||
<td><label for="iDiscount"><?= $this->getHtml('Discount'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iDiscount" name="discount" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iDiscount"><?= $this->getHtml('DiscountP'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iDiscountP" name="discountp" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iBonus"><?= $this->getHtml('Bonus'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iBonus" name="bonus" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iPPriceUnit"><?= $this->getHtml('PriceUnit'); ?></label>
|
||||
<tr>
|
||||
<td><select id="iPPriceUnit" name="ppriceunit">
|
||||
<option value="0">
|
||||
</select>
|
||||
<tr>
|
||||
<td><label for="iPQuantityUnit"><?= $this->getHtml('QuantityUnit'); ?></label>
|
||||
<tr>
|
||||
<td><select id="iPQuantityUnit" name="pquantityunit">
|
||||
<option value="0">
|
||||
</select>
|
||||
<tr>
|
||||
<td><input type="submit" value="<?= $this->getHtml('Add', '0', '0'); ?>">
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-md-6 col-lg-4">
|
||||
<table id="groupTable" class="box table default">
|
||||
<caption><?= $this->getHtml('Prices'); ?><i class="g-icon end-xs download btn">download</i></caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
<td><?= $this->getHtml('ID', '0', '0'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
|
||||
<td class="wf-100"><?= $this->getHtml('Name'); ?><i class="sort-asc g-icon">expand_less</i><i class="sort-desc g-icon">expand_more</i>
|
||||
<tbody>
|
||||
<?php $c = 0;
|
||||
$l11ns = [];
|
||||
foreach ($l11ns as $key => $value) : ++$c;
|
||||
$url = UriFactory::build('{/base}/admin/group/settings?{?}&id=' . $value->id); ?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="#"><i class="g-icon">close</i></a>
|
||||
<td><a href="<?= $url; ?>"><?= $value->id; ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->name); ?></a>
|
||||
<?php endforeach; ?>
|
||||
<?php if ($c === 0) : ?>
|
||||
<tr>
|
||||
<td colspan="5" class="empty"><?= $this->getHtml('Empty', '0', '0'); ?>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="radio" id="c-tab-6" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
</div>
|
||||
</div>
|
||||
<input type="radio" id="c-tab-7" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
</div>
|
||||
</div>
|
||||
<input type="radio" id="c-tab-8" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="box wf-100">
|
||||
<header>
|
||||
<h1><?= $this->getHtml('General'); ?></h1>
|
||||
</header>
|
||||
<div class="inner">
|
||||
<form action="<?= UriFactory::build('{/api}...'); ?>" method="post">
|
||||
<table class="layout wf-100">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><label for="iPVariation"><?= $this->getHtml('Container'); ?></label>
|
||||
<tr>
|
||||
<td><select id="iPVariation" name="pvariation">
|
||||
<option value="0">
|
||||
</select>
|
||||
<tr>
|
||||
<td><label for="iDiscount"><?= $this->getHtml('Quantity'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iDiscount" name="discount" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iDiscount"><?= $this->getHtml('GrossWeight'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iDiscount" name="discount" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iDiscount"><?= $this->getHtml('NetWeight'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iDiscount" name="discount" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iDiscount"><?= $this->getHtml('Width'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iDiscount" name="discount" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iDiscount"><?= $this->getHtml('Height'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iDiscount" name="discount" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iDiscount"><?= $this->getHtml('Length'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iDiscount" name="discount" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><label for="iDiscount"><?= $this->getHtml('Volume'); ?></label>
|
||||
<tr>
|
||||
<td><input id="iDiscount" name="discount" type="number" step="any" min="0" placeholder="">
|
||||
<tr>
|
||||
<td><input type="submit" value="<?= $this->getHtml('Add', '0', '0'); ?>">
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="radio" id="c-tab-9" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="box wf-100">
|
||||
<header>
|
||||
<h1><?= $this->getHtml('General'); ?></h1>
|
||||
</header>
|
||||
<div class="inner">
|
||||
<form id="item-edit" action="<?= UriFactory::build('{/api}itemmgmt/item'); ?>" method="post">
|
||||
<table class="layout wf-100">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><label for="iEarningIndicator"><?= $this->getHtml('EarningIndicator'); ?></label>
|
||||
<tr>
|
||||
<td>
|
||||
<select id="iEarningIndicator" name="settings_1000000020">
|
||||
<?php foreach ($languages as $code => $language) : ?>
|
||||
<option value="<?= $this->printHtml($code); ?>" <?= $this->printHtml(\strtolower($code) === $l11n->language ? ' selected' : ''); ?>><?= $this->printHtml($language); ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<tr>
|
||||
<td><label for="iCostIndicator"><?= $this->getHtml('CostIndicator'); ?></label>
|
||||
<tr>
|
||||
<td>
|
||||
<select id="iCostIndicator" name="settings_1000000020">
|
||||
<?php foreach ($languages as $code => $language) : ?>
|
||||
<option value="<?= $this->printHtml($code); ?>" <?= $this->printHtml(\strtolower($code) === $l11n->language ? ' selected' : ''); ?>><?= $this->printHtml($language); ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<tr>
|
||||
<td><label for="iCostCenter"><?= $this->getHtml('CostCenter'); ?></label>
|
||||
<tr>
|
||||
<td>
|
||||
<select id="iCostCenter" name="settings_1000000020">
|
||||
<?php foreach ($languages as $code => $language) : ?>
|
||||
<option value="<?= $this->printHtml($code); ?>" <?= $this->printHtml(\strtolower($code) === $l11n->language ? ' selected' : ''); ?>><?= $this->printHtml($language); ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<tr>
|
||||
<td><label for="iCostObject"><?= $this->getHtml('CostObject'); ?></label>
|
||||
<tr>
|
||||
<td>
|
||||
<select id="iCostObject" name="settings_1000000020">
|
||||
<?php foreach ($languages as $code => $language) : ?>
|
||||
<option value="<?= $this->printHtml($code); ?>" <?= $this->printHtml(\strtolower($code) === $l11n->language ? ' selected' : ''); ?>><?= $this->printHtml($language); ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="radio" id="c-tab-10" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="radio" id="c-tab-11" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="radio" id="c-tab-12" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="radio" id="c-tab-13" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('RecentInvoices'); ?></div>
|
||||
<table id="iSalesItemList" class="default sticky">
|
||||
<thead>
|
||||
<tr>
|
||||
<td><?= $this->getHtml('Number'); ?>
|
||||
<td><?= $this->getHtml('Type'); ?>
|
||||
<td class="wf-100"><?= $this->getHtml('Name'); ?>
|
||||
<td><?= $this->getHtml('Net'); ?>
|
||||
<td><?= $this->getHtml('Date'); ?>
|
||||
<tbody>
|
||||
<?php
|
||||
/** @var \Modules\Billing\Models\Bill $invoice */
|
||||
foreach ($allInvoices as $invoice) :
|
||||
$url = UriFactory::build('{/base}/sales/bill?{?}&id=' . $invoice->id);
|
||||
?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="<?= $url; ?>"><?= $invoice->getNumber(); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $invoice->type->getL11n(); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $invoice->billTo; ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $invoice->netSales->getCurrency(); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $invoice->createdAt->format('Y-m-d'); ?></a>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="radio" id="c-tab-14" name="tabular-2" checked>
|
||||
<div class="tab">
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<table class="default sticky">
|
||||
<caption><?= $this->getHtml('Logs'); ?><i class="g-icon end-xs download btn">download</i></caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<td>IP
|
||||
<td><?= $this->getHtml('ID', '0', '0'); ?>
|
||||
<td><?= $this->getHtml('Name'); ?>
|
||||
<td class="wf-100"><?= $this->getHtml('Log'); ?>
|
||||
<td><?= $this->getHtml('Date'); ?>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><?= $this->printHtml($this->request->getOrigin()); ?>
|
||||
<td><?= $this->printHtml((string) $this->request->header->account); ?>
|
||||
<td><?= $this->printHtml((string) $this->request->header->account); ?>
|
||||
<td>Creating item
|
||||
<td><?= $this->printHtml((new \DateTime('now'))->format('Y-m-d H:i:s')); ?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,142 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Jingga
|
||||
*
|
||||
* PHP Version 8.1
|
||||
*
|
||||
* @package Modules\ItemManagement
|
||||
* @copyright Dennis Eichhorn
|
||||
* @license OMS License 2.0
|
||||
* @version 1.0.0
|
||||
* @link https://jingga.app
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
use phpOMS\Uri\UriFactory;
|
||||
|
||||
/** @var \phpOMS\Views\View $this */
|
||||
/** @var \Modules\ItemManagement\Models\Item[] $items */
|
||||
$items = $this->data['items'] ?? [];
|
||||
|
||||
echo $this->data['nav']->render(); ?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<section class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Items'); ?><i class="g-icon download btn end-xs">download</i></div>
|
||||
<div class="slider">
|
||||
<table id="iSalesItemList" class="default sticky">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
<td><?= $this->getHtml('Number'); ?>
|
||||
<label for="iSalesItemList-sort-1">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-1">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-2">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-2">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Name'); ?>
|
||||
<label for="iSalesItemList-sort-3">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-3">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-4">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-4">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Name'); ?>
|
||||
<label for="iSalesItemList-sort-5">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-5">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-6">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-6">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td class="wf-100"><?= $this->getHtml('Name'); ?>
|
||||
<label for="iSalesItemList-sort-7">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-7">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-8">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-8">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Available'); ?>
|
||||
<label for="iSalesItemList-sort-11">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-11">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-12">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-12">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Reserved'); ?>
|
||||
<label for="iSalesItemList-sort-13">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-13">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-14">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-14">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
<td><?= $this->getHtml('Ordered'); ?>
|
||||
<label for="iSalesItemList-sort-15">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-15">
|
||||
<i class="sort-asc g-icon">expand_less</i>
|
||||
</label>
|
||||
<label for="iSalesItemList-sort-16">
|
||||
<input type="radio" name="iSalesItemList-sort" id="iSalesItemList-sort-16">
|
||||
<i class="sort-desc g-icon">expand_more</i>
|
||||
</label>
|
||||
<label>
|
||||
<i class="filter g-icon">filter_alt</i>
|
||||
</label>
|
||||
|
||||
<tbody>
|
||||
<?php $count = 0; foreach ($items as $key => $value) : ++$count;
|
||||
$url = UriFactory::build('{/base}/item/view?{?}&id=' . $value->id);
|
||||
$image = $value->getFileByTypeName('item_profile_image');
|
||||
?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="<?= $url; ?>"><img alt="<?= $this->getHtml('IMG_alt_item'); ?>" width="30" loading="lazy" class="item-image"
|
||||
src="<?= $image->id === 0 ?
|
||||
'Web/Backend/img/logo_grey.png' :
|
||||
UriFactory::build($image->getPath()); ?>"></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->number); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name1')->description); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name2')->description); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $this->printHtml($value->getL11n('name3')->description); ?></a>
|
||||
<td>
|
||||
<td>
|
||||
<td>
|
||||
<?php endforeach; ?>
|
||||
<?php if ($count === 0) : ?>
|
||||
<tr><td colspan="9" class="empty"><?= $this->getHtml('Empty', '0', '0'); ?>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
Loading…
Reference in New Issue
Block a user