661 lines
33 KiB
JavaScript
661 lines
33 KiB
JavaScript
module.exports = [
|
|
"[externals]/next/dist/compiled/next-server/app-route-turbo.runtime.dev.js [external] (next/dist/compiled/next-server/app-route-turbo.runtime.dev.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/compiled/next-server/app-route-turbo.runtime.dev.js", () => require("next/dist/compiled/next-server/app-route-turbo.runtime.dev.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/compiled/@opentelemetry/api [external] (next/dist/compiled/@opentelemetry/api, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/compiled/@opentelemetry/api", () => require("next/dist/compiled/@opentelemetry/api"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/compiled/next-server/app-page-turbo.runtime.dev.js [external] (next/dist/compiled/next-server/app-page-turbo.runtime.dev.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/compiled/next-server/app-page-turbo.runtime.dev.js", () => require("next/dist/compiled/next-server/app-page-turbo.runtime.dev.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/server/app-render/work-unit-async-storage.external.js [external] (next/dist/server/app-render/work-unit-async-storage.external.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/server/app-render/work-unit-async-storage.external.js", () => require("next/dist/server/app-render/work-unit-async-storage.external.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/server/app-render/work-async-storage.external.js [external] (next/dist/server/app-render/work-async-storage.external.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/server/app-render/work-async-storage.external.js", () => require("next/dist/server/app-render/work-async-storage.external.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/shared/lib/no-fallback-error.external.js [external] (next/dist/shared/lib/no-fallback-error.external.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/shared/lib/no-fallback-error.external.js", () => require("next/dist/shared/lib/no-fallback-error.external.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/next/dist/server/app-render/after-task-async-storage.external.js [external] (next/dist/server/app-render/after-task-async-storage.external.js, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("next/dist/server/app-render/after-task-async-storage.external.js", () => require("next/dist/server/app-render/after-task-async-storage.external.js"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[project]/lib/prisma.ts [app-route] (ecmascript)", ((__turbopack_context__) => {
|
|
"use strict";
|
|
|
|
return __turbopack_context__.a(async (__turbopack_handle_async_dependencies__, __turbopack_async_result__) => { try {
|
|
|
|
__turbopack_context__.s([
|
|
"default",
|
|
()=>__TURBOPACK__default__export__,
|
|
"prisma",
|
|
()=>prisma
|
|
]);
|
|
// /opt/erp-system/lib/prisma.ts
|
|
var __TURBOPACK__imported__module__$5b$externals$5d2f40$prisma$2f$client__$5b$external$5d$__$2840$prisma$2f$client$2c$__cjs$2c$__$5b$project$5d2f$node_modules$2f40$prisma$2f$client$29$__ = __turbopack_context__.i("[externals]/@prisma/client [external] (@prisma/client, cjs, [project]/node_modules/@prisma/client)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/@prisma/adapter-pg/dist/index.mjs [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$node_modules$2f$pg$29$__ = __turbopack_context__.i("[externals]/pg [external] (pg, esm_import, [project]/node_modules/pg)");
|
|
var __turbopack_async_dependencies__ = __turbopack_handle_async_dependencies__([
|
|
__TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__,
|
|
__TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$node_modules$2f$pg$29$__
|
|
]);
|
|
[__TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__, __TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$node_modules$2f$pg$29$__] = __turbopack_async_dependencies__.then ? (await __turbopack_async_dependencies__)() : __turbopack_async_dependencies__;
|
|
;
|
|
;
|
|
;
|
|
// Verhindert zu viele offene Verbindungen beim Hot-Reloading in Next.js
|
|
const globalForPrisma = /*TURBOPACK member replacement*/ __turbopack_context__.g;
|
|
const pool = new __TURBOPACK__imported__module__$5b$externals$5d2f$pg__$5b$external$5d$__$28$pg$2c$__esm_import$2c$__$5b$project$5d2f$node_modules$2f$pg$29$__["Pool"]({
|
|
connectionString: process.env.DATABASE_URL
|
|
});
|
|
const adapter = new __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f40$prisma$2f$adapter$2d$pg$2f$dist$2f$index$2e$mjs__$5b$app$2d$route$5d$__$28$ecmascript$29$__["PrismaPg"](pool);
|
|
const prisma = globalForPrisma.prisma || new __TURBOPACK__imported__module__$5b$externals$5d2f40$prisma$2f$client__$5b$external$5d$__$2840$prisma$2f$client$2c$__cjs$2c$__$5b$project$5d2f$node_modules$2f40$prisma$2f$client$29$__["PrismaClient"]({
|
|
adapter
|
|
});
|
|
if ("TURBOPACK compile-time truthy", 1) globalForPrisma.prisma = prisma;
|
|
const __TURBOPACK__default__export__ = prisma;
|
|
__turbopack_async_result__();
|
|
} catch(e) { __turbopack_async_result__(e); } }, false);}),
|
|
"[externals]/util [external] (util, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("util", () => require("util"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/url [external] (url, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("url", () => require("url"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/http [external] (http, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("http", () => require("http"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/crypto [external] (crypto, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("crypto", () => require("crypto"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/assert [external] (assert, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("assert", () => require("assert"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/querystring [external] (querystring, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("querystring", () => require("querystring"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/buffer [external] (buffer, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("buffer", () => require("buffer"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/zlib [external] (zlib, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("zlib", () => require("zlib"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/https [external] (https, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("https", () => require("https"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[externals]/events [external] (events, cjs)", ((__turbopack_context__, module, exports) => {
|
|
|
|
const mod = __turbopack_context__.x("events", () => require("events"));
|
|
|
|
module.exports = mod;
|
|
}),
|
|
"[project]/app/api/auth/[...nextauth]/route.ts [app-route] (ecmascript)", ((__turbopack_context__) => {
|
|
"use strict";
|
|
|
|
return __turbopack_context__.a(async (__turbopack_handle_async_dependencies__, __turbopack_async_result__) => { try {
|
|
|
|
__turbopack_context__.s([
|
|
"GET",
|
|
()=>handler,
|
|
"POST",
|
|
()=>handler,
|
|
"authOptions",
|
|
()=>authOptions
|
|
]);
|
|
// /opt/erp-system/app/api/auth/[...nextauth]/route.ts
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2d$auth$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next-auth/index.js [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2d$auth$2f$providers$2f$credentials$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next-auth/providers/credentials.js [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/lib/prisma.ts [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$bcryptjs$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/bcryptjs/index.js [app-route] (ecmascript)");
|
|
var __turbopack_async_dependencies__ = __turbopack_handle_async_dependencies__([
|
|
__TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__
|
|
]);
|
|
[__TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__] = __turbopack_async_dependencies__.then ? (await __turbopack_async_dependencies__)() : __turbopack_async_dependencies__;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
const authOptions = {
|
|
providers: [
|
|
(0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2d$auth$2f$providers$2f$credentials$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"])({
|
|
name: "Credentials",
|
|
credentials: {
|
|
email: {
|
|
label: "Email",
|
|
type: "email"
|
|
},
|
|
password: {
|
|
label: "Passwort",
|
|
type: "password"
|
|
}
|
|
},
|
|
async authorize (credentials) {
|
|
if (!credentials?.email || !credentials?.password) return null;
|
|
const teamUser = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].user.findUnique({
|
|
where: {
|
|
email: credentials.email
|
|
},
|
|
include: {
|
|
role: true
|
|
}
|
|
});
|
|
if (teamUser) {
|
|
const match = await __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$bcryptjs$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].compare(credentials.password, teamUser.passwordHash);
|
|
if (match) {
|
|
return {
|
|
id: `TEAM_${teamUser.id}`,
|
|
dbId: teamUser.id,
|
|
email: teamUser.email,
|
|
firstName: teamUser.firstName,
|
|
lastName: teamUser.lastName,
|
|
roleName: teamUser.role?.name || 'Keine Rolle',
|
|
permissions: teamUser.role?.permissions || [],
|
|
userType: 'TEAM',
|
|
forcePasswordChange: false
|
|
};
|
|
}
|
|
}
|
|
const customer = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].customer.findUnique({
|
|
where: {
|
|
email: credentials.email
|
|
}
|
|
});
|
|
if (customer && customer.passwordHash) {
|
|
const match = await __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$bcryptjs$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].compare(credentials.password, customer.passwordHash);
|
|
if (match) {
|
|
return {
|
|
id: `CUST_${customer.id}`,
|
|
dbId: customer.id,
|
|
email: customer.email,
|
|
firstName: customer.firstName,
|
|
lastName: customer.lastName,
|
|
roleName: 'Kunde',
|
|
permissions: [],
|
|
userType: 'CUSTOMER',
|
|
companyName: customer.companyName,
|
|
forcePasswordChange: customer.forcePasswordChange // WICHTIG: Flag übergeben
|
|
};
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
})
|
|
],
|
|
callbacks: {
|
|
async jwt ({ token, user }) {
|
|
if (user) {
|
|
token.dbId = user.dbId;
|
|
token.firstName = user.firstName;
|
|
token.lastName = user.lastName;
|
|
token.roleName = user.roleName;
|
|
token.permissions = user.permissions;
|
|
token.userType = user.userType;
|
|
token.companyName = user.companyName;
|
|
token.forcePasswordChange = user.forcePasswordChange;
|
|
}
|
|
return token;
|
|
},
|
|
async session ({ session, token }) {
|
|
if (token) {
|
|
session.user.id = token.dbId;
|
|
session.user.firstName = token.firstName;
|
|
session.user.lastName = token.lastName;
|
|
session.user.roleName = token.roleName;
|
|
session.user.permissions = token.permissions || [];
|
|
session.user.userType = token.userType;
|
|
session.user.companyName = token.companyName;
|
|
session.user.forcePasswordChange = token.forcePasswordChange;
|
|
}
|
|
return session;
|
|
}
|
|
},
|
|
pages: {
|
|
signIn: "/login"
|
|
},
|
|
secret: process.env.NEXTAUTH_SECRET
|
|
};
|
|
const handler = (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2d$auth$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"])(authOptions);
|
|
;
|
|
__turbopack_async_result__();
|
|
} catch(e) { __turbopack_async_result__(e); } }, false);}),
|
|
"[project]/app/api/sales/[id]/route.ts [app-route] (ecmascript)", ((__turbopack_context__) => {
|
|
"use strict";
|
|
|
|
return __turbopack_context__.a(async (__turbopack_handle_async_dependencies__, __turbopack_async_result__) => { try {
|
|
|
|
__turbopack_context__.s([
|
|
"GET",
|
|
()=>GET,
|
|
"PUT",
|
|
()=>PUT
|
|
]);
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/server.js [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/lib/prisma.ts [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2d$auth$2f$next$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next-auth/next/index.js [app-route] (ecmascript)");
|
|
var __TURBOPACK__imported__module__$5b$project$5d2f$app$2f$api$2f$auth$2f5b2e2e2e$nextauth$5d2f$route$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/app/api/auth/[...nextauth]/route.ts [app-route] (ecmascript)");
|
|
var __turbopack_async_dependencies__ = __turbopack_handle_async_dependencies__([
|
|
__TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__,
|
|
__TURBOPACK__imported__module__$5b$project$5d2f$app$2f$api$2f$auth$2f5b2e2e2e$nextauth$5d2f$route$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__
|
|
]);
|
|
[__TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__, __TURBOPACK__imported__module__$5b$project$5d2f$app$2f$api$2f$auth$2f5b2e2e2e$nextauth$5d2f$route$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__] = __turbopack_async_dependencies__.then ? (await __turbopack_async_dependencies__)() : __turbopack_async_dependencies__;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
const PREFIXES = {
|
|
QUOTE: 'ANG',
|
|
ORDER_CONFIRMATION: 'AB',
|
|
DELIVERY_NOTE: 'LS',
|
|
INVOICE: 'RE',
|
|
CREDIT_NOTE: 'RK'
|
|
};
|
|
const NUMBER_FIELDS = {
|
|
QUOTE: 'nextQuoteNumber',
|
|
ORDER_CONFIRMATION: 'nextOrderNumber',
|
|
DELIVERY_NOTE: 'nextDeliveryNumber',
|
|
INVOICE: 'nextInvoiceNumber',
|
|
CREDIT_NOTE: 'nextCreditNoteNumber'
|
|
};
|
|
async function generateNumber(type) {
|
|
const settings = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].systemSettings.findFirst();
|
|
if (!settings) throw new Error('SystemSettings not found');
|
|
const year = new Date().getFullYear();
|
|
const prefix = PREFIXES[type] || 'DOC';
|
|
const field = NUMBER_FIELDS[type];
|
|
const num = settings[field] || 1;
|
|
await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].systemSettings.update({
|
|
where: {
|
|
id: settings.id
|
|
},
|
|
data: {
|
|
[field]: num + 1
|
|
}
|
|
});
|
|
return `${prefix}-${year}-${num.toString().padStart(4, '0')}`;
|
|
}
|
|
// Set status to ARCHIVED while preserving original status in previousStatus
|
|
async function archiveDoc(docId) {
|
|
const doc = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.findUnique({
|
|
where: {
|
|
id: docId
|
|
},
|
|
select: {
|
|
status: true
|
|
}
|
|
});
|
|
if (!doc || doc.status === 'ARCHIVED' || doc.status === 'CANCELLED') return;
|
|
await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.update({
|
|
where: {
|
|
id: docId
|
|
},
|
|
data: {
|
|
previousStatus: doc.status,
|
|
status: 'ARCHIVED'
|
|
}
|
|
});
|
|
}
|
|
// Walk the chain back via sourceDocumentId and collect all related doc IDs
|
|
async function getChainIds(docId) {
|
|
const ids = [];
|
|
let currentId = docId;
|
|
while(currentId){
|
|
const doc = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.findUnique({
|
|
where: {
|
|
id: currentId
|
|
},
|
|
select: {
|
|
sourceDocumentId: true
|
|
}
|
|
});
|
|
if (doc?.sourceDocumentId) {
|
|
ids.push(doc.sourceDocumentId);
|
|
currentId = doc.sourceDocumentId;
|
|
} else {
|
|
currentId = null;
|
|
}
|
|
}
|
|
return ids;
|
|
}
|
|
async function GET(request, context) {
|
|
try {
|
|
const { id } = await context.params;
|
|
const doc = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.findUnique({
|
|
where: {
|
|
id: parseInt(id)
|
|
},
|
|
include: {
|
|
customer: true,
|
|
items: {
|
|
include: {
|
|
product: true
|
|
}
|
|
},
|
|
createdBy: {
|
|
select: {
|
|
firstName: true,
|
|
lastName: true
|
|
}
|
|
}
|
|
}
|
|
});
|
|
if (!doc) return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'Nicht gefunden'
|
|
}, {
|
|
status: 404
|
|
});
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json(doc);
|
|
} catch (error) {
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'Ladefehler'
|
|
}, {
|
|
status: 500
|
|
});
|
|
}
|
|
}
|
|
async function PUT(request, context) {
|
|
const session = await (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2d$auth$2f$next$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["getServerSession"])(__TURBOPACK__imported__module__$5b$project$5d2f$app$2f$api$2f$auth$2f5b2e2e2e$nextauth$5d2f$route$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["authOptions"]);
|
|
const perms = session?.user?.permissions || [];
|
|
if (!perms.includes('SALES_MANAGE')) return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'Keine Berechtigung'
|
|
}, {
|
|
status: 403
|
|
});
|
|
try {
|
|
const { id } = await context.params;
|
|
const body = await request.json();
|
|
const docId = parseInt(id);
|
|
// Handle signature (not for invoices/credit notes)
|
|
if (body.signatureData) {
|
|
const doc = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.findUnique({
|
|
where: {
|
|
id: docId
|
|
}
|
|
});
|
|
if (doc?.type === 'INVOICE' || doc?.type === 'CREDIT_NOTE') {
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'Kann nicht unterschrieben werden'
|
|
}, {
|
|
status: 400
|
|
});
|
|
}
|
|
const updated = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.update({
|
|
where: {
|
|
id: docId
|
|
},
|
|
data: {
|
|
signatureData: body.signatureData,
|
|
signedAt: new Date(),
|
|
status: 'ACCEPTED'
|
|
}
|
|
});
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json(updated);
|
|
}
|
|
// Handle "create follow-up document" action
|
|
if (body.action === 'CREATE_FOLLOWUP') {
|
|
const doc = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.findUnique({
|
|
where: {
|
|
id: docId
|
|
},
|
|
include: {
|
|
items: true
|
|
}
|
|
});
|
|
if (!doc) return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'Not found'
|
|
}, {
|
|
status: 404
|
|
});
|
|
let newType = '';
|
|
if (doc.type === 'ORDER_CONFIRMATION') newType = 'DELIVERY_NOTE';
|
|
else if (doc.type === 'DELIVERY_NOTE') newType = 'INVOICE';
|
|
else if (doc.type === 'INVOICE') newType = 'CREDIT_NOTE';
|
|
else return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'Kein Folgebeleg möglich'
|
|
}, {
|
|
status: 400
|
|
});
|
|
const number = await generateNumber(newType);
|
|
const followUp = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.create({
|
|
data: {
|
|
type: newType,
|
|
number,
|
|
customerId: doc.customerId,
|
|
createdById: session?.user?.id || null,
|
|
sourceDocumentId: doc.id,
|
|
subtotal: doc.subtotal,
|
|
taxAmount: doc.taxAmount,
|
|
total: doc.total,
|
|
notes: newType === 'CREDIT_NOTE' ? `Rechnungskorrektur zu ${doc.number}` : doc.notes,
|
|
items: {
|
|
create: doc.items.map((i)=>({
|
|
description: i.description,
|
|
quantity: i.quantity,
|
|
unitPrice: i.unitPrice,
|
|
taxRate: i.taxRate,
|
|
total: i.total,
|
|
productId: i.productId
|
|
}))
|
|
}
|
|
},
|
|
include: {
|
|
items: true
|
|
}
|
|
});
|
|
// CREDIT_NOTE → cancel the original invoice
|
|
if (newType === 'CREDIT_NOTE') {
|
|
await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.update({
|
|
where: {
|
|
id: doc.id
|
|
},
|
|
data: {
|
|
previousStatus: doc.status,
|
|
status: 'CANCELLED'
|
|
}
|
|
});
|
|
} else {
|
|
// Archive the source document
|
|
await archiveDoc(doc.id);
|
|
}
|
|
// If creating an INVOICE → also archive all earlier docs in the chain
|
|
if (newType === 'INVOICE') {
|
|
const chainIds = await getChainIds(followUp.id);
|
|
for (const cid of chainIds){
|
|
await archiveDoc(cid);
|
|
}
|
|
}
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json(followUp, {
|
|
status: 201
|
|
});
|
|
}
|
|
// Handle status changes
|
|
if (body.status) {
|
|
const doc = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.findUnique({
|
|
where: {
|
|
id: docId
|
|
},
|
|
include: {
|
|
items: {
|
|
include: {
|
|
product: true
|
|
}
|
|
}
|
|
}
|
|
});
|
|
if (!doc) return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'Not found'
|
|
}, {
|
|
status: 404
|
|
});
|
|
// QUOTE accepted → reserve stock + auto-create AB (SENT) + archive quote
|
|
if (doc.type === 'QUOTE' && body.status === 'ACCEPTED') {
|
|
for (const item of doc.items){
|
|
if (item.productId && item.product?.trackStock) {
|
|
await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].product.update({
|
|
where: {
|
|
id: item.productId
|
|
},
|
|
data: {
|
|
reservedStock: {
|
|
increment: Math.ceil(item.quantity)
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
// Auto-create AB with status SENT
|
|
const abNumber = await generateNumber('ORDER_CONFIRMATION');
|
|
const ab = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.create({
|
|
data: {
|
|
type: 'ORDER_CONFIRMATION',
|
|
number: abNumber,
|
|
status: 'SENT',
|
|
customerId: doc.customerId,
|
|
createdById: session?.user?.id || null,
|
|
sourceDocumentId: doc.id,
|
|
subtotal: doc.subtotal,
|
|
taxAmount: doc.taxAmount,
|
|
total: doc.total,
|
|
notes: doc.notes,
|
|
items: {
|
|
create: doc.items.map((i)=>({
|
|
description: i.description,
|
|
quantity: i.quantity,
|
|
unitPrice: i.unitPrice,
|
|
taxRate: i.taxRate,
|
|
total: i.total,
|
|
productId: i.productId
|
|
}))
|
|
}
|
|
}
|
|
});
|
|
// Archive the quote (preserving ACCEPTED as previousStatus)
|
|
await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.update({
|
|
where: {
|
|
id: docId
|
|
},
|
|
data: {
|
|
previousStatus: 'ACCEPTED',
|
|
status: 'ARCHIVED'
|
|
}
|
|
});
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
...doc,
|
|
status: 'ARCHIVED',
|
|
followUpId: ab.id,
|
|
followUpNumber: ab.number
|
|
});
|
|
}
|
|
// DELIVERY_NOTE delivered → reduce stock
|
|
if (doc.type === 'DELIVERY_NOTE' && body.status === 'DELIVERED') {
|
|
for (const item of doc.items){
|
|
if (item.productId && item.product?.trackStock) {
|
|
await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].product.update({
|
|
where: {
|
|
id: item.productId
|
|
},
|
|
data: {
|
|
stock: {
|
|
decrement: Math.ceil(item.quantity)
|
|
},
|
|
reservedStock: {
|
|
decrement: Math.ceil(item.quantity)
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
// INVOICE paid → mark as paid then archive
|
|
if (doc.type === 'INVOICE' && body.status === 'PAID') {
|
|
await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.update({
|
|
where: {
|
|
id: docId
|
|
},
|
|
data: {
|
|
previousStatus: 'PAID',
|
|
status: 'ARCHIVED'
|
|
}
|
|
});
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
...doc,
|
|
status: 'ARCHIVED',
|
|
previousStatus: 'PAID'
|
|
});
|
|
}
|
|
}
|
|
const updated = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].salesDocument.update({
|
|
where: {
|
|
id: docId
|
|
},
|
|
data: {
|
|
status: body.status || undefined,
|
|
notes: body.notes !== undefined ? body.notes : undefined
|
|
},
|
|
include: {
|
|
items: true,
|
|
customer: true
|
|
}
|
|
});
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json(updated);
|
|
} catch (error) {
|
|
console.error(error);
|
|
return __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$server$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["NextResponse"].json({
|
|
error: 'Fehler'
|
|
}, {
|
|
status: 500
|
|
});
|
|
}
|
|
}
|
|
__turbopack_async_result__();
|
|
} catch(e) { __turbopack_async_result__(e); } }, false);}),
|
|
];
|
|
|
|
//# sourceMappingURL=%5Broot-of-the-server%5D__13_7gv.._.js.map
|