mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-02-16 19:40:44 +01:00
Miglioramento del bollo
This commit is contained in:
parent
0ca8ba237f
commit
3bfbb0acab
@ -143,11 +143,11 @@ abstract class Row extends Description
|
||||
$this->prezzo_unitario_vendita_riga = $this->attributes['subtotale'] / $this->qta;
|
||||
}
|
||||
|
||||
return $this->prezzo_unitario_vendita_riga;
|
||||
return !is_nan($this->prezzo_unitario_vendita_riga) ? $this->prezzo_unitario_vendita_riga : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Salva la riga, impostando i campi dipendenti dai parametri singoli.
|
||||
* Salva la riga, impostando i campi dipendenti dai singoli parametri.
|
||||
*
|
||||
* @param array $options
|
||||
*
|
||||
|
@ -86,6 +86,7 @@ switch (post('op')) {
|
||||
'is_fattura_conto_terzi' => post('is_fattura_conto_terzi') ?: 0,
|
||||
'n_colli' => post('n_colli'),
|
||||
'tipo_resa' => post('tipo_resa'),
|
||||
'addebita_bollo' => post('addebita_bollo'),
|
||||
'bollo' => 0,
|
||||
'rivalsainps' => 0,
|
||||
'ritenutaacconto' => 0,
|
||||
@ -98,11 +99,7 @@ switch (post('op')) {
|
||||
$rs = $dbo->fetchArray($query);
|
||||
|
||||
// Ricalcolo inps, ritenuta e bollo (se la fattura non è stata pagata)
|
||||
if ($dir == 'entrata') {
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
} else {
|
||||
ricalcola_costiagg_fattura($id_record, $idrivalsainps, $idritenutaacconto, post('bollo'));
|
||||
}
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
|
||||
// Elimino la scadenza e tutti i movimenti, poi se la fattura è emessa le ricalcolo
|
||||
if ($rs[0]['descrizione'] == 'Bozza' or $rs[0]['descrizione'] == 'Annullata') {
|
||||
@ -235,11 +232,7 @@ switch (post('op')) {
|
||||
}
|
||||
|
||||
// Ricalcolo inps, ritenuta e bollo (se la fattura non è stata pagata)
|
||||
if ($dir == 'entrata') {
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
} else {
|
||||
ricalcola_costiagg_fattura($id_record, $rs[0]['idrivalsainps'], $rs[0]['idritenutaacconto'], $rs[0]['bollo']);
|
||||
}
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
|
||||
flash()->info(tr('Fattura duplicata correttamente!'));
|
||||
}
|
||||
|
@ -257,6 +257,10 @@ if ($dir == 'uscita') {
|
||||
{[ "type": "select", "label": "<?php echo tr('Ritenuta contributi'); ?>", "name": "id_ritenuta_contributi", "value": "$id_ritenuta_contributi$", "values": "query=SELECT * FROM co_ritenuta_contributi" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "checkbox", "label": "<?php echo tr('Addebita marca da bollo'); ?>", "name": "addebita_bollo", "value": "$addebita_bollo$" ]}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
@ -451,70 +451,13 @@ function get_new_idmastrino($table = 'co_movimenti')
|
||||
* Ricalcola i costi aggiuntivi in fattura (rivalsa inps, ritenuta d'acconto, marca da bollo)
|
||||
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
|
||||
* $iddocumento int ID della fattura
|
||||
* $idrivalsainps int ID della rivalsa inps da applicare. Se omesso non viene calcolata
|
||||
* $idritenutaacconto int ID della ritenuta d'acconto da applicare. Se omesso non viene calcolata
|
||||
* $bolli float Costi aggiuntivi delle marche da bollo. Se omesso verrà usata la cifra predefinita.
|
||||
*/
|
||||
function ricalcola_costiagg_fattura($iddocumento, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
|
||||
function ricalcola_costiagg_fattura($iddocumento)
|
||||
{
|
||||
global $dir;
|
||||
|
||||
$dbo = database();
|
||||
|
||||
// Se ci sono righe in fattura faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
|
||||
$query = 'SELECT COUNT(id) AS righe FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
if ($rs[0]['righe'] > 0) {
|
||||
$totale_imponibile = get_imponibile_fattura($iddocumento);
|
||||
$totale_fattura = get_totale_fattura($iddocumento);
|
||||
|
||||
// Leggo gli id dei costi aggiuntivi
|
||||
if ($dir == 'uscita') {
|
||||
$query2 = 'SELECT bollo FROM co_documenti WHERE id='.prepare($iddocumento);
|
||||
$rs2 = $dbo->fetchArray($query2);
|
||||
$bollo = $rs2[0]['bollo'];
|
||||
}
|
||||
|
||||
$query = 'SELECT SUM(rivalsainps) AS rivalsainps, SUM(ritenutaacconto) AS ritenutaacconto FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$rivalsainps = $rs[0]['rivalsainps'];
|
||||
$ritenutaacconto = $rs[0]['ritenutaacconto'];
|
||||
|
||||
$iva_rivalsainps = 0;
|
||||
|
||||
$rsr = $dbo->fetchArray('SELECT idiva, rivalsainps FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento));
|
||||
|
||||
for ($r = 0; $r < sizeof($rsr); ++$r) {
|
||||
$qi = 'SELECT percentuale FROM co_iva WHERE id='.prepare($rsr[$r]['idiva']);
|
||||
$rsi = $dbo->fetchArray($qi);
|
||||
$iva_rivalsainps += $rsr[$r]['rivalsainps'] / 100 * $rsi[0]['percentuale'];
|
||||
}
|
||||
|
||||
// Leggo la ritenuta d'acconto se c'è
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
|
||||
$righe_bollo = $fattura->getRighe()->filter(function ($item, $key) {
|
||||
return $item->aliquota != null && in_array($item->aliquota->codice_natura_fe, ['N1', 'N2', 'N3', 'N4']);
|
||||
});
|
||||
|
||||
$importo_righe_bollo = $righe_bollo->sum('netto');
|
||||
|
||||
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
|
||||
$bolli = ($dir == 'uscita') ? $bolli : setting('Importo marca da bollo');
|
||||
$bolli = formatter()->parse($bolli);
|
||||
|
||||
$marca_da_bollo = 0;
|
||||
if (abs($bolli) > 0 && abs($importo_righe_bollo) > setting("Soglia minima per l'applicazione della marca da bollo")) {
|
||||
$marca_da_bollo = $bolli;
|
||||
}
|
||||
|
||||
// Se l'importo è negativo può essere una nota di credito, quindi cambio segno alla marca da bollo
|
||||
$marca_da_bollo = abs($marca_da_bollo);
|
||||
|
||||
$dbo->query('UPDATE co_documenti SET ritenutaacconto='.prepare($ritenutaacconto).', rivalsainps='.prepare($rivalsainps).', iva_rivalsainps='.prepare($iva_rivalsainps).', bollo='.prepare($marca_da_bollo).' WHERE id='.prepare($iddocumento));
|
||||
} else {
|
||||
$dbo->query("UPDATE co_documenti SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id=".prepare($iddocumento));
|
||||
}
|
||||
$fattura = Fattura::find($iddocumento);
|
||||
$fattura->save();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -239,7 +239,7 @@ foreach ($righe as $row) {
|
||||
echo '
|
||||
<td class="text-center">';
|
||||
|
||||
if ($record['stato'] != 'Pagato' && $record['stato'] != 'Emessa') {
|
||||
if ($record['stato'] != 'Pagato' && $record['stato'] != 'Emessa' && $riga['id'] != $fattura->rigaBollo->id) {
|
||||
echo "
|
||||
<form action='".$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record."' method='post' id='delete-form-".$riga['id']."' role='form'>
|
||||
<input type='hidden' name='backto' value='record-edit'>
|
||||
@ -380,23 +380,6 @@ echo '
|
||||
<td></td>
|
||||
</tr>';
|
||||
|
||||
// Mostra marca da bollo se c'è
|
||||
if (!empty($fattura->bollo)) {
|
||||
echo '
|
||||
<tr>
|
||||
<td colspan="5" class="text-right">
|
||||
|
||||
<span class="tip" title="'.tr('Rivalsa per spese bollo fattura. Esclusa IVA articolo 15 d.p.r. 633/1972').'." > <i class="fa fa-question-circle-o"></i></span>
|
||||
|
||||
<b>'.tr('Marca da bollo', [], ['upper' => true]).':</b>
|
||||
</td>
|
||||
<td align="right">
|
||||
'.moneyFormat($fattura->bollo).'
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>';
|
||||
}
|
||||
|
||||
// RITENUTA D'ACCONTO
|
||||
if (!empty($fattura->ritenuta_acconto)) {
|
||||
echo '
|
||||
|
@ -4,6 +4,7 @@ namespace Modules\Fatture;
|
||||
|
||||
use Common\Document;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Fatture\Components\Riga;
|
||||
use Modules\Pagamenti\Pagamento;
|
||||
use Modules\RitenuteContributi\RitenutaContributi;
|
||||
use Plugins\ExportFE\FatturaElettronica;
|
||||
@ -84,6 +85,8 @@ class Fattura extends Document
|
||||
$model->idconto = $id_conto;
|
||||
$model->idsede = $id_sede;
|
||||
|
||||
$model->addebita_bollo = setting('Addebita marca da bollo al cliente');
|
||||
|
||||
$id_ritenuta_contributi = ($tipo_documento->dir == 'entrata') ? setting('Ritenuta contributi') : null;
|
||||
$model->id_ritenuta_contributi = $id_ritenuta_contributi ?: null;
|
||||
|
||||
@ -149,7 +152,7 @@ class Fattura extends Document
|
||||
*/
|
||||
public function getNettoAttribute()
|
||||
{
|
||||
return $this->calcola('netto') + $this->bollo;
|
||||
return $this->calcola('netto');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -249,6 +252,11 @@ class Fattura extends Document
|
||||
return $this->belongsTo(RitenutaContributi::class, 'id_ritenuta_contributi');
|
||||
}
|
||||
|
||||
public function rigaBollo()
|
||||
{
|
||||
return $this->hasOne(Components\Riga::class, 'iddocumento')->where('id', $this->id_riga_bollo);
|
||||
}
|
||||
|
||||
// Metodi generali
|
||||
|
||||
public function getXML()
|
||||
@ -358,6 +366,7 @@ class Fattura extends Document
|
||||
|
||||
// Se c'è una ritenuta d'acconto, la aggiungo allo scadenzario
|
||||
if ($direzione == 'uscita' && $ritenuta_acconto > 0) {
|
||||
$data = $this->data;
|
||||
$scadenza = date('Y-m', strtotime($data.' +1 month')).'-15';
|
||||
$importo = -$ritenuta_acconto;
|
||||
|
||||
@ -372,6 +381,76 @@ class Fattura extends Document
|
||||
{
|
||||
database()->delete('co_scadenziario', ['iddocumento' => $this->id]);
|
||||
}
|
||||
|
||||
protected function calcolaMarcaDaBollo(){
|
||||
$righe_bollo = $this->getRighe()->filter(function ($item, $key) {
|
||||
return $item->aliquota != null && in_array($item->aliquota->codice_natura_fe, ['N1', 'N2', 'N3', 'N4']);
|
||||
});
|
||||
$importo_righe_bollo = $righe_bollo->sum('netto');
|
||||
|
||||
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
|
||||
$bollo = ($this->direzione == 'uscita') ? $this->bollo : setting('Importo marca da bollo');
|
||||
|
||||
$marca_da_bollo = 0;
|
||||
if (abs($bollo) > 0 && abs($importo_righe_bollo) > setting("Soglia minima per l'applicazione della marca da bollo")) {
|
||||
$marca_da_bollo = $bollo;
|
||||
}
|
||||
|
||||
// Se l'importo è negativo può essere una nota di credito, quindi cambio segno alla marca da bollo
|
||||
$marca_da_bollo = abs($marca_da_bollo);
|
||||
|
||||
$this->bollo = $marca_da_bollo;
|
||||
|
||||
$riga = $this->rigaBollo;
|
||||
|
||||
// Rimozione riga bollo se nullo
|
||||
if (empty($this->addebita_bollo) || empty($marca_da_bollo) ){
|
||||
if (!empty($riga)){
|
||||
$this->id_riga_bollo = null;
|
||||
|
||||
$riga->delete();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Creazione riga bollo se non presente
|
||||
if(empty($riga)){
|
||||
$riga = Components\Riga::build($this);
|
||||
$riga->save();
|
||||
|
||||
$this->id_riga_bollo = $riga->id;
|
||||
}
|
||||
|
||||
$riga->prezzo_unitario_vendita = $marca_da_bollo;
|
||||
$riga->qta = 1;
|
||||
$riga->descrizione = setting('Descrizione addebito bollo');
|
||||
$riga->id_iva = setting('Iva da applicare su marca da bollo');
|
||||
$riga->idconto = setting('Conto predefinito per la marca da bollo');
|
||||
|
||||
$riga->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Salva la fattura, impostando i campi dipendenti dai singoli parametri.
|
||||
*
|
||||
* @param array $options
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function save(array $options = [])
|
||||
{
|
||||
// Fix dei campi statici
|
||||
$this->calcolaMarcaDaBollo();
|
||||
|
||||
$this->attributes['ritenutaacconto'] = $this->ritenuta_acconto;
|
||||
$this->attributes['iva_rivalsainps'] = $this->iva_rivalsa_inps;
|
||||
$this->attributes['rivalsainps'] = $this->rivalsa_inps;
|
||||
$this->attributes['ritenutaacconto'] = $this->ritenuta_acconto;
|
||||
|
||||
return parent::save($options);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Restituisce l'elenco delle note di credito collegate.
|
||||
|
@ -61,11 +61,7 @@ switch (filter('op')) {
|
||||
$fattura_pa = FatturaElettronica::manage($filename);
|
||||
$id_record = $fattura_pa->save($info);
|
||||
|
||||
$idrivalsainps = 0;
|
||||
$idritenutaacconto = 0;
|
||||
$bollo = 0;
|
||||
|
||||
ricalcola_costiagg_fattura($id_record, $idrivalsainps, $idritenutaacconto, $bollo);
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
elimina_scadenza($id_record);
|
||||
elimina_movimento($id_record, 0);
|
||||
aggiungi_scadenza($id_record);
|
||||
|
@ -153,7 +153,7 @@ class Settings
|
||||
// Lista da query
|
||||
elseif (preg_match('/^query=(.+?)$/', $setting->tipo, $m)) {
|
||||
$result = '
|
||||
{[ "type": "select", "label": "'.$setting->nome.'", "name": "setting['.$setting->id.']", "values": "'.$setting->tipo.'", "value": "'.$setting->valore.'", "required": "'.intval($required).'", "help": "'.$setting->help.'" ]}';
|
||||
{[ "type": "select", "label": "'.$setting->nome.'", "name": "setting['.$setting->id.']", "values": "'.str_replace('"', '\"', $setting->tipo).'", "value": "'.$setting->valore.'", "required": "'.intval($required).'", "help": "'.$setting->help.'" ]}';
|
||||
}
|
||||
|
||||
// Boolean (checkbox)
|
||||
|
@ -241,3 +241,17 @@ INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`
|
||||
-- Supporto alla personalizzazione dell'API remota OSMCloud
|
||||
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES
|
||||
(NULL, 'OSMCloud Services API URL', 'https://services.osmcloud.it/api/', 'string', 0, 'Fatturazione Elettronica', 11);
|
||||
|
||||
-- Miglioramento gestione marca da bollo
|
||||
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES
|
||||
(NULL, 'Addebita marca da bollo al cliente', 1, 'boolean', 1, 'Fatturazione', 13),
|
||||
(NULL, 'Iva da applicare su marca da bollo', (SELECT id FROM `co_iva` WHERE `deleted_at` IS NULL AND `descrizione` = 'Escluso art. 15' ORDER BY descrizione ASC), 'query=SELECT id, id, IF(codice_natura_fe IS NULL, IF(codice IS NULL, descrizione, CONCAT(codice, " - ", descrizione)), CONCAT( IF(codice IS NULL, descrizione, CONCAT(codice, " - ", descrizione)), " (", codice_natura_fe, ")" )) AS descrizione FROM `co_iva` WHERE `deleted_at` IS NULL ORDER BY descrizione ASC', 1, 'Fatturazione', 14),
|
||||
(NULL, 'Descrizione addebito bollo', 'Marca da bollo', 'string', 1, 'Fatturazione', 15),
|
||||
(NULL, 'Conto predefinito per la marca da bollo', (SELECT id FROM `co_iva` WHERE `deleted_at` IS NULL AND `descrizione` = 'Escluso art. 15' ORDER BY descrizione ASC), 'query=SELECT id,descrizione FROM co_pianodeiconti3 WHERE idpianodeiconti2=(SELECT id FROM co_pianodeiconti2 WHERE descrizione=''Cassa e banche'')', 1, 'Fatturazione', 16);
|
||||
|
||||
ALTER TABLE `zz_settings` CHANGE `help` `help` varchar(255);
|
||||
UPDATE `zz_settings` SET `help` = NULL WHERE `help` = '';
|
||||
|
||||
ALTER TABLE `co_documenti` CHANGE `data_stato_fe` `data_stato_fe` TIMESTAMP NULL, ADD `addebita_bollo` BOOLEAN NOT NULL DEFAULT TRUE, ADD `id_riga_bollo` int(11), ADD FOREIGN KEY (`id_riga_bollo`) REFERENCES `co_righe_documenti`(`id`) ON DELETE SET NULL;
|
||||
UPDATE `co_documenti` SET `data_ricezione` = NULL WHERE `data_ricezione` = '0000-00-00';
|
||||
UPDATE `co_documenti` SET `data_stato_fe` = NULL WHERE `data_stato_fe` = '0000-00-00 00:00:00';
|
||||
|
Loading…
x
Reference in New Issue
Block a user