2023-03-30 10:54:18 +02:00
|
|
|
<?php
|
|
|
|
/*
|
|
|
|
* SPDX-FileCopyrightText: 2023 Andreas Palm
|
|
|
|
* SPDX-License-Identifier: LicenseRef-EGPL-3.1
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Xentral\Modules\MatrixProduct;
|
|
|
|
|
|
|
|
use Xentral\Components\Database\Database;
|
|
|
|
use Xentral\Modules\MatrixProduct\Data\Group;
|
|
|
|
use Xentral\Modules\MatrixProduct\Data\Option;
|
2023-12-11 22:13:37 +01:00
|
|
|
use Xentral\Modules\MatrixProduct\Data\Translation;
|
2023-03-30 10:54:18 +02:00
|
|
|
|
|
|
|
final class MatrixProductGateway
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @param Database $db
|
|
|
|
*/
|
|
|
|
public function __construct(private readonly Database $db)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//region Groups
|
|
|
|
public function GetGlobalGroupById(int $id) : Group {
|
|
|
|
$sql = "SELECT * FROM matrixprodukt_eigenschaftengruppen WHERE id = :id";
|
|
|
|
$res = $this->db->fetchRow($sql, ['id' => $id]);
|
|
|
|
return Group::fromDbArray($res);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function GetArticleGroupById(int $id) : Group {
|
|
|
|
$sql = "SELECT * FROM matrixprodukt_eigenschaftengruppen_artikel WHERE id = :id";
|
|
|
|
$res = $this->db->fetchRow($sql, ['id' => $id]);
|
|
|
|
return Group::fromDbArray($res);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function GetArticleGroupIdByName(int $articleId, string $name) : int {
|
|
|
|
$sql = "SELECT id FROM matrixprodukt_eigenschaftengruppen_artikel
|
|
|
|
WHERE name = :name AND artikel = :articleId";
|
|
|
|
return $this->db->fetchValue($sql, [
|
|
|
|
'name' => $name,
|
|
|
|
'articleId' => $articleId
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function GetArticleGroupsByArticleId(int $articleId) : array {
|
|
|
|
$sql = "SELECT * FROM matrixprodukt_eigenschaftengruppen_artikel WHERE artikel = :articleId";
|
|
|
|
$rows = $this->db->fetchAssoc($sql, ['articleId' => $articleId]);
|
|
|
|
$res = [];
|
|
|
|
foreach ($rows as $row) {
|
|
|
|
$res[] = Group::fromDbArray($row);
|
|
|
|
}
|
|
|
|
return $res;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function InsertGlobalGroup(Group $obj) : Group {
|
|
|
|
$sql = "INSERT INTO matrixprodukt_eigenschaftengruppen
|
|
|
|
(aktiv, name, name_ext, projekt, pflicht)
|
|
|
|
VALUES
|
|
|
|
(:active, :name, :nameExternal, :projectId, :required)";
|
|
|
|
print_r($obj);
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
$obj->id = $this->db->lastInsertId();
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function InsertArticleGroup(Group $obj) : Group {
|
|
|
|
$sql = "INSERT INTO matrixprodukt_eigenschaftengruppen_artikel
|
|
|
|
(artikel, aktiv, name, name_ext, projekt, sort, pflicht)
|
|
|
|
VALUES
|
|
|
|
(:articleId, :active, :name, :nameExternal, :projectId, :sort, :required)";
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
$obj->id = $this->db->lastInsertId();
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function UpdateGlobalGroup(Group $obj) : Group {
|
|
|
|
$sql = "UPDATE matrixprodukt_eigenschaftengruppen
|
|
|
|
SET aktiv = :active, name = :name, name_ext = :nameExternal, projekt = :projectId, pflicht = :required
|
|
|
|
WHERE id = :id";
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function UpdateArticleGroup(Group $obj) : Group {
|
|
|
|
$sql = "UPDATE matrixprodukt_eigenschaftengruppen_artikel
|
|
|
|
SET aktiv = :active, name = :name, name_ext = :nameExternal, projekt = :projectId, sort = :sort, pflicht = :required
|
|
|
|
WHERE id = :id";
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function DeleteGlobalGroup(int $id) : void {
|
|
|
|
$sql = "UPDATE matrixprodukt_eigenschaftenoptionen_artikel moa
|
|
|
|
JOIN matrixprodukt_eigenschaftenoptionen mo ON moa.matrixprodukt_eigenschaftenoptionen=mo.id
|
|
|
|
JOIN matrixprodukt_eigenschaftengruppen mg ON mo.gruppe=mg.id
|
|
|
|
SET moa.matrixprodukt_eigenschaftenoptionen=0
|
|
|
|
WHERE mg.id = :id";
|
|
|
|
$this->db->perform($sql, ['id' => $id]);
|
|
|
|
$sql = "DELETE mg, mo
|
|
|
|
FROM matrixprodukt_eigenschaftengruppen mg
|
|
|
|
LEFT OUTER JOIN matrixprodukt_eigenschaftenoptionen mo ON mo.gruppe = mg.id
|
|
|
|
WHERE mg.id = :id";
|
|
|
|
$this->db->perform($sql, ['id' => $id]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function DeleteArticleGroup(int $id) : void {
|
|
|
|
$sql = "DELETE mga, moa, mota
|
|
|
|
FROM matrixprodukt_eigenschaftengruppen_artikel mga
|
|
|
|
LEFT OUTER JOIN matrixprodukt_eigenschaftenoptionen_artikel moa ON moa.gruppe = mga.id
|
|
|
|
LEFT OUTER JOIN matrixprodukt_optionen_zu_artikel mota ON mota.option_id = moa.id
|
|
|
|
WHERE mga.id = :id";
|
|
|
|
$this->db->perform($sql, ['id' => $id]);
|
|
|
|
}
|
|
|
|
//endregion
|
|
|
|
|
|
|
|
//region Options
|
|
|
|
public function GetGlobalOptionById(int $id) : Option {
|
|
|
|
$sql = "SELECT * FROM matrixprodukt_eigenschaftenoptionen WHERE id = :id";
|
|
|
|
$res = $this->db->fetchRow($sql, ['id' => $id]);
|
|
|
|
return Option::fromDbArray($res);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function GetArticleOptionById(int $id) : Option {
|
|
|
|
$sql = "SELECT * FROM matrixprodukt_eigenschaftenoptionen_artikel WHERE id = :id";
|
|
|
|
$res = $this->db->fetchRow($sql, ['id' => $id]);
|
|
|
|
return Option::fromDbArray($res);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function GetArticleOptionIdsByGroupIds(int|array $groupIds) : array {
|
2024-03-15 22:22:27 +01:00
|
|
|
if (empty($groupIds))
|
|
|
|
return [];
|
2023-03-30 10:54:18 +02:00
|
|
|
$sql = "SELECT id FROM matrixprodukt_eigenschaftenoptionen WHERE gruppe IN (:ids)";
|
|
|
|
return $this->db->fetchCol($sql, ['ids' => $groupIds]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function GetArticleOptionIdByName(int $articleId, int $groupId, string $name) : int {
|
|
|
|
$sql = "SELECT id FROM matrixprodukt_eigenschaftenoptionen_artikel
|
|
|
|
WHERE name = :name AND artikel = :articleId AND gruppe = :groupId";
|
|
|
|
return $this->db->fetchValue($sql, [
|
|
|
|
'name' => $name,
|
|
|
|
'articleId' => $articleId,
|
|
|
|
'groupId' => $groupId
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function GetArticleOptionsByArticleId(int $articleId) : array {
|
|
|
|
$sql = "SELECT * FROM matrixprodukt_eigenschaftenoptionen_artikel WHERE artikel = :articleId";
|
|
|
|
$rows = $this->db->fetchAssoc($sql, ['articleId' => $articleId]);
|
|
|
|
$res = [];
|
|
|
|
foreach ($rows as $row) {
|
|
|
|
$res[] = Option::fromDbArray($row);
|
|
|
|
}
|
|
|
|
return $res;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function GetSelectedOptionIdsByVariantId(int $variantId) : array {
|
|
|
|
$sql = "SELECT option_id FROM matrixprodukt_optionen_zu_artikel WHERE artikel = :variantId";
|
|
|
|
return $this->db->fetchCol($sql, ['variantId' => $variantId]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function InsertGlobalOption(Option $obj) : Option {
|
|
|
|
$sql = "INSERT INTO matrixprodukt_eigenschaftenoptionen
|
|
|
|
(aktiv, name, name_ext, sort, gruppe, artikelnummer, articlenumber_suffix)
|
|
|
|
VALUES
|
|
|
|
(:active, :name, :nameExternal, :sort, :groupId, :articleNumber, :articleNumberSuffix)";
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
$obj->id = $this->db->lastInsertId();
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function InsertArticleOption(Option $obj) : Option {
|
|
|
|
$sql = "INSERT INTO matrixprodukt_eigenschaftenoptionen_artikel
|
|
|
|
(artikel, matrixprodukt_eigenschaftenoptionen, aktiv, name, name_ext, sort, gruppe, artikelnummer, articlenumber_suffix)
|
|
|
|
VALUES
|
|
|
|
(:articleId, :globalOptionId, :active, :name, :nameExternal, :sort, :groupId, :articleNumber, :articleNumberSuffix)";
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
$obj->id = $this->db->lastInsertId();
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function UpdateGlobalOption(Option $obj) : Option {
|
|
|
|
$sql = "UPDATE matrixprodukt_eigenschaftenoptionen
|
|
|
|
SET aktiv = :active, name = :name, name_ext = :nameExternal, sort = :sort, artikelnummer = :articleNumber,
|
|
|
|
articlenumber_suffix = :articleNumberSuffix
|
|
|
|
WHERE id = :id";
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function UpdateArticleOption(Option $obj) : Option {
|
|
|
|
$sql = "UPDATE matrixprodukt_eigenschaftenoptionen_artikel
|
|
|
|
SET aktiv = :active, name = :name, name_ext = :nameExternal, sort = :sort, artikelnummer = :articleNumber,
|
|
|
|
articlenumber_suffix = :articleNumberSuffix
|
|
|
|
WHERE id = :id";
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function DeleteGlobalOption(int $id) : void {
|
|
|
|
$sql = "UPDATE matrixprodukt_eigenschaftenoptionen_artikel moa
|
|
|
|
JOIN matrixprodukt_eigenschaftenoptionen mo ON moa.matrixprodukt_eigenschaftenoptionen=mo.id
|
|
|
|
SET moa.matrixprodukt_eigenschaftenoptionen=0
|
|
|
|
WHERE mo.id = :id";
|
|
|
|
$this->db->perform($sql, ['id' => $id]);
|
|
|
|
$sql = "DELETE moa
|
|
|
|
FROM matrixprodukt_eigenschaftenoptionen mo
|
|
|
|
WHERE mo.id = :id";
|
|
|
|
$this->db->perform($sql, ['id' => $id]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function DeleteArticleOption(int $id) : void {
|
|
|
|
$sql = "DELETE moa, mota
|
|
|
|
FROM matrixprodukt_eigenschaftenoptionen_artikel moa
|
|
|
|
LEFT OUTER JOIN matrixprodukt_optionen_zu_artikel mota ON mota.option_id=moa.id
|
|
|
|
WHERE moa.id = :id";
|
|
|
|
$this->db->perform($sql, ['id' => $id]);
|
|
|
|
}
|
|
|
|
//endregion
|
|
|
|
|
|
|
|
//region Variants
|
|
|
|
public function ReplaceVariant(int $oldId, int $newId) : void {
|
|
|
|
$sql = "UPDATE matrixprodukt_optionen_zu_artikel SET artikel = :newId WHERE artikel = :oldId";
|
|
|
|
$this->db->perform($sql, [
|
|
|
|
'oldId' => $oldId,
|
|
|
|
'newId' => $newId]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param int $variantId
|
|
|
|
* @return int[]
|
|
|
|
*/
|
|
|
|
public function GetOptionIdsByVariant(int $variantId) : array {
|
|
|
|
$sql = "SELECT option_id FROM matrixprodukt_optionen_zu_artikel WHERE artikel = :id";
|
|
|
|
return $this->db->fetchCol($sql, ['id' => $variantId]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function AddOptionToVariant(int $variantId, int $optionId) : void {
|
|
|
|
$sql = "INSERT INTO matrixprodukt_optionen_zu_artikel (artikel, option_id) VALUES (:variantId, :optionId)";
|
|
|
|
$this->db->perform($sql, [
|
|
|
|
'variantId' => $variantId,
|
|
|
|
'optionId' => $optionId
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function DeleteOptionFromVariant(int $variantId, int $optionId) : void {
|
|
|
|
$sql = "DELETE FROM matrixprodukt_optionen_zu_artikel WHERE artikel = :variantId AND option_id = :optionId";
|
|
|
|
$this->db->perform($sql, [
|
|
|
|
'variantId' => $variantId,
|
|
|
|
'optionId' => $optionId
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function GetVariantIdByOptions(array $optionIds) : ?int {
|
|
|
|
if (empty($optionIds))
|
|
|
|
return null;
|
|
|
|
sort($optionIds);
|
|
|
|
$sql = "SELECT artikel
|
|
|
|
FROM matrixprodukt_optionen_zu_artikel
|
|
|
|
WHERE option_id IN (:ids)
|
|
|
|
GROUP BY artikel
|
|
|
|
HAVING group_concat(option_id order by option_id separator ',') = :idList";
|
|
|
|
$res = $this->db->fetchValue($sql, [
|
|
|
|
'ids' => $optionIds,
|
|
|
|
'idList' => join(',', $optionIds)
|
|
|
|
]);
|
|
|
|
return $res ?: null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function GetVariantIdsByOptions(int|array $optionIds) : array
|
|
|
|
{
|
2024-03-15 22:22:27 +01:00
|
|
|
if (empty($optionIds))
|
|
|
|
return [];
|
2023-03-30 10:54:18 +02:00
|
|
|
$sql = "SELECT artikel FROM matrixprodukt_optionen_zu_artikel WHERE option_id IN (:ids)";
|
|
|
|
return $this->db->fetchCol($sql, ['ids' => $optionIds]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function DeleteVariantById(int $variantId) : void {
|
|
|
|
$sql = "DELETE FROM matrixprodukt_optionen_zu_artikel WHERE artikel = :id";
|
|
|
|
$this->db->perform($sql, ['id' => $variantId]);
|
|
|
|
}
|
2024-04-24 15:14:35 +02:00
|
|
|
|
|
|
|
public function GetSuffixStringForOptionSet(array $optionIds) : string {
|
|
|
|
$sql = "SELECT GROUP_CONCAT(IFNULL(NULLIF(mao.articlenumber_suffix,''), mao.id) ORDER BY mag.sort, mag.id SEPARATOR '_')
|
|
|
|
FROM matrixprodukt_eigenschaftenoptionen_artikel mao
|
|
|
|
JOIN matrixprodukt_eigenschaftengruppen_artikel mag ON mao.gruppe = mag.id
|
|
|
|
WHERE mao.id IN (:idList)";
|
|
|
|
$res = $this->db->fetchValue($sql, ['idList' => $optionIds]);
|
|
|
|
return $res;
|
|
|
|
}
|
2023-03-30 10:54:18 +02:00
|
|
|
//endregion
|
2023-12-11 22:13:37 +01:00
|
|
|
|
|
|
|
//region Translations
|
|
|
|
public function GetGroupTranslationById(int $id) : Translation {
|
|
|
|
$sql = "SELECT * FROM matrix_article_translation WHERE id = :id";
|
|
|
|
$row = $this->db->fetchRow($sql, ['id' => $id]);
|
|
|
|
return Translation::fromDbArray($row);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function GetOptionTranslationById(int $id) : Translation {
|
|
|
|
$sql = "SELECT * FROM matrix_article_options_translation WHERE id = :id";
|
|
|
|
$row = $this->db->fetchRow($sql, ['id' => $id]);
|
|
|
|
return Translation::fromDbArray($row);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function InsertGroupTranslation(Translation $obj) : Translation {
|
|
|
|
$sql = "INSERT INTO matrix_article_translation
|
|
|
|
(language_from, language_to, name_from, name_to, name_external_from, name_external_to)
|
|
|
|
VALUES (:languageFrom, :languageTo, :nameFrom, :nameTo, :nameExternalFrom, :nameExternalTo)";
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
$obj->id = $this->db->lastInsertId();
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function InsertOptionTranslation(Translation $obj) : Translation {
|
|
|
|
$sql = "INSERT INTO matrix_article_options_translation
|
|
|
|
(language_from, language_to, name_from, name_to, name_external_from, name_external_to)
|
|
|
|
VALUES (:languageFrom, :languageTo, :nameFrom, :nameTo, :nameExternalFrom, :nameExternalTo)";
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
$obj->id = $this->db->lastInsertId();
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function UpdateGroupTranslation(Translation $obj) : Translation {
|
|
|
|
$sql = "UPDATE matrix_article_translation SET language_from = :languageFrom, language_to = :languageTo,
|
|
|
|
name_from = :nameFrom, name_to = :nameTo, name_external_from = :nameExternalFrom,
|
|
|
|
name_external_to = :nameExternalTo WHERE id = :id";
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function UpdateOptionTranslation(Translation $obj) : Translation {
|
|
|
|
$sql = "UPDATE matrix_article_options_translation SET language_from = :languageFrom, language_to = :languageTo,
|
|
|
|
name_from = :nameFrom, name_to = :nameTo, name_external_from = :nameExternalFrom,
|
|
|
|
name_external_to = :nameExternalTo WHERE id = :id";
|
|
|
|
$this->db->perform($sql, (array)$obj);
|
|
|
|
return $obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function DeleteGroupTranslation(int $id) : void {
|
|
|
|
$sql = "DELETE FROM matrix_article_translation WHERE id = :id";
|
|
|
|
$this->db->perform($sql, ['id' => $id]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function DeleteOptionTranslation(int $id) : void {
|
|
|
|
$sql = "DELETE FROM matrix_article_options_translation WHERE id = :id";
|
|
|
|
$this->db->perform($sql, ['id' => $id]);
|
|
|
|
}
|
|
|
|
//endregion
|
2023-03-30 10:54:18 +02:00
|
|
|
}
|