This commit is contained in:
MatteoPistorello 2023-11-27 15:49:06 +01:00
commit 2bed6d7da2
13 changed files with 243 additions and 138 deletions

View File

@ -63,4 +63,4 @@ echo '
return false;
}
</script>';
</script>';

View File

@ -370,11 +370,51 @@ $query .= ' ORDER BY descrizione';
<?php if ($record['id_banca_azienda'] != 0) {
echo Modules::link('Banche', $record['id_banca_azienda'], null, null, 'class="pull-right"');
}
?>
{[ "type": "select", "label": "<?php echo tr('Banca azienda'); ?>", "name": "id_banca_azienda", "ajax-source": "banche", "select-options": <?php echo json_encode(['id_anagrafica' => $anagrafica_azienda->id]); ?>, "value": "$id_banca_azienda$", "icon-after": "add|<?php echo Modules::get('Banche')['id']; ?>|id_anagrafica=<?php echo $anagrafica_azienda->id; ?>", "extra": " <?php echo (intval($block_edit)) ? 'disabled' : ''; ?> " ]}
</div>
<?php
if ($dir == 'entrata') {
echo '
{[ "type": "select", "label": "'.tr('Banca accredito').'", "name": "id_banca_azienda", "ajax-source": "banche", "select-options": '.json_encode(['id_anagrafica' => $anagrafica_azienda->id]).', "value": "$id_banca_azienda$", "icon-after": "add|'.Modules::get('Banche')['id'].'|id_anagrafica='.$anagrafica_azienda->id.'", "extra": "'.(intval($block_edit) ? 'disabled' : '').'" ]}
</div>
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Banca addebito').'", "name": "id_banca_controparte", "ajax-source": "banche", "select-options": '.json_encode(['id_anagrafica' => $record['idanagrafica']]).', "value": "$id_banca_controparte$", "icon-after": "add|'.Modules::get('Banche')['id'].'|idanagrafica='.$record['idanagrafica'].'", "extra": "'.(intval($block_edit) ? 'disabled' : '').'" ]}';
} else {
echo '
{[ "type": "select", "label": "'.tr('Banca accredito').'", "name": "id_banca_controparte", "ajax-source": "banche", "select-options": '.json_encode(['id_anagrafica' => $record['idanagrafica']]).', "value": "$id_banca_controparte$", "icon-after": "add|'.Modules::get('Banche')['id'].'|idanagrafica='.$record['idanagrafica'].'", "extra": "'.(intval($block_edit) ? 'disabled' : '').'" ]}
</div>
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Banca addebito').'", "name": "id_banca_azienda", "ajax-source": "banche", "select-options": '.json_encode(['id_anagrafica' => $anagrafica_azienda->id]).', "value": "$id_banca_azienda$", "icon-after": "add|'.Modules::get('Banche')['id'].'|id_anagrafica='.$anagrafica_azienda->id.'", "extra": "'.(intval($block_edit) ? 'disabled' : '').'" ]}';
}
?>
</div>
</div>
<!-- Split payment + Fattura per conto terzi (solo uscita) + Sconto in fattura (solo uscita) -->
<div class="row">
<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. Le aliquote iva con natura N6.X (reverse charge) non saranno disponibili.'); ?>", "placeholder": "<?php echo tr('Split payment'); ?>" ]}
</div>
<?php
// TODO: Fattura per conto del fornitore (es. cooperative agricole che emettono la fattura per conto dei propri soci produttori agricoli conferenti)
if ($dir == 'entrata') {
?>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Fattura per conto terzi'); ?>", "name": "is_fattura_conto_terzi", "value": "$is_fattura_conto_terzi$", "help": "<?php echo tr('Nell\'XML della Fattura Elettronica sarà indicato il fornitore ('.stripslashes($database->fetchOne('SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica = '.prepare(setting('Azienda predefinita')))['ragione_sociale']).') come cessionario e il cliente come cedente/prestatore.'); ?>", "placeholder": "<?php echo tr('Fattura per conto terzi'); ?>" ]}
</div>
<?php
echo '<div class="col-md-3">
{[ "type": "number", "label": "'.tr('Sconto in fattura').'", "name": "sconto_finale", "value": "'.($fattura->sconto_finale_percentuale ?: $fattura->sconto_finale).'", "icon-after": "choice|untprc|'.(empty($fattura->sconto_finale) ? 'PRC' : 'UNT').'", "help": "'.tr('Sconto in fattura, utilizzabile per applicare sconti sul Netto a pagare del documento e le relative scadenze').'. '.tr('Per utilizzarlo in relazione a una riga della Fattura Elettronica, inserire il tipo di dato in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'TipoDato\'\' e il testo di descrizione in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'RiferimentoTesto\'\' della specifica riga').'. '.tr('Nota: lo sconto in fattura non influenza i movimenti contabili').'." ]}
</div>';
} else {
echo '
<div class="col-md-3">
</div>
<div class="col-md-3">
</div>';
}
if ($record['stato'] != 'Bozza' && $record['stato'] != 'Annullata') {
$scadenze = $fattura->scadenze;
@ -431,29 +471,6 @@ $query .= ' ORDER BY descrizione';
</div>';
}
?>
</div>
<!-- Split payment + Fattura per conto terzi (solo uscita) + Sconto in fattura (solo uscita) -->
<div class="row">
<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. Le aliquote iva con natura N6.X (reverse charge) non saranno disponibili.'); ?>", "placeholder": "<?php echo tr('Split payment'); ?>" ]}
</div>
<?php
// TODO: Fattura per conto del fornitore (es. cooperative agricole che emettono la fattura per conto dei propri soci produttori agricoli conferenti)
if ($dir == 'entrata') {
?>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Fattura per conto terzi'); ?>", "name": "is_fattura_conto_terzi", "value": "$is_fattura_conto_terzi$", "help": "<?php echo tr('Nell\'XML della Fattura Elettronica sarà indicato il fornitore ('.stripslashes($database->fetchOne('SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica = '.prepare(setting('Azienda predefinita')))['ragione_sociale']).') come cessionario e il cliente come cedente/prestatore.'); ?>", "placeholder": "<?php echo tr('Fattura per conto terzi'); ?>" ]}
</div>
<?php
echo '<div class="col-md-3">
{[ "type": "number", "label": "'.tr('Sconto in fattura').'", "name": "sconto_finale", "value": "'.($fattura->sconto_finale_percentuale ?: $fattura->sconto_finale).'", "icon-after": "choice|untprc|'.(empty($fattura->sconto_finale) ? 'PRC' : 'UNT').'", "help": "'.tr('Sconto in fattura, utilizzabile per applicare sconti sul Netto a pagare del documento e le relative scadenze').'. '.tr('Per utilizzarlo in relazione a una riga della Fattura Elettronica, inserire il tipo di dato in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'TipoDato\'\' e il testo di descrizione in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'RiferimentoTesto\'\' della specifica riga').'. '.tr('Nota: lo sconto in fattura non influenza i movimenti contabili').'." ]}
</div>';
}
?>
</div>
<div class="row">

View File

@ -97,13 +97,13 @@ class Scadenze
* @param bool $is_pagato
* @param string $type
*/
protected function registraScadenza(Fattura $fattura, $importo, $data_scadenza, $is_pagato, $type = 'fattura')
protected function registraScadenza(Fattura $fattura, $importo, $data_scadenza, $is_pagato, $id_pagamento, $id_banca_azienda, $id_banca_controparte, $type = 'fattura')
{
$numero = $fattura->numero_esterno ?: $fattura->numero;
$descrizione = $fattura->tipo->descrizione.' numero '.$numero;
$idanagrafica = $fattura->idanagrafica;
$scadenza = Scadenza::build($idanagrafica, $descrizione, $importo, $data_scadenza, $type, $is_pagato);
$scadenza = Scadenza::build($idanagrafica, $descrizione, $importo, $data_scadenza, $id_pagamento, $id_banca_azienda, $id_banca_controparte, $type, $is_pagato);
$scadenza->documento()->associate($fattura);
$scadenza->data_emissione = $fattura->data;
@ -164,8 +164,11 @@ class Scadenze
foreach ($rate as $rata) {
$scadenza = $rata['scadenza'];
$importo = $direzione == 'uscita' ? -$rata['importo'] : $rata['importo'];
$id_pagamento = $this->fattura->idpagamento;
$id_banca_azienda = $this->fattura->id_banca_azienda;
$id_banca_controparte = $this->fattura->id_banca_controparte;
self::registraScadenza($this->fattura, $importo, $scadenza, $is_pagato);
self::registraScadenza($this->fattura, $importo, $scadenza, $is_pagato, $id_pagamento, $id_banca_azienda, $id_banca_controparte);
}
}
}

View File

@ -192,8 +192,24 @@ class Mastrino extends Model
$is_nota = false;
$documento = $documento ?: $scadenza->documento;
if ($scadenza && empty($documento)) {
$scadenze = [$scadenza];
$dir = $movimento->totale < 0 ? 'uscita' : 'entrata';
$totale_da_distribuire = Movimento::where('id_scadenza', '=', $scadenza->id)
->where('totale', '>', 0)
->sum('totale');
} elseif ($scadenza) {
$scadenze = [$scadenza];
$dir = $documento->direzione;
$totale_da_distribuire = Movimento::where('id_scadenza', '=', $scadenza->id)
->where('totale', '>', 0)
->sum('totale');
}
// Gestione delle scadenze di un documento
if ($documento) {
elseif ($documento) {
$dir = $documento->direzione;
$scadenze = $documento->scadenze->sortBy('scadenza');
@ -213,20 +229,11 @@ class Mastrino extends Model
$is_nota = $documento->isNota();
}
// Gestione di una singola scadenza
else {
$scadenze = [$scadenza];
$dir = $movimento->totale < 0 ? 'uscita' : 'entrata';
$totale_da_distribuire = Movimento::where('id_scadenza', '=', $scadenza->id)
->where('totale', '>', 0)
->sum('totale');
}
$totale_da_distribuire = abs($totale_da_distribuire);
// Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato
// Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive
foreach ($scadenze as $scadenza) {
$scadenza_da_pagare = abs($scadenza['da_pagare']);
@ -248,7 +255,7 @@ class Mastrino extends Model
}
// Inversione di segno per la direzione del movimento contabile
$pagato = $dir == 'uscita' ? -$pagato : $pagato;
$pagato = ($dir == 'uscita' ? -$pagato : $pagato);
$pagato = $is_nota ? -$pagato : $pagato; // Inversione di segno per le note
// Salvataggio delle informazioni

View File

@ -40,16 +40,17 @@ switch (post('op')) {
$tipo = post('tipo');
$descrizione = post('descrizione');
$iddocumento = post('iddocumento') ?: 0;
$scadenze = Scadenza::where('iddocumento', $iddocumento)->get();
$totale_pagato = 0;
$id_scadenza_non_completa = null;
foreach (post('da_pagare') as $id => $da_pagare) {
foreach ($scadenze as $id => $scadenza) {
$pagato = post('pagato')[$id];
$scadenza = post('scadenza')[$id];
$data_concordata = post('data_concordata')[$id];
$pagato = floatval($pagato);
$da_pagare = floatval($da_pagare);
$da_pagare = post('da_pagare')[$id];
if (!empty($iddocumento)) {
$id_tipo = $dbo->selectOne('co_documenti', 'idtipodocumento', ['id' => $iddocumento])['idtipodocumento'];
@ -78,6 +79,9 @@ switch (post('op')) {
}
$totale_pagato = sum($totale_pagato, $pagato);
$id_pagamento = post('id_pagamento')[$id];
$id_banca_azienda = post('id_banca_azienda')[$id];
$id_banca_controparte = post('id_banca_controparte')[$id];
$id_scadenza = post('id_scadenza')[$id];
if (!empty($id_scadenza)) {
@ -88,6 +92,9 @@ switch (post('op')) {
'pagato' => $pagato,
'scadenza' => $scadenza,
'data_concordata' => $data_concordata,
'id_pagamento' => $id_pagamento,
'id_banca_azienda' => $id_banca_azienda,
'id_banca_controparte' => $id_banca_controparte,
'note' => post('note'),
'distinta' => post('distinta') ?: null,
], ['id' => $id_scadenza]);

View File

@ -27,26 +27,32 @@ include_once __DIR__.'/../../core.php';
<input type="hidden" name="dir" value="<?php echo $dir; ?>">
<div class="row">
<div class="col-md-4">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Anagrafica'); ?>", "name": "idanagrafica", "required": 1, "ajax-source": "anagrafiche" ]}
</div>
<div class="col-md-4">
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Tipo'); ?>", "name": "tipo", "required": 1, "ajax-source": "tipi_scadenze", "icon-after": "add|<?php echo Modules::get('Tipi scadenze')['id']; ?>" ]}
</div>
<div class="col-md-2">
</div>
<div class="row">
<div class="col-md-6">
{[ "type": "date", "label": "<?php echo tr('Data scadenza'); ?>", "name": "data", "required": 1, "value": "-now-" ]}
</div>
<div class="col-md-2">
<div class="col-md-6">
{[ "type": "number", "label": "<?php echo tr('Importo'); ?>", "name": "da_pagare", "required": 1, "value": "", "help": "Le scadenze inserite con importo positivo indicano un credito da un cliente, le scadenze inserite con importo negativo indicano un debito verso un fornitore" ]}
</div>
</div>
<div class='row'>
<div class='col-md-12'>
{[ "type": "textarea", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": "" ]}
<?php echo input([
'type' => 'ckeditor',
'label' => tr('Descrizione'),
'name' => 'descrizione',
'required' => 1,
'value' => '',
]); ?>
</div>
</div>

View File

@ -37,8 +37,6 @@ echo '
<div class="panel-heading">
<h3 class="panel-title">
'.tr('Dettagli scadenza').'
<button type="button" class="btn btn-xs btn-info pull-right tip" id="add-scadenza" '.(empty($documento) ? 'disabled' : '').' title="'.tr('È possibile aggiungere scadenze solo se è presente il collegamento a un documento, in caso contrario è consigliato creare più scadenze con la stessa descrizione').'">
<i class="fa fa-plus"></i> '.tr('Aggiungi scadenza').'
</button>
</h3>
</div>
@ -66,7 +64,9 @@ if (!empty($documento)) {
<th>'.tr('Numero').':</th>
<td>'.$numero.'</td>
</tr>
</table>
<table class="table table-striped table-hover table-condensed table-bordered">
<tr>
<th>'.tr('Data').':</th>
<td>'.Translator::dateToLocale($documento->data).'</td>
@ -75,31 +75,52 @@ if (!empty($documento)) {
<tr>
<th>'.tr('Netto a pagare').':</th>
<td>'.moneyFormat($documento->netto).'</td>
</tr>';
} else {
$scadenza = $dbo->fetchOne('SELECT * FROM co_scadenziario WHERE id = '.prepare($id_record));
echo '
<tr>
<th>'.tr('Descrizione').':</th>
<td>
{[ "type": "textarea", "name": "descrizione", "value": "'.$record['descrizione'].'" ]}
</td>
</tr>';
}
echo '
<tr>
<th>'.tr('Note').':</th>
<td>
{[ "type": "textarea", "name": "note", "value": "'.$record['note'].'" ]}
</td>
</tr>
<tr>
<th>'.tr('Info distinta').' <span class="tip" title="'.tr('Informazioni/Note sulla distinta associata alla scadenza (es. numero)').'" ><i class="fa fa-question-circle-o" ></i></span>:</th>
<td>
{[ "type": "text", "name": "distinta", "value": "'.$record['distinta'].'" ]}
</td>
</tr>
</table>
'.Modules::link($documento->module, $record['iddocumento'], '<i class="fa fa-folder-open"></i> '.tr('Apri documento'), null, 'class="btn btn-primary"').'
</div>';
} else {
$scadenza = $dbo->fetchOne('SELECT * FROM co_scadenziario WHERE id = '.prepare($id_record));
echo '
<table class="table table-striped table-hover table-condensed table-bordered">
<tr>
<td>';
echo input([
'type' => 'ckeditor',
'label' => tr('descrizione'),
'name' => 'descrizione',
'required' => 1,
'extra' => 'rows="2"',
'value' => $record['descrizione'],
]);
echo '
</td>
</tr>
</table>
</div>';
}
echo '
<div class="col-md-6">
<table class="table table-striped table-hover table-condensed table-bordered">
<tr>
<td>';
echo input([
'type' => 'ckeditor',
'label' => tr('Note'),
'name' => 'note',
'extra' => 'rows="2"',
'value' => $record['note'],
]);
echo '
</td>
</tr>';
if (!empty($record['presentazioni_exported_at'])) {
@ -112,21 +133,35 @@ echo '
echo '
</table>';
if (!empty($documento)) {
echo Modules::link($documento->module, $record['iddocumento'], '<i class="fa fa-folder-open"></i> '.tr('Apri documento'), null, 'class="btn btn-primary"');
}
echo '
</div>
</div>
</div>
</div>
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">
'.tr('Rate scadenza').'
<button type="button" class="btn btn-xs btn-info pull-right tip" id="add-scadenza" '.(empty($documento) ? 'disabled' : '').' title="'.tr('È possibile aggiungere scadenze solo se è presente il collegamento a un documento, in caso contrario è consigliato creare più scadenze con la stessa descrizione').'">
<i class="fa fa-plus"></i> '.tr('Aggiungi scadenza').'
</button>
</h3>
</div>
<!-- Elenco scadenze -->
<div class="col-md-6">
<table class="table table-hover table-condensed table-bordered">
<div class="panel-body">
<div class="row">
<div class="col-md-12">
<table class="table table-hover table-condensed table-bordered text-center">
<thead>
<tr>
<th width="150">'.tr('Data').'</th>
<th width="150">'.tr('Importo').'</th>
<th width="150">'.tr('Pagato').'</th>
<th width="150">'.tr('Data concordata').'</th>
<th style="width:20%;">'.tr('Banca accredito').'</th>
<th style="width:20%;">'.tr('Banca addebito').'</th>
<th style="width:20%;">'.tr('Tipologia').'</th>
<th style="width:10%;">'.tr('Data').'</th>
<th style="width:10%;">'.tr('Data concordata').'</th>
<th style="width:10%;">'.tr('Importo').'</th>
<th style="width:10%;">'.tr('Pagato').'</th>
<th style="width:3%;">'.tr('Rata').'</th>
</tr>
</thead>
@ -144,65 +179,81 @@ foreach ($scadenze as $i => $scadenza) {
}
echo '
<tr class="'.$class.'">
<input type="hidden" name="id_scadenza['.$i.']" value="'.$scadenza['id'].'">
<tr class="'.$class.'">
<input type="hidden" name="id_scadenza['.$i.']" value="'.$scadenza['id'].'">
<td align="center">
'.($scadenza['da_pagare'] > 0 ?
'{[ "type": "select", "name": "id_banca_azienda['.$i.']", "ajax-source": "banche", "select-options": '.json_encode(['id_anagrafica' => $anagrafica_azienda->id]).', "value": "'.$scadenza['id_banca_azienda'].'", "icon-after": "add|'.Modules::get('Banche')['id'].'|id_anagrafica='.$anagrafica_azienda->id.'" ]}'
:
'{[ "type": "select", "name": "id_banca_controparte['.$i.']", "ajax-source": "banche", "select-options":'.json_encode(['id_anagrafica' => $scadenza['idanagrafica']]).', "value": "'.$scadenza['id_banca_controparte'].'", "icon-after": "add|'.Modules::get('Banche')['id'].'|idanagrafica='.$record['idanagrafica'].'"]}
').'
</td>
<td align="center">
{[ "type": "date", "name": "scadenza['.$i.']", "value": "'.$scadenza['scadenza'].'" ]}
</td>
<td align="center">
'.($scadenza['da_pagare'] > 0 ?
'{[ "type": "select", "name": "id_banca_controparte['.$i.']", "ajax-source": "banche", "select-options":'.json_encode(['id_anagrafica' => $scadenza['idanagrafica']]).', "value": "'.$scadenza['id_banca_controparte'].'", "icon-after": "add|'.Modules::get('Banche')['id'].'|idanagrafica='.$record['idanagrafica'].'"]}'
:
'{[ "type": "select", "name": "id_banca_azienda['.$i.']", "ajax-source": "banche", "select-options": '.json_encode(['id_anagrafica' => $anagrafica_azienda->id]).', "value": "'.$scadenza['id_banca_azienda'].'", "icon-after": "add|'.Modules::get('Banche')['id'].'|id_anagrafica='.$anagrafica_azienda->id.'" ]}'
).'
</td>
<td class="text-right">
{[ "type": "number", "name": "da_pagare['.$i.']", "decimals": 2, "value": "'.numberFormat($scadenza['da_pagare'], 2).'", "onchange": "controlloTotale()" ]}
</td>
<td>
{[ "type": "select", "name": "id_pagamento['.$i.']", "ajax-source": "pagamenti", "select-options": '.json_encode(['id_anagrafica' => $anagrafica_azienda->id]).', "value": "'.$scadenza['id_pagamento'].'" ]}
</td>
<td class="text-right">
{[ "type": "number", "name": "pagato['.$i.']", "decimals": 2, "value": "'.numberFormat($scadenza['pagato']).'" ]}
</td>
<td align="center">
{[ "type": "date", "name": "scadenza['.$i.']", "value": "'.$scadenza['scadenza'].'" ]}
</td>
<td align="center">
{[ "type": "date", "name": "data_concordata['.$i.']", "value": "'.$scadenza['data_concordata'].'" ]}
</td>
</tr>';
<td align="center">
{[ "type": "date", "name": "data_concordata['.$i.']", "value": "'.$scadenza['data_concordata'].'" ]}
</td>
<td class="text-right">
{[ "type": "number", "name": "da_pagare['.$i.']", "decimals": 2, "value": "'.numberFormat($scadenza['da_pagare'], 2).'", "onchange": "controlloTotale()" ]}
</td>
<td class="text-right">
{[ "type": "number", "name": "pagato['.$i.']", "decimals": 2, "value": "'.numberFormat($scadenza['pagato']).'" ]}
</td>
<td align="center">
<a onclick="launch_modal(\''.tr('Registra contabile pagamento').'\', \''.base_path().'/add.php?id_module='.Modules::get('Prima nota')['id'].'&id_scadenze='.$scadenza['id'].'\');" class="btn btn-sm btn-primary">
<i class="fa fa-euro"></i> '.($scadenza['da_pagare'] > 0 ? tr('Incassa') : tr('Paga')).'
</a>
</td>
</tr>';
}
echo '
echo '
</tbody>
<tfoot>
<tr>
<td class="text-right"></td>
<td class="text-right"><b>'.tr('Totale').'</b></td>
<td class="text-right" id="totale_utente">'.numberFormat($totale_da_pagare).'</td>
<td class="text-right"></td>
<td class="text-right"></td>
<td class="text-right"></td>
<td class="text-right"></td>
</tr>
</tfoot>
</table>';
if ($totale_da_pagare != 0) {
echo '
<div class="pull-right">
<a onclick="launch_modal(\''.tr('Registra contabile pagamento').'\', \''.base_path().'/add.php?id_module='.Modules::get('Prima nota')['id'].'&'.(!empty($record['iddocumento']) ? 'id_documenti='.$record['iddocumento'].'&single=1' : 'id_scadenze='.$id_record).'\');" class="btn btn-sm btn-primary">
<i class="fa fa-euro"></i> '.tr('Registra contabile pagamento...').'
</a>
</div>
<div class="clearfix"></div>
<br>';
}
</table>
</div>';
?>
<div class="alert alert-warning hide" id="totale"><?php echo tr('Il totale da pagare non corrisponde con il totale della fattura che è pari a _MONEY_', [
'_MONEY_' => '<b>'.moneyFormat($totale_da_pagare).'</b>',
]); ?>.<br><?php echo tr('Differenza di _TOT_ _CURRENCY_', [
'_TOT_' => '<span id="diff"></span>',
'_CURRENCY_' => currency(),
]); ?>.
</div>
<div class="alert alert-warning hide" id="totale"><?php echo tr('Il totale da pagare non corrisponde con il totale della fattura che è pari a _MONEY_', [
'_MONEY_' => '<b>'.moneyFormat($totale_da_pagare).'</b>',
]); ?>.<br><?php echo tr('Differenza di _TOT_ _CURRENCY_', [
'_TOT_' => '<span id="diff"></span>',
'_CURRENCY_' => currency(),
]); ?>.
</div>
<input type="hidden" id="totale_da_pagare" value="<?php echo round($totale_da_pagare, 2); ?>">
</div>
</div>
</div>
</div>
<input type="hidden" id="totale_da_pagare" value="<?php echo round($totale_da_pagare, 2); ?>">
</div>
</div>
</div>
</form>
{( "name": "filelist_and_upload", "id_module": "$id_module$", "id_record": "<?php echo $id_record; ?>" )}
@ -211,11 +262,11 @@ if ($totale_da_pagare != 0) {
<?php
if (empty($documento)) {
echo '
echo '
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> '.tr('Elimina').'
</a>';
}
}
echo '
<table class="hide">

View File

@ -35,7 +35,7 @@ class Scadenza extends Model
'data_pagamento',
];
public static function build($idanagrafica, $descrizione, $importo, $data_scadenza, $type = 'fattura', $is_pagato = false)
public static function build($idanagrafica, $descrizione, $importo, $data_scadenza, $id_pagamento, $id_banca_azienda, $id_banca_controparte, $type = 'fattura', $is_pagato = false)
{
$model = new static();
@ -44,6 +44,9 @@ class Scadenza extends Model
$model->scadenza = $data_scadenza;
$model->da_pagare = $importo;
$model->tipo = $type;
$model->id_pagamento = $id_pagamento;
$model->id_banca_azienda = $id_banca_azienda;
$model->id_banca_controparte = $id_banca_controparte;
$model->pagato = $is_pagato ? $importo : 0;
$model->data_pagamento = $is_pagato ? $data_scadenza : null;

View File

@ -23,6 +23,7 @@ use FluidXml\FluidXml;
use GuzzleHttp\Client;
use Modules;
use Modules\Anagrafiche\Anagrafica;
use Modules\Banche\Banca;
use Modules\Fatture\Fattura;
use Modules\Fatture\Gestori\Bollo;
use Modules\Iva\Aliquota;
@ -1631,7 +1632,6 @@ class FatturaElettronica
$documento = $fattura->getDocumento();
$fattura = Fattura::find($documento['id']);
$banca = $fattura->getBanca();
$database = database();
@ -1648,6 +1648,9 @@ class FatturaElettronica
$co_scadenziario = $database->fetchArray('SELECT * FROM `co_scadenziario` WHERE `iddocumento` = '.prepare($documento['id']));
foreach ($co_scadenziario as $scadenza) {
$co_pagamenti = $database->fetchOne('SELECT * FROM `co_pagamenti` WHERE `id` = '.prepare($scadenza['id_pagamento']));
$banca = Banca::find($scadenza['id_banca_azienda']);
$pagamento = [
'ModalitaPagamento' => $co_pagamenti['codice_modalita_pagamento_fe'],
'DataScadenzaPagamento' => $scadenza['scadenza'],

View File

@ -61,10 +61,10 @@ echo "
<tr>
<td style='width:10mm;'>&nbsp;</td>
<td style='width:45mm;'>
<td style='width:80mm;'>
<table class='border-bottom'>
<tr>
<td colspan='3'>
<td colspan='4'>
<p class='small-bold'>".tr('Scadenze pagamenti', [], ['upper' => true]).'</p>
</td>
</tr>';
@ -73,17 +73,21 @@ echo "
$rs2 = $dbo->fetchArray('SELECT * FROM co_scadenziario WHERE iddocumento='.prepare($id_record).' ORDER BY `scadenza` ASC');
if (!empty($rs2)) {
for ($i = 0; $i < sizeof($rs2); ++$i) {
$pagamento = $dbo->fetchOne('SELECT fe_modalita_pagamento.descrizione FROM co_pagamenti INNER JOIN fe_modalita_pagamento ON fe_modalita_pagamento.codice = co_pagamenti.codice_modalita_pagamento_fe WHERE co_pagamenti.id='.$rs2[$i]['id_pagamento'])['descrizione'];
echo '
<tr>
<td>
<td style=\'width:15%;\'>
<small>'.Translator::dateToLocale($rs2[$i]['scadenza'])."</small>
</td>
<td style='width:25%;' class='text-right'>
<td style='width:15%;' class='text-right'>
".(($rs2[$i]['pagato'] == $rs2[$i]['da_pagare']) ? '<small>PAGATO</small>' : '')."
</td>
<td style='width:35%;' class='text-right'>
<td style='width:15%;' class='text-right'>
<small>".moneyFormat($rs2[$i]['da_pagare'], 2).'</small>
</td>
<td style=\'width:15%;\'>
<small>'.$pagamento.'</small>
</td>
</tr>';
}
}

View File

@ -28,7 +28,7 @@ $banca = $documento->getBanca();
$record = $dbo->fetchOne('SELECT *,
(SELECT descrizione FROM co_statidocumento WHERE id=idstatodocumento) AS stato_doc,
(SELECT descrizione FROM co_tipidocumento WHERE id=idtipodocumento) AS tipo_doc,
(SELECT descrizione FROM co_pagamenti WHERE id=idpagamento) AS tipo_pagamento,
(SELECT descrizione FROM co_pagamenti WHERE id=idpagamento) AS id_pagamento,
(SELECT dir FROM co_tipidocumento WHERE id=idtipodocumento) AS dir,
(SELECT descrizione FROM dt_causalet WHERE id=idcausalet) AS causalet,
(SELECT descrizione FROM dt_porto WHERE id=idporto) AS porto,
@ -101,7 +101,7 @@ $custom = [
'numero' => $numero,
'tipo_documento' => $tipo_doc,
'data' => Translator::dateToLocale($record['data']),
'pagamento' => $record['tipo_pagamento'],
'pagamento' => $record['id_pagamento'],
'c_destinazione' => $destinazione,
'aspettobeni' => $record['aspettobeni'],
'causalet' => $record['causalet'],

View File

@ -367,7 +367,7 @@ if (($options['pricing'] && !isset($options['hide-total'])) || $options['show-on
// Totale imponibile
echo '
<tr>
<td colspan="'.($options['show-only-total'] ? ($options['no-iva'] ? 3 : 2) : 4).'" class="text-right border-top">
<td colspan="'.($options['show-only-total'] ? (($has_image) ? 3 : 2) : 4).'" class="text-right border-top">
<b>'.tr('Imponibile', [], ['upper' => true]).':</b>
</td>

View File

@ -35,4 +35,8 @@ ALTER TABLE `mg_prodotti` ADD FOREIGN KEY (`id_riga_contratto`) REFERENCES `co_r
INSERT INTO `zz_prints` (`id_module`, `is_record`, `name`, `title`, `filename`, `directory`, `previous`, `options`, `icon`, `version`, `compatibility`, `order`, `predefined`, `default`, `enabled`, `available_options`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Preventivi'), '1', 'Preventivo(solo totale imponibile)', 'Preventivo (solo totale imponibile)', 'Preventivo num. {numero} del {data} rev {revisione}', 'preventivi', 'idpreventivo', '{\"pricing\": false, \"last-page-footer\": true, \"images\": true, \"no-iva\":true, \"show-only-total\":true }', 'fa fa-print', '', '', '0', '0', '1', '1', '{\"pricing\":\"Visualizzare i prezzi\", \"hide-total\": \"Nascondere i totali delle righe\", \"show-only-total\": \"Visualizzare solo i totali del documento\", \"hide-header\": \"Nascondere intestazione\", \"hide-footer\": \"Nascondere footer\", \"last-page-footer\": \"Visualizzare footer solo su ultima pagina\", \"hide-item-number\": \"Nascondere i codici degli articoli\"}');
-- Aggiunta indice per ricerca su files più rapida
ALTER TABLE `zz_files` ADD INDEX(`id_record`);
ALTER TABLE `zz_files` ADD INDEX(`id_record`);
ALTER TABLE `co_scadenziario` ADD `id_pagamento` INT NOT NULL;
ALTER TABLE `co_scadenziario` ADD `id_banca_azienda` INT NULL;
ALTER TABLE `co_scadenziario` ADD `id_banca_controparte` INT NULL;