opencrm/backend/dist/controllers/customer.controller.js

514 lines
18 KiB
JavaScript

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCustomers = getCustomers;
exports.getCustomer = getCustomer;
exports.createCustomer = createCustomer;
exports.updateCustomer = updateCustomer;
exports.deleteCustomer = deleteCustomer;
exports.getAddresses = getAddresses;
exports.createAddress = createAddress;
exports.updateAddress = updateAddress;
exports.deleteAddress = deleteAddress;
exports.getBankCards = getBankCards;
exports.createBankCard = createBankCard;
exports.updateBankCard = updateBankCard;
exports.deleteBankCard = deleteBankCard;
exports.getDocuments = getDocuments;
exports.createDocument = createDocument;
exports.updateDocument = updateDocument;
exports.deleteDocument = deleteDocument;
exports.getMeters = getMeters;
exports.createMeter = createMeter;
exports.updateMeter = updateMeter;
exports.deleteMeter = deleteMeter;
exports.getMeterReadings = getMeterReadings;
exports.addMeterReading = addMeterReading;
exports.updateMeterReading = updateMeterReading;
exports.deleteMeterReading = deleteMeterReading;
exports.getPortalSettings = getPortalSettings;
exports.updatePortalSettings = updatePortalSettings;
exports.setPortalPassword = setPortalPassword;
exports.getPortalPassword = getPortalPassword;
exports.getRepresentatives = getRepresentatives;
exports.addRepresentative = addRepresentative;
exports.removeRepresentative = removeRepresentative;
exports.searchForRepresentative = searchForRepresentative;
const customerService = __importStar(require("../services/customer.service.js"));
const authService = __importStar(require("../services/auth.service.js"));
// Customer CRUD
async function getCustomers(req, res) {
try {
const { search, type, page, limit } = req.query;
const result = await customerService.getAllCustomers({
search: search,
type: type,
page: page ? parseInt(page) : undefined,
limit: limit ? parseInt(limit) : undefined,
});
res.json({ success: true, data: result.customers, pagination: result.pagination });
}
catch (error) {
res.status(500).json({
success: false,
error: 'Fehler beim Laden der Kunden',
});
}
}
async function getCustomer(req, res) {
try {
const customer = await customerService.getCustomerById(parseInt(req.params.id));
if (!customer) {
res.status(404).json({ success: false, error: 'Kunde nicht gefunden' });
return;
}
res.json({ success: true, data: customer });
}
catch (error) {
res.status(500).json({ success: false, error: 'Fehler beim Laden des Kunden' });
}
}
async function createCustomer(req, res) {
try {
const data = { ...req.body };
// Convert birthDate string to Date if present
if (data.birthDate) {
data.birthDate = new Date(data.birthDate);
}
const customer = await customerService.createCustomer(data);
res.status(201).json({ success: true, data: customer });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Erstellen des Kunden',
});
}
}
async function updateCustomer(req, res) {
try {
const data = { ...req.body };
// Convert birthDate string to Date if present
if (data.birthDate) {
data.birthDate = new Date(data.birthDate);
}
const customer = await customerService.updateCustomer(parseInt(req.params.id), data);
res.json({ success: true, data: customer });
}
catch (error) {
console.error('Update customer error:', error);
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Aktualisieren des Kunden',
});
}
}
async function deleteCustomer(req, res) {
try {
await customerService.deleteCustomer(parseInt(req.params.id));
res.json({ success: true, message: 'Kunde gelöscht' });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Löschen des Kunden',
});
}
}
// Addresses
async function getAddresses(req, res) {
try {
const addresses = await customerService.getCustomerAddresses(parseInt(req.params.customerId));
res.json({ success: true, data: addresses });
}
catch (error) {
res.status(500).json({ success: false, error: 'Fehler beim Laden der Adressen' });
}
}
async function createAddress(req, res) {
try {
const address = await customerService.createAddress(parseInt(req.params.customerId), req.body);
res.status(201).json({ success: true, data: address });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Erstellen der Adresse',
});
}
}
async function updateAddress(req, res) {
try {
const address = await customerService.updateAddress(parseInt(req.params.id), req.body);
res.json({ success: true, data: address });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Aktualisieren der Adresse',
});
}
}
async function deleteAddress(req, res) {
try {
await customerService.deleteAddress(parseInt(req.params.id));
res.json({ success: true, message: 'Adresse gelöscht' });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Löschen der Adresse',
});
}
}
// Bank Cards
async function getBankCards(req, res) {
try {
const showInactive = req.query.showInactive === 'true';
const cards = await customerService.getCustomerBankCards(parseInt(req.params.customerId), showInactive);
res.json({ success: true, data: cards });
}
catch (error) {
res.status(500).json({ success: false, error: 'Fehler beim Laden der Bankkarten' });
}
}
async function createBankCard(req, res) {
try {
const card = await customerService.createBankCard(parseInt(req.params.customerId), req.body);
res.status(201).json({ success: true, data: card });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Erstellen der Bankkarte',
});
}
}
async function updateBankCard(req, res) {
try {
const card = await customerService.updateBankCard(parseInt(req.params.id), req.body);
res.json({ success: true, data: card });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Aktualisieren der Bankkarte',
});
}
}
async function deleteBankCard(req, res) {
try {
await customerService.deleteBankCard(parseInt(req.params.id));
res.json({ success: true, message: 'Bankkarte gelöscht' });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Löschen der Bankkarte',
});
}
}
// Identity Documents
async function getDocuments(req, res) {
try {
const showInactive = req.query.showInactive === 'true';
const docs = await customerService.getCustomerDocuments(parseInt(req.params.customerId), showInactive);
res.json({ success: true, data: docs });
}
catch (error) {
res.status(500).json({ success: false, error: 'Fehler beim Laden der Ausweise' });
}
}
async function createDocument(req, res) {
try {
const doc = await customerService.createDocument(parseInt(req.params.customerId), req.body);
res.status(201).json({ success: true, data: doc });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Erstellen des Ausweises',
});
}
}
async function updateDocument(req, res) {
try {
const doc = await customerService.updateDocument(parseInt(req.params.id), req.body);
res.json({ success: true, data: doc });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Aktualisieren des Ausweises',
});
}
}
async function deleteDocument(req, res) {
try {
await customerService.deleteDocument(parseInt(req.params.id));
res.json({ success: true, message: 'Ausweis gelöscht' });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Löschen des Ausweises',
});
}
}
// Meters
async function getMeters(req, res) {
try {
const showInactive = req.query.showInactive === 'true';
const meters = await customerService.getCustomerMeters(parseInt(req.params.customerId), showInactive);
res.json({ success: true, data: meters });
}
catch (error) {
res.status(500).json({ success: false, error: 'Fehler beim Laden der Zähler' });
}
}
async function createMeter(req, res) {
try {
const meter = await customerService.createMeter(parseInt(req.params.customerId), req.body);
res.status(201).json({ success: true, data: meter });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Erstellen des Zählers',
});
}
}
async function updateMeter(req, res) {
try {
const meter = await customerService.updateMeter(parseInt(req.params.id), req.body);
res.json({ success: true, data: meter });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Aktualisieren des Zählers',
});
}
}
async function deleteMeter(req, res) {
try {
await customerService.deleteMeter(parseInt(req.params.id));
res.json({ success: true, message: 'Zähler gelöscht' });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Löschen des Zählers',
});
}
}
// Meter Readings
async function getMeterReadings(req, res) {
try {
const readings = await customerService.getMeterReadings(parseInt(req.params.meterId));
res.json({ success: true, data: readings });
}
catch (error) {
res.status(500).json({ success: false, error: 'Fehler beim Laden der Zählerstände' });
}
}
async function addMeterReading(req, res) {
try {
const reading = await customerService.addMeterReading(parseInt(req.params.meterId), req.body);
res.status(201).json({ success: true, data: reading });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Hinzufügen des Zählerstands',
});
}
}
async function updateMeterReading(req, res) {
try {
const reading = await customerService.updateMeterReading(parseInt(req.params.meterId), parseInt(req.params.readingId), req.body);
res.json({ success: true, data: reading });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Aktualisieren des Zählerstands',
});
}
}
async function deleteMeterReading(req, res) {
try {
await customerService.deleteMeterReading(parseInt(req.params.meterId), parseInt(req.params.readingId));
res.json({ success: true, data: null });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Löschen des Zählerstands',
});
}
}
// ==================== PORTAL SETTINGS ====================
async function getPortalSettings(req, res) {
try {
const settings = await customerService.getPortalSettings(parseInt(req.params.customerId));
if (!settings) {
res.status(404).json({ success: false, error: 'Kunde nicht gefunden' });
return;
}
// Passwort-Hash nicht zurückgeben, nur ob ein Passwort gesetzt ist
res.json({
success: true,
data: {
id: settings.id,
portalEnabled: settings.portalEnabled,
portalEmail: settings.portalEmail,
portalLastLogin: settings.portalLastLogin,
hasPassword: !!settings.portalPasswordHash,
},
});
}
catch (error) {
res.status(500).json({
success: false,
error: 'Fehler beim Laden der Portal-Einstellungen',
});
}
}
async function updatePortalSettings(req, res) {
try {
const { portalEnabled, portalEmail } = req.body;
const settings = await customerService.updatePortalSettings(parseInt(req.params.customerId), {
portalEnabled,
portalEmail,
});
res.json({ success: true, data: settings });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Aktualisieren der Portal-Einstellungen',
});
}
}
async function setPortalPassword(req, res) {
try {
const { password } = req.body;
if (!password || password.length < 6) {
res.status(400).json({
success: false,
error: 'Passwort muss mindestens 6 Zeichen lang sein',
});
return;
}
await authService.setCustomerPortalPassword(parseInt(req.params.customerId), password);
res.json({ success: true, message: 'Passwort gesetzt' });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Setzen des Passworts',
});
}
}
async function getPortalPassword(req, res) {
try {
const password = await authService.getCustomerPortalPassword(parseInt(req.params.customerId));
res.json({ success: true, data: { password } });
}
catch (error) {
res.status(500).json({
success: false,
error: 'Fehler beim Abrufen des Passworts',
});
}
}
// ==================== REPRESENTATIVE MANAGEMENT ====================
async function getRepresentatives(req, res) {
try {
// Wer kann diesen Kunden vertreten (representedBy)?
const representedBy = await customerService.getRepresentedByList(parseInt(req.params.customerId));
res.json({ success: true, data: representedBy });
}
catch (error) {
res.status(500).json({
success: false,
error: 'Fehler beim Laden der Vertreter',
});
}
}
async function addRepresentative(req, res) {
try {
const { representativeId, notes } = req.body;
const representative = await customerService.addRepresentative(parseInt(req.params.customerId), parseInt(representativeId), notes);
res.status(201).json({ success: true, data: representative });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Hinzufügen des Vertreters',
});
}
}
async function removeRepresentative(req, res) {
try {
await customerService.removeRepresentative(parseInt(req.params.customerId), parseInt(req.params.representativeId));
res.json({ success: true, message: 'Vertreter entfernt' });
}
catch (error) {
res.status(400).json({
success: false,
error: error instanceof Error ? error.message : 'Fehler beim Entfernen des Vertreters',
});
}
}
async function searchForRepresentative(req, res) {
try {
const { search } = req.query;
if (!search || typeof search !== 'string' || search.length < 2) {
res.json({ success: true, data: [] });
return;
}
const customers = await customerService.searchCustomersForRepresentative(search, parseInt(req.params.customerId));
res.json({ success: true, data: customers });
}
catch (error) {
res.status(500).json({
success: false,
error: 'Fehler bei der Suche',
});
}
}
//# sourceMappingURL=customer.controller.js.map