complete new audit system

This commit is contained in:
2026-03-21 18:23:54 +01:00
parent 38b3b7da73
commit fd55742c57
159 changed files with 2841 additions and 736 deletions
+36 -33
View File
@@ -1,4 +1,7 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAllContracts = getAllContracts;
exports.getContractById = getContractById;
@@ -12,9 +15,9 @@ exports.getInternetCredentials = getInternetCredentials;
exports.getSipCredentials = getSipCredentials;
exports.getContractTreeForCustomer = getContractTreeForCustomer;
const client_1 = require("@prisma/client");
const prisma_js_1 = __importDefault(require("../lib/prisma.js"));
const helpers_js_1 = require("../utils/helpers.js");
const encryption_js_1 = require("../utils/encryption.js");
const prisma = new client_1.PrismaClient();
async function getAllContracts(filters) {
const { customerId, customerIds, type, status, search, page = 1, limit = 20 } = filters;
const { skip, take } = (0, helpers_js_1.paginate)(page, limit);
@@ -72,7 +75,7 @@ async function getAllContracts(filters) {
];
}
const [contracts, total] = await Promise.all([
prisma.contract.findMany({
prisma_js_1.default.contract.findMany({
where,
skip,
take,
@@ -97,7 +100,7 @@ async function getAllContracts(filters) {
contractCategory: true,
},
}),
prisma.contract.count({ where }),
prisma_js_1.default.contract.count({ where }),
]);
return {
contracts,
@@ -105,7 +108,7 @@ async function getAllContracts(filters) {
};
}
async function getContractById(id, decryptPassword = false) {
const contract = await prisma.contract.findUnique({
const contract = await prisma_js_1.default.contract.findUnique({
where: { id },
include: {
customer: true,
@@ -159,7 +162,7 @@ async function createContract(data) {
const portalPasswordEncrypted = portalPassword
? (0, encryption_js_1.encrypt)(portalPassword)
: undefined;
const contract = await prisma.contract.create({
const contract = await prisma_js_1.default.contract.create({
data: {
...contractData,
contractNumber: (0, helpers_js_1.generateContractNumber)(data.type),
@@ -255,7 +258,7 @@ async function updateContract(id, data) {
? (0, encryption_js_1.encrypt)(portalPassword)
: undefined;
// Update main contract
await prisma.contract.update({
await prisma_js_1.default.contract.update({
where: { id },
data: {
...contractData,
@@ -264,11 +267,11 @@ async function updateContract(id, data) {
});
// Update type-specific details
if (energyDetails) {
const existingEcd = await prisma.energyContractDetails.findUnique({
const existingEcd = await prisma_js_1.default.energyContractDetails.findUnique({
where: { contractId: id },
select: { id: true, meterId: true },
});
await prisma.energyContractDetails.upsert({
await prisma_js_1.default.energyContractDetails.upsert({
where: { contractId: id },
update: energyDetails,
create: { contractId: id, ...energyDetails },
@@ -279,16 +282,16 @@ async function updateContract(id, data) {
const newMeterId = energyDetails.meterId;
if (oldMeterId !== newMeterId) {
// Alle alten ContractMeter-Einträge entfernen
await prisma.contractMeter.deleteMany({
await prisma_js_1.default.contractMeter.deleteMany({
where: { energyContractDetailsId: existingEcd.id },
});
// Neuen ContractMeter-Eintrag erstellen (wenn ein Zähler gesetzt)
if (newMeterId) {
const contract = await prisma.contract.findUnique({
const contract = await prisma_js_1.default.contract.findUnique({
where: { id },
select: { startDate: true },
});
await prisma.contractMeter.create({
await prisma_js_1.default.contractMeter.create({
data: {
energyContractDetailsId: existingEcd.id,
meterId: newMeterId,
@@ -302,7 +305,7 @@ async function updateContract(id, data) {
}
if (internetDetails) {
const { phoneNumbers, internetPassword, ...internetData } = internetDetails;
const existing = await prisma.internetContractDetails.findUnique({
const existing = await prisma_js_1.default.internetContractDetails.findUnique({
where: { contractId: id },
include: { phoneNumbers: true },
});
@@ -322,7 +325,7 @@ async function updateContract(id, data) {
activationCode: internetData.activationCode,
};
if (existing) {
await prisma.internetContractDetails.update({
await prisma_js_1.default.internetContractDetails.update({
where: { contractId: id },
data: preparedInternetData,
});
@@ -330,11 +333,11 @@ async function updateContract(id, data) {
// Get existing phone numbers for preserving encrypted passwords
const existingPhoneNumbers = existing.phoneNumbers || [];
// Delete all existing phone numbers
await prisma.phoneNumber.deleteMany({
await prisma_js_1.default.phoneNumber.deleteMany({
where: { internetContractDetailsId: existing.id },
});
// Create new phone numbers with encryption
await prisma.phoneNumber.createMany({
await prisma_js_1.default.phoneNumber.createMany({
data: phoneNumbers.map((pn) => {
// Find existing entry to preserve sipPassword if not changed
const existingPn = pn.id
@@ -356,7 +359,7 @@ async function updateContract(id, data) {
}
}
else {
await prisma.internetContractDetails.create({
await prisma_js_1.default.internetContractDetails.create({
data: {
contractId: id,
...preparedInternetData,
@@ -382,26 +385,26 @@ async function updateContract(id, data) {
}
if (mobileDetails) {
const { simCards, ...mobileData } = mobileDetails;
const existing = await prisma.mobileContractDetails.findUnique({
const existing = await prisma_js_1.default.mobileContractDetails.findUnique({
where: { contractId: id },
});
if (existing) {
await prisma.mobileContractDetails.update({
await prisma_js_1.default.mobileContractDetails.update({
where: { contractId: id },
data: mobileData,
});
if (simCards) {
// Get existing sim cards to preserve PIN/PUK if not provided
const existingSimCards = await prisma.simCard.findMany({
const existingSimCards = await prisma_js_1.default.simCard.findMany({
where: { mobileDetailsId: existing.id },
});
const existingSimCardMap = new Map(existingSimCards.map(sc => [sc.id, sc]));
// Delete existing sim cards
await prisma.simCard.deleteMany({
await prisma_js_1.default.simCard.deleteMany({
where: { mobileDetailsId: existing.id },
});
// Create new sim cards, preserving PIN/PUK if not provided
await prisma.simCard.createMany({
await prisma_js_1.default.simCard.createMany({
data: simCards.map((sc) => {
const existingSc = sc.id ? existingSimCardMap.get(sc.id) : undefined;
return {
@@ -419,7 +422,7 @@ async function updateContract(id, data) {
}
}
else {
await prisma.mobileContractDetails.create({
await prisma_js_1.default.mobileContractDetails.create({
data: {
contractId: id,
...mobileData,
@@ -440,14 +443,14 @@ async function updateContract(id, data) {
}
}
if (tvDetails) {
await prisma.tvContractDetails.upsert({
await prisma_js_1.default.tvContractDetails.upsert({
where: { contractId: id },
update: tvDetails,
create: { contractId: id, ...tvDetails },
});
}
if (carInsuranceDetails) {
await prisma.carInsuranceDetails.upsert({
await prisma_js_1.default.carInsuranceDetails.upsert({
where: { contractId: id },
update: carInsuranceDetails,
create: { contractId: id, ...carInsuranceDetails },
@@ -459,17 +462,17 @@ async function deleteContract(id) {
// Vertragskette erhalten beim Löschen:
// Wenn A → B → C und B gelöscht wird, soll C direkt auf A zeigen (A → C)
// 1. Zu löschenden Vertrag holen um dessen Vorgänger zu kennen
const contractToDelete = await prisma.contract.findUnique({
const contractToDelete = await prisma_js_1.default.contract.findUnique({
where: { id },
select: { previousContractId: true },
});
// 2. Folgevertrag(e) mit dem Vorgänger des gelöschten Vertrags verbinden
// So bleibt die Kette erhalten: A → B → C wird zu A → C
await prisma.contract.updateMany({
await prisma_js_1.default.contract.updateMany({
where: { previousContractId: id },
data: { previousContractId: contractToDelete?.previousContractId ?? null },
});
return prisma.contract.delete({ where: { id } });
return prisma_js_1.default.contract.delete({ where: { id } });
}
async function createFollowUpContract(previousContractId) {
const previousContract = await getContractById(previousContractId);
@@ -477,7 +480,7 @@ async function createFollowUpContract(previousContractId) {
throw new Error('Vorgängervertrag nicht gefunden');
}
// Prüfen ob bereits ein Folgevertrag existiert
const existingFollowUp = await prisma.contract.findFirst({
const existingFollowUp = await prisma_js_1.default.contract.findFirst({
where: { previousContractId },
select: { id: true, contractNumber: true },
});
@@ -568,7 +571,7 @@ async function createFollowUpContract(previousContractId) {
}
// Decrypt password for viewing
async function getContractPassword(id) {
const contract = await prisma.contract.findUnique({
const contract = await prisma_js_1.default.contract.findUnique({
where: { id },
select: { portalPasswordEncrypted: true },
});
@@ -583,7 +586,7 @@ async function getContractPassword(id) {
}
// Decrypt SimCard PIN/PUK
async function getSimCardCredentials(simCardId) {
const simCard = await prisma.simCard.findUnique({
const simCard = await prisma_js_1.default.simCard.findUnique({
where: { id: simCardId },
select: { pin: true, puk: true },
});
@@ -601,7 +604,7 @@ async function getSimCardCredentials(simCardId) {
}
// Decrypt Internet password
async function getInternetCredentials(contractId) {
const internetDetails = await prisma.internetContractDetails.findUnique({
const internetDetails = await prisma_js_1.default.internetContractDetails.findUnique({
where: { contractId },
select: { internetPasswordEncrypted: true },
});
@@ -618,7 +621,7 @@ async function getInternetCredentials(contractId) {
}
// Decrypt SIP password for a phone number
async function getSipCredentials(phoneNumberId) {
const phoneNumber = await prisma.phoneNumber.findUnique({
const phoneNumber = await prisma_js_1.default.phoneNumber.findUnique({
where: { id: phoneNumberId },
select: { sipPasswordEncrypted: true },
});
@@ -640,7 +643,7 @@ async function getSipCredentials(phoneNumberId) {
*/
async function getContractTreeForCustomer(customerId) {
// Alle Verträge des Kunden laden (außer DEACTIVATED)
const allContracts = await prisma.contract.findMany({
const allContracts = await prisma_js_1.default.contract.findMany({
where: {
customerId,
status: { not: client_1.ContractStatus.DEACTIVATED },