';
-if ($tipodoc == 'Fattura accompagnatoria di vendita') {
+if ($record['descrizione_tipo'] == 'Fattura accompagnatoria di vendita') {
echo '
@@ -894,4 +889,16 @@ $(document).ready(function () {
}
});
});
+
+function cambiaStato() {
+ let testo = $("#idstatodocumento option:selected").text();
+
+ if (testo === "Pagato" || testo === "Parzialmente pagato") {
+ if(confirm("'.tr('Sicuro di voler impostare manualmente la fattura come pagata senza aggiungere il movimento in prima nota?').'")) {
+ return true;
+ } else {
+ $("#idstatodocumento").selectSet('.$record['idstatodocumento'].');
+ }
+ }
+}
';
diff --git a/modules/fatture/init.php b/modules/fatture/init.php
index b1af4e9f7..cd62c998b 100755
--- a/modules/fatture/init.php
+++ b/modules/fatture/init.php
@@ -29,6 +29,7 @@ if ($module['name'] == 'Fatture di vendita') {
if (isset($id_record)) {
$fattura = Fattura::with('tipo', 'stato')->find($id_record);
+ $dir = $fattura->direzione;
$is_fiscale = false;
if (!empty($fattura)) {
@@ -44,7 +45,7 @@ if (isset($id_record)) {
co_documenti.id AS iddocumento,
co_documenti.split_payment AS split_payment,
co_statidocumento.descrizione AS `stato`,
- co_tipidocumento.descrizione AS `descrizione_tipodoc`,
+ co_tipidocumento.descrizione AS `descrizione_tipo`,
co_pagamenti.riba AS `riba`,
(SELECT is_fiscale FROM zz_segments WHERE id = id_segment) AS is_fiscale,
(SELECT descrizione FROM co_ritenutaacconto WHERE id=idritenutaacconto) AS ritenutaacconto_desc,
@@ -57,5 +58,10 @@ if (isset($id_record)) {
LEFT JOIN co_pagamenti ON co_documenti.idpagamento=co_pagamenti.id
WHERE co_tipidocumento.dir = '.prepare($dir).' AND co_documenti.id='.prepare($id_record));
+ // Note di credito collegate
$note_accredito = $dbo->fetchArray("SELECT co_documenti.id, IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM co_documenti JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE reversed = 1 AND ref_documento=".prepare($id_record));
+
+ // Blocco gestito dallo stato della Fattura Elettronica
+ $stato_fe = $database->fetchOne('SELECT * FROM fe_stati_documento WHERE codice = '.prepare($fattura->codice_stato_fe));
+ $abilita_genera = empty($fattura->codice_stato_fe) || intval($stato_fe['is_generabile']);
}
diff --git a/modules/fatture/modutil.php b/modules/fatture/modutil.php
index c6b9e1ae0..53f4eaef0 100755
--- a/modules/fatture/modutil.php
+++ b/modules/fatture/modutil.php
@@ -237,7 +237,7 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
}
// Lettura info fattura
- $query = 'SELECT *, co_documenti.data_competenza, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipodoc` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
+ $query = 'SELECT *, co_documenti.data_competenza, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipo` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
$rs = $dbo->fetchArray($query);
$n = sizeof($rs);
$data = $rs[0]['data_competenza'];
@@ -256,9 +256,9 @@ function aggiungi_movimento($iddocumento, $dir, $primanota = 0)
// Abbreviazioni contabili dei movimenti
$tipodoc = '';
- if ($rs[0]['descrizione_tipodoc'] == 'Nota di credito') {
+ if ($rs[0]['descrizione_tipo'] == 'Nota di credito') {
$tipodoc = 'Nota di credito';
- } elseif ($rs[0]['descrizione_tipodoc'] == 'Nota di debito') {
+ } elseif ($rs[0]['descrizione_tipo'] == 'Nota di debito') {
$tipodoc = 'Nota di debito';
} else {
$tipodoc = 'Fattura';
diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php
index d5a3d73bd..528a6af72 100755
--- a/modules/fatture/src/Fattura.php
+++ b/modules/fatture/src/Fattura.php
@@ -24,6 +24,7 @@ use Carbon\Carbon;
use Common\Components\Component;
use Common\Document;
use Illuminate\Database\Eloquent\Builder;
+use Models\Upload;
use Modules\Anagrafiche\Anagrafica;
use Modules\Banche\Banca;
use Modules\Fatture\Gestori\Bollo as GestoreBollo;
@@ -474,6 +475,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.
*
diff --git a/plugins/exportFE/actions.php b/plugins/exportFE/actions.php
index dd522e2d4..ba2c35f36 100755
--- a/plugins/exportFE/actions.php
+++ b/plugins/exportFE/actions.php
@@ -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,
]);
diff --git a/plugins/exportFE/edit.php b/plugins/exportFE/edit.php
index 5f28a2f8c..6e7c8f476 100755
--- a/plugins/exportFE/edit.php
+++ b/plugins/exportFE/edit.php
@@ -19,18 +19,20 @@
include_once __DIR__.'/init.php';
+use Models\Upload;
use Plugins\ExportFE\FatturaElettronica;
use Plugins\ExportFE\Interaction;
+use Util\XML;
-/* per le PA EC02 e EC01 sono dei stati successivi a NE il quale a sua volta è successivo a RC. EC01 e EC02 sono definiti all'interno della ricevuta di NE che di fatto indica il rifiuto o l'accettazione.*/
-$abilita_genera = empty($fattura->codice_stato_fe) || in_array($fattura->codice_stato_fe, ['GEN', 'NS', 'EC02', 'ERR']);
+/* Per le PA EC02 e EC01 sono dei stati successivi a NE il quale a sua volta è successivo a RC. EC01 e EC02 sono definiti all'interno della ricevuta di NE che di fatto indica il rifiuto o l'accettazione. */
+$stato_fe = $database->fetchOne('SELECT * FROM fe_stati_documento WHERE codice = '.prepare($fattura->codice_stato_fe));
+$abilita_genera = (empty($fattura->codice_stato_fe) && $fattura->stato->descrizione != 'Bozza') || intval($stato_fe['is_generabile']);
+$ricevuta_principale = $fattura->getRicevutaPrincipale();
if (!empty($fattura_pa)) {
- $disabled = false;
- $generated = $fattura_pa->isGenerated();
+ $generata = $fattura_pa->isGenerated();
} else {
- $disabled = true;
- $generated = false;
+ $generata = false;
}
$checks = FatturaElettronica::controllaFattura($fattura);
@@ -75,28 +77,30 @@ echo '
-
'.tr("Segue l'elenco completo delle notifiche/ricevute relative alla fatture elettronica di questo documento").'.
+
'.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').'.