service = $this->app->Container->get('ArticleService');
$this->app->ActionHandlerInit($this);
@@ -5202,157 +5204,11 @@ class Artikel extends GenArtikel {
$freifelderuebersetzung = 0;
}
- $data = array($id, $einkaufspreise, $verkaufspreise, $dateien, $eigenschaften, $anweisungen, $stuecklisten, $freifelderuebersetzung);
-
- $idnew = $this->ArtikelCopy($data, true);
+ $idnew = $this->service->CopyArticle($id, $einkaufspreise, $verkaufspreise, $dateien, $eigenschaften, $anweisungen, $stuecklisten, $freifelderuebersetzung);
echo json_encode(array('status'=>1,'url'=>'index.php?module=artikel&action=edit&id='.$idnew));
$this->app->ExitXentral();
}
- function ArtikelCopy($data = null, $return = false)
- {
- //$id = $this->app->Secure->GetGET("id");
- $id = $data[0];
- $einkaufspreise = $data[1];
- $verkaufspreise = $data[2];
- $dateien = $data[3];
- $eigenschaften = $data[4];
- $anweisungen = $data[5];
- $stuecklisten = $data[6];
- $freifelderuebersetzung = $data[7];
-
- $this->app->DB->MysqlCopyRow('artikel','id',$id);
-
- $idnew = $this->app->DB->GetInsertID();
-
- $steuersatz = $this->app->DB->Select("SELECT steuersatz FROM artikel WHERE id = '$id' LIMIT 1");
- if($steuersatz == ''){
- $steuersatz = -1.00;
- $this->app->DB->Update("UPDATE artikel SET steuersatz = '$steuersatz' WHERE id = '$idnew' LIMIT 1");
- }
-
- $this->app->DB->Update("UPDATE artikel SET nummer='' WHERE id='$idnew' LIMIT 1");
- if($this->app->DB->Select("SELECT variante_kopie FROM artikel WHERE id = '$id' LIMIT 1"))$this->app->DB->Update("UPDATE artikel SET variante = 1, variante_von = '$id' WHERE id = '$idnew' LIMIT 1");
-
- if($stuecklisten == 1){
- // wenn stueckliste
- $stueckliste = $this->app->DB->Select("SELECT stueckliste FROM artikel WHERE id='$id' LIMIT 1");
- if($stueckliste==1)
- {
- $artikelarr = $this->app->DB->SelectArr("SELECT * FROM stueckliste WHERE stuecklistevonartikel='$id'");
- $cartikelarr = $artikelarr?count($artikelarr):0;
- for($i=0;$i<$cartikelarr;$i++)
- {
- $sort = $artikelarr[$i]['sort'];
- $artikel = $artikelarr[$i]['artikel'];
- $referenz = $artikelarr[$i]['referenz'];
- $place = $artikelarr[$i]['place'];
- $layer = $artikelarr[$i]['layer'];
- $stuecklistevonartikel = $idnew;
- $menge = $artikelarr[$i]['menge'];
- $firma = $artikelarr[$i]['firma'];
-
- $this->app->DB->Insert("INSERT INTO stueckliste (id,sort,artikel,referenz,place,layer,stuecklistevonartikel,menge,firma) VALUES
- ('','$sort','$artikel','$referenz','$place','$layer','$stuecklistevonartikel','$menge','$firma')");
- }
- }
- }
-
- /*$arbeitsanweisungen = $this->app->DB->SelectArr("SELECT id FROM `artikel_arbeitsanweisung` WHERE artikel = '$id'");
- if($arbeitsanweisungen)
- {
- foreach($arbeitsanweisungen as $arbeitsanweisung)
- {
- $newarbeitsanweisung = $this->app->DB->MysqlCopyRow('artikel_arbeitsanweisung', 'id', $arbeitsanweisung['id']);
- $this->app->DB->Update("UPDATE `artikel_arbeitsanweisung` SET artikel = '$idnew' WHERE id = '$newarbeitsanweisung' LIMIT 1");
- }
- }*/
- //TODO hinweis es wuren keine Preise kopiert
-
- if($einkaufspreise == 1){
- $einkaufspreise = $this->app->DB->SelectArr("SELECT id FROM einkaufspreise WHERE artikel = '$id'");
- if($einkaufspreise){
- foreach($einkaufspreise as $preis){
- $neuereinkaufspreis = $this->app->DB->MysqlCopyRow("einkaufspreise", "id", $preis['id']);
- $this->app->DB->Update("UPDATE einkaufspreise SET artikel = '$idnew' WHERE id = '$neuereinkaufspreis' LIMIT 1");
- }
- }
- }
-
- if($verkaufspreise == 1){
- $verkaufspreise = $this->app->DB->SelectArr("SELECT id FROM verkaufspreise WHERE artikel = '$id'");
- if($verkaufspreise){
- foreach($verkaufspreise as $preis){
- $neuerverkaufspreis = $this->app->DB->MysqlCopyRow("verkaufspreise", "id", $preis['id']);
- $this->app->DB->Update("UPDATE verkaufspreise SET artikel = '$idnew' WHERE id = '$neuerverkaufspreis' LIMIT 1");
- }
- }
- }
-
- if($dateien == 1){
- $dateien = $this->app->DB->SelectArr("SELECT DISTINCT datei FROM datei_stichwoerter WHERE parameter = '$id' AND objekt = 'Artikel'");
- $datei_stichwoerter = $this->app->DB->SelectArr("SELECT id,datei FROM datei_stichwoerter WHERE parameter = '$id' AND objekt = 'Artikel'");
-
- if($dateien){
- foreach($dateien as $datei){
- $titel = $this->app->DB->Select("SELECT titel FROM datei WHERE id='".$datei['datei']."' LIMIT 1");
- $beschreibung = $this->app->DB->Select("SELECT beschreibung FROM datei WHERE id='".$datei['datei']."' LIMIT 1");
- $nummer = $this->app->DB->Select("SELECT nummer FROM datei WHERE id='".$datei['datei']."' LIMIT 1");
- $name = $this->app->DB->Select("SELECT dateiname FROM datei_version WHERE datei='".$this->app->DB->real_escape_string($datei['datei'])."' ORDER by version DESC LIMIT 1");
- $ersteller = $this->app->User->GetName();
- $tmpnewdateiid = $this->app->erp->CreateDatei($name,$titel,$beschreibung,$nummer,$this->app->erp->GetDateiPfad($datei['datei']),$ersteller);
- $datei_mapping[$datei['datei']] = $tmpnewdateiid;
- }
- }
-
- if($datei_stichwoerter){
- foreach($datei_stichwoerter as $datei){
- $neuesstichwort = $this->app->DB->MysqlCopyRow("datei_stichwoerter", "id", $datei['id']);
- $newdatei = $datei_mapping[$datei['datei']];
- $this->app->DB->Update("UPDATE datei_stichwoerter SET datei='$newdatei', parameter = '$idnew', objekt = 'Artikel' WHERE id = '$neuesstichwort' LIMIT 1");
- }
- }
- }
-
- if($eigenschaften == 1){
- $aeigenschaften = $this->app->DB->SelectArr("SELECT id FROM artikeleigenschaftenwerte WHERE artikel = '$id'");
- if($aeigenschaften){
- foreach($aeigenschaften as $eigenschaft){
- $neue_eigenschaft = $this->app->DB->MysqlCopyRow("artikeleigenschaftenwerte", "id", $eigenschaft['id']);
- $this->app->DB->Update("UPDATE artikeleigenschaftenwerte SET artikel = '$idnew' WHERE id = '$neue_eigenschaft' LIMIT 1");
- }
- }
- }
-
- //WERDEN AUCH SCHON IMMER KOPIERT
- if($anweisungen == 1){
- $arbeitsanweisungen = $this->app->DB->SelectArr("SELECT id FROM artikel_arbeitsanweisung WHERE artikel = '$id'");
- if($arbeitsanweisungen){
- foreach($arbeitsanweisungen as $anweisung){
- $neue_anweisung = $this->app->DB->MysqlCopyRow("artikel_arbeitsanweisung", "id", $anweisung['id']);
- $this->app->DB->Update("UPDATE artikel_arbeitsanweisung SET artikel = '$idnew' WHERE id = '$neue_anweisung' LIMIT 1");
- }
- }
- }
-
- if($freifelderuebersetzung == 1){
- $freifelderuebersetzungen = $this->app->DB->SelectArr("SELECT id FROM artikel_freifelder WHERE artikel = '$id'");
- if($freifelderuebersetzungen){
- $this->app->DB->Insert("INSERT INTO artikel_freifelder (artikel, sprache, nummer, wert) SELECT '$idnew', sprache, nummer, wert FROM artikel_freifelder WHERE artikel = '$id'");
- }
- }
-
- // artikelbilder kopieren
-
- if($return){
- return $idnew;
- }
-
- // eventuell einkaufspreise verkaufspreise und stueckliste kopieren?
- $msg = $this->app->erp->base64_url_encode("Sie befinden sich in der neuen Kopie des Artikels. Bitte legen Sie Verkaufs- und Einkaufspreise und Bilder bzw. Dateien an! Diese wurden nicht kopiert!
");
- $this->app->Location->execute("index.php?module=artikel&action=edit&msg=$msg&id=".$idnew);
- }
-
public function ArtikelProjekte()
{
$this->app->Tpl->Add('UEBERSCHRIFT',' (Projekte)');
diff --git a/www/pages/content/matrixprodukt_article.tpl b/www/pages/content/matrixprodukt_article.tpl
index 4f4ea74b..f884d344 100644
--- a/www/pages/content/matrixprodukt_article.tpl
+++ b/www/pages/content/matrixprodukt_article.tpl
@@ -44,7 +44,7 @@ SPDX-License-Identifier: LicenseRef-EGPL-3.1
diff --git a/www/pages/matrixprodukt.php b/www/pages/matrixprodukt.php
index 591fd8c2..63c57d8a 100644
--- a/www/pages/matrixprodukt.php
+++ b/www/pages/matrixprodukt.php
@@ -7,6 +7,7 @@
use Xentral\Components\Http\JsonResponse;
use Xentral\Components\Http\Request;
use Xentral\Components\Http\Response;
+use Xentral\Modules\Article\Service\ArticleService;
use Xentral\Modules\MatrixProduct\Data\Group;
use Xentral\Modules\MatrixProduct\Data\Option;
use Xentral\Modules\MatrixProduct\Data\Translation;
@@ -16,6 +17,7 @@ class Matrixprodukt
{
private ApplicationCore $app;
private MatrixProductService $service;
+ private ArticleService $articleService;
private Request $request;
const MODULE_NAME = 'MatrixProduct';
@@ -30,6 +32,7 @@ class Matrixprodukt
return;
$this->service = $this->app->Container->get('MatrixProductService');
$this->request = $this->app->Container->get('Request');
+ $this->articleService = $this->app->Container->get('ArticleService');
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list", "ActionList");
@@ -120,18 +123,13 @@ class Matrixprodukt
$heading[] = 'Artikel';
$width[] = '5%';
$nameColumns = [];
- $optIdColumns = [];
- $optNameColumns = [];
- $optFrom = [];
- $optWhere = [];
+ $joins = [];
foreach ($groups as $groupId => $groupName) {
$heading[] = $groupName;
$width[] = '5%';
- $nameColumns[] = "name_$groupId";
- $optIdColumns[] = "moa_$groupId.id";
- $optNameColumns[] = "moa_$groupId.name as name_$groupId";
- $optFrom[] = "matrixprodukt_eigenschaftenoptionen_artikel moa_$groupId";
- $optWhere[] = "moa_$groupId.artikel = $id AND moa_$groupId.gruppe = $groupId";
+ $nameColumns[] = "MAX(moa_$groupId.name)";
+ $joins[] = "LEFT JOIN matrixprodukt_eigenschaftenoptionen_artikel moa_$groupId
+ ON mota.option_id=moa_$groupId.id AND moa_$groupId.gruppe = $groupId";
}
$heading[] = 'Menü';
$width[] = '1%';
@@ -141,24 +139,15 @@ class Matrixprodukt
. "Conf->WFconf['defaulttheme']}/images/edit.svg\"> "
. "Conf->WFconf['defaulttheme']}/images/delete.svg\">"
. "";
- $optsqlIdCols = join(',', $optIdColumns);
- $optsqlNameCols = join(',', $optNameColumns);
- $optsqlFrom = join(' JOIN ', $optFrom);
- $optsqlWhere = join(' AND ', $optWhere);
- $optsql = "SELECT CONCAT_WS(',', $optsqlIdCols) idlist, $optsqlNameCols
- FROM $optsqlFrom WHERE $optsqlWhere";
- $artsql = "SELECT a.id, a.nummer, group_concat(mota.option_id order by mota.option_id separator ',') idlist
- FROM matrixprodukt_optionen_zu_artikel mota
- JOIN artikel a ON mota.artikel = a.id WHERE a.variante_von = $id group by mota.artikel";
$sqlNameCols = join(',', array_merge(['art.id', 'art.nummer'], $nameColumns, ['art.id']));
- $sql = "SELECT SQL_CALC_FOUND_ROWS $sqlNameCols
- FROM ($artsql) art ";
- if (!empty($optsqlIdCols))
- $sql .= " LEFT OUTER JOIN ($optsql) opts ON opts.idlist = art.idlist";
- $where = "1";
- //$count = "SELECT count(DISTINCT moa.id)
-// FROM matrixprodukt_eigenschaftengruppen_artikel mga
- // LEFT OUTER JOIN matrixprodukt_eigenschaftenoptionen_artikel moa on moa.gruppe = mga.id WHERE $where";
+ $joinSql = join("\n", $joins);
+ $sql = "SELECT SQL_CALC_FOUND_ROWS $sqlNameCols
+ FROM artikel art
+ LEFT JOIN matrixprodukt_optionen_zu_artikel mota ON mota.artikel = art.id
+ $joinSql";
+ $where = "art.variante_von = $id";
+ $groupby = "GROUP BY art.id";
+ $count = "SELECT count(*) FROM artikel art WHERE $where";
break;
case "matrixproduct_group_translations":
$heading = array('Name', 'Name (extern)', 'Sprache', 'Übersetzung Name', 'Übersetzung Name (extern)', 'Menü');
@@ -357,10 +346,51 @@ class Matrixprodukt
$json = $this->request->getJson();
$this->service->DeleteVariant($json->variantId);
return JsonResponse::NoContent();
- case "acarticles":
- $query = $this->app->Secure->GetGET('query');
- $result = $this->app->DB->SelectArr("SELECT id, nummer, name_de FROM artikel WHERE (nummer LIKE '%$query%' OR name_de LIKE '%$query%') AND geloescht = 0");
- return new JsonResponse($result);
+ case "createMissing":
+ if ($this->request->getMethod() === 'GET') {
+ $articleId = $this->request->get->getInt('articleId');
+ $groups = $this->service->GetArticleGroupsByArticleId($articleId);
+ $options = $this->service->GetArticleOptionsByArticleId($articleId);
+ foreach ($groups as $group) {
+ $result[$group->id] = [
+ 'name' => $group->name,
+ 'selected' => [],
+ 'required' => $group->required,
+ 'options' => []
+ ];
+ }
+ foreach ($options as $option) {
+ $result[$option->groupId]['options'][] = ['value' => $option->id, 'name' => $option->name];
+ $result[$option->groupId]['selected'][] = $option->id;
+ }
+ return new JsonResponse(['groups' => $result ?? []]);
+ } else {
+ $json = $this->request->getJson();
+ $list = [[]];
+ foreach ($json->groups as $group) {
+ if (empty($group->selected))
+ continue;
+ $newList = [];
+ foreach ($list as $old) {
+ foreach ($group->selected as $option) {
+ $newList[] = array_merge($old, [$option]);
+ }
+ }
+ $list = $newList;
+ }
+ $oldnumber = $this->app->DB->Select("SELECT nummer FROM artikel WHERE id = $json->articleId");
+ $created = [];
+ foreach ($list as $optionSet) {
+ $variantId = $this->service->GetVariantIdByOptionSet($optionSet);
+ if ($variantId)
+ continue;
+ $number = $oldnumber.'_'.$this->service->GetSuffixStringForOptionSet($optionSet);
+ $newId = $this->articleService->CopyArticle($json->articleId, true, true, true, true, true, true, true, $number);
+ $this->service->SaveVariant($json->articleId, $newId, $optionSet);
+ $created[] = $number;
+ }
+ return new JsonResponse($created);
+ }
}
$articleId = $this->app->Secure->GetGET('id');