mirror of
https://github.com/Karaka-Management/oms-ItemManagement.git
synced 2026-02-15 03:38:40 +00:00
bug fixes
This commit is contained in:
parent
c8152cc7cf
commit
e246180338
2
.github/workflows/greetings.yml
vendored
2
.github/workflows/greetings.yml
vendored
|
|
@ -9,5 +9,5 @@ jobs:
|
||||||
- uses: actions/first-interaction@v1
|
- uses: actions/first-interaction@v1
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
issue-message: 'Thank you for createing this issue. We will check it as soon as possible.'
|
issue-message: 'Thank you for creating this issue. We will check it as soon as possible.'
|
||||||
pr-message: 'Thank you for your pull request. We will check it as soon as possible.'
|
pr-message: 'Thank you for your pull request. We will check it as soon as possible.'
|
||||||
|
|
|
||||||
|
|
@ -12,61 +12,5 @@
|
||||||
"name": "Items",
|
"name": "Items",
|
||||||
"virtualPath": "/Modules/ItemManagement",
|
"virtualPath": "/Modules/ItemManagement",
|
||||||
"user": 1
|
"user": 1
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "type",
|
|
||||||
"name": "item_profile_image",
|
|
||||||
"l11n": [
|
|
||||||
{
|
|
||||||
"title": "Profile image",
|
|
||||||
"lang": "en"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "Profilbild",
|
|
||||||
"lang": "de"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "type",
|
|
||||||
"name": "item_demo_download",
|
|
||||||
"l11n": [
|
|
||||||
{
|
|
||||||
"title": "Public Download",
|
|
||||||
"lang": "en"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "Oeffentlich Download",
|
|
||||||
"lang": "de"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "type",
|
|
||||||
"name": "item_private_download",
|
|
||||||
"l11n": [
|
|
||||||
{
|
|
||||||
"title": "Private Download",
|
|
||||||
"lang": "en"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "Privat Download",
|
|
||||||
"lang": "de"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "type",
|
|
||||||
"name": "item_purchase_download",
|
|
||||||
"l11n": [
|
|
||||||
{
|
|
||||||
"title": "Purchased Download",
|
|
||||||
"lang": "en"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "Gekaufter Download",
|
|
||||||
"lang": "de"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
23
Admin/Install/Tag.install.json
Normal file
23
Admin/Install/Tag.install.json
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "item_demo_download",
|
||||||
|
"l11n": {
|
||||||
|
"en": "Item Download",
|
||||||
|
"de": "Artikel Download"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "item_private_download",
|
||||||
|
"l11n": {
|
||||||
|
"en": "Private Item Download",
|
||||||
|
"de": "Privater Artikel Download"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "item_purchase_download",
|
||||||
|
"l11n": {
|
||||||
|
"en": "Purchased Download",
|
||||||
|
"de": "Gekaufter Download"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
43
Admin/Install/Tag.php
Normal file
43
Admin/Install/Tag.php
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Jingga
|
||||||
|
*
|
||||||
|
* PHP Version 8.2
|
||||||
|
*
|
||||||
|
* @package Modules\ItemManagement\Admin\Install
|
||||||
|
* @copyright Dennis Eichhorn
|
||||||
|
* @license OMS License 2.0
|
||||||
|
* @version 1.0.0
|
||||||
|
* @link https://jingga.app
|
||||||
|
*/
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Modules\ItemManagement\Admin\Install;
|
||||||
|
|
||||||
|
use phpOMS\Application\ApplicationAbstract;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tag class.
|
||||||
|
*
|
||||||
|
* @package Modules\ItemManagement\Admin\Install
|
||||||
|
* @license OMS License 2.0
|
||||||
|
* @link https://jingga.app
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
class Tag
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Install media providing
|
||||||
|
*
|
||||||
|
* @param ApplicationAbstract $app Application
|
||||||
|
* @param string $path Module path
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
public static function install(ApplicationAbstract $app, string $path) : void
|
||||||
|
{
|
||||||
|
\Modules\Tag\Admin\Installer::installExternal($app, ['path' => __DIR__ . '/Tag.install.json']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -483,8 +483,8 @@
|
||||||
{
|
{
|
||||||
"value": 1,
|
"value": 1,
|
||||||
"l11n": {
|
"l11n": {
|
||||||
"en": "Type 1",
|
"en": "Product Type 1",
|
||||||
"de": "Typ 1"
|
"de": "Produkttyp 1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ final class ApiAttributeController extends Controller
|
||||||
->where('id', (int) $request->getData('type'))
|
->where('id', (int) $request->getData('type'))
|
||||||
->execute();
|
->execute();
|
||||||
|
|
||||||
if (!$type->repeatable) {
|
if (!$type->isRepeatable) {
|
||||||
$attr = ItemAttributeMapper::count()
|
$attr = ItemAttributeMapper::count()
|
||||||
->with('type')
|
->with('type')
|
||||||
->where('type/id', $type->id)
|
->where('type/id', $type->id)
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,8 @@ use Modules\ItemManagement\Models\SettingsEnum as ItemSettingsEnum;
|
||||||
use Modules\ItemManagement\Models\StockIdentifierType;
|
use Modules\ItemManagement\Models\StockIdentifierType;
|
||||||
use Modules\Media\Models\Collection;
|
use Modules\Media\Models\Collection;
|
||||||
use Modules\Media\Models\CollectionMapper;
|
use Modules\Media\Models\CollectionMapper;
|
||||||
use Modules\Media\Models\MediaTypeMapper;
|
|
||||||
use Modules\Media\Models\PathSettings;
|
use Modules\Media\Models\PathSettings;
|
||||||
|
use Modules\Tag\Models\TagMapper;
|
||||||
use phpOMS\Account\PermissionType;
|
use phpOMS\Account\PermissionType;
|
||||||
use phpOMS\Localization\BaseStringL11n;
|
use phpOMS\Localization\BaseStringL11n;
|
||||||
use phpOMS\Localization\BaseStringL11nType;
|
use phpOMS\Localization\BaseStringL11nType;
|
||||||
|
|
@ -256,15 +256,57 @@ final class ApiController extends Controller
|
||||||
$this->createModel($request->header->account, $item, ItemMapper::class, 'item', $request->getOrigin());
|
$this->createModel($request->header->account, $item, ItemMapper::class, 'item', $request->getOrigin());
|
||||||
$this->app->dbPool->get()->con->commit();
|
$this->app->dbPool->get()->con->commit();
|
||||||
|
|
||||||
|
// Define names
|
||||||
|
$names = [];
|
||||||
|
if ($request->hasData('name1')) {
|
||||||
|
$names = ItemL11nTypeMapper::getAll()
|
||||||
|
->where('title', ['name1', 'name2'])
|
||||||
|
->executeGetArray();
|
||||||
|
|
||||||
|
foreach ($names as $type) {
|
||||||
|
$names[$type->title] = $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
$internalResponse = new HttpResponse();
|
||||||
|
$internalRequest = new HttpRequest();
|
||||||
|
|
||||||
|
$internalRequest->header->account = $request->header->account;
|
||||||
|
|
||||||
|
$internalRequest->setData('item', $item->id);
|
||||||
|
$internalRequest->setData('type', $names['name1']->id);
|
||||||
|
$internalRequest->setData('content', $request->getDataString('name1'));
|
||||||
|
$internalRequest->setData('language', $request->getDataString('language') ?? $request->header->l11n->language);
|
||||||
|
|
||||||
|
$this->apiItemL11nCreate($internalRequest, $internalResponse);
|
||||||
|
|
||||||
|
if ($request->hasData('name2')) {
|
||||||
|
$internalResponse = new HttpResponse();
|
||||||
|
$internalRequest = new HttpRequest();
|
||||||
|
|
||||||
|
$internalRequest->header->account = $request->header->account;
|
||||||
|
|
||||||
|
$internalRequest->setData('item', $item->id);
|
||||||
|
$internalRequest->setData('type', $names['name2']->id);
|
||||||
|
$internalRequest->setData('content', $request->getDataString('name2'));
|
||||||
|
$internalRequest->setData('language', $request->getDataString('language') ?? $request->header->l11n->language);
|
||||||
|
|
||||||
|
$this->apiItemL11nCreate($internalRequest, $internalResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Define default item containers
|
// Define default item containers
|
||||||
/** @var \Modules\Attribute\Models\AttributeType[] $types */
|
/** @var \Modules\Attribute\Models\AttributeType[] $types */
|
||||||
$types = ItemAttributeTypeMapper::getAll()
|
$types = ItemAttributeTypeMapper::getAll()
|
||||||
->where('name', ['default_sales_container', 'default_purchase_container'], 'IN')
|
->where('name', ['default_sales_container', 'default_purchase_container', 'hs_code'], 'IN')
|
||||||
->executeGetArray();
|
->executeGetArray();
|
||||||
|
|
||||||
$primaryContainer = \reset($item->container);
|
$primaryContainer = \reset($item->container);
|
||||||
if ($primaryContainer !== false) {
|
if ($primaryContainer !== false) {
|
||||||
foreach ($types as $type) {
|
foreach ($types as $type) {
|
||||||
|
if (\stripos($type->name, '_container') === false) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$internalResponse = clone $response;
|
$internalResponse = clone $response;
|
||||||
$internalRequest = new HttpRequest();
|
$internalRequest = new HttpRequest();
|
||||||
|
|
||||||
|
|
@ -277,6 +319,63 @@ final class ApiController extends Controller
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Guess hs_code
|
||||||
|
/* Alternatively find via segmentation
|
||||||
|
if ($item->stockIdentifier !== StockIdentifierType::NONE && $request->hasData('name1')) {
|
||||||
|
$hsCode = null;
|
||||||
|
foreach ($types as $type) {
|
||||||
|
if ($type->name === 'has_code') {
|
||||||
|
$hsCode = $type;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$nameString = $request->getDataString('name1') . ' ' . ($request->getDataString('name2') ?? '');
|
||||||
|
$names = \explode(' ', $nameString);
|
||||||
|
|
||||||
|
$con = new \phpOMS\DataStorage\Database\Connection\SQLiteConnection(['db' => 'sqlite', 'database' => __DIR__ . '/../../../phpOMS/Api/TARIC/taric.sqlite']);
|
||||||
|
$con->connect();
|
||||||
|
|
||||||
|
\usort($names, function (string $a, string $b) {
|
||||||
|
return \strlen($b) - \strlen($a);
|
||||||
|
});
|
||||||
|
|
||||||
|
$results = [];
|
||||||
|
foreach ($names as $name) {
|
||||||
|
$query = new Builder($con);
|
||||||
|
$query->bind('name', '%' . $name . '%');
|
||||||
|
|
||||||
|
$sql = <<<SQL
|
||||||
|
SELECT taric_good.Goods_code
|
||||||
|
FROM taric_good
|
||||||
|
WHERE taric_good.Description LIKE :name
|
||||||
|
ORDER BY taric_good.Goods_code DESC;
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
$results = $query->raw($sql)->execute();
|
||||||
|
if (!empty($results)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($hsCode !== null && !empty($results)) {
|
||||||
|
$internalResponse = clone $response;
|
||||||
|
$internalRequest = new HttpRequest();
|
||||||
|
|
||||||
|
$internalRequest->header->account = $request->header->account;
|
||||||
|
$internalRequest->setData('ref', $item->id);
|
||||||
|
$internalRequest->setData('type', $hsCode->id);
|
||||||
|
$internalRequest->setData('value', $results[0]['Goods_code']);
|
||||||
|
|
||||||
|
$this->app->moduleManager->get('ItemManagement', 'ApiAttribute')->apiItemAttributeCreate($internalRequest, $internalResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
$con->close();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Define prices
|
||||||
if ($this->app->moduleManager->isActive('Billing')) {
|
if ($this->app->moduleManager->isActive('Billing')) {
|
||||||
$billing = $this->app->moduleManager->get('Billing', 'ApiPrice');
|
$billing = $this->app->moduleManager->get('Billing', 'ApiPrice');
|
||||||
|
|
||||||
|
|
@ -310,11 +409,11 @@ final class ApiController extends Controller
|
||||||
$this->createMediaDirForItem($item->id, $request->header->account);
|
$this->createMediaDirForItem($item->id, $request->header->account);
|
||||||
$path = $this->createItemDir($item);
|
$path = $this->createItemDir($item);
|
||||||
|
|
||||||
$uploadedFiles = $request->files['item_profile_image'] ?? [];
|
$uploadedFiles = $request->files['profile_image'] ?? [];
|
||||||
if (!empty($uploadedFiles)) {
|
if (!empty($uploadedFiles)) {
|
||||||
/** @var \Modules\Media\Models\MediaType $profileImageType */
|
/** @var \Modules\Tag\Models\Tag $profileImageType */
|
||||||
$profileImageType = MediaTypeMapper::get()
|
$profileImageType = TagMapper::get()
|
||||||
->where('name', 'item_profile_image')
|
->where('name', 'profile_image')
|
||||||
->execute();
|
->execute();
|
||||||
|
|
||||||
// upload image
|
// upload image
|
||||||
|
|
@ -326,7 +425,7 @@ final class ApiController extends Controller
|
||||||
basePath: __DIR__ . '/../../../Modules/Media/Files' . $path,
|
basePath: __DIR__ . '/../../../Modules/Media/Files' . $path,
|
||||||
virtualPath: $path,
|
virtualPath: $path,
|
||||||
pathSettings: PathSettings::FILE_PATH,
|
pathSettings: PathSettings::FILE_PATH,
|
||||||
type: $profileImageType->id,
|
tag: $profileImageType->id,
|
||||||
rel: $item->id,
|
rel: $item->id,
|
||||||
mapper: ItemMapper::class,
|
mapper: ItemMapper::class,
|
||||||
field: 'files'
|
field: 'files'
|
||||||
|
|
@ -693,6 +792,23 @@ final class ApiController extends Controller
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @question This kind of thing should happen in a separate function?!
|
||||||
|
$exists = ItemL11nMapper::get()
|
||||||
|
->where('ref', $request->getDataInt('item') ?? 0)
|
||||||
|
->where('type', $request->getDataInt('type') ?? 0)
|
||||||
|
->where('language', $request->getDataString('language') ?? $request->header->l11n->language)
|
||||||
|
->execute();
|
||||||
|
|
||||||
|
if ($exists->id > 0) {
|
||||||
|
$response->header->status = RequestStatusCode::R_400;
|
||||||
|
$this->createInvalidCreateResponse($request, $response, $val);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @todo This is always the same for every l11n.
|
||||||
|
// Create a L11n module or something similar to the Attribute module,
|
||||||
|
// where this can be done for every other module
|
||||||
$itemL11n = $this->createItemL11nFromRequest($request);
|
$itemL11n = $this->createItemL11nFromRequest($request);
|
||||||
$this->createModel($request->header->account, $itemL11n, ItemL11nMapper::class, 'item_l11n', $request->getOrigin());
|
$this->createModel($request->header->account, $itemL11n, ItemL11nMapper::class, 'item_l11n', $request->getOrigin());
|
||||||
$this->createStandardCreateResponse($request, $response, $itemL11n);
|
$this->createStandardCreateResponse($request, $response, $itemL11n);
|
||||||
|
|
@ -784,7 +900,7 @@ final class ApiController extends Controller
|
||||||
basePath: __DIR__ . '/../../../Modules/Media/Files' . $path,
|
basePath: __DIR__ . '/../../../Modules/Media/Files' . $path,
|
||||||
virtualPath: $path,
|
virtualPath: $path,
|
||||||
pathSettings: PathSettings::FILE_PATH,
|
pathSettings: PathSettings::FILE_PATH,
|
||||||
type: $request->getDataInt('type'),
|
tag: $request->getDataInt('tag'),
|
||||||
rel: $item->id,
|
rel: $item->id,
|
||||||
mapper: ItemMapper::class,
|
mapper: ItemMapper::class,
|
||||||
field: 'files'
|
field: 'files'
|
||||||
|
|
|
||||||
|
|
@ -30,15 +30,14 @@ use Modules\ItemManagement\Models\MaterialTypeL11nMapper;
|
||||||
use Modules\ItemManagement\Models\MaterialTypeMapper;
|
use Modules\ItemManagement\Models\MaterialTypeMapper;
|
||||||
use Modules\ItemManagement\Models\PermissionCategory;
|
use Modules\ItemManagement\Models\PermissionCategory;
|
||||||
use Modules\Media\Models\MediaMapper;
|
use Modules\Media\Models\MediaMapper;
|
||||||
use Modules\Media\Models\MediaTypeMapper;
|
|
||||||
use Modules\Organization\Models\Attribute\UnitAttributeMapper;
|
use Modules\Organization\Models\Attribute\UnitAttributeMapper;
|
||||||
use Modules\Organization\Models\UnitMapper;
|
use Modules\Organization\Models\UnitMapper;
|
||||||
|
use Modules\Tag\Models\TagMapper;
|
||||||
use phpOMS\Account\PermissionType;
|
use phpOMS\Account\PermissionType;
|
||||||
use phpOMS\Asset\AssetType;
|
use phpOMS\Asset\AssetType;
|
||||||
use phpOMS\Contract\RenderableInterface;
|
use phpOMS\Contract\RenderableInterface;
|
||||||
use phpOMS\DataStorage\Database\Query\Builder;
|
use phpOMS\DataStorage\Database\Query\Builder;
|
||||||
use phpOMS\DataStorage\Database\Query\OrderType;
|
use phpOMS\DataStorage\Database\Query\OrderType;
|
||||||
use phpOMS\DataStorage\Database\Query\Where;
|
|
||||||
use phpOMS\Localization\ISO3166CharEnum;
|
use phpOMS\Localization\ISO3166CharEnum;
|
||||||
use phpOMS\Localization\ISO3166NameEnum;
|
use phpOMS\Localization\ISO3166NameEnum;
|
||||||
use phpOMS\Message\RequestAbstract;
|
use phpOMS\Message\RequestAbstract;
|
||||||
|
|
@ -180,10 +179,10 @@ final class BackendController extends Controller
|
||||||
->with('l11n')
|
->with('l11n')
|
||||||
->with('l11n/type')
|
->with('l11n/type')
|
||||||
->with('files')
|
->with('files')
|
||||||
->with('files/types')
|
->with('files/tags')
|
||||||
->where('l11n/language', $response->header->l11n->language)
|
->where('l11n/language', $response->header->l11n->language)
|
||||||
->where('l11n/type/title', ['name1', 'name2'], 'IN')
|
->where('l11n/type/title', ['name1', 'name2'], 'IN')
|
||||||
->where('files/types/name', 'item_profile_image')
|
->where('files/tags/name', 'profile_image')
|
||||||
->where('unit', [$this->app->unitId, null])
|
->where('unit', [$this->app->unitId, null])
|
||||||
->limit(50)
|
->limit(50)
|
||||||
->executeGetArray();
|
->executeGetArray();
|
||||||
|
|
@ -433,7 +432,7 @@ final class BackendController extends Controller
|
||||||
->with('l11n/type')
|
->with('l11n/type')
|
||||||
->with('files')->limit(5, 'files')->sort('files/id', OrderType::DESC)
|
->with('files')->limit(5, 'files')->sort('files/id', OrderType::DESC)
|
||||||
->with('notes')->limit(5, 'notes')->sort('notes/id', OrderType::DESC)
|
->with('notes')->limit(5, 'notes')->sort('notes/id', OrderType::DESC)
|
||||||
->with('files/types')
|
->with('files/tags')
|
||||||
->with('attributes')
|
->with('attributes')
|
||||||
->with('attributes/type')
|
->with('attributes/type')
|
||||||
->with('attributes/type/l11n')
|
->with('attributes/type/l11n')
|
||||||
|
|
@ -456,15 +455,14 @@ final class BackendController extends Controller
|
||||||
->on(ItemMapper::HAS_MANY['files']['table'] . '.' . ItemMapper::HAS_MANY['files']['self'], '=', ItemMapper::TABLE . '.' . ItemMapper::PRIMARYFIELD)
|
->on(ItemMapper::HAS_MANY['files']['table'] . '.' . ItemMapper::HAS_MANY['files']['self'], '=', ItemMapper::TABLE . '.' . ItemMapper::PRIMARYFIELD)
|
||||||
->leftJoin(MediaMapper::TABLE)
|
->leftJoin(MediaMapper::TABLE)
|
||||||
->on(ItemMapper::HAS_MANY['files']['table'] . '.' . ItemMapper::HAS_MANY['files']['external'], '=', MediaMapper::TABLE . '.' . MediaMapper::PRIMARYFIELD)
|
->on(ItemMapper::HAS_MANY['files']['table'] . '.' . ItemMapper::HAS_MANY['files']['external'], '=', MediaMapper::TABLE . '.' . MediaMapper::PRIMARYFIELD)
|
||||||
->leftJoin(MediaMapper::HAS_MANY['types']['table'])
|
->leftJoin(MediaMapper::HAS_MANY['tags']['table'])
|
||||||
->on(MediaMapper::TABLE . '.' . MediaMapper::PRIMARYFIELD, '=', MediaMapper::HAS_MANY['types']['table'] . '.' . MediaMapper::HAS_MANY['types']['self'])
|
->on(MediaMapper::TABLE . '.' . MediaMapper::PRIMARYFIELD, '=', MediaMapper::HAS_MANY['tags']['table'] . '.' . MediaMapper::HAS_MANY['tags']['self'])
|
||||||
->leftJoin(MediaTypeMapper::TABLE)
|
->leftJoin(TagMapper::TABLE)
|
||||||
->on(MediaMapper::HAS_MANY['types']['table'] . '.' . MediaMapper::HAS_MANY['types']['external'], '=', MediaTypeMapper::TABLE . '.' . MediaTypeMapper::PRIMARYFIELD)
|
->on(MediaMapper::HAS_MANY['tags']['table'] . '.' . MediaMapper::HAS_MANY['tags']['external'], '=', TagMapper::TABLE . '.' . TagMapper::PRIMARYFIELD)
|
||||||
->where(ItemMapper::HAS_MANY['files']['self'], '=', $view->data['item']->id)
|
->where(ItemMapper::HAS_MANY['files']['self'], '=', $view->data['item']->id)
|
||||||
->where(MediaTypeMapper::TABLE . '.' . MediaTypeMapper::getColumnByMember('name'), '=', 'item_profile_image');
|
->where(TagMapper::TABLE . '.' . TagMapper::getColumnByMember('name'), '=', 'profile_image');
|
||||||
|
|
||||||
$view->data['itemImage'] = MediaMapper::get()
|
$view->data['itemImage'] = MediaMapper::get()
|
||||||
->with('types')
|
|
||||||
->where('id', $results)
|
->where('id', $results)
|
||||||
->limit(1)
|
->limit(1)
|
||||||
->execute();
|
->execute();
|
||||||
|
|
@ -664,7 +662,7 @@ final class BackendController extends Controller
|
||||||
|
|
||||||
$head->addAsset(AssetType::CSS, 'Resources/chartjs/chart.css?v=' . $this->app->version);
|
$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, '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']);
|
$head->addAsset(AssetType::JSLATE, 'Modules/ItemManagement/Controller.js?v=' . self::VERSION, ['nonce' => $nonce, 'type' => 'module']);
|
||||||
|
|
||||||
$view = new View($this->app->l11nManager, $request, $response);
|
$view = new View($this->app->l11nManager, $request, $response);
|
||||||
$view->setTemplate('/Modules/ItemManagement/Theme/Backend/item-analysis');
|
$view->setTemplate('/Modules/ItemManagement/Theme/Backend/item-analysis');
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ final class ItemAttributeTypeMapper extends DataMapperFactory
|
||||||
'itemmgmt_attr_type_datatype' => ['name' => 'itemmgmt_attr_type_datatype', 'type' => 'int', 'internal' => 'datatype'],
|
'itemmgmt_attr_type_datatype' => ['name' => 'itemmgmt_attr_type_datatype', 'type' => 'int', 'internal' => 'datatype'],
|
||||||
'itemmgmt_attr_type_fields' => ['name' => 'itemmgmt_attr_type_fields', 'type' => 'int', 'internal' => 'fields'],
|
'itemmgmt_attr_type_fields' => ['name' => 'itemmgmt_attr_type_fields', 'type' => 'int', 'internal' => 'fields'],
|
||||||
'itemmgmt_attr_type_custom' => ['name' => 'itemmgmt_attr_type_custom', 'type' => 'bool', 'internal' => 'custom'],
|
'itemmgmt_attr_type_custom' => ['name' => 'itemmgmt_attr_type_custom', 'type' => 'bool', 'internal' => 'custom'],
|
||||||
'itemmgmt_attr_type_repeatable' => ['name' => 'itemmgmt_attr_type_repeatable', 'type' => 'bool', 'internal' => 'repeatable'],
|
'itemmgmt_attr_type_repeatable' => ['name' => 'itemmgmt_attr_type_repeatable', 'type' => 'bool', 'internal' => 'isRepeatable'],
|
||||||
'itemmgmt_attr_type_internal' => ['name' => 'itemmgmt_attr_type_internal', 'type' => 'bool', 'internal' => 'isInternal'],
|
'itemmgmt_attr_type_internal' => ['name' => 'itemmgmt_attr_type_internal', 'type' => 'bool', 'internal' => 'isInternal'],
|
||||||
'itemmgmt_attr_type_pattern' => ['name' => 'itemmgmt_attr_type_pattern', 'type' => 'string', 'internal' => 'validationPattern'],
|
'itemmgmt_attr_type_pattern' => ['name' => 'itemmgmt_attr_type_pattern', 'type' => 'string', 'internal' => 'validationPattern'],
|
||||||
'itemmgmt_attr_type_required' => ['name' => 'itemmgmt_attr_type_required', 'type' => 'bool', 'internal' => 'isRequired'],
|
'itemmgmt_attr_type_required' => ['name' => 'itemmgmt_attr_type_required', 'type' => 'bool', 'internal' => 'isRequired'],
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@ use Modules\Editor\Models\EditorDocMapper;
|
||||||
use Modules\ItemManagement\Models\Attribute\ItemAttributeMapper;
|
use Modules\ItemManagement\Models\Attribute\ItemAttributeMapper;
|
||||||
use Modules\Media\Models\Media;
|
use Modules\Media\Models\Media;
|
||||||
use Modules\Media\Models\MediaMapper;
|
use Modules\Media\Models\MediaMapper;
|
||||||
use Modules\Media\Models\MediaType;
|
|
||||||
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
|
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
|
||||||
use phpOMS\Localization\BaseStringL11n;
|
use phpOMS\Localization\BaseStringL11n;
|
||||||
use phpOMS\Localization\BaseStringL11nType;
|
use phpOMS\Localization\BaseStringL11nType;
|
||||||
|
|
@ -130,13 +129,13 @@ final class ItemMapper extends DataMapperFactory
|
||||||
itemmgmt_item.itemmgmt_item_salesprice,
|
itemmgmt_item.itemmgmt_item_salesprice,
|
||||||
media.media_id,
|
media.media_id,
|
||||||
media.media_file,
|
media.media_file,
|
||||||
media_type.media_type_id,
|
tag.tag_id,
|
||||||
media_type.media_type_name
|
tag.tag_name
|
||||||
from itemmgmt_item
|
from itemmgmt_item
|
||||||
left join itemmgmt_item_media on itemmgmt_item.itemmgmt_item_id = itemmgmt_item_media.itemmgmt_item_media_item
|
left join itemmgmt_item_media on itemmgmt_item.itemmgmt_item_id = itemmgmt_item_media.itemmgmt_item_media_item
|
||||||
left join media on itemmgmt_item_media.itemmgmt_item_media_media = media.media_id
|
left join media on itemmgmt_item_media.itemmgmt_item_media_media = media.media_id
|
||||||
left join media_type_rel on media.media_id = media_type_rel.media_type_rel_src
|
left join media_tag on media.media_id = media_tag.media_tag_src
|
||||||
left join media_type on media_type_rel.media_type_rel_dst = media_type.media_type_id and media_type.media_type_name = 'item_profile_image'
|
left join tag on media_tag.media_tag_dst = tag.tag_id and tag.tag_name = 'profile_image'
|
||||||
SQL;
|
SQL;
|
||||||
|
|
||||||
$q = self::$db->con->query($query);
|
$q = self::$db->con->query($query);
|
||||||
|
|
@ -150,10 +149,6 @@ final class ItemMapper extends DataMapperFactory
|
||||||
foreach ($itemsResult as $res) {
|
foreach ($itemsResult as $res) {
|
||||||
$media = null;
|
$media = null;
|
||||||
if ($res['media_id'] !== null) {
|
if ($res['media_id'] !== null) {
|
||||||
$mediaType = new MediaType();
|
|
||||||
$mediaType->id = $res['media_type_id'];
|
|
||||||
$mediaType->name = $res['media_type_name'];
|
|
||||||
|
|
||||||
$media = new Media();
|
$media = new Media();
|
||||||
$media->id = $res['media_id'];
|
$media->id = $res['media_id'];
|
||||||
$media->setPath($res['media_file']);
|
$media->setPath($res['media_file']);
|
||||||
|
|
|
||||||
|
|
@ -119,7 +119,7 @@ echo $this->data['nav']->render(); ?>
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php $count = 0; foreach ($items as $key => $value) : ++$count;
|
<?php $count = 0; foreach ($items as $key => $value) : ++$count;
|
||||||
$url = UriFactory::build('{/base}/item/view?{?}&id=' . $value->id);
|
$url = UriFactory::build('{/base}/item/view?{?}&id=' . $value->id);
|
||||||
$image = $value->getFileByTypeName('item_profile_image');
|
$image = $value->getFileByTagName('profile_image');
|
||||||
?>
|
?>
|
||||||
<tr data-href="<?= $url; ?>">
|
<tr data-href="<?= $url; ?>">
|
||||||
<td><a href="<?= $url; ?>"><img alt="<?= $this->getHtml('IMG_alt_item'); ?>" width="30" loading="lazy" class="item-image"
|
<td><a href="<?= $url; ?>"><img alt="<?= $this->getHtml('IMG_alt_item'); ?>" width="30" loading="lazy" class="item-image"
|
||||||
|
|
|
||||||
|
|
@ -258,7 +258,7 @@ echo $this->data['nav']->render();
|
||||||
foreach ($item->files as $file) :
|
foreach ($item->files as $file) :
|
||||||
++$count;
|
++$count;
|
||||||
$url = UriFactory::build('{/base}/media/view?{?}&id=' . $file->id);
|
$url = UriFactory::build('{/base}/media/view?{?}&id=' . $file->id);
|
||||||
$extensionType = FileUtils::getExtensionType($value->extension);
|
$extensionType = FileUtils::getExtensionType($file->extension);
|
||||||
?>
|
?>
|
||||||
<tr data-href="<?= $url; ?>"
|
<tr data-href="<?= $url; ?>"
|
||||||
<?= \in_array($extensionType, [ExtensionType::IMAGE, ExtensionType::PDF]) ? 'data-preview="' . UriFactory::build('{/api}media/export?id=' . $file->id . '&type=html&csrf={$CSRF}') . '"' : ''; ?>>
|
<?= \in_array($extensionType, [ExtensionType::IMAGE, ExtensionType::PDF]) ? 'data-preview="' . UriFactory::build('{/api}media/export?id=' . $file->id . '&type=html&csrf={$CSRF}') . '"' : ''; ?>>
|
||||||
|
|
@ -1472,7 +1472,7 @@ echo $this->data['nav']->render();
|
||||||
<div class="tab">
|
<div class="tab">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12">
|
<div class="col-xs-12">
|
||||||
<div class="portlet">
|
<section class="portlet">
|
||||||
<div class="portlet-head"><?= $this->getHtml('Logs', 'Auditor'); ?><i class="g-icon download btn end-xs">download</i></div>
|
<div class="portlet-head"><?= $this->getHtml('Logs', 'Auditor'); ?><i class="g-icon download btn end-xs">download</i></div>
|
||||||
<div class="slider">
|
<div class="slider">
|
||||||
<table class="default sticky">
|
<table class="default sticky">
|
||||||
|
|
@ -1525,7 +1525,7 @@ echo $this->data['nav']->render();
|
||||||
<a tabindex="0" class="button" href="<?= UriFactory::build($next); ?>"><?= $this->getHtml('Next', '0', '0'); ?></a>
|
<a tabindex="0" class="button" href="<?= UriFactory::build($next); ?>"><?= $this->getHtml('Next', '0', '0'); ?></a>
|
||||||
</div>
|
</div>
|
||||||
-->
|
-->
|
||||||
</div>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
"Navigation": "*",
|
"Navigation": "*",
|
||||||
"Editor": "*",
|
"Editor": "*",
|
||||||
"Media": "*",
|
"Media": "*",
|
||||||
|
"Tag": "*",
|
||||||
"Admin": "*"
|
"Admin": "*"
|
||||||
},
|
},
|
||||||
"load": [
|
"load": [
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace Modules\ItemManagement\tests\Controller\Api;
|
namespace Modules\ItemManagement\tests\Controller\Api;
|
||||||
|
|
||||||
use Modules\Media\Models\MediaTypeMapper;
|
use Modules\Tag\Models\TagMapper;
|
||||||
use phpOMS\Message\Http\HttpRequest;
|
use phpOMS\Message\Http\HttpRequest;
|
||||||
use phpOMS\Message\Http\HttpResponse;
|
use phpOMS\Message\Http\HttpResponse;
|
||||||
use phpOMS\Message\Http\RequestStatusCode;
|
use phpOMS\Message\Http\RequestStatusCode;
|
||||||
|
|
@ -79,14 +79,14 @@ trait ApiControllerItemTrait
|
||||||
|
|
||||||
\copy(__DIR__ . '/m_icon.png', __DIR__ . '/m_icon_tmp.png');
|
\copy(__DIR__ . '/m_icon.png', __DIR__ . '/m_icon_tmp.png');
|
||||||
|
|
||||||
$profileImageType = MediaTypeMapper::get()
|
$profileImageType = TagMapper::get()
|
||||||
->where('name', 'item_profile_image')
|
->where('name', 'profile_image')
|
||||||
->execute();
|
->execute();
|
||||||
|
|
||||||
$request->header->account = 1;
|
$request->header->account = 1;
|
||||||
$request->setData('name', '123456 backend');
|
$request->setData('name', '123456 backend');
|
||||||
$request->setData('item', 1);
|
$request->setData('item', 1);
|
||||||
$request->setData('type', $profileImageType->id);
|
$request->setData('tag', $profileImageType->id);
|
||||||
|
|
||||||
TestUtils::setMember($request, 'files', [
|
TestUtils::setMember($request, 'files', [
|
||||||
'file1' => [
|
'file1' => [
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user