aggiunti trasferte, export excel, miglioramenti generali
This commit is contained in:
@@ -143,6 +143,7 @@ function setupEventListeners() {
|
||||
}
|
||||
});
|
||||
|
||||
// Test Tools
|
||||
// Test Tools
|
||||
document.getElementById('runAllocationBtn').addEventListener('click', async () => {
|
||||
if (!confirm('Sei sicuro di voler avviare l\'assegnazione ORA? Questo potrebbe sovrascrivere le assegnazioni esistenti per la data selezionata.')) return;
|
||||
@@ -166,7 +167,7 @@ function setupEventListeners() {
|
||||
utils.showMessage('Avvio assegnazione...', 'success');
|
||||
|
||||
while (current <= end) {
|
||||
const dateStr = current.toISOString().split('T')[0];
|
||||
const dateStr = utils.formatDate(current);
|
||||
try {
|
||||
await api.post('/api/parking/run-allocation', {
|
||||
date: dateStr,
|
||||
@@ -207,20 +208,110 @@ function setupEventListeners() {
|
||||
|
||||
utils.showMessage('Rimozione in corso...', 'warning');
|
||||
|
||||
// Loop is fine, but maybe redundant if we could batch clean?
|
||||
// Backend clear-assignments is per day.
|
||||
while (current <= end) {
|
||||
const dateStr = current.toISOString().split('T')[0];
|
||||
const dateStr = utils.formatDate(current);
|
||||
try {
|
||||
const res = await api.post('/api/parking/clear-assignments', {
|
||||
date: dateStr,
|
||||
office_id: currentOffice.id
|
||||
});
|
||||
totalRemoved += (res.count || 0);
|
||||
if (res && res.ok) {
|
||||
const data = await res.json();
|
||||
totalRemoved += (data.count || 0);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(`Error clearing ${dateStr}`, e);
|
||||
}
|
||||
current.setDate(current.getDate() + 1);
|
||||
}
|
||||
|
||||
utils.showMessage(`Operazione eseguita. ${totalRemoved} assegnazioni rimosse in totale.`, 'warning');
|
||||
utils.showMessage(`Operazione eseguita.`, 'warning');
|
||||
});
|
||||
|
||||
const clearPresenceBtn = document.getElementById('clearPresenceBtn');
|
||||
if (clearPresenceBtn) {
|
||||
clearPresenceBtn.addEventListener('click', async () => {
|
||||
if (!confirm('ATTENZIONE: Stai per eliminare TUTTI GLI STATI (Presente/Assente/ecc) e relative assegnazioni per tutti gli utenti dell\'ufficio nel periodo selezionato. \n\nQuesta azione è irreversibile. Procedere?')) return;
|
||||
|
||||
const dateStart = document.getElementById('testDateStart').value;
|
||||
const dateEnd = document.getElementById('testDateEnd').value;
|
||||
|
||||
if (!dateStart) return utils.showMessage('Seleziona una data di inizio', 'error');
|
||||
|
||||
// Validate office
|
||||
if (!currentOffice || !currentOffice.id) {
|
||||
return utils.showMessage('Errore: Nessun ufficio selezionato', 'error');
|
||||
}
|
||||
|
||||
const endDateVal = dateEnd || dateStart;
|
||||
|
||||
utils.showMessage('Rimozione stati in corso...', 'warning');
|
||||
|
||||
try {
|
||||
const res = await api.post('/api/presence/admin/clear-office-presence', {
|
||||
start_date: dateStart,
|
||||
end_date: endDateVal,
|
||||
office_id: currentOffice.id
|
||||
});
|
||||
|
||||
if (res && res.ok) {
|
||||
const data = await res.json();
|
||||
utils.showMessage(`Operazione completata. Rimossi ${data.count_presence} stati e ${data.count_parking} assegnazioni.`, 'success');
|
||||
} else {
|
||||
const err = await res.json();
|
||||
utils.showMessage('Errore: ' + (err.detail || 'Operazione fallita'), 'error');
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
utils.showMessage('Errore di comunicazione col server', 'error');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const testEmailBtn = document.getElementById('testEmailBtn');
|
||||
if (testEmailBtn) {
|
||||
testEmailBtn.addEventListener('click', async () => {
|
||||
const dateVal = document.getElementById('testEmailDate').value;
|
||||
|
||||
// Validate office
|
||||
if (!currentOffice || !currentOffice.id) {
|
||||
return utils.showMessage('Errore: Nessun ufficio selezionato', 'error');
|
||||
}
|
||||
|
||||
utils.showMessage('Invio mail di test in corso...', 'warning');
|
||||
|
||||
try {
|
||||
const res = await api.post('/api/parking/test-email', {
|
||||
date: dateVal || null,
|
||||
office_id: currentOffice.id
|
||||
});
|
||||
|
||||
if (res && res.status !== 403 && res.status !== 500 && res.ok !== false) {
|
||||
// API wrapper usually returns response object or parses JSON?
|
||||
// api.post returns response object if 200-299, but wrapper handles some.
|
||||
// Let's assume standard fetch response or check wrapper.
|
||||
// api.js Wrapper returns fetch Response.
|
||||
const data = await res.json();
|
||||
|
||||
if (data.success) {
|
||||
let msg = `Email inviata con successo per la data: ${data.date}.`;
|
||||
if (data.mode === 'FILE') {
|
||||
msg += ' (SMTP disabilitato: Loggato su file)';
|
||||
}
|
||||
utils.showMessage(msg, 'success');
|
||||
} else {
|
||||
utils.showMessage('Invio fallito. Controlla i log del server.', 'error');
|
||||
}
|
||||
} else {
|
||||
const err = res ? await res.json() : {};
|
||||
utils.showMessage('Errore: ' + (err.detail || 'Invio fallito'), 'error');
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
utils.showMessage('Errore di comunicazione col server', 'error');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user