teacher-earnings-transform.mjs 1.9 KB

123456789
  1. import ts from 'typescript';
  2. // Copy pure calculator declarations from the authoritative operations bundle at build time.
  3. // Both gateways therefore execute the same historical rules, precedence and rounding.
  4. export function teacherEarningsSupport(operationsCode, integrityCode) {
  5. const pick=(code,names)=>{const file=ts.createSourceFile('gateway.js',code,ts.ScriptTarget.Latest,true,ts.ScriptKind.JS);return names.map(name=>{const node=file.statements.find(n=>ts.isFunctionDeclaration(n)&&n.name?.text===name);if(!node)throw Error('缺少工资共享函数 '+name);return node.getText(file);}).join('\n');};
  6. const start=operationsCode.indexOf('const TEACHING_STAGE_DEFAULTS='),end=operationsCode.indexOf('async function teachingCategoryRows(',start);
  7. if(start<0||end<start)throw Error('缺少工资默认规则');
  8. return '\nfunction teacherEarningsCalculator(){\nfunction text(v){return String(v==null?"":v).trim();}\nfunction number(v,f=0){const n=Number(v);return Number.isFinite(n)?n:f;}\n'+operationsCode.slice(start,end)+'\n'+pick(operationsCode,['classType','durationMinutes','durationHours','defaultPayRates','rateFor','teachingRuleFor','payrollLessonAt','payrollSourceProjection','dateIso','teachingRuleProjection','teachingStageFromDatabase','courseStageFromDatabase','categoryMatchesStage','isWritingCourse'])+'\n'+pick(integrityCode,['payrollDateIso','payrollBusinessDate','payrollIdentity','payrollCalculatedLine'])+'\nreturn {project:payrollSourceProjection,calculate:payrollCalculatedLine,defaultRules:defaultTeachingRules,defaultRates:defaultPayRates,rule: r=>teachingRuleProjection(r,TEACHING_CATEGORY_LABELS),category: (r)=>{const stage=courseStageFromDatabase(r.ancestor_names);return r.confirmed===true&&TEACHING_CATEGORY_LABELS.has(r.categoryKey)&&categoryMatchesStage(r.categoryKey,stage.key)&&(!isWritingCourse(r.courseName)||Boolean(stage.key&&stage.name));}};\n}\n';
  9. }