diff --git a/Admin/Install/attributes.json b/Admin/Install/attributes.json index ec9331a..89372d5 100755 --- a/Admin/Install/attributes.json +++ b/Admin/Install/attributes.json @@ -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": [] } ] \ No newline at end of file diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 87fcf51..56df95b 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -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": { diff --git a/Admin/Installer.php b/Admin/Installer.php index 6d97f40..8c57e20 100755 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -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'])); diff --git a/Controller/ApiController.php b/Controller/ApiController.php index f01897b..eb939b3 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -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 ); diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 46e5eda..b1ea7f7 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -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); } /** diff --git a/Models/Item.php b/Models/Item.php index 3095f65..bc480a6 100755 --- a/Models/Item.php +++ b/Models/Item.php @@ -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} */ diff --git a/Models/ItemAttributeMapper.php b/Models/ItemAttributeMapper.php index 8350534..b215a20 100755 --- a/Models/ItemAttributeMapper.php +++ b/Models/ItemAttributeMapper.php @@ -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'; } diff --git a/Models/ItemAttributeType.php b/Models/ItemAttributeType.php index 029b388..503fd2d 100755 --- a/Models/ItemAttributeType.php +++ b/Models/ItemAttributeType.php @@ -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 * diff --git a/Models/ItemAttributeTypeL11nMapper.php b/Models/ItemAttributeTypeL11nMapper.php index 9ff3ef9..4b40682 100755 --- a/Models/ItemAttributeTypeL11nMapper.php +++ b/Models/ItemAttributeTypeL11nMapper.php @@ -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. diff --git a/Models/ItemAttributeTypeMapper.php b/Models/ItemAttributeTypeMapper.php index 4bffd1f..59cac09 100755 --- a/Models/ItemAttributeTypeMapper.php +++ b/Models/ItemAttributeTypeMapper.php @@ -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'; } diff --git a/Models/ItemAttributeValueL11nMapper.php b/Models/ItemAttributeValueL11nMapper.php index 80e3ef1..cc778f9 100755 --- a/Models/ItemAttributeValueL11nMapper.php +++ b/Models/ItemAttributeValueL11nMapper.php @@ -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. diff --git a/Models/ItemAttributeValueMapper.php b/Models/ItemAttributeValueMapper.php index 4c5449d..9b6fcae 100755 --- a/Models/ItemAttributeValueMapper.php +++ b/Models/ItemAttributeValueMapper.php @@ -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'; } diff --git a/Models/ItemL11nMapper.php b/Models/ItemL11nMapper.php index 5fd4685..6ec57d5 100755 --- a/Models/ItemL11nMapper.php +++ b/Models/ItemL11nMapper.php @@ -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'; } diff --git a/Models/ItemL11nTypeMapper.php b/Models/ItemL11nTypeMapper.php index ee262b8..31e7259 100755 --- a/Models/ItemL11nTypeMapper.php +++ b/Models/ItemL11nTypeMapper.php @@ -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'; } diff --git a/Models/ItemMapper.php b/Models/ItemMapper.php index 6020cda..8245a5c 100755 --- a/Models/ItemMapper.php +++ b/Models/ItemMapper.php @@ -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. diff --git a/Models/ItemRelationMapper.php b/Models/ItemRelationMapper.php index c7f5746..a0485e2 100644 --- a/Models/ItemRelationMapper.php +++ b/Models/ItemRelationMapper.php @@ -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'; } diff --git a/Models/ItemRelationTypeMapper.php b/Models/ItemRelationTypeMapper.php index a4de905..9a3b7bd 100644 --- a/Models/ItemRelationTypeMapper.php +++ b/Models/ItemRelationTypeMapper.php @@ -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'; } diff --git a/Models/ItemStatus.php b/Models/ItemStatus.php index 2416e9a..2e2a0ce 100755 --- a/Models/ItemStatus.php +++ b/Models/ItemStatus.php @@ -29,4 +29,6 @@ abstract class ItemStatus extends Enum public const ACTIVE = 1; public const INACTIVE = 2; + + public const PREVIEW = 3; } diff --git a/Theme/Backend/item-profile.tpl.php b/Theme/Backend/item-profile.tpl.php index 295637a..0ecab52 100644 --- a/Theme/Backend/item-profile.tpl.php +++ b/Theme/Backend/item-profile.tpl.php @@ -186,7 +186,7 @@ echo $this->getData('nav')->render();