Skip to content

Commit cde1cc8

Browse files
committed
refactor: caricamento documenti collegati a tipo di attività via ajax
1 parent 9aafb56 commit cde1cc8

2 files changed

Lines changed: 201 additions & 53 deletions

File tree

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?php
2+
3+
ob_start();
4+
5+
include_once __DIR__.'/../../core.php';
6+
7+
ob_clean();
8+
9+
// Verifica che l'id_record sia valido
10+
if (empty($id_record) || !is_numeric($id_record)) {
11+
if (isset($_GET['count_only']) && $_GET['count_only'] == '1') {
12+
header('Content-Type: application/json');
13+
echo json_encode(['count' => 0, 'error' => 'ID record non valido']);
14+
} else {
15+
echo '<div class="alert alert-warning">'.tr('ID record non valido').'</div>';
16+
}
17+
exit;
18+
}
19+
20+
try {
21+
// Query per recuperare i documenti collegati (senza duplicare le sessioni di intervento)
22+
$query = 'SELECT `in_interventi`.`idtipointervento`, id, codice AS numero, data_richiesta AS data, "Attività" AS tipo_documento FROM `in_interventi` WHERE `in_interventi`.`idtipointervento` = '.prepare($id_record).'
23+
UNION
24+
SELECT `an_anagrafiche`.`idtipointervento_default` AS `idtipointervento`, idanagrafica AS id, codice, "0000-00-00" AS data, "Anagrafica" AS tipo_documento FROM `an_anagrafiche` WHERE `an_anagrafiche`.`idtipointervento_default` = '.prepare($id_record).'
25+
UNION
26+
SELECT `co_preventivi`.`idtipointervento`, id, numero, data_bozza AS data, "Preventivo" AS tipo_documento FROM `co_preventivi` WHERE `co_preventivi`.`idtipointervento` = '.prepare($id_record).'
27+
UNION
28+
SELECT `co_promemoria`.`idtipointervento`, idcontratto AS id, numero, data_richiesta AS data, "Promemoria contratto" AS tipo_documento FROM `co_promemoria` LEFT JOIN co_contratti ON co_promemoria.idcontratto=co_contratti.id WHERE `co_promemoria`.`idtipointervento` = '.prepare($id_record).'
29+
ORDER BY `idtipointervento`';
30+
31+
$elementi = $dbo->fetchArray($query);
32+
} catch (Exception $e) {
33+
// Gestione errori database
34+
if (isset($_GET['count_only']) && $_GET['count_only'] == '1') {
35+
// Pulisci l'output buffer prima di inviare JSON
36+
ob_clean();
37+
header('Content-Type: application/json');
38+
echo json_encode(['count' => 0, 'error' => 'Errore database: ' . $e->getMessage()]);
39+
} else {
40+
echo '<div class="alert alert-danger">'.tr('Errore nel caricamento dei documenti collegati').': '.$e->getMessage().'</div>';
41+
}
42+
exit;
43+
}
44+
45+
// Se è richiesto solo il conteggio
46+
if (isset($_GET['count_only']) && $_GET['count_only'] == '1') {
47+
// Pulisci completamente l'output buffer
48+
ob_clean();
49+
header('Content-Type: application/json');
50+
$count = count($elementi);
51+
echo json_encode(['count' => $count]);
52+
exit;
53+
}
54+
55+
// Se non ci sono elementi, mostra messaggio
56+
if (empty($elementi)) {
57+
echo '<div class="alert alert-info">'.tr('Nessun documento collegato trovato').'</div>';
58+
exit;
59+
}
60+
61+
// Rendering della lista documenti
62+
echo '<ul>';
63+
64+
foreach ($elementi as $elemento) {
65+
$descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [
66+
'_DOC_' => $elemento['tipo_documento'],
67+
'_NUM_' => $elemento['numero'],
68+
'_DATE_' => Translator::dateToLocale($elemento['data']),
69+
]);
70+
71+
// Determinazione del modulo di destinazione
72+
$modulo = '';
73+
switch ($elemento['tipo_documento']) {
74+
case 'Attività':
75+
$modulo = 'Interventi';
76+
break;
77+
case 'Anagrafica':
78+
$modulo = 'Anagrafiche';
79+
break;
80+
case 'Preventivo':
81+
$modulo = 'Preventivi';
82+
break;
83+
case 'Promemoria contratto':
84+
$modulo = 'Contratti';
85+
break;
86+
}
87+
88+
$id = $elemento['id'];
89+
90+
echo '<li>'.Modules::link($modulo, $id, $descrizione).'</li>';
91+
}
92+
93+
echo '</ul>';

modules/tipi_intervento/edit.php

Lines changed: 108 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -132,70 +132,125 @@
132132

133133
</form>
134134

135-
<?php
136-
// Permetto eliminazione tipo intervento solo se questo non è utilizzado da nessun'altra parte nel gestionale
137-
// UNION SELECT `in_tariffe`.`idtipointervento` FROM `in_tariffe` WHERE `in_tariffe`.`idtipointervento` = '.prepare($id_record).'
138-
// UNION SELECT `co_contratti_tipiintervento`.`idtipointervento` FROM `co_contratti_tipiintervento` WHERE `co_contratti_tipiintervento`.`idtipointervento` = '.prepare($id_record).'
139-
$elementi = $dbo->fetchArray('SELECT `in_interventi`.`idtipointervento`, id, codice AS numero, data_richiesta AS data, "Attività" AS tipo_documento FROM `in_interventi` WHERE `in_interventi`.`idtipointervento` = '.prepare($id_record).'
140-
UNION
141-
SELECT `in_interventi_tecnici`.`idtipointervento`, idintervento AS id, codice AS numero, orario_inizio AS data, "Sessione intervento" AS tipo_documento FROM `in_interventi_tecnici` LEFT JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id WHERE `in_interventi_tecnici`.`idtipointervento` = '.prepare($id_record).'
142-
UNION
143-
SELECT `an_anagrafiche`.`idtipointervento_default` AS `idtipointervento`, idanagrafica AS id, codice, "0000-00-00" AS data, "Anagrafica" AS tipo_documento FROM `an_anagrafiche` WHERE `an_anagrafiche`.`idtipointervento_default` = '.prepare($id_record).'
144-
UNION
145-
SELECT `co_preventivi`.`idtipointervento`, id, numero, data_bozza AS data, "Preventivo" AS tipo_documento FROM `co_preventivi` WHERE `co_preventivi`.`idtipointervento` = '.prepare($id_record).'
146-
UNION
147-
SELECT `co_promemoria`.`idtipointervento`, idcontratto AS id, numero, data_richiesta AS data, "Promemoria contratto" AS tipo_documento FROM `co_promemoria` LEFT JOIN co_contratti ON co_promemoria.idcontratto=co_contratti.id WHERE `co_promemoria`.`idtipointervento` = '.prepare($id_record).'
148-
ORDER BY `idtipointervento`');
149-
150-
if (!empty($elementi)) {
151-
echo '
152-
<div class="card card-warning collapsable collapsed-card">
135+
<div class="card card-warning collapsable collapsed-card" id="documenti-collegati-card">
153136
<div class="card-header with-border">
154-
<h3 class="card-title"><i class="fa fa-warning"></i> '.tr('Documenti collegati: _NUM_', [
155-
'_NUM_' => count($elementi),
156-
]).'</h3>
137+
<h3 class="card-title"><i class="fa fa-warning"></i> <span id="documenti-collegati-title"><?php echo tr('Documenti collegati'); ?></span></h3>
157138
<div class="card-tools pull-right">
158-
<button type="button" class="btn btn-tool" data-card-widget="collapse"><i class="fa fa-plus"></i></button>
139+
<button type="button" class="btn btn-tool" data-card-widget="collapse" id="documenti-collegati-toggle"><i class="fa fa-plus"></i></button>
159140
</div>
160141
</div>
161-
<div class="card-body">
162-
<ul>';
163-
164-
foreach ($elementi as $elemento) {
165-
$descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [
166-
'_DOC_' => $elemento['tipo_documento'],
167-
'_NUM_' => $elemento['numero'],
168-
'_DATE_' => Translator::dateToLocale($elemento['data']),
169-
]);
170-
171-
if (in_array($elemento['tipo_documento'], ['Attività'])) {
172-
$modulo = 'Interventi';
173-
}
174-
if (in_array($elemento['tipo_documento'], ['Sessione intervento'])) {
175-
$modulo = 'Interventi';
176-
}
177-
if (in_array($elemento['tipo_documento'], ['Anagrafica'])) {
178-
$modulo = 'Anagrafiche';
179-
}
180-
if (in_array($elemento['tipo_documento'], ['Preventivo'])) {
181-
$modulo = 'Preventivi';
142+
<div class="card-body" id="documenti-collegati-body">
143+
<div class="text-center" id="documenti-collegati-loading">
144+
<i class="fa fa-spinner fa-spin"></i> <?php echo tr('Caricamento documenti collegati in corso'); ?>...
145+
</div>
146+
<div id="documenti-collegati-content" style="display: none;"></div>
147+
</div>
148+
</div>
149+
150+
<script type="text/javascript">
151+
$(document).ready(function() {
152+
var documentiCaricati = false;
153+
154+
// Mostra la card inizialmente e carica il conteggio
155+
$('#documenti-collegati-card').show();
156+
caricaConteggio();
157+
158+
// Carica i documenti quando il card viene espanso
159+
// Utilizziamo l'evento specifico di AdminLTE per il collapse/expand
160+
$('#documenti-collegati-card').on('expanded.lte.cardwidget', function() {
161+
console.log('Card espansa (evento AdminLTE), documentiCaricati:', documentiCaricati);
162+
if (!documentiCaricati) {
163+
console.log('Carico documenti collegati...');
164+
caricaDocumentiCollegati();
182165
}
183-
if (in_array($elemento['tipo_documento'], ['Promemoria contratto'])) {
184-
$modulo = 'Contratti';
166+
});
167+
168+
// Fallback: se l'evento AdminLTE non funziona, usa il click diretto
169+
$('#documenti-collegati-toggle').on('click', function() {
170+
console.log('Click sul toggle (fallback), documentiCaricati:', documentiCaricati);
171+
console.log('Card ha classe collapsed-card:', $('#documenti-collegati-card').hasClass('collapsed-card'));
172+
173+
if (!documentiCaricati && $('#documenti-collegati-card').hasClass('collapsed-card')) {
174+
console.log('Fallback: carico documenti tra 500ms');
175+
setTimeout(function() {
176+
console.log('Fallback timeout: verifico stato card');
177+
console.log('Card collapsed dopo timeout:', $('#documenti-collegati-card').hasClass('collapsed-card'));
178+
if (!$('#documenti-collegati-card').hasClass('collapsed-card')) {
179+
console.log('Card espansa, carico documenti');
180+
caricaDocumentiCollegati();
181+
} else {
182+
console.log('Card ancora collassata, forzo il caricamento comunque');
183+
// Se la card non si espande correttamente, carica comunque i documenti
184+
caricaDocumentiCollegati();
185+
}
186+
}, 500);
185187
}
186-
$id = $elemento['id'];
188+
});
189+
190+
function caricaConteggio() {
191+
$.get('<?php echo $module->fileurl('ajax_documenti_collegati.php'); ?>?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>&count_only=1')
192+
.done(function(data) {
193+
var response;
194+
195+
// Se la risposta è già un oggetto (jQuery ha fatto il parsing automatico)
196+
if (typeof data === 'object') {
197+
response = data;
198+
} else {
199+
// Prova a fare il parsing manuale
200+
try {
201+
var cleanData = data.trim();
202+
response = JSON.parse(cleanData);
203+
} catch (e) {
187204

188-
echo '
189-
<li>'.Modules::link($modulo, $id, $descrizione).'</li>';
205+
// In caso di errore, mantieni la card visibile
206+
$('#documenti-collegati-title').text('<?php echo tr('Documenti collegati'); ?>');
207+
$('#documenti-collegati-card').show();
208+
return;
209+
}
210+
}
211+
212+
if (response.count > 0) {
213+
$('#documenti-collegati-title').text('<?php echo tr('Documenti collegati'); ?>: ' + response.count);
214+
$('#documenti-collegati-card').show();
215+
} else {
216+
$('#documenti-collegati-card').hide();
217+
}
218+
})
219+
.fail(function(xhr, status, error) {
220+
// In caso di errore di rete, mantieni la card visibile
221+
$('#documenti-collegati-title').text('<?php echo tr('Documenti collegati'); ?>');
222+
$('#documenti-collegati-card').show();
223+
});
190224
}
191225

192-
echo '
193-
</ul>
194-
</div>
195-
</div>';
196-
}
226+
function caricaDocumentiCollegati() {
227+
if (documentiCaricati) return;
197228

229+
$('#documenti-collegati-loading').show();
230+
$('#documenti-collegati-content').hide();
231+
232+
var url = '<?php echo $module->fileurl('ajax_documenti_collegati.php'); ?>?id_module=<?php echo $id_module; ?>&id_record=<?php echo $id_record; ?>';
233+
$.get(url)
234+
.done(function(data) {
235+
$('#documenti-collegati-loading').hide();
236+
$('#documenti-collegati-content').html(data).show();
237+
documentiCaricati = true;
238+
})
239+
.fail(function(xhr, status, error) {
240+
$('#documenti-collegati-loading').hide();
241+
var errorMsg = '<?php echo tr('Errore nel caricamento dei documenti collegati'); ?>';
242+
if (xhr.responseText) {
243+
errorMsg += ': ' + xhr.responseText;
244+
}
245+
$('#documenti-collegati-content').html('<div class="alert alert-danger">' + errorMsg + '</div>').show();
246+
});
247+
}
248+
});
249+
</script>
250+
251+
<?php
198252
echo '
199253
<a class="btn btn-danger ask" data-backto="record-list">
200254
<i class="fa fa-trash"></i> '.tr('Elimina').'
201255
</a>';
256+
?>

0 commit comments

Comments
 (0)