snooze vor expired, contracts, display snoozed contracts if an item is missing, un snooze implemented, fixed invoice upload bug
This commit is contained in:
+8
@@ -135,6 +135,7 @@ export declare function getAllContracts(filters: ContractFilters): Promise<{
|
||||
wasSpecialCancellation: boolean;
|
||||
portalUsername: string | null;
|
||||
stressfreiEmailId: number | null;
|
||||
nextReviewDate: Date | null;
|
||||
})[];
|
||||
pagination: {
|
||||
page: number;
|
||||
@@ -564,6 +565,7 @@ export declare function getContractById(id: number, decryptPassword?: boolean):
|
||||
wasSpecialCancellation: boolean;
|
||||
portalUsername: string | null;
|
||||
stressfreiEmailId: number | null;
|
||||
nextReviewDate: Date | null;
|
||||
}) | null;
|
||||
followUpContract: {
|
||||
id: number;
|
||||
@@ -609,6 +611,7 @@ export declare function getContractById(id: number, decryptPassword?: boolean):
|
||||
wasSpecialCancellation: boolean;
|
||||
portalUsername: string | null;
|
||||
stressfreiEmailId: number | null;
|
||||
nextReviewDate: Date | null;
|
||||
}) | null>;
|
||||
interface ContractCreateData {
|
||||
customerId: number;
|
||||
@@ -894,6 +897,7 @@ export declare function createContract(data: ContractCreateData): Promise<{
|
||||
wasSpecialCancellation: boolean;
|
||||
portalUsername: string | null;
|
||||
stressfreiEmailId: number | null;
|
||||
nextReviewDate: Date | null;
|
||||
}>;
|
||||
export declare function updateContract(id: number, data: Partial<ContractCreateData>): Promise<({
|
||||
customer: {
|
||||
@@ -1316,6 +1320,7 @@ export declare function updateContract(id: number, data: Partial<ContractCreateD
|
||||
wasSpecialCancellation: boolean;
|
||||
portalUsername: string | null;
|
||||
stressfreiEmailId: number | null;
|
||||
nextReviewDate: Date | null;
|
||||
}) | null;
|
||||
followUpContract: {
|
||||
id: number;
|
||||
@@ -1361,6 +1366,7 @@ export declare function updateContract(id: number, data: Partial<ContractCreateD
|
||||
wasSpecialCancellation: boolean;
|
||||
portalUsername: string | null;
|
||||
stressfreiEmailId: number | null;
|
||||
nextReviewDate: Date | null;
|
||||
}) | null>;
|
||||
export declare function deleteContract(id: number): Promise<{
|
||||
id: number;
|
||||
@@ -1401,6 +1407,7 @@ export declare function deleteContract(id: number): Promise<{
|
||||
wasSpecialCancellation: boolean;
|
||||
portalUsername: string | null;
|
||||
stressfreiEmailId: number | null;
|
||||
nextReviewDate: Date | null;
|
||||
}>;
|
||||
export declare function createFollowUpContract(previousContractId: number): Promise<{
|
||||
customer: {
|
||||
@@ -1588,6 +1595,7 @@ export declare function createFollowUpContract(previousContractId: number): Prom
|
||||
wasSpecialCancellation: boolean;
|
||||
portalUsername: string | null;
|
||||
stressfreiEmailId: number | null;
|
||||
nextReviewDate: Date | null;
|
||||
}>;
|
||||
export declare function getContractPassword(id: number): Promise<string | null>;
|
||||
export declare function getSimCardCredentials(simCardId: number): Promise<{
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -43,6 +43,7 @@ export interface CockpitSummary {
|
||||
missingInvoices: number;
|
||||
openTasks: number;
|
||||
pendingContracts: number;
|
||||
reviewDue: number;
|
||||
};
|
||||
}
|
||||
export interface CockpitResult {
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
{"version":3,"file":"contractCockpit.service.d.ts","sourceRoot":"","sources":["../../src/services/contractCockpit.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EACpC,MAAM,gBAAgB,CAAC;AAMxB,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,cAAc,EAAE,MAAM,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,CAAC,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,cAAc,EAAE,YAAY,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE;QACV,qBAAqB,EAAE,MAAM,CAAC;QAC9B,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAyED,wBAAsB,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC,CAya7D"}
|
||||
{"version":3,"file":"contractCockpit.service.d.ts","sourceRoot":"","sources":["../../src/services/contractCockpit.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EACpC,MAAM,gBAAgB,CAAC;AAMxB,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,cAAc,EAAE,MAAM,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,CAAC,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,cAAc,EAAE,YAAY,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE;QACV,qBAAqB,EAAE,MAAM,CAAC;QAC9B,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAyED,wBAAsB,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC,CAyc7D"}
|
||||
+48
-17
@@ -190,14 +190,42 @@ async function getCockpitData() {
|
||||
missingInvoices: 0,
|
||||
openTasks: 0,
|
||||
pendingContracts: 0,
|
||||
reviewDue: 0,
|
||||
},
|
||||
};
|
||||
for (const contract of contracts) {
|
||||
const issues = [];
|
||||
// SNOOZE-LOGIK: Prüfen ob Snooze aktiv ist (für Fristen-Unterdrückung)
|
||||
let snoozeActive = false;
|
||||
if (contract.nextReviewDate) {
|
||||
const reviewDate = new Date(contract.nextReviewDate);
|
||||
const now = new Date();
|
||||
now.setHours(0, 0, 0, 0);
|
||||
reviewDate.setHours(0, 0, 0, 0);
|
||||
if (reviewDate > now) {
|
||||
// Snooze aktiv → NUR Fristen-Warnungen unterdrücken, andere Prüfungen laufen weiter
|
||||
snoozeActive = true;
|
||||
}
|
||||
else {
|
||||
// Snooze abgelaufen → "Erneute Prüfung fällig" Warnung
|
||||
const daysSince = Math.floor((now.getTime() - reviewDate.getTime()) / (1000 * 60 * 60 * 24));
|
||||
issues.push({
|
||||
type: 'review_due',
|
||||
label: 'Erneute Prüfung fällig',
|
||||
urgency: daysSince > 30 ? 'critical' : 'warning',
|
||||
daysRemaining: -daysSince,
|
||||
details: daysSince === 0
|
||||
? 'Heute zur Prüfung fällig'
|
||||
: `Zur Prüfung seit ${daysSince} Tagen fällig`,
|
||||
});
|
||||
summary.byCategory.reviewDue++;
|
||||
}
|
||||
}
|
||||
// Prüfen ob aktiver Folgevertrag existiert - dann keine Kündigungswarnungen nötig
|
||||
const hasActiveFollowUp = contract.followUpContract?.status === 'ACTIVE';
|
||||
// 1. KÜNDIGUNGSFRIST (nur wenn kein aktiver Folgevertrag)
|
||||
if (!hasActiveFollowUp) {
|
||||
// 1. KÜNDIGUNGSFRIST (nur wenn kein aktiver Folgevertrag UND Snooze nicht aktiv)
|
||||
// Snooze unterdrückt NUR Fristen-bezogene Warnungen!
|
||||
if (!hasActiveFollowUp && !snoozeActive) {
|
||||
const cancellationDeadline = calculateCancellationDeadline(contract.endDate, contract.cancellationPeriod?.code);
|
||||
const daysToCancellation = daysUntil(cancellationDeadline);
|
||||
if (daysToCancellation !== null && daysToCancellation <= okDays) {
|
||||
@@ -236,21 +264,24 @@ async function getCockpitData() {
|
||||
}
|
||||
}
|
||||
}
|
||||
// 2. VERTRAGSENDE
|
||||
const daysToEnd = daysUntil(contract.endDate);
|
||||
if (daysToEnd !== null && daysToEnd <= okDays) {
|
||||
const urgency = getUrgencyByDays(daysToEnd, criticalDays, warningDays, okDays);
|
||||
if (urgency !== 'none') {
|
||||
issues.push({
|
||||
type: 'contract_ending',
|
||||
label: 'Vertragsende',
|
||||
urgency,
|
||||
daysRemaining: daysToEnd,
|
||||
details: daysToEnd < 0
|
||||
? `Vertrag seit ${Math.abs(daysToEnd)} Tagen abgelaufen!`
|
||||
: `Noch ${daysToEnd} Tage bis Vertragsende`,
|
||||
});
|
||||
summary.byCategory.contractEnding++;
|
||||
// 2. VERTRAGSENDE (nur wenn Snooze nicht aktiv)
|
||||
// Snooze unterdrückt NUR Fristen-bezogene Warnungen!
|
||||
if (!snoozeActive) {
|
||||
const daysToEnd = daysUntil(contract.endDate);
|
||||
if (daysToEnd !== null && daysToEnd <= okDays) {
|
||||
const urgency = getUrgencyByDays(daysToEnd, criticalDays, warningDays, okDays);
|
||||
if (urgency !== 'none') {
|
||||
issues.push({
|
||||
type: 'contract_ending',
|
||||
label: 'Vertragsende',
|
||||
urgency,
|
||||
daysRemaining: daysToEnd,
|
||||
details: daysToEnd < 0
|
||||
? `Vertrag seit ${Math.abs(daysToEnd)} Tagen abgelaufen!`
|
||||
: `Noch ${daysToEnd} Tage bis Vertragsende`,
|
||||
});
|
||||
summary.byCategory.contractEnding++;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 3. FEHLENDE PORTAL-ZUGANGSDATEN
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
@@ -196,6 +196,7 @@ export declare function getCustomerById(id: number): Promise<({
|
||||
wasSpecialCancellation: boolean;
|
||||
portalUsername: string | null;
|
||||
stressfreiEmailId: number | null;
|
||||
nextReviewDate: Date | null;
|
||||
})[];
|
||||
} & {
|
||||
id: number;
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user