Aggiunto modal per la gestione delle ricevute

This commit is contained in:
Dasc3er 2020-09-08 10:38:27 +02:00
parent d4c8f11d79
commit 954930d7dc
9 changed files with 298 additions and 84 deletions

View File

@ -62,7 +62,7 @@ function sanitizeFilename($filename)
/**
* Elimina i file indicati.
*
* @param array $files
* @param array|string $files
*
* @return bool
*/

View File

@ -24,6 +24,7 @@ use Carbon\Carbon;
use Common\Components\Description;
use Common\Document;
use Illuminate\Database\Eloquent\Builder;
use Models\Upload;
use Modules\Anagrafiche\Anagrafica;
use Modules\Fatture\Gestori\Bollo as GestoreBollo;
use Modules\Fatture\Gestori\Movimenti as GestoreMovimenti;
@ -460,6 +461,23 @@ class Fattura extends Document
})->sortBy('created_at');
}
/**
* Restituisce la ricevuta principale, impostata attraverso il campo aggiuntivo id_ricevuta_principale.
*
* @return Upload|null
*/
public function getRicevutaPrincipale()
{
if (empty($this->id_ricevuta_principale)) {
return null;
}
return $this->getModule()
->uploads($this->id)
->where('id', $this->id_ricevuta_principale)
->first();
}
/**
* Controlla se la fattura di acquisto è elettronica.
*

View File

@ -20,7 +20,6 @@
include_once __DIR__.'/init.php';
use Plugins\ExportFE\Interaction;
use Plugins\ReceiptFE\Interaction as RecepitInteraction;
use Plugins\ReceiptFE\Ricevuta;
switch (filter('op')) {
@ -62,23 +61,27 @@ switch (filter('op')) {
}
// Importazione ultima ricevuta individuata
RecepitInteraction::getReceipt($last_recepit);
$fattura = null;
try {
$receipt = new Ricevuta($last_recepit);
$receipt->save();
$fattura = $receipt->getFattura()->numero_esterno;
$receipt->delete();
RecepitInteraction::processReceipt($name);
} catch (UnexpectedValueException $e) {
}
$fattura = Ricevuta::process($last_recepit);
$numero_esterno = $fattura ? $fattura->numero_esterno : null;
echo json_encode([
'file' => $last_recepit,
'fattura' => $numero_esterno,
]);
break;
case 'gestione_ricevuta':
$name = filter('name');
$type = filter('type');
$cambia_stato = $type != 'download';
$fattura = Ricevuta::process($name, false);
$numero_esterno = $fattura ? $fattura->numero_esterno : null;
echo json_encode([
'file' => $name,
'fattura' => $fattura,
]);

View File

@ -119,8 +119,8 @@ echo '
echo '<br><br>';
// Messaggio esito invio
$ultima_ricevuta = $fattura->getRicevute()->last();
// Messaggio informativo sulla ricevuta principale impostata
$ricevuta_principale = $fattura->getRicevutaPrincipale();
if (!empty($record['codice_stato_fe'])) {
if ($record['codice_stato_fe'] == 'GEN') {
echo '
@ -141,9 +141,9 @@ if (!empty($record['codice_stato_fe'])) {
<div class="pull-right">
<i class="fa fa-clock-o tip" title="'.tr('Data e ora ricezione').'"></i> '.Translator::timestampToLocale($record['data_stato_fe']);
if (!empty($ultima_ricevuta)) {
if (!empty($ricevuta_principale)) {
echo '
<a href="'.ROOTDIR.'/view.php?file_id='.$ultima_ricevuta->id.'" target="_blank" class="btn btn-info btn-xs">
<a href="'.ROOTDIR.'/view.php?file_id='.$ricevuta_principale->id.'" target="_blank" class="btn btn-info btn-xs">
<i class="fa fa-external-link"></i> '.tr('Visualizza ricevuta').'
</a>';
}
@ -156,8 +156,8 @@ if (!empty($record['codice_stato_fe'])) {
</div>';
// Lettura della ricevuta
if (!empty($ultima_ricevuta) && $stato_fe['codice'] == 'NS') {
$contenuto_ricevuta = \Util\XML::readFile($ultima_ricevuta->filepath);
if (!empty($ricevuta_principale) && $stato_fe['codice'] == 'NS') {
$contenuto_ricevuta = \Util\XML::readFile($ricevuta_principale->filepath);
$lista_errori = $contenuto_ricevuta['ListaErrori'];
if (!empty($lista_errori)) {
@ -193,7 +193,7 @@ if (!empty($record['codice_stato_fe'])) {
echo '
<script>
function send(btn) {
var restore = buttonLoading(btn);
let restore = buttonLoading(btn);
$.ajax({
url: globals.rootdir + "/actions.php",
@ -225,7 +225,10 @@ echo '
}
function verify(btn) {
var restore = buttonLoading(btn);
openModal("'.tr('Gestione ricevute').'", "'.$structure->fileurl('notifiche.php').'");
/*
let restore = buttonLoading(btn);
$.ajax({
url: globals.rootdir + "/actions.php",
@ -253,7 +256,7 @@ echo '
buttonRestore(btn, restore);
}
});
});*/
}
$("#genera").click(function(event) {

View File

@ -0,0 +1,136 @@
<?php
use Modules\Fatture\Fattura;
use Plugins\ExportFE\Interaction;
include_once __DIR__.'/../../core.php';
$result = Interaction::getInvoiceRecepits($id_record);
$recepits = $result['results'];
$documento = Fattura::find($id_record);
if (empty($recepits)) {
echo '
<p>'.tr('Il documento non ha notifiche disponibili').'.</p>';
return;
}
echo '
<p>'.tr("Segue l'elenco completo delle notifiche/ricevute relative alla fatture elettronica di questo documento").'.</p>
<p>'.tr('La procedura di importazione prevede di impostare in modo autonomo la notifica più recente come principale, ma si verificano alcune situazioni in cui il comportamento richiesto deve essere distinto').'. '.tr('Qui si può procedere a scaricare una specifica notifica e a impostarla manualmente come principale per il documento').'.</p>
<table class="table">
<thead>
<tr>
<th>'.tr('Nome').'</th>
<th class="text-center">'.tr('Scaricata').'</th>
<th class="text-center">'.tr('Opzioni').'</th>
</tr>
</thead>
<tbody>';
foreach ($recepits as $nome) {
$upload = $documento->uploads()
->where('name', 'Fattura Elettronica')
->where('original', $nome)
->first();
// Individuazione codice ricevuta
$filename = explode('.', $nome)[0];
$pieces = explode('_', $filename);
$codice_stato = $pieces[2];
echo '
<tr data-name="'.$nome.'">
<td>'.$nome.'</td>
<td class="text-center">';
if (empty($upload)) {
echo tr('No');
} else {
echo '
<a href="'.ROOTDIR.'/view.php?file_id='.$upload->id.'" target="_blank">
<i class="fa fa-external-link"></i> '.tr('Visualizza').'
</a>';
}
echo '
<td class="text-center">';
if (empty($upload)) {
echo '
<button type="button" class="btn btn-info btn-sm" onclick="scaricaRicevuta(this)">
<i class="fa fa-download"></i>
</button>';
}
echo '
<button type="button" class="btn btn-success btn-sm" onclick="impostaRicevuta(this)">
<i class="fa fa-check-circle"></i>
</button>';
echo '
</td>
</tr>';
}
echo '
</tbody>
</table>
<script>
function scaricaRicevuta(button) {
let riga = $(button).closest("tr");
let name = riga.data("name");
gestioneRicevuta(button, name, "download");
}
function impostaRicevuta(button) {
let riga = $(button).closest("tr");
let name = riga.data("name");
gestioneRicevuta(button, name, "imposta");
}
function gestioneRicevuta(button, name, type) {
let restore = buttonLoading(button);
$.ajax({
url: globals.rootdir + "/actions.php",
type: "post",
dataType: "json",
data: {
op: "gestione_ricevuta",
id_module: "'.$id_module.'",
id_plugin: "'.$id_plugin.'",
id_record: "'.$id_record.'",
name: name,
type: type,
},
success: function(response) {
buttonRestore(button, restore);
if(response.fattura) {
swal({
title: "'.tr('Importazione completata!').'",
type: "success",
});
} else {
swal({
title: "'.tr('Importazione fallita!').'",
type: "error",
});
}
},
error: function() {
buttonRestore(button, restore);
swal("'.tr('Errore').'", "'.tr('Errore durante il salvataggio').'", "error");
}
});
}
</script>';

View File

@ -29,24 +29,12 @@ switch (filter('op')) {
$results = [];
foreach ($list as $element) {
$name = $element['name'];
Interaction::getReceipt($name);
$fattura = null;
try {
$receipt = new Ricevuta($name);
$receipt->save();
$fattura = $receipt->getFattura()->numero_esterno;
$receipt->delete();
Interaction::processReceipt($name);
} catch (UnexpectedValueException $e) {
}
$fattura = Ricevuta::process($name);
$numero_esterno = $fattura ? $fattura->numero_esterno : null;
$results[] = [
'file' => $name,
'fattura' => $fattura,
'fattura' => $numero_esterno,
];
}
@ -63,20 +51,9 @@ switch (filter('op')) {
// no break
case 'prepare':
$name = $name ?: get('name');
Interaction::getReceipt($name);
$fattura = Ricevuta::process($name);
$fattura = null;
try {
$receipt = new Ricevuta($name);
$receipt->save();
$fattura = $receipt->getFattura()->numero_esterno;
$receipt->delete();
Interaction::processReceipt($name);
} catch (UnexpectedValueException $e) {
}
$numero_esterno = $fattura ? $fattura->numero_esterno : null;
echo json_encode([
'file' => $name,

View File

@ -69,18 +69,11 @@ class ReceiptHook extends Manager
// Importazione ricevuta
$name = $element['name'];
Interaction::getReceiptList($name);
try {
$receipt = new Ricevuta($name);
$receipt->save();
$receipt->delete();
Interaction::processReceipt($name);
$fattura = Ricevuta::process($name);
if (!empty($fattura)) {
$completed[] = $element;
unset($todo[$i]);
} catch (UnexpectedValueException $e) {
}
}

View File

@ -19,11 +19,10 @@
namespace Plugins\ReceiptFE;
use Modules;
use Models\Upload;
use Modules\Fatture\Fattura;
use Plugins;
use UnexpectedValueException;
use Uploads;
use Util\XML;
use Util\Zip;
@ -48,6 +47,7 @@ class Ricevuta
{
$file = static::getImportDirectory().'/'.$name;
// Estrazione implicita per il formato ZIP
if (ends_with($name, '.zip')) {
$original_file = $file;
@ -79,6 +79,42 @@ class Ricevuta
}
}
/**
* Funzione per gestire in modo autonomo il download, l'importazione e il salvataggio di una specifica ricevuta identificata tramite nome.
*
* @param string $name
* @param bool $cambia_stato
*
* @return Fattura|null
*/
public static function process($name, $cambia_stato = true)
{
Interaction::getReceipt($name);
$fattura = null;
try {
$receipt = new Ricevuta($name);
$receipt->save($cambia_stato);
$fattura = $receipt->getFattura();
$receipt->cleanup();
Interaction::processReceipt($name);
} catch (UnexpectedValueException $e) {
}
return $fattura;
}
/**
* Salva il file indicato nella cartella temporanea per una futura elaborazione.
*
* @param string $filename
* @param string $content
*
* @return string
*/
public static function store($filename, $content)
{
$directory = static::getImportDirectory();
@ -90,6 +126,11 @@ class Ricevuta
return $filename;
}
/**
* Restituisce la cartella temporanea utilizzabile per il salvataggio della ricevuta.
*
* @return string|null
*/
public static function getImportDirectory()
{
if (!isset(self::$directory)) {
@ -101,32 +142,51 @@ class Ricevuta
return self::$directory;
}
/**
* @param string $codice
*
* @return Upload|null
*/
public function saveAllegato($codice)
{
$module = Modules::get('Fatture di vendita');
$filename = basename($this->file);
$fattura = $this->getFattura();
$info = [
// Controllo sulla presenza della stessa ricevuta
$upload_esistente = $fattura->getModule()
->uploads($fattura->id)
->where('original', $filename)
->first();
if (!empty($upload_esistente)) {
return $upload_esistente;
}
// Registrazione del file XML come allegato
$upload = Upload::build($this->file, [
'category' => tr('Fattura Elettronica'),
'id_module' => $module->id,
'id_record' => $this->fattura->id,
];
// Registrazione XML come allegato
Uploads::upload($this->file, array_merge($info, [
'id_record' => $fattura->id,
'name' => tr('Ricevuta _TYPE_', [
'_TYPE_' => $codice,
]),
'original' => basename($this->file),
]));
'original' => $filename,
]);
return $upload;
}
public function saveStato($codice)
/**
* Aggiorna lo stato della fattura relativa alla ricevuta in modo tale da rispecchiare i dati richiesti.
*
* @param $codice
* @param $id_allegato
*/
public function saveStato($codice, $id_allegato)
{
$fattura = $this->getFattura();
// Modifica lo stato solo se la fattura non è già stata consegnata (per evitare problemi da doppi invii)
// In realtà per le PA potrebbe esserci lo stato NE (che può contenere un esito positivo EC01 o negativo EC02) successivo alla RC,
// quindi aggiungo eccezione nel caso il nuovo codice della ricevuta sia NE.
// In realtà per le PA potrebbe esserci lo stato NE (che può contenere un esito positivo EC01 o negativo EC02) successivo alla RC, quindi aggiungo eccezione nel caso il nuovo codice della ricevuta sia NE.
if ($fattura->codice_stato_fe == 'RC' && ($codice != 'EC01' || $codice != 'EC02')) {
return;
}
@ -138,11 +198,15 @@ class Ricevuta
$fattura->data_stato_fe = $data ? date('Y-m-d H:i:s', strtotime($data)) : '';
$fattura->codice_stato_fe = $codice;
$fattura->descrizione_ricevuta_fe = $descrizione;
$fattura->id_ricevuta_principale = $id_allegato;
$fattura->save();
}
public function save()
/**
* Effettua le operazioni di salvataggio della ricevuta nella fattura relativa.
*/
public function save($cambia_stato = true)
{
$name = basename($this->file);
$filename = explode('.', $name)[0];
@ -157,22 +221,32 @@ class Ricevuta
$codice_nome = $codice_nome.' - '.$errore['Errore']['Codice'];
}
$this->saveAllegato($codice_nome);
$upload = $this->saveAllegato($codice_nome);
// In caso di Notifica Esito il codice è definito dal nodo <Esito> della ricevuta
if ($codice_stato == 'NE') {
$codice_stato = $this->xml['EsitoCommittente']['Esito'];
if ($cambia_stato) {
// In caso di Notifica Esito il codice è definito dal nodo <Esito> della ricevuta
if ($codice_stato == 'NE') {
$codice_stato = $this->xml['EsitoCommittente']['Esito'];
}
$this->saveStato($codice_stato, $upload->id);
}
$this->saveStato($codice_stato);
}
/**
* Restituisce la fattura identificata per la ricevuta.
*
* @return Fattura|null
*/
public function getFattura()
{
return $this->fattura;
}
public function delete()
/**
* Rimuove i file temporanei relativi alla ricevuta.
*/
public function cleanup()
{
delete($this->file);
}

View File

@ -88,3 +88,13 @@ UPDATE `zz_views` SET `query` = 'CONCAT(UCASE(LEFT(tipo_movimento, 1)), SUBSTRIN
-- Aggiornamento versione API services
UPDATE `zz_settings` SET `valore` = 'v3' WHERE `nome` = 'OSMCloud Services API Version';
-- Aggiunto collegamento con allegato per impostare la ricevuta principale
ALTER TABLE `co_documenti` ADD `id_ricevuta_principale` INT(11);
UPDATE `co_documenti` SET `co_documenti`.`id_ricevuta_principale` = (
SELECT `zz_files`.`id` FROM `zz_files` WHERE `zz_files`.`id_module` = (
SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name` = 'Fatture di vendita'
) AND `zz_files`.`id_record` = `co_documenti`.`id`
AND `zz_files`.`name` LIKE 'Ricevuta%'
ORDER BY `zz_files`.`created_at`
LIMIT 1
);