Skip to content

Commit 4d9c03e

Browse files
feat: gestione import FE di acquisto in automatico e in modalità semplificata
1 parent d77b3fd commit 4d9c03e

5 files changed

Lines changed: 175 additions & 40 deletions

File tree

plugins/importFE/actions.php

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292

9393
echo json_encode([
9494
'id' => $index + 1,
95+
'name' => $file,
9596
]);
9697

9798
break;
@@ -124,28 +125,32 @@
124125

125126
case 'generate':
126127
$filename = post('filename');
128+
$fattura_pa = FatturaElettronica::manage($filename);
127129

128-
$info = [
129-
'id_pagamento' => post('pagamento'),
130-
'id_segment' => post('id_segment'),
131-
'id_tipo' => post('id_tipo'),
132-
'ref_fattura' => post('ref_fattura'),
133-
'data_registrazione' => post('data_registrazione'),
134-
'articoli' => post('articoli'),
135-
'iva' => post('iva'),
136-
'conto' => post('conto'),
137-
'tipo_riga_riferimento' => post('tipo_riga_riferimento'),
138-
'id_riga_riferimento' => post('id_riga_riferimento'),
139-
'tipo_riga_riferimento_vendita' => post('tipo_riga_riferimento_vendita'),
140-
'id_riga_riferimento_vendita' => post('id_riga_riferimento_vendita'),
141-
'movimentazione' => post('movimentazione'),
142-
'crea_articoli' => post('crea_articoli'),
143-
'is_ritenuta_pagata' => post('is_ritenuta_pagata'),
144-
'update_info' => post('update_info'),
145-
'serial' => post('flag_crea_seriali') ? post('serial') : [],
146-
];
130+
if (post('type') == 'auto') {
131+
$info = FatturaElettronica::getInfoAutoImportFE($fattura_pa);
132+
} else {
133+
$info = [
134+
'id_pagamento' => post('pagamento'),
135+
'id_segment' => post('id_segment'),
136+
'id_tipo' => post('id_tipo'),
137+
'ref_fattura' => post('ref_fattura'),
138+
'data_registrazione' => post('data_registrazione'),
139+
'articoli' => post('articoli'),
140+
'iva' => post('iva'),
141+
'conto' => post('conto'),
142+
'tipo_riga_riferimento' => post('tipo_riga_riferimento'),
143+
'id_riga_riferimento' => post('id_riga_riferimento'),
144+
'tipo_riga_riferimento_vendita' => post('tipo_riga_riferimento_vendita'),
145+
'id_riga_riferimento_vendita' => post('id_riga_riferimento_vendita'),
146+
'movimentazione' => post('movimentazione'),
147+
'crea_articoli' => post('crea_articoli'),
148+
'is_ritenuta_pagata' => post('is_ritenuta_pagata'),
149+
'update_info' => post('update_info'),
150+
'serial' => post('flag_crea_seriali') ? post('serial') : [],
151+
];
152+
}
147153

148-
$fattura_pa = FatturaElettronica::manage($filename);
149154
$id_fattura = $fattura_pa->save($info, 'Fornitore');
150155
$fattura_pa->delete();
151156
$fattura = Fattura::find($id_fattura);
@@ -196,21 +201,26 @@
196201
}
197202
}
198203

199-
$files = Interaction::getFileList();
200-
$file = $files[$id_record - 1];
201-
202204
if (get('sequence') == null) {
203-
redirect_url(base_path_osm().'/editor.php?id_module='.$id_module.'&id_record='.$id_fattura);
204-
} elseif (!empty($file)) {
205-
redirect_url(base_path_osm().'/editor.php?id_module='.$id_module.'&id_plugin='.$id_plugin.'&id_record='.$id_record.'&sequence=1');
206-
flash()->info(tr('La fattura numero _NUM_ del _DATA_ (_ANAGRAFICA_) è stata importata correttamente', [
205+
flash()->info(tr('La fattura numero _NUM_ del _DATA_ è stata importata correttamente', [
207206
'_NUM_' => $fattura->numero,
208207
'_DATA_' => dateFormat($fattura->data),
209-
'_ANAGRAFICA_' => $fattura->anagrafica->ragione_sociale,
210208
]));
209+
redirect_url(base_path_osm().'/editor.php?id_module='.$id_module.'&id_record='.$id_fattura);
211210
} else {
212-
flash()->info(tr('Tutte le fatture salvate sono state importate!'));
213-
redirect_url(base_path_osm().'/controller.php?id_module='.$id_module);
211+
$files = Interaction::getFileList();
212+
$file = $files[$id_record - 1];
213+
if (!empty($file)) {
214+
redirect_url(base_path_osm().'/editor.php?id_module='.$id_module.'&id_plugin='.$id_plugin.'&id_record='.$id_record.'&sequence=1');
215+
flash()->info(tr('La fattura numero _NUM_ del _DATA_ (_ANAGRAFICA_) è stata importata correttamente', [
216+
'_NUM_' => $fattura->numero,
217+
'_DATA_' => dateFormat($fattura->data),
218+
'_ANAGRAFICA_' => $fattura->anagrafica->ragione_sociale,
219+
]));
220+
} else {
221+
flash()->info(tr('Tutte le fatture salvate sono state importate!'));
222+
redirect_url(base_path_osm().'/controller.php?id_module='.$id_module);
223+
}
214224
}
215225
break;
216226

plugins/importFE/edit.php

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,16 @@
3030

3131
echo '
3232
<script>
33-
function upload(btn) {
33+
function upload(btn, automatic = false) {
3434
if ($("#blob").val()) {
35+
let text = "";
36+
if (automatic) {
37+
text = "'.tr('Importare la fattura automaticamente in modalità semplificata?').'";
38+
} else {
39+
text = "'.tr('Avviare la procedura?').'";
40+
}
3541
swal({
36-
title: "'.tr('Avviare la procedura?').'",
42+
title: text,
3743
type: "warning",
3844
showCancelButton: true,
3945
confirmButtonText: "'.tr('').'"
@@ -52,7 +58,13 @@ function upload(btn) {
5258
data = JSON.parse(data);
5359
5460
if (!data.already) {
55-
redirect_url(globals.rootdir + "/editor.php?id_module=" + globals.id_module + "&id_plugin=" + '.$id_plugin.' + "&id_record=" + data.id);
61+
if (automatic) {
62+
import_fe_auto(btn, data.name, null);
63+
$("#blob").val("");
64+
renderMessages();
65+
} else {
66+
redirect_url(globals.rootdir + "/editor.php?id_module=" + globals.id_module + "&id_plugin=" + '.$id_plugin.' + "&id_record=" + data.id);
67+
}
5668
} else {
5769
swal({
5870
title: "'.tr('Fattura già importata').'.",
@@ -97,8 +109,14 @@ function upload(btn) {
97109
{[ "type": "file", "name": "blob", "required": 1, "placeholder": "'.tr('Seleziona un file XML, P7M o ZIP').'" ]}
98110
</div>
99111
100-
<div class="col-md-3">
101-
<button type="button" class="btn btn-primary pull-right" onclick="upload(this)">
112+
<div class="col-md-1">
113+
<button type="button" class="btn btn-info btn-block tip" onclick="upload(this, true)" title="'.tr('Carica e importa automaticamente il file selezionato').'">
114+
<i class="fa fa-upload"></i>
115+
</button>
116+
</div>
117+
118+
<div class="col-md-2">
119+
<button type="button" class="btn btn-warning btn-block" onclick="upload(this)">
102120
<i class="fa fa-upload"></i> '.tr('Carica documento fornitore').'
103121
</button>
104122
</div>

plugins/importFE/list.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@
113113

114114
echo '
115115
116+
<button type="button" class="btn btn-info tip" '.((!extension_loaded('openssl') && str_ends_with(strtolower((string) $name), '.p7m')) ? 'disabled' : '').' onclick="import_fe_auto(this, \''.$name.'\', \''.$data.'\')" title="'.tr('Importa la fattura nel gestionale automaticamente in modalità semplificata, non verranno associati gli articoli').'">
117+
<i class="fa fa-cloud-download"></i>
118+
</button>
119+
116120
<button type="button" class="btn btn-warning tip" '.((!extension_loaded('openssl') && str_ends_with(strtolower((string) $name), '.p7m')) ? 'disabled' : '').' onclick="import_fe(this, \''.$name.'\', \''.$data.'\')" title="'.tr('Importa la fattura nel gestionale').'">
117121
<i class="fa fa-cloud-download"></i> '.tr('Importa').'
118122
</button>
@@ -166,6 +170,39 @@ function import_fe(button, file, data_registrazione) {
166170
});
167171
}
168172
173+
function import_fe_auto(button, file, data_registrazione) {
174+
swal({
175+
title: "'.tr('Importare la fattura automaticamente in modalità semplificata?').'",
176+
html: "'.tr('Non verranno associati gli articoli').'",
177+
type: "info",
178+
showCancelButton: true,
179+
confirmButtonText: "'.tr('').'"
180+
}).then(function (result) {
181+
var restore = buttonLoading(button);
182+
183+
$.ajax({
184+
url: globals.rootdir + "/actions.php",
185+
type: "post",
186+
data: {
187+
id_module: globals.id_module,
188+
id_plugin: '.$id_plugin.',
189+
op: "generate",
190+
filename: file,
191+
data_registrazione: data_registrazione,
192+
type: "auto",
193+
},
194+
success: function(data) {
195+
$("#list").load("'.$structure->fileurl('list.php').'?id_module='.$id_module.'&id_plugin='.$id_plugin.'", function() {
196+
// Reinizializza le tabelle DataTables dopo il caricamento dinamico
197+
start_local_datatables();
198+
buttonRestore(button, restore);
199+
});
200+
}
201+
});
202+
renderMessages();
203+
});
204+
}
205+
169206
function process_fe(button, file) {
170207
swal({
171208
title: "'.tr('Segnare la fattura come processata?').'",

plugins/importFE/src/FatturaElettronica.php

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
use Modules\Fatture\Fattura;
2929
use Modules\Fatture\Stato;
3030
use Modules\Fatture\Tipo as TipoFattura;
31+
use Modules\Pagamenti\Pagamento;
3132
use Util\XML;
3233

3334
/**
@@ -638,4 +639,72 @@ protected function convertDatiAggiuntiviFE($dati_xml)
638639

639640
return $result;
640641
}
642+
643+
/**
644+
* Fornisce le informazioni di default per l'importazione automatica.
645+
*
646+
* @return bool
647+
*/
648+
public static function getInfoAutoImportFE($fattura_pa)
649+
{
650+
$fattura_body = $fattura_pa->getBody();
651+
$dati_generali = $fattura_body['DatiGenerali']['DatiGeneraliDocumento'];
652+
$id_module_fatture_acquisto = Module::where('name', 'Fatture di acquisto')->first()->id;
653+
654+
// Data registrazione
655+
$data_registrazione = post('data_registrazione') ?: $dati_generali['Data'];
656+
657+
// Pagamento
658+
$pagamenti = [];
659+
if (isset($fattura_body['DatiPagamento'])) {
660+
$pagamenti = $fattura_body['DatiPagamento'];
661+
$pagamenti = isset($pagamenti[0]) ? $pagamenti : [$pagamenti];
662+
}
663+
$metodi = [];
664+
foreach ($pagamenti as $pagamento) {
665+
$rate = $pagamento['DettaglioPagamento'];
666+
$rate = isset($rate[0]) ? $rate : [$rate];
667+
$metodi = array_merge($metodi, $rate);
668+
}
669+
$metodi = isset($metodi[0]) ? $metodi : [$metodi];
670+
$codice_modalita_pagamento = $metodi[0]['ModalitaPagamento'];
671+
$pagamento = Pagamento::where('codice_modalita_pagamento_fe', $codice_modalita_pagamento)->where('predefined', '1')->first();
672+
673+
// Tipo del documento
674+
$query = "SELECT `co_tipidocumento`.`id`, CONCAT('(', `codice_tipo_documento_fe`, ') ', `title`) AS descrizione FROM `co_tipidocumento` LEFT JOIN `co_tipidocumento_lang` ON (`co_tipidocumento_lang`.`id_record` = `co_tipidocumento`.`id` AND `co_tipidocumento_lang`.`id_lang` = ".prepare(\Models\Locale::getDefault()->id).") WHERE `dir` = 'uscita'";
675+
$query_tipo = $query.' AND `codice_tipo_documento_fe` = '.prepare($dati_generali['TipoDocumento']);
676+
$numero_tipo = database()->fetchNum($query_tipo);
677+
if (!empty($numero_tipo)) {
678+
$query = $query_tipo;
679+
}
680+
$id_tipodocumento = database()->fetchOne($query)['id'];
681+
682+
// Sezionale
683+
$id_segment = null;
684+
if (!empty($id_tipodocumento)) {
685+
$id_segment = database()->table('co_tipidocumento')->where('id', '=', $id_tipodocumento)->value('id_segment');
686+
}
687+
688+
$info = [
689+
'id_pagamento' => $pagamento->id ?? setting('Tipo di pagamento predefinito'),
690+
'id_segment' => $id_segment ?? getSegmentPredefined($id_module_fatture_acquisto),
691+
'id_tipo' => $id_tipodocumento,
692+
'ref_fattura' => null,
693+
'data_registrazione' => $data_registrazione,
694+
'articoli' => [],
695+
'iva' => [],
696+
'conto' => [],
697+
'tipo_riga_riferimento' => [],
698+
'id_riga_riferimento' => [],
699+
'tipo_riga_riferimento_vendita' => [],
700+
'id_riga_riferimento_vendita' => [],
701+
'movimentazione' => 0,
702+
'crea_articoli' => 0,
703+
'is_ritenuta_pagata' => 0,
704+
'update_info' => [],
705+
'serial' => [],
706+
];
707+
708+
return $info;
709+
}
641710
}

plugins/importFE/src/FatturaOrdinaria.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -285,14 +285,14 @@ public function saveRighe($articoli, $iva, $conto, $movimentazione = true, $crea
285285
$articolo = ArticoloOriginale::build($codice, $categoria);
286286
$articolo->setTranslation('title', $riga['Descrizione']);
287287
$articolo->um = $riga['UnitaMisura'];
288-
$articolo->idconto_acquisto = $conto[$key];
288+
$articolo->idconto_acquisto = $conto[$key] ?: null;
289289
$articolo->abilita_serial = setting('Serial number abilitato di default');
290290
$articolo->save();
291291
}
292292
}
293293

294294
if (!empty($articolo)) {
295-
$articolo->idconto_acquisto = $conto[$key];
295+
$articolo->idconto_acquisto = $conto[$key] ?: null;
296296
$articolo->save();
297297

298298
$obj = Articolo::build($fattura, $articolo);
@@ -353,12 +353,13 @@ public function saveRighe($articoli, $iva, $conto, $movimentazione = true, $crea
353353

354354
if (!$is_descrizione) {
355355
$iva_value = !empty($iva[$key]) ? $iva[$key] : setting('Iva predefinita');
356+
$conto_value = !empty($conto[$key]) ? $conto[$key] : setting('Conto predefinito fatture di acquisto');
356357

357358
$obj->id_iva = $iva_value;
358-
$obj->idconto = $conto[$key];
359+
$obj->idconto = $conto_value;
359360

360-
if (empty($conto_arrotondamenti) && !empty($conto[$key])) {
361-
$conto_arrotondamenti = $conto[$key];
361+
if (empty($conto_arrotondamenti) && !empty($conto_value)) {
362+
$conto_arrotondamenti = $conto_value;
362363
}
363364

364365
$obj->ritenuta_contributi = $ritenuta_contributi;

0 commit comments

Comments
 (0)