Un bug presente da alcune versioni che risolto per l’ultima versione di SuiteCRM, la 7.10.4
Come premesso, la risoluzione del bug e le modifiche proposte sono state eseguite e testate solo nell’ultima versione 7.10.4. Potete provare ad applicarle anche in altre versioni, ma non è sicuro che il codice proposto sia efficace.
Il bug che affligge i filtri per data è legato ad una errata gestione del formato data da parte del modulo “Report”. Se modificate la formattazione delle date dal formato italiano a quello standard inglese nella forma ANNO – MESE – GIORNO i filtri funzioneranno magicamente.
Questo bug è completato da una ulteriore svista per cui nel caso di formati con DATA e ORA, l’ora non viene mai utilizzata nella ricerca.
Vi daremo di seguito indicazione per risolvere il problema.
ATTENZIONE: LE MODIFICHE PROPOSTE SONO UPGRADE UNSAFE! In caso di aggiornamento del sistema potrebbero andare perse o rendere il sistema instabile. Al momento sono testate solo per la versione 7.10.4
Si consiglia di fare il backup dei file interessati prima di procedere per un eventuale ripristino in caso di malfunzionamento.
Le modifiche interessano 3 files:
- modules/AOR_Reports/tpls/report.tpl
- modules/AOR_Reports/aor_utils.php
- modules/AOR_Reports/AOR_Report.js
Questi files modificati sono scaricabili in fondo alla pagina e da questo link. Al loro interno troverete le modifiche evidenziate di seguito.
modules/AOR_Reports/tpls/report.tpl
In questo file è stata ripetuta una azione javascript già presente, che per questo motivo potrebbe creare problemi o doppie esecuzioni della azione. Per questo motivo la commentiamo. Da riga 75 a 127 commentiamo la chiamata indicata nel riquadro.
1 2 3 4 5 6 7 8 9 10 11 |
//Da riga 75 a 127 commentiamo o cancelliamo questa chiamata $('#updateParametersButton').click(function () { //Update the Detail view form to have the parameter info and reload the page var _form = $('#formDetailView'); _form.find('input[name=action]').val('DetailView'); ... ... }); |
modules/AOR_Reports/aor_utils.php
In questo file modifichiamo la funzione convertToDateTime in modo da poter elaborare l’ora in caso di campi con data ed ora. Insieme alla funzione modifichiamo anche le chiamate ad essa.
Il metodo, a riga 440, diventa come indicato sotto con il passaggio dell’ora
1 2 3 4 5 6 7 8 9 10 11 12 |
/** * convertDateValue * @param string $value - date in any user format * @return DateTime $dateTime - converted string */ function convertToDateTime($value, $hour = null) { global $current_user, $timedate; $user_dateformat = $current_user->getPreference('datef'); ... |
modifichiamo poi anche l’elaborazione a riga 523, modificando il codice come indicato sotto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//DA AGGIUNGERE if(!is_null($hour) && $hour != '' ) $formattedValue .= ' '.$hour.':00'; else $formattedValue .= ' 00:00:00'; //FINE: DA AGGIUNGERE $userTimezone = $current_user->getPreference('timezone'); $utz = new DateTimeZone($userTimezone); $dateTime = DateTime::createFromFormat('Y-m-d H:i:s', $formattedValue, $utz); //$dateTime->setTimezone(new DateTimeZone('UTC')); return $dateTime; |
Aggiorniamo ora le chiamate alla funzione convertToDateTime nel blocco di riga 131
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
if ($_REQUEST['parameter_type'][$key] === 'Value') { $paramLength = strlen($_REQUEST['parameter_value'][$key]); $paramValue = $_REQUEST['parameter_value'][$key]; if ($paramLength === 10) { if (strpos($paramValue, '/') === 2 || strpos($paramValue, '/') === 4) { $params[$parameterId] = array( 'id' => $parameterId, 'operator' => $_REQUEST['parameter_operator'][$key], 'type' => $_REQUEST['parameter_type'][$key], //MODIFICA 'value' => convertToDateTime($_REQUEST['parameter_value'][$key], $_REQUEST['parameter_value_hour'][$key])->format('Y-m-d H:i:s'), ); } elseif (strpos($paramValue, '-') === 2 || strpos($paramValue, '-') === 4) { $params[$parameterId] = array( 'id' => $parameterId, 'operator' => $_REQUEST['parameter_operator'][$key], 'type' => $_REQUEST['parameter_type'][$key], //MODIFICA 'value' => convertToDateTime($_REQUEST['parameter_value'][$key], $_REQUEST['parameter_value_hour'][$key])->format('Y-m-d H:i:s'), ); } elseif (strpos($paramValue, '.') === 2 || strpos($paramValue, '.') === 4) { $params[$parameterId] = array( 'id' => $parameterId, 'operator' => $_REQUEST['parameter_operator'][$key], 'type' => $_REQUEST['parameter_type'][$key], //MODIFICA 'value' => convertToDateTime($_REQUEST['parameter_value'][$key], $_REQUEST['parameter_value_hour'][$key])->format('Y-m-d H:i:s'), ); } } } |
modules/AOR_Reports/AOR_Report.js
In questo file modifichiamo la gestione del formato data per evitare la perdita di informazioni che è alla base del problema.
A riga 76 modifichiamo il codice come segue
1 2 3 4 5 6 7 |
//RIGA 76 var formatDate = $.datepicker.formatDate('yy-mm-dd', new Date(date)); //fieldInput = datetime.replace(date, formatDate) + ':00'; fieldInput = date; _form.append('<input type="hidden" name="parameter_value_hour[]" value="'+datetime.substr(11)+'">'); |
e commentiamo riga 94
1 2 3 4 5 6 7 8 9 |
// Fix for issue #1082 - change local date format to db date format if($('#aor_conditions_value\\['+index+'\\]').hasClass('date_input')) { // only change to DB format if its a date if ($('#aor_conditions_value\\[' + ln + '\\]').hasClass('date_input')) { //RIGA DA COMMENTARE //fieldInput = $.datepicker.formatDate('yy-mm-dd', new Date(fieldInput)); } } |