workspace-data.js

'use strict';
window.WORKSPACE = (() => {
 const F=window.FOUNDATION;
 const styles=[
  ['静かなエディトリアル','大きな写真と余白、読み進めるレポート。'],
  ['モノクロ・レジャー','白黒の写真と罫線で、数値と一覧に集中。'],
  ['和紙と活字','温かい紙色、小さな写真、端正な縦の流れ。'],
  ['ミッドナイト・データ','濃紺の画面に明るい数値、引き締まった情報配置。'],
  ['ギャラリー・アーカイブ','横長の写真と整った資料カード。'],
  ['テラコッタ・スタジオ','赤土色のアクセントと左右の情報ブロック。'],
  ['ブループリント','淡い設計図の格子と、明快な区画。'],
  ['コラージュ・ノート','写真と見出しを組み合わせた編集的な構成。'],
  ['クリア・グラス','透明感のある淡い背景と白いデータ面。'],
  ['グリーン・ターミナル','緑の暗い画面と整列した数値、コンパクトな一覧。'],
 ].map(([name,description],i)=>({id:i+1,name,description}));
 const schemas={
  aum:[['aum','AUM','億円'],['nonRecoursePercent','ノンリコース比率','%'],['contracts','ファンド本数','本']],
  sales:[['sales','販売額','億円'],['redemption','償還額','億円'],['net','純増減','億円']],
  gp:[['retention','継続率','%'],['count','対象人数','人'],['amount','対象金額','億円']],
  marketing:[['spend','広告費','円'],['acquired','獲得人数','人'],['cpa','CPA','円']],
  plan:[['target','目標','円'],['result','実績','円'],['achievement','達成率','%']],
  kpi:[['target','目標','件'],['result','実績','件'],['achievement','達成率','%']],
  comparison:[['companyAum','比較対象AUM','億円'],['count','比較対象数','社'],['difference','差額','億円']],
  investment:[['balance','投融資残高','億円'],['contracts','案件数','件'],['rate','利回り','%']],
  treasury:[['balance','残高','円'],['inflow','入金額','円'],['outflow','出金額','円']],
  index:[['documents','資料数','件'],['checked','確認済み','件'],['pending','未確認','件']],
 };
 const docs=F.folders.standalone.map((s,i)=>({...s,title:s.name,parent:['plan','kpi','index'][i],parentTitle:['事業計画','KPI','目次'][i],department:'marketing'}));
 for(const group of F.folders.groups)for(const s of group.children)docs.push({...s,title:s.name.replace('口座開設転換率(月別','口座開設転換率(月別)'),parent:group.id,parentTitle:group.title,department:'marketing'});
 const extra=[['risk-default','デフォルトリスク'],['product-mix','商品構成把握'],['fx-risk','為替リスク']];
 for(const [id,title]of extra)docs.push({id,title,parent:'aum',parentTitle:'AUM情報',department:'marketing',proposed:true});
 for(const [department,items]of Object.entries({investment:[['loans','貸付・投融資一覧'],['investment-fx','為替の状況'],['concentration','集中度']],treasury:[['deposits','デポジット'],['cashflow','入出金'],['liquidity','資金繰り']]}))for(const[id,title]of items)docs.push({id,title,parent:department,parentTitle:department==='investment'?'投融資管理':'資金管理',department,proposed:true});
 for(const doc of docs){doc.metrics=schemas[doc.parent]||schemas.index;if(doc.id==='sheet-05')doc.metrics=[...schemas.aum,['recourse','リコース','億円'],['nonRecourse','ノンリコース','億円']];if(doc.id==='sheet-34'||doc.id==='sheet-35'||doc.id==='sheet-36')doc.metrics=[['visits','アクセス数','件'],['acquired','獲得人数','人'],['conversion','転換率','%']];if(doc.id==='sheet-38')doc.metrics=[['applications','申込数','件'],['opened','口座開設数','件'],['conversion','開設転換率','%']];if(doc.id==='sheet-37')doc.metrics=[['planned','施策数','件'],['done','完了数','件'],['progress','進捗率','%']];}
 const specific={
  'sheet-06':[['futureAum','将来AUM見込み','億円'],['expectedInflow','流入見込み','億円'],['expectedRedemption','償還見込み','億円']],
  'sheet-07':[['monthAum','月末AUM','億円'],['investors','対象人数','人'],['change','月間増減','億円']],
  'sheet-08':[['monthAum','月末AUM','億円'],['investors','対象人数','人'],['change','月間増減','億円']],
  'sheet-09':[['aum','クラス別AUM','億円'],['investors','対象人数','人'],['classes','クラス数','クラス']],
  'sheet-10':[['aum','クラス別AUM','億円'],['investors','対象人数','人'],['share','構成比','%']],
  'sheet-11':[['yield','利回り','%'],['duration','運用期間','か月'],['aum','対象AUM','億円']],
  'sheet-14':[['sales','販売額','億円'],['investors','投資家数','人'],['contracts','契約数','本']],
  'sheet-15':[['amount','販売額','億円'],['share','構成比','%'],['products','商品数','件']],
  'sheet-16':[['applications','申込数','件'],['pending','手続き中','件'],['completed','完了数','件']],
  'sheet-17':[['applications','申込数','件'],['pending','手続き中','件'],['completed','完了数','件']],
  'sheet-18':[['applications','月間申込数','件'],['pending','月末手続き中','件'],['completed','月間完了数','件']],
  'sheet-19':[['collectionRate','回収率','%'],['collected','回収額','億円'],['outstanding','未回収額','億円']],
  'sheet-20':[['fundCount','ファンド数','本'],['aum','ファンドAUM','億円'],['yield','利回り','%']],
  'sheet-21':[['feeRate','GP料率','%'],['feeAmount','GP報酬額','円'],['aum','対象AUM','億円']],
  'sheet-22':[['topAum','対象AUM','億円'],['investors','対象人数','人'],['share','構成比','%']],
  'sheet-24':[['retention','継続率','%'],['initial','開始時人数','人'],['retained','継続人数','人']],
  'sheet-25':[['initial','開始時人数','人'],['retained','継続人数','人'],['retention','継続率','%']],
  'sheet-26':[['initialAmount','開始時金額','億円'],['retainedAmount','継続金額','億円'],['retention','金額継続率','%']],
  'sheet-27':[['initialPerPerson','開始時の一人当たりAUM','万円'],['currentPerPerson','現在の一人当たりAUM','万円'],['change','増減率','%']],
  'sheet-35':[['af','AFのNO数','件'],['nonAf','AF以外のNO数','件'],['total','NO数合計','件']],
  'sheet-36':[['acquired','獲得人数','人'],['spend','広告費','円'],['cpa','CPA','円']],
  'risk-default':[['defaultBalance','対象残高','億円'],['defaultCount','対象件数','件'],['defaultRate','対象比率','%']],
  'product-mix':[['aum','対象AUM','億円'],['products','商品数','件'],['concentration','最大構成比','%']],
  'fx-risk':[['foreignBalance','外貨建て残高','億円'],['unhedged','未ヘッジ残高','億円'],['fxImpact','為替影響額','円']],
  'investment-fx':[['foreignBalance','外貨建て残高','億円'],['unhedged','未ヘッジ残高','億円'],['currencies','通貨数','通貨']],
  'concentration':[['largestExposure','最大エクスポージャー','億円'],['counterparties','投融資先数','件'],['share','最大集中比率','%']],
  'deposits':[['balance','残高','円'],['deposits','預入額','円'],['withdrawals','払出額','円']],
  'liquidity':[['opening','期首残高','円'],['ending','期末残高','円'],['gap','過不足額','円']],
 };
 for(const doc of docs)if(specific[doc.id])doc.metrics=specific[doc.id];
 const defaults=()=>({version:1,month:'2026-09',looks:{},favorites:[],notes:{},checks:{},values:{},recent:[]});
 let state=defaults(),storageOK=true;
 try{const saved=JSON.parse(localStorage.getItem('samurai-workspace-v110')||'null');if(saved?.version===1)state={...state,...saved,looks:{...saved.looks},values:{...saved.values},notes:{...saved.notes},checks:{...saved.checks},favorites:Array.isArray(saved.favorites)?saved.favorites:[],recent:Array.isArray(saved.recent)?saved.recent:[]};}catch{storageOK=false;}
 const validMonth=m=>/^20\d{2}-(0[1-9]|1[0-2])$/.test(m);
 if(!validMonth(state.month))state.month='2026-09';
 const find=id=>docs.find(d=>d.id===id);
 const save=()=>{try{localStorage.setItem('samurai-workspace-v110',JSON.stringify(state));storageOK=true;}catch{storageOK=false;}return storageOK;};
 const look=id=>Math.max(1,Math.min(10,Number(state.looks[id])||1));
 const key=id=>state.month+'/'+id;
 const values=(doc,month=state.month)=>{const own=state.values[month+'/'+doc.id];if(own&&typeof own==='object')return{data:own,source:'このブラウザの入力値',sample:false};if(doc.id==='sheet-05'&&month==='2026-09')return{data:F.baseline.summary,source:'2026/09/30 基準値の検算用サンプル',sample:true};return{data:{},source:'資料未接続',sample:false};};
 const format=value=>value===undefined||value===null||value===''?'—':new Intl.NumberFormat('ja-JP',{maximumFractionDigits:4}).format(Number(value));
 const candidateNumber=(doc,style)=>{const seed=[...doc.id].reduce((n,c)=>n+c.charCodeAt(0),0);return(style+seed)%10+1;};
 return{docs,styles,state,find,save,look,key,values,format,validMonth,candidateNumber,get storageOK(){return storageOK;},ctx:null};
})();