mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-01-03 19:39:48 +01:00
667b343f62
Introduzione moduli Combinazioni e Attributi Combinazioni, al fine di gestire le combinazioni di articoli (varianti) sulla base di Attributi liberamente impostabili. Introduzione plugin dedicato alla visualizzazione delle Varianti Articolo. Modifica del sistema di modifica degli Articoli per sincronizzare in automatico alcuni campi condivisi tra le varianti.
353 lines
12 KiB
PHP
Executable File
353 lines
12 KiB
PHP
Executable File
<?php
|
|
/*
|
|
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
|
* Copyright (C) DevCode s.r.l.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
use Carbon\Carbon;
|
|
use Modules\Articoli\Articolo;
|
|
use Modules\Articoli\Categoria;
|
|
use Modules\CombinazioniArticoli\Combinazione;
|
|
use Util\Ini;
|
|
|
|
include_once __DIR__.'/../../core.php';
|
|
|
|
switch (post('op')) {
|
|
case 'restore':
|
|
$articolo->restore();
|
|
flash()->info(tr('Articolo ripristinato correttamente!'));
|
|
|
|
// Aggiunta articolo
|
|
// no break
|
|
case 'add':
|
|
//Se non specifico il codice articolo lo imposto uguale all'id della riga
|
|
if (empty(post('codice'))) {
|
|
$codice = $dbo->fetchOne('SELECT MAX(id) as codice FROM mg_articoli')['codice'] + 1;
|
|
} else {
|
|
$codice = post('codice', true);
|
|
}
|
|
|
|
// Inserisco l'articolo e avviso se esiste un altro articolo con stesso codice.
|
|
$numero_codice = Articolo::where([
|
|
['codice', $value],
|
|
['id', '<>', $id_record],
|
|
])->count();
|
|
if ($numero_codice > 0) {
|
|
flash()->warning(tr('Attenzione: il codice _CODICE_ è già stato utilizzato _N_ volta', [
|
|
'_CODICE_' => $codice,
|
|
'_N_' => $numero_codice,
|
|
]));
|
|
}
|
|
|
|
$categoria = Categoria::find(post('categoria'));
|
|
$sottocategoria = Categoria::find(post('subcategoria'));
|
|
$articolo = Articolo::build($codice, post('descrizione'), $categoria, $sottocategoria);
|
|
|
|
$articolo->barcode = post('barcode');
|
|
$articolo->threshold_qta = post('threshold_qta');
|
|
$articolo->prezzo_acquisto = post('prezzo_acquisto');
|
|
$articolo->setPrezzoVendita(post('prezzo_vendita'), post('idiva_vendita'));
|
|
$articolo->save();
|
|
|
|
// Aggiornamento delle varianti per i campi comuni
|
|
Combinazione::sincronizzaVarianti($articolo);
|
|
|
|
if (!empty(post('qta'))) {
|
|
$data_movimento = new Carbon();
|
|
$articolo->movimenta(post('qta'), tr('Carico manuale'), $data_movimento->format('Y-m-d'), true);
|
|
}
|
|
|
|
$id_record = $articolo->id;
|
|
|
|
if (isAjaxRequest()) {
|
|
echo json_encode([
|
|
'id' => $id_record,
|
|
'text' => post('codice', true).' - '.post('descrizione'),
|
|
'data' => [
|
|
'descrizione' => post('descrizione'),
|
|
'prezzo_acquisto' => post('prezzo_acquisto'),
|
|
'prezzo_vendita' => post('prezzo_vendita'),
|
|
'idiva_vendita' => post('idiva_vendita'),
|
|
],
|
|
]);
|
|
}
|
|
|
|
flash()->info(tr('Aggiunto un nuovo articolo'));
|
|
|
|
break;
|
|
|
|
// Modifica articolo
|
|
case 'update':
|
|
$qta = post('qta');
|
|
|
|
// Inserisco l'articolo e avviso se esiste un altro articolo con stesso codice.
|
|
$numero_codice = Articolo::where([
|
|
['codice', $value],
|
|
['id', '<>', $id_record],
|
|
])->count();
|
|
if ($numero_codice > 0) {
|
|
flash()->warning(tr('Attenzione: il codice _CODICE_ è già stato utilizzato _N_ volta', [
|
|
'_CODICE_' => post('codice', true),
|
|
'_N_' => $numero_codice,
|
|
]));
|
|
}
|
|
|
|
$articolo->codice = post('codice', true);
|
|
$articolo->barcode = post('barcode');
|
|
$articolo->descrizione = post('descrizione');
|
|
$articolo->um = post('um');
|
|
$articolo->id_categoria = post('categoria');
|
|
$articolo->id_sottocategoria = post('subcategoria');
|
|
$articolo->abilita_serial = post('abilita_serial');
|
|
$articolo->ubicazione = post('ubicazione');
|
|
$articolo->threshold_qta = post('threshold_qta');
|
|
$articolo->prezzo_acquisto = post('prezzo_acquisto');
|
|
$articolo->idconto_vendita = post('idconto_vendita');
|
|
$articolo->idconto_acquisto = post('idconto_acquisto');
|
|
$articolo->id_fornitore = post('id_fornitore');
|
|
$articolo->gg_garanzia = post('gg_garanzia');
|
|
$articolo->servizio = post('servizio');
|
|
$articolo->volume = post('volume');
|
|
$articolo->peso_lordo = post('peso_lordo');
|
|
|
|
$articolo->um_secondaria = post('um_secondaria');
|
|
$articolo->fattore_um_secondaria = post('fattore_um_secondaria');
|
|
$articolo->qta_multipla = post('qta_multipla');
|
|
|
|
$articolo->setPrezzoVendita(post('prezzo_vendita'), post('idiva_vendita'));
|
|
|
|
$componente = post('componente_filename');
|
|
$articolo->componente_filename = $componente;
|
|
$articolo->attivo = post('attivo');
|
|
$articolo->note = post('note');
|
|
|
|
$articolo->save();
|
|
|
|
// Aggiornamento delle varianti per i campi comuni
|
|
Combinazione::sincronizzaVarianti($articolo);
|
|
|
|
// Leggo la quantità attuale per capire se l'ho modificata
|
|
$old_qta = $record['qta'];
|
|
$movimento = $qta - $old_qta;
|
|
|
|
$qta_manuale = post('qta_manuale');
|
|
if (!empty($qta_manuale)) {
|
|
$descrizione_movimento = post('descrizione_movimento');
|
|
$data_movimento = post('data_movimento');
|
|
|
|
$articolo->movimenta($movimento, $descrizione_movimento, $data_movimento, true);
|
|
}
|
|
|
|
// Salvataggio info componente (campo `contenuto`)
|
|
if (!empty($componente)) {
|
|
$contenuto_precedente_esistente = !empty($articolo->contenuto);
|
|
$contenuto = file_get_contents(base_dir().'/files/impianti/'.$componente);
|
|
$contenuto_componente = Ini::read($contenuto);
|
|
|
|
// Lettura dei campi esistenti per preservarne il valore
|
|
// Se non è presente un componente, copia i valori dal file di origine
|
|
$campi_componente = [];
|
|
foreach ($contenuto_componente as $key => $value) {
|
|
//Fix per nomi con spazi che vengono tradotti con "_" (es. Data_di_installazione)
|
|
$key = preg_replace('/\s+/', '_', $key);
|
|
|
|
$valore = $contenuto_precedente_esistente ? filter($key) : $value['valore'];
|
|
|
|
$campi_componente[$key] = $valore;
|
|
}
|
|
$contenuto = Ini::write($contenuto, $campi_componente);
|
|
|
|
// Salvataggio dei dati
|
|
$dbo->query('UPDATE mg_articoli SET contenuto='.prepare($contenuto).' WHERE id='.prepare($id_record));
|
|
} else {
|
|
$dbo->query('UPDATE mg_articoli SET contenuto = \'\' WHERE id='.prepare($id_record));
|
|
}
|
|
|
|
// Upload file
|
|
if (!empty($_FILES) && !empty($_FILES['immagine']['name'])) {
|
|
$upload = Uploads::upload($_FILES['immagine'], [
|
|
'name' => 'Immagine',
|
|
'id_module' => $id_module,
|
|
'id_record' => $id_record,
|
|
], [
|
|
'thumbnails' => true,
|
|
]);
|
|
$filename = $upload->filename;
|
|
|
|
if (!empty($filename)) {
|
|
$dbo->update('mg_articoli', [
|
|
'immagine' => $filename,
|
|
], [
|
|
'id' => $id_record,
|
|
]);
|
|
} else {
|
|
flash()->warning(tr("Errore durante il caricamento dell'immagine!"));
|
|
}
|
|
}
|
|
|
|
// Eliminazione file
|
|
if (post('delete_immagine') !== null) {
|
|
Uploads::delete($record['immagine'], [
|
|
'id_module' => $id_module,
|
|
'id_record' => $id_record,
|
|
]);
|
|
|
|
$dbo->update('mg_articoli', [
|
|
'immagine' => null,
|
|
], [
|
|
'id' => $id_record,
|
|
]);
|
|
}
|
|
|
|
flash()->info(tr('Informazioni salvate correttamente!'));
|
|
|
|
break;
|
|
|
|
// Duplica articolo
|
|
case 'copy':
|
|
$new = $articolo->replicate();
|
|
$new->codice = post('codice', true);
|
|
$new->qta = 0;
|
|
$new->save();
|
|
|
|
// Copia degli allegati
|
|
$copia_allegati = post('copia_allegati');
|
|
if (!empty($copia_allegati)) {
|
|
$allegati = $articolo->uploads();
|
|
foreach ($allegati as $allegato) {
|
|
$allegato->copia([
|
|
'id_module' => $new->getModule()->id,
|
|
'id_record' => $new->id,
|
|
]);
|
|
}
|
|
}
|
|
|
|
// Salvataggio immagine relativa
|
|
$nome_immagine = $articolo->immagine_upload->name;
|
|
$new->immagine = $new->uploads()->where('name', $nome_immagine)->first()->filename;
|
|
$new->save();
|
|
|
|
$id_record = $new->id;
|
|
|
|
flash()->info(tr('Articolo duplicato correttamente!'));
|
|
|
|
break;
|
|
|
|
// Generazione seriali in sequenza
|
|
case 'generate_serials':
|
|
// Seriali
|
|
$serial_start = post('serial_start');
|
|
$serial_end = post('serial_end');
|
|
|
|
preg_match("/(.*?)([\d]*$)/", $serial_start, $m);
|
|
$numero_start = intval($m[2]);
|
|
preg_match("/(.*?)([\d]*$)/", $serial_end, $m);
|
|
$numero_end = intval($m[2]);
|
|
$totale = abs($numero_end - $numero_start) + 1;
|
|
|
|
$prefix = rtrim($serial_end, $numero_end);
|
|
$pad_length = strlen($serial_end) - strlen($prefix);
|
|
|
|
// Combinazione di seriali
|
|
$serials = [];
|
|
for ($s = 0; $s < $totale; ++$s) {
|
|
$serial = $prefix.(str_pad($numero_start + $s, $pad_length, '0', STR_PAD_LEFT));
|
|
|
|
$serials[] = $serial;
|
|
}
|
|
|
|
// no break
|
|
case 'add_serials':
|
|
$serials = $serials ?: filter('serials');
|
|
|
|
$count = $dbo->attach('mg_prodotti', ['id_articolo' => $id_record, 'dir' => 'uscita'], ['serial' => $serials]);
|
|
|
|
// Movimento il magazzino se l'ho specificato nelle impostazioni
|
|
if (setting("Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number")) {
|
|
$articolo->movimenta($count, tr('Carico magazzino con serial da _INIZIO_ a _FINE_', [
|
|
'_INIZIO_' => $serial_start,
|
|
'_FINE_' => $serial_end,
|
|
]), date());
|
|
}
|
|
|
|
flash()->info(tr('Aggiunti _NUM_ seriali!', [
|
|
'_NUM_' => $count,
|
|
]));
|
|
|
|
if ($count != $totale) {
|
|
flash()->warning(tr('Alcuni seriali erano già presenti').'...');
|
|
}
|
|
|
|
break;
|
|
|
|
case 'delprodotto':
|
|
$idprodotto = post('idprodotto');
|
|
|
|
// Leggo info prodotto per descrizione mg_movimenti
|
|
$rs = $dbo->fetchArray('SELECT lotto, serial, altro FROM mg_prodotti WHERE id='.prepare($idprodotto));
|
|
|
|
$query = 'DELETE FROM mg_prodotti WHERE id='.prepare($idprodotto);
|
|
if ($dbo->query($query)) {
|
|
// Movimento il magazzino se l'ho specificato nelle impostazioni
|
|
if (setting("Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number")) {
|
|
$articolo->movimenta(-1, tr('Eliminazione dal magazzino del prodotto con serial _SERIAL_', [
|
|
'_SERIAL_' => $rs[0]['serial'],
|
|
]), date());
|
|
}
|
|
|
|
flash()->info(tr('Prodotto rimosso!'));
|
|
}
|
|
break;
|
|
|
|
case 'delmovimento':
|
|
$idmovimento = post('idmovimento');
|
|
|
|
// Lettura qtà movimento
|
|
$rs = $dbo->fetchArray('SELECT idarticolo, qta FROM mg_movimenti WHERE id='.prepare($idmovimento));
|
|
$qta = $rs[0]['qta'];
|
|
$idarticolo = $rs[0]['idarticolo'];
|
|
|
|
// Aggiorno la quantità dell'articolo
|
|
$dbo->query('UPDATE mg_articoli SET qta=qta-'.$qta.' WHERE id='.prepare($idarticolo));
|
|
|
|
$query = 'DELETE FROM mg_movimenti WHERE id='.prepare($idmovimento);
|
|
if ($dbo->query($query)) {
|
|
flash()->info(tr('Movimento rimosso!'));
|
|
}
|
|
break;
|
|
|
|
case 'delete':
|
|
$articolo->delete();
|
|
|
|
flash()->info(tr('Articolo eliminato!'));
|
|
break;
|
|
}
|
|
|
|
// Operazioni aggiuntive per l'immagine
|
|
if (filter('op') == 'rimuovi-allegato' && filter('filename') == $record['immagine']) {
|
|
$dbo->update('mg_articoli', [
|
|
'immagine' => null,
|
|
], [
|
|
'id' => $id_record,
|
|
]);
|
|
} elseif (filter('op') == 'aggiungi-allegato' && filter('nome_allegato') == 'Immagine') {
|
|
$dbo->update('mg_articoli', [
|
|
'immagine' => $upload->filename,
|
|
], [
|
|
'id' => $id_record,
|
|
]);
|
|
}
|