// Presentation layout carried forward from the August revised workbook. // Calculated September records and settlement eligibility are not changed here. export function applyAugustLayout(x){ const {w,d,meta,mainRules,monthly,oldSum,sumSheet:modern,ledger,calc,track,personal,detail,previews,put,head,table,widths,col,pay,L,money}=x; const n=d.ledger.length+1,gs=d.groups,rr=d.records.length+1; const grid=(s,r)=>s.getRange(r).format.borders={preset:'all',style:'thin',color:'#000000'}; const bold=(s,r,n=3)=>s.getRange(`A${r}:${col(n)}${r}`).format.font={name:'宋体',size:11,bold:true,color:'#000000'}; const current=new Map(d.records.map(r=>[r['车牌号']+'|'+r['销售经理'],r])); const rec=g=>current.get(g.plate+'|'+g.sales)||meta.last_records[g.plate+'|'+g.sales]||{}; const deps=p=>[...new Set(gs.filter(g=>g.sales===p).map(g=>g.department))].join('、'); const clean=s=>s.getUsedRange().clear({applyTo:'all'}); const cats=['结转','当月','累计补发9月',...Array.from({length:8},(_,i)=>`补发${8-i}月`)]; table(mainRules,['考核目标','月度目标里程(km)','当月达标','当月未达标','结转','补发/累计补发'],[ ['交投40辆4.5T普货',3000,150],['交投190辆4.5T冷链车',3000,150],['羚牛136辆4.5T冷链车',5000,260],['恒运50辆4.5T普货',5000,260],['羚牛100辆18T',6000,1000] ].map(([a,b,c])=>[a,b,`${c}元×天数折算`,'不发',`${c}元整月`,`${c}元×折算`]),{A:38,B:18,C:22,D:20,E:20,F:24}); head(mainRules,9,['名单对应考核目标','月目标不变','名单当月奖励','未达标','名单结转','9月补发基准']); [['交投40辆4.5T普货',3000,150],['交投190辆4.5T冷链车',3000,150],['羚牛136辆4.5T冷链车',5000,300],['恒运50辆4.5T普货',5000,300],['羚牛100辆18T',6000,150]].forEach(([a,b,c],i)=>put(mainRules,10+i,[a,b,`${c}元×天数折算`,'不发',`${c}元整月`,`${c}元×折算`]));grid(mainRules,'A9:F14'); mainRules.mergeCells('A16:F18');put(mainRules,16,['沿用8月原始39辆名单,本月匹配36辆;名单外沿用原金额。折算、结转、补发规则不变,历史月补发仍使用历史基准。亏损暂不处理。']);mainRules.getRange('A16:F18').format.wrapText=true; mainRules.mergeCells('A20:F22');put(mainRules,20,['8月实际已发45,065.47元锁定。9月沿用8月逐日取数,交接日计前段。缺少所需来源的车辆日保留缺口,按已有里程累计;补数后重新核算。具体口径及完整名单见“规则与名单”。']);mainRules.getRange('A20:F22').format.wrapText=true; head(mainRules,24,['名单车牌','考核源表行','9月月奖励(元)','业务员','部门','考核目标']); const matched=d.records.filter(r=>r['新政策']);matched.forEach((r,i)=>put(mainRules,25+i,[r['车牌号'],r['源表行'],r['月奖励'],r['销售经理'],r['部门名称'],r['考核目标']]));grid(mainRules,`A24:F${24+matched.length}`);mainRules.getRange(`A25:F${24+matched.length}`).format.rowHeight=34;mainRules.getRange(`F25:F${24+matched.length}`).format.wrapText=true; table(monthly,['车牌号','部门名称','销售经理','客户名称','合同编号','考核目标','月度目标里程','月奖励金额','考核天数','9月应考核里程','9月实际行驶里程','完成率','9月是否达标','9月奖金(天数折算)','多跑里程','可结转月数','考核状态','源表行','取数方式','新政策','考核开始日期','考核结束日期','说明','缺口天数'],d.records.map(r=>[r['车牌号'],r['部门名称'],r['销售经理'],r['客户名称'],r['合同编号'],r['考核目标'],r['月度目标里程'],r['月奖励'],r['考核天数'],null,null,null,null,null,r['多跑'],r['可结转'],r['考核状态'],r['源表行'],r['取数方式'],r['新政策']?'是':'否',new Date(r['考核开始日期'].slice(0,10)+'T00:00:00Z'),new Date(r['考核结束日期'].slice(0,10)+'T00:00:00Z'),r['缺口天数']?'仅累计已有数据,缺失不代表实际零里程;补数后重算。':'数据齐全',r['缺口天数']]),{A:16,B:14,C:12,D:34,E:28,F:26,G:16,H:14,I:12,J:18,K:18,L:12,M:22,N:20,O:16,P:14,Q:14,R:10,S:25,T:12,U:16,V:16,W:65,X:14},['H','J','K','N','O']); monthly.getRange(`J2:N${rr}`).formulas=d.records.map((r,i)=>{const j=i+2;return[`='业务考核视图'!N${j}`,`='业务考核视图'!O${j}`,`=K${j}/J${j}`,`='业务考核视图'!Q${j}`,`=IF(K${j}>=J${j},ROUND(H${j}*I${j}/'规则与名单'!$B$3,2),0)`];});monthly.getRange(`L2:L${rr}`).setNumberFormat('0.00%');monthly.getRange(`U2:V${rr}`).setNumberFormat('yyyy-mm-dd'); clean(ledger); table(ledger,['车牌号','业务员','部门','客户名称','发放类型','对应考核月','考核应发','客户盈亏','不发/扣减','实发金额','奖励基准','折算分子','折算分母','原发放编号','说明','本月缺口天数','8月缺口天数','本月无考核记录'],d.ledger.map(l=>[l.plate,l.sales,l.department,rec(l)['客户名称']||meta.vehicles[l.plate]?.[7]||'',l.category,l.assessment_month,null,'暂不处理',0,null,l.base,l.days,l.month_days,l.id,l.status,l.gap_days,l.history_gap_days,l.virtual?'是':'否']),{A:16,B:12,C:16,D:34,E:22,F:14,G:16,H:16,I:14,J:16,K:14,L:14,M:14,N:14,O:36,P:18,Q:18,R:22},['G','I','J','K']); ledger.getRange(`G2:G${n}`).formulas=d.ledger.map((_,i)=>[`=ROUND(K${i+2}*L${i+2}/M${i+2},2)`]);ledger.getRange(`J2:J${n}`).formulas=d.ledger.map((_,i)=>[`=G${i+2}-I${i+2}`]);ledger.getRange(`F2:F${n}`).setNumberFormat('0"月"');put(ledger,n+1,['合计']);for(const c of ['G','I','J'])ledger.getRange(`${c}${n+1}`).formulas=[[`=SUM(${c}2:${c}${n})`]];bold(ledger,n+1,18);ledger.getRange(`G${n+1}:K${n+1}`).setNumberFormat(money); ledger.mergeCells(`A${n+3}:O${n+4}`);put(ledger,n+3,['考核应发(G)−不发/扣减(I)=实发金额(J)。本表金额按现有里程核算,存在缺口,补齐后重算;亏损暂不处理。']);ledger.getRange(`A${n+3}:O${n+4}`).format={wrapText:true,font:{name:'宋体',size:10,color:'#C00000'}}; clean(calc); table(calc,['车牌号','销售经理','部门','9月记录数','9月总天数','9月应考核','9月实际','9月有达标','9月奖金','累计应考核','累计实际','累计达标','可结转',...cats.map(c=>c==='当月'?'当月奖金':c==='结转'?'结转发放':c),'9月发放合计','无本月考核记录','9月缺口天数','8月缺口天数','上期可用结转'],gs.map(g=>{const rs=d.records.filter(r=>r['车牌号']===g.plate&&r['销售经理']===g.sales);return[g.plate,g.sales,g.department,rs.length,g.days,g.target,g.actual,g.qualified?'是':'否',rs.reduce((a,r)=>a+r['奖金'],0),g.cum_target,g.cum_actual,g.cum_qualified?'达标':'已有里程未达标',g.carry_left,...cats.map(()=>null),null,g.virtual?'是':'否',g.gap_days,g.history_gap_days,g.previous_carry];}),{A:16,B:12,C:16,D:14,E:14,F:18,G:18,H:14,I:16,J:18,K:18,L:22,M:12,Y:18,Z:22,AA:18,AB:18,AC:18},['F','G','I','J','K',...Array.from({length:12},(_,i)=>col(i+14))]); calc.getRange(`N2:X${gs.length+1}`).formulas=gs.map((g,i)=>cats.map(c=>`=${pay(`B${i+2}`,`A${i+2}`,c)}`));calc.getRange(`Y2:Y${gs.length+1}`).formulas=gs.map((g,i)=>[`=SUM(N${i+2}:X${i+2})`]); clean(track); table(track,['车牌号','车架号','归属公司','车型','考核目标','月度奖励','业务员',...Array.from({length:9},(_,i)=>[`${i+1}月应考核`,`${i+1}月实际`,`${i+1}月达标`]).flat(),'累计应完成','累计实际','累计达标','客户名称','客户是否亏损','考核应发','最终发放','未发放原因','本月无考核记录','9月缺口天数'],gs.map(g=>{const r=rec(g),v=meta.vehicles[g.plate]||[];return[g.plate,v[1]||'',v[2]||'',v[3]||'',r['考核目标']||v[4]||'',g.reward,g.sales,...g.history.flatMap(([t,a],i)=>[t,a,t===null?'':i===8&&g.gap_days>0&&a=t?'✓':'✗']),g.cum_target,g.cum_actual,g.cum_qualified?'✓':'✗',r['客户名称']||v[7]||'','暂不处理',null,null,g.total?'':g.gap_days?'已有里程不足,补数后重算':g.virtual?'本月无新增发放':'未满足本月奖励、结转或补发条件',g.virtual?'是':'否',g.gap_days];}),{A:16,B:24,C:38,D:18,E:28,F:14,G:14,AL:36,AM:18,AN:16,AO:16,AP:40,AQ:22,AR:18},['F','AI','AJ','AN','AO']); track.getRange(`AN2:AO${gs.length+1}`).formulas=gs.map((g,i)=>[`=${pay(`G${i+2}`,`A${i+2}`)}`,`=${pay(`G${i+2}`,`A${i+2}`)}`]);for(let i=0;i{put(oldSum,row++,[title]);bold(oldSum,row-1);head(oldSum,row++,['销售人员','车辆数','金额']);const start=row;for(const p of d.people.filter(p=>d.ledger.some(l=>l.sales===p&&(!cat||l.category===cat)))){put(oldSum,row,[p,null,null]);oldSum.getRange(`B${row}`).formulas=[[`=COUNTIFS(${L('B')},A${row}${cat?`,${L('E')},"${cat}"`:''})`]];oldSum.getRange(`C${row}`).formulas=[[`=${pay('A'+row,null,cat)}`]];row++;}put(oldSum,row,['总计']);for(const c of ['B','C'])oldSum.getRange(`${c}${row}`).formulas=[[`=SUM(${c}${start}:${c}${row-1})`]];grid(oldSum,`A${start}:C${row}`);bold(oldSum,row);row+=2;}; for(const c of d.categories.filter(c=>d.ledger.some(l=>l.category===c)))section('实发-'+c,c); put(oldSum,row,['考核应发合计']);oldSum.getRange(`C${row}`).formulas=[[`=SUM(${L('G')})`]];bold(oldSum,row);row+=2; put(oldSum,row++,['二、亏损处理']);bold(oldSum,row-1);put(oldSum,row++,['亏损暂不处理。']);row++; put(oldSum,row++,['三、最终发放']);bold(oldSum,row-1);row++;section('最终发放明细',null); put(oldSum,row++,['9月最终发放(按销售人员)']);bold(oldSum,row-1);head(oldSum,row++,['销售人员','部门名称','最终发放']);let start=row; for(const p of d.people){put(oldSum,row,[p,deps(p)]);oldSum.getRange(`C${row}`).formulas=[[`=${pay('A'+row)}`]];row++;}grid(oldSum,`A${start}:C${row-1}`);put(oldSum,row,['合计']);oldSum.getRange(`C${row}`).formulas=[[`=SUM(C${start}:C${row-1})`]];bold(oldSum,row);row+=2; const departments=[...new Set(gs.map(g=>g.department))].sort(); put(oldSum,row++,['9月最终发放(按部门)']);bold(oldSum,row-1);head(oldSum,row++,['部门名称','最终发放']);start=row; for(const dep of departments){put(oldSum,row,[dep]);oldSum.getRange(`B${row}`).formulas=[[`=SUMIF(${L('C')},A${row},${L('J')})`]];row++;}grid(oldSum,`A${start}:B${row-1}`);put(oldSum,row,['合计']);oldSum.getRange(`B${row}`).formulas=[[`=SUM(B${start}:B${row-1})`]];bold(oldSum,row);row+=2; put(oldSum,row++,['总览']);bold(oldSum,row-1);for(const [label,c]of [['考核应发','G'],['不发/扣减','I'],['最终发放','J']]){put(oldSum,row,[label]);oldSum.getRange(`B${row}`).formulas=[[`=SUM(${L(c)})`]];row++;}bold(oldSum,row-1);const oldTotal=`B${row-1}`;oldSum.getRange(`C1:C${row}`).setNumberFormat(money);oldSum.getRange(`B${start}:B${row}`).setNumberFormat(money);oldSum.mergeCells(`A${row+1}:C${row+3}`);put(oldSum,row+1,['以上为按现有里程核算金额。1,000个车辆日仍有缺口,补齐后重新确认达标、结转及补发。']);oldSum.getRange(`A${row+1}:C${row+3}`).format.wrapText=true; modern.showGridLines=false;modern.getRange('A1:N36').format={font:{name:'PingFang SC',size:11,color:'#183D50'},columnWidth:16,rowHeight:24};widths(modern,{A:14,B:26},36);modern.mergeCells('A1:H1');put(modern,1,['2026年9月里程绩效核算']);modern.getRange('A1:H1').format.font={size:18,bold:true};modern.getRange('A1').format.rowHeight=36; modern.mergeCells('A2:H3');put(modern,2,['8月实际已发45,065.47元锁定。按现有里程核算,金额逐项取分后汇总;缺口补齐后重算。']);modern.getRange('A2:H3').format={font:{size:10,color:'#526671'},wrapText:true};modern.mergeCells('J1:N1');modern.getRange('J1').values=[['9月核算总额(元)']];modern.getRange('J1:N1').format.font={size:12,bold:true,color:'#167D8D'};modern.mergeCells('J2:N3');modern.getRange('J2').formulas=[['=N22']];modern.getRange('J2:N3').format.font={size:26,bold:true};modern.getRange('J2').setNumberFormat(money); put(modern,5,['业务员','部门',...d.categories.map(c=>c+'(元)'),'合计(元)']);modern.getRange('A5:N5').format={fill:'#183D50',font:{color:'#FFFFFF',bold:true},rowHeight:44,wrapText:true}; d.people.forEach((p,i)=>{const r=i+6;put(modern,r,[p,deps(p)]);modern.getRange(`C${r}:M${r}`).formulas=[d.categories.map(c=>`=${pay('A'+r,null,c)}`)];modern.getRange(`N${r}`).formulas=[[`=SUM(C${r}:M${r})`]];modern.getRange(`A${r}:N${r}`).format.fill=i%2?'#FFFFFF':'#BFE5F2';}); put(modern,22,['合计']);modern.getRange('C22:N22').formulas=[Array.from({length:12},(_,i)=>`=SUM(${col(i+3)}6:${col(i+3)}21)`)];modern.getRange('A22:N22').format={fill:'#EAF3F5',font:{bold:true},rowHeight:30};modern.getRange('C6:N22').setNumberFormat(money); modern.getRange('A26:B26').values=[['部门','发放金额(元)']];modern.getRange('A26:B26').format={fill:'#183D50',font:{bold:true,color:'#FFFFFF'},rowHeight:30};departments.forEach((dep,i)=>{modern.getRange(`A${27+i}`).values=[[dep]];modern.getRange(`B${27+i}`).formulas=[[`=SUMIF(${L('C')},A${27+i},${L('J')})`]];});modern.getRange(`B27:B${26+departments.length}`).setNumberFormat(money);modern.mergeCells('A35:N36');put(modern,35,[`本月327辆、341条考核记录;1,000个车辆日缺少所需来源,涉及176辆车。按已有记录累计并单列缺口,补数后重算累计、结转及补发。`]);modern.getRange('A35:N36').format.wrapText=true;modern.freezePanes.freezeRows(5);modern.freezePanes.freezeColumns(2);modern.tables.add(`A5:N${5+d.people.length}`,true,'SeptemberModernSummary'); const personControls={}; for(const p of d.people){const s=personal[p],own=gs.filter(g=>g.sales===p);widths(s,{A:22,B:28,C:14,D:22,E:22,F:22,G:22,H:22,I:22,J:22,K:22,L:22,M:25,N:22},own.length*10+20);s.mergeCells('A1:N1');put(s,1,[`${p} | ${deps(p)} | 9月绩效对账单`]);s.getRange('A1:N1').format.font={name:'宋体',bold:true,size:14};s.getRange('A1').format.rowHeight=22;s.mergeCells('A2:D2');put(s,2,[`本月考核及结转车辆:${own.length}辆`]);bold(s,2,4);s.mergeCells('E2:G2');s.getRange('E2').values=[['本月核算合计(元)']];s.getRange('H2').formulas=[[`=${pay('"'+p+'"')}`]];s.getRange('H2').setNumberFormat(money);bold(s,2,14);head(s,4,['车牌号','考核目标','月奖励',...Array.from({length:9},(_,i)=>`${i+1}月里程/目标`),'累计里程/目标','达标']);let r=5; for(const g of own){put(s,r,[g.plate,rec(g)['考核目标']||meta.vehicles[g.plate]?.[4]||'',g.reward,...g.history.map(([t,a])=>t===null?'-':`${a.toFixed(2)}/${t.toFixed(2)}`),`${g.cum_actual.toFixed(2)}/${g.cum_target.toFixed(2)}`,g.cum_qualified?'达标':g.gap_days?'已有里程未达标':'未达标']);grid(s,`A${r}:N${r}`);s.getRange(`A${r}`).format.font={bold:true};s.getRange(`B${r}:N${r}`).format.wrapText=true;s.getRange(`A${r}:N${r}`).format.rowHeight=34;r++;head(s,r,['','发放项','金额','说明','结转余额']);s.mergeCells(`E${r}:G${r}`);r++; const items=d.ledger.filter(l=>l.plate===g.plate&&l.sales===p);for(const l of items){put(s,r,['',l.category,null,l.virtual?'历史结转,本月无考核记录':l.category==='结转'?'整月结转,不与当月奖励重复':'奖励基准×考核天数/对应月天数']);s.getRange(`C${r}`).formulas=[[`='9月奖金发放记录'!J${l.id+1}`]];s.mergeCells(`D${r}:G${r}`);grid(s,`A${r}:G${r}`);r++;} if(!items.length){put(s,r,['','本月不发',0,g.gap_days?'已有里程不足,待补数据后再判定':'未满足本月奖励、结转或补发条件']);s.mergeCells(`D${r}:G${r}`);grid(s,`A${r}:G${r}`);r++;} put(s,r,['','本月合计',null,g.gap_days?`本月缺口${g.gap_days}天,补数后重算`:'已计入个人汇总',`上期${g.previous_carry}期,本期剩余${g.carry_left}期`]);s.getRange(`C${r}`).formulas=[[`=${pay('"'+p+'"','"'+g.plate+'"')}`]];s.mergeCells(`E${r}:G${r}`);grid(s,`A${r}:G${r}`);bold(s,r,3);r+=2; }put(s,r,['合计']);s.getRange(`C${r}`).formulas=[['=H2']];bold(s,r);s.getRange(`C5:C${r}`).setNumberFormat(money);personControls[p]={sheet:s.name,total:`C${r}`}; } // Review all changed views in the same visual order as August. previews.length=0;previews.push([mainRules.name,'A1:F18'],[monthly.name,'A1:H12'],[calc.name,'A1:M12'],[track.name,'A1:G12'],[ledger.name,'A1:O12'],[oldSum.name,'A1:C19'],[oldSum.name,`A${row-7}:C${row+3}`],[modern.name,'A1:N36']);for(const s of Object.values(personal))previews.push([s.name,'A1:N13']);for(const name of ['业务考核视图','逐日取数依据','里程缺口','规则与名单','历史结算资格','8月已发台账'])previews.push([name,name==='业务考核视图'?'J1:Q12':name==='规则与名单'?'A1:B16':'A1:J12']); return {oldTotal,personControls}; }