From 573a67d46a0f8bba641c3deb9169d7179137462a Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Wed, 4 Aug 2021 16:42:49 +0200 Subject: [PATCH 01/20] Fix minori --- modules/interventi/src/Components/Sessione.php | 2 +- plugins/notes.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/interventi/src/Components/Sessione.php b/modules/interventi/src/Components/Sessione.php index a5b8912c2..9b4ceb688 100755 --- a/modules/interventi/src/Components/Sessione.php +++ b/modules/interventi/src/Components/Sessione.php @@ -53,7 +53,7 @@ class Sessione extends Model public static function build(Intervento $intervento, Anagrafica $anagrafica, $inizio, $fine) { if (!$anagrafica->isTipo('Tecnico')) { - throw new InvalidArgumentException(); + throw new InvalidArgumentException("Anagrafica di tipo diverso da Tecnico"); } $model = new static(); diff --git a/plugins/notes.php b/plugins/notes.php index 1e945f917..6d2d1f128 100755 --- a/plugins/notes.php +++ b/plugins/notes.php @@ -19,7 +19,7 @@ include_once __DIR__.'/../core.php'; -if (!$notes->isEmpty()) { +if (!empty($notes) && !$notes->isEmpty()) { echo '
From d0f2746d01a41dfc85df11c2eac82cbc728552b0 Mon Sep 17 00:00:00 2001 From: Luca Date: Wed, 4 Aug 2021 20:42:12 +0200 Subject: [PATCH 02/20] Fix add ddt fattura di vendita --- modules/fatture/edit.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/fatture/edit.php b/modules/fatture/edit.php index e782b20fb..c80213854 100755 --- a/modules/fatture/edit.php +++ b/modules/fatture/edit.php @@ -673,7 +673,7 @@ $ddt = $dbo->fetchArray($ddt_query)[0]['tot']; echo ' '; From f15b3925ff12157d19231020296f0c26f5c2cdc8 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Thu, 5 Aug 2021 10:01:49 +0200 Subject: [PATCH 03/20] Correzioni minori JS Dashboard --- modules/dashboard/edit.php | 58 ++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/modules/dashboard/edit.php b/modules/dashboard/edit.php index 66b8ea072..4cf4d3379 100755 --- a/modules/dashboard/edit.php +++ b/modules/dashboard/edit.php @@ -358,6 +358,9 @@ url: globals.rootdir + "/add.php?id_module='.$modulo_interventi->id.'", }, error: "'.tr('Errore durante la creazione degli eventi').'", + genericError: "'.tr('Errore').'", + genericWarning: "'.tr('Attenzione').'", + informazioni_aggiuntive: '.intval(setting('Visualizza informazioni aggiuntive sul calendario')).', }; function aggiorna_contatore(counter_id) { @@ -408,7 +411,7 @@ function carica_interventi_da_pianificare(mese) { $("#elenco-promemoria").html(data); $("#external-events .fc-event").each(function () { - $(this).draggable({ + $(this).draggable({ zIndex: 999, revert: true, revertDuration: 0, @@ -507,7 +510,7 @@ function create_calendar() { header: { left: "prev,next today", center: "title", - right: "month,agendaWeek,agendaDay" + right: "month,agendaWeek,agendaDay" }, timeFormat: globals.dashboard.timeFormat, slotLabelFormat: globals.dashboard.timeFormat, @@ -518,7 +521,7 @@ function create_calendar() { lazyFetching: true, selectMirror: true, eventLimit: false, // allow "more" link when too many events - allDaySlot: '.intval(setting('Visualizza informazioni aggiuntive sul calendario')).', + allDaySlot: globals.dashboard.informazioni_aggiuntive, loading: function (isLoading, view) { if (isLoading) { @@ -556,13 +559,12 @@ function create_calendar() { }, selectable: globals.dashboard.write_permission, - select: function(start, end, allDay) { // info + select: function (start, end, allDay) { // info // let start = info.start; // let end = info.end; - let is_allDay = !start.hasTime() && !end.hasTime(); - - if (is_allDay!==true){ + let intero_giorno = !start.hasTime() && !end.hasTime(); + if (intero_giorno !== true) { let data = moment(start).format("YYYY-MM-DD"); let data_fine = moment(end).format("YYYY-MM-DD"); let orario_inizio = moment(start).format("HH:mm"); @@ -578,35 +580,35 @@ function create_calendar() { }, editable: globals.dashboard.write_permission, - eventDrop: function(event, delta, revertFunc ) {// info + eventDrop: function (event, delta, revertFunc) {// info // let event = info.event; - if (event.allDay!==true){ + if (event.allDay !== true) { $.post(globals.dashboard.load_url, { op: "modifica_intervento", id: event.id, idintervento: event.idintervento, timeStart: moment(event.start).format("YYYY-MM-DD HH:mm"), timeEnd: moment(event.end).format("YYYY-MM-DD HH:mm") - }, function (data, response) { + }, function (data, responseType) { data = $.trim(data); - if (response == "success" && data !== "ok") { - swal("'.tr('Attenzione').'", data, "warning"); - }else if (response !== "success"){ - swal("'.tr('Errore').'", data, "error"); + if (responseType === "success" && data !== "ok") { + swal(globals.dashboard.genericWarning, data, "warning"); + } else if (responseType !== "success") { + swal(globals.dashboard.genericError, data, "error"); } - if (data !=="ok"){ + if (data !== "ok") { revertFunc(); // info.revert(); } }); - }else{ + } else { revertFunc(); } }, - eventResize: function(event, delta, revertFunc) { // info + eventResize: function (event, delta, revertFunc) { // info // let event = info.event; $.post(globals.dashboard.load_url, { @@ -615,16 +617,16 @@ function create_calendar() { idintervento: event.idintervento, timeStart: moment(event.start).format("YYYY-MM-DD HH:mm"), timeEnd: moment(event.end).format("YYYY-MM-DD HH:mm") - }, function (data, response) { + }, function (data, responseType) { data = $.trim(data); - if (response == "success" && data !== "ok") { - swal("'.tr('Attenzione').'", data, "warning"); - }else if (response !== "success"){ - swal("'.tr('Errore').'", data, "error"); + if (responseType === "success" && data !== "ok") { + swal(globals.dashboard.genericWarning, data, "warning"); + } else if (responseType !== "success") { + swal(globals.dashboard.genericError, data, "error"); } - if (data !=="ok"){ + if (data !== "ok") { revertFunc(); // info.revert(); } @@ -632,7 +634,7 @@ function create_calendar() { }, // eventPositioned: function (info) { - eventAfterRender: function(event, element) { + eventAfterRender: function (event, element) { // let event = info.event; // let element = $(info.el); element.find(".fc-title").html(event.title); @@ -640,7 +642,7 @@ function create_calendar() { if (globals.dashboard.tooltip == 1) { element.tooltipster({ - content: "'.tr('Caricamento...').'", + content: globals.translations.loading + "...", animation: "grow", updateAnimation: "grow", contentAsHTML: true, @@ -652,11 +654,11 @@ function create_calendar() { touchDevices: true, trigger: "hover", position: "left", - functionBefore: function(instance, helper) { + functionBefore: function (instance, helper) { let $origin = $(helper.origin); if ($origin.data("loaded") !== true) { - $.post(globals.dashboard.load_url, { + $.post(globals.dashboard.load_url, { op: "tooltip_info", id_record: id_record, allDay: event.allDay, @@ -674,7 +676,7 @@ functionBefore: function(instance, helper) { url: globals.dashboard.load_url + "&op=interventi_periodo", type: "GET", error: function () { - swal("'.tr('Errore').'", globals.dashboard.error, "error"); + swal(globals.dashboard.genericError, globals.dashboard.error, "error"); } } }); From 25157b75a8a11cb761bd90cde667e2698fb49eeb Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Thu, 5 Aug 2021 10:38:41 +0200 Subject: [PATCH 04/20] =?UTF-8?q?Stampa=20personalizzata=20con=20priorit?= =?UTF-8?q?=C3=A0=20rispetto=20a=20standard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Prints.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Prints.php b/src/Prints.php index dcf7833fa..83619fbbf 100755 --- a/src/Prints.php +++ b/src/Prints.php @@ -183,12 +183,12 @@ public static function render($print, $id_record, $directory = null, $return_str exit(); } - if (self::isOldStandard($print)) { + if (self::isCompletelyCustom($print)) { + return self::customLoader($infos['id'], $id_record, $directory, $return_string); + } elseif (self::isOldStandard($print)) { return self::oldLoader($infos['id'], $id_record, $directory, $return_string); - } elseif (!self::isCompletelyCustom($print)) { - return self::loader($infos['id'], $id_record, $directory, $return_string); } else { - return self::customLoader($infos['id'], $id_record, $directory, $return_string); + return self::loader($infos['id'], $id_record, $directory, $return_string); } } From ab27243f131aa3232cbbb405261f51b6e6645126 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Thu, 5 Aug 2021 11:08:35 +0200 Subject: [PATCH 05/20] Aggiunto warning per logout in configurazione OAuth2 --- modules/smtp/edit.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/smtp/edit.php b/modules/smtp/edit.php index fb980e735..1543d40ca 100755 --- a/modules/smtp/edit.php +++ b/modules/smtp/edit.php @@ -121,7 +121,7 @@
- + {[ "type": "select", "label": "'.tr('Provider account').'", "name": "provider", "value": "$provider$", "values": '.json_encode($elenco_provider).', "disabled": "'.intval(empty($account->provider)).'" ]}
@@ -143,6 +143,10 @@ {[ "type": "text", "label": "'.tr('Client Secret').'", "name": "client_secret", "value": "$client_secret$", "disabled": "'.intval(empty($account->provider)).'" ]}
+ +
+ '.tr('Durante la procedura di configurazione verrà effettuato il logout dal gestionale').'. +
From 4691573a2861aa31b91c33075089658f44f94e22 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Thu, 5 Aug 2021 11:18:54 +0200 Subject: [PATCH 06/20] Fix procedura invio email --- src/API/App/v1/SegnalazioneBug.php | 21 ++++++--------------- src/Notifications/EmailNotification.php | 3 +-- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/API/App/v1/SegnalazioneBug.php b/src/API/App/v1/SegnalazioneBug.php index a79b8b7f1..585a0d46f 100644 --- a/src/API/App/v1/SegnalazioneBug.php +++ b/src/API/App/v1/SegnalazioneBug.php @@ -27,7 +27,7 @@ class SegnalazioneBug extends Resource implements RetrieveInterface, CreateInterface { - protected static $bug_email = 'info@openstamanager.com'; + protected static $bug_email = 'thomaszilio77@gmail.com'; public function retrieve($request) { @@ -44,27 +44,18 @@ public function retrieve($request) public function create($request) { + $data = $request['data']; $account = Account::where('predefined', true)->first(); // Preparazione email - $mail = new EmailNotification($account); + $mail = new EmailNotification($account, true); // Destinatario $mail->AddAddress(self::$bug_email); - // Oggetto - $mail->subject = 'Segnalazione bug App OSM '.$request['version']; - - $infos = [ - ]; - - $body = ''; - foreach ($infos as $key => $value) { - $body .= '

'.$key.': '.$value.'

'; - } - - // Contenuti - $mail->content = $body; + // Oggetto e contenuto + $mail->Subject = 'Segnalazione bug App OSM '.$data['version']; + $mail->Body = $data['body']; // Tentativo di invio diretto $email_success = $mail->send(); diff --git a/src/Notifications/EmailNotification.php b/src/Notifications/EmailNotification.php index 71b112d95..831c7175b 100755 --- a/src/Notifications/EmailNotification.php +++ b/src/Notifications/EmailNotification.php @@ -37,7 +37,7 @@ class EmailNotification extends PHPMailer implements NotificationInterface public function __construct($account = null, $exceptions = null) { - parent::__construct(true); + parent::__construct($exceptions); $this->CharSet = 'UTF-8'; @@ -215,7 +215,6 @@ public function send() // Segnalazione degli errori if (!$result) { $logger = logger(); - dd($this->infos); foreach ($this->infos as $info) { $logger->addRecord(\Monolog\Logger::ERROR, $info); } From 458fa5baf94520d8eac9d5e0d21a52bb5919853e Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Thu, 5 Aug 2021 11:40:05 +0200 Subject: [PATCH 07/20] Stile del codice e fix minore --- modules/interventi/src/Components/Sessione.php | 2 +- src/API/App/v1/SegnalazioneBug.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/interventi/src/Components/Sessione.php b/modules/interventi/src/Components/Sessione.php index 9b4ceb688..034cc4690 100755 --- a/modules/interventi/src/Components/Sessione.php +++ b/modules/interventi/src/Components/Sessione.php @@ -53,7 +53,7 @@ class Sessione extends Model public static function build(Intervento $intervento, Anagrafica $anagrafica, $inizio, $fine) { if (!$anagrafica->isTipo('Tecnico')) { - throw new InvalidArgumentException("Anagrafica di tipo diverso da Tecnico"); + throw new InvalidArgumentException('Anagrafica di tipo diverso da Tecnico'); } $model = new static(); diff --git a/src/API/App/v1/SegnalazioneBug.php b/src/API/App/v1/SegnalazioneBug.php index 585a0d46f..cb80574af 100644 --- a/src/API/App/v1/SegnalazioneBug.php +++ b/src/API/App/v1/SegnalazioneBug.php @@ -48,7 +48,7 @@ public function create($request) $account = Account::where('predefined', true)->first(); // Preparazione email - $mail = new EmailNotification($account, true); + $mail = new EmailNotification($account); // Destinatario $mail->AddAddress(self::$bug_email); From 0b140f93cec1511f0ae60393da6c56379528f95d Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Thu, 5 Aug 2021 12:21:34 +0200 Subject: [PATCH 08/20] Miglioramento gestione invio newsletter --- assets/src/js/functions/datatables.js | 2 +- modules/liste_newsletter/edit.php | 10 +++++++++- modules/newsletter/actions.php | 24 +++++++++++++----------- modules/newsletter/ajax/table.php | 4 +++- modules/newsletter/edit.php | 10 +++++++++- 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/assets/src/js/functions/datatables.js b/assets/src/js/functions/datatables.js index 9b1e0a1a6..c5a153506 100755 --- a/assets/src/js/functions/datatables.js +++ b/assets/src/js/functions/datatables.js @@ -116,7 +116,7 @@ function start_datatables() { } else { $('#mini-loader').hide(); } - }) + }); } }); } diff --git a/modules/liste_newsletter/edit.php b/modules/liste_newsletter/edit.php index f0157368f..8d7205dea 100755 --- a/modules/liste_newsletter/edit.php +++ b/modules/liste_newsletter/edit.php @@ -141,7 +141,7 @@ senza_consenso.hide(); } - $("#destinatari").DataTable({ + const table = $("#destinatari").DataTable({ language: globals.translations.datatables, retrieve: true, ordering: false, @@ -159,5 +159,13 @@ searchDelay: 500, pageLength: 50, }); + + table.on("processing.dt", function (e, settings, processing) { + if (processing) { + $("#mini-loader").show(); + } else { + $("#mini-loader").hide(); + } + }); }); '; diff --git a/modules/newsletter/actions.php b/modules/newsletter/actions.php index d88c474ea..68289a52e 100755 --- a/modules/newsletter/actions.php +++ b/modules/newsletter/actions.php @@ -24,6 +24,7 @@ use Modules\Emails\Template; use Modules\ListeNewsletter\Lista; use Modules\Newsletter\Newsletter; +use Respect\Validation\Validator as v; include_once __DIR__.'/../../core.php'; @@ -64,10 +65,16 @@ $uploads = $newsletter->uploads()->pluck('id'); $destinatari = $newsletter->destinatari(); - foreach ($destinatari as $destinatario) { - $anagrafica = $destinatario instanceof Anagrafica ? $destinatario : $destinatario->anagrafica; + $count = $destinatari->count(); + for ($i = 0; $i < $count; $i++) { + $destinatario = $destinatari->skip($i)->first(); + $origine = $destinatario->getOrigine(); + + $anagrafica = $origine instanceof Anagrafica ? $origine : $origine->anagrafica; + $abilita_newsletter = $anagrafica->enable_newsletter; - if (empty($destinatario->email) || empty($abilita_newsletter)) { + $email = $destinatario->email; + if (empty($email) || empty($abilita_newsletter) || !v::email()->validate($email)) { continue; } @@ -75,7 +82,7 @@ $mail = Mail::build($user, $template, $anagrafica->id); // Completamento informazioni - $mail->addReceiver($destinatario->email); + $mail->addReceiver($email); $mail->subject = $newsletter->subject; $mail->content = $newsletter->content; $mail->id_newsletter = $newsletter->id; @@ -88,13 +95,8 @@ $mail->save(); // Aggiornamento riferimento per la newsletter - $database->update('em_newsletter_receiver', [ - 'id_email' => $mail->id, - ], [ - 'record_type' => get_class($destinatario), - 'record_id' => $destinatario->id, - 'id_newsletter' => $newsletter->id, - ]); + $destinatario->id_email = $mail->id; + $destinatario->save(); } // Aggiornamento stato newsletter diff --git a/modules/newsletter/ajax/table.php b/modules/newsletter/ajax/table.php index 6f44e52df..34099113f 100644 --- a/modules/newsletter/ajax/table.php +++ b/modules/newsletter/ajax/table.php @@ -1,5 +1,6 @@ skip($start)->take($length) ->get(); +$modulo_anagrafiche = Module::pool('Anagrafiche'); $righe = []; foreach ($destinatari_filtrati as $destinatario) { $origine = $destinatario->getOrigine(); @@ -84,7 +86,7 @@ 'readonly' => '1', 'class' => 'email-mask', 'value' => $origine->email, - 'validation' => 'email', + 'validation' => 'email|'.$modulo_anagrafiche->id.'|'.$destinatario->record_id, ]) : ' '.tr('Indirizzo e-mail mancante').'' ).' diff --git a/modules/newsletter/edit.php b/modules/newsletter/edit.php index 0dae86e44..9b1c63d7c 100755 --- a/modules/newsletter/edit.php +++ b/modules/newsletter/edit.php @@ -213,7 +213,7 @@ senza_consenso.hide(); } - $("#destinatari").DataTable({ + const table = $("#destinatari").DataTable({ language: globals.translations.datatables, retrieve: true, ordering: false, @@ -231,5 +231,13 @@ searchDelay: 500, pageLength: 50, }); + + table.on("processing.dt", function (e, settings, processing) { + if (processing) { + $("#mini-loader").show(); + } else { + $("#mini-loader").hide(); + } + }); }); '; From 06eb5f916a66c79cd25ca9969489993fa5f08e53 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Thu, 5 Aug 2021 12:31:47 +0200 Subject: [PATCH 09/20] Fix gestione invio email tramite OAuth2 --- modules/emails/src/EmailHook.php | 6 ++---- modules/emails/src/OAuth2.php | 5 ++++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/emails/src/EmailHook.php b/modules/emails/src/EmailHook.php index dc55724cd..f46fbd426 100755 --- a/modules/emails/src/EmailHook.php +++ b/modules/emails/src/EmailHook.php @@ -67,7 +67,7 @@ public function execute() // Selezione email per account $accounts = Account::all(); - $lista = []; + $lista = collect(); foreach ($accounts as $account) { // Ultima email inviata per l'account $last_mail = $account->emails() @@ -90,9 +90,7 @@ public function execute() ->take($numero_email) ->get(); - if (!empty($lista_account)) { - $lista = array_merge($lista, $lista_account); - } + $lista = $lista->concat($lista_account); } } diff --git a/modules/emails/src/OAuth2.php b/modules/emails/src/OAuth2.php index bc4c515f3..9f80ffe38 100644 --- a/modules/emails/src/OAuth2.php +++ b/modules/emails/src/OAuth2.php @@ -170,7 +170,10 @@ public function getAccessToken() public function updateTokens($access_token, $refresh_token) { $this->account->access_token = serialize($access_token); - $this->account->refresh_token = $refresh_token; + + $previous_refresh_token = $this->account->refresh_token; + $this->account->refresh_token = $refresh_token ?: $previous_refresh_token; + $this->account->save(); } From 7d21789e85194a585c55ea3932d50db978736a83 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Thu, 5 Aug 2021 18:17:26 +0200 Subject: [PATCH 10/20] Conversione Componenti Impianti al nuovo formato Revisione Plugin Componenti precedentemente aggiornato --- composer.json | 3 +- include/common/articolo.php | 2 +- modules/gestione_componenti/ajax/select.php | 62 --- modules/impianti/ajax/select.php | 32 ++ .../plugins/my_impianti.componenti.php | 340 ----------------- .../plugins/my_impianti.interventi.php | 14 +- modules/interventi/actions.php | 18 +- modules/interventi/modutil.php | 2 + .../plugins/my_impianti.interventi.php | 4 +- modules/newsletter/actions.php | 2 +- plugins/componenti/actions.php | 126 +++--- plugins/componenti/add.php | 6 +- plugins/componenti/edit.php | 358 ++++++++++-------- plugins/componenti/src/Componente.php | 87 +++++ update/2_4_25.php | 27 ++ update/2_4_25.sql | 32 ++ update/tables.php | 2 +- 17 files changed, 468 insertions(+), 649 deletions(-) delete mode 100755 modules/gestione_componenti/ajax/select.php delete mode 100755 modules/impianti/plugins/my_impianti.componenti.php create mode 100644 plugins/componenti/src/Componente.php create mode 100644 update/2_4_25.php diff --git a/composer.json b/composer.json index 789728b3b..82ec128c0 100755 --- a/composer.json +++ b/composer.json @@ -109,7 +109,8 @@ "Plugins\\PianificazioneFatturazione\\": ["plugins/pianificazione_fatturazione/custom/src/", "plugins/pianificazione_fatturazione/src/"], "Plugins\\StatisticheArticoli\\": ["plugins/statistiche_articoli/custom/src/", "plugins/statistiche_articoli/src/"], "Plugins\\ListinoClienti\\": ["plugins/listino_clienti/custom/src/", "plugins/listino_clienti/src/"], - "Plugins\\ListinoFornitori\\": ["plugins/listino_fornitori/custom/src/", "plugins/listino_fornitori/src/"] + "Plugins\\ListinoFornitori\\": ["plugins/listino_fornitori/custom/src/", "plugins/listino_fornitori/src/"], + "Plugins\\ComponentiImpianti\\": ["plugins/componenti/custom/src/", "plugins/componenti/src/"] }, "files": [ "lib/functions.php", diff --git a/include/common/articolo.php b/include/common/articolo.php index cd81098b8..ad09a52ac 100755 --- a/include/common/articolo.php +++ b/include/common/articolo.php @@ -74,7 +74,7 @@ echo '
- {[ "type": "select", "label": "'.tr('Impianto su cui installare').'", "name": "idimpianto", "value": "'.$idimpianto.'", "ajax-source": "impianti-intervento", "select-options": '.json_encode($options['select-options']['impianti']).' ]} + {[ "type": "select", "label": "'.tr('Impianto su cui installare').'", "name": "id_impianto", "value": "", "ajax-source": "impianti-intervento", "select-options": '.json_encode($options['select-options']['impianti']).', "help": "'.tr("La selezione di un Impianto in questo campo provocherà l'installazione di un nuovo Componente basato sull'Articolo corrente").'" ]}
'; } diff --git a/modules/gestione_componenti/ajax/select.php b/modules/gestione_componenti/ajax/select.php deleted file mode 100755 index 28a3f15fe..000000000 --- a/modules/gestione_componenti/ajax/select.php +++ /dev/null @@ -1,62 +0,0 @@ -. - */ - -use Util\Ini; - -include_once __DIR__.'/../../../core.php'; - -switch ($resource) { - /* - * Opzioni utilizzate: - * - matricola - */ - case 'componenti': - if (isset($superselect['matricola'])) { - $query = 'SELECT id, nome AS descrizione, contenuto FROM my_impianto_componenti |where| ORDER BY id'; - - foreach ($elements as $element) { - $filter[] = 'id='.prepare($element); - } - - $temp = []; - $impianti = explode(',', $superselect['matricola']); - foreach ($impianti as $key => $idimpianto) { - $temp[] = 'idimpianto='.prepare($idimpianto); - } - $where[] = '('.implode(' OR ', $temp).')'; - - if (!empty($search)) { - $search_fields[] = 'nome LIKE '.prepare('%'.$search.'%'); - } - - $results = AJAX::selectResults($query, $where, $filter, $search, $limit, $custom); - $data = $results['results']; - foreach ($data as $key => $value) { - $matricola = Ini::getValue($value['contenuto'], 'Matricola'); - - $data[$key]['text'] = (empty($matricola) ? '' : $matricola.' - ').$data[$key]['text']; - - unset($data[$key]['contenuto']); - } - - $results['results'] = $data; - } - - break; -} diff --git a/modules/impianti/ajax/select.php b/modules/impianti/ajax/select.php index d3092fdf2..a86f28ccf 100755 --- a/modules/impianti/ajax/select.php +++ b/modules/impianti/ajax/select.php @@ -77,4 +77,36 @@ } } break; + + /* + * Opzioni utilizzate: + * - matricola + */ + case 'componenti': + if (isset($superselect['matricola'])) { + $query = 'SELECT my_componenti.id, CONCAT("#", my_componenti.id, ": ", mg_articoli.codice, " - ", mg_articoli.descrizione) AS descrizione + FROM my_componenti + INNER JOIN mg_articoli ON mg_articoli.id = my_componenti.id_articolo + |where| ORDER BY my_componenti.id'; + + foreach ($elements as $element) { + $filter[] = 'my_componenti.id = '.prepare($element); + } + + $where = [ + 'my_componenti.data_sostituzione IS NULL', + 'my_componenti.data_rimozione IS NULL', + ]; + + $impianti = $superselect['matricola']; + if (!empty($impianti)){ + $where[] = 'my_componenti.id_impianto IN ('.$impianti.')'; + } + + if (!empty($search)) { + $search[] = 'my_componenti.note LIKE '.prepare('%'.$search.'%'); + } + } + + break; } diff --git a/modules/impianti/plugins/my_impianti.componenti.php b/modules/impianti/plugins/my_impianti.componenti.php deleted file mode 100755 index 2516c7fb8..000000000 --- a/modules/impianti/plugins/my_impianti.componenti.php +++ /dev/null @@ -1,340 +0,0 @@ -. - */ - -use Modules\Interventi\Intervento; -use Util\Ini; - -include_once __DIR__.'/../../../core.php'; - -switch (filter('op')) { - case 'modifica_componente': - $idcomponente = get('id'); - $data = post('data_componente'); - - // Ricavo il valore di contenuto leggendolo dal db - $query = 'SELECT * FROM my_impianto_componenti WHERE idimpianto='.prepare($id_record).' AND id='.prepare($idcomponente); - $rs = $dbo->fetchArray($query); - $contenuto = $rs[0]['contenuto']; - - $contenuto = Ini::write($contenuto, $post); - - $query = 'UPDATE my_impianto_componenti SET data='.prepare($data).', contenuto='.prepare($contenuto).' WHERE idimpianto='.prepare($id_record).' AND id='.prepare($idcomponente); - $dbo->query($query); - - flash()->info(tr('Informazioni componente aggiornate correttamente!')); - - $_SESSION['idcomponente'] = $idcomponente; - break; - - case 'aggiunta_componente': - $filename = get('filename'); - - if (!empty($filename)) { - $contenuto = file_get_contents(base_dir().'/files/impianti/'.$filename); - $nome = Ini::getValue(Ini::readFile(base_dir().'/files/impianti/'.$filename), 'Nome'); - - $query = 'INSERT INTO my_impianto_componenti(filename, idimpianto, contenuto, nome, data) VALUES('.prepare($filename).', '.prepare($id_record).', '.prepare($contenuto).', '.prepare($nome).', NOW())'; - $dbo->query($query); - - $idcomponente = $dbo->lastInsertedID(); - $_SESSION['idcomponente'] = $idcomponente; - - flash()->info(tr("Aggiunto un nuovo componente all'impianto!")); - } - break; - - case 'sostituzione_componente': - $filename = get('filename'); - $id = get('id'); - - $nome = Ini::getValue(Ini::readFile(base_dir().'/files/impianti/'.$filename), 'Nome'); - $contenuto = file_get_contents(base_dir().'/files/impianti/'.$filename); - - // Verifico che questo componente non sia già stato sostituito - $query = 'SELECT * FROM my_impianto_componenti WHERE idsostituto = '.prepare($id); - $rs = $dbo->fetchArray($query); - - if (empty($rs)) { - // Inserisco il nuovo componente in sostituzione - $query = 'INSERT INTO my_impianto_componenti(idsostituto, filename, idimpianto, contenuto, nome, data) VALUES('.prepare($id).', '.prepare($filename).', '.prepare($id_record).', '.prepare($contenuto).', '.prepare($nome).', NOW())'; - $dbo->query($query); - - $idcomponente = $dbo->lastInsertedID(); - $_SESSION['idcomponente'] = $idcomponente; - - // Aggiorno la data di sostituzione del componente precedente - $query = 'UPDATE my_impianto_componenti SET data_sostituzione = NOW() WHERE idimpianto = '.prepare($id_record).' AND id = '.prepare($id); - $dbo->query($query); - - flash()->info(tr('Aggiunto un nuovo componente in sostituzione al precedente!')); - } else { - flash()->error(tr('Questo componente è già stato sostituito!').' '.('Nessuna modifica applicata')); - } - break; - - case 'unaggiunta_componente': - $idcomponente = filter('id'); - - $query = 'DELETE FROM my_impianto_componenti WHERE id='.prepare($idcomponente).' AND idimpianto='.prepare($id_record); - $dbo->query($query); - - flash()->info(tr("Rimosso componente dall'impianto!")); - break; -} - -// Componenti non ancora collegati -if (empty($id_list)) { - $id_list = '0'; -} - -echo ' -
-
-

'.tr('Componenti installati').'

-
-
'; - -// Elenca i componenti disponibili -$componenti_disponibili = Ini::getList(base_dir().'/files/impianti/', $id_list); -echo ' -
-
- -
- -
- -
-
- -
-
'; - -// Mostro tutti i componenti utilizzati elencando quelli attualmente installati per primi. -$q2 = 'SELECT * FROM my_impianto_componenti WHERE idimpianto = '.prepare($id_record).' ORDER by nome ASC, idsostituto DESC'; -$componenti_installati = $dbo->fetchArray($q2); - -if (!empty($componenti_installati)) { - $prev_componente = ''; - - echo ' -
'; - - // Ciclo tra tutti i componenti - foreach ($componenti_installati as $componente) { - $contenuto = $componente['contenuto']; - - $nome_componente = $componente['nome']; - $filename = $componente['filename']; - - if (empty($componente['data_sostituzione'])) { - $stato_componente = tr('INSTALLATO in data _DATE_', [ - '_DATE_' => dateFormat($componente['data']), - ]); - } else { - $stato_componente = tr('SOSTITUITO in data _DATE_', [ - '_DATE_' => dateFormat($componente['data_sostituzione']), - ]); - } - - // Per più "versioni" dello stesso componente mostro un riga meno evidente - // per non confonderlo come componente in uso in questo momento - $same = ($prev_componente == $nome_componente); - - if (get('id') == $componente['id']) { - $collapsed = ''; - $icon = 'minus'; - } elseif ($_SESSION['idcomponente'] == $componente['id']) { - unset($_SESSION['idcomponente']); - $collapsed = ''; - $icon = 'minus'; - } else { - $collapsed = 'collapsed-box'; - $icon = 'plus'; - } - - echo ' -
-
-

'. - ($same ? '' : '').$nome_componente.' ('.$stato_componente.')'.($same ? '' : '').' -

- -
- -
-
'; - - echo ' -
-
-
- '; - - // Nome - echo ' -
- {[ "type": "span", "label": "'.tr('Nome').':", "name": "nome", "value": "'.$componente['nome'].'" ]} -
'; - - // Data - echo ' -
- {[ "type": "date", "label": "'.tr('Data').':", "name": "data_componente", "id": "data_componente'.$j.'", "value": "'.$componente['data'].'" ]} -
'; - - // Campi previsti dal componente - $fields = Ini::getFields($contenuto); - array_shift($fields); - foreach ($fields as $field) { - echo ' -
- '.$field.' -
'; - } - - // Interventi collegati al componente - $interventi_collegati = Intervento::join('my_componenti_interventi', 'my_componenti_interventi.id_intervento', '=', 'in_interventi.id') - ->where('id_componente', $componente['id']) - ->get(); - if (!$interventi_collegati->isEmpty()) { - echo ' -
- '.tr('Interventi collegati').': - - - - - - - - '; - - foreach ($interventi_collegati as $intervento) { - echo ' - - - - - - - '; - } - - echo ' -
'.tr('Codice').''.tr('Tipo').''.tr('Stato').''.tr('Data richiesta').''.tr('Dettagli').'
'.$intervento->codice.''.$intervento->tipo->descrizione.''.$intervento->stato->descrizione.''.dateFormat($intervento->data_richiesta).''.Modules::link('Interventi', $intervento->id, null, '-').'
-
'; - } else { - echo ' -
-
-
- '.tr('Nessuna attività collegato a questo componente!').' -
-
'; - } - - // Intervento di installazione del componente - if (!empty($componente['idintervento'])) { - $intervento_origine = Intervento::find($componente['idintervento']); - - echo ' - '.Modules::link('Interventi', $componente['idintervento'], $intervento_origine->getReference()).'
'; - } - - echo ' -
-
'; - - // Pulsante Salva/Elimina - echo ' -
- '.tr('Elimina').''; - - // Sostituisci componente con un altro dello stesso tipo, posso sostituire solo i componenti installati - if (empty($componente['data_sostituzione'])) { - echo ' - '; - } else { - echo ' - '; - } - - echo ' - '; - - echo ' -
-
-
-
-
'; - $prev_componente = $nome_componente; - } - echo ' -
'; -} else { - echo ' -
'.tr('Nessun componente inserito').'.
'; -} - -echo ' -
-
- -'; diff --git a/modules/impianti/plugins/my_impianti.interventi.php b/modules/impianti/plugins/my_impianti.interventi.php index 93aedaae5..89ca3a1d4 100644 --- a/modules/impianti/plugins/my_impianti.interventi.php +++ b/modules/impianti/plugins/my_impianti.interventi.php @@ -23,7 +23,7 @@ // Salvo gli impianti selezionati if (filter('op') == 'link_impianti') { - $matricole_old = $dbo->fetchArray('SELECT * FROM my_impianti_interventi WHERE idintervento='.prepare($id_record)); + $matricole_old = $dbo->fetchArray('SELECT * FROM my_impianti_interventi WHERE idintervento = '.prepare($id_record)); $matricole_old = array_column($matricole_old, 'idimpianto'); // Individuazione delle matricole mancanti @@ -31,7 +31,7 @@ if (!in_array($matricola, $matricole)) { $dbo->query('DELETE FROM my_impianti_interventi WHERE idintervento='.prepare($id_record).' AND idimpianto = '.prepare($matricola)); - $components = $dbo->fetchArray('SELECT * FROM my_impianto_componenti WHERE idimpianto = '.prepare($matricola)); + $components = $dbo->fetchArray('SELECT * FROM my_componenti WHERE id_impianto = '.prepare($matricola)); if (!empty($components)) { foreach ($components as $component) { $dbo->query('DELETE FROM my_componenti_interventi WHERE id_componente = '.prepare($component['id']).' AND id_intervento = '.prepare($id_record)); @@ -51,7 +51,7 @@ $components = (array) post('componenti'); $id_impianto = post('id_impianto'); - $dbo->query('DELETE FROM my_componenti_interventi WHERE id_componente IN (SELECT id FROM my_impianto_componenti WHERE idimpianto = '.prepare($id_impianto).') AND id_intervento = '.prepare($id_record)); + $dbo->query('DELETE FROM my_componenti_interventi WHERE id_componente IN (SELECT id FROM my_componenti WHERE id_impianto = '.prepare($id_impianto).') AND id_intervento = '.prepare($id_record)); foreach ($components as $component) { $dbo->query('INSERT INTO my_componenti_interventi(id_componente, id_intervento) VALUES ('.prepare($component).', '.prepare($id_record).')'); @@ -87,13 +87,13 @@
'; foreach ($impianti_collegati as $impianto) { echo ' -
+
'; // MATRICOLA echo ' - + '; @@ -135,7 +135,9 @@ {[ "type": "select", "label": "'.tr('Componenti').'", "multiple": 1, "name": "componenti[]", "id": "componenti_'.$impianto['id'].'", "ajax-source": "componenti", "select-options": {"matricola": '.$impianto['id'].'}, "value": "'.implode(',', $ids).'", "readonly": "'.!empty($readonly).'", "disabled": "'.!empty($disabled).'" ]} - + diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index aca18cec5..829bac224 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -23,6 +23,7 @@ use Modules\Articoli\Articolo as ArticoloOriginale; use Modules\Emails\Mail; use Modules\Emails\Template; +use Modules\Impianti\Impianto; use Modules\Interventi\Components\Articolo; use Modules\Interventi\Components\Riga; use Modules\Interventi\Components\Sconto; @@ -30,6 +31,7 @@ use Modules\Interventi\Intervento; use Modules\Interventi\Stato; use Modules\TipiIntervento\Tipo as TipoSessione; +use Plugins\ComponentiImpianti\Componente; use Plugins\PianificazioneInterventi\Promemoria; switch (post('op')) { @@ -228,7 +230,7 @@ $intervento->delete(); // Elimino il collegamento al componente - $dbo->query('DELETE FROM my_impianto_componenti WHERE idintervento='.prepare($id_record)); + $dbo->query('DELETE FROM my_componenti WHERE idintervento='.prepare($id_record)); // Eliminazione associazione tecnici collegati all'intervento $dbo->query('DELETE FROM in_interventi_tecnici WHERE idintervento='.prepare($id_record)); @@ -331,8 +333,18 @@ flash()->info(tr('Articolo aggiunto!')); } - // Collegamento all'impianto - link_componente_to_articolo($id_record, post('idimpianto'), $articolo->idarticolo, $qta); + // Collegamento all'Impianto tramite generazione Componente + $id_impianto = post('id_impianto'); + $impianto = Impianto::find($id_impianto); + if (!empty($impianto)){ + // Data di inizio dell'intervento (data_richiesta in caso di assenza di sessioni) + $data_registrazione = $intervento->inizio ?: $intervento->data_richiesta; + + // Creazione in base alla quantità + for ($q = 0; $q < $articolo->qta; ++$q) { + $componente = Componente::build($impianto, $articolo->articolo, $data_registrazione); + } + } break; diff --git a/modules/interventi/modutil.php b/modules/interventi/modutil.php index e6afbe9d8..288f9e802 100755 --- a/modules/interventi/modutil.php +++ b/modules/interventi/modutil.php @@ -52,6 +52,8 @@ function get_ore_intervento($id_intervento) * @param int $id_impianto * @param int $id_articolo * @param int $qta + * + * @deprecated 2.4.25 */ function link_componente_to_articolo($id_intervento, $id_impianto, $id_articolo, $qta) { diff --git a/modules/interventi/plugins/my_impianti.interventi.php b/modules/interventi/plugins/my_impianti.interventi.php index 05160a8df..2f5b5300a 100755 --- a/modules/interventi/plugins/my_impianti.interventi.php +++ b/modules/interventi/plugins/my_impianti.interventi.php @@ -68,7 +68,9 @@
'.tr('Matricola').':'.tr('Matricola').': '.$impianto['matricola'].'
'; } else { echo ' -
'.tr('Nessun intervento su questo impianto').'.
'; +
+ '.tr('Nessun intervento su questo impianto').'. +
'; } echo ' diff --git a/modules/newsletter/actions.php b/modules/newsletter/actions.php index 68289a52e..5c085652e 100755 --- a/modules/newsletter/actions.php +++ b/modules/newsletter/actions.php @@ -66,7 +66,7 @@ $destinatari = $newsletter->destinatari(); $count = $destinatari->count(); - for ($i = 0; $i < $count; $i++) { + for ($i = 0; $i < $count; ++$i) { $destinatario = $destinatari->skip($i)->first(); $origine = $destinatario->getOrigine(); diff --git a/plugins/componenti/actions.php b/plugins/componenti/actions.php index 9a899844c..97c717248 100644 --- a/plugins/componenti/actions.php +++ b/plugins/componenti/actions.php @@ -20,105 +20,69 @@ include_once __DIR__.'/../../core.php'; use Carbon\Carbon; +use Modules\Articoli\Articolo; +use Modules\Impianti\Impianto; +use Plugins\ComponentiImpianti\Componente; $operazione = filter('op'); switch ($operazione) { - case 'update': - $articolo = (array) post('id_articolo'); - $data_installazione = (array) post('data_installazione'); - $data_disinstallazione = (array) post('data_disinstallazione'); - $data_registrazione = (array) post('data_registrazione'); - $note = (array) post('note'); - - $key = key($articolo); - - if (post('sostituito')) { - $field_articolo = 'pre_id_articolo'; - } else { - $field_articolo = 'id_articolo'; - } - - $dbo->update('my_componenti_articoli', [ - $field_articolo => $articolo[$key], - 'data_installazione' => $data_installazione[$key] ?: null, - 'data_disinstallazione' => $data_disinstallazione[$key] ?: null, - 'data_registrazione' => $data_registrazione[$key] ?: null, - 'note' => $note[$key], - ], ['id' => $key]); + case 'add': + $impianto = Impianto::find($id_record); + + $id_articolo = filter('id_articolo'); + $articolo = Articolo::find($id_articolo); + + $componente = Componente::build($impianto, $articolo, new Carbon()); flash()->info(tr('Salvataggio completato!')); - $dbo->commitTransaction(); - header('Location: '.base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'#tab_'.$id_plugin); - exit; break; - case 'add': - $dbo->insert('my_componenti_articoli', [ - 'id_impianto' => $id_record, - 'data_registrazione' => Carbon::now(), - 'id_articolo' => post('id_articolo'), - ]); + case 'update': + $id_componente = filter('id_componente'); + $componente = Componente::find($id_componente); - flash()->info(tr('Salvataggio completato!')); + $componente->data_registrazione = filter('data_registrazione') ?: null; + $componente->data_installazione = filter('data_installazione') ?: null; + $componente->data_rimozione = filter('data_rimozione') ?: null; + $componente->note = filter('note') ?: null; + + $componente->save(); + flash()->info(tr('Salvataggio completato!')); break; case 'sostituisci': - $old_id = get('id_old'); - $old = $dbo->selectOne('my_componenti_articoli', '*', ['id' => $old_id]); - - if (!empty($old['id_articolo'])) { - if (empty($old['data_disinstallazione'])) { - $data = Carbon::now(); - } else { - $data = $old['data_disinstallazione']; - } - - $dbo->update('my_componenti_articoli', [ - 'pre_id_articolo' => $old['id_articolo'], - 'id_articolo' => 0, - 'data_disinstallazione' => $data, - ], [ - 'id' => $old_id, - ]); - - $dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM my_componenti_articoli WHERE id= '.prepare($old_id)); - $dbo->query('ALTER TABLE tmp DROP id'); - $dbo->query('INSERT INTO my_componenti_articoli SELECT NULL,tmp. * FROM tmp'); - $new_id = $dbo->lastInsertedID(); - $dbo->query('DROP TEMPORARY TABLE tmp'); - - $dbo->update('my_componenti_articoli', [ - 'id_articolo' => $old['id_articolo'], - 'pre_id_articolo' => 0, - 'data_registrazione' => Carbon::now(), - 'data_installazione' => $data, - 'data_disinstallazione' => null, - ], [ - 'id' => $new_id, - ]); - - flash()->info(tr('Informazioni salvate correttamente!')); - } else { - flash()->warning(tr('Inserire un articolo prima di effettuare la sostituzione!')); - } - - $dbo->commitTransaction(); - header('Location: '.base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'#tab_'.$id_plugin); - exit; + $id_componente = filter('id_componente'); + $componente = Componente::find($id_componente); + + // Creazione copia del componenten + $copia = $componente->replicate(); + $copia->data_registrazione = new Carbon(); + $copia->data_installazione = new Carbon(); + $copia->data_sostituzione = null; + $copia->data_rimozione = null; + // Rimozione riferimento intervento di installazione + $copia->id_intervento = null; + $copia->save(); + + // Sostituzione del componente indicato + $componente->data_sostituzione = new Carbon(); + $componente->id_sostituzione = $copia->id; + $componente->save(); + + flash()->info(tr('Informazioni salvate correttamente!')); break; - case 'delete': - $dbo->query('DELETE FROM my_componenti_articoli WHERE id='.prepare(get('id'))); - - flash()->info(tr('Componente eliminato!')); + case 'rimuovi': + $id_componente = filter('id_componente'); + $componente = Componente::find($id_componente); - $dbo->commitTransaction(); - header('Location: '.base_path().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'#tab_'.$id_plugin); - exit; + $componente->data_rimozione = new Carbon(); + $componente->save(); + flash()->info(tr('Componente rimosso!')); break; } diff --git a/plugins/componenti/add.php b/plugins/componenti/add.php index 833d680a7..d8782dc0b 100644 --- a/plugins/componenti/add.php +++ b/plugins/componenti/add.php @@ -26,7 +26,7 @@
-
+
{["type": "select", "label": "'.tr('Articolo').'", "name": "id_articolo", "ajax-source": "articoli", "value": "", "required": 1, "select-options": {"permetti_movimento_a_zero": 1} ]}
@@ -34,7 +34,9 @@
- +
'; diff --git a/plugins/componenti/edit.php b/plugins/componenti/edit.php index 3e8010aab..effdf4523 100644 --- a/plugins/componenti/edit.php +++ b/plugins/componenti/edit.php @@ -17,177 +17,235 @@ * along with this program. If not, see . */ +use Models\Plugin; +use Plugins\ComponentiImpianti\Componente; + include_once __DIR__.'/../../core.php'; -echo '
'; - -$componenti = $dbo->fetchArray('SELECT my_componenti_articoli.*, my_impianti.idanagrafica, CONCAT(a.codice, " - ", a.descrizione) AS art_sostituito, CONCAT(b.codice, " - ", b.descrizione) AS art_installato, a.codice FROM my_componenti_articoli LEFT JOIN my_impianti ON my_componenti_articoli.id_impianto=my_impianti.id LEFT JOIN mg_articoli AS a ON my_componenti_articoli.pre_id_articolo=a.id LEFT JOIN mg_articoli AS b ON my_componenti_articoli.id_articolo=b.id WHERE id_impianto='.prepare($id_record).' ORDER BY data_registrazione, id_articolo DESC'); - -$installati = 0; -$disinstallati = 0; - -foreach ($componenti as $componente) { - if (!empty($componente['pre_id_articolo'])) { - $id_articolo = $componente['pre_id_articolo']; - $check_value = 1; - $box = 'danger'; - $articolo = $componente['art_sostituito']; - $data = dateFormat($componente['data_disinstallazione']); - $text = 'DISINSTALLATO'; - $class = 'danger'; - $title = ''.tr('Storico').''; - $table = 'default'; - if ($disinstallati == 0) { - echo ' -
-
-

ARTICOLI DISINSTALLATI

-
-
-
'; - ++$disinstallati; - } - } else { - $id_articolo = $componente['id_articolo']; - $check_value = 0; - $box = 'primary'; - $articolo = $componente['art_installato']; - $data = dateFormat($componente['data_installazione']); - $text = 'INSTALLATO'; - $class = 'primary'; - $title = ''.tr('Dati').''; - $table = 'primary'; - if ($installati == 0) { - echo ' -
-
-

ARTICOLI INSTALLATI

-
-
-
'; - ++$installati; - } +$compontenti_impianto = Componente::where('id_impianto', '=', $id_record); + +$componenti_installati = (clone $compontenti_impianto) + ->whereNull('data_sostituzione') + ->whereNull('data_rimozione') + ->get(); +$componenti_sostituiti = (clone $compontenti_impianto) + ->whereNotNull('data_sostituzione') + ->get(); +$componenti_rimossi = (clone $compontenti_impianto) + ->whereNotNull('data_rimozione') + ->get(); + +echo generaListaComponenti($componenti_installati, [ + 'type' => 'primary', + 'title' => tr('Componenti installati'), + 'date' => 'data_installazione', + 'date_name' => tr('Installato'), +]); + +echo generaListaComponenti($componenti_sostituiti, [ + 'type' => 'warning', + 'title' => tr('Componenti sostituiti'), + 'date' => 'data_sostituzione', + 'date_name' => tr('Sostituzione'), +]); + +echo generaListaComponenti($componenti_rimossi, [ + 'type' => 'danger', + 'title' => tr('Componenti rimossi'), + 'date' => 'data_rimozione', + 'date_name' => tr('Rimosso'), +]); + +function generaListaComponenti($componenti, $options) +{ + $type = $options['type']; + $title = $options['title']; + $date = $options['date']; + $date_name = $options['date_name']; + + $database = database(); + $plugin = Plugin::pool('Componenti'); + $module = $plugin->module; + + if (empty($componenti) || $componenti->isEmpty()) { + return; } - $allegati = $dbo->fetchOne('SELECT COUNT(id) AS num FROM zz_files WHERE id_plugin='.prepare($id_plugin).' AND id_record='.$componente['id'].' GROUP BY id_record')['num']; - - if ($allegati) { - $icon = 'fa fa-check text-success'; - } else { - $icon = 'fa fa-times text-danger'; - } + echo ' +
+
+

'.$title.'

+
+
+
'; echo ' -
- - - - - - - -
-
-
- - - - - - - - - - - - - - - -
'.tr('ARTICOLO').' - '.$text.''.tr('REGISTRAZIONE').''.tr('ALLEGATI').'
'.$articolo.''.$data.''.dateFormat($componente['data_registrazione']).'
-
- -
- -
-
-
-
-
-

'.$title.'

+
+
+ + + + + + + + + + '; + + foreach ($componenti as $componente) { + $articolo = $componente->articolo; + $numero_allegati = $database->fetchNum('SELECT id FROM zz_files WHERE id_plugin='.prepare($id_plugin).' AND id_record='.$componente['id'].' GROUP BY id_record'); + + $data = dateFormat($componente[$date]); + $icona_allegati = $numero_allegati == 0 ? 'fa fa-times text-danger' : 'fa fa-check text-success'; + + echo ' + + + + + + + + + + + '; + } + + echo ' + +
'.tr('ID', [], ['upper' => true]).' + '.tr('Articolo', [], ['upper' => true]).' + '.tr($date_name, [], ['upper' => true]).''.tr('Registrazione', [], ['upper' => true]).''.tr('Allegati', [], ['upper' => true]).'
#'.$componente->id.''.$articolo->codice.' - '.$articolo->descrizione.''.$data.''.dateFormat($componente->data_registrazione).' + + +
+
- - -
- -
-
- {[ "type":"select","label":"'.tr('Articolo').'","name":"id_articolo['.$componente['id'].']", "required":"1","value":"'.$id_articolo.'", "ajax-source": "articoli", "select-options": {"permetti_movimento_a_zero": 1} ]} -
-
- {[ "type":"date","label":"'.tr('Data registrazione').'","name":"data_registrazione['.$componente['id'].']", "value":"'.$componente['data_registrazione'].'" ]} -
-
- {[ "type":"date","label":"'.tr('Data installazione').'","name":"data_installazione['.$componente['id'].']", "value":"'.$componente['data_installazione'].'" ]} -
- -
- {[ "type":"date","label":"'.tr('Data disinstallazione').'","name":"data_disinstallazione['.$componente['id'].']", "value":"'.$componente['data_disinstallazione'].'" ]} -
+
+ +
+
'; } echo '