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(); }