Gestione ritenuta previdenziale per export FE

This commit is contained in:
MatteoPistorello 2022-09-13 11:18:53 +02:00
parent 29c89262f4
commit 7117e97770
6 changed files with 90 additions and 19 deletions

View File

@ -22,12 +22,14 @@ include_once __DIR__.'/../../core.php';
switch (filter('op')) {
case 'update':
$descrizione = filter('descrizione');
$tipologia = filter('tipologia');
$causale = filter('causale');
$percentuale = filter('percentuale');
$percentuale_imponibile = filter('percentuale_imponibile');
if (isset($descrizione) && isset($percentuale) && isset($percentuale_imponibile)) {
if ($dbo->fetchNum('SELECT * FROM `co_ritenuta_contributi` WHERE `descrizione`='.prepare($descrizione).' AND `id`!='.prepare($id_record)) == 0) {
$dbo->query('UPDATE `co_ritenuta_contributi` SET `descrizione`='.prepare($descrizione).', `percentuale`='.prepare($percentuale).', `percentuale_imponibile`='.prepare($percentuale_imponibile).' WHERE `id`='.prepare($id_record));
$dbo->query('UPDATE `co_ritenuta_contributi` SET `descrizione`='.prepare($descrizione).', `tipologia`='.prepare($tipologia).', `causale`='.prepare($causale).', `percentuale`='.prepare($percentuale).', `percentuale_imponibile`='.prepare($percentuale_imponibile).' WHERE `id`='.prepare($id_record));
flash()->info(tr('Salvataggio completato!'));
} else {
flash()->error(tr("E' già presente una tipologia di _TYPE_ con la stessa descrizione!", [
@ -42,12 +44,14 @@ switch (filter('op')) {
case 'add':
$descrizione = filter('descrizione');
$tipologia = filter('tipologia');
$causale = filter('causale');
$percentuale = filter('percentuale');
$percentuale_imponibile = filter('percentuale_imponibile');
if (isset($descrizione) && isset($percentuale) && isset($percentuale_imponibile)) {
if ($dbo->fetchNum('SELECT * FROM `co_ritenuta_contributi` WHERE `descrizione`='.prepare($descrizione)) == 0) {
$dbo->query('INSERT INTO `co_ritenuta_contributi` (`descrizione`, `percentuale`, `percentuale_imponibile`) VALUES ('.prepare($descrizione).', '.prepare($percentuale).', '.prepare($percentuale_imponibile).')');
$dbo->query('INSERT INTO `co_ritenuta_contributi` (`descrizione`, `tipologia`, `causale`, `percentuale`, `percentuale_imponibile`) VALUES ('.prepare($descrizione).', '.prepare($tipologia).', '.prepare($causale).', '.prepare($percentuale).', '.prepare($percentuale_imponibile).')');
$id_record = $dbo->lastInsertedID();
flash()->info(tr('Aggiunta nuova tipologia di _TYPE_', [

View File

@ -29,6 +29,16 @@ include_once __DIR__.'/../../core.php';
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Causale ritenuta'); ?>", "name": "causale", "values": "query=SELECT codice AS id, CONCAT_WS(' - ', codice, descrizione) AS descrizione FROM fe_causali_pagamento_ritenuta", "required": "1" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Tipo ritenuta'); ?>", "name": "tipologia", "values": "query=SELECT codice AS id, CONCAT_WS(' - ', codice, descrizione) AS descrizione FROM fe_tipi_ritenuta", "required": "1" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "number", "label": "<?php echo tr('Percentuale'); ?>", "name": "percentuale", "min-value": "1", "max-value": "100","icon-after": "<i class=\"fa fa-percent\"></i>", "value": "100" ]}

View File

@ -46,6 +46,16 @@ if ($record['doc_associati'] > 0) {
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Causale ritenuta'); ?>", "name": "causale", "values": "query=SELECT codice AS id, CONCAT_WS(' - ', codice, descrizione) AS descrizione FROM fe_causali_pagamento_ritenuta", "value": "$causale$", "required": "1" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Tipo ritenuta'); ?>", "name": "tipologia", "values": "query=SELECT codice AS id, CONCAT_WS(' - ', codice, descrizione) AS descrizione FROM fe_tipi_ritenuta", "value": "$tipologia$", "required": "1" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "number", "label": "<?php echo tr('Percentuale'); ?>", "name": "percentuale", "min-value": "1", "max-value": "100", "value": "$percentuale$", "icon-after": "<i class=\"fa fa-percent\"></i>" ]}

View File

@ -887,8 +887,12 @@ class FatturaElettronica
$righe = $fattura->getRighe();
// Ritenuta d'Acconto
$id_ritenuta = null;
$totale_ritenutaacconto = 0;
$id_ritenuta_acconto = null;
$totale_ritenuta_acconto = 0;
// Ritenuta Contributi
$id_ritenuta_contributi = $documento->id_ritenuta_contributi;
$totale_ritenuta_contributi = $documento->totale_ritenuta_contributi;
// Rivalsa
$id_rivalsainps = null;
@ -896,8 +900,8 @@ class FatturaElettronica
foreach ($righe as $riga) {
if (!empty($riga['idritenutaacconto']) and empty($riga['is_descrizione'])) {
$id_ritenuta = $riga['idritenutaacconto'];
$totale_ritenutaacconto += $riga['ritenutaacconto'];
$id_ritenuta_acconto = $riga['idritenutaacconto'];
$totale_ritenuta_acconto += $riga['ritenutaacconto'];
}
if (!empty($riga['idrivalsainps']) and empty($riga['is_descrizione'])) {
@ -907,17 +911,28 @@ class FatturaElettronica
}
}
if (!empty($id_ritenuta)) {
$percentuale = database()->fetchOne('SELECT percentuale FROM co_ritenutaacconto WHERE id = '.prepare($id_ritenuta))['percentuale'];
if (!empty($id_ritenuta_acconto)) {
$percentuale = database()->fetchOne('SELECT percentuale FROM co_ritenutaacconto WHERE id = '.prepare($id_ritenuta_acconto))['percentuale'];
// Con la nuova versione in vigore dal 01/01/2021, questo nodo diventa ripetibile.
$result['DatiRitenuta'] = [
$result[]['DatiRitenuta'] = [
'TipoRitenuta' => ($azienda['piva'] != $azienda['codice_fiscale'] & $azienda['tipo'] != 'Ente pubblico') ? 'RT01' : 'RT02',
'ImportoRitenuta' => $totale_ritenutaacconto,
'ImportoRitenuta' => $totale_ritenuta_acconto,
'AliquotaRitenuta' => $percentuale,
'CausalePagamento' => setting("Causale ritenuta d'acconto"),
];
}
if (!empty($id_ritenuta_contributi)) {
$ritenuta_contributi = database()->fetchOne('SELECT * FROM co_ritenuta_contributi WHERE id = '.prepare($id_ritenuta_contributi));
// Con la nuova versione in vigore dal 01/01/2021, questo nodo diventa ripetibile.
$result[]['DatiRitenuta'] = [
'TipoRitenuta' => $ritenuta_contributi['tipologia'],
'ImportoRitenuta' => $totale_ritenuta_contributi,
'AliquotaRitenuta' => $ritenuta_contributi['percentuale'],
'CausalePagamento' => $ritenuta_contributi['causale'],
];
}
// Bollo (2.1.1.6)
// ImportoBollo --> con la nuova versione in vigore dal 01/01/2021, la compilazione di questo nodo è diventata facoltativa.
// considerato che l'importo è noto e può essere solo di 2,00 Euro.

View File

@ -38,7 +38,7 @@ $peso_lordo = $documento->peso ?: $documento->peso_calcolato;
$width = round(100 / ($show_sconto ? 5 : 3), 2);
$has_rivalsa = !empty($record['rivalsainps']);
$has_ritenuta = !empty($record['ritenutaacconto']) || !empty($documento->totale_ritenuta_contributi) || !empty($record['spit_payment']);
$has_ritenuta = !empty($record['ritenutaacconto']) || !empty($documento->totale_ritenuta_contributi) || !empty($record['split_payment']);
$has_split_payment = !empty($record['split_payment']);
$has_sconto_finale = !empty($sconto_finale);
@ -267,22 +267,41 @@ if ($has_ritenuta) {
--$second_colspan;
}
$contributi = (!empty($record['ritenutaacconto']) ? ' - ' : '').tr('contributi: _PRC_%', [
$contributi = tr('_DESCRIZIONE_: _PRC_%', [
'_DESCRIZIONE_' => $documento->ritenutaContributi->descrizione,
'_PRC_' => Translator::numberToLocale($documento->ritenutaContributi->percentuale, 2),
]);
$ritenuta_contributi_totale = abs($documento->totale_ritenuta_contributi);
$acconto = tr('acconto: _PRC_%', [
'_PRC_' => Translator::numberToLocale($rs2[0]['percentuale'], 2),
]);
$ritenuta_totale = abs($documento->ritenuta_acconto) + abs($documento->totale_ritenuta_contributi);
$ritenuta_acconto_totale = abs($documento->ritenuta_acconto);
if (!empty($ritenuta_acconto_totale) && !empty($ritenuta_contributi_totale)) {
--$first_colspan;
}
echo '
<tr>
<tr>';
if (!empty($ritenuta_acconto_totale)) {
echo '
<th class="text-center small" colspan="'.$first_colspan.'">
'.tr('Ritenuta (_ACCONTO__CONTRIBUTI_)', [
'.tr('Ritenuta _ACCONTO_', [
'_ACCONTO_' => $acconto,
], ['upper' => true]).'
</th>';
}
if (!empty($ritenuta_contributi_totale)) {
echo '
<th class="text-center small" colspan="'.$first_colspan.'">
'.tr('_CONTRIBUTI_', [
'_ACCONTO_' => $acconto,
'_CONTRIBUTI_' => empty($documento->ritenutaContributi) ? null : $contributi,
], ['upper' => true]).'
</th>';
}
echo '
<th class="text-center small" colspan="'.$second_colspan.'">
@ -292,12 +311,22 @@ if ($has_ritenuta) {
echo '
</tr>
<tr>
<tr>';
if (!empty($ritenuta_acconto_totale)) {
echo '
<td class="cell-padded text-center" colspan="'.$first_colspan.'">
'.moneyFormat($ritenuta_totale, 2).'
'.moneyFormat($ritenuta_acconto_totale, 2).'
</td>';
}
$totale = $totale - $ritenuta_totale;
if (!empty($ritenuta_contributi_totale)) {
echo '
<td class="cell-padded text-center" colspan="'.$first_colspan.'">
'.moneyFormat($ritenuta_contributi_totale, 2).'
</td>';
}
$totale = $totale - ($ritenuta_acconto_totale + $ritenuta_contributi_totale);
echo '
<td class="cell-padded text-center" colspan="'.$second_colspan.'">

View File

@ -18,4 +18,7 @@ INSERT INTO `co_tipi_scadenze` (`id`, `nome`, `descrizione`, `ctgypurp`, `can_de
UPDATE `zz_views` SET `query` = 'an_anagrafiche.ragione_sociale' WHERE `zz_views`.`name` = 'Anagrafica' AND `id_module`=(SELECT `id` FROM `zz_modules` WHERE `name`='Scadenzario');
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_scadenziario`\nLEFT JOIN `co_documenti` ON `co_scadenziario`.`iddocumento` = `co_documenti`.`id`\nLEFT JOIN `an_anagrafiche` ON `co_scadenziario`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\nLEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`\nLEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`\nLEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`\nLEFT JOIN (\n SELECT `zz_operations`.`id_email`, `zz_operations`.`id_record`\n FROM `zz_operations`\n INNER JOIN `em_emails` ON `zz_operations`.`id_email` = `em_emails`.`id`\n INNER JOIN `em_templates` ON `em_emails`.`id_template` = `em_templates`.`id`\n INNER JOIN `zz_modules` ON `zz_operations`.`id_module` = `zz_modules`.`id`\n WHERE `zz_modules`.`name` = \'Scadenzario\' AND `zz_operations`.`op` = \'send-email\'\n GROUP BY `zz_operations`.`id_record`\n ) AS `email` ON `email`.`id_record` = `co_scadenziario`.`id`\nWHERE 1=1 AND\n(`co_statidocumento`.`descrizione` IS NULL OR `co_statidocumento`.`descrizione` IN(\'Emessa\',\'Parzialmente pagato\',\'Pagato\'))\nHAVING 2=2\nORDER BY `scadenza` ASC' WHERE `zz_modules`.`name` = 'Scadenzario';
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_scadenziario`\nLEFT JOIN `co_documenti` ON `co_scadenziario`.`iddocumento` = `co_documenti`.`id`\nLEFT JOIN `an_anagrafiche` ON `co_scadenziario`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\nLEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`\nLEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`\nLEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`\nLEFT JOIN (\n SELECT `zz_operations`.`id_email`, `zz_operations`.`id_record`\n FROM `zz_operations`\n INNER JOIN `em_emails` ON `zz_operations`.`id_email` = `em_emails`.`id`\n INNER JOIN `em_templates` ON `em_emails`.`id_template` = `em_templates`.`id`\n INNER JOIN `zz_modules` ON `zz_operations`.`id_module` = `zz_modules`.`id`\n WHERE `zz_modules`.`name` = \'Scadenzario\' AND `zz_operations`.`op` = \'send-email\'\n GROUP BY `zz_operations`.`id_record`\n ) AS `email` ON `email`.`id_record` = `co_scadenziario`.`id`\nWHERE 1=1 AND\n(`co_statidocumento`.`descrizione` IS NULL OR `co_statidocumento`.`descrizione` IN(\'Emessa\',\'Parzialmente pagato\',\'Pagato\'))\nHAVING 2=2\nORDER BY `scadenza` ASC' WHERE `zz_modules`.`name` = 'Scadenzario';
-- Aggiunta causale e tipologia in ritenute contributi
ALTER TABLE `co_ritenuta_contributi` ADD `id_tipo` VARCHAR(100) NOT NULL AFTER `descrizione`, ADD `causale` VARCHAR(100) NOT NULL AFTER `tipologia`;