Aggiornamento parziale Pianificazione interventi

This commit is contained in:
Thomas Zilio 2020-02-17 13:18:25 +01:00
parent 528e614064
commit f614caf9bc
29 changed files with 968 additions and 1054 deletions

View File

@ -35,5 +35,6 @@ return [
'plugins/importFE' => 'Plugins\ImportFE',
'plugins/receiptFE' => 'Plugins\ReceiptFE',
'plugins/dichiarazioni_intento' => 'Plugins\DichiarazioniIntento',
'plugins/pianificazione_interventi' => 'Plugins\PianificazioneInterventi',
'plugins/statistiche_articoli' => 'Plugins\StatisticheArticoli',
];

View File

@ -184,6 +184,22 @@ abstract class Document extends Model
$this->setRelations([]);
}
public function toArray()
{
$array = parent::toArray();
$result = array_merge($array, [
'spesa' => $this->spesa,
'imponibile' => $this->imponibile,
'sconto' => $this->sconto,
'totale_imponibile' => $this->totale_imponibile,
'iva' => $this->iva,
'totale' => $this->totale,
]);
return $result;
}
/**
* Costruisce una nuova collezione Laravel a partire da quelle indicate.
*

View File

@ -330,7 +330,7 @@ $riga = $contratto->getRiga($type, $id_riga);
]);
// Copia delle righe
$dbo->query('INSERT INTO co_promemoria_righe(id_promemoria, descrizione, qta, um, prezzo_vendita, prezzo_acquisto, idiva, desc_iva, iva, sconto, sconto_unitario, tipo_sconto) SELECT :id_new, descrizione, qta, um, prezzo_vendita, prezzo_acquisto, idiva, desc_iva, iva, sconto, sconto_unitario, tipo_sconto FROM co_promemoria_righe AS z WHERE id_promemoria = :id_old', [
$dbo->query('INSERT INTO co_righe_promemoria(id_promemoria, descrizione, qta, um, prezzo_vendita, prezzo_acquisto, idiva, desc_iva, iva, sconto, sconto_unitario, tipo_sconto) SELECT :id_new, descrizione, qta, um, prezzo_vendita, prezzo_acquisto, idiva, desc_iva, iva, sconto, sconto_unitario, tipo_sconto FROM co_righe_promemoria AS z WHERE id_promemoria = :id_old', [
':id_new' => $id_promemoria,
':id_old' => $p['id'],
]);

View File

@ -148,8 +148,8 @@ $_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
<h4 class="panel-title">
<?php echo tr('Dati appalto'); ?>
<div class="box-tools pull-right">
<a data-toggle="collapse" href="#dati_appalto"><i class="fa fa-plus" style='color:white;margin-top:2px;'></i></a>
<div class="box-tools pull-right">
<a data-toggle="collapse" href="#dati_appalto"><i class="fa fa-plus" style='color:white;margin-top:2px;'></i></a>
</div>
</h4>
</div>
@ -203,7 +203,7 @@ if (!empty($rs)) {
<th>'.tr('Addebito orario').' <span class="tip" title="'.tr('Addebito al cliente').'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Addebito km').' <span class="tip" title="'.tr('Addebito al cliente').'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Addebito diritto ch.').' <span class="tip" title="'.tr('Addebito al cliente').'"><i class="fa fa-question-circle-o"></i></span></th>
<th width="40"></th>
</tr>';
@ -372,15 +372,15 @@ include $docroot.'/modules/contratti/row-list.php';
$("#idsede").selectReset();
});
$('#codice_cig, #codice_cup').bind("keyup change", function(e) {
if ($('#codice_cig').val() == '' && $('#codice_cup').val() == '' ){
$('#id_documento_fe').prop('required', false);
}else{
$('#id_documento_fe').prop('required', true);
}
});
</script>
@ -453,4 +453,3 @@ if (!empty($elementi)) {
<?php
}
?>

View File

@ -20,12 +20,4 @@ trait RelationTrait
{
return $this->parent();
}
public function delete()
{
$parent = $this->parent;
$parent->save();
return parent::delete();
}
}

View File

@ -8,6 +8,7 @@ use Common\Document;
use Modules\Anagrafiche\Anagrafica;
use Modules\Interventi\Intervento;
use Modules\TipiIntervento\Tipo as TipoSessione;
use Plugins\PianificazioneInterventi\Promemoria;
use Traits\RecordTrait;
use Util\Generator;
@ -143,6 +144,11 @@ class Contratto extends Document
return $this->hasMany(Intervento::class, 'id_contratto');
}
public function promemoria()
{
return $this->hasMany(Promemoria::class, 'idcontratto');
}
public function fixBudget()
{
$this->budget = $this->totale_imponibile ?: 0;

View File

@ -117,7 +117,7 @@ switch (post('op')) {
], ['idcontratto' => $idcontratto, 'id' => $idcontratto_riga]);
//copio le righe dal promemoria all'intervento
$dbo->query('INSERT INTO in_righe_interventi (descrizione, qta, um, prezzo_unitario, costo_unitario, idiva,desc_iva, iva, idintervento, sconto, sconto_unitario, tipo_sconto) SELECT descrizione, qta,um,prezzo_vendita,prezzo_acquisto,idiva,desc_iva,iva,'.$id_record.',sconto,sconto_unitario,tipo_sconto FROM co_promemoria_righe WHERE id_promemoria = '.$idcontratto_riga);
$dbo->query('INSERT INTO in_righe_interventi (descrizione, qta, um, prezzo_unitario, costo_unitario, idiva,desc_iva, iva, idintervento, sconto, sconto_unitario, tipo_sconto) SELECT descrizione, qta,um,prezzo_vendita,prezzo_acquisto,idiva,desc_iva,iva,'.$id_record.',sconto,sconto_unitario,tipo_sconto FROM co_righe_promemoria WHERE id_promemoria = '.$idcontratto_riga);
//copio gli articoli dal promemoria all'intervento
$dbo->query('INSERT INTO in_righe_interventi (idarticolo, idintervento, descrizione, costo_unitario, prezzo_unitario, sconto, sconto_unitario, tipo_sconto,idiva,desc_iva,iva, qta, um, abilita_serial, idimpianto) SELECT idarticolo, '.$id_record.',descrizione,prezzo_acquisto,prezzo_vendita,sconto,sconto_unitario,tipo_sconto,idiva,desc_iva,iva, qta, um, abilita_serial, idimpianto FROM co_promemoria_articoli WHERE id_promemoria = '.$idcontratto_riga);

View File

@ -41,8 +41,6 @@ trait RelationTrait
*/
protected function fixSubtotale()
{
$this->prezzo_vendita = $this->prezzo_unitario;
$this->fixIva();
}
}

View File

@ -15,14 +15,6 @@ class Intervento extends Document
protected $info = [];
protected $appends = [
'ore_totali',
'km_totali',
'spesa',
'imponibile',
'totale_imponibile',
];
/**
* Crea un nuovo intervento.
*
@ -159,6 +151,18 @@ class Intervento extends Document
return $this->hasMany(Components\Sessione::class, 'idintervento');
}
public function toArray()
{
$array = parent::toArray();
$result = array_merge($array, [
'ore_totali' => $this->ore_totali,
'km_totali' => $this->km_totali,
]);
return $result;
}
// Metodi statici
/**

View File

@ -20,12 +20,4 @@ trait RelationTrait
{
return $this->parent();
}
public function delete()
{
$parent = $this->parent;
$parent->save();
return parent::delete();
}
}

View File

@ -2,29 +2,29 @@
include_once __DIR__.'/../../core.php';
use Modules\Anagrafiche\Anagrafica;
use Carbon\Carbon;
use Carbon\CarbonInterval;
use Modules\Articoli\Articolo as ArticoloOriginale;
use Modules\Contratti\Contratto;
use Modules\Interventi\Intervento;
use Modules\Interventi\Stato;
use Modules\TipiIntervento\Tipo as TipoSessione;
use Plugins\PianificazioneInterventi\Components\Articolo;
use Plugins\PianificazioneInterventi\Components\Riga;
use Plugins\PianificazioneInterventi\Promemoria;
$operazione = filter('op');
// Pianificazione intervento
switch ($operazione) {
case 'add-promemoria':
// Lettura sede contratto
$idsede = $dbo->fetchOne('SELECT idsede FROM co_contratti WHERE id='.prepare($id_parent))['idsede'];
$contratto = Contratto::find($id_parent);
$tipo = TipoSessione::find(filter('idtipointervento'));
$dbo->insert('co_promemoria', [
'idcontratto' => $id_parent,
'data_richiesta' => filter('data_richiesta'),
'idtipointervento' => filter('idtipointervento'),
'idsede' => $idsede,
]);
$id_record = $dbo->lastInsertedID();
$promemoria = Promemoria::build($contratto, $tipo, filter('data_richiesta'));
echo $promemoria->id;
echo $id_record;
break;
break;
case 'edit-promemoria':
$dbo->update('co_promemoria', [
@ -44,7 +44,7 @@ switch ($operazione) {
$id = post('id');
$dbo->query('DELETE FROM `co_promemoria` WHERE id='.prepare($id));
$dbo->query('DELETE FROM `co_promemoria_righe` WHERE id_promemoria='.prepare($id));
$dbo->query('DELETE FROM `co_righe_promemoria` WHERE id_promemoria='.prepare($id));
$dbo->query('DELETE FROM `co_promemoria_articoli` WHERE id_promemoria='.prepare($id));
flash()->info(tr('Pianificazione eliminata!'));
@ -53,7 +53,7 @@ switch ($operazione) {
// Eliminazione tutti i promemoria di questo contratto con non hanno l'intervento associato
case 'delete-non-associati':
$dbo->query('DELETE FROM `co_promemoria_righe` WHERE id_promemoria IN (SELECT id FROM `co_promemoria` WHERE idcontratto = :id_contratto AND idintervento IS NULL)', [
$dbo->query('DELETE FROM `co_righe_promemoria` WHERE id_promemoria IN (SELECT id FROM `co_promemoria` WHERE idcontratto = :id_contratto AND idintervento IS NULL)', [
':id_contratto' => $id_record,
]);
@ -72,282 +72,192 @@ switch ($operazione) {
// Pianificazione ciclica
case 'pianificazione':
$intervallo = post('intervallo');
$min_date = post('data_inizio');
$data_inizio = post('data_inizio');
// if principale
if (!empty($id_record) && !empty($intervallo) && post('pianifica_promemoria')) {
$qp = 'SELECT *, (SELECT idanagrafica FROM co_contratti WHERE id = '.$id_parent.' ) AS idanagrafica, (SELECT data_conclusione FROM co_contratti WHERE id = '.$id_parent.' ) AS data_conclusione, (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=co_promemoria.idtipointervento) AS tipointervento FROM co_promemoria WHERE co_promemoria.id = '.$id_record;
$rsp = $dbo->fetchArray($qp);
$count = 0;
$date_con_promemoria = [];
$date_con_intervento = [];
if (post('pianifica_promemoria')) {
$promemoria_originale = Promemoria::find($id_record);
$contratto = $promemoria_originale->contratto;
$idtipointervento = $rsp[0]['idtipointervento'];
$idsede = $rsp[0]['idsede'];
$richiesta = $rsp[0]['richiesta'];
// Promemoria del contratto raggruppati per data
$promemoria_contratto = $contratto->promemoria()
->where('idtipointervento', $promemoria_originale->tipo->id)
->get()
->groupBy(function ($item) {
return $item->data_richiesta;
});
$date_preimpostate = $promemoria_contratto->keys()->toArray();
$data_richiesta = $rsp[0]['data_richiesta'];
$idimpianti = $rsp[0]['idimpianti'];
$data_conclusione = $contratto->data_conclusione;
$data_inizio = new Carbon($data_inizio);
$data_richiesta = $data_inizio->copy();
$interval = CarbonInterval::make($intervallo.' days');
// mi serve per la pianificazione dei promemoria
$data_conclusione = $rsp[0]['data_conclusione'];
$stato = Stato::where('codice', 'WIP')->first(); // Stato "In programmazione"
// mi serve per la pianificazione interventi
$idanagrafica = $rsp[0]['idanagrafica'];
// Ciclo partendo dalla data_richiesta fino alla data conclusione del contratto
while ($data_richiesta->lessThanOrEqualTo($data_conclusione)) {
// Creazione ciclica del promemoria se non ne esiste uno per la data richiesta
$data_promemoria = $data_richiesta->format('Y-m-d');
if (!in_array($data_promemoria, $date_preimpostate)) {
$promemoria_corrente = $promemoria_originale->replicate();
$promemoria_corrente->data_richiesta = $data_richiesta;
$promemoria_corrente->idintervento = null;
$promemoria_corrente->save();
// se voglio pianificare anche le date precedenti ad oggi (parto da questo promemoria)
//if ($data_inizio) {
// oggi
//$min_date = date('Y-m-d');
//} else {
//questo promemoria
//$min_date = date('Y-m-d', strtotime($data_richiesta));
//}
$data_richiesta = $min_date;
// inizio controllo data_conclusione, data valida e maggiore della $min_date
if ((date('Y', strtotime($data_conclusione)) > 1970) && (date('Y-m-d', strtotime($min_date)) <= date('Y-m-d', strtotime($data_conclusione)))) {
$i = 0;
// Ciclo partendo dalla data_richiesta fino all data conclusione del contratto
while (date('Y-m-d', strtotime($data_richiesta)) <= date('Y-m-d', strtotime($data_conclusione))) {
// calcolo nuova data richiesta, non considero l'intervallo al primo ciclo
$data_richiesta = date('Y-m-d', strtotime($data_richiesta.' + '.(($i == 0) ? 0 : $intervallo).' days'));
++$i;
// controllo nuova data richiesta --> solo date maggiori o uguali di data richiesta iniziale ma che non superano la data di fine del contratto
if ((date('Y-m-d', strtotime($data_richiesta)) >= $min_date) && (date('Y-m-d', strtotime($data_richiesta)) <= date('Y-m-d', strtotime($data_conclusione)))) {
// Controllo che non esista già un promemoria idcontratto, idtipointervento e data_richiesta.
if (count($dbo->fetchArray("SELECT id FROM co_promemoria WHERE data_richiesta = '".$data_richiesta."' AND idtipointervento = '".$idtipointervento."' AND idcontratto = '".$id_parent."' ")) == 0) {
// inserisco il nuovo promemoria
$query = 'INSERT INTO `co_promemoria`(`idcontratto`, `idtipointervento`, `data_richiesta`, `richiesta`, `idsede`, `idimpianti` ) VALUES('.prepare($id_parent).', '.prepare($idtipointervento).', '.prepare($data_richiesta).', '.prepare($richiesta).', '.prepare($idsede).', '.prepare($idimpianti).')';
if ($dbo->query($query)) {
$idriga = $dbo->lastInsertedID();
// copio anche righe materiali nel nuovo promemoria
$dbo->query('INSERT INTO co_promemoria_righe (descrizione, qta,um,prezzo_vendita,prezzo_acquisto,idiva, desc_iva,iva,id_promemoria,sconto,sconto_unitario,tipo_sconto) SELECT descrizione, qta,um,prezzo_vendita,prezzo_acquisto,idiva, desc_iva,iva,'.$idriga.',sconto,sconto_unitario,tipo_sconto FROM co_promemoria_righe WHERE id_promemoria = '.$id_record);
// copio righe articoli nel nuovo promemoria
$dbo->query('INSERT INTO co_promemoria_articoli (idarticolo, id_promemoria,descrizione,prezzo_acquisto,prezzo_vendita,sconto, sconto_unitario, tipo_sconto,idiva,desc_iva,iva, qta, um, abilita_serial, idimpianto) SELECT idarticolo, '.$idriga.',descrizione,prezzo_acquisto,prezzo_vendita,sconto,sconto_unitario,tipo_sconto,idiva,desc_iva,iva, qta, um, abilita_serial, idimpianto FROM co_promemoria_articoli WHERE id_promemoria = '.$id_record);
// Copia degli allegati
Uploads::copy([
'id_plugin' => Plugins::get('Pianificazione interventi')['id'],
'id_record' => $id_record,
], [
'id_plugin' => Plugins::get('Pianificazione interventi')['id'],
'id_record' => $idriga,
]);
flash()->info(tr('Promemoria intervento pianificato!'));
}
} else {
flash()->warning(tr('Esiste già un promemoria pianificato per il _DATE_', [
'_DATE_' => Translator::dateToLocale($data_richiesta),
]));
}
// Controllo che non esista già un intervento collegato a questo promemoria e, se ho spuntato di creare l'intervento, creo già anche quello
if (post('pianifica_intervento') && empty($dbo->fetchArray('SELECT idintervento FROM co_promemoria WHERE id = '.prepare(empty($idriga) ? $id_record : $idriga))[0]['idintervento'])) {
// Creazione intervento
$anagrafica = Anagrafica::find($idanagrafica);
$tipo = TipoSessione::find($idtipointervento);
// Stato "In programmazione"
$stato = Stato::where('codice', 'WIP')->first();
$intervento = Intervento::build($anagrafica, $tipo, $stato, $data_richiesta);
$intervento->idsede_destinazione = $idsede ?: 0;
$intervento->richiesta = $richiesta;
$intervento->idclientefinale = post('idclientefinale') ?: 0;
$intervento->save();
$idintervento = $intervento->id;
$idtecnici = post('idtecnico');
// aggiungo i tecnici
foreach ($idtecnici as $idtecnico) {
add_tecnico($idintervento, $idtecnico, $data_richiesta.' '.post('orario_inizio'), $data_richiesta.' '.post('orario_fine'), $id_parent);
}
// collego l'intervento ai promemoria
$dbo->query('UPDATE co_promemoria SET idintervento='.prepare($idintervento).' WHERE id='.prepare(((empty($idriga)) ? $id_record : $idriga)));
// copio le righe dal promemoria all'intervento
$dbo->query('INSERT INTO in_righe_interventi (descrizione, qta,um, prezzo_unitario, costo_unitario, idiva,desc_iva,iva,idintervento,sconto,sconto_unitario,tipo_sconto) SELECT descrizione, qta,um,prezzo_vendita,prezzo_acquisto,idiva,desc_iva,iva,'.$idintervento.',sconto,sconto_unitario,tipo_sconto FROM co_promemoria_righe WHERE id_promemoria = '.$id_record);
// copio gli articoli dal promemoria all'intervento
$dbo->query('INSERT INTO in_righe_interventi (idarticolo, idintervento,descrizione, costo_unitario, prezzo_unitario, sconto, sconto_unitario, tipo_sconto,idiva,desc_iva,iva, qta, um, abilita_serial, idimpianto) SELECT idarticolo, '.$idintervento.',descrizione,prezzo_acquisto,prezzo_vendita,sconto,sconto_unitario,tipo_sconto,idiva,desc_iva,iva, qta, um, abilita_serial, idimpianto FROM co_promemoria_articoli WHERE id_promemoria = '.$id_record);
// Copia degli allegati
Uploads::copy([
'id_plugin' => Plugins::get('Pianificazione interventi')['id'],
'id_record' => $id_record,
], [
'id_module' => Modules::get('Interventi')['id'],
'id_record' => $idintervento,
]);
// Movimento il magazziono per ogni articolo copiato
$articoli = $intervento->articoli;
foreach ($articoli as $articolo) {
$articolo->movimenta($articolo->qta);
}
// Collego gli impianti del promemoria all' intervento appena inserito
if (!empty($idimpianti)) {
$rs_idimpianti = explode(',', $idimpianti);
foreach ($rs_idimpianti as $idimpianto) {
$dbo->query('INSERT INTO my_impianti_interventi (idintervento, idimpianto) VALUES ('.$idintervento.', '.prepare($idimpianto).' )');
}
}
flash()->info(tr('Interventi pianificati correttamente'));
} elseif (post('pianifica_intervento')) {
flash()->warning(tr('Esiste già un intervento pianificato per il _DATE_', [
'_DATE_' => Translator::dateToLocale($data_richiesta),
]));
}
// Copia delle righe
$righe = $promemoria_originale->getRighe();
foreach ($righe as $riga) {
$copia = $riga->replicate();
$copia->setParent($promemoria_corrente);
$copia->save();
}
// Copia degli allegati
$allegati = $promemoria_originale->uploads();
foreach ($allegati as $allegato) {
$allegato->copia([
'id_module' => $allegato->id_module,
'id_plugin' => $allegato->id_plugin,
'id_record' => $promemoria_corrente->id,
]);
}
} else {
$promemoria_corrente = $promemoria_contratto[$data_promemoria]->first();
$date_con_promemoria[] = dateFormat($data_promemoria);
}
// fine ciclo while
} else {
flash()->error(tr("Nessuna data di conclusione del contratto oppure quest'ultima è già trascorsa, impossibile pianificare nuovi promemoria"));
// Creazione intervento collegato se non prensente
if (post('pianifica_intervento') && empty($promemoria->intervento)) {
// Creazione intervento
$intervento = Intervento::build($contratto->anagrafica, $promemoria_originale->tipo, $stato, $data_richiesta);
$intervento->idsede_destinazione = $promemoria_corrente->idsede ?: 0;
$intervento->richiesta = $promemoria_corrente->richiesta;
$intervento->idclientefinale = post('idclientefinale') ?: 0;
$intervento->save();
// Aggiungo i tecnici selezionati
$idtecnici = post('idtecnico');
foreach ($idtecnici as $idtecnico) {
add_tecnico($intervento->id, $idtecnico, $data_richiesta.' '.post('orario_inizio'), $data_richiesta.' '.post('orario_fine'));
}
// Copia delle informazioni del promemoria
$promemoria_corrente->pianifica($intervento);
flash()->info(tr('Interventi pianificati correttamente'));
} elseif (post('pianifica_intervento')) {
$date_con_intervento[] = dateFormat($data_promemoria);
}
// Calcolo nuova data richiesta, non considero l'intervallo al primo ciclo
$data_richiesta = $data_richiesta->add($interval);
++$count;
}
// fine controllo data_conclusione
} else {
}
if ($count == 0) {
flash()->warning(tr('Nessun promemoria pianificato'));
} else {
flash()->info(tr('Sono stati pianificati _NUM_ interventi!', [
'_NUM_' => $count,
]));
if (!empty($date_con_promemoria)) {
flash()->warning(tr('Le seguenti date presentano già un promemoria pianificato: _LIST_', [
'_LIST_' => implode(', ', $date_con_promemoria),
]));
}
if (!empty($date_con_intervento)) {
flash()->warning(tr('I promemoria delle seguenti date presentano già un intervento collegato: _LIST_', [
'_LIST_' => implode(', ', $date_con_intervento),
]));
}
}
break;
/*
GESTIONE ARTICOLI
*/
case 'manage_articolo':
if (post('idriga') != null) {
$articolo = Articolo::find(post('idriga'));
} else {
$originale = ArticoloOriginale::find(post('idarticolo'));
$articolo = Articolo::build($promemoria, $originale);
}
case 'editarticolo':
$idriga = post('idriga');
$idarticolo = post('idarticolo');
$idimpianto = post('idimpianto');
// Leggo la quantità attuale nell'intervento
$q = 'SELECT qta, idimpianto FROM co_promemoria_articoli WHERE id='.prepare($idriga);
$rs = $dbo->fetchArray($q);
$old_qta = $rs[0]['qta'];
$idimpianto = $rs[0]['idimpianto'];
// Elimino questo articolo dall'intervento
$dbo->query('DELETE FROM co_promemoria_articoli WHERE id='.prepare($idriga));
// no break;
case 'addarticolo':
$idarticolo = post('idarticolo');
$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->descrizione = post('descrizione');
$articolo->um = post('um') ?: null;
// Calcolo iva
$rs_iva = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare($idiva));
$desc_iva = $rs_iva[0]['descrizione'];
$articolo->id_iva = post('idiva');
$iva = (($prezzo_vendita * $qta) - $sconto) * $rs_iva[0]['percentuale'] / 100;
$articolo->costo_unitario = post('costo_unitario') ?: 0;
$articolo->prezzo_unitario = post('prezzo_unitario');
$articolo->setSconto(post('sconto'), post('tipo_sconto'));
// Aggiunto il collegamento fra l'articolo e l'intervento
$idriga = $dbo->query('INSERT INTO co_promemoria_articoli(idarticolo, id_promemoria, idimpianto, 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($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']).')');
try {
$articolo->qta = $qta;
} catch (UnexpectedValueException $e) {
flash()->error(tr('Alcuni serial number sono già stati utilizzati!'));
}
$articolo->save();
if (post('idriga') != null) {
flash()->info(tr('Articolo modificato!'));
} else {
flash()->info(tr('Articolo aggiunto!'));
}
break;
case 'unlink_articolo':
$idriga = post('idriga');
case 'manage_riga':
if (post('idriga') != null) {
$riga = Riga::find(post('idriga'));
} else {
$riga = Riga::build($promemoria);
}
$dbo->query('DELETE FROM co_promemoria_articoli WHERE id='.prepare($idriga));
break;
/*
Gestione righe generiche
*/
case 'addriga':
$descrizione = post('descrizione');
$qta = post('qta');
$um = post('um');
$idiva = post('idiva');
$prezzo_vendita = post('prezzo_vendita');
$prezzo_acquisto = post('prezzo_acquisto');
$sconto_unitario = post('sconto');
$tipo_sconto = post('tipo_sconto');
$sconto = calcola_sconto([
'sconto' => $sconto_unitario,
'prezzo' => $prezzo_vendita,
'tipo' => $tipo_sconto,
'qta' => $qta,
]);
$riga->descrizione = post('descrizione');
$riga->um = post('um') ?: null;
// Calcolo iva
$rs_iva = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare($idiva));
$desc_iva = $rs_iva[0]['descrizione'];
$riga->id_iva = post('idiva');
$iva = (($prezzo_vendita * $qta) - $sconto) * $rs_iva[0]['percentuale'] / 100;
$riga->costo_unitario = post('costo_unitario') ?: 0;
$riga->prezzo_unitario = post('prezzo_unitario');
$riga->setSconto(post('sconto'), post('tipo_sconto'));
$dbo->query('INSERT INTO co_promemoria_righe(descrizione, qta, um, prezzo_vendita, prezzo_acquisto, idiva, desc_iva, iva, sconto, sconto_unitario, tipo_sconto, id_promemoria) VALUES ('.prepare($descrizione).', '.prepare($qta).', '.prepare($um).', '.prepare($prezzo_vendita).', '.prepare($prezzo_acquisto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($id_record).')');
$riga->qta = $qta;
$riga->save();
if (post('idriga') != null) {
flash()->info(tr('Riga modificata!'));
} else {
flash()->info(tr('Riga aggiunta!'));
}
break;
case 'editriga':
$idriga = post('idriga');
$descrizione = post('descrizione');
$qta = post('qta');
$um = post('um');
$idiva = post('idiva');
$prezzo_vendita = post('prezzo_vendita');
$prezzo_acquisto = post('prezzo_acquisto');
case 'delete_riga':
$id_riga = post('idriga');
$type = post('type');
$riga = $promemoria->getRiga($type, $id_riga);
$sconto_unitario = post('sconto');
$tipo_sconto = post('tipo_sconto');
$sconto = calcola_sconto([
'sconto' => $sconto_unitario,
'prezzo' => $prezzo_vendita,
'tipo' => $tipo_sconto,
'qta' => $qta,
]);
if (!empty($riga)) {
try {
$riga->delete();
// 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;
$dbo->query('UPDATE co_promemoria_righe SET '.
' descrizione='.prepare($descrizione).','.
' qta='.prepare($qta).','.
' um='.prepare($um).','.
' prezzo_vendita='.prepare($prezzo_vendita).','.
' prezzo_acquisto='.prepare($prezzo_acquisto).','.
' idiva='.prepare($idiva).','.
' desc_iva='.prepare($desc_iva).','.
' iva='.prepare($iva).','.
' sconto='.prepare($sconto).','.
' sconto_unitario='.prepare($sconto_unitario).','.
' tipo_sconto='.prepare($tipo_sconto).
' WHERE id='.prepare($idriga));
break;
case 'delriga':
$idriga = post('idriga');
$dbo->query('DELETE FROM co_promemoria_righe WHERE id='.prepare($idriga));
flash()->info(tr('Riga rimossa!'));
} catch (InvalidArgumentException $e) {
flash()->error(tr('Alcuni serial number sono già stati utilizzati!'));
}
}
break;
}

View File

@ -1,185 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$plugin = Plugins::get($id_plugin);
// Prezzo modificabile solo se l'utente loggato è un tecnico (+ può vedere i prezzi) o se è amministratore
$show_prezzi = Auth::user()['gruppo'] != 'Tecnici' || (Auth::user()['gruppo'] == 'Tecnici' && setting('Mostra i prezzi al tecnico'));
$idriga = get('idriga');
// Lettura idanagrafica cliente e percentuale di sconto/rincaro in base al listino
$rs = $dbo->fetchArray('SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record));
$idanagrafica = $rs[0]['idanagrafica'];
if (empty($idriga)) {
$op = 'addarticolo';
$button = '<i class="fa fa-plus"></i> '.tr('Aggiungi');
// valori default
$idarticolo = '';
$descrizione = '';
$qta = 1;
$um = '';
$prezzo_vendita = '0';
$sconto_unitario = 0;
$idimpianto = 0;
$listino = $dbo->fetchArray('SELECT prc_guadagno FROM mg_listini WHERE id = (SELECT idlistino_vendite FROM an_anagrafiche WHERE idanagrafica = '.prepare($idanagrafica).')');
if (!empty($listino[0]['prc_guadagno'])) {
$sconto_unitario = $listino[0]['prc_guadagno'];
$tipo_sconto = 'PRC';
}
(empty($idcontratto_riga)) ? $idcontratto_riga = $dbo->fetchArray('SELECT MAX(id) AS max_idcontratto_riga FROM `co_promemoria`')[0]['max_idcontratto_riga'] : '';
} else {
$op = 'editarticolo';
$button = '<i class="fa fa-edit"></i> '.tr('Modifica');
// carico record da modificare
$q = "SELECT *, (SELECT codice FROM mg_articoli WHERE id=co_promemoria_articoli.idarticolo) AS codice_articolo, (SELECT CONCAT(codice, ' - ', descrizione) FROM mg_articoli WHERE id=co_promemoria_articoli.idarticolo) AS descrizione_articolo FROM co_promemoria_articoli WHERE id=".prepare($idriga);
$rsr = $dbo->fetchArray($q);
$idarticolo = $rsr[0]['idarticolo'];
$codice_articolo = $rsr[0]['codice_articolo'];
$descrizione = $rsr[0]['descrizione'];
$qta = $rsr[0]['qta'];
$um = $rsr[0]['um'];
$idiva = $rsr[0]['idiva'];
$prezzo_vendita = $rsr[0]['prezzo_vendita'];
$sconto_unitario = $rsr[0]['sconto_unitario'];
$tipo_sconto = $rsr[0]['tipo_sconto'];
$idimpianto = $rsr[0]['idimpianto'];
$idcontratto_riga = $rsr[0]['id_promemoria'];
}
/*
Form di inserimento
*/
echo '
<form id="add-articoli" action="'.$rootdir.'/actions.php" method="post">
<input type="hidden" name="id_plugin" value="'.$id_plugin.'">
<input type="hidden" name="id_record" value="'.$id_record.'">
<input type="hidden" name="op" value="'.$op.'">
<input type="hidden" name="idriga" value="'.$idriga.'">';
if (!empty($idarticolo)) {
echo '
<input type="hidden" id="idarticolo_originale" name="idarticolo_originale" value="'.$idarticolo.'">';
}
// Articolo
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "'.tr('Articolo').'", "name": "idarticolo", "required": 1, "value": "'.$idarticolo.'", "ajax-source": "articoli" ]}
</div>
</div>';
// Descrizione
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione", "id": "descrizione_articolo", "required": 1, "value": '.json_encode($descrizione).' ]}
</div>
</div>
<br>';
// Quantità
echo '
<div class="row">
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.$qta.'", "decimals": "qta" ]}
</div>';
// Unità di misura
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Unità di misura').'", "name": "um", "value": "'.$um.'", "ajax-source": "misure" ]}
</div>';
// Impianto
echo '
<div class="col-md-4">
{[ "type": "select", "multiple": "0", "label": "'.tr('Impianto').'", "name": "idimpianto", "values": "query=SELECT my_impianti.id AS id, my_impianti.nome AS descrizione FROM my_impianti_contratti INNER JOIN my_impianti ON my_impianti_contratti.idimpianto = my_impianti.id WHERE my_impianti_contratti.idcontratto = '.$id_record.' ORDER BY descrizione", "value": "'.$idimpianto.'", "extra":"'.$readonly.'" ]}
</div>
</div>';
// Iva
echo '
<div class="row">
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Iva').'", "name": "idiva", "required": 1, "value": "'.$idiva.'", "ajax-source": "iva" ]}
</div>';
// Prezzo di vendita
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Costo unitario').'", "name": "prezzo_vendita", "required": 1, "value": "'.$prezzo_vendita.'", "icon-after": "'.currency().'" ]}
</div>';
// Sconto
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Sconto unitario').'", "name": "sconto", "icon-after": "choice|untprc|'.$tipo_sconto.'", "value": "'.$sconto_unitario.'" ]}
</div>
</div>';
echo '
<script>
$(document).ready(function () {
$("#idarticolo").on("change", function(){
$("#prezzi_articolo button").attr("disabled", !$(this).val());
if($(this).val()){
$("#prezzi_articolo button").removeClass("disabled");
session_set("superselect,idarticolo", $(this).val(), 0);
$data = $(this).selectData();
$("#prezzo_vendita").val($data.prezzo_vendita);
$("#descrizione_articolo").val($data.descrizione);
$("#idiva").selectSetNew($data.idiva_vendita, $data.iva_vendita);
$("#um").selectSetNew($data.um, $data.um);
}else{
$("#prezzi_articolo button").addClass("disabled");
}
$("#prezzi").html("");
$("#prezzivendita").html("");
$("#prezziacquisto").html("");
});
});
</script>';
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary pull-right">'.$button.'</button>
</div>
</div>
</form>';
echo '
<script>$(document).ready(init)</script>';
echo '
<script type="text/javascript">
$(document).ready(function() {
$("#add-articoli").ajaxForm({
success: function(){
$("#modals > div").modal("hide");
refreshArticoli('.$id_record.');
}
});
});
</script>';

View File

@ -1,123 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$plugin = Plugins::get($id_plugin);
$idriga = filter('idriga');
if (empty($idriga)) {
$op = 'addriga';
$button = '<i class="fa fa-plus"></i> '.tr('Aggiungi');
// valori default
$descrizione = '';
$qta = 1;
$um = '';
$prezzo_vendita = '0';
$prezzo_acquisto = '0';
$idiva = setting('Iva predefinita');
if (!empty($rs[0]['prc_guadagno'])) {
$sconto_unitario = $rs[0]['prc_guadagno'];
$tipo_sconto = 'PRC';
}
} else {
$op = 'editriga';
$button = '<i class="fa fa-edit"></i> '.tr('Modifica');
// carico record da modificare
$q = 'SELECT * FROM co_promemoria_righe WHERE id='.prepare($idriga);
$rsr = $dbo->fetchArray($q);
$descrizione = $rsr[0]['descrizione'];
$qta = $rsr[0]['qta'];
$um = $rsr[0]['um'];
$idiva = $rsr[0]['idiva'];
$prezzo_vendita = $rsr[0]['prezzo_vendita'];
$prezzo_acquisto = $rsr[0]['prezzo_acquisto'];
$sconto_unitario = $rsr[0]['sconto_unitario'];
$tipo_sconto = $rsr[0]['tipo_sconto'];
}
echo '
<form id="add-righe" action="'.$rootdir.'/actions.php" method="post">
<input type="hidden" name="id_plugin" value="'.$id_plugin.'">
<input type="hidden" name="id_record" value="'.$id_record.'">
<input type="hidden" name="op" value="'.$op.'">
<input type="hidden" name="idriga" value="'.$idriga.'">';
// Descrizione
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "id": "descrizione_riga", "name": "descrizione", "required": 1, "value": '.json_encode($descrizione).' ]}
</div>
</div>
<br>';
// Quantità
echo '
<div class="row">
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.$qta.'", "decimals": "qta" ]}
</div>';
// Unità di misura
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Unità di misura').'", "name": "um", "value": "'.$um.'", "ajax-source": "misure" ]}
</div>';
// Iva
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Iva').'", "name": "idiva", "required": 1, "value": "'.$idiva.'", "ajax-source": "iva" ]}
</div>
</div>';
// Prezzo di acquisto
echo '
<div class="row">
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Prezzo di acquisto (un.)').'", "name": "prezzo_acquisto", "required": 1, "value": "'.$prezzo_acquisto.'", "icon-after": "'.currency().'" ]}
</div>';
// Prezzo di vendita
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Prezzo di vendita (un.)').'", "name": "prezzo_vendita", "required": 1, "value": "'.$prezzo_vendita.'", "icon-after": "'.currency().'" ]}
</div>';
// Sconto unitario
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Sconto unitario').'", "name": "sconto", "icon-after": "choice|untprc|'.$tipo_sconto.'", "value": "'.$sconto_unitario.'" ]}
</div>
</div>';
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary pull-right">'.$button.'</button>
</div>
</div>
</form>';
echo '
<script>$(document).ready(init)</script>';
echo '
<script type="text/javascript">
$(document).ready(function() {
$("#add-righe").ajaxForm({
success: function(){
$("#modals > div").modal("hide");
refreshRighe('.$id_record.');
}
});
});
</script>';

View File

@ -1,154 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$plugin = Plugins::get($id_plugin);
$is_add = filter('add') ? true : false;
$pricing = Auth::admin() || Auth::user()['gruppo'] != 'Tecnici';
$rs = $dbo->fetchArray('SELECT * FROM co_promemoria_articoli WHERE id_promemoria = '.prepare($id_record).' ORDER BY id ASC');
if (!empty($rs)) {
echo '
<table class="table table-striped table-condensed table-hover table-bordered">
<tr>
<th>'.tr('Articolo').'</th>
<th width="8%">'.tr('Q.').'</th>';
if ($pricing) {
echo '
<th width="15%">'.tr('Prezzo di acquisto').'</th>';
}
if ($pricing) {
echo '
<th width="15%">'.tr('Prezzo di vendita').'</th>
<th width="10%">'.tr('Iva').'</th>
<th width="15%">'.tr('Imponibile').'</th>';
}
if (!$record['flag_completato']) {
echo '
<th width="80"></th>';
}
echo '
</tr>';
foreach ($rs as $r) {
$extra = '';
$mancanti = 0;
// Individuazione dei seriali
if (!empty($r['idarticolo']) && !empty($r['abilita_serial'])) {
$serials = array_column($dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_intervento='.prepare($r['id'])), 'serial');
$mancanti = $r['qta'] - count($serials);
if ($mancanti > 0) {
$extra = 'class="warning"';
} else {
$mancanti = 0;
}
}
echo '
<tr '.$extra.'>
<td>
<input type="hidden" name="id" value="'.$r['id'].'">
'.Modules::link('Articoli', $r['idarticolo'], (!empty($r['codice']) ? $r['codice'].' - ' : '').$r['descrizione']);
// Info extra (lotto, serial, altro)
if (!empty($r['abilita_serial'])) {
if (!empty($mancanti)) {
echo '
<br><b><small class="text-danger">'.tr('_NUM_ serial mancanti', [
'_NUM_' => $mancanti,
]).'</small></b>';
}
if (!empty($serials)) {
echo '
<br>'.tr('SN').': '.implode(', ', $serials);
}
}
echo '
</td>';
// Quantità
echo '
<td class="text-right">
'.Translator::numberToLocale($r['qta'], 'qta').' '.$r['um'].'
</td>';
if ($pricing) {
echo '
<td class="text-right">
'.moneyFormat($r['prezzo_acquisto']).'
</td>';
}
if ($pricing) {
// Prezzo unitario
echo '
<td class="text-right">
'.moneyFormat($r['prezzo_vendita']).'';
if ($r['sconto_unitario'] > 0) {
echo '
<br><span class="label label-danger">
- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
]).'
</span>';
}
echo '
</td>';
echo '
<td class="text-right">
'.moneyFormat($r['iva']).'
</td>';
// Prezzo di vendita
echo '
<td class="text-right">
<span class="prezzo_articolo">'.Translator::numberToLocale(sum($r['prezzo_vendita'] * $r['qta'], -$r['sconto'])).'</span> '.currency().'
</td>';
}
if (!empty($is_add)) {
echo '
<td>
<button type="button" class="btn btn-warning btn-xs" data-title="'.tr('Modifica spesa').'" onclick="launch_modal(\'Modifica spesa\', \''.$plugin->fileurl('add_articolo.php').'?id_plugin='.$id_plugin.'&id_record='.$id_record.'&idriga='.$r['id'].'\');">
<i class="fa fa-edit"></i>
</button>
<button type="button" class="btn btn-danger btn-xs" data-toggle="tooltip" title="'.tr('Elimina materiale').'" onclick="if(confirm(\''.tr('Eliminare questo materiale?').'\') ){ ritorna_al_magazzino(\''.$r['id'].'\'); }">
<i class="fa fa-angle-double-left"></i><i class="fa fa-truck"></i>
</button>
</td>';
}
echo '
</tr>';
}
echo '
</table>';
} else {
echo '
<p>'.tr('Nessun articolo caricato').'.</p>';
}
echo '
<script type="text/javascript">
function ritorna_al_magazzino(id){
$.post(globals.rootdir + "/actions.php", {op: "unlink_articolo", idriga: id, id_plugin: '.$id_plugin.' }, function(data, result){
if(result == "success"){
refreshArticoli('.$id_record.');
}
});
}
</script>';

View File

@ -1,122 +0,0 @@
<?php
include_once __DIR__.'/../../core.php';
$plugin = Plugins::get($id_plugin);
$is_add = filter('add') ? true : false;
$pricing = Auth::admin() || Auth::user()['gruppo'] != 'Tecnici';
$rs2 = $dbo->fetchArray('SELECT * FROM co_promemoria_righe WHERE id_promemoria='.prepare($id_record).' ORDER BY id ASC');
if (!empty($rs2)) {
echo '
<table class="table table-striped table-condensed table-hover table-bordered">
<tr>
<th>'.tr('Descrizione').'</th>
<th width="8%">'.tr('Q.').'</th>
<th width="15%">'.tr('Prezzo di acquisto').'</th>';
if ($pricing) {
echo '
<th width="15%">'.tr('Prezzo di vendita').'</th>
<th width="10%">'.tr('Iva').'</th>
<th width="15%">'.tr('Subtotale').'</th>';
}
if (!$record['flag_completato']) {
echo '
<th width="80"></th>';
}
echo '
</tr>';
foreach ($rs2 as $r) {
echo '
<tr>
<td>
<input type="hidden" name="id" value="'.$r['id'].'">
'.nl2br($r['descrizione']).'
</td>';
// Quantità
echo '
<td class="text-right">
'.Translator::numberToLocale($r['qta'], 'qta').' '.$r['um'].'
</td>';
//Costo unitario
echo '
<td class="text-right">
'.moneyFormat($r['prezzo_acquisto']).'
</td>';
if ($pricing) {
// Prezzo unitario
$netto = $r['prezzo_vendita'] - $r['sconto_unitario'];
echo '
<td class="text-right">
'.moneyFormat($r['prezzo_vendita']).'';
if ($r['sconto_unitario'] > 0) {
echo '
<br><span class="label label-danger">
- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
]).'
</span>';
}
echo '
</td>';
echo '
<td class="text-right">
'.moneyFormat($r['iva']).'
</td>';
// Prezzo di vendita
echo '
<td class="text-right">
'.moneyFormat(sum($r['prezzo_vendita'] * $r['qta'], -$r['sconto'])).'
</td>';
}
if (!empty($is_add)) {
echo '
<td>
<button type="button" class="btn btn-warning btn-xs" data-title="'.tr('Modifica spesa').'" onclick="launch_modal(\'Modifica spesa\', \''.$plugin->fileurl('add_righe.php').'?id_plugin='.$id_plugin.'&id_record='.$id_record.'&idriga='.$r['id'].'\');">
<i class="fa fa-edit"></i>
</button>
<button type="button" class="btn btn-danger btn-xs" data-toggle="tooltip" onclick="if(confirm(\''.tr('Eliminare questa spesa?').'\')){ elimina_riga( \''.$r['id'].'\' ); }">
<i class="fa fa-trash"></i>
</button>
</td>';
}
echo '
</tr>';
}
echo '
</table>';
} else {
echo '
<p>'.tr('Nessuna riga caricata').'.</p>';
}
echo '
<script type="text/javascript">
function elimina_riga(id){
$.post(globals.rootdir + "/actions.php", { op: "delriga", idriga: id, id_plugin: '.$id_plugin.'}, function(data, result){
if(result == "success"){
refreshRighe('.$id_record.');
}
});
}
</script>';

View File

@ -2,40 +2,43 @@
include_once __DIR__.'/../../core.php';
$id_module = Modules::get('Contratti')['id'];
$plugin = Plugins::get($id_plugin);
use Modules\Contratti\Contratto;
use Modules\Contratti\Stato;
$contratto = $dbo->fetchOne('SELECT * FROM co_contratti WHERE id = :id', [
':id' => $id_record,
]);
$contratto = Contratto::find($id_record);
$is_pianificabile = $contratto->stato->is_pianificabile && !empty($contratto['data_accettazione']); // Contratto permette la pianificazione
$records = $dbo->fetchArray('SELECT *, (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=co_promemoria.idtipointervento) AS tipointervento FROM co_promemoria WHERE idcontratto='.prepare($id_record).' ORDER BY data_richiesta ASC');
$elenco_promemoria = $contratto->promemoria->sortBy('data_richiesta');
// Intervento/promemoria pianificabile
$pianificabile = $dbo->fetchOne('SELECT is_pianificabile FROM co_staticontratti WHERE id = :id', [
':id' => $contratto['idstato'],
])['is_pianificabile'];
if ($pianificabile) {
$pianificabile = (date('Y', strtotime($contratto['data_accettazione'])) > 1970 and date('Y', strtotime($contratto['data_conclusione'])) > 1970) ? true : false;
}
$stati_pianificabili = $dbo->fetchOne('SELECT GROUP_CONCAT(`descrizione` SEPARATOR ", ") AS stati_pianificabili FROM `co_staticontratti` WHERE `is_pianificabile` = 1')['stati_pianificabili'];
$stati_pianificabili = Stato::where('is_pianificabile', 1)->get();
$elenco_stati = $stati_pianificabili->implode('descrizione', ', ');
echo '
<p>'.tr('Puoi <b>pianificare dei "promemoria" o direttamente gli interventi</b> da effettuare entro determinate scadenze. Per poter pianificare i promemoria, il contratto deve avere <b>data accettazione</b> e <b>data conclusione</b> definita ed essere in uno dei seguenti stati: <b>'.$stati_pianificabili.'</b>').'.
<p>'.tr('Puoi <b>pianificare dei "promemoria" o direttamente gli interventi</b> da effettuare entro determinate scadenze. Per poter pianificare i promemoria, il contratto deve avere <b>data accettazione</b> e <b>data conclusione</b> definita ed essere in uno dei seguenti stati: <b>'.$elenco_stati.'</b>').'.
<span class="tip" title="'.tr("I promemoria verranno visualizzati sulla 'Dashboard' e serviranno per semplificare la pianificazione del giorno dell'intervento, ad esempio nel caso di interventi con cadenza mensile").'">
<i class="fa fa-question-circle-o"></i>
</span></p>';
// Nessun intervento pianificato
if (!empty($records)) {
echo '
<br>
<h5>'.tr('Lista promemoria ed eventuali interventi associati').':</h5>
echo '
<hr>
<div class="row">
<div class="col-md-9">
{[ "type": "select", "placeholder": "'.tr('Tipo di promemoria').'", "name": "id_tipo_promemoria", "required": 1, "ajax-source": "tipiintervento", "class": "unblockable" ]}
</div>
<div class="col-md-3">
<button type="button" '.(!empty($is_pianificabile) ? '' : 'disabled').' title="Aggiungi un nuovo promemoria da pianificare." data-toggle="tooltip" class="btn btn-primary btn-block tip" id="add_promemoria">
<i class="fa fa-plus"></i> '.tr('Nuovo promemoria').'
</button>
</div>
</div>
<hr>';
// Nessun intervento pianificato
if (!$elenco_promemoria->isEmpty()) {
echo '
<table class="table table-condensed table-striped table-hover">
<thead>
<tr>
@ -53,20 +56,19 @@ if (!empty($records)) {
<tbody>';
// Elenco promemoria
foreach ($records as $record) {
foreach ($elenco_promemoria as $promemoria) {
// Sede
if ($record['idsede'] == '-1') {
if ($promemoria['idsede'] == '-1') {
echo '- '.tr('Nessuna').' -';
} elseif (empty($record['idsede'])) {
} elseif (empty($promemoria['idsede'])) {
$info_sede = tr('Sede legale');
} else {
$info_sede = $dbo->fetchOne("SELECT id, CONCAT( CONCAT_WS( ' (', CONCAT_WS(', ', nomesede, citta), indirizzo ), ')') AS descrizione FROM an_sedi WHERE id=".prepare($record['idsede']))['descrizione'];
$info_sede = $dbo->fetchOne("SELECT id, CONCAT( CONCAT_WS( ' (', CONCAT_WS(', ', nomesede, citta), indirizzo ), ')') AS descrizione FROM an_sedi WHERE id=".prepare($promemoria->idsede))['descrizione'];
}
// Intervento svolto
if (!empty($record['idintervento'])) {
$intervento = $dbo->fetchOne('SELECT id, codice, IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento = in_interventi.id), data_richiesta) AS data FROM in_interventi WHERE id = '.prepare($record['idintervento']));
$intervento = $promemoria->intevento;
if (!empty($intervento)) {
$info_intervento = Modules::link('Interventi', $intervento['id'], tr('Intervento num. _NUM_ del _DATE_', [
'_NUM_' => $intervento['codice'],
'_DATE_' => Translator::dateToLocale($intervento['data']),
@ -85,10 +87,10 @@ if (!empty($records)) {
$contratto['data_conclusione'] = '';
}
// info impianti
// Informazioni sugli impianti
$info_impianti = '';
if (!empty($record['idimpianti'])) {
$impianti = $dbo->fetchArray('SELECT id, matricola, nome FROM my_impianti WHERE id IN ('.($record['idimpianti']).')');
if (!empty($promemoria['idimpianti'])) {
$impianti = $dbo->fetchArray('SELECT id, matricola, nome FROM my_impianti WHERE id IN ('.($promemoria['idimpianti']).')');
foreach ($impianti as $impianto) {
$info_impianti .= Modules::link('MyImpianti', $impianto['id'], tr('_NOME_ (_MATRICOLA_)', [
@ -98,55 +100,48 @@ if (!empty($records)) {
}
}
// Info materiali/articoli
$materiali = $dbo->fetchArray('SELECT id, descrizione,qta,um,prezzo_vendita, \'\' AS idarticolo FROM co_promemoria_righe WHERE id_promemoria = '.prepare($record['id']).'
UNION SELECT id, descrizione,qta,um,prezzo_vendita, idarticolo FROM co_promemoria_articoli WHERE id_promemoria = '.prepare($record['id']));
$info_materiali = '';
foreach ($materiali as $materiale) {
$info_materiali .= tr(' _QTA_ _UM_ x _DESC_', [
'_DESC_' => ((!empty($materiale['idarticolo'])) ? Modules::link('Articoli', $materiale['idarticolo'], $materiale['descrizione']) : $materiale['descrizione']),
'_QTA_' => Translator::numberToLocale($materiale['qta']),
'_UM_' => $materiale['um'],
'_PREZZO_' => $materiale['prezzo_vendita'],
// Informazioni sulle righe
$info_righe = '';
$righe = $promemoria->getRighe();
foreach ($righe as $riga) {
$info_righe .= tr('_QTA_ _UM_ x _DESC_', [
'_DESC_' => ($riga->isArticolo() ? Modules::link('Articoli', $riga['idarticolo'], $riga['descrizione']) : $riga['descrizione']),
'_QTA_' => Translator::numberToLocale($riga['qta']),
'_UM_' => $riga['um'],
]).'<br>';
}
// Info allegati
$allegati = Uploads::get([
'id_plugin' => $id_plugin,
'id_record' => $record['id'],
]);
// Informazioni sugli allegati
$info_allegati = '';
$allegati = $promemoria->uploads();
foreach ($allegati as $allegato) {
$info_allegati .= tr(' _NOME_ (_ORIGINAL_)', [
'_ORIGINAL_' => $allegato['original'],
'_ORIGINAL_' => $allegato['original_name'],
'_NOME_' => $allegato['name'],
]).'<br>';
}
echo '
<tr>
<td>'.Translator::dateToLocale($record['data_richiesta']).'<!--br><small>'.Translator::dateToLocale($contratto['data_conclusione']).'</small--></td>
<td>'.$record['tipointervento'].'</td>
<td>'.nl2br($record['richiesta']).'</td>
<td>'.Translator::dateToLocale($promemoria['data_richiesta']).'</td>
<td>'.$promemoria['tipointervento'].'</td>
<td>'.nl2br($promemoria['richiesta']).'</td>
<td>'.$info_intervento.'</td>
<td>'.$info_sede.'</td>
<td>'.$info_impianti.'</td>
<td>'.$info_materiali.'</td>
<td>'.$info_righe.'</td>
<td>'.$info_allegati.'</td>
<td align="right">
<button type="button" class="btn btn-warning btn-sm" title="Pianifica..." data-toggle="tooltip" onclick="launch_modal(\'Pianifica\', \''.$plugin->fileurl('pianficazione.php').'?id_module='.$id_module.'&id_plugin='.$plugin['id'].'&id_parent='.$id_record.'&id_record='.$record['id'].'\');"'.((!empty($pianificabile)) ? '' : ' disabled').'>
<button type="button" class="btn btn-warning btn-sm" title="Pianifica..." data-toggle="tooltip" onclick="launch_modal(\'Pianifica\', \''.$structure->fileurl('pianficazione.php').'?id_module='.$id_module.'&id_plugin='.$structure['id'].'&id_parent='.$id_record.'&id_record='.$promemoria['id'].'\');"'.((!empty($is_pianificabile)) ? '' : ' disabled').'>
<i class="fa fa-clock-o"></i>
</button>
<button type="button" '.$disabled.' class="btn btn-primary btn-sm '.$disabled.' " title="Pianifica intervento ora..." data-toggle="tooltip" onclick="launch_modal(\'Pianifica intervento\', \''.$rootdir.'/add.php?id_module='.Modules::get('Interventi')['id'].'&ref=interventi_contratti&idcontratto='.$id_record.'&idcontratto_riga='.$record['id'].'\');"'.(!empty($pianificabile) ? '' : ' disabled').'>
<button type="button" '.$disabled.' class="btn btn-primary btn-sm '.$disabled.' " title="Pianifica intervento ora..." data-toggle="tooltip" onclick="launch_modal(\'Pianifica intervento\', \''.$rootdir.'/add.php?id_module='.Modules::get('Interventi')['id'].'&ref=interventi_contratti&idcontratto='.$id_record.'&idcontratto_riga='.$promemoria['id'].'\');"'.(!empty($is_pianificabile) ? '' : ' disabled').'>
<i class="fa fa-calendar"></i>
</button>
<button type="button" '.$disabled.' title="'.$title.'" class="btn btn-danger btn-sm ask '.$disabled.'" data-op="delete-promemoria" data-id="'.$record['id'].'" data-id_plugin="'.$id_plugin.'" data-backto="record-edit">
<button type="button" '.$disabled.' title="'.$title.'" class="btn btn-danger btn-sm ask '.$disabled.'" data-op="delete-promemoria" data-id="'.$promemoria['id'].'" data-id_plugin="'.$id_plugin.'" data-backto="record-edit">
<i class="fa fa-trash"></i>
</button>
</td>
@ -156,7 +151,7 @@ if (!empty($records)) {
</tbody>
</table>';
if (!empty($records)) {
if (!empty($promemorias)) {
echo '
<br>
<div class="pull-right">
@ -165,67 +160,31 @@ if (!empty($records)) {
</button>
</div>';
}
} else {
echo '
<div class="alert alert-info">
<i class="fa fa-warning"></i> '.tr('Nessun promemoria pianificato per il contratto corrente').'.
</div>';
}
echo '
<button type="button" '.((!empty($pianificabile)) ? '' : 'disabled').' title="Aggiungi un nuovo promemoria da pianificare." data-toggle="tooltip" class="btn btn-primary tip" id="add_promemoria">
<i class="fa fa-plus"></i> '.tr('Nuovo promemoria').'
</button>';
$options = $dbo->fetchArray('SELECT co_contratti_tipiintervento.*, in_tipiintervento.descrizione FROM in_tipiintervento INNER JOIN co_contratti_tipiintervento ON in_tipiintervento.idtipointervento=co_contratti_tipiintervento.idtipointervento WHERE idcontratto='.prepare($id_record).' ORDER BY in_tipiintervento.descrizione');
echo '
<script type="text/javascript">
function askTipoIntervento () {
swal({
title: "'.tr('Aggiungere un nuovo promemoria?').'",
type: "info",
showCancelButton: true,
confirmButtonText: "'.tr('Aggiungi').'",
confirmButtonClass: "btn btn-lg btn-success",
input: "select",
inputOptions: {';
foreach ($options as $option) {
echo '
"'.$option['idtipointervento'].'": "'.$option['descrizione'].'", ';
}
echo '
},
inputPlaceholder: "'.tr('Tipo intervento').'",
inputValidator: function(value) {
return new Promise((resolve) => {
if (value === "") {
alert ("'.tr('Seleziona un tipo intervento').'");
$(".swal2-select").attr("disabled", false);
$(".swal2-confirm").attr("disabled", false);
$(".swal2-cancel").attr("disabled", false);
} else {
resolve();
}
})
}
}).then(
function (result) {
var restore = buttonLoading("#add_promemoria");
$.post(globals.rootdir + "/actions.php?id_plugin='.$plugin['id'].'&id_parent='.$id_record.'", {
op: "add-promemoria",
data_richiesta: "'.$contratto['data_accettazione'].'",
idtipointervento: $(".swal2-select").val()
}).done(function(data) {
launch_modal("Nuovo promemoria", globals.rootdir + "/plugins/'.$plugin['directory'].'/pianficazione.php?id_plugin='.$plugin['id'].'&id_parent='.$id_record.'&id_record=" + data + "&add=1");
buttonRestore("#add_promemoria", restore);
});
},
function (dismiss) {}
);
}
$("#add_promemoria").click(function() {
askTipoIntervento();
var id_tipo = $("#id_tipo_promemoria").val();
if (!id_tipo){
swal("'.tr('Nessun tipo di promemoria selezionato!').'", "'.tr('Per continuare devi selezionare una tipologia per il promemoria!').'", "error");
return;
}
var restore = buttonLoading("#add_promemoria");
$.post(globals.rootdir + "/actions.php?id_plugin='.$structure['id'].'&id_parent='.$id_record.'", {
op: "add-promemoria",
data_richiesta: "'.$contratto['data_accettazione'].'",
idtipointervento: id_tipo,
}).done(function(data) {
launch_modal("Nuovo promemoria", globals.rootdir + "/plugins/'.$structure['directory'].'/pianficazione.php?id_plugin='.$structure['id'].'&id_parent='.$id_record.'&id_record=" + data + "&add=1");
buttonRestore("#add_promemoria", restore);
});
});
</script>';

View File

@ -0,0 +1,9 @@
<?php
include_once __DIR__.'/../../core.php';
use Plugins\PianificazioneInterventi\Promemoria;
if (isset($id_record)) {
$promemoria = Promemoria::find($id_record);
}

View File

@ -5,7 +5,7 @@ include_once __DIR__.'/../../core.php';
$plugin = Plugins::get($id_plugin);
$id_module = Modules::get('Contratti')['id'];
$is_add = filter('add') ? true : false;
$block_edit = filter('add') ? false : true;
// Informazioni contratto
$contratto = $dbo->fetchOne('SELECT * FROM `co_contratti` WHERE `id` = :id', [
@ -60,14 +60,13 @@ $orario_inizio = '09:00';
$orario_fine = !empty($tempo_standard) ? date('H:i', strtotime($orario_inizio) + ((60 * 60) * $tempo_standard)) : '17:00';
echo '
<form id="add_form" action="'.$rootdir.'/controller.php" method="post" role="form">
<form id="add_form" action="" method="post" role="form">
<input type="hidden" name="id_plugin" value="'.$id_plugin.'">
<input type="hidden" name="id_parent" value="'.$id_parent.'">
<input type="hidden" name="id_record" value="'.$id_record.'">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="'.(!empty($is_add) ? 'edit-promemoria' : 'pianificazione').'">';
<input type="hidden" name="op" value="'.(!$block_edit ? 'edit-promemoria' : 'pianificazione').'">';
echo '
<!-- DATI PROMEMORIA -->
@ -80,85 +79,72 @@ echo '
<div class="row">
<div class="col-md-6">
{[ "type": "date", "label": "'.tr('Data promemoria').'", "name": "data_richiesta", "required": 1, "value": "'.$data_accettazione.'", "readonly": '.intval(empty($is_add)).', "min-date": "'.$data_accettazione.'", "max-date": "'.$data_conclusione.'" ]}
{[ "type": "date", "label": "'.tr('Data promemoria').'", "name": "data_richiesta", "required": 1, "value": "'.$data_accettazione.'", "readonly": '.intval($block_edit).', "min-date": "'.$data_accettazione.'", "max-date": "'.$data_conclusione.'" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Tipo intervento').'", "name": "idtipointervento", "required": 1, "id": "idtipointervento_", "value": "'.$record['idtipointervento'].'", "readonly": '.intval(empty($is_add)).', "ajax-source": "tipiintervento", "value": "'.$idtipointervento.'" ]}
{[ "type": "select", "label": "'.tr('Tipo intervento').'", "name": "idtipointervento", "required": 1, "id": "idtipointervento_", "value": "'.$record['idtipointervento'].'", "readonly": '.intval($block_edit).', "ajax-source": "tipiintervento", "value": "'.$idtipointervento.'" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Sede').'", "name": "idsede_c", "values": "query=SELECT 0 AS id, \'Sede legale\' AS descrizione UNION SELECT id, CONCAT( CONCAT_WS( \' (\', CONCAT_WS(\', \', `nomesede`, `citta`), `indirizzo` ), \')\') AS descrizione FROM an_sedi WHERE idanagrafica='.$id_anagrafica.'", "value": "'.$id_sede.'", "readonly": '.intval(empty($is_add)).', "required" : "1" ]}
{[ "type": "select", "label": "'.tr('Sede').'", "name": "idsede_c", "values": "query=SELECT 0 AS id, \'Sede legale\' AS descrizione UNION SELECT id, CONCAT( CONCAT_WS( \' (\', CONCAT_WS(\', \', `nomesede`, `citta`), `indirizzo` ), \')\') AS descrizione FROM an_sedi WHERE idanagrafica='.$id_anagrafica.'", "value": "'.$id_sede.'", "readonly": '.intval($block_edit).', "required" : "1" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "multiple": "1", "label": "'.tr('Impianti a contratto').'", "name": "idimpianti[]", "help": "'.tr('Impianti sede selezionata').'", "values": "query=SELECT my_impianti.id AS id, my_impianti.nome AS descrizione FROM my_impianti_contratti INNER JOIN my_impianti ON my_impianti_contratti.idimpianto = my_impianti.id WHERE my_impianti_contratti.idcontratto = '.$id_parent.' ORDER BY descrizione", "value": "'.implode(',', $id_impianti).'", "readonly": '.intval(empty($is_add)).' ]}
{[ "type": "select", "multiple": "1", "label": "'.tr('Impianti a contratto').'", "name": "idimpianti[]", "help": "'.tr('Impianti sede selezionata').'", "values": "query=SELECT my_impianti.id AS id, my_impianti.nome AS descrizione FROM my_impianti_contratti INNER JOIN my_impianti ON my_impianti_contratti.idimpianto = my_impianti.id WHERE my_impianti_contratti.idcontratto = '.$id_parent.' ORDER BY descrizione", "value": "'.implode(',', $id_impianti).'", "readonly": '.intval($block_edit).' ]}
</div>
</div>
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "richiesta", "id": "richiesta_", "readonly": '.intval(empty($is_add)).', "value": "'.$record['richiesta'].'" ]}
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "richiesta", "id": "richiesta_", "readonly": '.intval($block_edit).', "value": "'.$record['richiesta'].'" ]}
</div>
</div>
</div>
</div>';
echo '
<!-- ARTICOLI -->
<!-- RIGHE -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">'.tr('Materiale da utilizzare').'</h3>
<h3 class="panel-title">'.tr('Righe').'</h3>
</div>
<div class="panel-body">
<div id="articoli">';
<div class="row">
<div class="col-md-12">';
include $plugin->filepath('ajax_articoli.php');
if (!$block_edit) {
echo '
<a class="btn btn-sm btn-primary" data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_plugin='.$id_plugin.'&id_record='.$id_record.'&is_articolo" data-toggle="tooltip" data-title="'.tr('Aggiungi articolo').'">
<i class="fa fa-plus"></i> '.tr('Articolo').'
</a>';
echo '
</div>';
if (!empty($is_add)) {
echo '
<button type="button" class="btn btn-primary" data-title="'.tr('Aggiungi articolo').'" data-toggle="modal" data-href="'.$plugin->fileurl('add_articolo.php').'?id_plugin='.$id_plugin.'&id_record='.$id_record.'&add='.$is_add.'" ><i class="fa fa-plus"></i> '.tr('Aggiungi articolo').'...</button>';
}
echo '
</div>
</div>';
echo '
<!-- SPESE AGGIUNTIVE -->
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">'.tr('Altre spese previste').'</h3>
echo '
<a class="btn btn-sm btn-primary" data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_plugin='.$id_plugin.'&id_record='.$id_record.'&is_riga" data-toggle="tooltip" data-title="'.tr('Aggiungi riga').'">
<i class="fa fa-plus"></i> '.tr('Riga').'
</a>';
}
echo '
</div>
</div>
<div class="panel-body">
<div id="righe">';
<div id="righe">';
include $plugin->filepath('row-list.php');
include $structure->filepath('row-list.php');
echo '
</div>';
if (!empty($is_add)) {
echo '
<button type="button" class="btn btn-primary" data-title="'.tr('Aggiungi altre spese').'" data-toggle="modal" data-href="'.$plugin->fileurl('add_righe.php').'?id_plugin='.$id_plugin.'&id_record='.$id_record.'&add='.$is_add.'"><i class="fa fa-plus"></i> '.tr('Aggiungi altre spese').'...</button>';
}
echo '
echo '
</div>
</div>
</div>';
echo '{( "name": "filelist_and_upload", "id_record": "'.$id_record.'", "id_module": "'.$id_module.'", "id_plugin": "'.$id_plugin.'", "readonly": '.intval(empty($is_add)).' )}';
echo '{( "name": "filelist_and_upload", "id_record": "'.$id_record.'", "id_module": "'.$id_module.'", "id_plugin": "'.$id_plugin.'", "readonly": '.intval($block_edit).' )}';
echo '
<!-- PIANIFICAZIONE CICLICA -->
<div class="panel panel-primary '.(!empty($is_add) ? 'hide' : '').'">
<div class="panel panel-primary '.(!$block_edit ? 'hide' : '').'">
<div class="panel-heading">
<h3 class="panel-title">'.tr('Promemoria ciclico?').'</h3>
</div>
@ -193,7 +179,7 @@ echo '
echo '
<!-- PIANIFICARE INTERVENTI -->
<div class="panel panel-primary '.(!empty($is_add) ? 'hide' : '').'">
<div class="panel panel-primary '.(!$block_edit ? 'hide' : '').'">
<div class="panel-heading">
<h3 class="panel-title">'.tr('Pianificare interventi?').'</h3>
</div>
@ -227,7 +213,7 @@ echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary" '.(empty($is_add) ? 'disabled' : '').' ><i class="fa fa-plus"></i> '.tr('Pianifica').'</button>
<button type="submit" class="btn btn-primary" '.($block_edit ? 'disabled' : '').' ><i class="fa fa-plus"></i> '.tr('Pianifica').'</button>
</div>
</div>
</form>';
@ -300,11 +286,7 @@ echo '
});
function refreshArticoli(id){
$("#articoli").load("'.$plugin->fileurl('ajax_articoli.php').'?id_plugin='.$id_plugin.'&id_record=" + id + "&add='.$is_add.'");
}
function refreshRighe(id){
$("#righe").load("'.$plugin->fileurl('row-list.php').'?id_plugin='.$id_plugin.'&id_record=" + id + "&add='.$is_add.'");
$("#righe").load("'.$plugin->fileurl('row-list.php').'?id_plugin='.$id_plugin.'&id_record=" + id + "&add='.$block_edit.'");
}
</script>';

View File

@ -0,0 +1,78 @@
<?php
use Plugins\PianificazioneInterventi\Promemoria;
include_once __DIR__.'/../../core.php';
$documento = Promemoria::find($id_record);
// Impostazioni per la gestione
$options = [
'op' => 'manage_riga',
'action' => 'add',
'dir' => $documento->direzione,
'idanagrafica' => $documento['idanagrafica'],
'totale_imponibile' => $documento->totale_imponibile,
'id_plugin' => $id_plugin, // Modificato
];
// Dati di default
$result = [
'descrizione' => '',
'qta' => 1,
'um' => '',
'prezzo' => 0,
'sconto_unitario' => 0,
'tipo_sconto' => '',
'idiva' => '',
'idconto' => $idconto,
'ritenuta_contributi' => true,
];
// Leggo l'iva predefinita per l'anagrafica e se non c'è leggo quella predefinita generica
$iva = $dbo->fetchArray('SELECT idiva_vendite AS idiva FROM an_anagrafiche WHERE idanagrafica='.prepare($documento['idanagrafica']));
$result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita');
// Importazione della gestione dedicata
$file = 'riga';
if (get('is_descrizione') !== null) {
$file = 'descrizione';
$options['op'] = 'manage_descrizione';
} elseif (get('is_articolo') !== null) {
$file = 'articolo';
// Aggiunta sconto di default da listino per le vendite
$listino = $dbo->fetchOne('SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_listini ON an_anagrafiche.idlistino_vendite=mg_listini.id WHERE idanagrafica='.prepare($documento['idanagrafica']));
if (!empty($listino['prc_guadagno'])) {
$result['sconto_percentuale'] = $listino['prc_guadagno'];
$result['tipo_sconto'] = 'PRC';
}
$options['op'] = 'manage_articolo';
} elseif (get('is_sconto') !== null) {
$file = 'sconto';
$options['op'] = 'manage_sconto';
}
// Modificato
echo '
<div id="riga-promemoria">';
echo App::load($file.'.php', $result, $options);
echo '
</div>
<script type="text/javascript">
$(document).ready(function() {
$("#riga-promemoria").ajaxForm({
success: function(responseText, statusText, xhr, form){
$(form).closest(".modal").modal("hide");
refreshRighe('.$id_record.');
}
});
});
</script>';

View File

@ -0,0 +1,61 @@
<?php
use Plugins\PianificazioneInterventi\Promemoria;
include_once __DIR__.'/../../core.php';
$documento = Promemoria::find($id_record);
// Impostazioni per la gestione
$options = [
'op' => 'manage_riga',
'action' => 'edit',
'dir' => $documento->direzione,
'idanagrafica' => $documento['idanagrafica'],
'totale_imponibile' => $documento->totale_imponibile,
'id_plugin' => $id_plugin, // Modificato
];
// Dati della riga
$id_riga = get('idriga');
$type = get('type');
$riga = $documento->getRiga($type, $id_riga);
$result = $riga->toArray();
$result['prezzo'] = $riga->prezzo_unitario;
// Importazione della gestione dedicata
$file = 'riga';
if ($riga->isDescrizione()) {
$file = 'descrizione';
$options['op'] = 'manage_descrizione';
} elseif ($riga->isArticolo()) {
$file = 'articolo';
$options['op'] = 'manage_articolo';
} elseif ($riga->isSconto()) {
$file = 'sconto';
$options['op'] = 'manage_sconto';
}
// Modificato
echo '
<div id="riga-promemoria">';
echo App::load($file.'.php', $result, $options);
echo '
</div>
<script type="text/javascript">
$(document).ready(function() {
$("#riga-promemoria").ajaxForm({
success: function(responseText, statusText, xhr, form){
$(form).closest(".modal").modal("hide");
refreshRighe('.$id_record.');
}
});
});
</script>';

View File

@ -0,0 +1,172 @@
<?php
use Plugins\PianificazioneInterventi\Promemoria;
include_once __DIR__.'/../../core.php';
$block_edit = filter('add') ? false : true;
$show_prezzi = true;
$promemoria = $promemoria ?: Promemoria::find($id_record);
$righe = $promemoria->getRighe();
if (!$righe->isEmpty()) {
echo '
<table class="table table-striped table-hover table-condensed table-bordered">
<thead>
<tr>
<th>'.tr('Descrizione').'</th>
<th class="text-center" width="8%">'.tr('Q.').'</th>
<th class="text-center" width="15%">'.tr('Prezzo di acquisto').'</th>';
if ($show_prezzi) {
echo '
<th class="text-center" width="15%">'.tr('Prezzo di vendita').'</th>
<th class="text-center" width="10%">'.tr('Iva').'</th>
<th class="text-center" width="15%">'.tr('Imponibile').'</th>';
}
if (!$block_edit) {
echo '
<th class="text-center" width="120" class="text-center">'.tr('#').'</th>';
}
echo '
</tr>
</thead>
<tbody>';
foreach ($righe as $riga) {
$r = $riga->toArray();
$extra = '';
$mancanti = $riga->isArticolo() ? $riga->missing_serials_number : 0;
if ($mancanti > 0) {
$extra = 'class="warning"';
}
$descrizione = (!empty($riga->articolo) ? $riga->articolo->codice.' - ' : '').$riga['descrizione'];
echo '
<tr '.$extra.'>
<td>
'.Modules::link($riga->isArticolo() ? Modules::get('Articoli')['id'] : null, $riga->isArticolo() ? $riga['idarticolo'] : null, $descrizione);
if ($riga->isArticolo()) {
if (!empty($mancanti)) {
echo '
<br><b><small class="text-danger">'.tr('_NUM_ serial mancanti', [
'_NUM_' => $mancanti,
]).'</small></b>';
}
$serials = $riga->serials;
if (!empty($serials)) {
echo '
<br>'.tr('SN').': '.implode(', ', $serials);
}
}
echo '
</td>';
// Quantità
echo '
<td class="text-right">
'.Translator::numberToLocale($r['qta'], 'qta').' '.$r['um'].'
</td>';
//Costo unitario
echo '
<td class="text-right">
'.moneyFormat($riga->costo_unitario).'
</td>';
if ($show_prezzi) {
// Prezzo unitario
echo '
<td class="text-right">
'.moneyFormat($riga->prezzo_unitario);
if (abs($r['sconto_unitario']) > 0) {
$text = $r['sconto_unitario'] > 0 ? tr('sconto _TOT_ _TYPE_') : tr('maggiorazione _TOT_ _TYPE_');
echo '
<br><small class="label label-danger">'.replace($text, [
'_TOT_' => Translator::numberToLocale(abs($r['sconto_unitario'])),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : currency()),
]).'</small>';
}
echo '
</td>';
echo '
<td class="text-right">
'.moneyFormat($r['iva']).'
</td>';
// Prezzo di vendita
echo '
<td class="text-right">
'.moneyFormat($riga->imponibile).'
</td>';
}
// Pulsante per riportare nel magazzino centrale.
// Visibile solo se l'intervento non è stato nè fatturato nè completato.
if (!$block_edit) {
echo '
<td class="text-center">';
if ($r['abilita_serial']) {
echo '
<button type="button" class="btn btn-info btn-xs" data-toggle="tooltip" onclick="launch_modal(\''.tr('Modifica articoli').'\', \''.$rootdir.'/modules/fatture/add_serial.php?id_module='.$id_module.'&id_record='.$id_record.'&idarticolo='.$r['idriga'].'&idriga='.$r['id'].'\');">
<i class="fa fa-barcode"></i>
</button>';
}
echo '
<button type="button" class="btn btn-warning btn-xs" data-toggle="tooltip" onclick="launch_modal(\''.tr('Modifica').'\', \''.$structure->fileurl('row-edit.php').'?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'&type='.urlencode(get_class($riga)).'\');">
<i class="fa fa-edit"></i>
</button>
<button type="button" class="btn btn-danger btn-xs" data-toggle="tooltip" onclick="elimina_riga(\''.addslashes(get_class($riga)).'\', \''.$riga->id.'\');">
<i class="fa fa-trash"></i>
</button>
</td>';
}
echo '
</tr>';
}
echo '
</tbody>
</table>';
} else {
echo '
<p>'.tr('Nessuna riga presente').'.</p>';
}
?>
<script type="text/javascript">
function elimina_riga(type, id){
if(confirm('<?php echo tr('Eliminare questa riga?'); ?>')) {
$.post(globals.rootdir + '/actions.php', {
op: 'delete_riga',
id_module: globals.id_module,
id_record: globals.id_record,
type: type,
idriga: id,
}, function (data, result) {
if (result == 'success') {
// Ricarico le righe
$('#righe').load('<?php echo $module->fileurl('row-list.php'); ?>?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>');
// Toast
alertPush();
}
});
}
}
</script>

View File

@ -0,0 +1,39 @@
<?php
namespace Plugins\PianificazioneInterventi\Components;
use Common\Components\Article;
use Modules\Articoli\Articolo as Original;
use Modules\Contratti\Contratto;
use Plugins\PianificazioneInterventi\Promemoria;
class Articolo extends Article
{
use RelationTrait;
public $movimenta_magazzino = false;
protected $table = 'co_righe_promemoria';
/**
* Crea un nuovo articolo collegato ad un contratto.
*
* @return self
*/
public static function build(Promemoria $promemoria, Original $articolo)
{
$model = parent::build($promemoria, $articolo);
return $model;
}
public function movimentaMagazzino($qta)
{
return;
}
public function getDirection()
{
return $this->contratto->tipo->dir;
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace Plugins\PianificazioneInterventi\Components;
use Common\Components\Description;
use Modules\Contratti\Contratto;
use Plugins\PianificazioneInterventi\Promemoria;
class Descrizione extends Description
{
use RelationTrait;
protected $table = 'co_righe_promemoria';
/**
* Crea una nuova riga collegata ad un contratto.
*
* @return self
*/
public static function build(Promemoria $promemoria)
{
$model = parent::build($promemoria);
return $model;
}
}

View File

@ -0,0 +1,46 @@
<?php
namespace Plugins\PianificazioneInterventi\Components;
use Plugins\PianificazioneInterventi\Promemoria;
trait RelationTrait
{
protected $disableOrder = true;
public function getParentID()
{
return 'id_promemoria';
}
public function parent()
{
return $this->belongsTo(Promemoria::class, $this->getParentID());
}
public function contratto()
{
return $this->parent();
}
public function fixIvaIndetraibile()
{
}
public function getQtaEvasaAttribute()
{
return 0;
}
public function setQtaEvasaAttribute($value)
{
}
/**
* Effettua i conti per il subtotale della riga.
*/
protected function fixSubtotale()
{
$this->fixIva();
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace Plugins\PianificazioneInterventi\Components;
use Common\Components\Row;
use Modules\Contratti\Contratto;
use Plugins\PianificazioneInterventi\Promemoria;
class Riga extends Row
{
use RelationTrait;
protected $table = 'co_righe_promemoria';
/**
* Crea una nuova riga collegata ad un contratto.
*
* @return self
*/
public static function build(Promemoria $promemoria)
{
$model = parent::build($promemoria);
return $model;
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace Plugins\PianificazioneInterventi\Components;
use Common\Components\Discount;
use Plugins\PianificazioneInterventi\Promemoria;
class Sconto extends Discount
{
use RelationTrait;
protected $table = 'co_righe_promemoria';
/**
* Crea un nuovo sconto collegato ad un contratto.
*
* @return self
*/
public static function build(Promemoria $promemoria)
{
$model = parent::build($promemoria);
return $model;
}
}

View File

@ -0,0 +1,123 @@
<?php
namespace Plugins\PianificazioneInterventi;
use Common\Document;
use Modules\Contratti\Contratto;
use Modules\Interventi\Intervento;
use Modules\TipiIntervento\Tipo as TipoSessione;
use Traits\RecordTrait;
class Promemoria extends Document
{
use RecordTrait;
protected $table = 'co_promemoria';
/**
* Crea un nuovo promemoria.
*
* @param string $data_richiesta
*
* @return self
*/
public static function build(Contratto $contratto, TipoSessione $tipo, $data_richiesta)
{
$model = parent::build();
$model->contratto()->associate($contratto);
$model->tipo()->associate($tipo);
$model->data_richiesta = $data_richiesta;
$model->idsede = $contratto->idsede;
// Salvataggio delle informazioni
$model->save();
return $model;
}
public function getPluginAttribute()
{
return 'Pianificazione interventi';
}
public function getDirezioneAttribute()
{
return 'entrata';
}
public function pianifica(Intervento $intervento)
{
$this->intervento()->associate($intervento); // Collego l'intervento ai promemoria
$this->save();
// Copia delle righe
$righe = $this->getRighe();
foreach ($righe as $riga) {
$copia = $riga->copiaIn($intervento, $riga->qta);
if ($copia->isArticolo()) {
$copia->movimenta($copia->qta);
}
}
// Copia degli allegati
$allegati = $this->uploads();
foreach ($allegati as $allegato) {
$allegato->copia([
'id_module' => $intervento->getModule()->id,
'id_record' => $intervento->id,
]);
}
// Collego gli impianti del promemoria all'intervento
$database = database();
if (!empty($this->idimpianti)) {
$impianti = explode(',', $this->idimpianti);
foreach ($impianti as $impianto) {
$database->query('INSERT INTO my_impianti_interventi (idintervento, idimpianto) VALUES ('.prepare($intervento->id).', '.prepare($impianto).' )');
}
}
}
public function anagrafica()
{
return $this->contratto->anagrafica();
}
public function contratto()
{
return $this->belongsTo(Contratto::class, 'idcontratto');
}
public function intervento()
{
return $this->belongsTo(Intervento::class, 'idintervento');
}
public function tipo()
{
return $this->belongsTo(TipoSessione::class, 'idtipointervento');
}
public function articoli()
{
return $this->hasMany(Components\Articolo::class, 'id_promemoria');
}
public function righe()
{
return $this->hasMany(Components\Riga::class, 'id_promemoria');
}
public function sconti()
{
return $this->hasMany(Components\Sconto::class, 'id_promemoria');
}
public function descrizioni()
{
return $this->hasMany(Components\Descrizione::class, 'id_promemoria');
}
}

View File

@ -253,6 +253,7 @@ class App
$id_module = $module['id'];
$id_record = filter('id_record');
$id_plugin = $options['id_plugin'];
$directory = empty($directory) ? 'include|custom|/common/' : $directory;

View File

@ -42,16 +42,11 @@ ALTER TABLE `in_righe_interventi` ADD `old_id` int(11);
INSERT INTO `in_righe_interventi` (`old_id`, `idarticolo`, `idintervento`, `is_descrizione`, `is_sconto`, `descrizione`, `prezzo_acquisto`, `prezzo_vendita`, `sconto`, `sconto_unitario`, `tipo_sconto`, `idiva`, `desc_iva`, `iva`, `qta`, `um`, `abilita_serial`, `idimpianto`) SELECT `id`, `idarticolo`, `idintervento`, `is_descrizione`, `is_sconto`, `descrizione`, `prezzo_acquisto`, `prezzo_vendita`, `sconto`, `sconto_unitario`, `tipo_sconto`, `idiva`, `desc_iva`, `iva`, `qta`, `um`, `abilita_serial`, `idimpianto` FROM `mg_articoli_interventi`;
UPDATE `mg_prodotti` SET `id_riga_intervento` = (SELECT `id` FROM `in_righe_interventi` WHERE `in_righe_interventi`.`old_id` = `id_riga_intervento`) WHERE `id_riga_intervento` IS NOT NULL;
ALTER TABLE `in_righe_interventi` DROP `old_id`;
ALTER TABLE `co_promemoria_righe` ADD `abilita_serial` boolean NOT NULL DEFAULT '0' AFTER `um`, ADD `idimpianto` int(11), ADD `idarticolo` int(11), ADD FOREIGN KEY (`idarticolo`) REFERENCES `mg_articoli`(`id`) ON DELETE SET NULL, CHANGE `um` `um` varchar(25);
ALTER TABLE `co_promemoria_righe` ADD `is_descrizione` TINYINT(1) DEFAULT FALSE NOT NULL, ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`;
INSERT INTO `co_promemoria_righe` (`idarticolo`, `id_promemoria`, `descrizione`, `prezzo_acquisto`, `prezzo_vendita`, `sconto`, `sconto_unitario`, `tipo_sconto`, `idiva`, `desc_iva`, `iva`, `qta`, `um`, `abilita_serial`, `idimpianto`) SELECT `idarticolo`, `id_promemoria`, `descrizione`, `prezzo_acquisto`, `prezzo_vendita`, `sconto`, `sconto_unitario`, `tipo_sconto`, `idiva`, `desc_iva`, `iva`, `qta`, `um`, `abilita_serial`, `idimpianto` FROM `co_promemoria_articoli`;
ALTER TABLE `in_righe_interventi` CHANGE `prezzo_acquisto` `costo_unitario` decimal(12,6) NOT NULL AFTER `qta`,
CHANGE `prezzo_vendita` `prezzo_unitario` decimal(12,6) NOT NULL AFTER `costo_unitario`,
ADD `iva_unitaria` decimal(12,6) NOT NULL AFTER `prezzo_unitario`,
ADD `prezzo_unitario_ivato` decimal(12,6) NOT NULL AFTER `iva_unitaria`,
ADD `sconto_percentuale` decimal(12,6) NOT NULL AFTER `sconto_unitario`,
ADD `sconto_iva` decimal(12,6) NOT NULL AFTER `sconto_unitario`,
ADD `sconto_unitario_ivato` decimal(12,6) NOT NULL AFTER `sconto_iva`;
ALTER TABLE `co_righe_documenti` CHANGE `prezzo_unitario_acquisto` `costo_unitario` decimal(12,6) NOT NULL AFTER `qta`,
ADD `prezzo_unitario` decimal(12,6) NOT NULL AFTER `costo_unitario`,
ADD `iva_unitaria` decimal(12,6) NOT NULL AFTER `prezzo_unitario`,
@ -87,38 +82,76 @@ ALTER TABLE `or_righe_ordini` CHANGE `prezzo_unitario_acquisto` `costo_unitario`
ADD `sconto_percentuale` decimal(12,6) NOT NULL AFTER `sconto_unitario`,
ADD `sconto_iva` decimal(12,6) NOT NULL AFTER `sconto_percentuale`,
ADD `sconto_unitario_ivato` decimal(12,6) NOT NULL AFTER `sconto_iva`;
ALTER TABLE `in_righe_interventi` CHANGE `prezzo_acquisto` `costo_unitario` decimal(12,6) NOT NULL AFTER `qta`,
CHANGE `prezzo_vendita` `prezzo_unitario` decimal(12,6) NOT NULL AFTER `costo_unitario`,
ADD `iva_unitaria` decimal(12,6) NOT NULL AFTER `prezzo_unitario`,
ADD `prezzo_unitario_ivato` decimal(12,6) NOT NULL AFTER `iva_unitaria`,
ADD `sconto_percentuale` decimal(12,6) NOT NULL AFTER `sconto_unitario`,
ADD `sconto_iva` decimal(12,6) NOT NULL AFTER `sconto_unitario`,
ADD `sconto_unitario_ivato` decimal(12,6) NOT NULL AFTER `sconto_iva`;
ALTER TABLE `co_promemoria_righe` CHANGE `prezzo_acquisto` `costo_unitario` decimal(12,6) NOT NULL AFTER `qta`,
CHANGE `prezzo_vendita` `prezzo_unitario` decimal(12,6) NOT NULL AFTER `costo_unitario`,
ADD `iva_unitaria` decimal(12,6) NOT NULL AFTER `prezzo_unitario`,
ADD `prezzo_unitario_ivato` decimal(12,6) NOT NULL AFTER `iva_unitaria`,
ADD `sconto_percentuale` decimal(12,6) NOT NULL AFTER `sconto_unitario`,
ADD `sconto_iva` decimal(12,6) NOT NULL AFTER `sconto_unitario`,
ADD `sconto_unitario_ivato` decimal(12,6) NOT NULL AFTER `sconto_iva`;
UPDATE `co_righe_documenti` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario` = `subtotale` / `qta`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),
`sconto_unitario` = IF(`tipo_sconto` = 'PRC', `sconto` / `qta`, `sconto_unitario`),
`sconto_unitario_ivato` = `sconto_unitario`;
UPDATE `co_righe_preventivi` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario` = `subtotale` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),
`sconto_unitario` = IF(`tipo_sconto` = 'PRC', `sconto` / `qta`, `sconto_unitario`),
`sconto_unitario_ivato` = `sconto_unitario`;
UPDATE `co_righe_contratti` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario` = `subtotale` / `qta`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),
`sconto_unitario` = IF(`tipo_sconto` = 'PRC', `sconto` / `qta`, `sconto_unitario`),
`sconto_unitario_ivato` = `sconto_unitario`;
UPDATE `dt_righe_ddt` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario` = `subtotale` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),
`sconto_unitario` = IF(`tipo_sconto` = 'PRC', `sconto` / `qta`, `sconto_unitario`),
`sconto_unitario_ivato` = `sconto_unitario`;
UPDATE `or_righe_ordini` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario` = `subtotale` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`sconto_unitario_ivato` = `sconto_unitario`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),
`sconto_unitario` = IF(`tipo_sconto` = 'PRC', `sconto` / `qta`, `sconto_unitario`),
`sconto_unitario_ivato` = `sconto_unitario`;
UPDATE `in_righe_interventi` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),
`sconto_unitario` = IF(`tipo_sconto` = 'PRC', `sconto` / `qta`, `sconto_unitario`),
`sconto_unitario_ivato` = `sconto_unitario`;
UPDATE `co_promemoria_righe` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),
`sconto_unitario` = IF(`tipo_sconto` = 'PRC', `sconto` / `qta`, `sconto_unitario`),
`sconto_unitario_ivato` = `sconto_unitario`;
ALTER TABLE `co_promemoria_righe` RENAME TO `co_righe_promemoria`;
DROP TABLE `mg_articoli_interventi`;
DROP TABLE `co_promemoria_articoli`;
-- Aggiunta supporto a prezzi ivati
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `created_at`, `updated_at`, `order`, `help`) VALUES (NULL, 'Utilizza prezzi di vendita con IVA incorporata', '0', 'boolean', '1', 'Fatturazione', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, 'Abilita la gestione degli importi ivati per i documenti di vendita.');