diff --git a/Admin/Install/Admin.install.php b/Admin/Install/Admin.install.php index 097ed70..2d50c51 100644 --- a/Admin/Install/Admin.install.php +++ b/Admin/Install/Admin.install.php @@ -18,10 +18,10 @@ 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, + 'type' => 'setting', + 'name' => SettingsEnum::DEFAULT_SEGMENTATION, + 'content' => '{"segment":1, "section":1, "sales_group":1, "product_group":1}', + 'pattern' => '', + 'module' => ApiController::NAME, ], ]; diff --git a/Admin/Install/attributes.json b/Admin/Install/attributes.json index 7ada509..df491ef 100755 --- a/Admin/Install/attributes.json +++ b/Admin/Install/attributes.json @@ -522,6 +522,7 @@ "is_required": true, "default_value": "", "values": [ + { "value": "GENERAL" }, { "value": "SOFTWARE" }, { "value": "SERVICE" } ] @@ -538,6 +539,7 @@ "is_required": true, "default_value": "", "values": [ + { "value": "GENERAL" }, { "value": "SOFTWARE" }, { "value": "SERVICE" } ] diff --git a/Admin/Installer.php b/Admin/Installer.php index 82e7a9c..4beb27a 100755 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -61,6 +61,8 @@ final class Installer extends InstallerAbstract $attrValues = self::createAttributeValues($app, $attrTypes, $attributes); $data = include __DIR__ . '/Install/Admin.install.php'; + + /** @var array $content */ $content = \json_decode($data[0]['content'], true); foreach ($content as $type => $_) { diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 760acbe..5489bc2 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -95,6 +95,7 @@ final class ApiController extends Controller ->execute(); if (empty($l11n)) { + /** @var BaseStringL11n[] $l11n */ $l11n = ItemL11nMapper::getAll() ->with('type') ->where('type/title', ['name1', 'name2'], 'IN') @@ -107,6 +108,7 @@ final class ApiController extends Controller if (empty($l11n)) { $searches = \explode(' ', $request->getDataString('search') ?? ''); foreach ($searches as $search) { + /** @var BaseStringL11n[] $l11n */ $l11n = ItemL11nMapper::getAll() ->with('type') ->where('type/title', ['internal_matchcodes'], 'IN') @@ -122,6 +124,7 @@ final class ApiController extends Controller if (empty($l11n)) { foreach ($searches as $search) { + /** @var BaseStringL11n[] $l11n */ $l11n = ItemL11nMapper::getAll() ->with('type') ->where('type/title', ['name1', 'name2'], 'IN') @@ -139,10 +142,11 @@ final class ApiController extends Controller $itemList = []; if (!empty($l11n)) { - $itemIds = \array_map(function (BaseStringL11n $l) { + $itemIds = \array_map(function (BaseStringL11n $l) : int { return $l->ref; }, $l11n); + /** @var Item[] $itemList */ $itemList = ItemMapper::getAll() ->with('l11n') ->with('l11n/type') @@ -187,6 +191,19 @@ final class ApiController extends Controller . (empty($item->number) ? $item->id : $item->number); } + /** + * Api method to export items items + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ public function apiItemListExport(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void { $items = []; @@ -194,13 +211,13 @@ final class ApiController extends Controller /** @var Item $item */ foreach (ItemMapper::yield()->execute() as $item) { $items[] = [ - 'id' => $item->id, + 'id' => $item->id, 'name1' => $item->getL11n('name1')->content, 'name2' => $item->getL11n('name2')->content, ]; } - $report = new \Modules\Exchange\Models\Report(); + $report = new \Modules\Exchange\Models\Report(); $report->data = $items; $this->app->moduleManager->get('Exchange', 'Api') @@ -236,20 +253,24 @@ final class ApiController extends Controller $this->app->dbPool->get()->con->commit(); // Define default item containers + /** @var \Modules\Attribute\Models\AttributeType[] $types */ $types = ItemAttributeTypeMapper::getAll() ->where('name', ['default_sales_container', 'default_purchase_container'], 'IN') ->execute(); - foreach ($types as $type) { - $internalResponse = clone $response; - $internalRequest = new HttpRequest(); + $primaryContainer = \reset($item->container); + if ($primaryContainer !== false) { + foreach ($types as $type) { + $internalResponse = clone $response; + $internalRequest = new HttpRequest(); - $internalRequest->header->account = $request->header->account; - $internalRequest->setData('ref', $item->id); - $internalRequest->setData('type', $type->id); - $internalRequest->setData('value', \reset($item->container)->id); + $internalRequest->header->account = $request->header->account; + $internalRequest->setData('ref', $item->id); + $internalRequest->setData('type', $type->id); + $internalRequest->setData('value', $primaryContainer->id); - $this->app->moduleManager->get('ItemManagement', 'ApiAttribute')->apiItemAttributeCreate($internalRequest, $internalResponse); + $this->app->moduleManager->get('ItemManagement', 'ApiAttribute')->apiItemAttributeCreate($internalRequest, $internalResponse); + } } if ($this->app->moduleManager->isActive('Billing')) { @@ -330,16 +351,31 @@ final class ApiController extends Controller $this->createStandardCreateResponse($request, $response, $item); } + /** + * Create item segmentation. + * + * Default: segment->section->sales_group->product_group and to the side product_type + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param Item $item Item + * + * @return void + * + * @since 1.0.0 + */ private function createItemSegmentation(RequestAbstract $request, ResponseAbstract $response, Item $item) : void { /** @var \Model\Setting $settings */ $settings = $this->app->appSettings->get(null, ItemSettingsEnum::DEFAULT_SEGMENTATION); + /** @var array $segmentation */ $segmentation = \json_decode($settings->content, true); if ($segmentation === false || $segmentation === null) { return; } + /** @var \Modules\Attribute\Models\AttributeType[] $types */ $types = ItemAttributeTypeMapper::getAll() ->where('name', \array_keys($segmentation), 'IN') ->execute(); diff --git a/Controller/BackendController.php b/Controller/BackendController.php index cd500ad..ada3cab 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -435,7 +435,6 @@ final class BackendController extends Controller $view->setTemplate('/Modules/ItemManagement/Theme/Backend/item-view'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1004803001, $request, $response); - /** @var \Modules\ItemManagement\Models\Item */ $view->data['item'] = ItemMapper::get() ->with('l11n') ->with('l11n/type') @@ -471,7 +470,6 @@ final class BackendController extends Controller ->where(ItemMapper::HAS_MANY['files']['self'], '=', $view->data['item']->id) ->where(MediaTypeMapper::TABLE . '.' . MediaTypeMapper::getColumnByMember('name'), '=', 'item_profile_image'); - /** @var \Modules\Media\Models\Media */ $view->data['itemImage'] = MediaMapper::get() ->with('types') ->where('id', $results) @@ -492,29 +490,24 @@ final class BackendController extends Controller $view->data['l11nView'] = new \Web\Backend\Views\L11nView($this->app->l11nManager, $request, $response); - /** @var \phpOMS\Localization\BaseStringL11nType[] */ $view->data['l11nTypes'] = ItemL11nTypeMapper::getAll() ->execute(); - /** @var \phpOMS\Localization\BaseStringL11n[] */ $view->data['l11nValues'] = ItemL11nMapper::getAll() ->with('type') ->where('ref', $view->data['item']->id) ->execute(); - /** @var \Modules\Attribute\Models\AttributeType[] */ $view->data['attributeTypes'] = ItemAttributeTypeMapper::getAll() ->with('l11n') ->where('l11n/language', $response->header->l11n->language) ->execute(); - /** @var \Modules\Organization\Models\Unit[] */ $view->data['units'] = UnitMapper::getAll() ->execute(); $view->data['hasBilling'] = $this->app->moduleManager->isActive('Billing'); - /** @var \Modules\Billing\Models\Price\Price[] */ $view->data['prices'] = $view->data['hasBilling'] ? \Modules\Billing\Models\Price\PriceMapper::getAll() ->with('supplier') @@ -533,8 +526,8 @@ final class BackendController extends Controller //'has_inventory', 'inventory_identifier', 'stocktaking_type', ], 'IN') ->where('defaults/l11n', (new Where($this->app->dbPool->get())) - ->where(ItemAttributeValueL11nMapper::getColumnByMember('ref'), '=', null) - ->orWhere(ItemAttributeValueL11nMapper::getColumnByMember('language'), '=', $response->header->l11n->language)) + ->where(ItemAttributeValueL11nMapper::getColumnByMember('ref') ?? '', '=', null) + ->orWhere(ItemAttributeValueL11nMapper::getColumnByMember('language') ?? '', '=', $response->header->l11n->language)) ->execute(); $defaultAttributeTypes = []; @@ -549,8 +542,8 @@ final class BackendController extends Controller ->with('defaults/l11n') ->where('name', ['segment', 'section', 'client_group', 'client_type'], 'IN') ->where('defaults/l11n', (new Where($this->app->dbPool->get())) - ->where(ClientAttributeValueL11nMapper::getColumnByMember('ref'), '=', null) - ->orWhere(ClientAttributeValueL11nMapper::getColumnByMember('language'), '=', $response->header->l11n->language)) + ->where(ClientAttributeValueL11nMapper::getColumnByMember('ref') ?? '', '=', null) + ->orWhere(ClientAttributeValueL11nMapper::getColumnByMember('language') ?? '', '=', $response->header->l11n->language)) ->execute(); $clientSegmentationTypes = []; @@ -569,7 +562,7 @@ final class BackendController extends Controller PermissionCategory::ITEM_LOG, ) ) { - /** @var \Modules\Auditor\Models\Audit[] */ + /** @var \Modules\Auditor\Models\Audit[] $logs */ $logs = AuditMapper::getAll() ->where('type', StringUtils::intHash(ItemMapper::class)) ->where('module', 'ItemManagement') @@ -581,7 +574,6 @@ final class BackendController extends Controller // @todo join audit with files, attributes, localization, prices, notes, ... - /** @var \Modules\Media\Models\Media[] */ $view->data['files'] = MediaMapper::getAll() ->with('types') ->join('id', ItemMapper::class, 'files') // id = media id, files = item relations diff --git a/Models/ItemMapper.php b/Models/ItemMapper.php index c777690..ef34aed 100755 --- a/Models/ItemMapper.php +++ b/Models/ItemMapper.php @@ -52,7 +52,7 @@ final class ItemMapper extends DataMapperFactory 'itemmgmt_item_purchaseprice' => ['name' => 'itemmgmt_item_purchaseprice', 'type' => 'Serializable', 'internal' => 'purchasePrice'], 'itemmgmt_item_parent' => ['name' => 'itemmgmt_item_parent', 'type' => 'int', 'internal' => 'parent'], 'itemmgmt_item_unit' => ['name' => 'itemmgmt_item_unit', 'type' => 'int', 'internal' => 'unit'], - 'itemmgmt_item_createdat' => ['name' => 'itemmgmt_item_createdat', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt'], + 'itemmgmt_item_createdat' => ['name' => 'itemmgmt_item_createdat', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt'], ]; /** diff --git a/Models/Material.php b/Models/Material.php index a5753ab..3d55d71 100644 --- a/Models/Material.php +++ b/Models/Material.php @@ -47,6 +47,11 @@ class Material implements \JsonSerializable public int $item = 0; + /** + * Constructor. + * + * @since 1.0.0 + */ public function __construct() { $this->type = new NullBaseStringL11nType(); diff --git a/Theme/Backend/Lang/de.lang.php b/Theme/Backend/Lang/de.lang.php index ef8f499..b37e327 100755 --- a/Theme/Backend/Lang/de.lang.php +++ b/Theme/Backend/Lang/de.lang.php @@ -29,9 +29,7 @@ return ['ItemManagement' => [ 'ClientType' => 'Kundentyp', 'Commission' => 'Kommission', 'Container' => 'Container', - 'CostCenter' => 'Kostenstelle', 'CostIndicator' => 'Einkaufssteuerkennzeichen', - 'CostObject' => 'Kostenträger', 'Countries' => 'Länder', 'Country' => 'Land', 'Created' => 'Erstellt', @@ -142,7 +140,7 @@ return ['ItemManagement' => [ 'Promocode' => 'Promocode', 'Region' => 'Region', 'Materials' => 'Materialien', - 'Material' => 'Material', + 'Material' => 'Material', 'Weight' => 'Gewicht', 'Depth' => 'Tiefe', 'WidthLength' => 'Breite/Länge', diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index 3aec540..12c4dfe 100755 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -28,11 +28,9 @@ return ['ItemManagement' => [ 'ClientSegment' => 'Client Segment', 'ClientType' => 'Client Type', 'Commission' => 'Commission', - 'Material' => 'Material', + 'Material' => 'Material', 'Container' => 'Container', - 'CostCenter' => 'CostCenter', 'CostIndicator' => 'Purchase tax code', - 'CostObject' => 'CostObject', 'Countries' => 'Countries', 'Country' => 'Country', 'Created' => 'Created',