/** * mandates.js * Mandanten-Modul mit dem generischen Entitätsansatz * Angepasst an das überarbeitete Backend und apiCalls.js */ import api from '../shared/apiCalls.js'; /** * Initialisierungsfunktion für das Mandanten-Modul * @param {Object} globalState - Globaler Zustand der Anwendung */ function initMandatesModule(globalState) { // Prüfen, ob der Benutzer die erforderlichen Rechte hat (nur SysAdmin) if (!globalState.user || !globalState.user.isSysAdmin) { // Mandanten-Sektion ausblenden oder Hinweis anzeigen const mandatesView = document.getElementById('mandates-view'); if (mandatesView) { mandatesView.innerHTML = `

Mandantenverwaltung

Sie benötigen SysAdmin-Rechte, um Mandanten zu verwalten.
`; } return; } // Generisches Entitätsmodul für Mandanten initialisieren window.genericEntityModule.init(globalState, { entityType: 'mandate', apiEndpoint: { get: api.getMandates, // API-Funktion zum Abrufen aller Mandanten create: api.createMandate, // API-Funktion zum Erstellen eines Mandanten update: api.updateMandate, // API-Funktion zum Aktualisieren eines Mandanten delete: api.deleteMandate // API-Funktion zum Löschen eines Mandanten }, listContainerId: 'mandates-list-container', addButtonId: 'add-mandate-btn', // Benutzerdefinierte Render-Funktion für Mandanten renderItem: function(mandate) { // Status-Badge (aktiv/deaktiviert) const statusBadge = mandate.disabled ? 'Deaktiviert' : 'Aktiv'; return `

${mandate.name || 'Unbenannter Mandant'}

${statusBadge} Sprache: ${mandate.language || 'de'}
${mandate.description ? `
${mandate.description}
` : ''} ${mandate.contactEmail ? `
${mandate.contactEmail}
` : ''} ${mandate.createdAt ? `Erstellt am: ${new Date(mandate.createdAt).toLocaleString()}` : ''}
`; }, // Behandlung spezieller Attributformate transformFormData: function(formData) { // Boolean-Wert für "disabled" korrekt umwandeln if (formData.hasOwnProperty('disabled') && typeof formData.disabled === 'string') { formData.disabled = formData.disabled.toLowerCase() === 'true'; } return formData; }, // Zusätzliche Aktionen für Mandanten getItemActions: function(mandate) { const actions = []; // Benutzer anzeigen Aktion actions.push({ text: 'Benutzer anzeigen', className: 'entity-view-btn', html: '', handler: function(mandate) { showMandateUsers(mandate); } }); // Mandant aktivieren/deaktivieren if (mandate.disabled) { actions.push({ text: 'Aktivieren', className: 'entity-activate-btn', html: '', handler: function(mandate) { toggleMandateStatus(mandate, false); } }); } else { actions.push({ text: 'Deaktivieren', className: 'entity-deactivate-btn', html: '', handler: function(mandate) { toggleMandateStatus(mandate, true); } }); } return actions; }, // Callbacks onItemCreated: function(mandate) { showToast(`Mandant "${mandate.name}" erstellt`); }, onItemUpdated: function(mandate) { showToast(`Mandant "${mandate.name}" aktualisiert`); }, onItemDeleted: function(mandateId) { showToast(`Mandant gelöscht`); } }); } /** * Mandant aktivieren/deaktivieren * @param {Object} mandate - Der Mandant * @param {boolean} disabled - Neuer Status (true = deaktiviert, false = aktiviert) */ async function toggleMandateStatus(mandate, disabled) { try { // Status ändern via API const response = await api.updateMandate(mandate.id, { disabled }); if (response) { showToast(`Mandant "${mandate.name}" ${disabled ? 'deaktiviert' : 'aktiviert'}`); // Liste neu laden if (window.genericEntityModule) { window.genericEntityModule.loadAndRenderItems(); } } } catch (error) { console.error(`Fehler beim Ändern des Mandantenstatus:`, error); showError(`Fehler beim Ändern des Mandantenstatus`, error.message); } } /** * Zeigt alle Benutzer eines Mandanten an * @param {Object} mandate - Der Mandant */ async function showMandateUsers(mandate) { try { // Benutzer für den Mandanten abrufen const users = await api.getUsers(mandate.id); if (!users || users.length === 0) { showToast(`Keine Benutzer für Mandant "${mandate.name}" gefunden.`); return; } // Modal mit Benutzerliste erstellen let userListHTML = `

Benutzer von Mandant "${mandate.name}"

`; users.forEach(user => { // Status und Rolle ermitteln const status = user.disabled ? 'Deaktiviert' : 'Aktiv'; let role = 'User'; if (user.privilege === 'admin') { role = 'Admin'; } else if (user.privilege === 'sysadmin') { role = 'SysAdmin'; } userListHTML += ` `; }); userListHTML += `
Benutzername Name E-Mail Rolle Status
${user.username} ${user.fullName || '-'} ${user.email || '-'} ${role} ${status}
`; // Modal anzeigen if (window.appUtils && window.appUtils.ui && window.appUtils.ui.createModal) { window.appUtils.ui.createModal({ title: `Benutzer von Mandant "${mandate.name}"`, content: userListHTML, submitText: 'Schließen', cancelText: null, // Kein Abbrechen-Button onSubmit: () => { // Einfach schließen } }); } else { // Fallback: Alert mit Benutzerzahl showToast(`Der Mandant "${mandate.name}" hat ${users.length} Benutzer.`); } } catch (error) { console.error(`Fehler beim Abrufen der Mandantenbenutzer:`, error); showError(`Fehler beim Abrufen der Benutzer`, error.message); } } /** * Erstellt einen neuen Mandanten mit Default-Werten * @param {Object} globalStateObj - Globaler Zustand der Anwendung * @returns {Promise} - Der erstellte Mandant */ async function createDefaultMandate(globalStateObj) { try { // Default-Mandant erstellen const defaultMandate = { name: "Neuer Mandant", description: "Beschreibung des Mandanten", language: "de", contactEmail: "" }; // An die API senden const newMandate = await api.createMandate(defaultMandate); // UI aktualisieren if (window.genericEntityModule) { window.genericEntityModule.loadAndRenderItems(); } return newMandate; } catch (error) { console.error("Fehler beim Erstellen des Default-Mandanten:", error); showError("Fehler beim Erstellen", error.message); throw error; } } /** * Zeigt eine Toast-Nachricht an * @param {string} message - Anzuzeigende Nachricht */ function showToast(message) { if (window.appUtils && window.appUtils.ui && window.appUtils.ui.showToast) { window.appUtils.ui.showToast(message); } else if (window.globalUtils && window.globalUtils.showError) { window.globalUtils.showError("Info", message); } else { console.log(message); } } /** * Zeigt eine Fehlermeldung an * @param {string} title - Titel der Fehlermeldung * @param {string} message - Fehlermeldung */ function showError(title, message) { if (window.appUtils && window.appUtils.ui && window.appUtils.ui.showError) { window.appUtils.ui.showError(title, message); } else if (window.globalUtils && window.globalUtils.showError) { window.globalUtils.showError(title, message); } else { console.error(`${title}: ${message}`); } } // Mandates-Modul-Schnittstelle definieren und exportieren window.initMandatesModule = initMandatesModule; // Export für ES Module export { initMandatesModule, toggleMandateStatus, showMandateUsers, createDefaultMandate };