This commit is contained in:
MatteoPistorello 2021-10-18 17:26:48 +02:00
commit 061c0ce46f
18 changed files with 220 additions and 92 deletions

View File

@ -214,7 +214,7 @@ if (filter('action') == 'do_update') {
$total += $scriptValue; $total += $scriptValue;
} }
} }
echo ' echo '
<script> <script>
$(document).ready(function(){ $(document).ready(function(){

View File

@ -25,6 +25,10 @@
use HTMLBuilder\HTMLBuilder; use HTMLBuilder\HTMLBuilder;
use Models\OperationLog; use Models\OperationLog;
use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Filesystem as SymfonyFilesystem;
use Symfony\Component\Finder\Finder;
use Util\FileSystem;
/** /**
* Esegue il redirect. * Esegue il redirect.
@ -71,12 +75,12 @@ function sanitizeFilename($filename)
function delete($files) function delete($files)
{ {
// Filesystem Symfony // Filesystem Symfony
$fs = new Symfony\Component\Filesystem\Filesystem(); $fs = new SymfonyFilesystem();
// Eliminazione // Eliminazione
try { try {
$fs->remove($files); $fs->remove($files);
} catch (Symfony\Component\Filesystem\Exception\IOException $e) { } catch (IOException $e) {
return false; return false;
} }
@ -110,7 +114,7 @@ function copyr($source, $destination, $ignores = [])
return false; return false;
} }
$files = Symfony\Component\Finder\Finder::create() $files = Finder::create()
->files() ->files()
->exclude((array) $ignores['dirs']) ->exclude((array) $ignores['dirs'])
->ignoreDotFiles(false) ->ignoreDotFiles(false)
@ -124,14 +128,17 @@ function copyr($source, $destination, $ignores = [])
$result = true; $result = true;
// Filesystem Symfony // Filesystem Symfony
$fs = new Symfony\Component\Filesystem\Filesystem(); $fs = new SymfonyFilesystem();
$fs->chmod($destination, 0777, 0000, true);
foreach ($files as $file) { foreach ($files as $file) {
$filename = rtrim($destination, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$file->getRelativePathname(); $filename = rtrim($destination, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$file->getRelativePathname();
// Copia // Copia effettiva del file
try { try {
$fs->copy($file, $filename); $fs->copy($file, $filename, true);
} catch (Symfony\Component\Filesystem\Exception\IOException $e) { } catch (IOException $e) {
$result = false; $result = false;
} }
} }

View File

@ -54,7 +54,7 @@ switch (post('op')) {
foreach ($id_records as $id) { foreach ($id_records as $id) {
$articolo = Articolo::find($id); $articolo = Articolo::find($id);
$prezzo_partenza = post('prezzo_partenza')=='vendita' ? $articolo->prezzo_vendita : $articolo->prezzo_acquisto; $prezzo_partenza = post('prezzo_partenza') == 'vendita' ? $articolo->prezzo_vendita : $articolo->prezzo_acquisto;
$new_prezzo_vendita = $prezzo_partenza + ($prezzo_partenza * $percentuale / 100); $new_prezzo_vendita = $prezzo_partenza + ($prezzo_partenza * $percentuale / 100);
$articolo->setPrezzoVendita($new_prezzo_vendita, $articolo->idiva_vendita); $articolo->setPrezzoVendita($new_prezzo_vendita, $articolo->idiva_vendita);

View File

@ -21,12 +21,15 @@ namespace Modules\Articoli\Import;
use Carbon\Carbon; use Carbon\Carbon;
use Importer\CSVImporter; use Importer\CSVImporter;
use Models\Upload;
use Modules;
use Modules\Anagrafiche\Anagrafica; use Modules\Anagrafiche\Anagrafica;
use Modules\Anagrafiche\Sede; use Modules\Anagrafiche\Sede;
use Modules\Articoli\Articolo; use Modules\Articoli\Articolo;
use Modules\Articoli\Categoria; use Modules\Articoli\Categoria;
use Modules\Iva\Aliquota; use Modules\Iva\Aliquota;
use Plugins\ListinoClienti\DettaglioPrezzo; use Plugins\ListinoClienti\DettaglioPrezzo;
use Uploads;
/** /**
* Struttura per la gestione delle operazioni di importazione (da CSV) degli Articoli. * Struttura per la gestione delle operazioni di importazione (da CSV) degli Articoli.
@ -43,6 +46,14 @@ class CSV extends CSVImporter
'label' => 'Codice', 'label' => 'Codice',
'primary_key' => true, 'primary_key' => true,
], ],
[
'field' => 'immagine',
'label' => 'Immagine',
'names' => [
'Immagine',
'Foto',
],
],
[ [
'field' => 'descrizione', 'field' => 'descrizione',
'label' => 'Descrizione', 'label' => 'Descrizione',
@ -210,6 +221,8 @@ class CSV extends CSVImporter
{ {
$database = database(); $database = database();
$primary_key = $this->getPrimaryKey(); $primary_key = $this->getPrimaryKey();
$url = $record['immagine'];
unset($record['immagine']);
// Fix per campi con contenuti derivati da query implicite // Fix per campi con contenuti derivati da query implicite
if (!empty($record['id_fornitore'])) { if (!empty($record['id_fornitore'])) {
@ -316,6 +329,34 @@ class CSV extends CSVImporter
$articolo->movimenta($qta_movimento, tr('Movimento da importazione'), new Carbon(), false, [ $articolo->movimenta($qta_movimento, tr('Movimento da importazione'), new Carbon(), false, [
'idsede' => $id_sede, 'idsede' => $id_sede,
]); ]);
//Gestione immagine
if (!empty($url)) {
$file_content = file_get_contents($url);
if (!empty($file_content)) {
$name = 'immagine_'.$articolo->id.'.'.Upload::getExtensionFromMimeType($file_content);
$upload = Uploads::upload($file_content, [
'name' => 'Immagine',
'category' => 'Immagini',
'original_name' => $name,
'id_module' => Modules::get('Articoli')['id'],
'id_record' => $articolo->id,
], [
'thumbnails' => true,
]);
$filename = $upload->filename;
if (!empty($filename)) {
$database->update('mg_articoli', [
'immagine' => $filename,
], [
'id' => $articolo->id,
]);
}
}
}
} }
public static function getExample() public static function getExample()

View File

@ -171,7 +171,7 @@ trait RelationTrait
{ {
$result = parent::delete(); $result = parent::delete();
if (!empty($this->idintervento) && $this->fattura->getRighe()->where('idintervento', $this->idintervento)->count()==1) { if (!empty($this->idintervento) && $this->fattura->getRighe()->where('idintervento', $this->idintervento)->count() == 1) {
database()->query("UPDATE in_interventi SET idstatointervento = (SELECT idstatointervento FROM in_statiintervento WHERE codice = 'OK') WHERE id=".prepare($this->idintervento)); database()->query("UPDATE in_interventi SET idstatointervento = (SELECT idstatointervento FROM in_statiintervento WHERE codice = 'OK') WHERE id=".prepare($this->idintervento));
} }

View File

@ -186,10 +186,10 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$riga->prezzo_unitario = $sessione->prezzo_orario; $riga->prezzo_unitario = $sessione->prezzo_orario;
//Calcolo lo sconto unitario della sessione in base all'impostazione sui prezzi ivati //Calcolo lo sconto unitario della sessione in base all'impostazione sui prezzi ivati
$iva = $dbo->table('co_iva')->where('id',$id_iva)->first(); $iva = $dbo->table('co_iva')->where('id', $id_iva)->first();
if( $sessione->tipo_sconto=='UNT' && setting('Utilizza prezzi di vendita comprensivi di IVA') ){ if ($sessione->tipo_sconto == 'UNT' && setting('Utilizza prezzi di vendita comprensivi di IVA')) {
$sconto_unitario = $sessione->sconto_unitario + (($sessione->sconto_unitario*$iva->percentuale)/100); $sconto_unitario = $sessione->sconto_unitario + (($sessione->sconto_unitario * $iva->percentuale) / 100);
}else{ } else {
$sconto_unitario = $sessione->sconto_unitario; $sconto_unitario = $sessione->sconto_unitario;
} }

View File

@ -345,4 +345,4 @@ echo '
$("#idarticolo").selectReset(); $("#idarticolo").selectReset();
}); });
</script>'; </script>';

View File

@ -317,10 +317,9 @@ switch (filter('op')) {
$max_number = $informazioni['maxNumber']; $max_number = $informazioni['maxNumber'];
$avviso_numero = !empty($max_number) && floatval($history[0]['number']) > 0.9 * $max_number; $avviso_numero = !empty($max_number) && floatval($history[0]['number']) > 0.9 * $max_number;
// Formattazione dei contenuti dello storico // Formattazione dei contenuti dello storico
foreach ($history as $key => $value) { foreach ($history as $key => $value) {
$history[$key]['size'] = (($history[$key]['size'])? Filesystem::formatBytes($value['size']) : '-' ); $history[$key]['size'] = (($history[$key]['size']) ? Filesystem::formatBytes($value['size']) : '-');
//$history[$key]['invoices_size'] = Filesystem::formatBytes($value['invoices_size']); //$history[$key]['invoices_size'] = Filesystem::formatBytes($value['invoices_size']);
//$history[$key]['notifies_size'] = Filesystem::formatBytes($value['notifies_size']); //$history[$key]['notifies_size'] = Filesystem::formatBytes($value['notifies_size']);
} }

View File

@ -25,16 +25,16 @@ include_once __DIR__.'/../../core.php';
// Informazioni sui servizi attivi // Informazioni sui servizi attivi
echo ' echo '
<div class="row">'; <div class="row">';
$days = 60;
$limite_scadenze = (new Carbon())->addDays(60); $limite_scadenze = (new Carbon())->addDays($days);
if (Services::isEnabled()) { if (Services::isEnabled()) {
echo ' echo '
<!-- Informazioni sui Servizi attivi --> <!-- Informazioni sui Servizi attivi -->
<div class="col-md-12 col-lg-6"> <div class="col-md-12 col-lg-6">
<div class="box box-success"> <div class="box box-primary">
<div class="box-header"> <div class="box-header">
<h3 class="box-title"> <h3 class="box-title">
'.tr('Servizi attivi').' '.tr('Servizi').'
</h3> </h3>
</div> </div>
@ -43,12 +43,12 @@ if (Services::isEnabled()) {
$servizi = Services::getServiziAttivi()->flatten(1); $servizi = Services::getServiziAttivi()->flatten(1);
if (!$servizi->isEmpty()) { if (!$servizi->isEmpty()) {
echo ' echo '
<table class="table table-striped table-hover"> <table class="box-body table table-striped table-hover table-condensed">
<thead> <thead>
<tr> <tr>
<th width="50%">'.tr('Nome').'</th>
<th>'.tr('Tipo').'</th> <th>'.tr('Tipo').'</th>
<th>'.tr('Nome').'</th> <th width="30%">'.tr('Scadenza').'</th>
<th>'.tr('Scadenza').'</th>
</tr> </tr>
</thead> </thead>
@ -57,9 +57,9 @@ if (Services::isEnabled()) {
$scadenza = Carbon::parse($servizio['data_conclusione']); $scadenza = Carbon::parse($servizio['data_conclusione']);
echo ' echo '
<tr class="'.($scadenza->lessThan($limite_scadenze) ? 'info' : '').'"> <tr class="'.($scadenza->lessThan(Carbon::now()) ? 'danger' : ($scadenza->lessThan($limite_scadenze) ? 'warning' : '')).'">
<td>'.$servizio['sottocategoria'].'</td>
<td>'.$servizio['codice'].' - '.$servizio['nome'].'</td> <td>'.$servizio['codice'].' - '.$servizio['nome'].'</td>
<td>'.$servizio['sottocategoria'].'</td>
<td>'.dateFormat($scadenza).' ('.$scadenza->diffForHumans().')</td> <td>'.dateFormat($scadenza).' ('.$scadenza->diffForHumans().')</td>
</tr>'; </tr>';
} }
@ -84,7 +84,7 @@ if (Services::isEnabled()) {
<div class="box box-primary"> <div class="box box-primary">
<div class="box-header"> <div class="box-header">
<h3 class="box-title"> <h3 class="box-title">
'.tr('Risorse Services').' '.tr('Risorse').'
</h3> </h3>
</div> </div>
@ -94,59 +94,64 @@ if (Services::isEnabled()) {
$risorse_attive = Services::getRisorseAttive(); $risorse_attive = Services::getRisorseAttive();
if (!$risorse_attive->isEmpty()) { if (!$risorse_attive->isEmpty()) {
$risorse_in_scadenza = Services::getRisorseInScadenza($limite_scadenze); $risorse_in_scadenza = Services::getRisorseInScadenza($limite_scadenze);
$risorse_scadute = Services::getRisorseScadute();
if (!$risorse_in_scadenza->isEmpty() || !$risorse_scadute->isEmpty() ) {
if (!$risorse_in_scadenza->isEmpty()){
echo '
<div class="alert alert-warning" role="alert"> <i class="fa fa-clock-o"></i> '.tr('Attenzione, _NUM_ risorse sono in scadenza o stanno per esaurire i crediti:', [
'_NUM_' => $risorse_in_scadenza->count(),
]).'</div>';
}
if (!$risorse_scadute->isEmpty()){
echo '
<div class="alert alert-danger" role="alert"> <i class="fa fa-exclamation-triangle"></i> '.tr('Attenzione, _NUM_ risorse sono scadute o hanno esaurito i crediti:', [
'_NUM_' => $risorse_scadute->count(),
]).'</div>';
}
if (!$risorse_in_scadenza->isEmpty()) { } else {
echo ' echo '
<div class="alert alert-warning" role="alert"> <i class="fa fa-warning"></i> '.tr('Attenzione, _NUM_ risorse sono in scadenza:', [ <div class="alert alert-success" role="alert"> <i class="fa fa-check-circle"></i> '.tr('Bene, tutte le risorse sono attive e non presentano avvisi:', [
'_NUM_' => $risorse_attive->count(),
'_NUM_' => $risorse_in_scadenza->count()
]).'</div>';
}else{
echo '
<div class="alert alert-success" role="alert"> <i class="fa fa-check"></i> '.tr('Bene, tutte le risorse sono attive e non presentano avvisi:', [
'_NUM_' => $risorse_attive->count()
]).'</div>'; ]).'</div>';
} }
echo ' echo '
<table class="table table-striped table-hover"> <table class="box-body table table-striped table-hover table-condensed">
<thead> <thead>
<tr> <tr>
<th width="50%">'.tr('Nome').'</th> <th width="50%">'.tr('Nome').'</th>
<th>'.tr('Crediti').'</th> <th>'.tr('Crediti').'</th>
<th>'.tr('Scadenza').'</th> <th width="30%">'.tr('Scadenza').'</th>
</tr> </tr>
</thead> </thead>
<tbody>'; <tbody>';
foreach ($risorse_attive as $servizio) { foreach ($risorse_attive as $servizio) {
$scadenza = Carbon::parse($servizio['expiration_at']); $scadenza = Carbon::parse($servizio['expiration_at']);
echo ' echo '
<tr> <tr class="'.($scadenza->lessThan(Carbon::now()) ? 'danger' : ($scadenza->lessThan($limite_scadenze) ? 'warning' : '')).'">
<td>'.$servizio['name'].'</td> <td>'.$servizio['name'].'</td>
<td>'.(($servizio['credits']<100 && $servizio['credits'])? '<b><i class="fa fa-icon fa-warning" ></i>': '' ).(($servizio['credits'])? $servizio['credits']: '-' ).(($servizio['credits']<100 && $servizio['credits'])? '</b>': '' ).'</td> <td>'.(($servizio['credits'] < 100 && $servizio['credits']) ? '<b><i class="fa fa-icon fa-warning" ></i>' : '').(($servizio['credits']) ? $servizio['credits'] : '-').(($servizio['credits'] < 100 && $servizio['credits']) ? '</b>' : '').'</td>
<td>'.((Carbon::now()->diffInDays($scadenza, false)<60 && $scadenza)? '<b><i class="fa fa-icon fa-warning" ></i>': '' ).dateFormat($scadenza).' ('.$scadenza->diffForHumans().')'.((Carbon::now()->diffInDays($scadenza, false)<60 && $scadenza)? '</b>': '' ).'</td> <td>'.((Carbon::now()->diffInDays($scadenza, false) < $days && $scadenza) ? '<b><i class="fa fa-icon fa-warning" ></i>' : '').dateFormat($scadenza).' ('.$scadenza->diffForHumans().')'.((Carbon::now()->diffInDays($scadenza, false) < $days && $scadenza) ? '</b>' : '').'</td>
</tr>'; </tr>';
} }
echo ' echo '
</tbody> </tbody>
</table><hr>'; </table></div></div>';
//Il servizio Fatturazione Elettronica deve essere presente per visualizzare le Statistiche su Fatture Elettroniche //Il servizio Fatturazione Elettronica deve essere presente per visualizzare le Statistiche su Fatture Elettroniche
if (Services::getRisorseAttive()->where('name','Fatturazione Elettronica')->count()){ if (Services::getRisorseAttive()->where('name', 'Fatturazione Elettronica')->count()) {
echo ' echo '
<div class="panel panel-info"> <div class="panel panel-info">
<div class="panel-heading" > <i class="fa fa-bar-chart"></i> '.tr('Statistiche su Fatture Elettroniche').'</div>
<div class="panel-heading" > <i class="fa fa-file"></i> '.tr('Statistiche su Fatture Elettroniche').'</div>
<div class="panel-body"> <div class="panel-body">
@ -168,7 +173,7 @@ if (Services::isEnabled()) {
</div> </div>
<table class="table table-striped"> <table class="box-body table table-striped table-hover table-condensed">
<thead> <thead>
<tr> <tr>
<th>'.tr('Anno').'</th> <th>'.tr('Anno').'</th>
@ -189,7 +194,7 @@ if (Services::isEnabled()) {
</thead> </thead>
<tbody id="elenco-fe"> <tbody id="elenco-fe">
<tr class="info"> <tr style="background-color:#CCCCCC;" >
<td>'.tr('Totale').'</td> <td>'.tr('Totale').'</td>
<td id="fe_numero"></td> <td id="fe_numero"></td>
<td id="fe_spazio"></td> <td id="fe_spazio"></td>
@ -203,7 +208,6 @@ if (Services::isEnabled()) {
aggiornaStatisticheFE(); aggiornaStatisticheFE();
}); });
</script>'; </script>';
} }
} else { } else {
echo ' echo '
@ -213,9 +217,6 @@ if (Services::isEnabled()) {
} }
echo ' echo '
</div>
</div>
</div>'; </div>';
} else { } else {
/* /*
@ -311,7 +312,7 @@ function aggiornaStatisticheFE(){
const data = response.history[i]; const data = response.history[i];
if (data["year"] == '.date('Y').'){ if (data["year"] == '.date('Y').'){
var highlight = "<tr style=\"background-color:#FFFEEE;\" >"; var highlight = "<tr class=\"info\" >";
var number = data["number"]; var number = data["number"];
if (response.maxNumber>0 && response.maxNumber) if (response.maxNumber>0 && response.maxNumber)

View File

@ -34,23 +34,46 @@ class ServicesHook extends Manager
// Elaborazione dei servizi in scadenza // Elaborazione dei servizi in scadenza
$servizi_in_scadenza = Services::getServiziInScadenza($limite_scadenze); $servizi_in_scadenza = Services::getServiziInScadenza($limite_scadenze);
if (!$servizi_in_scadenza->isEmpty()) { if (!$servizi_in_scadenza->isEmpty()) {
$message .= tr('I seguenti servizi sono in scadenza: _LIST_', [ $message .= '<i class="fa fa-clock-o text-warning"> </i> ';
'_LIST_' => implode(', ', $servizi_in_scadenza->pluck('nome')->all()), $message .= tr('I seguenti servizi sono in scadenza:<ul><li> _LIST_', [
]).'. '; '_LIST_' => implode('</li><li>', $servizi_in_scadenza->pluck('nome')->all()),
]).'</ul>';
} }
// Elaborazione delle risorse Services scadute
$risorse_scadute = Services::getRisorseScadute();
if (!$risorse_scadute->isEmpty()) {
$message .= '<i class="fa fa-exclamation-triangle text-danger"> </i> ';
$message .= tr('Le seguenti risorse sono scadute:<ul><li> _LIST_', [
'_LIST_' => implode('</li><li>', $risorse_scadute->pluck('name')->all()),
]).'</ul>';
}
// Elaborazione dei servizi scaduti
$servizi_scaduti = Services::getServiziScaduti();
if (!$servizi_scaduti->isEmpty()) {
$message .= '<i class="fa fa-exclamation-triangle text-danger"> </i> ';
$message .= tr('I seguenti servizi sono scaduti:<ul><li> _LIST_', [
'_LIST_' => implode('</li><li>', $servizi_scaduti->pluck('nome')->all()),
]).'</ul>';
}
// Elaborazione delle risorse Services in scadenza // Elaborazione delle risorse Services in scadenza
$risorse_in_scadenza = Services::getRisorseInScadenza($limite_scadenze); $risorse_in_scadenza = Services::getRisorseInScadenza($limite_scadenze);
if (!$risorse_in_scadenza->isEmpty()) { if (!$risorse_in_scadenza->isEmpty()) {
$message .= tr('Le seguenti risorse Services sono in scadenza: _LIST_', [ $message .= '<i class="fa fa-clock-o text-warning"> </i> ';
'_LIST_' => implode(', ', $risorse_in_scadenza->pluck('name')->all()), $message .= tr('Le seguenti risorse sono in scadenza:<ul><li> _LIST_', [
]); '_LIST_' => implode('</li><li>', $risorse_in_scadenza->pluck('name')->all()),
]).'</ul>';
} }
$module = Module::pool('Stato dei servizi'); $module = Module::pool('Stato dei servizi');
return [ return [
'icon' => 'fa fa-refresh text-warning', 'icon' => null,
'message' => $message, 'message' => $message,
'link' => base_path().'/controller.php?id_module='.$module->id, 'link' => base_path().'/controller.php?id_module='.$module->id,
'show' => Services::isEnabled() && !empty($message), 'show' => Services::isEnabled() && !empty($message),

View File

@ -294,11 +294,11 @@ echo '
</div>'; </div>';
// Righe // Righe
if (setting('Aggiorna info di acquisto')=='Non aggiornare'){ if (setting('Aggiorna info di acquisto') == 'Non aggiornare') {
$update_info = 'update_not'; $update_info = 'update_not';
} elseif (setting('Aggiorna info di acquisto')=='Aggiorna prezzo di listino'){ } elseif (setting('Aggiorna info di acquisto') == 'Aggiorna prezzo di listino') {
$update_info ='update_price'; $update_info = 'update_price';
} else{ } else {
$update_info = 'update_all'; $update_info = 'update_all';
} }
@ -358,7 +358,7 @@ if (!empty($righe)) {
$id_articolo = $database->fetchOne('SELECT id_articolo AS id FROM mg_fornitore_articolo WHERE REPLACE(codice_fornitore, " ", "") = '.prepare($codice_principale).' AND id_fornitore = '.prepare($anagrafica->id))['id']; $id_articolo = $database->fetchOne('SELECT id_articolo AS id FROM mg_fornitore_articolo WHERE REPLACE(codice_fornitore, " ", "") = '.prepare($codice_principale).' AND id_fornitore = '.prepare($anagrafica->id))['id'];
} }
} }
if (empty($id_articolo)) { if (empty($id_articolo)) {
$id_articolo = $database->fetchOne('SELECT id FROM mg_articoli WHERE codice = '.prepare($codice_principale))['id']; $id_articolo = $database->fetchOne('SELECT id FROM mg_articoli WHERE codice = '.prepare($codice_principale))['id'];
if (empty($id_articolo)) { if (empty($id_articolo)) {

View File

@ -21,9 +21,9 @@ namespace Plugins\ImportFE;
use Modules; use Modules;
use Modules\Anagrafiche\Anagrafica; use Modules\Anagrafiche\Anagrafica;
use Modules\Banche\Banca;
use Modules\Anagrafiche\Nazione; use Modules\Anagrafiche\Nazione;
use Modules\Anagrafiche\Tipo as TipoAnagrafica; use Modules\Anagrafiche\Tipo as TipoAnagrafica;
use Modules\Banche\Banca;
use Modules\Fatture\Fattura; use Modules\Fatture\Fattura;
use Modules\Fatture\Stato as StatoFattura; use Modules\Fatture\Stato as StatoFattura;
use Modules\Fatture\Tipo as TipoFattura; use Modules\Fatture\Tipo as TipoFattura;

View File

@ -155,7 +155,7 @@ class FatturaOrdinaria extends FatturaElettronica
if (!empty($articolo)) { if (!empty($articolo)) {
$articolo->idconto_acquisto = $conto[$key]; $articolo->idconto_acquisto = $conto[$key];
$articolo->save(); $articolo->save();
$obj = Articolo::build($fattura, $articolo); $obj = Articolo::build($fattura, $articolo);
$obj->movimentazione($movimentazione); $obj->movimentazione($movimentazione);
@ -242,11 +242,11 @@ class FatturaOrdinaria extends FatturaElettronica
if ($tipo_sconto == 'PRC') { if ($tipo_sconto == 'PRC') {
$sconto_calcolato = calcola_sconto([ $sconto_calcolato = calcola_sconto([
'sconto' => $sconto_riga, 'sconto' => $sconto_riga,
'prezzo' => $sconto_unitario ? $obj->prezzo_unitario-($sconto_calcolato/$obj->qta) : $obj->prezzo_unitario, 'prezzo' => $sconto_unitario ? $obj->prezzo_unitario - ($sconto_calcolato / $obj->qta) : $obj->prezzo_unitario,
'tipo' => 'PRC', 'tipo' => 'PRC',
'qta' => $obj->qta, 'qta' => $obj->qta,
]); ]);
if ($tipo == 'PRC') { if ($tipo == 'PRC') {
$tot_sconto = $sconto_calcolato * 100 / $obj->imponibile; $tot_sconto = $sconto_calcolato * 100 / $obj->imponibile;
} else { } else {
@ -256,15 +256,15 @@ class FatturaOrdinaria extends FatturaElettronica
$tot_sconto = $sconto_riga; $tot_sconto = $sconto_riga;
} }
$sconto_unitario += $tot_sconto; $sconto_unitario += $tot_sconto;
} }
$obj->setSconto($sconto_unitario, $tipo); $obj->setSconto($sconto_unitario, $tipo);
} }
// Aggiornamento prezzo di acquisto e fornitore predefinito in base alle impostazioni // Aggiornamento prezzo di acquisto e fornitore predefinito in base alle impostazioni
if (!empty($articolo)) { if (!empty($articolo)) {
if ($update_info[$key]=='update_price' || $update_info[$key]=='update_all') { if ($update_info[$key] == 'update_price' || $update_info[$key] == 'update_all') {
$dettaglio_predefinito = DettaglioPrezzo::dettaglioPredefinito($articolo->id, $anagrafica->idanagrafica, $direzione) $dettaglio_predefinito = DettaglioPrezzo::dettaglioPredefinito($articolo->id, $anagrafica->idanagrafica, $direzione)
->first(); ->first();
@ -272,7 +272,7 @@ class FatturaOrdinaria extends FatturaElettronica
if (empty($dettaglio_predefinito)) { if (empty($dettaglio_predefinito)) {
$dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $direzione); $dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $direzione);
} }
// Imposto lo sconto nel listino solo se è una percentuale, se è un importo lo sottraggo dal prezzo // Imposto lo sconto nel listino solo se è una percentuale, se è un importo lo sottraggo dal prezzo
if ($tipo == 'PRC') { if ($tipo == 'PRC') {
$dettaglio_predefinito->sconto_percentuale = $sconto_unitario; $dettaglio_predefinito->sconto_percentuale = $sconto_unitario;
@ -288,7 +288,7 @@ class FatturaOrdinaria extends FatturaElettronica
$dettaglio_predefinito->save(); $dettaglio_predefinito->save();
// Aggiornamento fornitore predefinito // Aggiornamento fornitore predefinito
if ($update_info[$key]=='update_all') { if ($update_info[$key] == 'update_all') {
// Aggiornamento prezzo di acquisto e fornitore predefinito // Aggiornamento prezzo di acquisto e fornitore predefinito
$articolo->prezzo_acquisto = $prezzo_acquisto; $articolo->prezzo_acquisto = $prezzo_acquisto;
$articolo->id_fornitore = $anagrafica->idanagrafica; $articolo->id_fornitore = $anagrafica->idanagrafica;
@ -296,11 +296,10 @@ class FatturaOrdinaria extends FatturaElettronica
} }
} }
} }
$tipo = null; $tipo = null;
$sconto_unitario = null; $sconto_unitario = null;
$obj->save(); $obj->save();
} }
// Ricaricamento della fattura // Ricaricamento della fattura

View File

@ -189,13 +189,13 @@ echo '
<div class="col-md-4"> <div class="col-md-4">
<div class="info-box"> <div class="info-box">
<span class="info-box-icon bg-'.($fatture_vendita->count()+$note_credito->count() == 0 ? 'gray' : 'green').'"><i class="fa fa-money"></i></span> <span class="info-box-icon bg-'.($fatture_vendita->count() + $note_credito->count() == 0 ? 'gray' : 'green').'"><i class="fa fa-money"></i></span>
<div class="info-box-content"> <div class="info-box-content">
<span class="info-box-text pull-left">'.tr('Fatture').'</span> <span class="info-box-text pull-left">'.tr('Fatture').'</span>
'.($fatture_vendita->count()+$note_credito->count() > 0 ? '<span class="info-box-text pull-right"><a href="'.base_path().'/controller.php?id_module='.Modules::get('Fatture di vendita')['id'].'&search_Ragione-sociale='.rawurlencode($anagrafica['ragione_sociale']).'">'.tr('Visualizza').' <i class="fa fa-chevron-circle-right"></i></a></span>' : '').' '.($fatture_vendita->count() + $note_credito->count() > 0 ? '<span class="info-box-text pull-right"><a href="'.base_path().'/controller.php?id_module='.Modules::get('Fatture di vendita')['id'].'&search_Ragione-sociale='.rawurlencode($anagrafica['ragione_sociale']).'">'.tr('Visualizza').' <i class="fa fa-chevron-circle-right"></i></a></span>' : '').'
<br class="clearfix"> <br class="clearfix">
<span class="info-box-number"> <span class="info-box-number">
<big>'.($fatture_vendita->count()+$note_credito->count()).'</big><br> <big>'.($fatture_vendita->count() + $note_credito->count()).'</big><br>
<small class="help-block">'.moneyFormat($totale_fatture_vendita).'</small> <small class="help-block">'.moneyFormat($totale_fatture_vendita).'</small>
</span> </span>
</div> </div>

View File

@ -86,7 +86,21 @@ class Services
return self::getServiziAttivi() return self::getServiziAttivi()
->flatten(1) ->flatten(1)
->filter(function ($item) use ($limite_scadenze) { ->filter(function ($item) use ($limite_scadenze) {
return (isset($item['data_conclusione']) && Carbon::parse($item['data_conclusione'])->lessThan($limite_scadenze)); return isset($item['data_conclusione']) && Carbon::parse($item['expiration_at'])->greaterThan(Carbon::now()) && Carbon::parse($item['data_conclusione'])->lessThan($limite_scadenze);
});
}
/**
* Restituisce i servizi scaduti.
*
* @return \Illuminate\Support\Collection
*/
public static function getServiziScaduti()
{
return self::getServiziAttivi()
->flatten(1)
->filter(function ($item) use ($limite_scadenze) {
return isset($item['data_conclusione']) && Carbon::parse($item['data_conclusione'])->lessThan(Carbon::now());
}); });
} }
@ -123,11 +137,27 @@ class Services
{ {
return self::getRisorseAttive() return self::getRisorseAttive()
->filter(function ($item) use ($limite_scadenze) { ->filter(function ($item) use ($limite_scadenze) {
return (isset($item['expiration_at']) && Carbon::parse($item['expiration_at'])->lessThan($limite_scadenze)) return (isset($item['expiration_at']) && Carbon::parse($item['expiration_at'])->greaterThan(Carbon::now()) && Carbon::parse($item['expiration_at'])->lessThan($limite_scadenze))
|| (isset($item['credits']) && $item['credits'] < 100); || (isset($item['credits']) && $item['credits'] < 100);
}); });
} }
/**
* Restituisce le risorse scadute per assenza di crediti oppure per data di fine prossima.
*
* @return \Illuminate\Support\Collection
*/
public static function getRisorseScadute()
{
return self::getRisorseAttive()
->filter(function ($item) use ($limite_scadenze) {
return (isset($item['expiration_at']) && Carbon::parse($item['expiration_at'])->lessThan(Carbon::now()))
|| (isset($item['credits']) && $item['credits'] < 0);
});
}
/** /**
* Effettua una richiesta a Services. * Effettua una richiesta a Services.
* *

View File

@ -417,7 +417,7 @@ abstract class Component extends Model
*/ */
protected function customBeforeDataCopiaIn($original) protected function customBeforeDataCopiaIn($original)
{ {
if(!empty($original->idiva)){ if (!empty($original->idiva)) {
$this->idiva = $original->idiva; $this->idiva = $original->idiva;
} }
} }

View File

@ -38,6 +38,15 @@ class Upload extends Model
'htm' => 'text/html', 'htm' => 'text/html',
]; ];
/** @var array Elenco delle estensioni file per mime type */
protected static $extension_association = [
'image/gif' => 'gif',
'image/bmp' => 'bmp',
'image/jpg' => 'jpg',
'image/jpeg' => 'jpg',
'image/png' => 'png',
];
protected $table = 'zz_files'; protected $table = 'zz_files';
protected $file_info; protected $file_info;
@ -211,6 +220,18 @@ class Upload extends Model
return in_array($this->extension, $list); return in_array($this->extension, $list);
} }
/**
* @return string
*/
public static function getExtensionFromMimeType($file_content)
{
$finfo = finfo_open();
$mime_type = finfo_buffer($finfo, $file_content, FILEINFO_MIME_TYPE);
finfo_close($finfo);
return self::$extension_association[$mime_type];
}
/** /**
* @return bool * @return bool
*/ */

View File

@ -17,6 +17,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
use Symfony\Component\Filesystem\Filesystem as SymfonyFilesystem;
/** /**
* Classe dedicata alla gestione delle procedure di aggiornamento del database del progetto. * Classe dedicata alla gestione delle procedure di aggiornamento del database del progetto.
* *
@ -208,6 +210,11 @@ class Update
\Models\Cache::pool('Ultima versione di OpenSTAManager disponibile')->set(null); \Models\Cache::pool('Ultima versione di OpenSTAManager disponibile')->set(null);
} }
// Correzione permessi per le cartelle backup e files
$fs = new SymfonyFilesystem();
$fs->chmod('backup', 0777, 0000, true);
$fs->chmod('files', 0777, 0000, true);
return true; return true;
} }