Skip to content

Commit 15b0301

Browse files
committed
feat: #1615 Uniformare categorie e sottocategorie
1 parent ecc7303 commit 15b0301

30 files changed

Lines changed: 498 additions & 809 deletions

File tree

modules/articoli/add.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@
4747
</div>
4848

4949
<div class="col-md-6">
50-
{[ "type": "select", "label": "<?php echo tr('Categoria'); ?>", "name": "categoria", "required": 0, "ajax-source": "categorie", "icon-after": "add|<?php echo Module::where('name', 'Categorie articoli')->first()->id; ?>" ]}
50+
{[ "type": "select", "label": "<?php echo tr('Categoria'); ?>", "name": "categoria", "required": 0, "ajax-source": "categorie", "icon-after": "add|<?php echo Module::where('name', 'Categorie')->first()->id; ?>" ]}
5151
</div>
5252

5353
<div class="col-md-6">
54-
{[ "type": "select", "label": "<?php echo tr('Sottocategoria'); ?>", "name": "subcategoria", "id": "subcategoria_add", "ajax-source": "sottocategorie", "icon-after": "add|<?php echo Module::where('name', 'Categorie articoli')->first()->id; ?>||hide" ]}
54+
{[ "type": "select", "label": "<?php echo tr('Sottocategoria'); ?>", "name": "subcategoria", "id": "subcategoria_add", "ajax-source": "sottocategorie", "icon-after": "add|<?php echo Module::where('name', 'Categorie')->first()->id; ?>||hide" ]}
5555
</div>
5656
</div>
5757

modules/articoli/ajax/select.php

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,13 @@
9898
`righe`.`media_ponderata`,
9999
CONCAT(`conto_vendita_categoria` .`numero`, '.', `conto_vendita_sottocategoria`.`numero`, ' ', `conto_vendita_sottocategoria`.`descrizione`) AS idconto_vendita_title,
100100
CONCAT(`conto_acquisto_categoria` .`numero`, '.', `conto_acquisto_sottocategoria`.`numero`, ' ', `conto_acquisto_sottocategoria`.`descrizione`) AS idconto_acquisto_title
101-
FROM
101+
FROM
102102
`mg_articoli`
103103
LEFT JOIN `mg_articoli_lang` ON (`mg_articoli`.`id` = `mg_articoli_lang`.`id_record` AND `mg_articoli_lang`.`id_lang` = ".prepare(Models\Locale::getDefault()->id).')
104-
LEFT JOIN `mg_categorie` AS categoria ON `categoria`.`id` = `mg_articoli`.`id_categoria`
105-
LEFT JOIN `mg_categorie_lang` AS categoria_lang ON (`categoria`.`id` = `categoria_lang`.`id_record` AND `categoria_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')
106-
LEFT JOIN `mg_categorie` AS sottocategoria ON `sottocategoria`.`id` = `mg_articoli`.`id_sottocategoria`
107-
LEFT JOIN `mg_categorie_lang` AS sottocategoria_lang ON (`sottocategoria`.`id` = `sottocategoria_lang`.`id_record` AND `sottocategoria_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).")
104+
LEFT JOIN `zz_categorie` AS categoria ON `categoria`.`id` = `mg_articoli`.`id_categoria`
105+
LEFT JOIN `zz_categorie_lang` AS categoria_lang ON (`categoria`.`id` = `categoria_lang`.`id_record` AND `categoria_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).')
106+
LEFT JOIN `zz_categorie` AS sottocategoria ON `sottocategoria`.`id` = `mg_articoli`.`id_sottocategoria`
107+
LEFT JOIN `zz_categorie_lang` AS sottocategoria_lang ON (`sottocategoria`.`id` = `sottocategoria_lang`.`id_record` AND `sottocategoria_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).")
108108
LEFT JOIN `co_pianodeiconti3` AS conto_vendita_sottocategoria ON `conto_vendita_sottocategoria`.`id`=`mg_articoli`.`idconto_vendita`
109109
LEFT JOIN `co_pianodeiconti2` AS conto_vendita_categoria ON `conto_vendita_sottocategoria`.`idpianodeiconti2`=`conto_vendita_categoria`.`id`
110110
LEFT JOIN `co_pianodeiconti3` AS conto_acquisto_sottocategoria ON `conto_acquisto_sottocategoria`.`id`=`mg_articoli`.`idconto_acquisto`
@@ -221,13 +221,14 @@
221221
break;
222222

223223
case 'categorie':
224-
$query = 'SELECT `mg_categorie`.`id`, `title` AS descrizione FROM `mg_categorie` LEFT JOIN `mg_categorie_lang` ON (`mg_categorie`.`id` = `mg_categorie_lang`.`id_record` AND `mg_categorie_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') |where| ORDER BY `title`';
224+
$query = 'SELECT `zz_categorie`.`id`, `title` AS descrizione FROM `zz_categorie` LEFT JOIN `zz_categorie_lang` ON (`zz_categorie`.`id` = `zz_categorie_lang`.`id_record` AND `zz_categorie_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') |where| ORDER BY `title`';
225225

226226
foreach ($elements as $element) {
227-
$filter[] = '`mg_categorie`.`id`='.prepare($element);
227+
$filter[] = '`zz_categorie`.`id`='.prepare($element);
228228
}
229229

230230
$where[] = '`parent` IS NULL';
231+
$where[] = '`zz_categorie`.`is_articolo` = 1';
231232

232233
if (!empty($search)) {
233234
$search_fields[] = '`title` LIKE '.prepare('%'.$search.'%');
@@ -241,13 +242,14 @@
241242
*/
242243
case 'sottocategorie':
243244
if (isset($superselect['id_categoria'])) {
244-
$query = 'SELECT `mg_categorie`.`id`, `title` AS descrizione FROM `mg_categorie` LEFT JOIN `mg_categorie_lang` ON (`mg_categorie`.`id` = `mg_categorie_lang`.`id_record` AND `mg_categorie_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') |where| ORDER BY `title`';
245+
$query = 'SELECT `zz_categorie`.`id`, `title` AS descrizione FROM `zz_categorie` LEFT JOIN `zz_categorie_lang` ON (`zz_categorie`.`id` = `zz_categorie_lang`.`id_record` AND `zz_categorie_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') |where| ORDER BY `title`';
245246

246247
foreach ($elements as $element) {
247-
$filter[] = '`mg_categorie`.`id`='.prepare($element);
248+
$filter[] = '`zz_categorie`.`id`='.prepare($element);
248249
}
249250

250251
$where[] = '`parent`='.prepare($superselect['id_categoria']);
252+
$where[] = '`zz_categorie`.`is_articolo` = 1';
251253

252254
if (!empty($search)) {
253255
$search_fields[] = '`title` LIKE '.prepare('%'.$search.'%');

modules/articoli/edit.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@
6565
<div class="row">
6666
<div class="col-md-3">
6767
<?php echo (!empty($record['id_categoria'])) ?
68-
Modules::link('Categorie articoli', $record['id_categoria'], null, null, 'class="pull-right"') : ''; ?>
69-
{[ "type": "select", "label": "<?php echo tr('Categoria'); ?>", "name": "categoria", "required": 0, "value": "$id_categoria$", "ajax-source": "categorie", "icon-after": "add|<?php echo Module::where('name', 'Categorie articoli')->first()->id; ?>" ]}
68+
Modules::link('Categorie', $record['id_categoria'], null, null, 'class="pull-right"') : ''; ?>
69+
{[ "type": "select", "label": "<?php echo tr('Categoria'); ?>", "name": "categoria", "required": 0, "value": "$id_categoria$", "ajax-source": "categorie", "icon-after": "add|<?php echo Module::where('name', 'Categorie')->first()->id; ?>" ]}
7070
</div>
7171

7272
<div class="col-md-3">
73-
{[ "type": "select", "label": "<?php echo tr('Sottocategoria'); ?>", "name": "subcategoria", "value": "$id_sottocategoria$", "ajax-source": "sottocategorie", "select-options": <?php echo json_encode(['id_categoria' => $record['id_categoria']]); ?>, "icon-after": "add|<?php echo Module::where('name', 'Categorie articoli')->first()->id; ?>|id_original=<?php echo $record['id_categoria']; ?>" ]}
73+
{[ "type": "select", "label": "<?php echo tr('Sottocategoria'); ?>", "name": "subcategoria", "value": "$id_sottocategoria$", "ajax-source": "sottocategorie", "select-options": <?php echo json_encode(['id_categoria' => $record['id_categoria']]); ?>, "icon-after": "add|<?php echo Module::where('name', 'Categorie')->first()->id; ?>|id_original=<?php echo $record['id_categoria']; ?>" ]}
7474
</div>
7575

7676
<div class="col-md-3">

modules/articoli/src/API/v1/Articoli.php

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,27 +47,27 @@ public function retrieve($request)
4747
];
4848

4949
$joins[] = [
50-
'mg_categorie AS categorie',
50+
'zz_categorie AS categorie',
5151
'mg_articoli.id_categoria',
5252
'categorie.id',
5353
];
5454

5555
$joins[] = [
56-
'mg_categorie_lang AS categorie_lang',
56+
'zz_categorie_lang AS categorie_lang',
5757
'categorie_lang.id_record',
5858
'categorie.id',
5959
'categorie_lang.id_lang',
6060
\Models\Locale::getDefault()->id,
6161
];
6262

6363
$joins[] = [
64-
'mg_categorie AS sottocategorie',
64+
'zz_categorie AS sottocategorie',
6565
'mg_articoli.id_sottocategoria',
6666
'sottocategorie.id',
6767
];
6868

6969
$joins[] = [
70-
'mg_categorie_lang AS sottocategorie_lang',
70+
'zz_categorie_lang AS sottocategorie_lang',
7171
'sottocategorie_lang.id_record',
7272
'sottocategorie.id',
7373
'sottocategorie_lang.id_lang',
@@ -133,10 +133,11 @@ protected function gestioneCategorie($nome_categoria, $nome_sottocategoria)
133133
$sottocategoria = null;
134134

135135
// Gestione categoria
136-
$categoria = Categoria::where('nome', '=', $nome_categoria)
136+
$categoria = Categoria::where('title', '=', $nome_categoria)
137137
->first();
138138
if (empty($categoria) && !empty($nome_categoria)) {
139-
$categoria = Categoria::build($nome_categoria);
139+
$categoria = Categoria::build();
140+
$categoria->setTranslation('title', $nome_categoria);
140141
$categoria->save();
141142
}
142143

@@ -146,11 +147,12 @@ protected function gestioneCategorie($nome_categoria, $nome_sottocategoria)
146147
}
147148

148149
// Gestione sotto-categoria
149-
$sottocategoria = Categoria::where('nome', '=', $nome_sottocategoria)
150+
$sottocategoria = Categoria::where('title', '=', $nome_sottocategoria)
150151
->where('parent', '=', $categoria->id)
151152
->first();
152153
if (empty($sottocategoria) && !empty($nome_sottocategoria)) {
153-
$sottocategoria = Categoria::build($nome_sottocategoria);
154+
$sottocategoria = Categoria::build();
155+
$sottocategoria->setTranslation('title', $nome_sottocategoria);
154156
$sottocategoria->parent = $categoria->id;
155157
$sottocategoria->save();
156158
}

modules/articoli/src/Categoria.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class Categoria extends Model
3131
use HierarchyTrait;
3232
use RecordTrait;
3333

34-
protected $table = 'mg_categorie';
34+
protected $table = 'zz_categorie';
3535
protected static $translated_fields = [
3636
'title',
3737
];
@@ -54,7 +54,7 @@ public function articoli()
5454

5555
public function getModuleAttribute()
5656
{
57-
return 'Categorie articoli';
57+
return 'Categorie';
5858
}
5959

6060
public static function getTranslatedFields()
Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,53 @@
2727
$nota = filter('nota');
2828
$colore = filter('colore');
2929
$id_original = filter('id_original') ?: null;
30+
$is_articolo = filter('is_articolo_add') ?: filter('is_articolo') ?: 0;
31+
$is_impianto = filter('is_impianto_add') ?: filter('is_impianto') ?: 0;
32+
33+
// Verifica che almeno uno dei due flag sia selezionato
34+
if ($is_articolo == 0 && $is_impianto == 0) {
35+
flash()->error(tr('È necessario selezionare almeno una delle due opzioni: Articolo o Impianto.'));
36+
break;
37+
}
38+
39+
// Verifica se esiste già una categoria con lo stesso nome
40+
$categoria_esistente = (new Categoria())->getByField('title', $nome);
41+
42+
if (!empty($categoria_esistente) && $categoria_esistente != $id_record) {
43+
// Mostra un messaggio di errore con link alla categoria esistente
44+
$message = tr('Esiste già una categoria con il nome _NOME_', [
45+
'_NOME_' => '"'.$nome.'"',
46+
]);
47+
48+
$link = Modules::link('Categorie', $categoria_esistente->id, $nome);
49+
flash()->error($message.': '.$link);
50+
break;
51+
}
3052

3153
if (isset($nome) && isset($nota) && isset($colore)) {
3254
$categoria->colore = $colore;
3355
$categoria->parent = $id_original ?: null;
56+
$categoria->is_articolo = $is_articolo;
57+
$categoria->is_impianto = $is_impianto;
3458
$categoria->setTranslation('title', $nome);
3559
$categoria->setTranslation('note', $nota);
3660
$categoria->save();
3761

38-
flash()->info(tr('Salvataggio completato!'));
62+
// Aggiorna i flag delle sottocategorie se è un parent
63+
$subcategorie = Categoria::where('parent', '=', $id_record)->get();
64+
if (!empty($subcategorie)) {
65+
foreach ($subcategorie as $sub) {
66+
$sub->is_articolo = $is_articolo;
67+
$sub->is_impianto = $is_impianto;
68+
$sub->save();
69+
}
70+
71+
flash()->info(tr('Salvataggio completato! Aggiornate anche _NUM_ sottocategorie.', [
72+
'_NUM_' => count($subcategorie),
73+
]));
74+
} else {
75+
flash()->info(tr('Salvataggio completato!'));
76+
}
3977
} else {
4078
flash()->error(tr('Ci sono stati alcuni errori durante il salvataggio!'));
4179
}
@@ -54,21 +92,32 @@
5492
$nota = filter('nota');
5593
$colore = filter('colore');
5694
$id_original = filter('id_original') ?: null;
95+
$is_articolo = filter('is_articolo_add') ?: filter('is_articolo') ?: 0;
96+
$is_impianto = filter('is_impianto_add') ?: filter('is_impianto') ?: 0;
5797

58-
$categoria_new = Categoria::where('id', '=', (new Categoria())->getByField('title', $nome));
59-
if (!empty($id_original)) {
60-
$categoria_new = $categoria_new->where('parent', '=', $id_original);
61-
} else {
62-
$categoria_new = $categoria_new->whereNull('parent');
98+
// Verifica che almeno uno dei due flag sia selezionato
99+
if ($is_articolo == 0 && $is_impianto == 0) {
100+
flash()->error(tr('È necessario selezionare almeno una delle due opzioni: Articolo o Impianto.'));
101+
break;
63102
}
64-
$categoria_new = $categoria_new->first();
103+
104+
// Verifica se esiste già una categoria con lo stesso nome
105+
$categoria_new = (new Categoria())->getByField('title', $nome);
65106

66107
if (!empty($categoria_new)) {
67-
flash()->error(tr('Questo nome è già stato utilizzato per un altra categoria.'));
108+
// Mostra un messaggio di errore con link alla categoria esistente
109+
$message = tr('Esiste già una categoria con il nome _NOME_', [
110+
'_NOME_' => '"'.$nome.'"',
111+
]);
112+
113+
$link = Modules::link('Categorie', $categoria_new->id, $categoria_new->getTranslation('title'));
114+
flash()->error($message.': '.$link);
68115
} else {
69116
$categoria = Categoria::build($colore);
70117
$id_record = $dbo->lastInsertedID();
71118
$categoria->parent = $id_original;
119+
$categoria->is_articolo = $is_articolo;
120+
$categoria->is_impianto = $is_impianto;
72121
$categoria->setTranslation('note', $nota);
73122
$categoria->setTranslation('title', $nome);
74123
$categoria->save();
@@ -95,8 +144,8 @@
95144
$id = $id_record;
96145
}
97146

98-
if ($dbo->fetchNum('SELECT * FROM `mg_articoli` WHERE (`id_categoria`='.prepare($id).' OR `id_sottocategoria`='.prepare($id).' OR `id_sottocategoria` IN (SELECT `id` FROM `mg_categorie` WHERE `parent`='.prepare($id).')) AND `deleted_at` IS NULL') == 0) {
99-
$dbo->query('DELETE FROM `mg_categorie` WHERE `id`='.prepare($id));
147+
if ($dbo->fetchNum('SELECT * FROM `mg_articoli` WHERE (`id_categoria`='.prepare($id).' OR `id_sottocategoria`='.prepare($id).' OR `id_sottocategoria` IN (SELECT `id` FROM `zz_categorie` WHERE `parent`='.prepare($id).')) AND `deleted_at` IS NULL') == 0) {
148+
$dbo->query('DELETE FROM `zz_categorie` WHERE `id`='.prepare($id));
100149

101150
flash()->info(tr('Tipologia di _TYPE_ eliminata con successo!', [
102151
'_TYPE_' => 'categoria',
Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919

2020
include_once __DIR__.'/../../core.php';
21+
use Modules\Articoli\Categoria;
2122

2223
$id_original = filter('id_original');
2324

@@ -37,23 +38,37 @@
3738
<input type="hidden" name="backto" value="record-edit">
3839
<input type="hidden" name="id_original" value="<?php echo $id_original; ?>">
3940
<input type="hidden" name="op" value="<?php echo $id_record ? 'update' : 'add'; ?>">
41+
<?php if (!empty($id_original)) : ?>
42+
<input type="hidden" name="is_articolo" value="<?php echo $id_original ? Categoria::find($id_original)->is_articolo : 1; ?>">
43+
<input type="hidden" name="is_impianto" value="<?php echo $id_original ? Categoria::find($id_original)->is_impianto : 0; ?>">
44+
<?php endif; ?>
4045

4146
<div class="row">
42-
<div class="col-md-8">
47+
<div class="col-md-5">
4348
{[ "type": "text", "label": "<?php echo tr('Nome'); ?>", "name": "nome", "required": 1, "value": "$title$" ]}
4449
</div>
4550

46-
<div class="col-md-4">
51+
<div class="col-md-3">
4752
{[ "type": "text", "label": "<?php echo tr('Colore'); ?>", "name": "colore", "id": "colore_", "class": "colorpicker text-center", "value": "<?php echo $categoria->colore; ?>", "extra": "maxlength=\"7\"", "icon-after": "<div class='img-circle square'></div>" ]}
4853
</div>
54+
55+
<div class="col-md-2">
56+
{[ "type": "checkbox", "label": "<?php echo tr('Articolo'); ?>", "name": "is_articolo_add", "value": "<?php echo $categoria ? $categoria->is_articolo : ($id_original ? Categoria::find($id_original)->is_articolo : 1); ?>", "disabled": "<?php echo !empty($id_original) ? 1 : 0; ?>" ]}
57+
</div>
58+
59+
<div class="col-md-2">
60+
{[ "type": "checkbox", "label": "<?php echo tr('Impianto'); ?>", "name": "is_impianto_add", "value": "<?php echo $categoria ? $categoria->is_impianto : ($id_original ? Categoria::find($id_original)->is_impianto : 0); ?>", "disabled": "<?php echo !empty($id_original) ? 1 : 0; ?>" ]}
61+
</div>
4962
</div>
5063

5164
<div class="row">
5265
<div class="col-md-12">
53-
{[ "type": "textarea", "label": "<?php echo tr('Nota'); ?>", "name": "nota", "value": "<?php echo $categoria ? $categoria->getTranslation('note') : ''; ?>" ]}
66+
{[ "type": "textarea", "label": "<?php echo tr('Nota'); ?>", "name": "nota", "value": "<?php echo $categoria ? $categoria->getTranslation('note') : ''; ?>", "rows": "3" ]}
5467
</div>
5568
</div>
5669

70+
71+
5772
<!-- PULSANTI -->
5873
<div class="modal-footer">
5974
<div class="col-md-12 text-right">

0 commit comments

Comments
 (0)