This commit is contained in:
Fabio Lovato 2019-01-22 08:59:24 +01:00
commit 5d536fa1e6
35 changed files with 603 additions and 129 deletions

View File

@ -10,6 +10,7 @@ return [
'modules/fatture' => 'Modules\Fatture',
'modules/ordini' => 'Modules\Ordini',
'modules/preventivi' => 'Modules\Preventivi',
'modules/contratti' => 'Modules\Contratti',
'modules/interventi' => 'Modules\Interventi',
'plugins/exportFE' => 'Plugins\ExportFE',
'plugins/importFE' => 'Plugins\ImportFE',

View File

@ -117,7 +117,7 @@ if (App::debug()) {
'message' => $exception->getMessage(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => null,
'trace' => $exception->getTraceAsString(),
]);
});
}

View File

@ -70,7 +70,7 @@ class Anagrafica extends Model
$new_numero = $rs[0]['max_numero'] + 1;
$new_numero = str_pad($new_numero, 6, '0', STR_PAD_LEFT);
$database->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES('.prepare($new_numero).', '.prepare(post('ragione_sociale')).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Crediti clienti e crediti diversi'), 1, 1)");
$database->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES('.prepare($new_numero).', '.prepare($anagrafica->ragione_sociale).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Crediti clienti e crediti diversi'), 1, 1)");
$idconto = $database->lastInsertedID();
// Collegamento conto
@ -90,7 +90,7 @@ class Anagrafica extends Model
$new_numero = $rs[0]['max_numero'] + 1;
$new_numero = str_pad($new_numero, 6, '0', STR_PAD_LEFT);
$database->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES('.prepare($new_numero).', '.prepare(post('ragione_sociale')).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Debiti fornitori e debiti diversi'), 1, 1)");
$database->query('INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES('.prepare($new_numero).', '.prepare($anagrafica->ragione_sociale).", (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Debiti fornitori e debiti diversi'), 1, 1)");
$idconto = $database->lastInsertedID();
// Collegamento conto

View File

@ -2,40 +2,24 @@
include_once __DIR__.'/../../core.php';
use Modules\Anagrafiche\Anagrafica;
use Modules\Contratti\Components\Articolo;
use Modules\Contratti\Components\Riga;
use Modules\Contratti\Contratto;
switch (post('op')) {
case 'add':
$idanagrafica = post('idanagrafica');
$nome = post('nome');
// Verifico se c'è già un agente collegato all'anagrafica cliente, così lo imposto già
$q = 'SELECT idagente FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica);
$rs = $dbo->fetchArray($q);
$idagente = $rs[0]['idagente'];
$anagrafica = Anagrafica::find($idanagrafica);
// Codice contratto: calcolo il successivo in base al formato specificato
$rs = $dbo->fetchArray('SELECT numero FROM co_contratti ORDER BY id DESC LIMIT 0,1');
$numero = Util\Generator::generate(setting('Formato codice contratti'), $rs[0]['numero']);
$contratto = Contratto::build($anagrafica, $nome);
$id_record = $contratto->id;
// Uso il tipo di pagamento specificato in anagrafica se c'è, altrimenti quello di default
$rsa = $dbo->fetchArray('SELECT idpagamento_vendite AS idpagamento FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica));
$idpagamento = (!empty($rsa[0]['idpagamento'])) ? $rsa[0]['idpagamento'] : setting('Tipo di pagamento predefinito');
if (post('idanagrafica') !== null) {
$dbo->query('INSERT INTO co_contratti(idanagrafica, nome, numero, idagente, idpagamento, idstato, data_bozza) VALUES ('.prepare($idanagrafica).', '.prepare($nome).', '.prepare($numero).', '.prepare($idagente).', '.prepare($idpagamento).", (SELECT `id` FROM `co_staticontratti` WHERE `descrizione`='Bozza'), NOW())");
$id_record = $dbo->lastInsertedID();
// Aggiunta associazioni costi unitari al contratto
$rsi = $dbo->fetchArray('SELECT * FROM in_tipiintervento WHERE (costo_orario!=0 OR costo_km!=0 OR costo_diritto_chiamata!=0)');
for ($i = 0; $i < sizeof($rsi); ++$i) {
$dbo->query('INSERT INTO co_contratti_tipiintervento(idcontratto, idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico) VALUES('.prepare($id_record).', '.prepare($rsi[$i]['idtipointervento']).', '.prepare($rsi[$i]['costo_orario']).', '.prepare($rsi[$i]['costo_km']).', '.prepare($rsi[$i]['costo_diritto_chiamata']).', '.prepare($rsi[$i]['costo_orario_tecnico']).', '.prepare($rsi[$i]['costo_km_tecnico']).', '.prepare($rsi[$i]['costo_diritto_chiamata_tecnico']).')');
}
flash()->info(tr('Aggiunto contratto numero _NUM_!', [
'_NUM_' => $numero,
]));
}
flash()->info(tr('Aggiunto contratto numero _NUM_!', [
'_NUM_' => $contratto['numero'],
]));
break;

View File

@ -142,7 +142,7 @@ if ($record['stato'] == 'Emessa') {
<div class="panel-body">
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Identificatore Documento'); ?>", "help": "<?php echo tr("<span>Obbligatorio per valorizzare CIG/CUP. &Egrave; possible inserire: </span><ul><li>N. determina</li><li>RDO</li><li>Ordine MEPA</li></ul>"); ?>","name": "id_documento_fe", "required": 0, "value": "$id_documento_fe$", "maxlength": 20 ]}
{[ "type": "text", "label": "<?php echo tr('Identificatore Documento'); ?>", "help": "<?php echo tr('<span>Obbligatorio per valorizzare CIG/CUP. &Egrave; possible inserire: </span><ul><li>N. determina</li><li>RDO</li><li>Ordine MEPA</li></ul>'); ?>","name": "id_documento_fe", "required": 0, "value": "$id_documento_fe$", "maxlength": 20 ]}
</div>
<div class="col-md-4">

View File

@ -32,7 +32,7 @@ $result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita');
// Aggiunta sconto di default da listino per le vendite
$listino = $dbo->fetchArray('SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_listini ON an_anagrafiche.idlistino_vendite=mg_listini.id WHERE idanagrafica='.prepare($idanagrafica));
if( $listino[0]['prc_guadagno'] > 0 ){
if ($listino[0]['prc_guadagno'] > 0) {
$result['sconto_unitario'] = $listino[0]['prc_guadagno'];
$result['tipo_sconto'] = 'PRC';
}

View File

@ -0,0 +1,58 @@
<?php
namespace Modules\Contratti\Components;
use Common\Components\Article;
use Modules\Articoli\Articolo as Original;
use Modules\Contratti\Contratto;
class Articolo extends Article
{
use RelationTrait;
protected $table = 'co_righe_contratti';
/**
* Crea un nuovo articolo collegato ad una contratto.
*
* @param Contratto $contratto
* @param Original $articolo
*
* @return self
*/
public static function build(Contratto $contratto, Original $articolo)
{
$model = parent::build($contratto, $articolo);
return $model;
}
public function movimenta($qta)
{
$contratto = $this->contratto;
$tipo = $contratto->tipo;
$numero = $contratto->numero_esterno ?: $contratto->numero;
$data = $contratto->data;
$carico = ($tipo->dir == 'entrata') ? tr('Ripristino articolo da _TYPE_ _NUM_') : tr('Carico magazzino da _TYPE_ numero _NUM_');
$scarico = ($tipo->dir == 'entrata') ? tr('Scarico magazzino per _TYPE_ numero _NUM_') : tr('Rimozione articolo da _TYPE_ _NUM_');
$qta = ($tipo->dir == 'uscita') ? -$qta : $qta;
$movimento = ($qta < 0) ? $carico : $scarico;
$movimento = replace($movimento, [
'_TYPE_' => $tipo->descrizione,
'_NUM_' => $numero,
]);
$this->articolo->movimenta(-$qta, $movimento, $data, false, [
'iddocumento' => $contratto->id,
]);
}
public function getDirection()
{
return $this->contratto->tipo->dir;
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Modules\Contratti\Components;
use Common\Components\Description;
use Modules\Contratti\Contratto;
class Descrizione extends Description
{
use RelationTrait;
protected $table = 'co_righe_contratti';
/**
* Crea una nuova riga collegata ad una contratto.
*
* @param Contratto $contratto
*
* @return self
*/
public static function build(Contratto $contratto)
{
$model = parent::build($contratto);
return $model;
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace Modules\Contratti\Components;
use Modules\Contratti\Contratto;
trait RelationTrait
{
public function getParentID()
{
return 'idcontratto';
}
public function parent()
{
return $this->belongsTo(Contratto::class, $this->getParentID());
}
public function contratto()
{
return $this->parent();
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Modules\Contratti\Components;
use Common\Components\Row;
use Modules\Contratti\Contratto;
class Riga extends Row
{
use RelationTrait;
protected $table = 'co_righe_contratti';
/**
* Crea una nuova riga collegata ad una contratto.
*
* @param Contratto $contratto
*
* @return self
*/
public static function build(Contratto $contratto)
{
$model = parent::build($contratto);
return $model;
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace Modules\Contratti\Components;
use Common\Components\Discount;
use Modules\Contratti\Contratto;
class Sconto extends Discount
{
use RelationTrait;
protected $table = 'co_righe_contratti';
/**
* Crea una nuovo sconto globale collegato alla contratto, oppure restituisce quello esistente.
*
* @param Contratto $contratto
*
* @return self
*/
public static function build(Contratto $contratto)
{
$model = $contratto->scontoGlobale;
if ($model == null) {
$model = parent::build();
$model->setContratto($contratto);
}
return $model;
}
}

View File

@ -0,0 +1,157 @@
<?php
namespace Modules\Contratti;
use Carbon\Carbon;
use Common\Document;
use Modules\Anagrafiche\Anagrafica;
use Modules\Interventi\TipoSessione;
use Traits\RecordTrait;
use Util\Generator;
class Contratto extends Document
{
use RecordTrait;
protected $table = 'co_contratti';
/**
* Crea un nuovo contratto.
*
* @param Anagrafica $anagrafica
* @param string $nome
*
* @return self
*/
public static function build(Anagrafica $anagrafica, $nome)
{
$model = parent::build();
$stato_documento = Stato::where('descrizione', 'Bozza')->first();
$id_anagrafica = $anagrafica->id;
$id_agente = $anagrafica->idagente;
$id_pagamento = $anagrafica->idpagamento_vendite;
if (empty($id_pagamento)) {
$id_pagamento = setting('Tipo di pagamento predefinito');
}
$model->anagrafica()->associate($anagrafica);
$model->stato()->associate($stato_documento);
$model->numero = static::getNextNumero();
// Salvataggio delle informazioni
$model->nome = $nome;
$model->data_bozza = Carbon::now();
if (!empty($id_agente)) {
$model->idagente = $id_agente;
}
if (!empty($id_pagamento)) {
$model->idpagamento = $id_pagamento;
}
$model->save();
$model->fixTipiSessioni();
return $model;
}
public function fixTipiSessioni()
{
$database = database();
$database->query('DELETE FROM co_contratti_tipiintervento WHERE idcontratto = '.prepare($this->id));
// Aggiunta associazioni costi unitari al contratto
$tipi = TipoSessione::where('costo_orario', '<>', 0)
->where('costo_km', '<>', 0)
->where('costo_diritto_chiamata', '<>', 0)
->get();
foreach ($tipi as $tipo) {
$database->insert('co_contratti_tipiintervento', [
'idcontratto' => $this->id,
'idtipointervento' => $tipo->id,
'costo_ore' => $tipo->costo_orario,
'costo_km' => $tipo->costo_km,
'costo_dirittochiamata' => $tipo->costo_diritto_chiamata,
'costo_ore_tecnico' => $tipo->costo_orario_tecnico,
'costo_km_tecnico' => $tipo->costo_km_tecnico,
'costo_dirittochiamata_tecnico' => $tipo->costo_diritto_chiamata_tecnico,
]);
}
}
/**
* Restituisce il nome del modulo a cui l'oggetto è collegato.
*
* @return string
*/
public function getModuleAttribute()
{
return 'Contratti';
}
public function updateSconto()
{
// Aggiornamento sconto
aggiorna_sconto([
'parent' => 'co_preventivi',
'row' => 'co_righe_preventivi',
], [
'parent' => 'id',
'row' => 'idcontratto',
], $this->id);
}
public function anagrafica()
{
return $this->belongsTo(Anagrafica::class, 'idanagrafica');
}
public function stato()
{
return $this->belongsTo(Stato::class, 'idstato');
}
public function articoli()
{
return $this->hasMany(Components\Articolo::class, 'idcontratto');
}
public function righe()
{
return $this->hasMany(Components\Riga::class, 'idcontratto');
}
public function descrizioni()
{
return $this->hasMany(Components\Descrizione::class, 'idcontratto');
}
public function scontoGlobale()
{
return $this->hasOne(Components\Sconto::class, 'idcontratto');
}
// Metodi statici
/**
* Calcola il nuovo numero di contratto.
*
* @return string
*/
public static function getNextNumero()
{
$maschera = setting('Formato codice contratti');
$ultimo = Generator::getPreviousFrom($maschera, 'co_contratti', 'numero');
$numero = Generator::generate($maschera, $ultimo);
return $numero;
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace Modules\Contratti;
use Common\Model;
class Stato extends Model
{
protected $table = 'co_staticontratti';
public function preventivi()
{
return $this->hasMany(Contratto::class, 'idstato');
}
}

View File

@ -31,7 +31,7 @@ switch (post('op')) {
flash()->info(tr('Aggiunto ddt in _TYPE_ numero _NUM_!', [
'_TYPE_' => $dir,
'_NUM_' => $numero,
'_NUM_' => $ddt->numero,
]));
break;

View File

@ -116,7 +116,7 @@ $_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Porto'); ?>", "name": "idporto", "placeholder": "-", "help": "<?php echo tr("<ul><li>Franco: pagamento del trasporto a carico del mittente</li> <li>Assegnato pagamento del trasporto a carico del destinatario</li> </ul>"); ?>", "values": "query=SELECT id, descrizione FROM dt_porto ORDER BY descrizione ASC", "value": "$idporto$", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Porto'); ?>", "name": "idporto", "placeholder": "-", "help": "<?php echo tr('<ul><li>Franco: pagamento del trasporto a carico del mittente</li> <li>Assegnato pagamento del trasporto a carico del destinatario</li> </ul>'); ?>", "values": "query=SELECT id, descrizione FROM dt_porto ORDER BY descrizione ASC", "value": "$idporto$", "readonly": "<?php echo $record['flag_completato']; ?>" ]}
</div>
<div class="col-md-3">

View File

@ -38,7 +38,7 @@ $result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita');
// Aggiunta sconto di default da listino per le vendite
$listino = $dbo->fetchArray('SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_listini ON an_anagrafiche.idlistino_'.($dir == 'uscita' ? 'acquisti' : 'vendite').'=mg_listini.id WHERE idanagrafica='.prepare($idanagrafica));
if( $listino[0]['prc_guadagno'] > 0 ){
if ($listino[0]['prc_guadagno'] > 0) {
$result['sconto_unitario'] = $listino[0]['prc_guadagno'];
$result['tipo_sconto'] = 'PRC';
}

View File

@ -520,7 +520,7 @@ include $docroot.'/modules/fatture/row-list.php';
<?php
if ($dir == 'entrata') {
echo '
echo '
<div class="alert alert-info text-center">'.tr('Per allegare un documento alla fattura elettronica caricare il file specificando come categoria "Fattura Elettronica"').'.</div>';
}
?>

View File

@ -47,7 +47,7 @@ $result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita');
// Aggiunta sconto di default da listino per le vendite
$listino = $dbo->fetchArray('SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_listini ON an_anagrafiche.idlistino_'.($dir == 'uscita' ? 'acquisti' : 'vendite').'=mg_listini.id WHERE idanagrafica='.prepare($idanagrafica));
if( $listino[0]['prc_guadagno'] > 0 ){
if ($listino[0]['prc_guadagno'] > 0) {
$result['sconto_unitario'] = $listino[0]['prc_guadagno'];
$result['tipo_sconto'] = 'PRC';
}

View File

@ -32,7 +32,7 @@ switch (post('op')) {
$id_record = $ordine->id;
flash()->info(tr('Aggiunto ordine numero _NUM_!', [
'_NUM_' => $numero,
'_NUM_' => $ordine->numero,
]));
break;

View File

@ -38,7 +38,7 @@ $result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita');
// Aggiunta sconto di default da listino per le vendite
$listino = $dbo->fetchArray('SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_listini ON an_anagrafiche.idlistino_'.($dir == 'uscita' ? 'acquisti' : 'vendite').'=mg_listini.id WHERE idanagrafica='.prepare($idanagrafica));
if( $listino[0]['prc_guadagno'] > 0 ){
if ($listino[0]['prc_guadagno'] > 0) {
$result['sconto_unitario'] = $listino[0]['prc_guadagno'];
$result['tipo_sconto'] = 'PRC';
}

View File

@ -32,7 +32,7 @@ $result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita');
// Aggiunta sconto di default da listino per le vendite
$listino = $dbo->fetchArray('SELECT prc_guadagno FROM an_anagrafiche INNER JOIN mg_listini ON an_anagrafiche.idlistino_vendite=mg_listini.id WHERE idanagrafica='.prepare($idanagrafica));
if( $listino[0]['prc_guadagno'] > 0 ){
if ($listino[0]['prc_guadagno'] > 0) {
$result['sconto_unitario'] = $listino[0]['prc_guadagno'];
$result['tipo_sconto'] = 'PRC';
}

View File

@ -23,13 +23,13 @@ if (!empty($tecnici)) {
<tr>
<th>'.$tecnico['ragione_sociale'].'</th>
<th>'.tr('Attività').'</th>
<th>'.tr('Addebito orario').' <span class="tip" title="'.tr("Addebito al cliente").'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Addebito km').' <span class="tip" title="'.tr("Addebito al cliente").'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Addebito diritto ch.').' <span class="tip" title="'.tr("Addebito al cliente").'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Addebito orario').' <span class="tip" title="'.tr('Addebito al cliente').'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Addebito km').' <span class="tip" title="'.tr('Addebito al cliente').'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Addebito diritto ch.').' <span class="tip" title="'.tr('Addebito al cliente').'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Costo orario').' <span class="tip" title="'.tr("Costo interno").'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Costo km').' <span class="tip" title="'.tr("Costo interno").'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Costo diritto ch.').' <span class="tip" title="'.tr("Costo interno").'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Costo orario').' <span class="tip" title="'.tr('Costo interno').'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Costo km').' <span class="tip" title="'.tr('Costo interno').'"><i class="fa fa-question-circle-o"></i></span></th>
<th>'.tr('Costo diritto ch.').' <span class="tip" title="'.tr('Costo interno').'"><i class="fa fa-question-circle-o"></i></span></th>
<th width="40"></th>
</tr>';

View File

@ -141,17 +141,19 @@ echo '
<i class="fa fa-download"></i> '.tr('Scarica').'
</a>';
$file = $generated ? Models\Upload::where('filename', $fattura_pa->getFilename())->where('id_record', $id_record)->first() : null;
echo '
<i class="fa fa-arrow-right fa-fw text-muted"></i>
<a href="'.ROOTDIR.'/plugins/exportFE/view.php?id_record='.$id_record.'" class="btn btn-info btn-lg '.($generated ? '' : 'disabled').'" target="_blank" '.($generated ? '' : 'disabled').'>
<a href="'.ROOTDIR.'/view.php?file_id='.($file ? $file->id : null).'" class="btn btn-info btn-lg '.($generated ? '' : 'disabled').'" target="_blank" '.($generated ? '' : 'disabled').'>
<i class="fa fa-eye"></i> '.tr('Visualizza').'
</a>';
$send = Interaction::isEnabled() && $generated && $record['codice_stato_fe'] == 'GEN';
$send = Interaction::isEnabled() && $generated && $record['codice_stato_fe'] == 'GEN';
echo '
echo '
<i class="fa fa-arrow-right fa-fw text-muted"></i>

View File

@ -465,9 +465,10 @@ class FatturaElettronica
if (!empty($anagrafica['provincia']) && $anagrafica->nazione->iso2 == 'IT') {
$result['Provincia'] = strtoupper($anagrafica['provincia']);
}
if (!empty($anagrafica->nazione->iso2))
$result['Nazione'] = $anagrafica->nazione->iso2;
if (!empty($anagrafica->nazione->iso2)) {
$result['Nazione'] = $anagrafica->nazione->iso2;
}
return $result;
}

View File

@ -1,17 +0,0 @@
<?php
include_once __DIR__.'/init.php';
// XML
$xml = new DOMDocument();
$xml->loadXML($fattura_pa->toXML());
// XSL
$xsl = new DOMDocument();
$xsl->load(__DIR__.'/src/stylesheet-1.2.1.xsl');
// XSLT
$xslt = new XSLTProcessor();
$xslt->importStylesheet($xsl);
echo $xslt->transformToXML($xml);

View File

@ -13,7 +13,7 @@ class MessageHandler extends AbstractProcessingHandler
{
protected function write(array $record)
{
if (isAjaxRequest()) {
if (\Whoops\Util\Misc::isAjaxRequest()) {
return;
}

View File

@ -106,7 +106,18 @@ class HTMLBuilder
$json = self::decode($value, 'manager');
$class = self::getManager($json['name']);
$result = !empty($class) ? $class->manage($json) : '';
$result = '';
try {
$result = !empty($class) ? $class->manage($json) : '';
} catch (\Exception $exception) {
logger()->error($exception->getMessage(), [
'code' => $exception->getCode(),
'message' => $exception->getMessage(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => $exception->getTraceAsString(),
]);
}
// Ricorsione
if ($depth < self::$max_recursion) {
@ -121,7 +132,19 @@ class HTMLBuilder
foreach ($handlers[0] as $value) {
$json = self::decode($value, 'handler');
$result = self::generate($json);
$result = null;
try {
$result = self::generate($json);
} catch (\Exception $exception) {
logger()->error($exception->getMessage(), [
'code' => $exception->getCode(),
'message' => $exception->getMessage(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => $exception->getTraceAsString(),
]);
}
// Ricorsione
if ($depth < self::$max_recursion) {

View File

@ -2,6 +2,8 @@
namespace HTMLBuilder\Manager;
use Models\Upload;
/**
* Gestione allegati.
*
@ -77,13 +79,14 @@ class FileManager implements ManagerInterface
</tr>';
foreach ($rs as $r) {
$extension = pathinfo($r['original'])['extension'];
$file = Upload::find($r['id']);
$result .= '
<tr>
<td align="left">
<a href="'.ROOTDIR.'/'.$directory.'/'.$r['filename'].'" target="_blank">
<i class="fa fa-external-link"></i> '.$r['name'].'
</a> ('.$extension.')'.'
</a> ('.$file->extension.')'.'
</td>
<td>'.\Translator::timestampToLocale($r['created_at']).'</td>
<td class="text-center">
@ -92,31 +95,11 @@ class FileManager implements ManagerInterface
</a>';
// Anteprime supportate dal browser
$supported_extensions = ['pdf', 'jpg', 'png', 'gif', 'jpeg', 'bmp'];
if (in_array(strtolower($extension), $supported_extensions)) {
$result .= "
<div class='hide-it-off-screen' id='view-".$r['id']."'>";
if ($extension == 'pdf') {
$result .= '
<iframe src="'.\Prints::getPDFLink($directory.'/'.$r['filename']).'" frameborder="0" width="100%" height="550"></iframe>';
} else {
$result .= '
<img src="'.ROOTDIR.'/'.$directory.'/'.$r['filename'].'" width="100%"></img>';
}
if ($file->hasPreview()) {
$result .= '
</div>';
$result .= '
<button class="btn btn-xs btn-info" data-target="#bs-popup2" type="button" data-title="'.prepareToField($r['name']).' <small><em>('.$r['filename'].')</em></small>" data-href="#view-'.$r['id'].'">
<button class="btn btn-xs btn-info" data-target="#bs-popup2" type="button" data-title="'.prepareToField($r['name']).' <small style=\'color:white\'><i>('.$r['filename'].')</i></small>" data-href="'.ROOTDIR.'/view.php?file_id='.$r['id'].'">
<i class="fa fa-eye"></i>
</button>';
} elseif (strtolower($extension) == 'xml') {
$result .= '
<a class="btn btn-xs btn-info" href="'.ROOTDIR.'/plugins/exportFE/view.php?id_record='.$r['id_record'].'" target="_blank">
<i class="fa fa-eye"></i>
</a>';
} else {
$result .= '
<button class="btn btn-xs btn-default disabled" title="'.tr('Anteprima file non disponibile').'" disabled>

View File

@ -13,6 +13,66 @@ class Upload extends Model
return $this->attributes['category'] ?: 'Generale';
}
/**
* @return string|null
*/
public function getExtensionAttribute()
{
$pos = strrpos($this->filename, '.');
if (!$pos) {
return null;
}
$extension = substr($this->filename, $pos + 1);
return strtolower($extension);
}
/**
* @return string
*/
public function getFilepathAttribute()
{
$parent = $this->plugin ?: $this->module;
return $parent->upload_directory.'/'.$this->filename;
}
/**
* @return bool
*/
public function isImage()
{
$list = ['jpg', 'png', 'gif', 'jpeg', 'bmp'];
return in_array($this->extension, $list);
}
/**
* @return bool
*/
public function isFatturaElettronica()
{
return $this->extension == 'xml' && strtolower($this->category) == 'fattura elettronica';
}
/**
* @return bool
*/
public function isPDF()
{
return $this->extension == 'pdf';
}
/**
* @return bool
*/
public function hasPreview()
{
return $this->isImage() || $this->isFatturaElettronica() || $this->isPDF();
}
/* Relazioni Eloquent */
public function module()

View File

@ -100,7 +100,7 @@ class Generator
$values = array_column($replaces, 'regex');
$pattern = preg_replace('/#{1,}/', '#', $pattern);
$pattern = preg_quote($pattern, '/');
$pattern = str_replace('\\#','#',preg_quote($pattern, '/'));
$pattern = str_replace(array_keys($replaces), array_values($values), $pattern);
// Individuazione dei valori

View File

@ -1,27 +0,0 @@
<?php
use Modules\Anagrafiche\Anagrafica;
use Modules\Fatture\Fattura;
use Modules\Fatture\Tipo;
class FatturaTest extends \Codeception\Test\Unit
{
public function testCreate()
{
$data = date('Y-m-d H:i:s');
$id_anagrafica = 1;
$id_tipo = 2;
$id_segment = 1;
$anagrafica = Anagrafica::find($id_anagrafica);
$tipo = Tipo::find($id_tipo);
$fattura = Fattura::build($anagrafica, $tipo, $data, $id_segment);
$this->assertEquals($fattura->idanagrafica, 1);
$this->assertEquals($fattura->idtipodocumento, 2);
$this->assertEquals($fattura->id_segment, 1);
$this->assertEquals($fattura->data, $data);
}
}

View File

@ -0,0 +1,70 @@
<?php
use Util\Generator;
class GeneratorTest extends \Codeception\Test\Unit
{
public function testNumbersWithPrefix()
{
$this->test(null, '|TEST');
}
public function testNumbersWithSuffix()
{
$this->test('|TEST');
}
public function testCommonNumbers()
{
$this->test();
}
public function testDates()
{
$this->test('/YYYY');
$this->test('/yy');
$this->test(null, 'YYYY-');
$this->test(null, 'yy-');
}
protected function test($prefix = null, $suffix = null)
{
$date = date('Y-m-d H:i:s');
$info = Generator::dateToPattern($date);
// Individuazione valori relativi a suffisso e prefisso
$prefix_value = Generator::complete($prefix, $info);
$suffix_value = Generator::complete($suffix, $info);
$step = 3;
// Pattern di base con numero di caratteri incrementale
$pattern = $prefix.'#'.$suffix;
$previous = null;
for ($i = 0; $i < 10000; $i = $i + $step) {
$value = $prefix_value.$this->pad($i + 1, $length).$suffix_value;
$this->assertEquals($value, Generator::generate($pattern, $previous, $step, $info));
$previous = $value;
}
// Pattern con padding
$length = 5;
$pattern = $prefix.str_repeat('#', $length).$suffix;
$previous = null;
for ($i = 0; $i < 10000; $i = $i + $step) {
$value = $prefix_value.$this->pad($i + 1, $length).$suffix_value;
$this->assertEquals($value, Generator::generate($pattern, $previous, $step, $info));
$previous = $value;
}
}
protected function pad($number, $length)
{
return str_pad($number, $length, '0', STR_PAD_LEFT);
}
}

View File

@ -8,8 +8,3 @@ foreach ($namespaces as $path => $namespace) {
Autoload::addNamespace($namespace.'\\', __DIR__.'/../../'.$path.'/custom/src');
Autoload::addNamespace($namespace.'\\', __DIR__.'/../../'.$path.'/src');
}
// Individuazione dei percorsi di base
App::definePaths(__DIR__.'/../..');
database();

59
view.php Normal file
View File

@ -0,0 +1,59 @@
<?php
include_once __DIR__.'/core.php';
$file_id = filter('file_id');
$file = Models\Upload::find($file_id);
if (empty($file)) {
return;
}
$link = ROOTDIR.'/'.$file->filepath;
if ($file->isFatturaElettronica()) {
$content = file_get_contents(DOCROOT.'/'.$file->filepath);
// XML
$xml = new DOMDocument();
$xml->loadXML($content);
// XSL
$xsl = new DOMDocument();
$xsl->load(__DIR__.'/assets/src/xml/fe-stylesheet-1.2.1.xsl');
// XSLT
$xslt = new XSLTProcessor();
$xslt->importStylesheet($xsl);
echo $xslt->transformToXML($xml);
} else {
echo '
<style>
body, iframe, img{
border: 0;
margin: 0;
max-width: 100%;
}
iframe{
width:100%;
height:100%;
min-height: 500px;
}
</style>';
if ($file->isImage()) {
echo '
<img src="'.$link.'"></img>';
} else {
if ($file->isPDF()) {
$src = \Prints::getPDFLink($file->filepath);
}
echo '
<iframe src="'.($link ?: $src).'">
<a src="'.$link.'">'.tr('Il browser non supporta i contenuti iframe: clicca qui per raggiungere il file originale').'</a>
</iframe>';
}
}