Neues CompanyProfile-Modell (Einzel-Zeile) + Migration (IF NOT EXISTS): Firmenname, Anschrift, USt-IdNr, Steuernummer, Handelsregister, Geschaeftsfuehrer, Kontakt, IBAN/BIC/Bank. Fliesst spaeter in Gutschrift-PDF + ZUGFeRD-Verkaeuferdaten ein. Backend: Service (getOrCreate/update mit Feld-Whitelist), Controller, Routes GET/PUT /api/company-profile (settings:read/update), auditiert. Frontend: Settings-Seite 'Firmenstammdaten (Absender)' (/settings/company-profile) mit Firma/Anschrift, Steuer/Register, Kontakt/Bank. Typ + companyProfileApi + Menue-Eintrag. Phase 3b (PDF + ZUGFeRD-Erzeugung) folgt darauf auf. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30 lines
1.1 KiB
TypeScript
30 lines
1.1 KiB
TypeScript
import { Response } from 'express';
|
|
import { ApiResponse, AuthRequest } from '../types/index.js';
|
|
import { logChange } from '../services/audit.service.js';
|
|
import * as companyProfileService from '../services/companyProfile.service.js';
|
|
|
|
export async function getProfile(_req: AuthRequest, res: Response): Promise<void> {
|
|
try {
|
|
const data = await companyProfileService.getOrCreateProfile();
|
|
res.json({ success: true, data } as ApiResponse);
|
|
} catch (error) {
|
|
res.status(500).json({ success: false, error: 'Fehler beim Laden der Firmendaten' } as ApiResponse);
|
|
}
|
|
}
|
|
|
|
export async function updateProfile(req: AuthRequest, res: Response): Promise<void> {
|
|
try {
|
|
const updated = await companyProfileService.updateProfile(req.body ?? {});
|
|
await logChange({
|
|
req,
|
|
action: 'UPDATE',
|
|
resourceType: 'CompanyProfile',
|
|
resourceId: updated.id.toString(),
|
|
label: 'Firmenstammdaten (Absender) geändert',
|
|
});
|
|
res.json({ success: true, data: updated } as ApiResponse);
|
|
} catch (error) {
|
|
res.status(500).json({ success: false, error: 'Fehler beim Speichern der Firmendaten' } as ApiResponse);
|
|
}
|
|
}
|