import { PrismaService } from "../../../core/database/prisma/prisma.service";
import { DingtalkAttendanceService } from './sdk/dingtalk-attendance.service';
import { DingtalkHrmService } from './sdk/dingtalk-hrm.service';
import { DingtalkYidaService } from './sdk/dingtalk-yida.service';
export type AnnualLeaveQuotaItem = {
    userId: string;
    name: string;
    employeeNumber: string;
    status: string;
    leaveType: string;
    leaveCode: string;
    quotaCycle: string;
    totalDays: number;
    usedDays: number;
    remainingDays: number;
    startTime: string | null;
    endTime: string | null;
    localPlanTotalDays?: number | null;
    localPlanNotCountDays?: number | null;
    localPlanReleasedByToday?: number | null;
};
export type EmployeeStatusInfo = {
    userId: string;
    periodCount: number;
    hasActiveSuspension: boolean;
    hasAnySuspension: boolean;
};
export type AnnualLeaveReleasePlanItem = {
    date: string;
    userId: string;
    name: string;
    employeeNumber: string;
    status: string;
    days: number;
    released: boolean;
    year: string;
    hasPlan: boolean;
    noPlanReason?: string | null;
};
export type AnnualLeaveQuotaOverview = {
    lastSyncedAt: string | null;
    summary: {
        employeeCount: number;
        leaveTypeCount: number;
        nonZeroQuotaCount: number;
    };
    allLeaveTypes: {
        leaveCode: string;
        leaveType: string;
        hasQuota: boolean;
    }[];
    allEmployees: {
        userId: string;
        name: string;
        employeeNumber: string;
    }[];
    employeeStatuses: EmployeeStatusInfo[];
    items: AnnualLeaveQuotaItem[];
};
export type AnnualLeaveQuotaRefreshResult = {
    employeeCount: number;
    recordCount: number;
    leaveTypeCount: number;
    lastSyncedAt: string;
};
export type AnnualLeaveQuotaUsageRecord = {
    date: string | null;
    startTime: string | null;
    endTime: string | null;
    days: number;
    status: string;
    recordType: string;
    operationDate: string | null;
};
export type AnnualLeaveQuotaReleaseRecord = {
    date: string;
    days: number;
    released: boolean;
    year: string;
};
export type AnnualLeaveQuotaDetail = {
    userId: string;
    name: string;
    employeeNumber: string;
    leaveType: string;
    leaveCode: string;
    quotaCycle: string;
    totalDays: number;
    usedDays: number;
    remainingDays: number;
    startTime: string | null;
    endTime: string | null;
    usageRecords: AnnualLeaveQuotaUsageRecord[];
    releaseRecords: AnnualLeaveQuotaReleaseRecord[];
    localPlanTotalDays: number | null;
    localPlanNotCountDays: number | null;
    localPlanAdjustmentDays: number | null;
    localPlanReleasedByToday: number | null;
    tenureDays: number;
    workStartDate: string | null;
    employmentPeriods: Array<{
        periodIndex: number;
        joinDate: string;
        leaveDate: string | null;
        countInTenure: boolean;
        note: string;
    }>;
    suspensionPeriods: Array<{
        startDate: string;
        endDate: string | null;
        reason: string;
        note: string;
    }>;
};
export declare class AnnualLeaveInsightService {
    private prisma;
    private attendanceService;
    private hrmService;
    private yidaService;
    constructor(prisma: PrismaService, attendanceService: DingtalkAttendanceService, hrmService: DingtalkHrmService, yidaService: DingtalkYidaService);
    refreshLeaveTypes(): Promise<{
        count: number;
        leaveTypes: Array<{
            leave_code: string;
            leave_name: string;
        }>;
    }>;
    refreshQuotaSnapshot(params?: {
        userId?: string;
    }): Promise<AnnualLeaveQuotaRefreshResult>;
    getQuotaOverview(params?: {
        userId?: string;
        keyword?: string;
        hideZero?: boolean;
        includeAllStatuses?: boolean;
    }): Promise<AnnualLeaveQuotaOverview>;
    getQuotaDetail(params: {
        userId: string;
        leaveCode: string;
    }): Promise<AnnualLeaveQuotaDetail | null>;
    getReleasePlan(params?: {
        year?: number;
        userId?: string;
        keyword?: string;
        upcomingOnly?: boolean;
    }): Promise<{
        summary: {
            employeeCount: number;
            planCount: number;
            upcomingDays: number;
            todayReleaseEmployeeCount: number;
        };
        items: AnnualLeaveReleasePlanItem[];
    }>;
    private loadEmployees;
    private loadLocalAnnualLeavePlans;
    private loadEmployeeStatuses;
    private loadReleaseRecords;
    private getReleaseScheduleEntries;
    private resolveNoPlanReason;
    private getFieldValue;
    private normalizeQuotaNumber;
    private normalizeStoredNumber;
    private mapUsageRecord;
    private parseTimestampToDate;
    private formatDate;
    private parseDateOnly;
    private formatUnknownDateTime;
    private matchesKeyword;
}
