diff --git a/composer.json b/composer.json index b0e34407c..d966627e8 100644 --- a/composer.json +++ b/composer.json @@ -56,10 +56,14 @@ "autoload": { "psr-4": { "": "src/", - "Modules\\Fatture\\": "modules/fatture/src", - "Modules\\Fatture\\Custom\\": "modules/fatture/custom/src", "Modules\\Anagrafiche\\": "modules/anagrafiche/src", "Modules\\Anagrafiche\\Custom\\": "modules/anagrafiche/custom/src", + "Modules\\Articoli\\": "modules/articoli/src", + "Modules\\Articoli\\Custom\\": "modules/articoli/custom/src", + "Modules\\Fatture\\": "modules/fatture/src", + "Modules\\Fatture\\Custom\\": "modules/fatture/custom/src", + "Modules\\Interventi\\": "modules/interventi/src", + "Modules\\Interventi\\Custom\\": "modules/interventi/custom/src", "Plugins\\Fatturazione\\": "plugins/fatturazione/src", "Plugins\\Fatturazione\\Custom\\": "plugins/fatturazione/custom/src" }, diff --git a/modules/articoli/src/Articolo.php b/modules/articoli/src/Articolo.php new file mode 100644 index 000000000..f411411b5 --- /dev/null +++ b/modules/articoli/src/Articolo.php @@ -0,0 +1,56 @@ +registra($qta, $descrizone, $data, $manuale); + + if ($this->servizio == 0) { + $this->qta += $qta; + + $this->save(); + } + + return true; + } + + /** + * Funzione per registrare i movimenti di magazzino. + */ + public function registra($qta, $descrizone = null, $data = null, $manuale = false, $array = []) + { + if (empty($qta)) { + return false; + } + + // Movimento il magazzino solo se l'articolo non è un servizio + if ($this->servizio == 0) { + // Registrazione della movimentazione + database()->insert('mg_movimenti', array_merge($array, [ + 'idarticolo' => $this->id, + 'qta' => $qta, + 'movimento' => $descrizone, + 'data' => $data, + 'manuale' => $manuale, + ])); + } + + return true; + } + + public function articolo() + { + return $this->hasMany(ArticoloIntervento::class, 'idarticolo'); + } +} diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index 283f5b83e..6ff254c06 100644 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -4,7 +4,7 @@ namespace Modules\Fatture; use Illuminate\Database\Eloquent\Model; use Util\Generator; -use Modules\Anagrafiche\Anagrafica; +use Modules\Anagrafiche\Anagrafica; class Fattura extends Model { diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index 680e7504b..206217bdc 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -2,6 +2,8 @@ include_once __DIR__.'/../../core.php'; +use Modules\Interventi\Articolo; + include_once Modules::filepath('Interventi', 'modutil.php'); include_once Modules::filepath('Articoli', 'modutil.php'); include_once Modules::filepath('MyImpianti', 'modutil.php'); @@ -531,48 +533,28 @@ switch (post('op')) { // no break case 'addarticolo': - $idarticolo = post('idarticolo'); - $idautomezzo = post('idautomezzo'); - $descrizione = post('descrizione'); - $idimpianto = post('idimpianto'); - $qta = post('qta'); - $um = post('um'); - $prezzo_vendita = post('prezzo_vendita'); - $idiva = post('idiva'); - - $sconto_unitario = post('sconto'); - $tipo_sconto = post('tipo_sconto'); - $sconto = calcola_sconto([ - 'sconto' => $sconto_unitario, - 'prezzo' => $prezzo_vendita, - 'tipo' => $tipo_sconto, - 'qta' => $qta, + $articolo = Articolo::create([ + 'idarticolo' => post('idarticolo'), + 'idintervento' => $id_record, + 'idautomezzo' => post('idautomezzo'), + 'qta' => post('qta'), + 'descrizione' => post('descrizione'), + 'prezzo' => post('prezzo_vendita'), + 'um' => post('um'), ]); - // Decremento la quantità - add_movimento_magazzino($idarticolo, -$qta, ['idautomezzo' => $idautomezzo, 'idintervento' => $id_record]); + $articolo->setSconto(post('sconto'), post('tipo_sconto')); + $articolo->setIVA(post('idiva')); // Aggiorno l'automezzo dell'intervento - $dbo->query('UPDATE in_interventi SET idautomezzo='.prepare($idautomezzo).' WHERE id='.prepare($id_record).' '.Modules::getAdditionalsQuery($id_module)); - - $rsart = $dbo->fetchArray('SELECT abilita_serial, prezzo_acquisto FROM mg_articoli WHERE id='.prepare($idarticolo)); - $prezzo_acquisto = $rsart[0]['prezzo_acquisto']; - - //Calcolo iva - $rs_iva = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare($idiva)); - $desc_iva = $rs_iva[0]['descrizione']; - - $iva = (($prezzo_vendita * $qta) - $sconto) * $rs_iva[0]['percentuale'] / 100; - - // Aggiunto il collegamento fra l'articolo e l'intervento - $idriga = $dbo->query('INSERT INTO mg_articoli_interventi(idarticolo, idintervento, idimpianto, idautomezzo, descrizione, prezzo_vendita, prezzo_acquisto, sconto, sconto_unitario, tipo_sconto, idiva, desc_iva, iva, qta, um, abilita_serial) VALUES ('.prepare($idarticolo).', '.prepare($id_record).', '.(empty($idimpianto) ? 'NULL' : prepare($idimpianto)).', '.prepare($idautomezzo).', '.prepare($descrizione).', '.prepare($prezzo_vendita).', '.prepare($prezzo_acquisto).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($qta).', '.prepare($um).', '.prepare($rsart[0]['abilita_serial']).')'); + $dbo->query('UPDATE in_interventi SET idautomezzo='.prepare(post('idautomezzo')).' WHERE id='.prepare($id_record).' '.Modules::getAdditionalsQuery($id_module)); if (!empty($serials)) { if ($old_qta > $qta) { $serials = array_slice($serials, 0, $qta); } - $dbo->sync('mg_prodotti', ['id_riga_intervento' => $idriga, 'dir' => 'entrata', 'id_articolo' => $idarticolo], ['serial' => $serials]); + $articolo->setSerials($serials); } link_componente_to_articolo($id_record, $idimpianto, $idarticolo, $qta); diff --git a/modules/interventi/api/create.php b/modules/interventi/api/create.php index d1e6ea0a3..1bc07878d 100644 --- a/modules/interventi/api/create.php +++ b/modules/interventi/api/create.php @@ -52,33 +52,13 @@ switch ($resource) { case 'articolo_intervento': $data = $request['data']; - // Inserisco movimento generico per questo articolo - add_movimento_magazzino($data['id_articolo'], $data['qta'], [ - 'idintervento' => $data['id_intervento'], - 'idautomezzo' => $data['id_automezzo'], - ], 'Movimento da APP - Intervento '.$data['idintervento'], $data['data']); - - // collego articolo all'intervento in questione - $q = "INSERT INTO mg_articoli_interventi( - idarticolo, - idintervento, - descrizione, - prezzo_vendita, - idiva_vendita, - idautomezzo, - qta - ) VALUES( - '".$data['id_articolo']."', - '".$data['id_intervento']."', - (SELECT descrizione FROM mg_articoli WHERE mg_articoli.id=\"".$data['id_articolo'].'"), - (SELECT prezzo_vendita FROM mg_articoli WHERE mg_articoli.id="'.$data['id_articolo']."\"), - (SELECT valore FROM `zz_impostazioni` WHERE nome=\"Iva predefinita\"), - '".$data['id_automezzo']."', - '".$data['qta']."' - )"; - $dbo->query($q); - - $dbo->query('UPDATE mg_articoli SET qta=(qta - '.$data['qta'].") WHERE id='".$data['id_articolo']."'"); + $articolo = Articolo::create([ + 'idarticolo' => $data['idarticolo'], + 'idintervento' => $id_record, + 'idautomezzo' => $data['idautomezzo'], + 'qta' => $data['qta'], + 'um' => $data['um'], + ]); break; } diff --git a/modules/interventi/api/delete.php b/modules/interventi/api/delete.php new file mode 100644 index 000000000..75c3116c6 --- /dev/null +++ b/modules/interventi/api/delete.php @@ -0,0 +1,24 @@ +query('DELETE FROM in_interventi_tecnici WHERE idintervento = :id_intervento', [ + ':id_intervento' => $request['id_intervento'], + ]); + + break; + + case 'articoli_intervento': + $dbo->query('DELETE FROM mg_articoli_interventi WHERE idintervento = :id_intervento', [ + ':id_intervento' => $request['id_intervento'], + ]); + + // TODO: prevedere la modifica di quantità! + + break; +} + +return [ + 'sessioni_intervento', + 'articoli_intervento', +]; diff --git a/modules/interventi/api/retrieve.php b/modules/interventi/api/retrieve.php index 036b11288..025365c4a 100644 --- a/modules/interventi/api/retrieve.php +++ b/modules/interventi/api/retrieve.php @@ -56,26 +56,25 @@ switch ($resource) { `in_interventi`.`descrizione`, `in_interventi`.`idtipointervento`, `in_interventi`.`idanagrafica`, - `an_anagrafiche`.`idzona` AS zona_anagrafica, + `in_interventi`.`idautomezzo`, `in_interventi`.`idsede`, - `an_sedi`.`idzona` AS zona_sede, `in_interventi`.`idstatointervento`, `in_interventi`.`informazioniaggiuntive`, `in_interventi`.`idclientefinale`, `in_interventi`.`firma_file`, IF(firma_data = '0000-00-00 00:00:00', '', firma_data) AS `firma_data`, `in_interventi`.firma_nome, - (SELECT GROUP_CONCAT( CONCAT(my_impianti.matricola, ' - ', my_impianti.nome) SEPARATOR ', ') FROM (my_impianti_interventi INNER JOIN my_impianti ON my_impianti_interventi.idimpianto=my_impianti.id) WHERE my_impianti_interventi.idintervento=`in_interventi`.`id`) AS `impianti`, - (SELECT MAX(`orario_fine`) FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idintervento`=`in_interventi`.`id`) AS `data`, - (SELECT GROUP_CONCAT(ragione_sociale SEPARATOR ', ') FROM `in_interventi_tecnici` INNER JOIN `an_anagrafiche` ON `in_interventi_tecnici`.`idtecnico`=`an_anagrafiche`.`idanagrafica` WHERE `in_interventi_tecnici`.`idintervento`=`in_interventi`.`id`) AS `tecnici`, + (SELECT GROUP_CONCAT( CONCAT(my_impianti.matricola, ' - ', my_impianti.nome) SEPARATOR ', ') FROM (my_impianti_interventi INNER JOIN my_impianti ON my_impianti_interventi.idimpianto=my_impianti.id) WHERE my_impianti_interventi.idintervento = `in_interventi`.`id`) AS `impianti`, + (SELECT MAX(`orario_fine`) FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`) AS `data`, + (SELECT GROUP_CONCAT(ragione_sociale SEPARATOR ', ') FROM `in_interventi_tecnici` INNER JOIN `an_anagrafiche` ON `in_interventi_tecnici`.`idtecnico` = `an_anagrafiche`.`idanagrafica` WHERE `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`) AS `tecnici`, `in_statiintervento`.`colore` AS `bgcolor`, `in_statiintervento`.`descrizione` AS `stato`, `in_interventi`.`idtipointervento` AS `tipo` FROM `in_interventi` - INNER JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`idstatointervento` - INNER JOIN `an_anagrafiche` ON `in_interventi`.`idanagrafica`=`an_anagrafiche`.`idanagrafica` - LEFT JOIN `an_sedi` ON `in_interventi`.`idsede`=`an_sedi`.`id` - WHERE (SELECT MAX(`orario_fine`) FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idintervento`=`in_interventi`.`id`) <= :period_end"; + INNER JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento` = `in_statiintervento`.`idstatointervento` + INNER JOIN `an_anagrafiche` ON `in_interventi`.`idanagrafica` = `an_anagrafiche`.`idanagrafica` + LEFT JOIN `an_sedi` ON `in_interventi`.`idsede` = `an_sedi`.`id` + WHERE (SELECT MAX(`orario_fine`) FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`) <= :period_end"; // TODO: rimosse seguenti clausole: diff --git a/modules/interventi/api/update.php b/modules/interventi/api/update.php index adb6c4556..b38dea395 100644 --- a/modules/interventi/api/update.php +++ b/modules/interventi/api/update.php @@ -63,7 +63,7 @@ switch ($resource) { $dbo->insert('in_interventi', [ 'idintervento' => $idintervento, - '#idanagrafica' => "(SELECT valore FROM zz_impostazioni WHERE nome='Azienda predefinita')", + '#idanagrafica' => "(SELECT valore FROM zz_settings WHERE nome='Azienda predefinita')", '#data_richiesta' => 'NOW()', 'richiesta' => $richiesta, 'idtipointervento' => 0, @@ -111,8 +111,6 @@ switch ($resource) { 'informazioniaggiuntive' => $data['informazioniaggiuntive'], ], ['id' => $data['id']]); - // $dbo->query( 'DELETE FROM in_interventi_tecnici WHERE idintervento='.prepare($record['id']).' AND idtecnico='.prepare($idtecnico) ); - break; case 'firma_intervento': diff --git a/modules/interventi/src/Articolo.php b/modules/interventi/src/Articolo.php new file mode 100644 index 000000000..321abf177 --- /dev/null +++ b/modules/interventi/src/Articolo.php @@ -0,0 +1,136 @@ +create($attributes); + + $articolo = $model->articolo()->first(); + $qta = $attributes['qta']; + + // Movimento l'articolo + if (!empty($model->idautomezzo)) { + $rs = $dbo->fetchArray("SELECT CONCAT_WS(' - ', nome, targa) AS nome FROM dt_automezzi WHERE id=".prepare($model->idautomezzo)); + $nome = $rs[0]['nome']; + + $descrizione = ($qta < 0) ? tr("Carico sull'automezzo _NAME_", [ + '_NAME_' => $nome, + ]) : tr("Scarico dall'automezzo _NAME_", [ + '_NAME_' => $nome, + ]); + + $dbo->query('UPDATE mg_articoli_automezzi SET qta = qta + '.$qta.' WHERE idarticolo = '.prepare($articolo->id).' AND idautomezzo = '.prepare($model->idautomezzo)); + $data = date('Y-m-d'); + + $articolo->registra(-$qta, $descrizione, $data, false, [ + 'idautomezzo' => $model->idautomezzo, + 'idintervento' => $model->idintervento, + ]); + } else { + $intervento = $model->intervento(); + + $numero = $intervento->codice; + $data = database()->fetchOne('SELECT MAX(orario_fine) AS data FROM in_interventi_tecnici WHERE idintervento = :id_intervento', [ + ':id_intervento' => $intervento->id, + ])['data']; + + $data = $data ?? $intervento->data_richiesta; + + $descrizione = ($qta < 0) ? tr('Ripristino articolo da intervento _NUM_', [ + '_NUM_' => $numero, + ]) : tr('Scarico magazzino per intervento _NUM_', [ + '_NUM_' => $numero, + ]); + + $articolo->movimenta(-$qta, $descrizione, $data, false, [ + 'idintervento' => $intervento->id, + ]); + } + + // Salvataggio delle informazioni + $model->descrizione = isset($attributes['descrizione']) ? $attributes['descrizione'] : $articolo->descrizione; + $model->prezzo_acquisto = $articolo->prezzo_acquisto; + $model->abilita_serial = $articolo->abilita_serial; + + $model->um = $attributes['um']; + $model->qta = $attributes['qta']; + $model->prezzo_vendita = isset($attributes['prezzo']) ? $attributes['prezzo'] : $articolo->prezzo_vendita; + + $model->save(); + + return $model; + } + + public function setIVA($id_iva) + { + $iva = database()->fetchOne('SELECT * FROM co_iva WHERE id = :id_iva', [ + ':id_iva' => $id_iva, + ]); + $descrizione = $iva['descrizione']; + + $valore = (($this->prezzo_vendita * $this->qta) - $this->sconto) * $iva['percentuale'] / 100; + + $this->idiva = $iva['id']; + $this->desc_iva = $descrizione; + $this->iva = $valore; + + $this->save(); + } + + public function setSconto($unitario, $tipo) + { + $sconto = calcola_sconto([ + 'sconto' => $unitario, + 'prezzo' => $this->prezzo_vendita, + 'tipo' => $tipo, + 'qta' => $this->qta, + ]); + + $this->sconto_unitario = $unitario; + $this->tipo_sconto = $tipo; + $this->sconto = $sconto; + + $this->save(); + } + + public function setSerials($serials) + { + database()->sync('mg_prodotti', [ + 'id_riga_intervento' => $this->id, + 'dir' => 'entrata', + 'id_articolo' => $this->idintervento, + ], [ + 'serial' => $serials, + ]); + } + + public function articolo() + { + return $this->belongsTo(Original::class, 'idarticolo'); + } + + public function intervento() + { + return $this->belongsTo(Intervento::class, 'idintervento'); + } +} diff --git a/modules/interventi/src/Intervento.php b/modules/interventi/src/Intervento.php new file mode 100644 index 000000000..03384f68b --- /dev/null +++ b/modules/interventi/src/Intervento.php @@ -0,0 +1,31 @@ +belongsTo(Anagrafica::class, 'idanagrafica'); + } + + public function stato() + { + return $this->belongsTo(Stato::class, 'idstatointervento'); + } + + public function articoli() + { + return $this->hasMany(Articolo::class, 'idintervento'); + } + + public function righe() + { + return $this->hasMany(Riga::class, 'idintervento'); + } +} diff --git a/modules/interventi/src/Riga.php b/modules/interventi/src/Riga.php new file mode 100644 index 000000000..cd9989ed1 --- /dev/null +++ b/modules/interventi/src/Riga.php @@ -0,0 +1,10 @@ +toArray(); + $dirs = array_unique(array_column($modules, 'directory')); $pieces = array_chunk($dirs, 5);