Aggiornamento nella gestione delle conversioni
Miglioramento della gestione delle conversioni di numeri e date, ora semplificate in una singola classe. Bugfix distribuito e rinominazione dello sconto globale in sconto incondizionato (a livello di label).
This commit is contained in:
parent
941bc8d26d
commit
667425df8b
|
@ -114,12 +114,12 @@ if (!empty($module_query) && $module_query != 'menu' && $module_query != 'custom
|
|||
$value = trim($r[$field]);
|
||||
|
||||
// Allineamento a destra se il valore della prima riga risulta numerica
|
||||
if (Translator::getEnglishFormatter()->isNumber($value) || Translator::getEnglishFormatter()->isNumber($value)) {
|
||||
if (Translator::getFormatter()->isStandardNumber($value)) {
|
||||
$align[$field] = 'text-right';
|
||||
}
|
||||
|
||||
// Allineamento al centro se il valore della prima riga risulta relativo a date o icone
|
||||
elseif ((Translator::getEnglishFormatter()->isDate($value) || Translator::getEnglishFormatter()->isDate($value)) || preg_match('/^icontr(.+?)$/', $field)) {
|
||||
elseif (Translator::getFormatter()->isStandardDate($value) || preg_match('/^icontr(.+?)$/', $field)) {
|
||||
$align[$field] = 'text-center';
|
||||
}
|
||||
}
|
||||
|
@ -142,14 +142,14 @@ if (!empty($module_query) && $module_query != 'menu' && $module_query != 'custom
|
|||
$value = trim($r[$field]);
|
||||
|
||||
// Formattazione automatica
|
||||
if (!empty($total['format'][$pos]) && !empty($value) && !empty(Translator::getEnglishFormatter())) {
|
||||
if (Translator::getEnglishFormatter()->isNumber($value)) {
|
||||
if (!empty($total['format'][$pos]) && !empty($value)) {
|
||||
if (Translator::getFormatter()->isStandardNumber($value)) {
|
||||
$value = Translator::numberToLocale($value);
|
||||
} elseif (Translator::getEnglishFormatter()->isTimestamp($value)) {
|
||||
} elseif (Translator::getFormatter()->isStandardTimestamp($value)) {
|
||||
$value = Translator::timestampToLocale($value);
|
||||
} elseif (Translator::getEnglishFormatter()->isDate($value)) {
|
||||
} elseif (Translator::getFormatter()->isStandardDate($value)) {
|
||||
$value = Translator::dateToLocale($value);
|
||||
} elseif (Translator::getEnglishFormatter()->isTime($value)) {
|
||||
} elseif (Translator::getFormatter()->isStandardTime($value)) {
|
||||
$value = Translator::timeToLocale($value);
|
||||
}
|
||||
}
|
||||
|
|
8
core.php
8
core.php
|
@ -101,16 +101,13 @@ foreach ($handlers as $handler) {
|
|||
// Imposta Monolog come gestore degli errori
|
||||
Monolog\ErrorHandler::register($logger);
|
||||
|
||||
// Istanziamento della gestione di date e numeri
|
||||
$formatter = !empty($formatter) ? $formatter : [];
|
||||
Translator::setLocaleFormatter($formatter);
|
||||
|
||||
// Istanziamento del gestore delle traduzioni del progetto
|
||||
$lang = !empty($lang) ? $lang : 'it';
|
||||
$formatter = !empty($formatter) ? $formatter : [];
|
||||
$translator = Translator::getInstance();
|
||||
$translator->addLocalePath($docroot.'/locale');
|
||||
$translator->addLocalePath($docroot.'/modules/*/locale');
|
||||
$translator->setLocale($lang);
|
||||
$translator->setLocale($lang, $formatter);
|
||||
|
||||
// Individuazione di versione e revisione del progetto
|
||||
$version = Update::getVersion();
|
||||
|
@ -279,3 +276,4 @@ if (!API::isAPIRequest()) {
|
|||
$post = Filter::getPOST();
|
||||
$get = Filter::getGET();
|
||||
}
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ if (Auth::check()) {
|
|||
id_record: \''.$id_record.'\',
|
||||
aggiornamenti_id: \''.($dbo->isInstalled() ? Modules::getModule('Aggiornamenti')['id'] : '').'\',
|
||||
cifre_decimali: '.get_var('Cifre decimali per importi').',
|
||||
decimals: "'.Translator::getLocaleFormatter()->getNumberSeparators()['decimals'].'", thousands: "'.Translator::getLocaleFormatter()->getNumberSeparators()['thousands'].'",
|
||||
decimals: "'.Translator::getFormatter()->getNumberSeparators()['decimals'].'", thousands: "'.Translator::getFormatter()->getNumberSeparators()['thousands'].'",
|
||||
search: search,
|
||||
translations: translations,
|
||||
start_date: \''.Translator::dateToLocale($_SESSION['period_start']).'\',
|
||||
|
|
|
@ -48,7 +48,7 @@ switch (post('op')) {
|
|||
|
||||
// Controllo sull'effettivo inserimento di una data di fine successiva a quella di inizio
|
||||
if (!empty($post['data_fine'])) {
|
||||
if (Translator::getEnglishFormatter()->toDateObject(post('data_fine')) >= Translator::getEnglishFormatter()->toDateObject($data_inizio)) {
|
||||
if (new DateTime(post('data_fine')) >= new DateTime($data_inizio)) {
|
||||
$data_fine = post('data_fine');
|
||||
}
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ switch (post('op')) {
|
|||
|
||||
// Controllo sull'effettivo inserimento di una data di fine successiva a quella di inizio
|
||||
if (!empty($post['data_fine'][$idautomezzotecnico])) {
|
||||
if (Translator::getEnglishFormatter()->toDateObject(post('data_fine')[$idautomezzotecnico]) >= Translator::getEnglishFormatter()->toDateObject($data_inizio)) {
|
||||
if (new DateTime(post('data_fine')[$idautomezzotecnico]) >= new DateTime($data_inizio)) {
|
||||
$data_fine = post('data_fine')[$idautomezzotecnico];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,6 +50,10 @@ echo '
|
|||
$(function () {
|
||||
$("#data_inizio").on("dp.change", function (e) {
|
||||
$("#data_fine").data("DateTimePicker").minDate(e.date);
|
||||
|
||||
if($("#data_fine").data("DateTimePicker").date() < e.date){
|
||||
$("#data_fine").data("DateTimePicker").date(e.date);
|
||||
}
|
||||
})
|
||||
});
|
||||
</script>';
|
||||
|
|
|
@ -53,6 +53,10 @@ if (!empty($rs_art)) {
|
|||
$(function () {
|
||||
$("#data_inizio'.$r['id'].'").on("dp.change", function (e) {
|
||||
$("#data_fine'.$r['id'].'").data("DateTimePicker").minDate(e.date);
|
||||
|
||||
if($("#data_fine'.$r['id'].'").data("DateTimePicker").date() < e.date){
|
||||
$("#data_fine'.$r['id'].'").data("DateTimePicker").date(e.date);
|
||||
}
|
||||
})
|
||||
});
|
||||
</script>';
|
||||
|
|
|
@ -52,7 +52,6 @@ switch (filter('op')) {
|
|||
'_TYPE_' => 'categoria',
|
||||
]);
|
||||
} else {
|
||||
$_POST['backto'] = 'record-edit';
|
||||
$_SESSION['errors'][] = tr('Esistono ancora alcuni articoli sotto questa categoria!');
|
||||
}
|
||||
|
||||
|
|
|
@ -77,6 +77,17 @@ include_once __DIR__.'/../../core.php';
|
|||
});
|
||||
</script>
|
||||
|
||||
<?php
|
||||
|
||||
$res = $dbo->fetchNum('SELECT * FROM `mg_articoli` WHERE `id_categoria`='.prepare($id).' OR `id_sottocategoria`='.prepare($id).' OR `id_sottocategoria` IN (SELECT id FROM `mg_categorie` WHERE `parent`='.prepare($id).')');
|
||||
if ($res) {
|
||||
echo '
|
||||
<a class="btn btn-danger ask" data-backto="record-list">
|
||||
<i class="fa fa-trash"></i> <?php echo tr('Elimina'); ?>
|
||||
</a>
|
||||
<i class="fa fa-trash"></i> '.tr('Elimina').'
|
||||
</a>';
|
||||
} else {
|
||||
echo '
|
||||
<div class="alert alert-danger">
|
||||
<p>'.tr('Esistono ancora alcuni articoli sotto questa categoria!').'</p>
|
||||
</div>';
|
||||
}
|
||||
|
|
|
@ -105,7 +105,7 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
{[ "type": "number", "label": "<?php echo tr('Sconto totale') ?>", "name": "sconto_generico", "value": "$sconto_globale$", "help": "<?php echo tr('Sconto complessivo del contratto'); ?>", "icon-after": "choice|untprc|$tipo_sconto_globale$"<?php
|
||||
{[ "type": "number", "label": "<?php echo tr('Sconto incondizionato') ?>", "name": "sconto_generico", "value": "$sconto_globale$", "help": "<?php echo tr('Sconto complessivo del contratto'); ?>", "icon-after": "choice|untprc|$tipo_sconto_globale$"<?php
|
||||
if ($records[0]['stato'] == 'Emessa') {
|
||||
echo ', "disabled" : 1';
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ if ($get['op'] == 'add_ordineservizio') {
|
|||
|
||||
// Ciclo fra le voci in arrivo dal form
|
||||
foreach ($post['voce'] as $data_scadenza => $ordiniservizio) {
|
||||
$data_scadenza = date_create_from_format('Ym', $data_scadenza)->format(Translator::getEnglishFormatter()->getTimestampPattern());
|
||||
$data_scadenza = date_create_from_format('Ym', $data_scadenza)->format(Intl\Formatter::getStandardFormats()['date']);
|
||||
|
||||
// Ogni data può avere più voci di servizio da salvare
|
||||
foreach ($ordiniservizio as $n => $idvoce) {
|
||||
|
|
|
@ -109,7 +109,7 @@ if ($dir == 'uscita') {
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
{[ "type": "number", "label": "<?php echo tr('Sconto totale') ?>", "name": "sconto_generico", "value": "$sconto_globale$", "icon-after": "choice|untprc|$tipo_sconto_globale$" ]}
|
||||
{[ "type": "number", "label": "<?php echo tr('Sconto incondizionato') ?>", "name": "sconto_generico", "value": "$sconto_globale$", "icon-after": "choice|untprc|$tipo_sconto_globale$" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ $idanagrafica = $record[0]['idanagrafica'];
|
|||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Ddt').'", "name": "id_ddt", "required": 1, "values": "query=SELECT id, CONCAT(\'nr. \', if(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d-%m-%Y\')) AS descrizione, numero, numero_esterno, DATE_FORMAT(data, \'%d-%m-%Y\') AS data FROM dt_ddt WHERE idanagrafica='.prepare($idanagrafica).' AND idstatoddt IN (SELECT id FROM dt_statiddt WHERE descrizione=\'Bozza\') AND idtipoddt=(SELECT id FROM dt_tipiddt WHERE dir='.prepare($dir).') ORDER BY data DESC, numero DESC" ]}
|
||||
{[ "type": "select", "label": "'.tr('Ddt').'", "name": "id_ddt", "required": 1, "values": "query=SELECT dt_ddt.id, CONCAT(\'nr. \', IF(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d-%m-%Y\')) AS descrizione FROM dt_ddt WHERE idanagrafica='.prepare($idanagrafica).' AND idstatoddt IN (SELECT id FROM dt_statiddt WHERE descrizione=\'Bozza\') AND idtipoddt=(SELECT id FROM dt_tipiddt WHERE dir='.prepare($dir).') AND dt_ddt.id IN (SELECT idddt FROM dt_righe_ddt WHERE dt_righe_ddt.idddt = dt_ddt.id AND (qta - qta_evasa) > 0) ORDER BY data DESC, numero DESC" ]}
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
|
|
|
@ -63,12 +63,10 @@ if ($dir == 'uscita') {
|
|||
?>
|
||||
{[ "type": "select", "label": "<?php echo tr('Cliente'); ?>", "name": "idanagrafica", "required": 1, "ajax-source": "clienti", "value": "$idanagrafica$" ]}
|
||||
<?php
|
||||
|
||||
} else {
|
||||
?>
|
||||
{[ "type": "select", "label": "<?php echo tr('Fornitore'); ?>", "name": "idanagrafica", "required": 1, "ajax-source": "fornitori", "value": "$idanagrafica$" ]}
|
||||
<?php
|
||||
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
@ -83,7 +81,6 @@ if ($dir == 'uscita') {
|
|||
{[ "type": "select", "label": "<?php echo tr('Agente di riferimento'); ?>", "name": "idagente", "ajax-source": "agenti", "value": "$idagente_fattura$" ]}
|
||||
</div>
|
||||
<?php
|
||||
|
||||
} ?>
|
||||
|
||||
<?php
|
||||
|
@ -159,7 +156,6 @@ if ($tipodoc == 'Fattura accompagnatoria di vendita') {
|
|||
</div>
|
||||
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
if ($dir == 'uscita') {
|
||||
|
@ -172,14 +168,13 @@ if ($dir == 'uscita') {
|
|||
</div>
|
||||
</div>
|
||||
<?php
|
||||
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
<div class="pull-right">
|
||||
<?php
|
||||
//Aggiunta prima nota solo se non c'è già, se non si è in bozza o se il pagamento non è completo
|
||||
// Aggiunta prima nota solo se non c'è già, se non si è in bozza o se il pagamento non è completo
|
||||
$query2 = 'SELECT id FROM co_movimenti WHERE iddocumento='.$id_record.' AND primanota=1';
|
||||
$n2 = $dbo->fetchNum($query2);
|
||||
|
||||
|
@ -192,14 +187,12 @@ if (($n2 <= 0 && $records[0]['stato'] == 'Emessa') || $differenza != 0) {
|
|||
?>
|
||||
<a class="btn btn-sm btn-primary" href="javascript:;" onclick="launch_modal( 'Aggiungi prima nota', '<?php echo $rootdir ?>/add.php?id_module=<?php echo Modules::getModule('Prima nota')['id'] ?>&iddocumento=<?php echo $id_record ?>&dir=<?php echo $dir ?>', 1 );"><i class="fa fa-euro"></i> Aggiungi prima nota...</a><br><br>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
if ($records[0]['stato'] == 'Pagato') {
|
||||
?>
|
||||
<a class="btn btn-sm btn-primary" href="javascript:;" onclick="if( confirm('Se riapri questa fattura verrà azzerato lo scadenzario e la prima nota. Continuare?') ){ $.post( '<?php echo $rootdir ?>/editor.php?id_module=<?php echo Modules::getModule($name)['id'] ?>&id_record=<?php echo $id_record ?>', { id_module: '<?php echo Modules::getModule($name)['id'] ?>', id_record: '<?php echo $id_record ?>', op: 'reopen' }, function(){ location.href='<?php echo $rootdir ?>/editor.php?id_module=<?php echo Modules::getModule($name)['id'] ?>&id_record=<?php echo $id_record ?>'; } ); }" title="Aggiungi prima nota"><i class="fa fa-folder-open"></i> Riapri fattura...</a>
|
||||
<?php
|
||||
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
@ -207,7 +200,7 @@ if ($records[0]['stato'] == 'Pagato') {
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
{[ "type": "number", "label": "<?php echo tr('Sconto totale') ?>", "name": "sconto_generico", "value": "$sconto_globale$", "help": "<?php echo tr('Sconto complessivo della fattura.'); ?>", "icon-after": "choice|untprc|$tipo_sconto_globale$"<?php
|
||||
{[ "type": "number", "label": "<?php echo tr('Sconto incondizionato') ?>", "name": "sconto_generico", "value": "$sconto_globale$", "help": "<?php echo tr('Sconto complessivo della fattura.'); ?>", "icon-after": "choice|untprc|$tipo_sconto_globale$"<?php
|
||||
if ($records[0]['stato'] == 'Emessa') {
|
||||
echo ', "disabled" : 1';
|
||||
}
|
||||
|
@ -250,67 +243,62 @@ if ($records[0]['stato'] == 'Emessa') {
|
|||
<?php
|
||||
if ($records[0]['stato'] != 'Pagato' && $records[0]['stato'] != 'Emessa') {
|
||||
if ($dir == 'entrata') {
|
||||
//Lettura interventi non rifiutati, non fatturati e non collegati a preventivi o contratti
|
||||
// Lettura interventi non rifiutati, non fatturati e non collegati a preventivi o contratti
|
||||
$qi = 'SELECT id FROM in_interventi WHERE idanagrafica='.prepare($records[0]['idanagrafica'])." AND NOT idstatointervento='DENY' AND id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_righe_contratti WHERE idintervento IS NOT NULL)";
|
||||
$rsi = $dbo->fetchArray($qi);
|
||||
$ni = sizeof($rsi);
|
||||
|
||||
//Se non trovo niente provo a vedere se ce ne sono per clienti terzi
|
||||
// Se non trovo niente provo a vedere se ce ne sono per clienti terzi
|
||||
if ($ni == 0) {
|
||||
//Lettura interventi non rifiutati, non fatturati e non collegati a preventivi o contratti (clienti terzi)
|
||||
// Lettura interventi non rifiutati, non fatturati e non collegati a preventivi o contratti (clienti terzi)
|
||||
$qi = 'SELECT id FROM in_interventi WHERE idclientefinale='.prepare($records[0]['idanagrafica'])." AND NOT idstatointervento='DENY' AND id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND id NOT IN (SELECT idintervento FROM co_righe_contratti WHERE idintervento IS NOT NULL)";
|
||||
$rsi = $dbo->fetchArray($qi);
|
||||
$ni = sizeof($rsi);
|
||||
}
|
||||
|
||||
//Lettura preventivi accettati, in attesa di conferma o in lavorazione
|
||||
// Lettura preventivi accettati, in attesa di conferma o in lavorazione
|
||||
$qp = 'SELECT id FROM co_preventivi WHERE idanagrafica='.prepare($records[0]['idanagrafica'])." AND id NOT IN (SELECT idpreventivo FROM co_righe_documenti WHERE NOT idpreventivo=NULL) AND idstato IN( SELECT id FROM co_statipreventivi WHERE descrizione='Accettato' OR descrizione='In lavorazione' OR descrizione='In attesa di conferma')";
|
||||
$rsp = $dbo->fetchArray($qp);
|
||||
$np = sizeof($rsp);
|
||||
|
||||
//Lettura contratti accettati, in attesa di conferma o in lavorazione
|
||||
// Lettura contratti accettati, in attesa di conferma o in lavorazione
|
||||
$qc = 'SELECT id FROM co_contratti WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND id NOT IN (SELECT idcontratto FROM co_righe_documenti WHERE NOT idcontratto=NULL) AND idstato IN( SELECT id FROM co_staticontratti WHERE fatturabile = 1) AND NOT EXISTS (SELECT id FROM co_righe_documenti WHERE co_righe_documenti.idcontratto = co_contratti.id)';
|
||||
$rsc = $dbo->fetchArray($qc);
|
||||
$nc = sizeof($rsc);
|
||||
|
||||
//Lettura ddt
|
||||
$qd = 'SELECT id FROM dt_ddt WHERE idanagrafica='.prepare($records[0]['idanagrafica']);
|
||||
// Lettura ddt
|
||||
$qd = 'SELECT id FROM dt_ddt WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' AND idstatoddt IN (SELECT id FROM dt_statiddt WHERE descrizione=\'Bozza\') AND idtipoddt=(SELECT id FROM dt_tipiddt WHERE dir='.prepare($dir).') AND dt_ddt.id IN (SELECT idddt FROM dt_righe_ddt WHERE dt_righe_ddt.idddt = dt_ddt.id AND (qta - qta_evasa) > 0)';
|
||||
$rsd = $dbo->fetchArray($qd);
|
||||
$nd = sizeof($rsd);
|
||||
|
||||
if ($ni > 0) {
|
||||
?>
|
||||
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir ?>/modules/fatture/add_intervento.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>" data-toggle="modal" data-title="Aggiungi riga" data-target="#bs-popup"><i class="fa fa-plus"></i> Intervento</a>
|
||||
<?php
|
||||
|
||||
} else {
|
||||
?>
|
||||
<a class="btn btn-sm btn-primary tip" title="<?php echo tr('Nessun Intervento'); ?>" style="opacity:0.5;cursor:default;" ><i class="fa fa-plus"></i> Intervento</a>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
if ($np > 0) {
|
||||
?>
|
||||
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir ?>/modules/fatture/add_preventivo.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>" data-toggle="modal" data-title="Aggiungi riga" data-target="#bs-popup"><i class="fa fa-plus"></i> Preventivo</a>
|
||||
<?php
|
||||
|
||||
} else {
|
||||
?>
|
||||
<a class="btn btn-sm btn-primary tip" title="<?php echo tr('Nessun Preventivo'); ?>" style="opacity:0.5;cursor:default;" ><i class="fa fa-plus"></i> Preventivo</a>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
if ($nc > 0) {
|
||||
?>
|
||||
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir ?>/modules/fatture/add_contratto.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>" data-toggle="modal" data-title="Aggiungi riga" data-target="#bs-popup"><i class="fa fa-plus"></i> Contratto</a>
|
||||
<?php
|
||||
|
||||
} else {
|
||||
?>
|
||||
<a class="btn btn-sm btn-primary tip" title="<?php echo tr('Nessun Contratto'); ?>" style="opacity:0.5;cursor:default;" ><i class="fa fa-plus"></i> Contratto</a>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
$numero_doc = ($records[0]['numero_esterno'] != '') ? $records[0]['numero_esterno'] : $records[0]['numero'];
|
||||
|
@ -322,12 +310,16 @@ if ($records[0]['stato'] != 'Pagato' && $records[0]['stato'] != 'Emessa') {
|
|||
echo '
|
||||
<a class="btn btn-sm btn-primary tip" title="Nessun ddt" style="opacity:0.5;cursor:default;"><i class="fa fa-plus"></i> Ddt</a>';
|
||||
}
|
||||
}
|
||||
|
||||
if ($dbo->fetchNum('SELECT * FROM mg_articoli WHERE qta > 0')) {
|
||||
echo '
|
||||
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir ?>/modules/fatture/add_articolo.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>" data-toggle="modal" data-title="Aggiungi articolo" data-target="#bs-popup"><i class="fa fa-plus"></i> Articolo</a>';
|
||||
} ?>
|
||||
|
||||
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir ?>/modules/fatture/add_articolo.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>" data-toggle="modal" data-title="Aggiungi articolo" data-target="#bs-popup"><i class="fa fa-plus"></i> Articolo</a>
|
||||
|
||||
<a class="btn btn-sm btn-primary" data-href="<?php echo $rootdir ?>/modules/fatture/add_riga.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>" data-toggle="modal" data-title="Aggiungi riga" data-target="#bs-popup"><i class="fa fa-plus"></i> Riga generica</a>
|
||||
<?php
|
||||
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
@ -364,12 +356,10 @@ if ($dir == 'entrata') {
|
|||
?>
|
||||
<a class="btn btn-info btn-sm pull-right" href="<?php echo $rootdir ?>/pdfgen.php?ptype=fatture_accompagnatorie&iddocumento=<?php echo $id_record ?>" target="_blank"><i class="fa fa-print"></i> Stampa fattura</a>
|
||||
<?php
|
||||
|
||||
} else {
|
||||
?>
|
||||
<a class="btn btn-info btn-sm pull-right" href="<?php echo $rootdir ?>/pdfgen.php?ptype=fatture&iddocumento=<?php echo $id_record ?>" target="_blank"><i class="fa fa-print"></i> Stampa fattura</a>
|
||||
<?php
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -79,7 +79,7 @@ if (empty($data)) {
|
|||
if (null !== filter('data')) {
|
||||
$data = filter('data');
|
||||
} else {
|
||||
$data = date(Translator::getLocaleFormatter()->getDatePattern());
|
||||
$data = date(Translator::getFormatter()->getDatePattern());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') {
|
|||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>'.tr('Sconto totale', [], ['upper' => true]).'</th>
|
||||
<th>'.tr('Sconto incondizionato', [], ['upper' => true]).'</th>
|
||||
<td class="text-right">-</td>
|
||||
<td class="text-right">-</td>
|
||||
<td class="text-right">'.Translator::numberToLocale(-$costi['sconto_globale']).' €</td>
|
||||
|
@ -60,7 +60,7 @@ if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') {
|
|||
</table>';
|
||||
}
|
||||
|
||||
// Lettura dello sconto globale
|
||||
// Lettura dello sconto incondizionato
|
||||
$rss = $dbo->fetchArray('SELECT sconto_globale, tipo_sconto_globale FROM in_interventi WHERE id='.prepare($id_record));
|
||||
$sconto = $rss[0]['sconto_globale'];
|
||||
$tipo_sconto = $rss[0]['tipo_sconto_globale'];
|
||||
|
@ -70,7 +70,7 @@ echo '
|
|||
<!-- SCONTO -->
|
||||
<div class="row">
|
||||
<div class="col-md-4 pull-right">
|
||||
{[ "type": "number", "label": "'.tr('Sconto globale').'", "name": "sconto_globale", "value": "'.$sconto.'", "icon-after": "choice|untprc|'.$tipo_sconto.'" ]}
|
||||
{[ "type": "number", "label": "'.tr('Sconto incondizionato').'", "name": "sconto_globale", "value": "'.$sconto.'", "icon-after": "choice|untprc|'.$tipo_sconto.'" ]}
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
|
|
|
@ -234,7 +234,7 @@ function get_costi_intervento($id_intervento)
|
|||
$result['altro_scontato'],
|
||||
]);
|
||||
|
||||
// Calcolo dello sconto globale
|
||||
// Calcolo dello sconto incondizionato
|
||||
$sconto = $dbo->fetchArray('SELECT sconto_globale, tipo_sconto_globale FROM in_interventi WHERE id='.prepare($id_intervento))[0];
|
||||
$result['sconto_globale'] = ($sconto['tipo_sconto_globale'] == 'PRC') ? $result['totale_scontato'] * $sconto['sconto_globale'] / 100 : $sconto['sconto_globale'];
|
||||
$result['sconto_globale'] = round($result['sconto_globale'], $decimals);
|
||||
|
|
|
@ -64,7 +64,7 @@ if ($module['name'] == 'Ordini cliente') {
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
{[ "type": "number", "label": "<?php echo tr('Sconto totale') ?>", "name": "sconto_generico", "value": "$sconto_globale$", "icon-after": "choice|untprc|$tipo_sconto_globale$" ]}
|
||||
{[ "type": "number", "label": "<?php echo tr('Sconto incondizionato') ?>", "name": "sconto_generico", "value": "$sconto_globale$", "icon-after": "choice|untprc|$tipo_sconto_globale$" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -97,7 +97,7 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
{[ "type": "number", "label": "<?php echo tr('Sconto totale') ?>", "name": "sconto_generico", "value": "$sconto_globale$", "icon-after": "choice|untprc|$tipo_sconto_globale$" ]}
|
||||
{[ "type": "number", "label": "<?php echo tr('Sconto incondizionato') ?>", "name": "sconto_generico", "value": "$sconto_globale$", "icon-after": "choice|untprc|$tipo_sconto_globale$" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -114,13 +114,13 @@ class Filter
|
|||
$output = trim(self::getPurifier()->purify($input));
|
||||
|
||||
if (!empty($output)) {
|
||||
if (Translator::getLocaleFormatter()->isNumber($output)) {
|
||||
if (Translator::getFormatter()->isFormattedNumber($output)) {
|
||||
$output = Translator::numberToEnglish($output);
|
||||
} elseif (Translator::getLocaleFormatter()->isTimestamp($output)) {
|
||||
} elseif (Translator::getFormatter()->isFormattedTimestamp($output)) {
|
||||
$output = Translator::timestampToEnglish($output);
|
||||
} elseif (Translator::getLocaleFormatter()->isDate($output)) {
|
||||
} elseif (Translator::getFormatter()->isFormattedDate($output)) {
|
||||
$output = Translator::dateToEnglish($output);
|
||||
} elseif (Translator::getLocaleFormatter()->isTime($output)) {
|
||||
} elseif (Translator::getFormatter()->isFormattedTime($output)) {
|
||||
$output = Translator::timeToEnglish($output);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,33 +11,25 @@ class DateHandler implements HandlerInterface
|
|||
{
|
||||
// Impostazione alla data corrente se il contenuto corrisponde a "now"
|
||||
if ($values['value'] == '-now-') {
|
||||
$values['value'] = date(\Translator::getEnglishFormatter()->getTimestampPattern());
|
||||
$values['value'] = date(\Translator::getFormatter()->getStandardFormats()['timestamp']);
|
||||
}
|
||||
|
||||
if ($values['max-date'] == '-now-') {
|
||||
$values['max-date'] = date(\Translator::getEnglishFormatter()->getTimestampPattern());
|
||||
$values['max-date'] = date(\Translator::getFormatter()->getStandardFormats()['timestamp']);
|
||||
}
|
||||
|
||||
if ($values['min-date'] == '-now-') {
|
||||
$values['min-date'] = date(\Translator::getEnglishFormatter()->getTimestampPattern());
|
||||
$values['min-date'] = date(\Translator::getFormatter()->getStandardFormats()['timestamp']);
|
||||
}
|
||||
|
||||
if (\Translator::getEnglishFormatter()->isTimestamp($values['value']) && $values['type'] == 'timestamp') {
|
||||
if ($values['type'] == 'timestamp') {
|
||||
$values['value'] = \Translator::timestampToLocale($values['value']);
|
||||
} elseif (\Translator::getEnglishFormatter()->isDate($values['value']) && $values['type'] == 'date') {
|
||||
} elseif ($values['type'] == 'date') {
|
||||
$values['value'] = \Translator::dateToLocale($values['value']);
|
||||
} elseif (\Translator::getEnglishFormatter()->isTime($values['value']) && $values['type'] == 'time') {
|
||||
} elseif ($values['type'] == 'time') {
|
||||
$values['value'] = \Translator::timeToLocale($values['value']);
|
||||
}
|
||||
|
||||
$resetValues = [
|
||||
\Translator::timestampToLocale('0000-00-00 00:00:00'),
|
||||
\Translator::dateToLocale('0000-00-00'),
|
||||
\Translator::timeToLocale('00:00:00'),
|
||||
];
|
||||
|
||||
$values['value'] = in_array($values['value'], $resetValues) ? '' : $values['value'];
|
||||
|
||||
$result = $this->{$values['type']}($values, $extras);
|
||||
|
||||
$values['type'] = 'text';
|
||||
|
@ -55,8 +47,6 @@ class DateHandler implements HandlerInterface
|
|||
$values['class'][] = 'text-center';
|
||||
$values['class'][] = 'timestamp-picker';
|
||||
$values['class'][] = 'timestamp-mask';
|
||||
|
||||
$values['value'] = (\Translator::getLocaleFormatter()->isTimestamp($values['value'])) ? $values['value'] : '';
|
||||
}
|
||||
|
||||
protected function date(&$values, &$extras)
|
||||
|
@ -64,15 +54,11 @@ class DateHandler implements HandlerInterface
|
|||
$values['class'][] = 'text-center';
|
||||
$values['class'][] = 'datepicker';
|
||||
$values['class'][] = 'date-mask';
|
||||
|
||||
$values['value'] = (\Translator::getLocaleFormatter()->isDate($values['value'])) ? $values['value'] : '';
|
||||
}
|
||||
|
||||
protected function time(&$values, &$extras)
|
||||
{
|
||||
$values['class'][] = 'text-center';
|
||||
$values['class'][] = 'timepicker';
|
||||
|
||||
$values['value'] = (\Translator::getLocaleFormatter()->isTime($values['value'])) ? $values['value'] : '';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -75,7 +75,7 @@ class DefaultHandler implements HandlerInterface
|
|||
}
|
||||
}
|
||||
|
||||
$values['value'] = (\Translator::getEnglishFormatter()->isNumber($values['value'])) ? \Translator::numberToLocale($values['value'], $decimals) : $values['value'];
|
||||
$values['value'] = (\Translator::getFormatter()->isStandardNumber($values['value'])) ? \Translator::numberToLocale($values['value'], $decimals) : $values['value'];
|
||||
|
||||
$values['type'] = 'text';
|
||||
|
||||
|
|
|
@ -3,8 +3,7 @@
|
|||
namespace Intl;
|
||||
|
||||
use DateTime;
|
||||
use UnexpectedValueException;
|
||||
use Exception;
|
||||
use NumberFormatter;
|
||||
|
||||
/**
|
||||
* Classe per gestire la formattazione di date e numeri in convenzioni differenti.
|
||||
|
@ -13,8 +12,14 @@ use Exception;
|
|||
*/
|
||||
class Formatter
|
||||
{
|
||||
/** @var array Separatori per la formattazione dei numeri */
|
||||
protected $numberSeparators;
|
||||
protected static $standards = [
|
||||
'timestamp' => 'Y-m-d H:i:s',
|
||||
'date' => 'Y-m-d',
|
||||
'time' => 'H:i:s',
|
||||
];
|
||||
|
||||
/** @var NumberFormatter Oggetto dedicato alla formattazione dei numeri */
|
||||
protected $numberFormatter;
|
||||
|
||||
/** @var string Pattern per le date */
|
||||
protected $datePattern;
|
||||
|
@ -23,135 +28,64 @@ class Formatter
|
|||
/** @var string Pattern per i timestamp */
|
||||
protected $timestampPattern;
|
||||
|
||||
public function __construct($numberSeparators = [], $date = null, $time = null, $timestamp = null)
|
||||
public function __construct($locale, $timestamp = null, $date = null, $time = null)
|
||||
{
|
||||
$this->setNumberSeparators($numberSeparators);
|
||||
$this->numberFormatter = new NumberFormatter($locale, NumberFormatter::DECIMAL);
|
||||
|
||||
$this->setTimestampPattern($timestamp);
|
||||
|
||||
$this->setDatePattern($date);
|
||||
|
||||
$this->setTimePattern($time);
|
||||
|
||||
$this->setTimestampPattern($timestamp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il formato dei numeri.
|
||||
*
|
||||
* @param string $values
|
||||
*/
|
||||
protected function setNumberSeparators($values)
|
||||
{
|
||||
$decimals = empty($values['decimals']) ? '.' : $values['decimals'];
|
||||
$thousands = !isset($values['thousands']) ? '' : $values['thousands'];
|
||||
|
||||
if ($decimals == $thousands) {
|
||||
throw new Exception('Bad separators');
|
||||
}
|
||||
|
||||
$this->numberSeparators = [
|
||||
'decimals' => $decimals,
|
||||
'thousands' => $thousands,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce i separatori utilizzati per la formattazione.
|
||||
* Restituisce gli elementi di separazione secondo la formattazione in utilizzo.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getNumberSeparators()
|
||||
public function getStandardFormats()
|
||||
{
|
||||
return $this->numberSeparators;
|
||||
return static::$standards;
|
||||
}
|
||||
|
||||
// Gestione della conversione dei numeri
|
||||
|
||||
/**
|
||||
* Imposta il formato della data.
|
||||
* Converte un numero da una formattazione all'altra.
|
||||
*
|
||||
* @param string $value
|
||||
*/
|
||||
protected function setDatePattern($value)
|
||||
{
|
||||
$value = empty($value) ? 'Y-m-d' : $value;
|
||||
|
||||
if (is_array($value)) {
|
||||
$pattern = implode($value['separator'], $value['order']);
|
||||
$pattern = str_replace(['day', 'month', 'year'], ['d', 'm', 'Y'], $pattern);
|
||||
} else {
|
||||
$pattern = $value;
|
||||
}
|
||||
|
||||
$this->datePattern = $pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il formato della data.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDatePattern()
|
||||
public function formatNumber($value, $decimals = null)
|
||||
{
|
||||
return $this->datePattern;
|
||||
}
|
||||
$value = trim($value);
|
||||
|
||||
/**
|
||||
* Imposta il formato dell'orario.
|
||||
*
|
||||
* @param string $value
|
||||
*/
|
||||
protected function setTimePattern($value)
|
||||
{
|
||||
$value = empty($value) ? 'H:i:s' : $value;
|
||||
|
||||
if (is_array($value)) {
|
||||
$pattern = implode($value['separator'], $value['order']);
|
||||
$pattern = str_replace(['hours', 'minutes', 'seconds'], ['H', 'i', 's'], $pattern);
|
||||
} else {
|
||||
$pattern = $value;
|
||||
if (!empty($decimals)) {
|
||||
$original = $this->numberFormatter->getAttribute(NumberFormatter::FRACTION_DIGITS);
|
||||
$this->numberFormatter->setAttribute(NumberFormatter::FRACTION_DIGITS, $decimals);
|
||||
}
|
||||
|
||||
$this->timePattern = $pattern;
|
||||
$result = $this->numberFormatter->format($value);
|
||||
|
||||
if (!empty($decimals)) {
|
||||
$this->numberFormatter->setAttribute(NumberFormatter::FRACTION_DIGITS, $original);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il formato dell'orario.
|
||||
* Converte un numero da una formattazione all'altra.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTimePattern()
|
||||
public function parseNumber($value)
|
||||
{
|
||||
return $this->timePattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il formato del timestamp.
|
||||
*
|
||||
* @param string $value
|
||||
*/
|
||||
protected function setTimestampPattern($value)
|
||||
{
|
||||
$value = empty($value) ? [
|
||||
'order' => ['date', 'time'],
|
||||
'separator' => ' ',
|
||||
] : $value;
|
||||
|
||||
if (is_array($value)) {
|
||||
$pattern = implode($value['separator'], $value['order']);
|
||||
$pattern = str_replace(['date', 'time'], [$this->getDatePattern(), $this->getTimePattern()], $pattern);
|
||||
} else {
|
||||
$pattern = $value;
|
||||
}
|
||||
|
||||
$this->timestampPattern = $pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il formato del timestamp.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTimestampPattern()
|
||||
{
|
||||
return $this->timestampPattern;
|
||||
return $this->numberFormatter->parse($value);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -161,15 +95,80 @@ class Formatter
|
|||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isNumber($value)
|
||||
public function isStandardNumber($value)
|
||||
{
|
||||
try {
|
||||
$this->toNumberObject($value);
|
||||
} catch (Exception $e) {
|
||||
return false;
|
||||
}
|
||||
$result = $this->formatNumber($value);
|
||||
|
||||
return true;
|
||||
return is_numeric($value) && !empty($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Controlla se l'elemento indicato è un numero.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isFormattedNumber($value)
|
||||
{
|
||||
$result = $this->parseNumber($value);
|
||||
|
||||
return !empty($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta la precisione di default per i numeri da formattare.
|
||||
*
|
||||
* @param int $decimals
|
||||
*/
|
||||
public function setPrecision($decimals)
|
||||
{
|
||||
$this->numberFormatter->setAttribute(NumberFormatter::FRACTION_DIGITS, $decimals);
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce gli elementi di separazione secondo la formattazione in utilizzo.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getNumberSeparators()
|
||||
{
|
||||
return [
|
||||
'decimals' => $this->numberFormatter->getSymbol(NumberFormatter::DECIMAL_SEPARATOR_SYMBOL),
|
||||
'thousands' => $this->numberFormatter->getSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL),
|
||||
];
|
||||
}
|
||||
|
||||
// Gestione della conversione dei timestamp
|
||||
|
||||
/**
|
||||
* Converte un timestamp da una formattazione all'altra.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatTimestamp($value)
|
||||
{
|
||||
$object = DateTime::createFromFormat(static::$standards['timestamp'], $value);
|
||||
$result = is_object($object) ? $object->format($this->getTimestampPattern()) : false;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte un timestamp da una formattazione all'altra.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function parseTimestamp($value)
|
||||
{
|
||||
$object = DateTime::createFromFormat($this->getTimestampPattern(), $value);
|
||||
$result = is_object($object) ? $object->format(static::$standards['timestamp']) : false;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -179,15 +178,81 @@ class Formatter
|
|||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isTimestamp($value)
|
||||
public function isStandardTimestamp($value)
|
||||
{
|
||||
try {
|
||||
$this->toTimestampObject($value);
|
||||
} catch (Exception $e) {
|
||||
return false;
|
||||
}
|
||||
$result = $this->formatTimestamp($value);
|
||||
|
||||
return true;
|
||||
return !empty($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Controlla se l'elemento indicato è un timestamp.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isFormattedTimestamp($value)
|
||||
{
|
||||
$result = $this->parseTimestamp($value);
|
||||
|
||||
return !empty($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il formato del timestamp.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTimestampPattern($type = null)
|
||||
{
|
||||
return $this->timestampPattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il formato del timestamp.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function setTimestampPattern($pattern)
|
||||
{
|
||||
return $this->timestampPattern = $pattern;
|
||||
}
|
||||
|
||||
// Gestione della conversione delle date
|
||||
|
||||
/**
|
||||
* Converte una data da una formattazione all'altra.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatDate($value)
|
||||
{
|
||||
$object = DateTime::createFromFormat(static::$standards['date'], $value);
|
||||
|
||||
// Fallback per la gestione dei timestamp
|
||||
$object = !is_object($object) ? DateTime::createFromFormat(static::$standards['timestamp'], $value) : $object;
|
||||
|
||||
$result = is_object($object) ? $object->format($this->getDatePattern()) : false;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte una data da una formattazione all'altra.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function parseDate($value)
|
||||
{
|
||||
$object = DateTime::createFromFormat($this->getDatePattern(), $value);
|
||||
$result = is_object($object) ? $object->format(static::$standards['date']) : false;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -197,15 +262,81 @@ class Formatter
|
|||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isDate($value)
|
||||
public function isStandardDate($value)
|
||||
{
|
||||
try {
|
||||
$this->toDateObject($value);
|
||||
} catch (Exception $e) {
|
||||
return false;
|
||||
}
|
||||
$result = $this->formatDate($value);
|
||||
|
||||
return true;
|
||||
return !empty($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Controlla se l'elemento indicato è una data.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isFormattedDate($value)
|
||||
{
|
||||
$result = $this->parseDate($value);
|
||||
|
||||
return !empty($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il formato del timestamp.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDatePattern($type = null)
|
||||
{
|
||||
return $this->timestampPattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Imposta il formato del timestamp.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function setDatePattern($pattern)
|
||||
{
|
||||
return $this->timestampPattern = $pattern;
|
||||
}
|
||||
|
||||
// Gestione della conversione degli orarii
|
||||
|
||||
/**
|
||||
* Converte un orario da una formattazione all'altra.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatTime($value)
|
||||
{
|
||||
$object = DateTime::createFromFormat(static::$standards['time'], $value);
|
||||
|
||||
// Fallback per la gestione dei timestamp
|
||||
$object = !is_object($object) ? DateTime::createFromFormat(static::$standards['timestamp'], $value) : $object;
|
||||
|
||||
$result = is_object($object) ? $object->format($this->getTimePattern()) : false;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte un orario da una formattazione all'altra.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function parseTime($value)
|
||||
{
|
||||
$object = DateTime::createFromFormat($this->getTimePattern(), $value);
|
||||
$result = is_object($object) ? $object->format(static::$standards['time']) : false;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -215,260 +346,44 @@ class Formatter
|
|||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isTime($value)
|
||||
public function isStandardTime($value)
|
||||
{
|
||||
try {
|
||||
$this->toTimeObject($value);
|
||||
} catch (Exception $e) {
|
||||
return false;
|
||||
}
|
||||
$result = $this->formatTime($value);
|
||||
|
||||
return true;
|
||||
return !empty($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte l'elemento in una rappresentazione numerica.
|
||||
* Controlla se l'elemento indicato è un orario.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return array
|
||||
* @return bool
|
||||
*/
|
||||
public function toNumberObject($value)
|
||||
public function isFormattedTime($value)
|
||||
{
|
||||
$value = trim($value);
|
||||
$result = $this->parseTime($value);
|
||||
|
||||
if (strlen($value) == 0) {
|
||||
throw new UnexpectedValueException('Format not supported');
|
||||
}
|
||||
|
||||
$sign = null;
|
||||
if ($value[0] == '+' || $value[0] == '-') {
|
||||
$sign = $value[0];
|
||||
$value = trim(substr($value, 1));
|
||||
} elseif (!is_numeric($value[0])) {
|
||||
throw new UnexpectedValueException('Format not supported');
|
||||
}
|
||||
|
||||
if (strlen($value) == 0) {
|
||||
throw new UnexpectedValueException('Format not supported');
|
||||
}
|
||||
|
||||
$pieces = explode($this->getNumberSeparators()['decimals'], $value);
|
||||
if (count($pieces) > 2) {
|
||||
throw new UnexpectedValueException('Format not supported');
|
||||
}
|
||||
$integer = $pieces[0];
|
||||
$decimal = (isset($pieces[1])) ? $pieces[1] : null;
|
||||
|
||||
if (!empty($this->getNumberSeparators()['thousands'])) {
|
||||
$error = true;
|
||||
if (floor(strlen($integer) / 4) == substr_count($integer, $this->getNumberSeparators()['thousands'])) {
|
||||
$values = str_split(strrev($integer), 4);
|
||||
|
||||
foreach ($values as $key => $value) {
|
||||
if (strlen($value) == 4 && ends_with($value, '.')) {
|
||||
$values[$key] = substr($value, 0, -1);
|
||||
}
|
||||
}
|
||||
|
||||
$integer = strrev(implode($values));
|
||||
|
||||
$error = substr_count($integer, $this->getNumberSeparators()['thousands']);
|
||||
}
|
||||
|
||||
if (!empty($error)) {
|
||||
throw new UnexpectedValueException('Format not supported');
|
||||
}
|
||||
}
|
||||
|
||||
if (!ctype_digit($integer) || (strlen($integer) != strlen((int) $integer)) || (isset($decimal) && !ctype_digit($decimal))) {
|
||||
throw new UnexpectedValueException('Format not supported');
|
||||
}
|
||||
|
||||
return [$sign, $integer, $decimal];
|
||||
return !empty($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte l'elemento dal formato personalizzato a quello predefinito di PHP.
|
||||
*
|
||||
* @param string $value
|
||||
* Restituisce il formato del orario.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toTimestampObject($value)
|
||||
public function getTimePattern($type = null)
|
||||
{
|
||||
$value = trim($value);
|
||||
|
||||
$result = DateTime::createFromFormat($this->getTimestampPattern(), $value);
|
||||
|
||||
if (!is_object($result)) {
|
||||
throw new UnexpectedValueException('Format not supported');
|
||||
}
|
||||
|
||||
return $result;
|
||||
return $this->orarioPattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte l'elemento dal formato personalizzato a quello predefinito di PHP.
|
||||
*
|
||||
* @param string $value
|
||||
* Imposta il formato del orario.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toDateObject($value)
|
||||
public function setTimePattern($pattern)
|
||||
{
|
||||
$value = trim($value);
|
||||
|
||||
$result = DateTime::createFromFormat($this->getDatePattern(), $value);
|
||||
|
||||
$result = !is_object($result) ? $this->toTimestampObject($value) : $result;
|
||||
|
||||
if (!is_object($result)) {
|
||||
throw new UnexpectedValueException('Format not supported');
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte l'elemento dal formato personalizzato a quello predefinito di PHP.
|
||||
*
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toTimeObject($value)
|
||||
{
|
||||
$value = trim($value);
|
||||
|
||||
$result = DateTime::createFromFormat($this->getTimePattern(), $value);
|
||||
|
||||
$result = !is_object($result) ? $this->toTimestampObject($value) : $result;
|
||||
|
||||
if (!is_object($result)) {
|
||||
throw new UnexpectedValueException('Format not supported');
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte un numero da una formattazione all'altra.
|
||||
*
|
||||
* @param Formatter $formatter
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatNumberTo($formatter, $value)
|
||||
{
|
||||
$pieces = $this->toNumberObject($value);
|
||||
|
||||
$result = (!empty($pieces[0])) ? $pieces[0] : '';
|
||||
|
||||
$result .= number_format($pieces[1], 0, '', $formatter->getNumberSeparators()['thousands']);
|
||||
|
||||
if (isset($pieces[2])) {
|
||||
$result .= $formatter->getNumberSeparators()['decimals'].$pieces[2];
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte un timestamp da una formattazione all'altra.
|
||||
*
|
||||
* @param Formatter $formatter
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatTimestampTo($formatter, $value)
|
||||
{
|
||||
$result = $this->toTimestampObject($value);
|
||||
|
||||
return $result->format($formatter->getTimestampPattern());
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte una data da una formattazione all'altra.
|
||||
*
|
||||
* @param Formatter $formatter
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatDateTo($formatter, $value)
|
||||
{
|
||||
$result = $this->toDateObject($value);
|
||||
|
||||
return $result->format($formatter->getDatePattern());
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte un orario da una formattazione all'altra.
|
||||
*
|
||||
* @param Formatter $formatter
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatTimeTo($formatter, $value)
|
||||
{
|
||||
$result = $this->toTimeObject($value);
|
||||
|
||||
return $result->format($formatter->getTimePattern());
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte un numero da una formattazione all'altra.
|
||||
*
|
||||
* @param Formatter $formatter
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatNumberFrom($formatter, $value)
|
||||
{
|
||||
return $formatter->formatNumberTo($this, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte un timestamp da una formattazione all'altra.
|
||||
*
|
||||
* @param Formatter $formatter
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatTimestampFrom($formatter, $value)
|
||||
{
|
||||
return $formatter->formatTimestampTo($this, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte una data da una formattazione all'altra.
|
||||
*
|
||||
* @param Formatter $formatter
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatDateFrom($formatter, $value)
|
||||
{
|
||||
return $formatter->formatDateTo($this, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converte un orario da una formattazione all'altra.
|
||||
*
|
||||
* @param Formatter $formatter
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function formatTimeFrom($formatter, $value)
|
||||
{
|
||||
return $formatter->formatTimeTo($this, $value);
|
||||
return $this->orarioPattern = $pattern;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ class Permissions
|
|||
public static function addModule($module)
|
||||
{
|
||||
$id = Modules::getModule($module)['id'];
|
||||
if (is_int($id) && !in_array($id, self::$permissions)) {
|
||||
if (!in_array($id, self::$permissions)) {
|
||||
self::$permissions[] = $id;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,9 +8,7 @@
|
|||
class Translator extends Util\Singleton
|
||||
{
|
||||
/** @var Intl\Formatter Oggetto per la conversione di date e numeri nella lingua selezionata */
|
||||
protected static $localeFormatter;
|
||||
/** @var Intl\Formatter Oggetto per la conversione di date e numeri nella formattazione originale */
|
||||
protected static $englishFormatter;
|
||||
protected static $formatter;
|
||||
|
||||
/** @var Symfony\Component\Translation\Translator Oggetto dedicato alle traduzioni */
|
||||
protected $translator;
|
||||
|
@ -112,11 +110,20 @@ class Translator extends Util\Singleton
|
|||
*
|
||||
* @param string $locale
|
||||
*/
|
||||
public function setLocale($locale)
|
||||
public function setLocale($locale, $formatter = [])
|
||||
{
|
||||
if (!empty($locale) && $this->isLocaleAvailable($locale)) {
|
||||
$this->translator->setLocale($locale);
|
||||
$this->locale = $locale;
|
||||
|
||||
self::$formatter = new Intl\Formatter(
|
||||
$this->locale,
|
||||
empty($formatter['timestamp']) ? 'd/m/Y H:i' : $formatter['timestamp'],
|
||||
empty($formatter['date']) ? 'd/m/Y' : $formatter['date'],
|
||||
empty($formatter['time']) ? 'H:i' : $formatter['time']
|
||||
);
|
||||
|
||||
self::$formatter->setPrecision(Settings::get('Cifre decimali per importi'));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -168,59 +175,14 @@ class Translator extends Util\Singleton
|
|||
return (string) $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Genera l'oggetto dedicato alla gestione delle conversioni nella lingua locale.
|
||||
*
|
||||
* @param array $formatter
|
||||
*/
|
||||
public static function setLocaleFormatter($formatter = [])
|
||||
{
|
||||
self::$localeFormatter = new Intl\Formatter(
|
||||
empty($formatter['numbers']) ? [
|
||||
'decimals' => ',',
|
||||
'thousands' => '.',
|
||||
] : $formatter['numbers'],
|
||||
empty($formatter['date']) ? 'd/m/Y' : $formatter['date'],
|
||||
empty($formatter['time']) ? 'H:i' : $formatter['time'],
|
||||
empty($formatter['timestamp']) ? null : $formatter['timestamp']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il formato locale della data.
|
||||
*
|
||||
* @return Intl\Formatter
|
||||
*/
|
||||
public static function getLocaleFormatter()
|
||||
public static function getFormatter()
|
||||
{
|
||||
if (empty(self::$localeFormatter)) {
|
||||
self::setLocaleFormatter();
|
||||
}
|
||||
|
||||
return self::$localeFormatter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il formato locale della data.
|
||||
*
|
||||
* @return Intl\Formatter
|
||||
*/
|
||||
public static function getEnglishFormatter()
|
||||
{
|
||||
if (empty(self::$englishFormatter)) {
|
||||
self::$englishFormatter = new Intl\Formatter();
|
||||
}
|
||||
|
||||
return self::$englishFormatter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restituisce il formato locale della data.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getLocaleDatePattern()
|
||||
{
|
||||
return self::getLocaleFormatter()->getDatePattern();
|
||||
return self::$formatter;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -232,7 +194,7 @@ class Translator extends Util\Singleton
|
|||
*/
|
||||
public static function numberToEnglish($string)
|
||||
{
|
||||
return floatval(self::getLocaleFormatter()->formatNumberTo(self::getEnglishFormatter(), $string));
|
||||
return floatval(self::getFormatter()->parseNumber($string));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -243,17 +205,11 @@ class Translator extends Util\Singleton
|
|||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function numberToLocale($string, $decimals = true)
|
||||
public static function numberToLocale($string, $decimals = null)
|
||||
{
|
||||
$string = !isset($string) ? 0 : $string;
|
||||
|
||||
if (isset($decimals) && (is_int($decimals) || !empty($decimals))) {
|
||||
$decimals = is_numeric($decimals) ? $decimals : Settings::get('Cifre decimali per importi');
|
||||
|
||||
$string = number_format($string, $decimals, self::getEnglishFormatter()->getNumberSeparators()['decimals'], self::getEnglishFormatter()->getNumberSeparators()['thousands']);
|
||||
}
|
||||
|
||||
return self::getEnglishFormatter()->formatNumberTo(self::getLocaleFormatter(), $string);
|
||||
return self::getFormatter()->formatNumber($string, $decimals);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -265,7 +221,7 @@ class Translator extends Util\Singleton
|
|||
*/
|
||||
public static function dateToEnglish($string)
|
||||
{
|
||||
return self::getLocaleFormatter()->formatDateTo(self::getEnglishFormatter(), $string);
|
||||
return self::getFormatter()->parseDate($string);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -276,13 +232,9 @@ class Translator extends Util\Singleton
|
|||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function dateToLocale($string, $fail = null)
|
||||
public static function dateToLocale($string)
|
||||
{
|
||||
if (!self::isValid($string)) {
|
||||
return $fail;
|
||||
}
|
||||
|
||||
return self::getEnglishFormatter()->formatDateTo(self::getLocaleFormatter(), $string);
|
||||
return self::getFormatter()->formatDate($string);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -294,7 +246,7 @@ class Translator extends Util\Singleton
|
|||
*/
|
||||
public static function timeToEnglish($string)
|
||||
{
|
||||
return self::getLocaleFormatter()->formatTimeTo(self::getEnglishFormatter(), $string);
|
||||
return self::getFormatter()->parseTime($string);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -305,13 +257,9 @@ class Translator extends Util\Singleton
|
|||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function timeToLocale($string, $fail = null)
|
||||
public static function timeToLocale($string)
|
||||
{
|
||||
if (!self::isValid($string)) {
|
||||
return $fail;
|
||||
}
|
||||
|
||||
return self::getEnglishFormatter()->formatTimeTo(self::getLocaleFormatter(), $string);
|
||||
return self::getFormatter()->formatTime($string);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -323,7 +271,7 @@ class Translator extends Util\Singleton
|
|||
*/
|
||||
public static function timestampToEnglish($string)
|
||||
{
|
||||
return self::getLocaleFormatter()->formatTimestampTo(self::getEnglishFormatter(), $string);
|
||||
return self::getFormatter()->parseTimestamp($string);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -334,24 +282,8 @@ class Translator extends Util\Singleton
|
|||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function timestampToLocale($string, $fail = null)
|
||||
public static function timestampToLocale($string)
|
||||
{
|
||||
if (!self::isValid($string)) {
|
||||
return $fail;
|
||||
}
|
||||
|
||||
return self::getEnglishFormatter()->formatTimestampTo(self::getLocaleFormatter(), $string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Controlla se una data inserita nella formattazione inglese è valida.
|
||||
*
|
||||
* @param string $timestamp
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected static function isValid($string)
|
||||
{
|
||||
return !in_array($string, ['0000-00-00 00:00:00', '0000-00-00', '00:00:00']);
|
||||
return self::getFormatter()->formatTimestamp($string);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -492,19 +492,23 @@ UPDATE `zz_plugins` SET `script` = 'referenti.php' WHERE `zz_plugins`.`name` = '
|
|||
UPDATE `zz_plugins` SET `script` = 'sedi.php' WHERE `zz_plugins`.`name` = 'Sedi';
|
||||
|
||||
-- Aggiornamento dei vari campi per le Viste
|
||||
UPDATE `zz_views` SET `order_by` = 'data' WHERE `zz_views`.`id` = 125;
|
||||
UPDATE `zz_views` SET `order_by` = 'data' WHERE `zz_views`.`id` = 113;
|
||||
UPDATE `zz_views` SET `order_by` = 'data' WHERE `zz_views`.`id` = 103;
|
||||
UPDATE `zz_views` SET `order_by` = 'data' WHERE `zz_views`.`id` = 96;
|
||||
UPDATE `zz_views` SET `order_by` = 'scadenza' WHERE `zz_views`.`id` = 65;
|
||||
UPDATE `zz_views` SET `order_by` = 'data' WHERE `zz_views`.`id` = 55;
|
||||
UPDATE `zz_views` SET `order_by` = 'data' WHERE `zz_views`.`id` = 48;
|
||||
UPDATE `zz_views` SET `order_by` = 'data' WHERE `zz_views`.`id` = 40;
|
||||
UPDATE `zz_views` SET `order_by` = 'orario_fine' WHERE `zz_views`.`id` = 12;
|
||||
UPDATE `zz_views` SET `order_by` = 'orario_inizio' WHERE `zz_views`.`id` = 11;
|
||||
UPDATE `zz_views` SET `search` = '0' WHERE `zz_views`.`id` = 16;
|
||||
UPDATE `zz_views` SET `search_inside` = 'color_title_Rel.' WHERE `zz_views`.`id` = 6;
|
||||
UPDATE `zz_views` SET `order_by` = 'data_emissione' WHERE `zz_views`.`id` = 64;
|
||||
UPDATE `zz_views` SET `order_by` = 'data' WHERE
|
||||
(`name` = 'Data' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Fatture di vendita')) OR
|
||||
(`name` = 'Data' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Fatture di acquisto')) OR
|
||||
(`name` = 'Data' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Prima nota')) OR
|
||||
(`name` = 'Data' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Ddt di acquisto')) OR
|
||||
(`name` = 'Data' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'MyImpianti')) OR
|
||||
(`name` = 'Data' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Ordini cliente')) OR
|
||||
(`name` = 'Data' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Ddt di vendita'));
|
||||
|
||||
UPDATE `zz_views` SET `order_by` = 'scadenza' WHERE (`name` = 'Data scadenza' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Scadenzario'));
|
||||
|
||||
UPDATE `zz_views` SET `order_by` = 'orario_fine' WHERE (`name` = 'Orario fine' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'));
|
||||
UPDATE `zz_views` SET `order_by` = 'orario_inizio' WHERE (`name` = 'Orario inizio' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'));
|
||||
|
||||
UPDATE `zz_views` SET `search_inside` = 'color_title_Rel' WHERE (`name` = 'color_Rel.' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Anagrafiche'));
|
||||
|
||||
UPDATE `zz_views` SET `search` = '0' WHERE `name` = '_print_';
|
||||
|
||||
-- Aggiornamento icona di default per i moduli senza icona specifica
|
||||
UPDATE `zz_modules` SET `icon`='fa fa-angle-right' WHERE `icon`='fa fa-external-link';
|
||||
|
|
Loading…
Reference in New Issue