Aggiunto split payment

This commit is contained in:
Luca 2018-12-28 18:03:38 +01:00
parent e72d86412d
commit efd23c4783
8 changed files with 144 additions and 54 deletions

View File

@ -56,8 +56,12 @@ abstract class Row extends Description
}
public function getNettoAttribute()
{
return $this->totale - $this->ritenuta_acconto;
{
if ($this->split_payment)
return $this->totale - $this->ritenuta_acconto - $this->iva;
else
return $this->totale - $this->ritenuta_acconto;
}
public function getRivalsaINPSAttribute()
@ -82,6 +86,14 @@ abstract class Row extends Description
])['percentuale'];
return ($this->imponibile_scontato + $this->rivalsa_inps) * $percentuale / 100;
}
public function getSplitPaymentAttribute()
{
return database()->fetchOne('SELECT split_payment FROM co_documenti WHERE id = :id', [
':id' => $this->iddocumento,
])['split_payment'];
}
public function getIvaDetraibileAttribute()

View File

@ -143,7 +143,7 @@ abstract class Document extends Model
}
/**
* Calcola il netto a pagare della fattura.
* Calcola il guadagno della fattura.
*
* @return float
*/

View File

@ -80,6 +80,7 @@ switch (post('op')) {
'idvettore' => post('idvettore'),
'idsede' => post('idsede'),
'idconto' => post('idconto'),
'split_payment' => post('split_payment'),
'n_colli' => post('n_colli'),
'tipo_resa' => post('tipo_resa'),

View File

@ -106,7 +106,13 @@ if (empty($record['is_fiscale'])) {
</div>
<div class="col-md-3">
<?php
if ($dir == 'entrata') {
?>
{[ "type": "select", "label": "<?php echo tr('Stato FE'); ?>", "name": "codice_stato_fe", "required": 0, "values": "query=SELECT codice as id, descrizione as text FROM fe_stati_documento", "value": "$codice_stato_fe$", "disabled": <?php echo intval(Plugins\ExportFE\Connection::isEnabled()); ?>, "class": "unblockable" ]}
<?php
}
?>
</div>
</div>
@ -168,9 +174,37 @@ if (empty($record['is_fiscale'])) {
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Banca'); ?>", "name": "idbanca", "values": "query=SELECT id, CONCAT (nome, ' - ' , iban) AS descrizione FROM co_banche WHERE deleted_at IS NULL ORDER BY nome ASC", "value": "$idbanca$", "icon-after": "add|<?php echo Modules::get('Banche')['id']; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Banca'); ?>", "name": "idbanca", "values": "query=SELECT id, CONCAT (nome, ' - ' , iban) AS descrizione FROM co_banche WHERE deleted_at IS NULL ORDER BY nome ASC", "value": "$idbanca$", "icon-after": "add|<?php echo Modules::get('Banche')['id']; ?>||", "extra": " <?php echo ($record['stato']=='Bozza') ? '' : 'disabled'; ?> " ]}
</div>
<div class="col-md-3">
<label>&nbsp;</label><br>
<?php
if (!empty($record['is_fiscale'])) {
// Aggiunta prima nota solo se non c'è già, se non si è in bozza o se il pagamento non è completo
$n2 = $dbo->fetchNum('SELECT id FROM co_movimenti WHERE iddocumento='.prepare($id_record).' AND primanota=1');
$rs3 = $dbo->fetchArray('SELECT SUM(da_pagare-pagato) AS differenza, SUM(da_pagare) FROM co_scadenziario GROUP BY iddocumento HAVING iddocumento='.prepare($id_record));
$differenza = isset($rs3[0]) ? $rs3[0]['differenza'] : null;
$da_pagare = isset($rs3[0]) ? $rs3[0]['da_pagare'] : null;
if (($n2 <= 0 && $record['stato'] == 'Emessa') || $differenza != 0) {
?>
<a class="btn btn-primary btn-block <?php echo (!empty(Modules::get('Prima nota'))) ? '' : 'disabled'; ?>" href="javascript:;" onclick="launch_modal( 'Aggiungi prima nota', '<?php echo $rootdir; ?>/add.php?id_module=<?php echo Modules::get('Prima nota')['id']; ?>&iddocumento=<?php echo $id_record; ?>&dir=<?php echo $dir; ?>', 1 );"><i class="fa fa-euro"></i> <?php echo tr('Aggiungi prima nota'); ?>...</a><br><br>
<?php
}
if ($record['stato'] == 'Pagato') {
?>
<a class="btn btn-primary btn-block" href="javascript:;" onclick="if( confirm('Se riapri questa fattura verrà azzerato lo scadenzario e la prima nota. Continuare?') ){ $.post( '<?php echo $rootdir; ?>/editor.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>', { id_module: '<?php echo $id_module; ?>', id_record: '<?php echo $id_record; ?>', op: 'reopen' }, function(){ location.href='<?php echo $rootdir; ?>/editor.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>'; } ); }" title="Aggiungi prima nota"><i class="fa fa-folder-open"></i> <?php echo tr('Riapri fattura'); ?>...</a>
<?php
}
}
?>
</div>
</div>
<?php
@ -187,43 +221,19 @@ if ($dir == 'uscita') {
<?php
}
?>
<div class="pull-right">
<?php
if (!empty($record['is_fiscale'])) {
// Aggiunta prima nota solo se non c'è già, se non si è in bozza o se il pagamento non è completo
$n2 = $dbo->fetchNum('SELECT id FROM co_movimenti WHERE iddocumento='.prepare($id_record).' AND primanota=1');
$rs3 = $dbo->fetchArray('SELECT SUM(da_pagare-pagato) AS differenza, SUM(da_pagare) FROM co_scadenziario GROUP BY iddocumento HAVING iddocumento='.prepare($id_record));
$differenza = isset($rs3[0]) ? $rs3[0]['differenza'] : null;
$da_pagare = isset($rs3[0]) ? $rs3[0]['da_pagare'] : null;
if (($n2 <= 0 && $record['stato'] == 'Emessa') || $differenza != 0) {
?>
<a class="btn btn-primary <?php echo (!empty(Modules::get('Prima nota'))) ? '' : 'disabled'; ?>" href="javascript:;" onclick="launch_modal( 'Aggiungi prima nota', '<?php echo $rootdir; ?>/add.php?id_module=<?php echo Modules::get('Prima nota')['id']; ?>&iddocumento=<?php echo $id_record; ?>&dir=<?php echo $dir; ?>', 1 );"><i class="fa fa-euro"></i> <?php echo tr('Aggiungi prima nota'); ?>...</a><br><br>
<?php
}
if ($record['stato'] == 'Pagato') {
?>
<a class="btn btn-primary" href="javascript:;" onclick="if( confirm('Se riapri questa fattura verrà azzerato lo scadenzario e la prima nota. Continuare?') ){ $.post( '<?php echo $rootdir; ?>/editor.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>', { id_module: '<?php echo $id_module; ?>', id_record: '<?php echo $id_record; ?>', op: 'reopen' }, function(){ location.href='<?php echo $rootdir; ?>/editor.php?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>'; } ); }" title="Aggiungi prima nota"><i class="fa fa-folder-open"></i> <?php echo tr('Riapri fattura'); ?>...</a>
<?php
}
}
?>
</div>
<div class="clearfix"></div>
<div class="row">
<div class="col-md-3">
{[ "type": "number", "label": "<?php echo tr('Sconto incondizionato'); ?>", "name": "sconto_generico", "value": "$sconto_globale$", "help": "<?php echo tr('Sconto complessivo della fattura.'); ?>", "icon-after": "choice|untprc|$tipo_sconto_globale$"<?php
if ($record['stato'] == 'Emessa') {
echo ', "disabled" : 1';
}
?> ]}
{[ "type": "number", "label": "<?php echo tr('Sconto incondizionato'); ?>", "name": "sconto_generico", "value": "$sconto_globale$", "help": "<?php echo tr('Sconto complessivo della fattura.'); ?>", "icon-after": "choice|untprc|$tipo_sconto_globale$"<?php echo ($record['stato'] == 'Emessa') ? ', "disabled" : 1' : ''; ?> ]}
</div>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Split payment'); ?>", "name": "split_payment", "value": "$split_payment$", "help": "<?php echo tr('Abilita lo split payment per questo documento.'); ?>", "placeholder": "<?php echo tr('Split payment'); ?>", "extra" : "" ]}
</div>
</div>
<div class="row">

View File

@ -228,13 +228,14 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
$dbo = database();
// Totale marca da bollo, inps, ritenuta, idagente
$query = 'SELECT data, bollo, ritenutaacconto, rivalsainps FROM co_documenti WHERE id='.prepare($iddocumento);
$query = 'SELECT data, bollo, ritenutaacconto, rivalsainps, split_payment FROM co_documenti WHERE id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$totale_bolli = $rs[0]['bollo'];
$totale_ritenutaacconto = $rs[0]['ritenutaacconto'];
$totale_rivalsainps = $rs[0]['rivalsainps'];
$data_documento = $rs[0]['data'];
$split_payment = $rs[0]['split_payment'];
$netto_fattura = get_netto_fattura($iddocumento);
$totale_fattura = get_totale_fattura($iddocumento);
$imponibile_fattura = get_imponibile_fattura($iddocumento);
@ -333,7 +334,13 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
6) eventuale marca da bollo
*/
// 1) Aggiungo la riga del conto cliente
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($totale_fattura + $totale_bolli) * $segno_mov1_cliente).', '.prepare($primanota).' )';
$importo_cliente = $totale_fattura;
if( $split_payment ){
$importo_cliente = sum ($importo_cliente, -$iva_fattura, 2);
}
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', '.prepare($data).', '.prepare($data_documento).', '.prepare($iddocumento).", '', ".prepare($descrizione.' del '.date('d/m/Y', strtotime($data)).' ('.$ragione_sociale.')').', '.prepare($idconto_controparte).', '.prepare(($importo_cliente + $totale_bolli) * $segno_mov1_cliente).', '.prepare($primanota).' )';
$dbo->query($query2);
// 2) Aggiungo il totale sul conto dei ricavi/spese scelto
@ -350,7 +357,7 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
// 3) Aggiungo il totale sul conto dell'iva
// Lettura id conto iva
if ($iva_fattura != 0) {
if ($iva_fattura != 0 && !$split_payment) {
$descrizione_conto_iva = ($dir == 'entrata') ? 'Iva su vendite' : 'Iva su acquisti';
$query = 'SELECT id, descrizione FROM co_pianodeiconti3 WHERE descrizione='.prepare($descrizione_conto_iva);
$rs = $dbo->fetchArray($query);
@ -362,7 +369,7 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
}
// Lettura id conto iva indetraibile
if ($iva_indetraibile_fattura != 0) {
if ($iva_indetraibile_fattura != 0 && !$split_payment) {
$descrizione_conto_iva2 = 'Iva indetraibile';
$query = 'SELECT id, descrizione FROM co_pianodeiconti3 WHERE descrizione='.prepare($descrizione_conto_iva2);
$rs = $dbo->fetchArray($query);
@ -485,7 +492,7 @@ function get_netto_fattura($iddocumento)
{
$dbo = database();
$query = 'SELECT ritenutaacconto, bollo FROM co_documenti WHERE id='.prepare($iddocumento);
$query = 'SELECT ritenutaacconto, bollo, split_payment FROM co_documenti WHERE id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$netto_a_pagare = sum([
@ -493,6 +500,10 @@ function get_netto_fattura($iddocumento)
$rs[0]['bollo'],
-$rs[0]['ritenutaacconto'],
], null, 2);
if ($rs[0]['split_payment']){
$netto_a_pagare = sum($netto_a_pagare, - (get_ivadetraibile_fattura($iddocumento) + get_ivaindetraibile_fattura($iddocumento)), 2 );
}
return $netto_a_pagare;
}

View File

@ -322,8 +322,13 @@ if (!empty($fattura->rivalsa_inps)) {
if (!empty($iva)) {
echo '
<tr>
<td colspan="5" class="text-right">
<b>'.tr('Iva', [], ['upper' => true]).':</b>
<td colspan="5" class="text-right">';
if ($records[0]['split_payment'])
echo '<b>'.tr('Iva a carico del destinatario', [], ['upper' => true]).':</b>';
else
echo '<b>'.tr('Iva', [], ['upper' => true]).':</b>';
echo '
</td>
<td align="right">
'.Translator::numberToLocale($iva).' &euro;

View File

@ -160,7 +160,7 @@ echo "
// Aggiunta della marca da bollo al totale
$totale = sum($totale, $record['bollo']);
// Rivalsa INPS
// Rivalsa INPS (+ bollo)
if (!empty($record['rivalsainps'])) {
$rs2 = $dbo->fetchArray('SELECT percentuale FROM co_rivalsainps WHERE id=(SELECT idrivalsainps FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idrivalsainps!=0 LIMIT 0,1)');
@ -218,8 +218,8 @@ if (!empty($record['rivalsainps'])) {
</tr>';
}
// Ritenuta d'acconto
if ($record['ritenutaacconto'] != 0) {
// Ritenuta d'acconto ( + bollo, se no rivalsa inps)
if (!empty($record['ritenutaacconto']) or (!empty($record['spit_payment']))) {
$rs2 = $dbo->fetchArray('SELECT percentuale FROM co_ritenutaacconto WHERE id=(SELECT idritenutaacconto FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idritenutaacconto!=0 LIMIT 0,1)');
$first_colspan = 3;
@ -248,11 +248,22 @@ if ($record['ritenutaacconto'] != 0) {
</th>';
}
echo '
<th class="text-center small" colspan="'.$second_colspan.'">';
if (empty($record['split_payment'])) {
echo tr('Netto a pagare', [], ['upper' => true]);
}else{
echo tr('Totale', [], ['upper' => true]);
}
echo '
<th class="text-center small" colspan="'.$second_colspan.'">
'.tr('Netto a pagare', [], ['upper' => true]).'
</th>
</tr>
</th>';
echo'
</tr>
<tr>
<td class="cell-padded text-center" colspan="'.$first_colspan.'">
@ -275,7 +286,43 @@ if ($record['ritenutaacconto'] != 0) {
</tr>';
}
if (empty($record['ritenutaacconto']) && empty($record['rivalsainps']) && abs($record['bollo']) > 0) {
// Split payment
if (!empty($record['split_payment'])) {
$first_colspan = 1;
$second_colspan = 2;
echo '
<tr>
<th class="text-center small" colspan="'.$first_colspan.'">
'.tr('iva a carico del destinatario', [], ['upper' => true]).'
</th>
<th class="text-center small" colspan="'.$second_colspan.'">
'.tr('Netto a pagare', [], ['upper' => true]).'
</th>
</tr>';
echo '
<tr>
<td class="cell-padded text-center" colspan="'.$first_colspan.'">
'.Translator::numberToLocale($totale_iva).' &euro;
</td>
<td class="cell-padded text-center" colspan="'.$second_colspan.'">
'.Translator::numberToLocale($totale - $totale_iva -$record['ritenutaacconto']).' &euro;
</td>
</tr>';
}
// Solo bollo
if (empty($record['ritenutaacconto']) && empty($record['rivalsainps']) && empty($record['split_payment']) && abs($record['bollo']) > 0) {
$first_colspan = 3;
$second_colspan = 2;
if (empty($sconto)) {

View File

@ -21,4 +21,8 @@ INSERT INTO `fe_stati_documento`( `codice`, `descrizione`, `icon` ) VALUES
( 'NS', 'Scartata', 'fa fa-times text-danger' );
-- ssl_no_verify
ALTER TABLE `zz_smtps` ADD `ssl_no_verify` BOOLEAN NOT NULL DEFAULT FALSE AFTER `encryption`;
ALTER TABLE `zz_smtps` ADD `ssl_no_verify` BOOLEAN NOT NULL DEFAULT FALSE AFTER `encryption`;
-- Introduzione del flag split payment per documenti
ALTER TABLE `co_documenti` ADD `split_payment` BOOLEAN NOT NULL DEFAULT FALSE AFTER `bollo`;