This commit is contained in:
Thomas Zilio 2018-09-26 15:37:46 +02:00
parent 6ad8122f41
commit 2efd4b6300
18 changed files with 381 additions and 222 deletions

View File

@ -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 '
<div class="row">';
// Rivalsa INPS
if ($show_rivalsa_inps == 1) {
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Rivalsa INPS').'", "name": "idrivalsainps", "value": "'.$id_rivalsa_inps.'", "values": "query=SELECT * FROM co_rivalsainps" ]}
</div>';
}
// Ritenuta d'acconto
if ($show_ritenuta_acconto == 1) {
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr("Ritenuta d'acconto").'", "name": "idritenutaacconto", "value": "'.$id_ritenuta_acconto.'", "values": "query=SELECT * FROM co_ritenutaacconto" ]}
</div>';
}
// Calcola ritenuta d'acconto su
if ($show_calcolo_ritenuta_acconto == 1) {
echo '
<div class="col-md-4">
{[ "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" ]}
</div>';
}
// Rivalsa INPS
if ($show_rivalsa_inps == 1) {
echo '
</div>';
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Rivalsa INPS').'", "name": "id_rivalsa_inps", "value": "'.$id_rivalsa_inps.'", "values": "query=SELECT * FROM co_rivalsainps" ]}
</div>';
}
// Conto
// Ritenuta d'acconto
if ($show_ritenuta_acconto == 1) {
echo '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr("Ritenuta d'acconto").'", "name": "id_ritenuta_acconto", "value": "'.$id_ritenuta_acconto.'", "values": "query=SELECT * FROM co_ritenutaacconto" ]}
</div>';
}
// Calcola ritenuta d'acconto su
if ($show_calcolo_ritenuta_acconto == 1) {
echo '
<div class="col-md-4">
{[ "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" ]}
</div>';
}
echo '
</div>';
}
// Conto
if (empty($options['hide_conto'])) {
echo '
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "'.tr('Conto').'", "name": "idconto", "required": 1, "value": "'.$result['idconto'].'", "ajax-source": "'.$options['conti'].'" ]}
</div>
</div>';
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -73,6 +73,18 @@ echo '
</div>
</div>';
$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');

View File

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

View File

@ -0,0 +1,31 @@
<?php
namespace Modules\Fatture;
use Base\Description;
class Descrizione extends Description
{
protected $table = 'co_righe_documenti';
/**
* Crea una nuova riga collegata ad una fattura.
*
* @param Fattura $fattura
*
* @return self
*/
public static function new(Fattura $fattura)
{
$model = parent::new();
$model->fattura()->associate($fattura);
return $model;
}
public function fattura()
{
return $this->belongsTo(Fattura::class, 'iddocumento');
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -178,7 +178,7 @@ switch (filter('op')) {
]);
}
$_SESSION['infos'][] = tr('Permessi reimpostati.');
flash()->info(tr('Permessi reimpostati'));
}
break;

View File

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

View File

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

View File

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

View File

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