too many changes

This commit is contained in:
Dennis Eichhorn 2023-03-11 23:38:18 +01:00
parent f892ebcb7a
commit 72b3c3c2f1
22 changed files with 223 additions and 327 deletions

View File

@ -1,6 +1,6 @@
[
{
"name": "shop",
"name": "shop_item",
"l11n": {
"en": "Shop item",
"de": "Shop Artikel"
@ -59,6 +59,19 @@
}
]
},
{
"name": "shop_external_link",
"l11n": {
"en": "External shop link",
"de": "Externer Shop Link"
},
"value_type": 2,
"is_custom_allowed": true,
"validation_pattern": "",
"is_required": false,
"default_value": "",
"values": []
},
{
"name": "segment",
"l11n": {
@ -150,7 +163,7 @@
"en": "Bill fees",
"de": "Sonderkosten"
},
"value_type": 2,
"value_type": 1,
"is_custom_allowed": true,
"validation_pattern": "",
"is_required": false,
@ -164,6 +177,38 @@
}
]
},
{
"name": "sales_tax_code",
"l11n": {
"en": "Sales tax code",
"de": "USt. code"
},
"value_type": 2,
"is_custom_allowed": false,
"validation_pattern": "",
"is_required": true,
"default_value": "",
"values": [
{ "value": "SOFTWARE" },
{ "value": "SERVICE" }
]
},
{
"name": "purchase_tax_code",
"l11n": {
"en": "Purchse tax code",
"de": "VSt. code"
},
"value_type": 2,
"is_custom_allowed": false,
"validation_pattern": "",
"is_required": true,
"default_value": "",
"values": [
{ "value": "SOFTWARE" },
{ "value": "SERVICE" }
]
},
{
"name": "upc",
"l11n": {
@ -427,5 +472,70 @@
"is_required": false,
"default_value": "",
"values": []
},
{
"name": "download_link",
"l11n": {
"en": "Download link",
"de": "Download Link"
},
"value_type": 2,
"is_custom_allowed": true,
"validation_pattern": "",
"is_required": false,
"default_value": "",
"values": []
},
{
"name": "demo_link",
"l11n": {
"en": "Demo link",
"de": "Demo Link"
},
"value_type": 2,
"is_custom_allowed": true,
"validation_pattern": "",
"is_required": false,
"default_value": "",
"values": []
},
{
"name": "one_click_pay_cc",
"l11n": {
"en": "One Click CC payment link",
"de": "One Click CC Beyahllink"
},
"value_type": 2,
"is_custom_allowed": true,
"validation_pattern": "",
"is_required": false,
"default_value": "",
"values": []
},
{
"name": "one_click_pay_cc_id",
"l11n": {
"en": "One Click CC payment ID",
"de": "One Click CC Beyahl ID"
},
"value_type": 2,
"is_custom_allowed": true,
"validation_pattern": "",
"is_required": false,
"default_value": "",
"values": []
},
{
"name": "one_click_pay_paypal",
"l11n": {
"en": "One Click Paypal payment link",
"de": "One Click Paypal Beyahllink"
},
"value_type": 2,
"is_custom_allowed": true,
"validation_pattern": "",
"is_required": false,
"default_value": "",
"values": []
}
]

View File

@ -398,181 +398,6 @@
}
}
},
"itemmgmt_item_sales_price": {
"name": "itemmgmt_item_sales_price",
"fields": {
"itemmgmt_item_sales_price_id": {
"name": "itemmgmt_item_sales_price_id",
"type": "INT",
"null": false,
"primary": true,
"autoincrement": true
},
"itemmgmt_item_sales_price_name": {
"name": "itemmgmt_item_sales_price_name",
"type": "VARCHAR(255)",
"null": false
},
"itemmgmt_item_sales_price_currency": {
"name": "itemmgmt_item_sales_price_currency",
"type": "VARCHAR(3)",
"null": false,
"foreignTable": "currency",
"foreignKey": "currency_code"
},
"itemmgmt_item_sales_price_price": {
"name": "itemmgmt_item_sales_price_price",
"type": "INT(11)",
"null": false
},
"itemmgmt_item_sales_price_status": {
"name": "itemmgmt_item_sales_price_status",
"type": "TINYINT(1)",
"null": false
},
"itemmgmt_item_sales_price_minquantity": {
"name": "itemmgmt_item_sales_price_minquantity",
"type": "INT(11)",
"null": false
},
"itemmgmt_item_sales_price_relativediscount": {
"name": "itemmgmt_item_sales_price_relativediscount",
"type": "INT(11)",
"null": false
},
"itemmgmt_item_sales_price_absolutediscount": {
"name": "itemmgmt_item_sales_price_absolutediscount",
"type": "INT(11)",
"null": false
},
"itemmgmt_item_sales_price_relativeunitdiscount": {
"name": "itemmgmt_item_sales_price_relativeunitdiscount",
"type": "INT(11)",
"null": false
},
"itemmgmt_item_sales_price_absoluteunitdiscount": {
"name": "itemmgmt_item_sales_price_absoluteunitdiscount",
"type": "INT(11)",
"null": false
},
"itemmgmt_item_sales_price_start": {
"name": "itemmgmt_item_sales_price_start",
"type": "INT(11)",
"null": false
},
"itemmgmt_item_sales_price_end": {
"name": "itemmgmt_item_sales_price_end",
"type": "INT(11)",
"null": false
},
"itemmgmt_item_sales_price_promocode": {
"name": "itemmgmt_item_sales_price_promocode",
"type": "INT(11)",
"null": false
}
}
},
"itemmgmt_item_sales_price_relation": {
"name": "itemmgmt_item_sales_price_relation",
"fields": {
"itemmgmt_item_sales_price_relation_id": {
"name": "itemmgmt_item_sales_price_relation_id",
"type": "INT",
"null": false,
"primary": true,
"autoincrement": true
},
"itemmgmt_item_sales_price_relation_item": {
"name": "itemmgmt_item_sales_price_relation_item",
"type": "INT",
"null": true,
"default": null,
"foreignTable": "itemmgmt_item",
"foreignKey": "itemmgmt_item_id"
},
"itemmgmt_item_sales_price_relation_attr": {
"name": "itemmgmt_item_sales_price_relation_attr",
"type": "INT",
"null": true,
"default": null,
"foreignTable": "itemmgmt_attr_value",
"foreignKey": "itemmgmt_attr_value_id"
},
"itemmgmt_item_sales_price_relation_client": {
"name": "itemmgmt_item_sales_price_relation_client",
"type": "INT",
"null": true,
"default": null,
"foreignTable": "account",
"foreignKey": "account_id"
},
"itemmgmt_item_sales_price_relation_clientgroup": {
"name": "itemmgmt_item_sales_price_relation_clientgroup",
"type": "INT",
"null": true,
"default": null,
"foreignTable": "account",
"foreignKey": "account_id"
},
"itemmgmt_item_sales_price_relation_price": {
"name": "itemmgmt_item_sales_price_relation_price",
"type": "INT",
"null": true,
"default": null,
"foreignTable": "itemmgmt_item_sales_price",
"foreignKey": "itemmgmt_item_sales_price_id"
},
"itemmgmt_item_sales_price_relation_region": {
"name": "itemmgmt_item_sales_price_relation_region",
"type": "INT(11)",
"null": false
},
"itemmgmt_item_sales_price_relation_country": {
"name": "itemmgmt_item_sales_price_relation_country",
"type": "VARCHAR(2)",
"null": true,
"default": null,
"foreignTable": "country",
"foreignKey": "country_code2"
}
}
},
"itemmgmt_item_sales_price_history": {
"name": "itemmgmt_item_sales_price_history",
"fields": {
"itemmgmt_item_sales_price_history_id": {
"name": "itemmgmt_item_sales_price_history_id",
"type": "INT",
"null": false,
"primary": true,
"autoincrement": true
}
}
},
"itemmgmt_item_purchase_price": {
"name": "itemmgmt_item_purchase_price",
"fields": {
"itemmgmt_item_purchase_price_id": {
"name": "itemmgmt_item_purchase_price_id",
"type": "INT",
"null": false,
"primary": true,
"autoincrement": true
}
}
},
"itemmgmt_item_purchase_price_history": {
"name": "itemmgmt_item_purchase_price_history",
"fields": {
"itemmgmt_item_purchase_price_history_id": {
"name": "itemmgmt_item_purchase_price_history_id",
"type": "INT",
"null": false,
"primary": true,
"autoincrement": true
}
}
},
"itemmgmt_item_media": {
"name": "itemmgmt_item_media",
"fields": {

View File

@ -380,8 +380,8 @@ final class Installer extends InstallerAbstract
$request->header->account = 1;
$request->setData('value', $value['value'] ?? '');
$request->setData('unit', $value['unit'] ?? '');
$request->setData('default', isset($attribute['values']) && !empty($attribute['values']));
$request->setData('attributetype', $itemAttrType[$attribute['name']]['id']);
$request->setData('default', true); // always true since all defined values are possible default values
$request->setData('type', $itemAttrType[$attribute['name']]['id']);
if (isset($value['l11n']) && !empty($value['l11n'])) {
$request->setData('title', \reset($value['l11n']));

View File

@ -34,6 +34,7 @@ use Modules\ItemManagement\Models\ItemPrice;
use Modules\ItemManagement\Models\ItemPriceStatus;
use Modules\ItemManagement\Models\ItemRelationType;
use Modules\ItemManagement\Models\ItemRelationTypeMapper;
use Modules\ItemManagement\Models\ItemStatus;
use Modules\ItemManagement\Models\NullItemAttributeType;
use Modules\ItemManagement\Models\NullItemAttributeValue;
use Modules\ItemManagement\Models\NullItemL11nType;
@ -46,12 +47,16 @@ use phpOMS\Localization\BaseStringL11n;
use phpOMS\Localization\ISO4217CharEnum;
use phpOMS\Localization\ISO639x1Enum;
use phpOMS\Localization\Money;
use phpOMS\Message\Http\HttpRequest;
use phpOMS\Message\Http\HttpResponse;
use phpOMS\Message\Http\RequestStatusCode;
use phpOMS\Message\NotificationLevel;
use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\Model\Message\FormValidation;
use phpOMS\Module\NullModule;
use phpOMS\System\MimeType;
use phpOMS\Uri\HttpUri;
/**
* ItemManagement class.
@ -121,6 +126,21 @@ final class ApiController extends Controller
*/
}
/**
* Create media directory path
*
* @param Item $item Item
*
* @return string
*
* @since 1.0.0
*/
private function createItemDir(Item $item) : string
{
return '/Modules/ItemManagement/Item/'
. $item->getId();
}
/**
* Api method to create item
*
@ -149,8 +169,24 @@ final class ApiController extends Controller
$this->createModel($request->header->account, $item, ItemMapper::class, 'item', $request->getOrigin());
$this->app->dbPool->get()->con->commit();
if ($this->app->moduleManager->isActive('Billing')) {
$billing = $this->app->moduleManager->get('Billing');
$internalRequest = new HttpRequest(new HttpUri(''));
$internalResponse = new HttpResponse();
$internalRequest->header->account = $request->header->account;
$internalRequest->setData('name', 'base_price');
$internalRequest->setData('item', $item->getId());
$internalRequest->setData('price', $request->getData('salesprice', 'int') ?? 0);
$billing->apiPriceCreate($internalRequest, $internalResponse);
}
$this->createMediaDirForItem($item->number, $request->header->account);
$path = $this->createItemDir($item);
$uploadedFiles = $request->getFile('item_profile_image');
if (!empty($uploadedFiles)) {
// upload image
@ -159,8 +195,8 @@ final class ApiController extends Controller
fileNames: [],
files: $uploadedFiles,
account: $request->header->account,
basePath: __DIR__ . '/../../../Modules/Media/Files/Modules/ItemManagement/Items/' . $item->number,
virtualPath: '/Modules/ItemManagement/Items/' . $item->number,
basePath: __DIR__ . '/../../../Modules/Media/Files' . $path,
virtualPath: $path,
pathSettings: PathSettings::FILE_PATH
);
@ -235,6 +271,7 @@ final class ApiController extends Controller
$item->info = (string) ($request->getData('info') ?? '');
$item->parent = $request->getData('parent', 'int');
$item->unit = $request->getData('unit', 'int');
$item->setStatus((int) ($request->getData('status') ?? ItemStatus::ACTIVE));
return $item;
}
@ -364,6 +401,7 @@ final class ApiController extends Controller
$attribute = $this->createItemAttributeFromRequest($request);
$this->createModel($request->header->account, $attribute, ItemAttributeMapper::class, 'attribute', $request->getOrigin());
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Attribute', 'Attribute successfully created', $attribute);
}
@ -388,7 +426,7 @@ final class ApiController extends Controller
$newRequest = clone $request;
$newRequest->setData('value', $request->getData('custom'), true);
$value = $this->createItemAttributeValueFromRequest($request);
$value = $this->createItemAttributeValueFromRequest($newRequest);
$attribute->value = $value;
}
@ -442,7 +480,7 @@ final class ApiController extends Controller
$attrL11n = $this->createItemAttributeTypeL11nFromRequest($request);
$this->createModel($request->header->account, $attrL11n, ItemAttributeTypeL11nMapper::class, 'attr_type_l11n', $request->getOrigin());
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Attribute type localization', 'Attribute type localization successfully created', $attrL11n);
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Localization', 'Localization successfully created', $attrL11n);
}
/**
@ -667,7 +705,7 @@ final class ApiController extends Controller
$attrL11n = $this->createItemAttributeValueL11nFromRequest($request);
$this->createModel($request->header->account, $attrL11n, ItemAttributeValueL11nMapper::class, 'attr_value_l11n', $request->getOrigin());
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Attribute type localization', 'Attribute type localization successfully created', $attrL11n);
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Localization', 'Localization successfully created', $attrL11n);
}
/**
@ -736,7 +774,7 @@ final class ApiController extends Controller
$itemL11nType = $this->createItemL11nTypeFromRequest($request);
$this->createModel($request->header->account, $itemL11nType, ItemL11nTypeMapper::class, 'item_l11n_type', $request->getOrigin());
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Item localization type', 'Item localization type successfully created', $itemL11nType);
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Localization type', 'Localization type successfully created', $itemL11nType);
}
/**
@ -863,7 +901,7 @@ final class ApiController extends Controller
$itemL11n = $this->createItemL11nFromRequest($request);
$this->createModel($request->header->account, $itemL11n, ItemL11nMapper::class, 'item_l11n', $request->getOrigin());
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Item localization', 'Item localization successfully created', $itemL11n);
$this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Localization', 'Localization successfully created', $itemL11n);
}
/**
@ -941,13 +979,19 @@ final class ApiController extends Controller
return;
}
$item = ItemMapper::get()
->where('id', (int) $request->getData('item'))
->execute();
$path = $this->createItemDir($item);
$uploaded = $this->app->moduleManager->get('Media')->uploadFiles(
names: $request->getDataList('names'),
fileNames: $request->getDataList('filenames'),
files: $uploadedFiles,
account: $request->header->account,
basePath: __DIR__ . '/../../../Modules/Media/Files/Modules/ItemManagement/Items/' . ($request->getData('item') ?? '0'),
virtualPath: '/Modules/ItemManagement/Items/' . ($request->getData('item') ?? '0'),
basePath: __DIR__ . '/../../../Modules/Media/Files' . $path,
virtualPath: $path,
pathSettings: PathSettings::FILE_PATH
);

View File

@ -210,22 +210,7 @@ final class BackendController extends Controller
*/
public function viewItemManagementSalesList(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface
{
$view = new View($this->app->l11nManager, $request, $response);
$view->setTemplate('/Modules/ItemManagement/Theme/Backend/sales-item-list');
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004805001, $request, $response));
/** @var \Modules\ItemManagement\Models\Item[] $items */
$items = ItemMapper::getAll()
->with('l11n')
->with('l11n/type')
->where('l11n/language', $response->getLanguage())
->where('l11n/type/title', ['name1', 'name2', 'name3'], 'IN')
->limit(25)
->execute();
$view->addData('items', $items);
return $view;
return $this->viewItemManagementItemList($request, $response, $data);
}
/**
@ -242,21 +227,7 @@ final class BackendController extends Controller
*/
public function viewItemManagementPurchaseList(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface
{
$view = new View($this->app->l11nManager, $request, $response);
$view->setTemplate('/Modules/ItemManagement/Theme/Backend/purchase-item-list');
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004806001, $request, $response));
$items = ItemMapper::getAll()
->with('l11n')
->with('l11n/type')
->where('l11n/language', $response->getLanguage())
->where('l11n/type/title', ['name1', 'name2', 'name3'], 'IN')
->limit(25)
->execute();
$view->addData('items', $items);
return $view;
return $this->viewItemManagementItemList($request, $response, $data);
}
/**
@ -273,14 +244,7 @@ final class BackendController extends Controller
*/
public function viewItemManagementWarehousingList(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface
{
$view = new View($this->app->l11nManager, $request, $response);
$view->setTemplate('/Modules/ItemManagement/Theme/Backend/stock-item-list');
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004807001, $request, $response));
$items = ItemMapper::getAll()->execute();
$view->addData('items', $items);
return $view;
return $this->viewItemManagementItemList($request, $response, $data);
}
/**
@ -453,82 +417,7 @@ final class BackendController extends Controller
*/
public function viewItemManagementSalesItem(RequestAbstract $request, ResponseAbstract $response, $data = null) : View
{
$head = $response->get('Content')->getData('head');
$head->addAsset(AssetType::CSS, 'Resources/chartjs/Chartjs/chart.css');
$head->addAsset(AssetType::JSLATE, 'Resources/chartjs/Chartjs/chart.js');
$head->addAsset(AssetType::JSLATE, 'Modules/ItemManagement/Controller.js', ['type' => 'module']);
$view = new View($this->app->l11nManager, $request, $response);
$view->setTemplate('/Modules/ItemManagement/Theme/Backend/sales-item-profile');
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004805001, $request, $response));
/** @var \Modules\ItemManagement\Models\Item $item */
$item = ItemMapper::get()
->with('l11n')
->with('l11n/type')
->with('files')
->with('notes')
->where('id', (int) $request->getData('id'))
->where('l11n/language', $response->getLanguage())
->where('l11n/type/title', ['name1', 'name2', 'name3'], 'IN')
->limit(5, 'files')->sort('files/id', OrderType::DESC) // @todo: limit not working!!!
->limit(5, 'notes')->sort('notes/id', OrderType::DESC)
->execute();
$view->addData('item', $item);
/** @var \Model\Setting $settings */
$settings = $this->app->appSettings->get(null, [
SettingsEnum::DEFAULT_LOCALIZATION,
]);
$view->setData('defaultlocalization', LocalizationMapper::get()->where('id', (int) $settings->getId())->execute());
// stats
if ($this->app->moduleManager->isActive('Billing')) {
$ytd = SalesBillMapper::getSalesByItemId($item->getId(), new SmartDateTime('Y-01-01'), new SmartDateTime('now'));
$mtd = SalesBillMapper::getSalesByItemId($item->getId(), new SmartDateTime('Y-m-01'), new SmartDateTime('now'));
$avg = SalesBillMapper::getAvgSalesPriceByItemId($item->getId(), (new SmartDateTime('now'))->smartModify(-1), new SmartDateTime('now'));
$lastOrder = SalesBillMapper::getLastOrderDateByItemId($item->getId());
$newestInvoices = SalesBillMapper::getAll()
->with('type')
->where('type/transferType', BillTransferType::SALES)
->sort('id', OrderType::DESC)
->limit(5)
->execute();
$topCustomers = [];
$allInvoices = SalesBillMapper::getItemBills($item->getId(), new SmartDateTime('Y-01-01'), new SmartDateTime('now'));
$regionSales = SalesBillMapper::getItemRegionSales($item->getId(), new SmartDateTime('Y-01-01'), new SmartDateTime('now'));
$countrySales = SalesBillMapper::getItemCountrySales($item->getId(), new SmartDateTime('Y-01-01'), new SmartDateTime('now'), 5);
$monthlySalesCosts = SalesBillMapper::getItemMonthlySalesCosts($item->getId(), (new SmartDateTime('now'))->createModify(-1), new SmartDateTime('now'));
} else {
$ytd = new Money();
$mtd = new Money();
$avg = new Money();
$lastOrder = null;
$newestInvoices = [];
$allInvoices = [];
$topCustomers = [];
$regionSales = [];
$countrySales = [];
$monthlySalesCosts = [];
}
$view->addData('ytd', $ytd);
$view->addData('mtd', $mtd);
$view->addData('avg', $avg);
$view->addData('lastOrder', $lastOrder);
$view->addData('newestInvoices', $newestInvoices);
$view->addData('allInvoices', $allInvoices);
$view->addData('topCustomers', $topCustomers);
$view->addData('regionSales', $regionSales);
$view->addData('countrySales', $countrySales);
$view->addData('monthlySalesCosts', $monthlySalesCosts);
return $view;
return $this->viewItemManagementItemItem($request, $response, $data);
}
/**
@ -545,11 +434,7 @@ final class BackendController extends Controller
*/
public function viewItemManagementPurchaseItem(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface
{
$view = $this->viewItemManagementSalesItem($request, $response, $data);
$view->setTemplate('/Modules/ItemManagement/Theme/Backend/sales-item-profile');
$view->setData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004806001, $request, $response));
return $view;
return $this->viewItemManagementItemItem($request, $response, $data);
}
/**
@ -566,11 +451,7 @@ final class BackendController extends Controller
*/
public function viewItemManagementWarehouseItem(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface
{
$view = $this->viewItemManagementSalesItem($request, $response, $data);
$view->setTemplate('/Modules/ItemManagement/Theme/Backend/sales-item-profile');
$view->setData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1004806001, $request, $response));
return $view;
return $this->viewItemManagementItemItem($request, $response, $data);
}
/**

View File

@ -364,6 +364,27 @@ class Item implements \JsonSerializable
return new NullMedia();
}
/**
* Get all media files by type name
*
* @param string $type Media type
*
* @return Media[]
*
* @since 1.0.0
*/
public function getFilesByTypeName(string $type) : array
{
$files = [];
foreach ($this->files as $file) {
if ($file->hasMediaTypeName($type)) {
$files[] = $file;
}
}
return $files;
}
/**
* {@inheritdoc}
*/

View File

@ -70,5 +70,5 @@ final class ItemAttributeMapper extends DataMapperFactory
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD ='itemmgmt_item_attr_id';
public const PRIMARYFIELD = 'itemmgmt_item_attr_id';
}

View File

@ -117,6 +117,17 @@ class ItemAttributeType implements \JsonSerializable
return $this->id;
}
public function getDefaultByValue(mixed $value) : ItemAttributeValue
{
foreach ($this->defaults as $default) {
if ($default->getValue() === $value) {
return $default;
}
}
return new NullItemAttributeValue();
}
/**
* Set l11n
*

View File

@ -54,7 +54,7 @@ final class ItemAttributeTypeL11nMapper extends DataMapperFactory
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD ='itemmgmt_attr_type_l11n_id';
public const PRIMARYFIELD = 'itemmgmt_attr_type_l11n_id';
/**
* Model to use by the mapper.

View File

@ -78,5 +78,5 @@ final class ItemAttributeTypeMapper extends DataMapperFactory
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD ='itemmgmt_attr_type_id';
public const PRIMARYFIELD = 'itemmgmt_attr_type_id';
}

View File

@ -54,7 +54,7 @@ final class ItemAttributeValueL11nMapper extends DataMapperFactory
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD ='itemmgmt_attr_value_l11n_id';
public const PRIMARYFIELD = 'itemmgmt_attr_value_l11n_id';
/**
* Model to use by the mapper.

View File

@ -73,5 +73,5 @@ final class ItemAttributeValueMapper extends DataMapperFactory
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD ='itemmgmt_attr_value_id';
public const PRIMARYFIELD = 'itemmgmt_attr_value_id';
}

View File

@ -67,5 +67,5 @@ final class ItemL11nMapper extends DataMapperFactory
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD ='itemmgmt_item_l11n_id';
public const PRIMARYFIELD = 'itemmgmt_item_l11n_id';
}

View File

@ -52,5 +52,5 @@ final class ItemL11nTypeMapper extends DataMapperFactory
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD ='itemmgmt_item_l11n_type_id';
public const PRIMARYFIELD = 'itemmgmt_item_l11n_type_id';
}

View File

@ -59,7 +59,7 @@ final class ItemMapper extends DataMapperFactory
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD ='itemmgmt_item_id';
public const PRIMARYFIELD = 'itemmgmt_item_id';
/**
* Has many relation.

View File

@ -66,5 +66,5 @@ final class ItemRelationMapper extends DataMapperFactory
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD ='itemmgmt_item_relation_id';
public const PRIMARYFIELD = 'itemmgmt_item_relation_id';
}

View File

@ -51,5 +51,5 @@ final class ItemRelationTypeMapper extends DataMapperFactory
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD ='itemmgmt_item_relation_type_id';
public const PRIMARYFIELD = 'itemmgmt_item_relation_type_id';
}

View File

@ -29,4 +29,6 @@ abstract class ItemStatus extends Enum
public const ACTIVE = 1;
public const INACTIVE = 2;
public const PREVIEW = 3;
}

View File

@ -186,7 +186,7 @@ echo $this->getData('nav')->render();
<div class="col-xs-12 col-md-6">
<section class="portlet">
<div class="portlet-head"><?= $this->getHtml('Documents'); ?></div>
<div class="portlet-head"><?= $this->getHtml('Files'); ?></div>
<div class="slider">
<table id="iFilesItemList" class="default">
<thead>

View File

@ -148,7 +148,9 @@ echo $this->getData('nav')->render();
<tr><td><?= $this->getHtml('PurchasePrice'); ?>:
<td><?= $item->purchasePrice->getCurrency(); ?>
<tr><td><?= $this->getHtml('Margin'); ?>:
<td><?= \round(($item->salesPrice->getInt() - $item->purchasePrice->getInt()) / $item->salesPrice->getInt() * 100, 2); ?> %
<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>

View File

@ -1,6 +1,6 @@
{
"name": "karaka/karaka",
"description": "PHP Framework for Karaka.",
"description": "PHP Framework for Jingga.",
"authors": [
{
"name": "Dennis Eichhorn",

View File

@ -11,7 +11,7 @@
"phpOMS-db": "1.0.0"
},
"creator": {
"name": "Karaka",
"name": "Jingga",
"website": "jingga.app"
},
"description": "Event Management module.",