openstamanager/modules/articoli/actions.php

340 lines
12 KiB
PHP
Raw Normal View History

<?php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
2021-01-20 15:08:51 +01:00
* Copyright (C) DevCode s.r.l.
2020-09-07 15:04:06 +02:00
*
* 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/>.
*/
2020-11-12 17:11:09 +01:00
use Carbon\Carbon;
use Modules\Articoli\Articolo;
use Modules\Articoli\Categoria;
use Util\Ini;
include_once __DIR__.'/../../core.php';
switch (post('op')) {
// Aggiunta articolo
case 'add':
//Se non specifico il codice articolo lo imposto uguale all'id della riga
if (empty(post('codice'))) {
2019-12-13 15:13:19 +01:00
$codice = $dbo->fetchOne('SELECT MAX(id) as codice FROM mg_articoli')['codice'] + 1;
} else {
$codice = post('codice');
}
// Inserisco l'articolo e avviso se esiste un altro articolo con stesso codice.
2020-07-06 17:52:10 +02:00
$numero_codice = Articolo::where([
['codice', $value],
['id', '<>', $id_record],
])->count();
if ($numero_codice > 0) {
2019-06-20 18:59:49 +02:00
flash()->warning(tr('Attenzione: il codice _CODICE_ è già stato utilizzato _N_ volta', [
'_CODICE_' => $codice,
2020-07-06 17:52:10 +02:00
'_N_' => $numero_codice,
2019-06-20 18:59:49 +02:00
]));
}
$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();
2020-10-16 08:31:10 +02:00
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;
2018-07-19 17:48:02 +02:00
if (isAjaxRequest()) {
2019-11-12 17:16:10 +01:00
echo json_encode([
'id' => $id_record,
'text' => post('descrizione'),
'data' => [
'descrizione' => post('descrizione'),
'prezzo_acquisto' => post('prezzo_acquisto'),
'prezzo_vendita' => post('prezzo_vendita'),
'idiva_vendita' => post('idiva_vendita'),
2019-11-12 17:16:10 +01:00
],
]);
}
2018-11-30 16:10:15 +01:00
2018-07-19 17:48:02 +02:00
flash()->info(tr('Aggiunto un nuovo articolo'));
break;
// Modifica articolo
case 'update':
$qta = post('qta');
2019-06-20 18:59:49 +02:00
// Inserisco l'articolo e avviso se esiste un altro articolo con stesso codice.
2020-07-06 17:55:16 +02:00
$numero_codice = Articolo::where([
['codice', $value],
['id', '<>', $id_record],
])->count();
if ($numero_codice > 0) {
2019-06-20 18:59:49 +02:00
flash()->warning(tr('Attenzione: il codice _CODICE_ è già stato utilizzato _N_ volta', [
'_CODICE_' => post('codice'),
2020-07-06 17:55:16 +02:00
'_N_' => $numero_codice,
2019-06-20 18:59:49 +02:00
]));
}
2019-10-01 18:01:00 +02:00
$articolo->codice = post('codice');
2019-11-08 14:58:49 +01:00
$articolo->barcode = post('barcode');
2019-10-01 18:01:00 +02:00
$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');
2019-10-01 18:01:00 +02:00
$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');
2019-10-01 18:01:00 +02:00
$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'));
2019-10-01 18:01:00 +02:00
$componente = post('componente_filename');
$articolo->componente_filename = $componente;
$articolo->attivo = post('attivo');
$articolo->note = post('note');
$articolo->save();
// Leggo la quantità attuale per capire se l'ho modificata
2018-07-18 15:20:10 +02:00
$old_qta = $record['qta'];
$movimento = $qta - $old_qta;
$qta_manuale = post('qta_manuale');
if (!empty($qta_manuale)) {
2018-05-11 15:11:01 +02:00
$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);
2020-11-06 10:46:42 +01:00
$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));
2019-11-26 17:03:25 +01:00
} else {
2019-11-23 08:23:34 +01:00
$dbo->query('UPDATE mg_articoli SET contenuto = \'\' WHERE id='.prepare($id_record));
}
// Upload file
2018-07-10 16:39:02 +02:00
if (!empty($_FILES) && !empty($_FILES['immagine']['name'])) {
$filename = Uploads::upload($_FILES['immagine'], [
'name' => 'Immagine',
'id_module' => $id_module,
'id_record' => $id_record,
], [
'thumbnails' => true,
]);
if (!empty($filename)) {
2018-07-10 16:39:02 +02:00
$dbo->update('mg_articoli', [
'immagine' => $filename,
], [
'id' => $id_record,
]);
} else {
2019-10-01 18:01:00 +02:00
flash()->warning(tr("Errore durante il caricamento dell'immagine!"));
}
}
// Eliminazione file
2018-07-10 16:39:02 +02:00
if (post('delete_immagine') !== null) {
2018-07-18 15:20:10 +02:00
Uploads::delete($record['immagine'], [
'id_module' => $id_module,
'id_record' => $id_record,
]);
2018-07-10 16:39:02 +02:00
$dbo->update('mg_articoli', [
'immagine' => null,
], [
'id' => $id_record,
]);
}
2018-07-19 17:29:21 +02:00
flash()->info(tr('Informazioni salvate correttamente!'));
break;
2018-09-26 15:37:46 +02:00
// Duplica articolo
2018-07-19 17:48:02 +02:00
case 'copy':
2019-04-19 20:52:02 +02:00
$new = $articolo->replicate();
$new->codice = post('codice');
2019-04-19 20:52:02 +02:00
$new->qta = 0;
$new->save();
2018-09-26 15:37:46 +02:00
2020-04-14 08:49:48 +02:00
// 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,
]);
}
2020-04-14 08:49:48 +02:00
}
// Salvataggio immagine relativa
$nome_immagine = $articolo->immagine_upload->name;
$new->immagine = $new->uploads()->where('name', $nome_immagine)->first()->filename;
$new->save();
2019-09-07 15:57:33 +02:00
$id_record = $new->id;
2018-09-26 15:37:46 +02:00
flash()->info(tr('Articolo duplicato correttamente!'));
2018-07-19 17:48:02 +02:00
break;
2019-08-28 11:52:04 +02:00
// 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;
}
2019-08-28 11:52:04 +02:00
2019-08-28 16:58:47 +02:00
// no break
2019-08-28 11:52:04 +02:00
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")) {
2019-10-01 18:01:00 +02:00
$articolo->movimenta($count, tr('Carico magazzino con serial da _INIZIO_ a _FINE_', [
2019-08-28 11:52:04 +02:00
'_INIZIO_' => $serial_start,
'_FINE_' => $serial_end,
2019-10-01 18:01:00 +02:00
]), date());
}
2017-09-12 18:14:42 +02:00
2019-08-28 11:52:04 +02:00
flash()->info(tr('Aggiunti _NUM_ seriali!', [
'_NUM_' => $count,
]));
if ($count != $totale) {
2019-08-28 16:58:47 +02:00
flash()->warning(tr('Alcuni seriali erano già presenti').'...');
2017-09-12 18:14:42 +02:00
}
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
2018-07-08 18:11:17 +02:00
if (setting("Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number")) {
2019-10-01 18:01:00 +02:00
$articolo->movimenta(-1, tr('Eliminazione dal magazzino del prodotto con serial _SERIAL_', [
'_SERIAL_' => $rs[0]['serial'],
2019-10-01 18:01:00 +02:00
]), date());
}
2018-07-19 17:29:21 +02:00
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)) {
2018-07-19 17:29:21 +02:00
flash()->info(tr('Movimento rimosso!'));
}
break;
case 'delete':
2019-08-26 11:10:59 +02:00
$articolo->delete();
2018-07-19 17:29:21 +02:00
flash()->info(tr('Articolo eliminato!'));
break;
}
// Operazioni aggiuntive per l'immagine
2018-07-18 15:20:10 +02:00
if (filter('op') == 'unlink_file' && filter('filename') == $record['immagine']) {
2018-07-04 12:57:53 +02:00
$dbo->update('mg_articoli', [
2018-07-10 16:39:02 +02:00
'immagine' => null,
2018-07-04 12:57:53 +02:00
], [
'id' => $id_record,
]);
} elseif (filter('op') == 'link_file' && filter('nome_allegato') == 'Immagine') {
$dbo->update('mg_articoli', [
2018-07-10 16:39:02 +02:00
'immagine' => $upload,
2018-07-04 12:57:53 +02:00
], [
'id' => $id_record,
]);
}