Initial commit - ERP System
This commit is contained in:
@@ -0,0 +1,324 @@
|
||||
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]/tls [external] (tls, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("tls", () => require("tls"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/net [external] (net, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("net", () => require("net"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/crypto [external] (crypto, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("crypto", () => require("crypto"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/events [external] (events, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("events", () => require("events"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/node:buffer [external] (node:buffer, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("node:buffer", () => require("node:buffer"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/buffer [external] (buffer, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("buffer", () => require("buffer"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/string_decoder [external] (string_decoder, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("string_decoder", () => require("string_decoder"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/stream [external] (stream, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("stream", () => require("stream"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/node:stream [external] (node:stream, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("node:stream", () => require("node:stream"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/zlib [external] (zlib, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("zlib", () => require("zlib"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/path [external] (path, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("path", () => require("path"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/url [external] (url, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("url", () => require("url"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/util [external] (util, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("util", () => require("util"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[externals]/dns [external] (dns, cjs)", ((__turbopack_context__, module, exports) => {
|
||||
|
||||
const mod = __turbopack_context__.x("dns", () => require("dns"));
|
||||
|
||||
module.exports = mod;
|
||||
}),
|
||||
"[project]/app/api/cron/imap/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,
|
||||
"dynamic",
|
||||
()=>dynamic
|
||||
]);
|
||||
// /opt/erp-system/app/api/cron/imap/route.ts
|
||||
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$imapflow$2f$lib$2f$imap$2d$flow$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/imapflow/lib/imap-flow.js [app-route] (ecmascript)");
|
||||
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$mailparser$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/mailparser/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 dynamic = 'force-dynamic';
|
||||
async function GET() {
|
||||
try {
|
||||
// 1. Settings laden
|
||||
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({
|
||||
where: {
|
||||
id: 1
|
||||
}
|
||||
});
|
||||
if (!settings || !settings.imapHost || !settings.imapUser || !settings.imapPass) {
|
||||
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: 'IMAP Zugangsdaten fehlen.'
|
||||
}, {
|
||||
status: 400
|
||||
});
|
||||
}
|
||||
// 2. Verbindung herstellen
|
||||
const client = new __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$imapflow$2f$lib$2f$imap$2d$flow$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["ImapFlow"]({
|
||||
host: settings.imapHost,
|
||||
port: settings.imapPort,
|
||||
secure: settings.imapPort === 993,
|
||||
auth: {
|
||||
user: settings.imapUser,
|
||||
pass: settings.imapPass
|
||||
},
|
||||
logger: false // Verhindert Spam im Terminal
|
||||
});
|
||||
await client.connect();
|
||||
// Lock auf den Posteingang setzen, damit keine Mails übersprungen werden
|
||||
let lock = await client.getMailboxLock('INBOX');
|
||||
let processedCounter = 0;
|
||||
try {
|
||||
// 3. Nach ungelesenen E-Mails suchen
|
||||
for await (let message of client.fetch({
|
||||
seen: false
|
||||
}, {
|
||||
source: true,
|
||||
uid: true
|
||||
})){
|
||||
// E-Mail Source-Code in lesbaren Text übersetzen
|
||||
const parsed = await (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$mailparser$2f$index$2e$js__$5b$app$2d$route$5d$__$28$ecmascript$29$__["simpleParser"])(message.source);
|
||||
const fromEmail = parsed.from?.value[0]?.address;
|
||||
const fromName = parsed.from?.value[0]?.name || 'Unbekannt';
|
||||
const subject = parsed.subject || 'Kein Betreff';
|
||||
// Wir nehmen den Text-Teil der Mail. Wenn nur HTML da ist, nehmen wir das als Fallback.
|
||||
const textContent = parsed.text || parsed.textAsHtml || '(Kein Inhalt)';
|
||||
if (!fromEmail) continue;
|
||||
// 4. Kunden prüfen oder anlegen
|
||||
let 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: fromEmail
|
||||
}
|
||||
});
|
||||
if (!customer) {
|
||||
customer = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].customer.create({
|
||||
data: {
|
||||
email: fromEmail,
|
||||
firstName: fromName,
|
||||
lastName: '(Auto-Erfasst)',
|
||||
companyName: 'Aus E-Mail Anfrage'
|
||||
}
|
||||
});
|
||||
}
|
||||
// 5. Zuweisung: Neues Ticket oder Antwort?
|
||||
const ticketMatch = subject.match(/Ticket #(\d+)/i);
|
||||
let ticketId = ticketMatch ? parseInt(ticketMatch[1]) : null;
|
||||
let existingTicket = null;
|
||||
if (ticketId) {
|
||||
existingTicket = await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].ticket.findUnique({
|
||||
where: {
|
||||
id: ticketId
|
||||
}
|
||||
});
|
||||
}
|
||||
if (existingTicket) {
|
||||
// Antwort an den Chatverlauf anhängen
|
||||
await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].ticketMessage.create({
|
||||
data: {
|
||||
content: textContent,
|
||||
isFromCustomer: true,
|
||||
ticketId: existingTicket.id
|
||||
}
|
||||
});
|
||||
// Ticket aufwecken, falls es schon gelöst war
|
||||
if (existingTicket.status !== 'OPEN' && existingTicket.status !== 'IN_PROGRESS') {
|
||||
await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].ticket.update({
|
||||
where: {
|
||||
id: existingTicket.id
|
||||
},
|
||||
data: {
|
||||
status: 'OPEN'
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// Komplett neues Ticket aufmachen
|
||||
await __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$prisma$2e$ts__$5b$app$2d$route$5d$__$28$ecmascript$29$__["default"].ticket.create({
|
||||
data: {
|
||||
title: subject,
|
||||
description: textContent,
|
||||
customerId: customer.id,
|
||||
status: 'OPEN'
|
||||
}
|
||||
});
|
||||
}
|
||||
// 6. E-Mail als gelesen markieren, damit sie beim nächsten Mal ignoriert wird
|
||||
await client.messageFlagsAdd(message.uid, [
|
||||
'\\Seen'
|
||||
], {
|
||||
uid: true
|
||||
});
|
||||
processedCounter++;
|
||||
}
|
||||
} finally{
|
||||
// Postfach wieder freigeben
|
||||
lock.release();
|
||||
}
|
||||
await client.logout();
|
||||
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({
|
||||
success: true,
|
||||
processedTickets: processedCounter
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('IMAP 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: 'Verbindungs- oder Verarbeitungsfehler',
|
||||
details: error.message
|
||||
}, {
|
||||
status: 500
|
||||
});
|
||||
}
|
||||
}
|
||||
__turbopack_async_result__();
|
||||
} catch(e) { __turbopack_async_result__(e); } }, false);}),
|
||||
];
|
||||
|
||||
//# sourceMappingURL=%5Broot-of-the-server%5D__0psau92._.js.map
|
||||
Reference in New Issue
Block a user