diff --git a/index.html b/index.html index d8305ca..787dedb 100644 --- a/index.html +++ b/index.html @@ -258,6 +258,21 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1 .score-chip{font-family:'JetBrains Mono',monospace;font-size:9px;font-weight:600;padding:1px 5px;border-radius:4px;background:rgba(74,222,128,.12);border:1px solid rgba(74,222,128,.25);color:var(--ok);margin-left:auto;flex-shrink:0} .score-chip.partial{background:rgba(251,146,60,.10);border-color:rgba(251,146,60,.28);color:var(--warn)} .score-chip.zero{background:var(--surface2);border-color:var(--border);color:var(--text3)} +.weak-dot{font-size:9px;font-weight:700;padding:1px 5px;border-radius:4px;background:rgba(248,113,113,.12);border:1px solid rgba(248,113,113,.3);color:var(--err);margin-left:auto;flex-shrink:0} +/* Today's review */ +.today-section{margin-bottom:20px} +.today-label{font-size:10px;font-weight:600;color:var(--text3);letter-spacing:.09em;text-transform:uppercase;display:flex;align-items:center;gap:6px;margin-bottom:10px} +.today-label svg{width:13px;height:13px;color:var(--accent)} +.today-card{display:flex;align-items:center;gap:10px;padding:12px 16px;background:var(--surface);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;transition:border-color .15s,background .15s;margin-bottom:8px} +.today-card:hover{border-color:var(--accent-border);background:var(--accent-dim)} +.today-card:last-child{margin-bottom:0} +.today-tag{font-size:9px;font-weight:700;padding:2px 7px;border-radius:20px;letter-spacing:.04em;flex-shrink:0} +.today-tag-weak{background:rgba(248,113,113,.12);border:1px solid rgba(248,113,113,.3);color:var(--err)} +.today-tag-new{background:rgba(34,211,238,.08);border:1px solid rgba(34,211,238,.2);color:var(--accent)} +.today-tag-review{background:rgba(251,146,60,.10);border:1px solid rgba(251,146,60,.28);color:var(--warn)} +.today-num{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--text3);flex-shrink:0;min-width:30px} +.today-title{font-size:13px;font-weight:500;color:var(--text);flex:1} +.today-arrow{color:var(--text3);flex-shrink:0} /* Exam tips card */ .exam-tips-text{font-size:13px;line-height:1.8;color:var(--text2)} .exam-tips-text strong{color:var(--text);font-weight:600} @@ -374,8 +389,9 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1 @click="openUnit(u); sidebarOpen=false"> - - + + + @@ -403,6 +419,21 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1 + +
固定資産は使用に伴い価値が減少します。この減少額を減価償却費として費用計上します。
仕訳(間接法):(借)減価償却費 /(貸)減価償却累計額
売却時:帳簿価額¥100,000の備品を¥80,000で売却
(借)現金80,000・固定資産売却損20,000 /(貸)備品100,000
引当金とは将来発生が見込まれる費用・損失を当期に見越計上するものです。
設定:(借)貸倒引当金繰入 /(貸)貸倒引当金
貸倒発生(引当金範囲内):(借)貸倒引当金 /(貸)売掛金
超過分:(借)貸倒損失 /(貸)売掛金
退職給付引当金:(借)退職給付費用 /(貸)退職給付引当金
`, + examtips:['差額補充法が出題の主流。「設定額−既存残高=繰入額」の手順を確実に。', '貸倒発生時:引当金残高の範囲内→貸倒引当金で処理、超過分のみ→貸倒損失。この境界を間違えやすい。', '引当金の設定要件4つ(将来の費用・当期以前起因・見積可能・不確実な債務)も選択問題で出題される。'], keypoints:['差額補充法:不足分だけ繰入(期末残高まで積む)','洗替法:いったん全額取崩して再設定','貸倒れ発生 → 引当金範囲内は引当金で処理・超過分は貸倒損失','退職給付引当金:長期負債として計上'], quiz:[ {q:'売掛金¥400,000に2%設定・既存残高¥3,000のとき差額補充法での繰入額は?',choices:['¥8,000','¥5,000','¥3,000','¥11,000'],answer:1,exp:'設定額 = 400,000 × 2% = 8,000。繰入額 = 8,000 − 3,000 = 5,000円'}, @@ -592,7 +627,9 @@ const CATEGORIES = [ ] }, { id:'c05', num:'C05', title:'有価証券', + freq:'high', diff:2, concept:`有価証券は保有目的により4分類されます。
売買目的(時価↑¥10,000):(借)有価証券10,000 /(貸)有価証券評価益10,000
その他有価証券(時価↑¥10,000):(借)その他有価証券10,000 /(貸)その他有価証券評価差額金10,000
約束手形:振出人と受取人の2者。為替手形:振出人・引受人・受取人の3者。
割引仕訳:(借)当座預金・手形売却損 /(貸)受取手形
裏書き(支払のため):(借)買掛金 /(貸)受取手形
外貨建取引は取引発生時のレートで換算し、決算時に為替換算調整を行います。
例:$1,000売掛金(HR=¥140)、決算時CR=¥145
(借)売掛金5,000 /(貸)為替差益5,000
リース取引は2種類あります。
ファイナンス・リース開始時:(借)リース資産 /(貸)リース債務
リース料支払時:(借)リース債務・支払利息 /(貸)現金
決算時:(借)減価償却費 /(貸)減価償却累計額
会計上の利益と税務上の所得の差異(一時差異)を調整する手続きです。
例:貸倒引当金¥100,000が税務上損金不算入・実効税率30%
(借)繰延税金資産30,000 /(貸)法人税等調整額30,000
株式会社の純資産は株主資本と評価・換算差額等等で構成されます。
株式発行(¥1,000,000・うち資本金¥600,000):
(借)現金1,000,000 /(貸)資本金600,000・資本準備金400,000
剰余金配当¥500,000(利益準備金積立¥50,000):
(借)繰越利益剰余金550,000 /(貸)未払配当金500,000・利益準備金50,000
社債は企業が資金調達のために発行する債券です。
発行(額面¥1,000,000・発行¥970,000・3年):
(借)現金970,000 /(貸)社債970,000
決算時償却¥10,000:(借)社債利息10,000 /(貸)社債10,000
満期:(借)社債1,000,000 /(貸)現金1,000,000
本支店会計では本店と支店が独立した帳簿を持ちます。
内部利益の控除:本店が原価¥100,000の商品を¥120,000で支店に振替 → 内部利益¥20,000
合併財務諸表作成:①未達取引整理 ②照合勘定の相殺消去 ③内部利益の控除
連結財務諸表は親会社と子会社を一体とみなして作成します。議決権の50%超を保有する会社が子会社です。
のれんは20年以内で規則的に償却。毎期:①配当金消去 ②内部取引消去 ③未実現利益消去
`, + examtips:['のれん=投資額−子会社純資産×持分比率。20年以内で規則的償却。この2点はほぼ毎回出題。', '非支配株主持分:子会社純資産のうち親会社が持たない部分。B/S純資産の部に株主資本とは別枠で表示。', '毎期の連結修正仕訳3本(①配当消去 ②のれん償却 ③内部取引・未実現利益消去)の順序と仕訳を体系的に覚える。'], keypoints:['連結の範囲:議決権の過半数(50%超)を持つ子会社','のれん:超過収益力(投資超過額)、規則的に償却','非支配株主持分:子会社純資産のうち親が持たない部分','内部取引・未実現利益は連結上消去する'], quiz:[ {q:'子会社株式¥800,000取得(子会社純資産¥700,000・持分100%)ののれんはいくらか。',choices:['¥700,000','¥100,000','¥800,000','のれんは発生しない'],answer:1,exp:'のれん = 800,000 − 700,000 = 100,000円'}, @@ -673,7 +726,9 @@ const CATEGORIES = [ ] }, { id:'c14', num:'C14', title:'キャッシュフロー計算書', + freq:'high', diff:2, concept:`CF計算書は営業・投資・財務の3区分でキャッシュの増減を示します。
投資CF:固定資産・有価証券の取得・売却
財務CF:借入・返済・社債発行・株式発行・配当金支払い
財務比率で企業の収益性・安全性・効率性を分析します。
工業簿記は製造業の原価計算を記録する簿記です。材料 → 仕掛品 → 製品 の流れで原価を管理します。
仕掛品には製造原価の3要素が集計されます。
材料の消費額(材料費)は消費単価×消費量で計算します。
労務費は労働に対する対価。直接工の賃金は直接労務費、間接工・工場管理者の給与は間接労務費(製造間接費)。
経費は材料費・労務費以外の製造原価。
外注加工費・特許権使用料 → 直接経費(仕掛品へ直接)
工場家賃・減価償却費 → 間接経費(製造間接費へ)
製造間接費は直接特定製品に割り当てられないため、何らかの基準で配賦します。
個別原価計算は受注ごとに原価を集計する方法です。製造指図書ごとに原価計算表を作成します。
完成時:(借)製品 /(貸)仕掛品
販売時:(借)売上原価 /(貸)製品
月末仕掛品:完成していない指図書の原価合計
総合原価計算は同種製品を大量生産する場合に使います。月末仕掛品を完成品換算量に変換して原価を按分します。
材料費は投入時点(通常始点)、加工費は加工進捗度に応じて配分。
`, + examtips:['加工費の完成品換算量(月末仕掛品数量 × 進捗度)の計算が最頻出。材料費(始点投入)は進捗度不要=数量そのまま。', '平均法と先入先出法の違い:先入先出法は月初仕掛品を先に完成させる前提で計算(月初分を別途計算)。', '検算:完成品原価 + 月末仕掛品原価 = 月初仕掛品原価 + 当月投入原価。計算後は必ず確認する。'], keypoints:['始点投入材料:月末仕掛品も100%消費済み','終点投入材料:月末仕掛品には含まれない','加工費(労務費+製造間接費):進捗度に応じて按分','先入先出法:月初仕掛品分と当月分を分けて計算'], quiz:[ {q:'月末仕掛品200個・加工進捗度50%のとき加工費の完成品換算量は?',choices:['200個','100個','150個','400個'],answer:1,exp:'換算量 = 200 × 50% = 100個'}, @@ -747,7 +816,9 @@ const CATEGORIES = [ ] }, { id:'i07', num:'I07', title:'標準原価計算', + freq:'high', diff:3, concept:`標準原価計算はあらかじめ設定した標準原価と実際原価との差異(原価差異)を分析します。
直接原価計算は変動費のみを製品原価とし、固定費は期間費用として処理します。
損益分岐点グラフ:売上高線と総原価線の交点が損益分岐点です。
`, + examtips:['「貢献利益=売上高−変動費」「損益分岐点売上高=固定費÷貢献利益率」の2公式は反射的に出せるようにする。', '目標利益達成売上高=(固定費+目標利益)÷貢献利益率。目標利益が与えられたらこの公式。', '全部原価計算と直接原価計算の利益差額=期末在庫に含まれる固定費相当額。生産量>販売量なら全部原価計算の利益が大きい。'], keypoints:['直接原価計算:固定製造間接費は期間費用として全額計上','損益分岐点:利益ゼロの売上高(固定費をちょうど回収できる点)','安全余裕率 =(実際売上 − 損益分岐点売上)÷ 実際売上 × 100','全部原価計算との利益差額 = 固定費の期首・期末仕掛品への含み'], quiz:[ {q:'売上高¥1,000,000・変動費¥600,000・固定費¥300,000のとき貢献利益は?',choices:['¥400,000','¥100,000','¥700,000','¥300,000'],answer:0,exp:'貢献利益 = 売上高 − 変動費 = 1,000,000 − 600,000 = 400,000円'}, @@ -777,6 +850,7 @@ function bokiApp(){ isDark:true, progress:{}, scores:{}, + wrongUnits:{}, keys:['A','B','C','D','E'], init(){ @@ -788,6 +862,8 @@ function bokiApp(){ catch{ this.progress = {}; } try{ this.scores = JSON.parse(localStorage.getItem('posimai-boki-scores')||'{}'); } catch{ this.scores = {}; } + try{ this.wrongUnits = JSON.parse(localStorage.getItem('posimai-boki-wrong')||'{}'); } + catch{ this.wrongUnits = {}; } const t = localStorage.getItem('posimai-boki-theme')||'system'; this.isDark = t==='dark'||(t==='system'&&matchMedia('(prefers-color-scheme:dark)').matches); const uid=(new URLSearchParams(location.search).get('unit')||'').trim().toLowerCase(); @@ -906,12 +982,55 @@ function bokiApp(){ }); }, + // Weak unit tracking + hasWrong(id){ return !!this.wrongUnits[id]; }, + _onAllAnswered(){ + if(!this.currentUnit) return; + const uid=this.currentUnit.id; + const total=this.currentUnit.quiz?.length||0; + const correct=Object.values(this.quizState).filter(s=>s?.correct).length; + if(correct>=total){ + delete this.wrongUnits[uid]; + } else { + this.wrongUnits[uid]=(this.wrongUnits[uid]||0)+1; + } + localStorage.setItem('posimai-boki-wrong',JSON.stringify(this.wrongUnits)); + this.wrongUnits={...this.wrongUnits}; + }, + get weakUnits(){ + return this.allUnits().filter(u=>this.wrongUnits[u.id]>0) + .sort((a,b)=>(this.wrongUnits[b.id]||0)-(this.wrongUnits[a.id]||0)); + }, + get todayUnits(){ + const result=[]; + // P0-1: pick worst wrong unit + const weak=this.weakUnits; + if(weak.length>0) result.push({...weak[0], todayTag:'苦手'}); + // P0-2: pick first undone unit (skip if same as weak) + const all=this.allUnits(); + const weakId=result[0]?.id; + // First try units with wrong answers but done (review) + const review=all.find(u=>!this.wrongUnits[u.id] && this.scores[u.id] && u.id!==weakId && !this.progress[u.id]); + if(review) result.push({...review, todayTag:'復習'}); + // Otherwise first unlearned + if(result.length<2){ + const next=all.find(u=>!this.progress[u.id] && u.id!==weakId && !result.find(r=>r.id===u.id)); + if(next) result.push({...next, todayTag:'未学習'}); + } + return result; + }, + // Quiz answered(qi){ return !!this.quizState[qi]; }, doAnswer(qi,ci,correct,exp){ if(this.quizState[qi]) return; this.quizState[qi]={selected:ci,correct:ci===correct,exp}; this.quizState={...this.quizState}; + // Check if all questions answered + const total=this.currentUnit?.quiz?.length||0; + if(total>0 && Object.keys(this.quizState).length>=total){ + this._onAllAnswered(); + } }, qCardCls(qi){ const s=this.quizState[qi];