| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989 |
- export interface ParsePointer {
- __type: 'Pointer';
- className: string;
- objectId: string;
- }
- export interface AdminIdentity {
- passwordResetRequired?: boolean;
- objectId: string;
- username: string;
- displayName: string;
- company?: ParsePointer;
- roles: string[];
- isSuperAdmin: boolean;
- operationsRole: OperationsRole;
- }
- export interface AdminSession {
- passwordResetRequired?: boolean;
- objectId: string;
- username: string;
- sessionToken: string;
- company?: ParsePointer;
- displayName?: string;
- roles?: string[];
- isSuperAdmin?: boolean;
- operationsRole?: OperationsRole;
- }
- export type OperationsRole = 'ops-manager' | 'ops-staff' | 'ops-auditor';
- export interface CloudEnvelope<T> {
- success: boolean;
- data: T;
- error?: string;
- message?: string;
- }
- export interface LegacyCloudEnvelope<T> {
- retcode: number;
- retmsg?: string;
- result: T;
- }
- export interface AppMigrationStatus {
- implemented: string[];
- blocked: Record<string, string>;
- }
- export interface AdminResourceCatalogItem {
- className: string;
- label: string;
- writable: boolean;
- route: string;
- }
- export interface AdminResourceCatalog {
- total: number;
- resources: AdminResourceCatalogItem[];
- }
- export interface AdminFieldSchema {
- name: string;
- type: string;
- targetClass?: string;
- required?: boolean;
- writable: boolean;
- }
- export interface AdminClassSchema {
- className: string;
- label: string;
- fields: AdminFieldSchema[];
- writable: boolean;
- creatable?: boolean;
- supportsSoftDelete: boolean;
- }
- export interface ResourcePage {
- className: string;
- page: number;
- pageSize: number;
- total: number;
- results: Record<string, unknown>[];
- }
- export interface DashboardMetric {
- className: string;
- label: string;
- count: number;
- route: string;
- }
- export interface DashboardData {
- identity: AdminIdentity;
- metrics: DashboardMetric[];
- migration: {
- sourceObjects: number;
- migratedClasses: number;
- registeredRecords: number;
- cloudFunctions: number;
- };
- }
- export interface OperationsPage<T extends Record<string, unknown> = Record<string, unknown>> {
- page: number;
- pageSize: number;
- total: number;
- items: T[];
- refreshedAt?: string;
- }
- export type LegacySyncHealth = 'healthy' | 'delayed' | 'error' | 'not_configured' | 'never_synced';
- export interface LegacySyncDataset extends Record<string, unknown> {
- key: string;
- label: string;
- legacyCount: number | null;
- parseCount: number;
- difference: number | null;
- cursor: string;
- lastSuccessAt: string;
- lastAttemptAt: string;
- lagSeconds: number | null;
- health: LegacySyncHealth;
- healthLabel: string;
- pendingFailures: number;
- conflicts: number;
- checksum?: string;
- }
- export interface LegacySyncStatus {
- configured: boolean;
- bridgeReachable: boolean;
- bridgeUrl: string;
- manifestTime: string;
- serverTime: string;
- refreshedAt: string;
- overallHealth: LegacySyncHealth;
- overallHealthLabel: string;
- totalFailures: number;
- totalConflicts: number;
- datasets: LegacySyncDataset[];
- message: string;
- }
- export interface LegacySyncRunResult {
- dataset: string;
- processed: number;
- created: number;
- updated: number;
- deleted: number;
- conflicts: number;
- failures: number;
- hasMore: boolean;
- cursor: string;
- startedAt: string;
- finishedAt: string;
- pages?: number;
- }
- export interface OperationsSyncIndicator {
- state: 'synced' | 'delayed' | 'not_configured';
- label: string;
- lastSuccessAt: string;
- lagSeconds: number | null;
- }
- export interface MemberSummary {
- total: number;
- todayNew: number;
- sevenDayNew: number;
- studying: number;
- followUp: number;
- }
- export interface MemberAgentOption extends Record<string, unknown> {
- objectId: string;
- userId: number;
- displayName: string;
- }
- export interface MemberPage extends OperationsPage<OperationsUser> {
- summary: MemberSummary;
- agents: MemberAgentOption[];
- sync?: OperationsSyncIndicator;
- sourceStatus?: {
- available: boolean;
- message: string;
- total: number;
- memberCount: number;
- coachEvidenceCount: number;
- storeCount: number;
- unknownCount: number;
- refreshedAt: string;
- };
- }
- export interface MemberImportPreviewRow {
- rowNumber: number;
- displayName: string;
- nickname: string;
- mobileMasked: string;
- gender: string;
- grade: string;
- parentUserId: number;
- action: 'create' | 'resumed' | 'error';
- issues: string[];
- }
- export interface MemberImportPreview {
- batchId: string;
- fileName: string;
- expiresAt: string;
- summary: { total: number; create: number; resumed: number; error: number };
- rows: MemberImportPreviewRow[];
- }
- export interface MemberImportResult {
- batchId: string;
- total: number;
- created: number;
- resumed: number;
- items: Array<{ objectId: string; userId: number; displayName: string; mobileMasked: string; resumed: boolean }>;
- }
- export interface MemberListSort {
- field: 'registeredAt' | 'lastLoginAt' | 'lastLessonAt' | 'nextAppointmentAt' | 'remainingPeriods';
- direction: 'asc' | 'desc';
- }
- export interface OperationsDashboardMetric {
- key: string;
- label: string;
- value: number;
- hint: string;
- route: string;
- tone: 'blue' | 'green' | 'amber' | 'rose';
- }
- export type ScheduleTrendPeriod = 'week' | 'month' | 'year';
- export interface ScheduleTrendPoint {
- key: string;
- label: string;
- shortLabel: string;
- courseCount: number;
- studentCount: number;
- completedCount: number;
- isToday: boolean;
- }
- export interface ScheduleTrendData {
- period: ScheduleTrendPeriod;
- periodLabel: string;
- dateFrom: string;
- dateTo: string;
- points: ScheduleTrendPoint[];
- todayCourseCount: number;
- todayStudentCount: number;
- totalCourseCount: number;
- totalStudentCount: number;
- maxValue: number;
- refreshedAt: string;
- liveSourceAvailable: boolean;
- liveSourceMessage: string;
- }
- export interface OperationsDashboardData {
- identity: AdminIdentity;
- date: string;
- metrics: OperationsDashboardMetric[];
- alerts: { key: string; label: string; value: number; route: string }[];
- refreshedAt?: string;
- liveSourceAvailable?: boolean;
- liveSourceMessage?: string;
- scheduleTrend?: ScheduleTrendData;
- sync?: OperationsSyncIndicator;
- payroll?: {
- month: string;
- coachCount: number;
- lessonCount: number;
- payableAmount: number;
- sourceStatus: PayrollSourceStatus;
- refreshedAt: string;
- };
- }
- export interface OperationsUser extends Record<string, unknown> {
- objectId: string;
- userId: number;
- displayName: string;
- username: string;
- mobile: string;
- mobileMasked: string;
- groupId: number;
- groupName: string;
- parentUserId: number;
- parentDisplayName: string;
- periods30: number;
- periods60: number;
- trialPeriods: number;
- activeCourseCount: number;
- completedCourseCount: number;
- studyRecordCount: number;
- appointmentCount: number;
- learningStatus: 'trial' | 'studying' | 'completed' | 'not_started';
- learningStatusLabel: string;
- learningStatusReason: string;
- registeredAt: string;
- lastLoginAt: string;
- loginCount: number;
- status: 'active' | 'disabled';
- statusLabel: string;
- canRevealMobile: boolean;
- updatedAt: string;
- nickname?: string;
- lastLessonAt?: string;
- nextAppointmentAt?: string;
- riskFlags?: string[];
- identityType?: 'member';
- gender?: string;
- grade?: string;
- noteCount?: number;
- liveOnly?: boolean;
- writeReady?: boolean;
- dataSource?: 'parse' | 'legacy-live';
- readOnlyReason?: string;
- }
- export interface OperationsUserDetail extends OperationsUser {
- email: string;
- balances: {
- purse: number;
- silverCoin: number;
- userExp: number;
- userPoint: number;
- dummyPurse: number;
- credit: number;
- };
- relation: { parentUserId: number; parentDisplayName: string };
- permissions: { canManage: boolean; canEdit: boolean; canAdjustBalance: boolean; canResetPassword: boolean; canRevealMobile: boolean };
- agents: MemberAgentOption[];
- }
- export type LearningReportStatus = 'available' | 'incomplete' | 'missing' | 'historical';
- export interface LearningReportSummary extends Record<string, unknown> {
- reportCount: number;
- studentCount: number;
- learnedCount: number;
- masteredCount: number;
- reviewDueCount: number;
- masteryRate: number;
- }
- export interface LearningReportSourceStatus extends Record<string, unknown> {
- state: 'synced' | 'delayed' | 'not_configured';
- label: string;
- message: string;
- lastSuccessAt: string;
- lagSeconds: number | null;
- }
- export interface LearningReportListItem extends Record<string, unknown> {
- targetId: string;
- generalId: number;
- studentObjectId: string;
- studentId: number;
- studentName: string;
- studentMobileMasked: string;
- coachId: number;
- coachName: string;
- courseId: number;
- courseName: string;
- appointmentId: number;
- appointmentAt: string;
- studyAt: string;
- studyDate: string;
- classTypeLabel: string;
- learnedCount: number;
- masteredCount: number;
- reviewDueCount: number;
- unmarkedCount: number;
- masteryRate: number;
- status: LearningReportStatus;
- statusLabel: string;
- canExport: boolean;
- updatedAt: string;
- }
- export interface LearningReportWord extends Record<string, unknown> {
- index: number;
- generalId: number;
- word: string;
- phonetic: string;
- meaning: string;
- example: string;
- result: 'mastered' | 'review' | 'unmarked';
- resultLabel: string;
- }
- export interface LearningReportDetail extends LearningReportListItem {
- words: LearningReportWord[];
- reviewSchedule: Array<{ day: number; date: string }>;
- score: number;
- studentComment: string;
- coachComment: string;
- generatedAt: string;
- sourceStatus: LearningReportSourceStatus;
- countMismatch: boolean;
- }
- export interface LearningReportPage extends OperationsPage<LearningReportListItem> {
- summary: LearningReportSummary;
- sourceStatus: LearningReportSourceStatus;
- }
- export interface CoachSummary extends Record<string, unknown> {
- objectId: string;
- userId: number;
- username: string;
- displayName: string;
- mobile: string;
- mobileMasked: string;
- parentUserId: number;
- storeName: string;
- status: 'active' | 'disabled';
- statusLabel: string;
- todayAppointments: number;
- pendingAppointments: number;
- totalAppointments: number;
- lastAppointmentAt: string;
- nextAppointmentAt?: string;
- monthLessons: number;
- monthHours: number;
- estimatedPay: number;
- averageScore: number;
- lastLessonAt: string;
- availabilityConfigured: boolean;
- updatedAt: string;
- source?: 'hybrid' | 'legacy-live';
- sourceLabel?: string;
- readOnly?: boolean;
- registeredAt?: string;
- hasCurrentBusiness?: boolean;
- }
- export interface CoachPageSummary extends Record<string, unknown> {
- total: number;
- active: number;
- disabled: number;
- monthActive: number;
- liveOnly: number;
- }
- export interface StoreSummary extends Record<string, unknown> {
- objectId: string;
- userId: number;
- username: string;
- storeName: string;
- contactName: string;
- mobile: string;
- mobileMasked: string;
- parentStoreId: number;
- parentStoreName: string;
- memberCount: number;
- activeStudyingMemberCount?: number;
- coachCount: number;
- todayAppointments: number;
- totalAppointments: number;
- lastAppointmentAt: string;
- registeredAt: string;
- lastLoginAt: string;
- loginCount: number;
- status: 'active' | 'disabled';
- statusLabel: string;
- updatedAt: string;
- source?: 'parse' | 'hybrid' | 'legacy-live';
- sourceLabel?: string;
- readOnly?: boolean;
- }
- export interface StoreOption extends Record<string, unknown> {
- objectId: string;
- userId: number;
- displayName: string;
- }
- export interface StorePage extends OperationsPage<StoreSummary> {
- canManage: boolean;
- activeStudyingMemberCountError?: string;
- summary: {
- total: number;
- active: number;
- disabled: number;
- members: number;
- coaches: number;
- todayAppointments: number;
- liveOnly?: number;
- };
- parents: StoreOption[];
- liveSourceAvailable?: boolean;
- liveSourceMessage?: string;
- legacyStoreCount?: number;
- sync?: OperationsSyncIndicator;
- }
- export interface StoreCourseSummary extends Record<string, unknown> {
- courseId: number;
- courseName: string;
- appointmentCount: number;
- completedCount: number;
- studentCount: number;
- completionRate: number;
- lastAppointmentAt: string;
- }
- export interface StoreDetailData extends Record<string, unknown> {
- store: StoreSummary;
- month: string;
- summary: {
- memberCount: number;
- coachCount: number;
- monthAppointments: number;
- completedAppointments: number;
- activeStudents: number;
- lessonCount: number;
- totalHours: number;
- estimatedCoachPay: number;
- };
- members: OperationsUser[];
- coaches: CoachSummary[];
- appointments: ScheduleAppointment[];
- courses: StoreCourseSummary[];
- commissionStatus: {
- available: boolean;
- message: string;
- };
- payrollSourceStatus: PayrollSourceStatus;
- refreshedAt: string;
- sync?: OperationsSyncIndicator;
- }
- export interface CoachStoreOption extends Record<string, unknown> {
- objectId: string;
- userId: number;
- displayName: string;
- }
- export interface CoachPage extends OperationsPage<CoachSummary> {
- summary: CoachPageSummary;
- canManage: boolean;
- stores: CoachStoreOption[];
- liveSourceAvailable?: boolean;
- liveSourceMessage?: string;
- liveSourceCount?: number;
- dataDateFrom?: string;
- dataDateTo?: string;
- payrollMonth?: string;
- payrollSourceStatus?: PayrollSourceStatus;
- payrollRefreshedAt?: string;
- sync?: OperationsSyncIndicator;
- }
- export interface ScheduleAppointment extends Record<string, unknown> {
- bindingId?: string;
- sourceKey?: string;
- statusUnverified?: boolean;
- targetId: string;
- generalId: number;
- studentObjectId: string;
- studentId: number;
- studentName: string;
- coachObjectId: string;
- coachId: number;
- coachName: string;
- courseId: number;
- courseName: string;
- classType: number;
- classTypeLabel: string;
- deliveryMethod: string;
- courseCategoryKey?: string;
- courseCategoryName?: string;
- durationMinutes?: number;
- deliveryMode?: TeachingDeliveryMode;
- teachingRuleId?: string;
- teacherPaySnapshot?: number;
- creditCostsSnapshot?: TeachingCreditCost[];
- creditHoldStatus?: string;
- creditHoldReason?: string;
- startsAt: string;
- endsAt: string;
- statusCode: number;
- statusLabel: string;
- cancelled: boolean;
- cancellationReason: string;
- coachAccountMissing: boolean;
- availabilityWarning: boolean;
- source: 'parse' | 'legacy-live';
- sourceLabel: string;
- readOnly: boolean;
- updatedAt: string;
- }
- export interface ScheduleCalendarData {
- source?: string;
- workflowIssues?: Array<{appointmentGeneralId:string;message:string;targetId:string;updatedAt:string}>;
- dateFrom: string;
- dateTo: string;
- refreshedAt: string;
- sourceRefreshedAt?: string;
- totalAppointments: number;
- dataDateFrom: string;
- dataDateTo: string;
- liveSourceAvailable: boolean;
- liveSourceMessage: string;
- liveSourceCount: number;
- coaches: CoachSummary[];
- appointments: ScheduleAppointment[];
- unassigned: ScheduleAppointment[];
- members: Array<{ objectId: string; userId: number; displayName: string; mobileMasked: string; periods30: number; periods60: number; trialPeriods: number; userPoint: number; learningStatusLabel: string; liveOnly?: boolean; writeReady?: boolean; readOnly?: boolean; readOnlyReason?: string }>;
- courses: Array<{ bindingId?: string; courseId: number; courseName: string; memberIds: number[]; availableToAll?: boolean; stageKey?: TeachingStageKey | ''; stageName?: string; categoryKey?: string; categoryName?: string; mappingConfirmed?: boolean; suggestedCategoryName?: string; supportedDurations?: number[] }>;
- sync?: OperationsSyncIndicator;
- }
- export interface CoachAvailability extends Record<string, unknown> {
- objectId: string;
- coachId: number;
- ruleType: 'weekly' | 'date';
- weekday: number;
- date: string;
- startTime: string;
- endTime: string;
- available: boolean;
- reason: string;
- updatedAt: string;
- }
- export interface CoachDetailData {
- coach: CoachSummary;
- profile: {
- username: string;
- mobile: string;
- storeName: string;
- statusLabel: string;
- sourceLabel: string;
- };
- currentPayroll: PayrollCoachSummary;
- availability: CoachAvailability[];
- appointments: ScheduleAppointment[];
- lessons: PayrollLine[];
- reviews: PayrollLine[];
- payrolls: PayrollSummary[];
- reviewTaskCount: number;
- payrollMonth: string;
- payrollSourceStatus: PayrollSourceStatus;
- refreshedAt: string;
- dataDateFrom: string;
- dataDateTo: string;
- }
- export interface PayRate extends Record<string, unknown> {
- objectId: string;
- classType: number;
- classTypeLabel: string;
- amount: number;
- durationHours: number;
- effectiveFrom: string;
- active: boolean;
- isDefault?: boolean;
- updatedAt: string;
- }
- export type TeachingDeliveryMode = 'online' | 'offline';
- export type TeachingCreditAccount = 'Purse' | 'SilverCoin' | 'UserExp' | 'UserPoint';
- export type TeachingStageKey = 'primary' | 'middle' | 'high' | 'other';
- export interface TeachingCourseCategory extends Record<string, unknown> {
- objectId: string;
- key: string;
- name: string;
- sortOrder: number;
- active: boolean;
- system: boolean;
- updatedAt: string;
- }
- export interface TeachingCreditCost extends Record<string, unknown> {
- account: TeachingCreditAccount;
- label: string;
- amount: number;
- }
- export interface TeachingRule extends Record<string, unknown> {
- objectId: string;
- categoryKey: string;
- categoryName: string;
- durationMinutes: number;
- deliveryMode: TeachingDeliveryMode;
- deliveryLabel: string;
- teacherPay: number;
- creditCosts: TeachingCreditCost[];
- effectiveFrom: string;
- active: boolean;
- isDefault?: boolean;
- updatedAt: string;
- }
- export interface CourseTeachingMapping extends Record<string, unknown> {
- objectId: string;
- courseId: number;
- courseName: string;
- stageKey: TeachingStageKey | '';
- stageName: string;
- categoryKey: string;
- categoryName: string;
- suggestedCategoryKey: string;
- suggestedCategoryName: string;
- categoryConfirmed: boolean;
- stageConfirmed: boolean;
- confirmed: boolean;
- updatedAt: string;
- }
- export interface TeachingStandardsData {
- categories: TeachingCourseCategory[];
- rules: TeachingRule[];
- mappings: CourseTeachingMapping[];
- summary: {
- courseCount: number;
- confirmedCount: number;
- unmappedCount: number;
- activeRuleCount: number;
- };
- refreshedAt: string;
- }
- export interface CreditReservationReconciliation {
- items: Array<{
- appointmentId: string;
- appointmentGeneralId: number;
- studentId: number;
- studentName: string;
- courseId: number;
- courseName: string;
- startsAt: string;
- categoryName: string;
- durationMinutes: number;
- deliveryLabel: string;
- creditCosts: TeachingCreditCost[];
- status: 'ready' | 'insufficient' | 'unmapped' | 'missing_rule' | 'missing_student';
- statusLabel: string;
- reason: string;
- }>;
- summary: {
- total: number;
- ready: number;
- insufficient: number;
- exceptions: number;
- };
- refreshedAt: string;
- }
- export type PayrollStatus = 'draft' | 'reviewed' | 'paid';
- export interface PayrollSummary extends Record<string, unknown> {
- version?: number;
- objectId: string;
- month: string;
- status: PayrollStatus;
- statusLabel: string;
- coachCount: number;
- lessonCount: number;
- totalHours: number;
- baseAmount: number;
- reviewCount?: number;
- reviewAmount?: number;
- adjustmentAmount: number;
- payableAmount: number;
- exceptionCount: number;
- type4Count?: number;
- reviewedAt: string;
- paidAt: string;
- paymentMethod: string;
- paymentReference: string;
- updatedAt: string;
- }
- export interface PayrollLine extends Record<string, unknown> {
- objectId: string;
- kind: 'lesson' | 'adjustment' | 'review_reward';
- reviewRewardId?: string;
- reviewTaskId?: string;
- plannedDate?: string;
- coachId: number;
- coachName: string;
- coachObjectId?: string;
- storeId: number;
- storeName: string;
- studentName: string;
- courseName: string;
- legacyGeneralId: number;
- lessonId: string;
- lessonAt: string;
- originalMonth: string;
- settlementMonth: string;
- classType: number;
- classTypeLabel: string;
- courseCategoryKey?: string;
- courseCategoryName?: string;
- deliveryMode?: TeachingDeliveryMode | '';
- deliveryLabel?: string;
- durationMinutes?: number;
- teachingRuleId?: string;
- durationHours: number;
- rateAmount: number;
- amount: number;
- score?: number;
- comment?: string;
- description: string;
- exception: string;
- excluded?: boolean;
- exclusionReason?: string;
- }
- export interface PayrollDetail extends PayrollSummary {
- lines: PayrollLine[];
- exceptions: PayrollLine[];
- coachItems?: PayrollCoachSummary[];
- sourceStatus?: PayrollSourceStatus;
- refreshedAt?: string;
- }
- export interface PayrollCoachSummary extends Record<string, unknown> {
- coachId: number;
- coachName: string;
- coachObjectId?: string;
- storeId: number;
- storeName: string;
- type30Count: number;
- type60Count: number;
- trialCount: number;
- type4Count: number;
- lessonCount: number;
- totalHours: number;
- baseAmount: number;
- reviewCount?: number;
- reviewAmount?: number;
- adjustmentAmount: number;
- payableAmount: number;
- averageScore?: number;
- latestLessonAt: string;
- }
- export interface PayrollSourceStatus extends Record<string, unknown> {
- available: boolean;
- mode: 'live' | 'cache' | 'parse';
- message: string;
- total: number;
- refreshedAt: string;
- sync?: {
- state: 'not_configured' | 'synced' | 'delayed' | 'inconsistent' | 'error' | 'batch_verified';
- settlementReady: boolean; message: string; checkedAt: string;
- lastSuccessAt: string; lagSeconds: number | null;
- datasets: Array<{ key: string; state: string; lastSuccessAt: string; lagSeconds: number | null; pendingFailures: number; conflicts: number; legacyCount: number | null; localCount: number | null; complete?: boolean }>;
- };
- }
- export interface PayrollOverview extends PayrollDetail {
- incomeAmount?: number; settlementAmount?: number | null; settlementAdjustmentAmount?: number; settlementCarryAmount?: number;
- coachItems: PayrollCoachSummary[];
- sourceStatus: PayrollSourceStatus;
- batches: PayrollSummary[];
- stores: Array<{ storeId: number; storeName: string }>;
- }
- export interface PayrollExportData extends Record<string, unknown> {
- excluded?: PayrollLine[];
- fileName: string;
- summary: PayrollSummary;
- coachItems: PayrollCoachSummary[];
- lines: PayrollLine[];
- exceptions: PayrollLine[];
- }
- export interface VocabularyNode extends Record<string, unknown> {
- objectId: string;
- nodeId: number;
- name: string;
- parentId: number;
- depth: number;
- orderId: number;
- directWordCount: number;
- wordCount: number;
- childCount: number;
- status: number;
- canContainWords: boolean;
- }
- export interface VocabularyWord extends Record<string, unknown> {
- targetId: string;
- generalId: number;
- itemId: number;
- word: string;
- meaning: string;
- phonetic: string;
- example: string;
- audioUrl: string;
- nodeId: number;
- unitName: string;
- bookName: string;
- stageName: string;
- orderId: number;
- status: number;
- statusLabel: string;
- createdAt: string;
- updatedAt: string;
- }
- export interface VocabularyTree {
- items: VocabularyNode[];
- total: number;
- totalWords: number;
- refreshedAt: string;
- }
- export interface VocabularyImportPreview {
- batchId: string;
- status: string;
- summary: { total: number; create: number; update: number; unchanged: number; duplicate: number; error: number; missingMedia: number };
- items: Array<Record<string, unknown>>;
- createdAt: string;
- }
- export interface SpecialTrainingItem extends Record<string, unknown> {
- targetId: string;
- generalId: number;
- itemId: number;
- title: string;
- synopsis: string;
- coverUrl: string;
- tags: string[];
- contentHtml: string;
- videoUrl: string;
- author: string;
- source: string;
- orderId: number;
- hits: number;
- status: number;
- statusLabel: string;
- createdAt: string;
- updatedAt: string;
- }
- export interface SpecialTrainingPage extends OperationsPage<SpecialTrainingItem> {
- sourceStatus?: {
- available: boolean;
- message: string;
- legacyTotal: number;
- created: number;
- updated: number;
- refreshedAt: string;
- } | null;
- }
- export interface MediaUploadTicket {
- ticketId: string;
- method: 'PUT';
- uploadUrl: string;
- publicUrl: string;
- objectKey: string;
- headers: Record<string, string>;
- expiresAt: string;
- }
- export interface ReviewReward {
- objectId: string; taskId: string; coachId: number; coachName: string; studentName: string;
- courseName: string; storeId: number; storeName: string; plannedDate: string; completedAt: string;
- incomeMonth: string; amount: number; status: 'earned' | 'historical' | 'exception';
- statusLabel: string; exception: string; batchId?: string; settlementMonth?: string;
- canConfirm?: boolean;
- }
- export interface ReviewRewardPage {
- snapshot?: string; nextCursor?: string;
- items: ReviewReward[]; total: number; page: number; pageSize: number;
- summary: { reviewCount: number; reviewAmount: number; historicalCount: number; exceptionCount: number };
- }
- export interface ReviewRewardFilters { month: string; storeId: number; search: string; coachId: number; revision?: number; resetRevision?: number; snapshot?: string; afterId?: string; exportMode?: boolean; }
|