diff --git a/include/common/conti.php b/include/common/conti.php
index 09fd00a5d..57fb52d75 100644
--- a/include/common/conti.php
+++ b/include/common/conti.php
@@ -9,7 +9,7 @@ if ($options['dir'] == 'entrata') {
$show_rivalsa_inps = (setting('Percentuale rivalsa INPS') != '');
$show_ritenuta_acconto = (setting("Percentuale ritenuta d'acconto") != '');
- $show_ritenuta_acconto |= !empty($result['id_ritenuta_acconto_predefined']);
+ $show_ritenuta_acconto |= !empty($options['id_ritenuta_acconto_predefined']);
} else {
$show_rivalsa_inps = 1;
$show_ritenuta_acconto = 1;
@@ -28,55 +28,56 @@ if ($options['action'] == 'edit') {
// TODO: Luca S. questi campi non dovrebbero essere definiti all'interno della scheda fornitore?
$id_rivalsa_inps = '';
$id_ritenuta_acconto = '';
- // questo campo non andrebbe letto da impostazioni
- $calcolo_ritenuta_acconto = setting("Metodologia calcolo ritenuta d'acconto predefinito");
}
// Fattura di vendita
elseif ($options['dir'] == 'entrata') {
// Caso particolare per aggiunta articolo
- $id_rivalsa_inps = ($options['op'] == 'addarticolo') ? '':setting('Percentuale rivalsa INPS');
+ $id_rivalsa_inps = ($options['op'] == 'addarticolo') ? '' : setting('Percentuale rivalsa INPS');
- $id_ritenuta_acconto = $result['id_ritenuta_acconto_predefined'] ?: setting("Percentuale ritenuta d'acconto");
- $calcolo_ritenuta_acconto = setting("Metodologia calcolo ritenuta d'acconto predefinito");
+ $id_ritenuta_acconto = $options['id_ritenuta_acconto_predefined'] ?: setting("Percentuale ritenuta d'acconto");
}
}
- if ($show_rivalsa_inps == 1 || $show_ritenuta_acconto == 1) {
- echo '
+$calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto ?: setting("Metodologia calcolo ritenuta d'acconto predefinito");
+
+if ($show_rivalsa_inps == 1 || $show_ritenuta_acconto == 1) {
+ echo '
';
- // Rivalsa INPS
- if ($show_rivalsa_inps == 1) {
- echo '
-
- {[ "type": "select", "label": "'.tr('Rivalsa INPS').'", "name": "idrivalsainps", "value": "'.$id_rivalsa_inps.'", "values": "query=SELECT * FROM co_rivalsainps" ]}
-
';
- }
-
- // Ritenuta d'acconto
- if ($show_ritenuta_acconto == 1) {
- echo '
-
- {[ "type": "select", "label": "'.tr("Ritenuta d'acconto").'", "name": "idritenutaacconto", "value": "'.$id_ritenuta_acconto.'", "values": "query=SELECT * FROM co_ritenutaacconto" ]}
-
';
- }
-
- // Calcola ritenuta d'acconto su
- if ($show_calcolo_ritenuta_acconto == 1) {
- echo '
-
- {[ "type": "select", "label": "'.tr("Calcola ritenuta d'acconto su").'", "name": "calcolo_ritenutaacconto", "value": "'.((empty($calcolo_ritenuta_acconto)) ? 'Imponibile' : $calcolo_ritenuta_acconto).'", "values": "list=\"Imponibile\":\"Imponibile\", \"Imponibile + rivalsa inps\":\"Imponibile + rivalsa inps\"", "required": "1" ]}
-
';
- }
-
+ // Rivalsa INPS
+ if ($show_rivalsa_inps == 1) {
echo '
-
';
+
+ {[ "type": "select", "label": "'.tr('Rivalsa INPS').'", "name": "id_rivalsa_inps", "value": "'.$id_rivalsa_inps.'", "values": "query=SELECT * FROM co_rivalsainps" ]}
+
';
}
- // Conto
+ // Ritenuta d'acconto
+ if ($show_ritenuta_acconto == 1) {
+ echo '
+
+ {[ "type": "select", "label": "'.tr("Ritenuta d'acconto").'", "name": "id_ritenuta_acconto", "value": "'.$id_ritenuta_acconto.'", "values": "query=SELECT * FROM co_ritenutaacconto" ]}
+
';
+ }
+
+ // Calcola ritenuta d'acconto su
+ if ($show_calcolo_ritenuta_acconto == 1) {
+ echo '
+
+ {[ "type": "select", "label": "'.tr("Calcola ritenuta d'acconto su").'", "name": "calcolo_ritenuta_acconto", "value": "'.$calcolo_ritenuta_acconto.'", "values": "list=\"Imponibile\":\"Imponibile\", \"Imponibile + rivalsa inps\":\"Imponibile + rivalsa inps\"", "required": "1" ]}
+
';
+ }
+
+ echo '
+';
+}
+
+// Conto
+if (empty($options['hide_conto'])) {
echo '
{[ "type": "select", "label": "'.tr('Conto').'", "name": "idconto", "required": 1, "value": "'.$result['idconto'].'", "ajax-source": "'.$options['conti'].'" ]}
';
+}
diff --git a/modules/anagrafiche/src/Anagrafica.php b/modules/anagrafiche/src/Anagrafica.php
index d39e505fd..825ea8792 100644
--- a/modules/anagrafiche/src/Anagrafica.php
+++ b/modules/anagrafiche/src/Anagrafica.php
@@ -35,7 +35,6 @@ class Anagrafica extends Model
$model = parent::new();
$model->ragione_sociale = $ragione_sociale;
- $model->updateTipologie($tipologie);
$ultimo = database()->fetchOne('SELECT codice FROM an_anagrafiche ORDER BY CAST(codice AS SIGNED) DESC LIMIT 1');
$codice = Generator::generate(setting('Formato codice anagrafica'), $ultimo['codice']);
@@ -43,6 +42,9 @@ class Anagrafica extends Model
$model->codice = $codice;
$model->save();
+ $model->updateTipologie($tipologie);
+ $model->save();
+
return $model;
}
diff --git a/modules/articoli/actions.php b/modules/articoli/actions.php
index af86c1484..de0a5e4f2 100644
--- a/modules/articoli/actions.php
+++ b/modules/articoli/actions.php
@@ -111,16 +111,16 @@ switch (post('op')) {
break;
- //Duplica articolo
+ // Duplica articolo
case 'copy':
-
$dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM mg_articoli WHERE id = '.prepare($id_record));
$dbo->query('ALTER TABLE tmp DROP id');
$dbo->query('INSERT INTO mg_articoli SELECT NULL,tmp.* FROM tmp');
$id_record = $dbo->lastInsertedID();
$dbo->query('DROP TEMPORARY TABLE tmp');
$dbo->query('UPDATE mg_articoli SET qta=0 WHERE id='.prepare($id_record));
- $_SESSION['infos'][] = tr('Articolo duplicato correttamente!');
+
+ flash()->info(tr('Articolo duplicato correttamente!'));
break;
diff --git a/modules/custom_fields/actions.php b/modules/custom_fields/actions.php
index a214b82a6..067e5dd90 100644
--- a/modules/custom_fields/actions.php
+++ b/modules/custom_fields/actions.php
@@ -17,7 +17,7 @@ switch (post('op')) {
'top' => post('top'),
], ['id' => $id_record]);
- $_SESSION['infos'][] = tr('Salvataggio completato!');
+ flash()->info(tr('Salvataggio completato!'));
break;
@@ -34,7 +34,7 @@ switch (post('op')) {
]);
$id_record = $dbo->lastInsertedID();
- $_SESSION['infos'][] = tr('Nuovo campo personalizzato creato!');
+ flash()->info(tr('Nuovo campo personalizzato creato!'));
break;
diff --git a/modules/ddt/actions.php b/modules/ddt/actions.php
index 0b2056415..f61a0e542 100644
--- a/modules/ddt/actions.php
+++ b/modules/ddt/actions.php
@@ -59,8 +59,8 @@ switch (post('op')) {
$totale_ddt = get_totale_ddt($id_record);
if ($dir == 'uscita') {
- $idrivalsainps = post('idrivalsainps');
- $idritenutaacconto = post('idritenutaacconto');
+ $idrivalsainps = post('id_rivalsa_inps');
+ $idritenutaacconto = post('id_ritenuta_acconto');
$bollo = post('bollo');
} else {
$idrivalsainps = 0;
diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php
index cf807545c..4a85eae24 100644
--- a/modules/fatture/actions.php
+++ b/modules/fatture/actions.php
@@ -4,6 +4,8 @@ include_once __DIR__.'/../../core.php';
use Modules\Fatture\Fattura;
use Modules\Fatture\Articolo;
+use Modules\Fatture\Riga;
+use Modules\Fatture\Descrizione;
use Modules\Articoli\Articolo as ArticoloOriginale;
use Modules\Fatture\Tipo;
use Modules\Anagrafiche\Anagrafica;
@@ -55,8 +57,8 @@ switch (post('op')) {
if ($dir == 'uscita') {
$data = [
'numero' => post('numero'),
- 'idrivalsainps' => post('idrivalsainps'),
- 'idritenutaacconto' => post('idritenutaacconto'),
+ 'idrivalsainps' => post('id_rivalsa_inps'),
+ 'idritenutaacconto' => post('id_ritenuta_acconto'),
];
}
@@ -250,16 +252,11 @@ switch (post('op')) {
case 'addintervento':
if (!empty($id_record) && post('idintervento') !== null) {
- $idintervento = post('idintervento');
- $descrizione = post('descrizione');
- $idiva = post('idiva');
- $idconto = post('idconto');
+ aggiungi_intervento_in_fattura(post('idintervento'), $id_record, post('descrizione'), post('idiva'), post('idconto'), post('id_rivalsa_inps'), post('id_ritenuta_acconto'), post('calcolo_ritenuta_acconto'));
- aggiungi_intervento_in_fattura($idintervento, $id_record, $descrizione, $idiva, $idconto);
-
- $_SESSION['infos'][] = tr('Intervento _NUM_ aggiunto!', [
+ flash()->info(tr('Intervento _NUM_ aggiunto!', [
'_NUM_' => $idintervento,
- ]);
+ ]));
}
break;
@@ -480,110 +477,83 @@ switch (post('op')) {
}
break;
- case 'addarticolo':
- if (!empty($id_record) && post('idarticolo') !== null) {
- $qta = post('qta');
- if (!empty($record['is_reversed'])) {
- $qta = -$qta;
- }
-
- $originale = ArticoloOriginale::find(post('idarticolo'));
- $articolo = Articolo::new($fattura, $originale);
-
- $articolo->descrizione = post('descrizione');
- $um = post('um');
- if (!empty($um)) {
- $articolo->um = $um;
- }
-
- $articolo->id_iva = post('idiva');
- $articolo->idconto = post('idconto');
-
- $articolo->calcolo_ritenuta_acconto = post('calcolo_ritenutaacconto');
- $articolo->id_ritenuta_acconto = post('idritenutaacconto');
-
- $articolo->setSubtotale(post('prezzo'), $qta);
- $articolo->sconto_unitario = post('sconto');
- $articolo->tipo_sconto = post('tipo_sconto');
-
- $articolo->save();
- //add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto, '0', $idconto, $idum, $idrivalsainps, $idritenutaacconto, $calcolo_ritenutaacconto);
-
- ricalcola_costiagg_fattura($id_record);
-
- flash()->info(tr('Articolo aggiunto!'));
+ case 'add_articolo':
+ $qta = post('qta');
+ if (!empty($record['is_reversed'])) {
+ $qta = -$qta;
}
+
+ $originale = ArticoloOriginale::find(post('idarticolo'));
+ $articolo = Articolo::new($fattura, $originale);
+
+ $articolo->descrizione = post('descrizione');
+ $um = post('um');
+ if (!empty($um)) {
+ $articolo->um = $um;
+ }
+
+ $articolo->id_iva = post('idiva');
+ $articolo->idconto = post('idconto');
+
+ $articolo->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto');
+ $articolo->id_ritenuta_acconto = post('id_ritenuta_acconto');
+ $articolo->id_rivalsa_inps = post('id_rivalsa_inps');
+
+ $articolo->costo_unitario = post('prezzo');
+ $articolo->qta = $qta;
+ $articolo->sconto_unitario = post('sconto');
+ $articolo->tipo_sconto = post('tipo_sconto');
+
+ $articolo->save();
+
+ ricalcola_costiagg_fattura($id_record);
+
+ flash()->info(tr('Articolo aggiunto!'));
+
break;
- case 'addriga':
- if (!empty($id_record)) {
- // Selezione costi da intervento
- $descrizione = post('descrizione');
- $idiva = post('idiva');
- $idconto = post('idconto');
- $um = post('um');
- $calcolo_ritenutaacconto = post('calcolo_ritenutaacconto');
-
- $qta = post('qta');
- if (!empty($record['is_reversed'])) {
- $qta = -$qta;
- }
-
- $prezzo = post('prezzo');
-
- // Calcolo dello sconto
- $sconto_unitario = post('sconto');
- $tipo_sconto = post('tipo_sconto');
- $sconto = calcola_sconto([
- 'sconto' => $sconto_unitario,
- 'prezzo' => $prezzo,
- 'tipo' => $tipo_sconto,
- 'qta' => $qta,
- ]);
-
- $subtot = $prezzo * $qta;
-
- // Calcolo iva
- $query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
- $rs = $dbo->fetchArray($query);
- $iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
- $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
- $desc_iva = $rs[0]['descrizione'];
-
- // Calcolo rivalsa inps
- $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare(post('idrivalsainps'));
- $rs = $dbo->fetchArray($query);
- $rivalsainps = ($prezzo * $qta - $sconto) / 100 * $rs[0]['percentuale'];
-
- // Calcolo ritenuta d'acconto
- $query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare(post('idritenutaacconto'));
- $rs = $dbo->fetchArray($query);
- if ($calcolo_ritenutaacconto == 'Imponibile') {
- $ritenutaacconto = (($prezzo * $qta) - $sconto) / 100 * $rs[0]['percentuale'];
- } else {
- $ritenutaacconto = (($prezzo * $qta) - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
- }
-
- // Aggiunta riga generica sul documento
- $query = 'INSERT INTO co_righe_documenti(iddocumento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, is_descrizione, `order`) VALUES('.prepare($id_record).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare(post('idrivalsainps')).', '.prepare($rivalsainps).', '.prepare(post('idritenutaacconto')).', '.prepare($ritenutaacconto).', '.prepare(post('calcolo_ritenutaacconto')).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
- $dbo->query($query);
-
- // Messaggi informativi
- if (!empty($idarticolo)) {
- flash()->info(tr('Articolo aggiunto!'));
- } elseif (!empty($qta)) {
- flash()->info(tr('Riga aggiunta!'));
- } else {
- flash()->info(tr('Riga descrittiva aggiunta!'));
- }
-
- // Ricalcolo inps, ritenuta e bollo
- if ($dir == 'entrata') {
- ricalcola_costiagg_fattura($id_record);
- } else {
- ricalcola_costiagg_fattura($id_record);
- }
+ case 'add_riga':
+ $qta = post('qta');
+ if (!empty($record['is_reversed'])) {
+ $qta = -$qta;
}
+
+ $riga = Riga::new($fattura);
+
+ $riga->descrizione = post('descrizione');
+ $um = post('um');
+ if (!empty($um)) {
+ $riga->um = $um;
+ }
+
+ $riga->id_iva = post('idiva');
+ $riga->idconto = post('idconto');
+
+ $riga->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto');
+ $riga->id_ritenuta_acconto = post('id_ritenuta_acconto');
+ $riga->id_rivalsa_inps = post('id_rivalsa_inps');
+
+ $riga->costo_unitario = post('prezzo');
+ $riga->qta = $qta;
+ $riga->sconto_unitario = post('sconto');
+ $riga->tipo_sconto = post('tipo_sconto');
+
+ $riga->save();
+
+ flash()->info(tr('Riga aggiunta!'));
+
+ // Ricalcolo inps, ritenuta e bollo
+ ricalcola_costiagg_fattura($id_record);
+
+ break;
+
+ case 'add_descrizione':
+ $riga = Descrizione::new($fattura);
+ $riga->descrizione = post('descrizione');
+ $riga->save();
+
+ flash()->info(tr('Riga descrittiva aggiunta!'));
+
break;
case 'editriga':
@@ -594,7 +564,7 @@ switch (post('op')) {
$idiva = post('idiva');
$idconto = post('idconto');
$um = post('um');
- $calcolo_ritenutaacconto = post('calcolo_ritenutaacconto');
+ $calcolo_ritenutaacconto = post('calcolo_ritenuta_acconto');
$qta = post('qta');
if (!empty($record['is_reversed'])) {
@@ -652,12 +622,12 @@ switch (post('op')) {
$desc_iva = $rs[0]['descrizione'];
// Calcolo rivalsa inps
- $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare(post('idrivalsainps'));
+ $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare(post('id_rivalsa_inps'));
$rs = $dbo->fetchArray($query);
$rivalsainps = ($prezzo * $qta - $sconto) / 100 * $rs[0]['percentuale'];
// Calcolo ritenuta d'acconto
- $query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare(post('idritenutaacconto'));
+ $query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare(post('id_ritenuta_acconto'));
$rs = $dbo->fetchArray($query);
if ($calcolo_ritenutaacconto == 'Imponibile') {
$ritenutaacconto = (($prezzo * $qta) - $sconto) / 100 * $rs[0]['percentuale'];
@@ -667,7 +637,7 @@ switch (post('op')) {
if ($is_descrizione == 0) {
// Modifica riga generica sul documento
- $query = 'UPDATE co_righe_documenti SET idconto='.prepare($idconto).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', idritenutaacconto='.prepare(post('idritenutaacconto')).', ritenutaacconto='.prepare($ritenutaacconto).', idrivalsainps='.prepare(post('idrivalsainps')).', rivalsainps='.prepare($rivalsainps).', calcolo_ritenutaacconto='.prepare(post(calcolo_ritenutaacconto)).', qta='.prepare($qta).' WHERE id='.prepare($idriga).' AND iddocumento='.prepare($iddocumento);
+ $query = 'UPDATE co_righe_documenti SET idconto='.prepare($idconto).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', idritenutaacconto='.prepare(post('id_ritenuta_acconto')).', ritenutaacconto='.prepare($ritenutaacconto).', idrivalsainps='.prepare(post('id_rivalsa_inps')).', rivalsainps='.prepare($rivalsainps).', calcolo_ritenutaacconto='.prepare(post(calcolo_ritenutaacconto)).', qta='.prepare($qta).' WHERE id='.prepare($idriga).' AND iddocumento='.prepare($iddocumento);
} else {
// Modifica riga descrizione sul documento
$query = 'UPDATE co_righe_documenti SET descrizione='.prepare($descrizione).' WHERE id='.prepare($idriga).' AND iddocumento='.prepare($iddocumento);
diff --git a/modules/fatture/add_intervento.php b/modules/fatture/add_intervento.php
index 5f43952e1..98bce50ed 100644
--- a/modules/fatture/add_intervento.php
+++ b/modules/fatture/add_intervento.php
@@ -73,6 +73,18 @@ echo '
';
+$options = [
+ 'action' => 'add',
+ 'hide_conto' => true,
+ 'dir' => $dir,
+];
+
+// Leggo la ritenuta d'acconto predefinita per l'anagrafica e se non c'è leggo quella predefinita generica
+$ritenuta_acconto = $dbo->fetchOne('SELECT id_ritenuta_acconto_'.($dir == 'uscita' ? 'acquisti' : 'vendite').' AS id_ritenuta_acconto FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica));
+$options['id_ritenuta_acconto_predefined'] = $ritenuta_acconto['id_ritenuta_acconto'];
+
+echo App::internalLoad('conti.php', [], $options);
+
// Leggo l'iva predefinita dall'articolo e se non c'è leggo quella predefinita generica
$idiva = $idiva ?: setting('Iva predefinita');
diff --git a/modules/fatture/row-add.php b/modules/fatture/row-add.php
index 5731f7957..8022a658f 100644
--- a/modules/fatture/row-add.php
+++ b/modules/fatture/row-add.php
@@ -21,7 +21,7 @@ if (empty($idconto)) {
// Impostazioni per la gestione
$options = [
- 'op' => 'addriga',
+ 'op' => 'add_riga',
'action' => 'add',
'dir' => $dir,
'conti' => $conti,
@@ -48,7 +48,7 @@ $result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita');
// Leggo la ritenuta d'acconto predefinita per l'anagrafica e se non c'è leggo quella predefinita generica
$ritenuta_acconto = $dbo->fetchOne('SELECT id_ritenuta_acconto_'.($dir == 'uscita' ? 'acquisti' : 'vendite').' AS id_ritenuta_acconto FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica));
-$result['id_ritenuta_acconto_predefined'] = $ritenuta_acconto['id_ritenuta_acconto'];
+$options['id_ritenuta_acconto_predefined'] = $ritenuta_acconto['id_ritenuta_acconto'];
// Sconto unitario
$rss = $dbo->fetchArray('SELECT prc_guadagno FROM mg_listini WHERE id=(SELECT idlistino_'.($dir == 'uscita' ? 'acquisti' : 'vendite').' FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica).')');
@@ -61,10 +61,12 @@ if (!empty($rss)) {
$file = 'riga';
if (get('is_descrizione') !== null) {
$file = 'descrizione';
+
+ $options['op'] = 'add_descrizione';
} elseif (get('is_articolo') !== null) {
$file = 'articolo';
- $options['op'] = 'addarticolo';
+ $options['op'] = 'add_articolo';
}
echo App::load($file.'.php', $result, $options);
diff --git a/modules/fatture/src/Descrizione.php b/modules/fatture/src/Descrizione.php
new file mode 100644
index 000000000..1fbcbf142
--- /dev/null
+++ b/modules/fatture/src/Descrizione.php
@@ -0,0 +1,31 @@
+fattura()->associate($fattura);
+
+ return $model;
+ }
+
+ public function fattura()
+ {
+ return $this->belongsTo(Fattura::class, 'iddocumento');
+ }
+}
diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php
index 5f8f511f6..4ae2c2a83 100644
--- a/modules/fatture/src/Fattura.php
+++ b/modules/fatture/src/Fattura.php
@@ -310,6 +310,18 @@ class Fattura extends Model
return $this->getTipo()['reversed'] == 1;
}
+ public function updateSconto()
+ {
+ // Aggiornamento sconto
+ aggiorna_sconto([
+ 'parent' => 'co_documenti',
+ 'row' => 'co_righe_documenti',
+ ], [
+ 'parent' => 'id',
+ 'row' => 'iddocumento',
+ ], $this->id);
+ }
+
public function anagrafica()
{
return $this->belongsTo(Anagrafica::class, 'idanagrafica');
@@ -335,15 +347,8 @@ class Fattura extends Model
return $this->hasMany(Riga::class, 'iddocumento');
}
- public function updateSconto()
+ public function descrizioni()
{
- // Aggiornamento sconto
- aggiorna_sconto([
- 'parent' => 'co_documenti',
- 'row' => 'co_righe_documenti',
- ], [
- 'parent' => 'id',
- 'row' => 'iddocumento',
- ], $this->id);
+ return $this->hasMany(Descrizione::class, 'iddocumento');
}
}
diff --git a/modules/interventi/modutil.php b/modules/interventi/modutil.php
index 217cc51ba..baa66e1d0 100644
--- a/modules/interventi/modutil.php
+++ b/modules/interventi/modutil.php
@@ -352,12 +352,13 @@ function calcola_ore_intervento($orario_inizio, $orario_fine)
return $ore;
}
-function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizione, $id_iva, $id_conto)
+function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizione, $id_iva, $id_conto, $id_rivalsa_inps = null, $id_ritenuta_acconto = null,$calcolo_ritenuta_acconto = null)
{
$dbo = database();
- $id_ritenuta_acconto = setting("Percentuale ritenuta d'acconto");
- $id_rivalsa_inps = setting('Percentuale rivalsa INPS');
+ $id_rivalsa_inps = $id_rivalsa_inps ?: setting('Percentuale rivalsa INPS');
+ $id_ritenuta_acconto = $id_ritenuta_acconto ?: setting("Percentuale ritenuta d'acconto");
+ $calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto ?: setting("Metodologia calcolo ritenuta d'acconto predefinito");
// Leggo l'anagrafica del cliente
$rs = $dbo->fetchArray('SELECT idanagrafica, codice, (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento='.prepare($id_intervento).') AS data FROM `in_interventi` WHERE id='.prepare($id_intervento));
@@ -395,13 +396,13 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
// Calcolo ritenuta d'acconto
$query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare($id_ritenuta_acconto);
$rs = $dbo->fetchArray($query);
- if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
+ if ($calcolo_ritenuta_acconto == 'Imponibile') {
$ritenutaacconto = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
} else {
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
}
- $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', 'ore', ".prepare($ore).', '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
+ $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', 'ore', ".prepare($ore).', '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
$dbo->query($query);
}
}
@@ -486,13 +487,13 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
// Calcolo ritenuta d'acconto
$query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare($id_ritenuta_acconto);
$rs = $dbo->fetchArray($query);
- if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
+ if ($calcolo_ritenuta_acconto == 'Imponibile') {
$ritenutaacconto = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
} else {
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
}
- $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($rsr[$i]['descrizione']).', '.prepare($subtot).', '.prepare($rsr[$i]['sconto']).', '.prepare($rsr[$i]['sconto_unitario']).', '.prepare($rsr[$i]['tipo_sconto']).', '.prepare($rsr[$i]['um']).', '.prepare($rsr[$i]['qta']).', '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
+ $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($rsr[$i]['descrizione']).', '.prepare($subtot).', '.prepare($rsr[$i]['sconto']).', '.prepare($rsr[$i]['sconto_unitario']).', '.prepare($rsr[$i]['tipo_sconto']).', '.prepare($rsr[$i]['um']).', '.prepare($rsr[$i]['qta']).', '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
$dbo->query($query);
}
}
@@ -517,13 +518,13 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
// Calcolo ritenuta d'acconto
$query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare($id_ritenuta_acconto);
$dati = $dbo->fetchArray($query);
- if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
+ if ($calcolo_ritenuta_acconto == 'Imponibile') {
$ritenutaacconto = ($subtot - $sconto) / 100 * $dati[0]['percentuale'];
} else {
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $dati[0]['percentuale'];
}
- $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Trasferta intervento '.$codice.' del '.Translator::dateToLocale($data)).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', '', 1, ".prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
+ $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Trasferta intervento '.$codice.' del '.Translator::dateToLocale($data)).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', '', 1, ".prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
$dbo->query($query);
}
@@ -547,13 +548,13 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
// Calcolo ritenuta d'acconto
$query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare($id_ritenuta_acconto);
$rs = $dbo->fetchArray($query);
- if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
+ if ($calcolo_ritenuta_acconto == 'Imponibile') {
$ritenutaacconto = $subtot / 100 * $rs[0]['percentuale'];
} else {
$ritenutaacconto = ($subtot + $rivalsainps) / 100 * $rs[0]['percentuale'];
}
- $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', NULL, '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Sconto '.$descrizione).', '.prepare($subtot).', 1, '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
+ $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', NULL, '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Sconto '.$descrizione).', '.prepare($subtot).', 1, '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare($calcolo_ritenuta_acconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
$dbo->query($query);
}
diff --git a/modules/interventi/src/Articolo.php b/modules/interventi/src/Articolo.php
index 58ddaabb2..0dbd31c40 100644
--- a/modules/interventi/src/Articolo.php
+++ b/modules/interventi/src/Articolo.php
@@ -77,6 +77,26 @@ class Articolo extends Article
}
}
+ public function fixIvaIndetraibile()
+ {
+ $iva = database()->fetchOne('SELECT * FROM co_iva WHERE id = :id_iva', [
+ ':id_iva' => $this->idiva,
+ ]);
+
+ $this->iva_indetraibile = $this->iva / 100 * $iva['indetraibile'];
+ }
+ public function setCostoUnitarioAttribute($value)
+ {
+ $this->prezzo_vendita = $value;
+
+ $this->fixSubtotale();
+ }
+
+ public function getCostoUnitarioAttribute($value)
+ {
+ return $this->prezzo_vendita;
+ }
+
public function getSubtotaleAttribute()
{
return $this->prezzo_vendita * $this->qta;
diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php
index 0d5f97504..24ca64d13 100644
--- a/modules/ordini/actions.php
+++ b/modules/ordini/actions.php
@@ -73,8 +73,8 @@ switch (post('op')) {
$sconto = post('sconto_generico');
if ($dir == 'uscita') {
- $idrivalsainps = post('idrivalsainps');
- $idritenutaacconto = post('idritenutaacconto');
+ $idrivalsainps = post('id_rivalsa_inps');
+ $idritenutaacconto = post('id_ritenuta_acconto');
$bollo = post('bollo');
} else {
$idrivalsainps = 0;
diff --git a/modules/utenti/actions.php b/modules/utenti/actions.php
index d52cc5c60..f3a7bb17c 100644
--- a/modules/utenti/actions.php
+++ b/modules/utenti/actions.php
@@ -178,7 +178,7 @@ switch (filter('op')) {
]);
}
- $_SESSION['infos'][] = tr('Permessi reimpostati.');
+ flash()->info(tr('Permessi reimpostati'));
}
break;
diff --git a/src/App.php b/src/App.php
index 54f550046..d8e61a74d 100644
--- a/src/App.php
+++ b/src/App.php
@@ -439,7 +439,7 @@ class App
*
* @return string
*/
- protected static function internalLoad($file, $result, $options, $directory = null)
+ public static function internalLoad($file, $result, $options, $directory = null)
{
$module = Modules::getCurrent();
diff --git a/src/Base/Description.php b/src/Base/Description.php
index 84bc9805f..73a63c3b2 100644
--- a/src/Base/Description.php
+++ b/src/Base/Description.php
@@ -16,4 +16,15 @@ abstract class Description extends Model
});
}
}
+
+ public static function new($bypass = false)
+ {
+ $model = parent::new();
+
+ if (!$bypass) {
+ $model->is_descrizione = 1;
+ }
+
+ return $model;
+ }
}
diff --git a/src/base/Article.php b/src/base/Article.php
index db657dce1..164b5a69e 100644
--- a/src/base/Article.php
+++ b/src/base/Article.php
@@ -20,7 +20,7 @@ abstract class Article extends Row
public static function new(Original $articolo)
{
- $model = parent::new();
+ $model = parent::new(true);
$model->articolo()->associate($articolo);
@@ -33,6 +33,11 @@ abstract class Article extends Row
abstract public function movimenta($qta);
+ /**
+ * Imposta i seriali collegati all'articolo del documento.
+ *
+ * @param array $serials
+ */
public function setSerials($serials)
{
database()->sync('mg_prodotti', [
@@ -44,6 +49,11 @@ abstract class Article extends Row
]);
}
+ /**
+ * Restituisce l'elenco dei seriali collegati all'articolo del documento.
+ *
+ * @return array
+ */
public function getSerialsAttribute()
{
if (empty($this->abilita_serial)) {
@@ -56,11 +66,16 @@ abstract class Article extends Row
return array_column($list, 'serial');
}
+ /**
+ * Modifica la quantità dell'articolo e movimenta automaticamente il magazzino.
+ *
+ * @param double $value
+ */
public function setQtaAttribute($value)
{
$previous = $this->qta;
- $this->attributes['qta'] = $value;
+ parent::setQtaAttribute($value);
$diff = $value - $previous;
$this->movimenta($diff);
diff --git a/src/base/Row.php b/src/base/Row.php
index 6c655671c..a072bcfb3 100644
--- a/src/base/Row.php
+++ b/src/base/Row.php
@@ -6,6 +6,8 @@ use Illuminate\Database\Eloquent\Builder;
abstract class Row extends Description
{
+ protected $costo_unitario;
+
protected static function boot($bypass = false)
{
parent::boot($bypass);
@@ -17,33 +19,36 @@ abstract class Row extends Description
}
}
- /*
- public function getPrezzoAttribute()
+ public static function new($bypass = false)
{
- return $this->prezzo;
+ return parent::new(true);
}
- public function getSubtotaleAttribute()
- {
- return $this->prezzo * $this->qta;
- }
- */
-
public function getTotaleAttribute()
{
return $this->subtotale + $this->iva;
}
+ /**
+ * Restituisce lo sconto della riga corrente in euro.
+ *
+ * @return float
+ */
public function getScontoAttribute()
{
return calcola_sconto([
'sconto' => $this->sconto_unitario,
- 'prezzo' => $this->prezzo ?: $this->prezzo_vendita, // Compatibilità con gli interventi
+ 'prezzo' => $this->costo_unitario,
'tipo' => $this->tipo_sconto,
'qta' => $this->qta,
]);
}
+ /**
+ * Imposta l'identificatore della Rivalsa INPS, effettuando di conseguenza i conti.
+ *
+ * @param int $value
+ */
public function setIdRivalsaINPSAttribute($value)
{
$this->attributes['idrivalsainps'] = $value;
@@ -53,32 +58,61 @@ abstract class Row extends Description
$this->rivalsainps = ($this->subtotale - $this->sconto) / 100 * $rivalsa['percentuale'];
}
+ /**
+ * Restituisce il metodo di calcolo per la Ritenuta d'Acconto.
+ *
+ * @return string
+ */
public function getCalcoloRitenutaAccontoAttribute()
{
- return $this->calcolo_ritenutaacconto ?: 'Imponibile';
+ return $this->calcolo_ritenutaacconto ?: setting("Metodologia calcolo ritenuta d'acconto predefinito");
}
+ /**
+ * Imposta il metodo di calcolo per la Ritenuta d'Acconto.
+ *
+ * @param string $value
+ */
public function setCalcoloRitenutaAccontoAttribute($value)
{
return $this->attributes['calcolo_ritenutaacconto'] = $value;
+
+ $this->fixRitenutaAcconto();
}
+ /**
+ * Imposta l'identificatore della Ritenuta d'Acconto, effettuando di conseguenza i conti in base al valore del campo calcolo_ritenuta_acconto.
+ *
+ * @param int $value
+ */
public function setIdRitenutaAccontoAttribute($value)
{
$this->attributes['idritenutaacconto'] = $value;
+ $this->fixRitenutaAcconto();
+ }
+
+ /**
+ * Effettua i conti per la Ritenuta d'Acconto.
+ */
+ protected function fixRitenutaAcconto()
+ {
// Calcolo ritenuta d'acconto
- $ritenuta = database()->fetchOne('SELECT * FROM co_ritenutaacconto WHERE id = '.prepare($value));
+ $ritenuta = database()->fetchOne('SELECT * FROM co_ritenutaacconto WHERE id = '.prepare($this->idritenutaacconto));
$conto = ($this->subtotale - $this->sconto);
- if ($this->calcolo_ritenutaacconto == 'Imponibile + rivalsa inps') {
+ if ($this->calcolo_ritenuta_acconto == 'Imponibile + rivalsa inps') {
$conto += $this->rivalsainps;
}
- $this->ritenutaacconto = $conto / 100 * $ritenuta['percentuale'];
+ $this->attributes['ritenutaacconto'] = $conto / 100 * $ritenuta['percentuale'];
}
- /* Retrocompatibilità */
+ /**
+ * Imposta il valore dello sconto.
+ *
+ * @param float $value
+ */
public function setScontoUnitarioAttribute($value)
{
$this->attributes['sconto_unitario'] = $value;
@@ -86,6 +120,11 @@ abstract class Row extends Description
$this->fixSconto();
}
+ /**
+ * Imposta il tipo dello sconto.
+ *
+ * @param string $value
+ */
public function setTipoScontoAttribute($value)
{
$this->attributes['tipo_sconto'] = $value;
@@ -93,11 +132,29 @@ abstract class Row extends Description
$this->fixSconto();
}
+ /**
+ * Effettua i conti per lo sconto totale.
+ */
protected function fixSconto()
{
$this->attributes['sconto'] = $this->sconto;
}
+ /**
+ * Imposta l'identificatore dell'IVA, effettuando di conseguenza i conti.
+ *
+ * @param int $value
+ */
+ public function setIdIvaAttribute($value)
+ {
+ $this->attributes['idiva'] = $value;
+
+ $this->fixIva();
+ }
+
+ /**
+ * Effettua i conti per l'IVA.
+ */
protected function fixIva()
{
$iva = database()->fetchOne('SELECT * FROM co_iva WHERE id = :id_iva', [
@@ -107,34 +164,66 @@ abstract class Row extends Description
$valore = ($this->subtotale - $this->sconto) * $iva['percentuale'] / 100;
- $this->desc_iva = $descrizione;
- $this->iva = $valore;
+ $this->attributes['desc_iva'] = $descrizione;
+ $this->attributes['iva'] = $valore;
- // Compatibilità con gli interventi
- if (!isset($this->prezzo_vendita)) {
- $this->iva_indetraibile = $valore / 100 * $iva['indetraibile'];
+ $this->fixIvaIndetraibile();
+ }
+
+ /**
+ * Effettua i conti per l'IVA indetraibile.
+ */
+ protected function fixIvaIndetraibile()
+ {
+ $iva = database()->fetchOne('SELECT * FROM co_iva WHERE id = :id_iva', [
+ ':id_iva' => $this->idiva,
+ ]);
+
+ $this->attributes['iva_indetraibile'] = $this->iva / 100 * $iva['indetraibile'];
+ }
+
+ /**
+ * Imposta la quantità della riga.
+ *
+ * @param float $value
+ */
+ public function setQtaAttribute($value)
+ {
+ $this->attributes['qta'] = $value;
+
+ $this->fixSubtotale();
+ }
+
+ /**
+ * Imposta il costo unitario della riga.
+ *
+ * @param float $value
+ */
+ public function setCostoUnitarioAttribute($value)
+ {
+ $this->costo_unitario = $value;
+
+ $this->fixSubtotale();
+ }
+
+ /**
+ * Restituisce il costo unitario della riga.
+ */
+ public function getCostoUnitarioAttribute()
+ {
+ if (empty($this->costo_unitario)) {
+ $this->costo_unitario = $this->subtotale / $this->qta;
}
- $this->attributes['sconto'] = $this->sconto;
+ return $this->costo_unitario;
}
- public function setIdIvaAttribute($value)
+ /**
+ * Effettua i conti per il subtotale della riga.
+ */
+ protected function fixSubtotale()
{
- $this->attributes['idiva'] = $value;
-
- $this->fixIva();
- }
-
- public function getPrezzoAttribute()
- {
- return $this->subtotale / $this->qta;
- }
-
- public function setSubtotale($prezzo, $qta)
- {
- $this->qta = $qta;
-
- $this->subtotale = $prezzo * $qta;
+ $this->attributes['subtotale'] = $this->costo_unitario * $this->qta;
$this->fixIva();
}