Miglioramento dati FE per righe di fattura

This commit is contained in:
Thomas Zilio 2019-07-15 16:53:18 +02:00
parent c4695e6b71
commit b40e56dbdb
12 changed files with 338 additions and 80 deletions

View File

@ -0,0 +1,56 @@
<?php
// Altri dati gestionali
echo '
<tr>
<td colspan="2">
'.str_repeat($space, 3).'2.2.1.16 AltriDatiGestionali - '.tr('Riga _NUM_', [
'_NUM_' => $key,
]);
if ($key == 1) {
echo '
<button type="button" class="btn btn-xs btn-info pull-right" onclick="add_altri_dati(this)" id="add-altri_dati">
<i class="fa fa-plus"></i> '.tr('Aggiungi').'
</button>';
}
echo '
</td>
</tr>';
// Tipo Dato
echo '
<tr>
<td style="vertical-align: middle;">'.str_repeat($space, 4).'2.2.1.16.1 TipoDato</td>
<td>
{[ "type": "text", "name": "altri_dati['.$key.'][tipo_dato]", "value": "'.$dato['tipo_dato'].'", "maxlength": 20 ]}
</td>
</tr>';
// Riferimento Testo
echo '
<tr>
<td style="vertical-align: middle;">'.str_repeat($space, 4).'2.2.1.16.2 RiferimentoTesto</td>
<td>
{[ "type": "text", "name": "altri_dati['.$key.'][riferimento_testo]", "value": "'.$dato['riferimento_testo'].'", "maxlength": 20 ]}
</td>
</tr>';
// Riferimento Numero
echo '
<tr>
<td style="vertical-align: middle;">'.str_repeat($space, 4).'2.2.1.16.3 RiferimentoNumero</td>
<td>
{[ "type": "number", "name": "altri_dati['.$key.'][riferimento_numero]", "value": "'.$dato['tipo_dato'].'", "maxlength": 20 ]}
</td>
</tr>';
// Riferimento Data
echo '
<tr id="last-altri_dati-'.$key.'">
<td style="vertical-align: middle;">'.str_repeat($space, 4).'2.2.1.16.4 RiferimentoData</td>
<td>
{[ "type": "date", "name": "altri_dati['.$key.'][riferimento_data]", "value": "'.$dato['tipo_dato'].'", "maxlength": 20 ]}
</td>
</tr>';

View File

@ -92,70 +92,3 @@ echo '
{[ "type": "number", "label": "'.tr('Sconto unitario').'", "name": "sconto", "value": "'.$result['sconto_unitario'].'", "icon-after": "choice|untprc|'.$result['tipo_sconto'].'", "help": "'.tr('Il valore positivo indica uno sconto. Per applicare un rincaro inserire un valore negativo.').'" ]}
</div>
</div>';
if ($module['name'] == 'Fatture di vendita') {
$collapsed = empty($result['data_inizio_periodo']) && empty($result['data_fine_periodo']) && empty($result['riferimento_amministrazione']);
echo '
<div class="box box-info '.($collapsed ? 'collapsed-box' : '').'">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Dati Fatturazione Elettronica').'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-plus"></i>
</button>
</div>
</div>
<div class="box-body">';
$tipi_cessione_prestazione = [
[
'id' => 'SC',
'text' => 'SC - '.tr('Sconto'),
],
[
'id' => 'PR',
'text' => 'PR - '.tr('Premio'),
],
[
'id' => 'AB',
'text' => 'AB - '.tr('Abbuono'),
],
[
'id' => 'AC',
'text' => 'AC - '.tr('Spesa accessoria'),
],
];
// Data inizio periodo
echo '
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Tipo Cessione Prestazione').'", "name": "tipo_cessione_prestazione", "value": "'.$result['tipo_cessione_prestazione'].'", "values": '.json_encode($tipi_cessione_prestazione).' ]}
</div>';
// Riferimento amministrazione
echo '
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Riferimento Amministrazione').'", "name": "riferimento_amministrazione", "value": "'.$result['riferimento_amministrazione'].'", "maxlength": 20 ]}
</div>
</div>';
// Data inizio periodo
echo '
<div class="row">
<div class="col-md-6">
{[ "type": "date", "label": "'.tr('Data Inizio Periodo').'", "name": "data_inizio_periodo", "value": "'.$result['data_inizio_periodo'].'" ]}
</div>';
// Data fine periodo
echo '
<div class="col-md-6">
{[ "type": "date", "label": "'.tr('Data Fine Periodo').'", "name": "data_fine_periodo", "value": "'.$result['data_fine_periodo'].'" ]}
</div>
</div>';
echo '
</div>
</div>';
}

118
include/common/riga_fe.php Normal file
View File

@ -0,0 +1,118 @@
<?php
$tipi_cessione_prestazione = [
[
'id' => 'SC',
'text' => 'SC - '.tr('Sconto'),
],
[
'id' => 'PR',
'text' => 'PR - '.tr('Premio'),
],
[
'id' => 'AB',
'text' => 'AB - '.tr('Abbuono'),
],
[
'id' => 'AC',
'text' => 'AC - '.tr('Spesa accessoria'),
],
];
$space = str_repeat('&nbsp;', 6);
echo '
<table class="table">
<tbody>
<tr>
<th colspan="2">2 FatturaElettronicaBody</th>
</tr>
<tr>
<th colspan="2">'.str_repeat($space, 1).'2.2 DatiBeniServizi</th>
</tr>
<tr>
<th colspan="2">'.str_repeat($space, 2).'2.2.1 DettaglioLinee</th>
</tr>';
// Tipo Cessione Prestazione
echo '
<tr>
<td style="vertical-align: middle;">'.str_repeat($space, 3).'2.2.1.2 TipoCessionePrestazione</td>
<td>
{[ "type": "select", "name": "tipo_cessione_prestazione", "value": "'.$result['tipo_cessione_prestazione'].'", "values": '.json_encode($tipi_cessione_prestazione).' ]}
</td>
</tr>';
// Data inizio periodo
echo '
<tr>
<td style="vertical-align: middle;">'.str_repeat($space, 3).'2.2.1.7 DataInizioPeriodo</td>
<td>
{[ "type": "date", "name": "data_inizio_periodo", "value": "'.$result['data_inizio_periodo'].'" ]}
</td>
</tr>';
// Data fine periodo
echo '
<tr>
<td style="vertical-align: middle;">'.str_repeat($space, 3).'2.2.1.8 DataFinePeriodo</td>
<td>
{[ "type": "date", "name": "data_fine_periodo", "value": "'.$result['data_fine_periodo'].'" ]}
</td>
</tr>';
// Riferimento amministrazione
echo '
<tr>
<td style="vertical-align: middle;">'.str_repeat($space, 3).'2.2.1.15 RiferimentoAmministrazione</td>
<td>
{[ "type": "text", "name": "riferimento_amministrazione", "value": "'.$result['riferimento_amministrazione'].'", "maxlength": 20 ]}
</td>
</tr>';
if (empty($result['altri_dati'])) {
$result['altri_dati'][] = [];
}
$key = 1;
foreach ($result['altri_dati'] as $dato) {
include __DIR__.'/fe_components/altri_dati.php';
++$key;
}
echo '
</tbody>
</table>';
echo '
<script>
function replaceAll(str, find, replace) {
return str.replace(new RegExp(find, "g"), replace);
}
var n = '.($key - 1).';
function add_altri_dati(btn){
$("#template .superselect, #template .superselectajax").select2().select2("destroy");
var last = $(btn).closest("table").find("tr[id^=last-altri_dati]").last();
n++;
var text = replaceAll($("#altri_dati-templace").html(), "-id-", "" + n);
last.after(text);
console.log(text);
start_superselect();
};
</script>
<table class="hide">
<tbody id="altri_dati-templace">';
$dato = [];
$key = '-id-';
include __DIR__.'/fe_components/altri_dati.php';
echo '
</tbody>
</table>';

View File

@ -45,6 +45,42 @@ if (!function_exists('array_clean')) {
}
}
if (!function_exists('array_deep_clean')) {
/**
* Pulisce i contenuti vuoti di un array.
*
* @param $array
*
* @since 2.4.11
*
* @return array
*/
function array_deep_clean($input)
{
// If it is an element, then just return it
if (!is_array($input)) {
return $input;
}
$non_empty_items = [];
foreach ($input as $key => $value) {
// Ignore empty cells
if ($value) {
$cleaned = array_deep_clean($value);
// Use recursion to evaluate cells
if (!empty($cleaned)) {
$non_empty_items[$key] = $cleaned;
}
}
}
// Finally return the array without empty items
return $non_empty_items;
}
}
if (!function_exists('starts_with')) {
/**
* Check if a string starts with the given string.

View File

@ -323,6 +323,36 @@ switch (post('op')) {
// Ricalcolo inps, ritenuta e bollo
ricalcola_costiagg_fattura($id_record);
break;
case 'manage_dati_fe':
$id_riga = post('idriga');
if ($id_riga != null) {
$riga = Articolo::find($id_riga) ?: Riga::find($id_riga);
$riga = $riga ?: Descrizione::find($id_riga);
$riga = $riga ?: Sconto::find($id_riga);
$data = Filter::getPOST();
$ignore = [
'id_plugin',
'id_module',
'id_record',
'backto',
'hash',
'op',
'idriga',
'dir',
];
foreach ($ignore as $name) {
unset($data[$name]);
}
$riga->dati_aggiuntivi_fe = $data;
$riga->save();
flash()->info(tr('Dati FE aggiornati correttamente!'));
}
break;
case 'manage_sconto':

View File

@ -0,0 +1,23 @@
<?php
use Modules\Fatture\Fattura;
include_once __DIR__.'/../../core.php';
$documento = Fattura::find($id_record);
// Impostazioni per la gestione
$options = [
'op' => 'manage_dati_fe',
'action' => 'edit',
'dir' => $documento->direzione,
];
// Dati della riga
$id_riga = get('idriga');
$riga = $documento->getRighe()->find($id_riga);
$result = $riga->toArray();
$result = array_merge($result, $riga->dati_aggiuntivi_fe);
echo App::load('riga_fe.php', $result, $options);

View File

@ -262,9 +262,17 @@ foreach ($righe as $row) {
}
echo "
<a class='btn btn-xs btn-warning' title='Modifica questa riga...' onclick=\"launch_modal( 'Modifica riga', '".$structure->fileurl('row-edit.php').'?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$riga['id']."', 1 );\"><i class='fa fa-edit'></i></a>
<a class='btn btn-xs btn-info' data-toggle='modal' data-title='".tr('Dati Fattura Elettronica')."' data-href='".$structure->fileurl('row-fe.php').'?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$riga['id']."'>
<i class='fa fa-file-code-o '></i>
</a>
<a class='btn btn-xs btn-warning' title='Modifica questa riga...' onclick=\"launch_modal( 'Modifica riga', '".$structure->fileurl('row-edit.php').'?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$riga['id']."', 1 );\">
<i class='fa fa-edit'></i>
</a>
<a class='btn btn-xs btn-danger' title='Rimuovi questa riga...' onclick=\"if( confirm('Rimuovere questa riga dalla fattura?') ){ $('#delete-form-".$riga['id']."').submit(); }\"><i class='fa fa-trash'></i></a>
<a class='btn btn-xs btn-danger' title='Rimuovi questa riga...' onclick=\"if( confirm('Rimuovere questa riga dalla fattura?') ){ $('#delete-form-".$riga['id']."').submit(); }\">
<i class='fa fa-trash'></i>
</a>
</div>
</form>";
}

View File

@ -34,6 +34,29 @@ trait RelationTrait
return $result;
}
/**
* Restituisce i dati aggiuntivi per la fattura elettronica dell'elemento.
*
* @return array
*/
public function getDatiAggiuntiviFEAttribute()
{
$result = json_decode($this->attributes['dati_aggiuntivi_fe'], true);
return (array) $result;
}
/**
* Imposta i dati aggiuntivi per la fattura elettronica dell'elemento.
*/
public function setDatiAggiuntiviFEAttribute($values)
{
$values = (array) $values;
$dati = array_deep_clean($values);
$this->attributes['dati_aggiuntivi_fe'] = json_encode($dati);
}
/**
* Restituisce il totale (imponibile + iva + rivalsa_inps + iva_rivalsainps) dell'elemento.
*

View File

@ -16,7 +16,7 @@ if (!empty($ptype)) {
$result = Prints::render($id_print, $id_record, $directory);
if(empty($result)){
if (empty($result)) {
echo '
<div class="text-center">
<h3 class="text-muted">

View File

@ -918,13 +918,15 @@ class FatturaElettronica
return $item->aliquota != null;
})->aliquota;
foreach ($righe as $numero => $riga) {
$dati_aggiuntivi = $riga->dati_aggiuntivi_fe;
$dettaglio = [
'NumeroLinea' => $numero + 1,
];
// 2.2.1.2
if (!empty($riga['tipo_cessione_prestazione'])) {
$dettaglio['TipoCessionePrestazione'] = $riga['tipo_cessione_prestazione'];
if (!empty($dati_aggiuntivi['tipo_cessione_prestazione'])) {
$dettaglio['TipoCessionePrestazione'] = $dati_aggiuntivi['tipo_cessione_prestazione'];
}
// 2.2.1.3
@ -962,11 +964,11 @@ class FatturaElettronica
$dettaglio['UnitaMisura'] = $riga['um'];
}
if (!empty($riga['data_inizio_periodo'])) {
$dettaglio['DataInizioPeriodo'] = $riga['data_inizio_periodo'];
if (!empty($dati_aggiuntivi['data_inizio_periodo'])) {
$dettaglio['DataInizioPeriodo'] = $dati_aggiuntivi['data_inizio_periodo'];
}
if (!empty($riga['data_fine_periodo'])) {
$dettaglio['DataFinePeriodo'] = $riga['data_fine_periodo'];
if (!empty($dati_aggiuntivi['data_fine_periodo'])) {
$dettaglio['DataFinePeriodo'] = $dati_aggiuntivi['data_fine_periodo'];
}
$dettaglio['PrezzoUnitario'] = $riga->prezzo_unitario_vendita ?: 0;
@ -1010,20 +1012,44 @@ class FatturaElettronica
$dettaglio['Natura'] = $aliquota['codice_natura_fe'];
}
if (!empty($riga['riferimento_amministrazione'])) {
$dettaglio['RiferimentoAmministrazione'] = $riga['riferimento_amministrazione'];
if (!empty($dati_aggiuntivi['riferimento_amministrazione'])) {
$dettaglio['RiferimentoAmministrazione'] = $dati_aggiuntivi['riferimento_amministrazione'];
}
// AltriDatiGestionali (2.2.1.16) - Ritenuta ENASARCO
// https://forum.italia.it/uploads/default/original/2X/d/d35d721c3a3a601d2300378724a270154e23af52.jpeg
if (!empty($riga['ritenuta_contributi'])) {
$dettaglio['AltriDatiGestionali'] = [
$dettaglio[]['AltriDatiGestionali'] = [
'TipoDato' => 'CASSA-PREV',
'RiferimentoTesto' => setting('Tipo Cassa Previdenziale').' - '.$ritenuta_contributi->descrizione.' ('.Translator::numberToLocale($ritenuta_contributi->percentuale).'%)',
'RiferimentoNumero' => $riga->ritenuta_contributi,
];
}
if (!empty($dati_aggiuntivi['altri_dati'])) {
foreach ($dati_aggiuntivi['altri_dati'] as $dato) {
$altri_dati = [];
if (!empty($dato['tipo_dato'])) {
$altri_dati['TipoDato'] = $dato['tipo_dato'];
}
if (!empty($dato['riferimento_testo'])) {
$altri_dati['RiferimentoTesto'] = $dato['riferimento_testo'];
}
if (!empty($dato['riferimento_numero'])) {
$altri_dati['RiferimentoNumero'] = $dato['riferimento_numero'];
}
if (!empty($dato['riferimento_data'])) {
$altri_dati['RiferimentoData'] = $dato['riferimento_data'];
}
$dettaglio[]['AltriDatiGestionali'] = $altri_dati;
}
}
$result[] = [
'DettaglioLinee' => $dettaglio,
];

View File

@ -61,7 +61,7 @@ class DateHandler implements HandlerInterface
if (empty($values['icon-before']) || empty($values['icon-after'])) {
$result .= '
<div class="input-group">';
<div class="input-group" style="width: 100%;">';
}
}

View File

@ -1,3 +1,8 @@
UPDATE `zz_prints` SET `filename` = 'Preventivo num. {numero} del {data}' WHERE `name` = 'Preventivo (senza totali)';
DELETE FROM `zz_plugins` WHERE `name` = 'Pianificazione ordini di servizio';
-- Aggiunta campo JSON per le informazioni aggiuntive FE
ALTER TABLE `co_righe_documenti` ADD `dati_aggiuntivi_fe` TEXT;
UPDATE `co_righe_documenti` SET `dati_aggiuntivi_fe` = CONCAT('{"tipo_cessione_prestazione":"', IFNULL(tipo_cessione_prestazione, ""), '","riferimento_amministrazione":"', IFNULL(riferimento_amministrazione, ""), '","data_inizio_periodo":"', IFNULL(data_inizio_periodo, ""), '","data_fine_periodo":"', IFNULL(data_fine_periodo, ""), '"}');
ALTER TABLE `co_righe_documenti` DROP `tipo_cessione_prestazione`, DROP `riferimento_amministrazione`, DROP `data_inizio_periodo`, DROP `data_fine_periodo`;