1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-02-02 00:46:44 +01:00

Introduzione Eloquent in Interventi

This commit is contained in:
Thomas Zilio 2018-08-29 18:06:51 +02:00
parent 22f69746d7
commit 8ea1127625
12 changed files with 296 additions and 74 deletions

View File

@ -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"
},

View File

@ -0,0 +1,56 @@
<?php
namespace Modules\Articoli;
use Illuminate\Database\Eloquent\Model;
use Modules\Articoli\Articolo as ArticoloIntervento;
class Articolo extends Model
{
protected $table = 'mg_articoli';
/**
* Funzione per inserire i movimenti di magazzino.
*/
public function movimenta($qta, $descrizone = null, $data = null, $manuale = false)
{
$this->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');
}
}

View File

@ -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
{

View File

@ -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);

View File

@ -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;
}

View File

@ -0,0 +1,24 @@
<?php
switch ($resource) {
case 'sessioni_intervento':
$dbo->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',
];

View File

@ -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:

View File

@ -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':

View File

@ -0,0 +1,136 @@
<?php
namespace Modules\Interventi;
use Illuminate\Database\Eloquent\Model;
use Modules\Articoli\Articolo as Original;
class Articolo extends Model
{
protected $table = 'mg_articoli_interventi';
/** @var array Opzioni abilitate per la creazione */
protected $fillable = [
'idarticolo',
'idintervento',
'idautomezzo',
];
/**
* Crea un nuovo articolo collegato ad un intervento.
*
* @param array $attributes
*/
public static function create(array $attributes = [])
{
$model = static::query()->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');
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace Modules\Interventi;
use Illuminate\Database\Eloquent\Model;
use Modules\Anagrafiche\Anagrafica;
class Intervento extends Model
{
protected $table = 'in_interventi';
public function anagrafica()
{
return $this->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');
}
}

View File

@ -0,0 +1,10 @@
<?php
namespace Modules\Interventi;
use Illuminate\Database\Eloquent\Model;
class Riga extends Model
{
protected $table = 'in_righe_interventi';
}

View File

@ -36,6 +36,8 @@ class AJAX
$modules = Modules::getModules();
}
$modules = $modules->toArray();
$dirs = array_unique(array_column($modules, 'directory'));
$pieces = array_chunk($dirs, 5);