Rimozione descrizione_stato_fe

Si devono utilizzare le descrizioni della tabella apposita.
E' anche necessario utilizzare le funzioni corrette per la formattazione delle date.

@lucasalva87 Ho sostituito i riferimenti manuali con la funzione generale *doc_references*.
This commit is contained in:
Thomas Zilio 2019-02-01 18:19:13 +01:00
parent 500bd7cade
commit ce4f76013a
9 changed files with 109 additions and 122 deletions

View File

@ -191,8 +191,11 @@ function calcola_sconto($data)
/** /**
* Restistuisce le informazioni sull'eventuale riferimento ai documenti. * Restistuisce le informazioni sull'eventuale riferimento ai documenti.
* *
* @param array $data * @param $info
* @param string $dir * @param $dir
* @param array $ignore
*
* @throws Exception
* *
* @return array * @return array
*/ */

View File

@ -201,6 +201,11 @@ class Fattura extends Document
return $this->belongsTo(Stato::class, 'idstatodocumento'); return $this->belongsTo(Stato::class, 'idstatodocumento');
} }
public function statoFE()
{
return $this->belongsTo(StatoFE::class, 'codice_stato_fe');
}
public function articoli() public function articoli()
{ {
return $this->hasMany(Components\Articolo::class, 'iddocumento'); return $this->hasMany(Components\Articolo::class, 'iddocumento');

View File

@ -0,0 +1,17 @@
<?php
namespace Modules\Fatture;
use Common\Model;
class StatoFE extends Model
{
public $incrementing = false;
protected $table = 'fe_stati_documento';
protected $primaryKey = 'codice';
public function fatture()
{
return $this->hasMany(Fattura::class, 'codice_stato_fe');
}
}

View File

@ -28,7 +28,7 @@ include_once __DIR__.'/../../core.php';
<div class="col-md-3"> <div class="col-md-3">
{[ "type": "text", "label": "Data", "name": "data", "required": 1, "class": "datepicker text-center", "value": "<?php echo date('d/m/Y', strtotime($record['data'])); ?>", "extra": "" ]} {[ "type": "text", "label": "Data", "name": "data", "required": 1, "class": "datepicker text-center", "value": "<?php $record['data']; ?>", "extra": "" ]}
</div> </div>
</div> </div>

View File

@ -31,7 +31,6 @@ switch (filter('op')) {
if ($result) { if ($result) {
database()->update('co_documenti', [ database()->update('co_documenti', [
'codice_stato_fe' => 'WAIT', 'codice_stato_fe' => 'WAIT',
'descrizione_stato_fe' => 'Fattura in elaborazione...',
'data_stato_fe' => date('Y-m-d H:i:s'), 'data_stato_fe' => date('Y-m-d H:i:s'),
], ['id' => $id_record]); ], ['id' => $id_record]);
} }

View File

@ -152,7 +152,7 @@ echo '
</a>'; </a>';
// Scelgo quando posso inviarla // Scelgo quando posso inviarla
$send = Interaction::isEnabled() && $generated && in_array( $record['codice_stato_fe'], array('GEN', 'ERVAL') ); $send = Interaction::isEnabled() && $generated && in_array($record['codice_stato_fe'], ['GEN', 'ERVAL']);
echo ' echo '
@ -163,31 +163,25 @@ echo '
</button><br><br>'; </button><br><br>';
// Messaggio esito invio // Messaggio esito invio
if ($record['codice_stato_fe'] == 'GEN') {
if ($send){ echo '
if ($record['codice_stato_fe'] == '') { <div class="alert alert-warning">'.tr("La fattura è stata generata ed è pronta per l'invio").'.</div>
} elseif ($record['codice_stato_fe'] == 'GEN') {
echo '
<div class="alert alert-warning">'.tr('La fattura è stata generata ed è pronta per l\'invio.').'</div>
'; ';
} else { } else {
$stato_fe = database()->fetchOne('SELECT codice, descrizione, icon FROM fe_stati_documento WHERE codice='.prepare($record['codice_stato_fe'])); $stato_fe = database()->fetchOne('SELECT codice, descrizione, icon FROM fe_stati_documento WHERE codice='.prepare($record['codice_stato_fe']));
if (in_array($stato_fe['codice'], array('EC01', 'RC'))) { if (in_array($stato_fe['codice'], ['EC01', 'RC'])) {
$class = 'success'; $class = 'success';
} elseif (in_array($stato_fe['codice'], array('ERVAL', 'GEN', 'MC', 'WAIT'))) { } elseif (in_array($stato_fe['codice'], ['ERVAL', 'GEN', 'MC', 'WAIT'])) {
$class = 'warning'; $class = 'warning';
} else { } else {
$class = 'danger'; $class = 'danger';
} }
echo ' echo '
<div class="alert text-left alert-'.$class.'"><big><i class="'.$stato_fe['icon'].'" style="color:#fff;"></i> <b>'.$record['codice_stato_fe'].'</b> - '.$record['descrizione_stato_fe'].'</big> <div class="pull-right"><i class="fa fa-clock-o"></i> '.date('d/m/Y H:i', strtotime($record['data_stato_fe'])).'</small></div> <div class="alert text-left alert-'.$class.'"><big><i class="'.$stato_fe['icon'].'" style="color:#fff;"></i> <b>'.$stato_fe['codice'].'</b> - '.$stato_fe['descrizione'].'</big> <div class="pull-right"><i class="fa fa-clock-o"></i> '.Translator::timestampToLocale($record['data_stato_fe']).'</small></div>
'; ';
} }
}
echo ' echo '
<script> <script>

View File

@ -274,6 +274,7 @@ class FatturaElettronica
database()->update('co_documenti', [ database()->update('co_documenti', [
'progressivo_invio' => $this->getDocumento()['progressivo_invio'], 'progressivo_invio' => $this->getDocumento()['progressivo_invio'],
'codice_stato_fe' => 'GEN', 'codice_stato_fe' => 'GEN',
'data_stato_fe' => date('Y-m-d H:i:s'),
], ['id' => $this->getDocumento()['id']]); ], ['id' => $this->getDocumento()['id']]);
return ($result === false) ? null : $filename; return ($result === false) ? null : $filename;
@ -286,11 +287,11 @@ class FatturaElettronica
*/ */
public function getFilename($new = false) public function getFilename($new = false)
{ {
if (!empty(setting('Terzo intermediario'))) {
if (!empty(setting('Terzo intermediario'))) $anagrafica = Anagrafica::find(setting('Terzo intermediario'));
$anagrafica = Anagrafica::find(setting('Terzo intermediario')); } else {
else $anagrafica = static::getAzienda();
$anagrafica = static::getAzienda(); }
$prefix = 'IT'.(!empty($anagrafica['codice_fiscale']) ? $anagrafica['codice_fiscale'] : $anagrafica['piva']); $prefix = 'IT'.(!empty($anagrafica['codice_fiscale']) ? $anagrafica['codice_fiscale'] : $anagrafica['piva']);
@ -360,13 +361,14 @@ class FatturaElettronica
*/ */
protected static function getDatiTrasmissione($fattura) protected static function getDatiTrasmissione($fattura)
{ {
// Se in impostazioni ho definito un terzo intermediario (es. Aruba, Teamsystem) // Se in impostazioni ho definito un terzo intermediario (es. Aruba, Teamsystem)
if (!empty(setting('Terzo intermediario'))) if (!empty(setting('Terzo intermediario'))) {
$anagrafica = Anagrafica::find(setting('Terzo intermediario')); $anagrafica = Anagrafica::find(setting('Terzo intermediario'));
else } else {
$anagrafica = static::getAzienda(); $anagrafica = static::getAzienda();
}
$documento = $fattura->getDocumento(); $documento = $fattura->getDocumento();
$cliente = $fattura->getCliente(); $cliente = $fattura->getCliente();
$sede = database()->fetchOne('SELECT `codice_destinatario` FROM `an_sedi` WHERE `id` = '.prepare($documento['idsede'])); $sede = database()->fetchOne('SELECT `codice_destinatario` FROM `an_sedi` WHERE `id` = '.prepare($documento['idsede']));
@ -382,15 +384,15 @@ class FatturaElettronica
$default_code = ($cliente->nazione->iso2 != 'IT') ? 'XXXXXXX' : $default_code; $default_code = ($cliente->nazione->iso2 != 'IT') ? 'XXXXXXX' : $default_code;
// Generazione dell'header // Generazione dell'header
// Se all'Anagrafe Tributaria il trasmittente è censito con il codice fiscale, es. ditte individuali // Se all'Anagrafe Tributaria il trasmittente è censito con il codice fiscale, es. ditte individuali
$result = [ $result = [
'IdTrasmittente' => [ 'IdTrasmittente' => [
'IdPaese' => $anagrafica->nazione->iso2, 'IdPaese' => $anagrafica->nazione->iso2,
'IdCodice' => (!empty($anagrafica['codice_fiscale'])) ? $anagrafica['codice_fiscale'] : $anagrafica['piva'], 'IdCodice' => (!empty($anagrafica['codice_fiscale'])) ? $anagrafica['codice_fiscale'] : $anagrafica['piva'],
] ],
]; ];
$result[] = [ $result[] = [
'ProgressivoInvio' => $documento['progressivo_invio'], 'ProgressivoInvio' => $documento['progressivo_invio'],
'FormatoTrasmissione' => ($cliente['tipo'] == 'Ente pubblico') ? 'FPA12' : 'FPR12', 'FormatoTrasmissione' => ($cliente['tipo'] == 'Ente pubblico') ? 'FPA12' : 'FPR12',
'CodiceDestinatario' => !empty($cliente['codice_destinatario']) ? $cliente['codice_destinatario'] : $default_code, 'CodiceDestinatario' => !empty($cliente['codice_destinatario']) ? $cliente['codice_destinatario'] : $default_code,
@ -497,15 +499,14 @@ class FatturaElettronica
*/ */
protected static function getCedentePrestatore($fattura) protected static function getCedentePrestatore($fattura)
{ {
$documento = $fattura->getDocumento();
$documento = $fattura->getDocumento(); //Fattura per conto terzi, il cliente diventa il cedente al posto della mia Azienda (fornitore)
if ($documento['is_fattura_conto_terzi']) {
//Fattura per conto terzi, il cliente diventa il cedente al posto della mia Azienda (fornitore) $azienda = $fattura->getCliente();
if ($documento['is_fattura_conto_terzi']){ } else {
$azienda = $fattura->getCliente(); $azienda = static::getAzienda();
}else{ }
$azienda = static::getAzienda();
}
$result = [ $result = [
'DatiAnagrafici' => static::getDatiAnagrafici($azienda, true), 'DatiAnagrafici' => static::getDatiAnagrafici($azienda, true),
@ -557,15 +558,14 @@ class FatturaElettronica
*/ */
protected static function getCessionarioCommittente($fattura) protected static function getCessionarioCommittente($fattura)
{ {
$documento = $fattura->getDocumento();
$documento = $fattura->getDocumento(); //Fattura per conto terzi, la mia Azienda (fornitore) diventa il cessionario al posto del cliente
if ($documento['is_fattura_conto_terzi']) {
//Fattura per conto terzi, la mia Azienda (fornitore) diventa il cessionario al posto del cliente $cliente = static::getAzienda();
if ($documento['is_fattura_conto_terzi']){ } else {
$cliente = static::getAzienda(); $cliente = $fattura->getCliente();
}else{ }
$cliente = $fattura->getCliente();
}
$result = [ $result = [
'DatiAnagrafici' => static::getDatiAnagrafici($cliente), 'DatiAnagrafici' => static::getDatiAnagrafici($cliente),
@ -609,19 +609,18 @@ class FatturaElettronica
// TODO: 'Causale' => $documento['causale'], // TODO: 'Causale' => $documento['causale'],
]; ];
$righe = $fattura->getRighe(); $righe = $fattura->getRighe();
// Ritenuta d'Acconto // Ritenuta d'Acconto
$id_ritenuta = null; $id_ritenuta = null;
$totale_ritenutaacconto = 0; $totale_ritenutaacconto = 0;
// Rivalsa // Rivalsa
$id_rivalsainps = null; $id_rivalsainps = null;
$totale_rivalsainps = 0; $totale_rivalsainps = 0;
foreach ($righe as $riga) { foreach ($righe as $riga) {
if (!empty($riga['idritenutaacconto']) and empty($riga['is_descrizione']) ) { if (!empty($riga['idritenutaacconto']) and empty($riga['is_descrizione'])) {
$id_ritenuta = $riga['idritenutaacconto']; $id_ritenuta = $riga['idritenutaacconto'];
$totale_ritenutaacconto += $riga['ritenutaacconto']; $totale_ritenutaacconto += $riga['ritenutaacconto'];
} }
@ -893,13 +892,13 @@ class FatturaElettronica
$riga['qta'] = abs($riga['qta']); $riga['qta'] = abs($riga['qta']);
$riga['sconto'] = abs($riga['sconto']); $riga['sconto'] = abs($riga['sconto']);
//Fix per righe di tipo descrizione, copio idiva dalla prima riga del documento che non è di tipo descrizione, riportando di conseguenza eventuali % e/o nature // Fix per righe di tipo descrizione, copio idiva dalla prima riga del documento che non è di tipo descrizione, riportando di conseguenza eventuali % e/o nature
if (!empty($riga['is_descrizione'])) { if (!empty($riga['is_descrizione'])) {
$riga['idiva'] = $database->fetchOne('SELECT `idiva` FROM `co_righe_documenti` WHERE `is_descrizione` = 0 AND `iddocumento` = '.prepare($documento['id']))['idiva']; $riga['idiva'] = $database->fetchOne('SELECT `idiva` FROM `co_righe_documenti` WHERE `is_descrizione` = 0 AND `iddocumento` = '.prepare($documento['id']))['idiva'];
} }
//Fix per qta, deve sempre essere impostata almeno a 1 // Fix per qta, deve sempre essere impostata almeno a 1
$riga['qta'] = (!empty($riga['qta'])) ? $riga['qta'] : 1; $riga['qta'] = !empty($riga['qta']) ? $riga['qta'] : 1;
$prezzo_unitario = $riga['subtotale'] / $riga['qta']; $prezzo_unitario = $riga['subtotale'] / $riga['qta'];
$prezzo_totale = $riga['subtotale'] - $riga['sconto']; $prezzo_totale = $riga['subtotale'] - $riga['sconto'];
@ -928,42 +927,16 @@ class FatturaElettronica
$dettaglio['CodiceArticolo'] = $codice_articolo; $dettaglio['CodiceArticolo'] = $codice_articolo;
} }
//Non ammesso // Non ammesso
//$descrizione = html_entity_decode($riga['descrizione'], ENT_HTML5, 'UTF-8'); // $descrizione = html_entity_decode($riga['descrizione'], ENT_HTML5, 'UTF-8');
$descrizione = str_replace('&gt;', ' ', $riga['descrizione']); $descrizione = str_replace('&gt;', ' ', $riga['descrizione']);
$descrizione = str_replace('…', '...', $descrizione); $descrizione = str_replace('…', '...', $descrizione);
$dettaglio['Descrizione'] = str_replace('', ' ', $descrizione); $dettaglio['Descrizione'] = str_replace('', ' ', $descrizione);
//Aggiungo il riferimento della riga alla descrizione $ref = doc_references($riga, 'entrata', ['iddocumento']);
$rif = ''; if (!empty($ref)) {
if (!empty($riga['idordine'])) { $dettaglio['Descrizione'] .= "\n".$ref['description'];
$data = $database->fetchArray("SELECT IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM or_ordini WHERE id=".prepare($riga['idordine']));
$rif = 'ordine';
}
// DDT
elseif (!empty($riga['idddt'])) {
$data = $database->fetchArray("SELECT IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM dt_ddt WHERE id=".prepare($riga['idddt']));
$rif = 'ddt';
}
// Preventivo
elseif (!empty($riga['idpreventivo'])) {
$data = $database->fetchArray('SELECT numero, data_bozza AS data FROM co_preventivi WHERE id='.prepare($riga['idpreventivo']));
$rif = 'preventivo';
}
// Contratto
elseif (!empty($riga['idcontratto'])) {
$data = $database->fetchArray('SELECT numero, data_bozza AS data FROM co_contratti WHERE id='.prepare($riga['idcontratto']));
$rif = 'contratto';
}
// Intervento
elseif (!empty($riga['idintervento'])) {
$data = $database->fetchArray('SELECT codice AS numero, IFNULL( (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), data_richiesta) AS data FROM in_interventi WHERE id='.prepare($riga['idintervento']));
$rif = 'intervento';
}
if(!empty($rif)){
$dettaglio['Descrizione'] .= "\nRif. ".$rif." n.".$data[0]['numero']." del ".date('d/m/Y', strtotime($data[0]['data']));
} }
$dettaglio['Quantita'] = $riga['qta']; $dettaglio['Quantita'] = $riga['qta'];
@ -1016,10 +989,9 @@ class FatturaElettronica
} }
// AltriDatiGestionali (2.2.1.16) - Ritenuta ENASARCO // AltriDatiGestionali (2.2.1.16) - Ritenuta ENASARCO
//https://forum.italia.it/uploads/default/original/2X/d/d35d721c3a3a601d2300378724a270154e23af52.jpeg // https://forum.italia.it/uploads/default/original/2X/d/d35d721c3a3a601d2300378724a270154e23af52.jpeg
if (!empty($documento['id_ritenuta_contributi'])) { if (!empty($documento['id_ritenuta_contributi'])) {
$percentuale = database()->fetchOne('SELECT percentuale FROM co_ritenuta_contributi WHERE id = '.prepare($documento['id_ritenuta_contributi']))['percentuale'];
$percentuale = database()->fetchOne('SELECT percentuale FROM co_ritenuta_contributi WHERE id = '.prepare($documento['id_ritenuta_contributi']))['percentuale'];
$ritenutaenasarco = [ $ritenutaenasarco = [
'TipoDato' => 'CASSA-PREV', 'TipoDato' => 'CASSA-PREV',

View File

@ -44,7 +44,6 @@ class Ricevuta
$data = $this->xml['DataOraRicezione']; $data = $this->xml['DataOraRicezione'];
$this->fattura->codice_stato_fe = $codice; $this->fattura->codice_stato_fe = $codice;
$this->fattura->descrizione_stato_fe = $descrizione;
$this->fattura->data_stato_fe = date('Y-m-d H:i:s', strtotime($data)); $this->fattura->data_stato_fe = date('Y-m-d H:i:s', strtotime($data));
$this->fattura->save(); $this->fattura->save();

View File

@ -51,9 +51,7 @@ UPDATE `fe_stati_documento` SET `descrizione`='In elaborazione' WHERE `codice`='
-- Inserito stato errore interno OSM -- Inserito stato errore interno OSM
INSERT INTO `fe_stati_documento`( `codice`, `descrizione`, `icon` ) VALUES( 'ERVAL', 'Errore di validazione', 'fa fa-edit text-danger' ); INSERT INTO `fe_stati_documento`( `codice`, `descrizione`, `icon` ) VALUES( 'ERVAL', 'Errore di validazione', 'fa fa-edit text-danger' );
ALTER TABLE `co_documenti` ADD `data_stato_fe` TIMESTAMP;
ALTER TABLE `co_documenti` ADD `descrizione_stato_fe` TEXT NOT NULL AFTER `codice_stato_fe`;
ALTER TABLE `co_documenti` ADD `data_stato_fe` TIMESTAMP NOT NULL AFTER `descrizione_stato_fe`;
-- Rimozione iva eliminata -- Rimozione iva eliminata
UPDATE `zz_settings` SET `tipo`='query=SELECT id, descrizione FROM `co_iva` WHERE deleted_at IS NULL ORDER BY descrizione ASC' WHERE `nome`='Iva predefinita'; UPDATE `zz_settings` SET `tipo`='query=SELECT id, descrizione FROM `co_iva` WHERE deleted_at IS NULL ORDER BY descrizione ASC' WHERE `nome`='Iva predefinita';