refactor: split curriculum data to js/data, Alpine app to js/app.js, sanitize HTML with DOMPurify
Made-with: Cursor
This commit is contained in:
parent
21ae64958b
commit
b5b9b2f88f
873
index.html
873
index.html
|
|
@ -26,8 +26,6 @@
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
||||||
<script src="https://unpkg.com/lucide@0.344.0/dist/umd/lucide.min.js" integrity="sha384-tTkFttkBclaU1cloKwOi9xk3pbao3VZxTjLNBt8iFABWDBQibbAbWpVmO28zMuxq" crossorigin="anonymous"></script>
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.14.3/dist/cdn.min.js" integrity="sha384-iZD2X8o1Zdq0HR5H/7oa8W30WS4No+zWCKUPD7fHRay9I1Gf+C4F8sVmw7zec1wW" crossorigin="anonymous" defer></script>
|
|
||||||
<style>
|
<style>
|
||||||
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
||||||
:root,[data-theme="dark"]{
|
:root,[data-theme="dark"]{
|
||||||
|
|
@ -380,7 +378,7 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
|
||||||
<div class="aurora-blob aurora-blob-3"></div>
|
<div class="aurora-blob aurora-blob-3"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="app" x-data="bokiApp()" x-init="init()">
|
<div id="app" x-data="bokiApp" x-init="init()">
|
||||||
<div class="overlay-mob" :class="{open:sidebarOpen}" @click="sidebarOpen=false" aria-hidden="true"></div>
|
<div class="overlay-mob" :class="{open:sidebarOpen}" @click="sidebarOpen=false" aria-hidden="true"></div>
|
||||||
|
|
||||||
<header>
|
<header>
|
||||||
|
|
@ -557,7 +555,7 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
|
||||||
<i data-lucide="help-circle" style="width:11px;height:11px"></i>
|
<i data-lucide="help-circle" style="width:11px;height:11px"></i>
|
||||||
問 <span x-text="qi+1"></span>
|
問 <span x-text="qi+1"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="q-text" x-html="q.q"></div>
|
<div class="q-text" x-html="safeHtml(q.q)"></div>
|
||||||
<div class="q-choices">
|
<div class="q-choices">
|
||||||
<template x-for="(ch, ci) in q.choices" :key="ci">
|
<template x-for="(ch, ci) in q.choices" :key="ci">
|
||||||
<button class="q-choice"
|
<button class="q-choice"
|
||||||
|
|
@ -565,12 +563,12 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
|
||||||
:disabled="wdAnswered(qi)"
|
:disabled="wdAnswered(qi)"
|
||||||
@click="doWeakDrillAnswer(qi, ci, q.answer, q.exp)">
|
@click="doWeakDrillAnswer(qi, ci, q.answer, q.exp)">
|
||||||
<span class="choice-key" x-text="keys[ci]"></span>
|
<span class="choice-key" x-text="keys[ci]"></span>
|
||||||
<span x-html="ch"></span>
|
<span x-html="safeHtml(ch)"></span>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div class="q-exp" x-show="wdAnswered(qi)">
|
<div class="q-exp" x-show="wdAnswered(qi)">
|
||||||
<strong>解説:</strong> <span x-html="weakDrillQuizState[qi]?.exp"></span>
|
<strong>解説:</strong> <span x-html="safeHtml(weakDrillQuizState[qi]?.exp)"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -607,8 +605,8 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
|
||||||
<i data-lucide="book-open" style="width:13px;height:13px"></i>
|
<i data-lucide="book-open" style="width:13px;height:13px"></i>
|
||||||
概念解説
|
概念解説
|
||||||
</div>
|
</div>
|
||||||
<div class="concept-text" x-html="conceptPreview"></div>
|
<div class="concept-text" x-html="safeHtml(conceptPreview)"></div>
|
||||||
<div class="concept-text" x-show="conceptExpanded" x-html="conceptRest"></div>
|
<div class="concept-text" x-show="conceptExpanded" x-html="safeHtml(conceptRest)"></div>
|
||||||
<button class="concept-expand-btn" x-show="conceptRest"
|
<button class="concept-expand-btn" x-show="conceptRest"
|
||||||
@click="conceptExpanded = !conceptExpanded">
|
@click="conceptExpanded = !conceptExpanded">
|
||||||
<i :data-lucide="conceptExpanded ? 'chevron-up' : 'chevron-down'" style="width:11px;height:11px"></i>
|
<i :data-lucide="conceptExpanded ? 'chevron-up' : 'chevron-down'" style="width:11px;height:11px"></i>
|
||||||
|
|
@ -626,7 +624,7 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
|
||||||
<template x-for="kp in (currentUnit?.keypoints||[])" :key="kp">
|
<template x-for="kp in (currentUnit?.keypoints||[])" :key="kp">
|
||||||
<li class="key-item">
|
<li class="key-item">
|
||||||
<div class="key-dot"></div>
|
<div class="key-dot"></div>
|
||||||
<span x-html="kp"></span>
|
<span x-html="safeHtml(kp)"></span>
|
||||||
</li>
|
</li>
|
||||||
</template>
|
</template>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
@ -641,7 +639,7 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
|
||||||
<template x-for="tip in (currentUnit?.examtips||[])" :key="tip">
|
<template x-for="tip in (currentUnit?.examtips||[])" :key="tip">
|
||||||
<div class="tips-point">
|
<div class="tips-point">
|
||||||
<div class="tips-icon">!</div>
|
<div class="tips-icon">!</div>
|
||||||
<span x-html="tip"></span>
|
<span x-html="safeHtml(tip)"></span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -687,7 +685,7 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
|
||||||
<div class="flash-card-hint">タップして全文を表示</div>
|
<div class="flash-card-hint">タップして全文を表示</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flash-card-back" x-show="stepFlashRevealed"
|
<div class="flash-card-back" x-show="stepFlashRevealed"
|
||||||
x-html="currentUnit?.keypoints?.[stepKpIdx]"></div>
|
x-html="safeHtml(currentUnit?.keypoints?.[stepKpIdx])"></div>
|
||||||
<div class="flash-card-hint flash-card-hint-footer"
|
<div class="flash-card-hint flash-card-hint-footer"
|
||||||
x-show="stepFlashRevealed || !keypointHasFlip(stepKpIdx)">タップで次へ</div>
|
x-show="stepFlashRevealed || !keypointHasFlip(stepKpIdx)">タップで次へ</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -702,21 +700,21 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
|
||||||
<template x-if="unitDrills.length > 0">
|
<template x-if="unitDrills.length > 0">
|
||||||
<div>
|
<div>
|
||||||
<div class="step-count" x-text="(stepDrillIdx+1) + ' / ' + unitDrills.length + ' 問'"></div>
|
<div class="step-count" x-text="(stepDrillIdx+1) + ' / ' + unitDrills.length + ' 問'"></div>
|
||||||
<div x-html="unitVizHtml" x-show="unitVizHtml"></div>
|
<div x-html="safeHtml(unitVizHtml)" x-show="unitVizHtml"></div>
|
||||||
<div class="q-text" style="font-size:13px;margin-bottom:12px"
|
<div class="q-text" style="font-size:13px;margin-bottom:12px"
|
||||||
x-html="unitDrills[stepDrillIdx]?.q"></div>
|
x-html="safeHtml(unitDrills[stepDrillIdx]?.q)"></div>
|
||||||
<div class="s2choice">
|
<div class="s2choice">
|
||||||
<template x-for="(ch, ci) in (unitDrills[stepDrillIdx]?.choices||[])" :key="ci">
|
<template x-for="(ch, ci) in (unitDrills[stepDrillIdx]?.choices||[])" :key="ci">
|
||||||
<button class="s2btn"
|
<button class="s2btn"
|
||||||
:class="stepDrillAnswered ? (ci === unitDrills[stepDrillIdx].answer ? 's2-ok' : (stepDrillSelected === ci ? 's2-ng' : '')) : ''"
|
:class="stepDrillAnswered ? (ci === unitDrills[stepDrillIdx].answer ? 's2-ok' : (stepDrillSelected === ci ? 's2-ng' : '')) : ''"
|
||||||
:disabled="stepDrillAnswered"
|
:disabled="stepDrillAnswered"
|
||||||
@click="doStepDrill(ci)">
|
@click="doStepDrill(ci)">
|
||||||
<span x-html="ch"></span>
|
<span x-html="safeHtml(ch)"></span>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div class="s2-exp" x-show="stepDrillAnswered">
|
<div class="s2-exp" x-show="stepDrillAnswered">
|
||||||
<strong>解説:</strong> <span x-html="unitDrills[stepDrillIdx]?.exp"></span>
|
<strong>解説:</strong> <span x-html="safeHtml(unitDrills[stepDrillIdx]?.exp)"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="step-action-row">
|
<div class="step-action-row">
|
||||||
<button class="btn-sm btn-accent" @click="nextStepDrill()" x-show="stepDrillAnswered">
|
<button class="btn-sm btn-accent" @click="nextStepDrill()" x-show="stepDrillAnswered">
|
||||||
|
|
@ -756,7 +754,7 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
|
||||||
<i data-lucide="help-circle" style="width:11px;height:11px"></i>
|
<i data-lucide="help-circle" style="width:11px;height:11px"></i>
|
||||||
問 <span x-text="qi+1"></span>
|
問 <span x-text="qi+1"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="q-text" x-html="q.q"></div>
|
<div class="q-text" x-html="safeHtml(q.q)"></div>
|
||||||
<div class="q-choices">
|
<div class="q-choices">
|
||||||
<template x-for="(ch, ci) in q.choices" :key="ci">
|
<template x-for="(ch, ci) in q.choices" :key="ci">
|
||||||
<button class="q-choice"
|
<button class="q-choice"
|
||||||
|
|
@ -764,12 +762,12 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
|
||||||
:disabled="answered(qi)"
|
:disabled="answered(qi)"
|
||||||
@click="doAnswer(qi,ci,q.answer,q.exp)">
|
@click="doAnswer(qi,ci,q.answer,q.exp)">
|
||||||
<span class="choice-key" x-text="keys[ci]"></span>
|
<span class="choice-key" x-text="keys[ci]"></span>
|
||||||
<span x-html="ch"></span>
|
<span x-html="safeHtml(ch)"></span>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div class="q-exp" x-show="answered(qi)">
|
<div class="q-exp" x-show="answered(qi)">
|
||||||
<strong>解説:</strong> <span x-html="quizState[qi]?.exp"></span>
|
<strong>解説:</strong> <span x-html="safeHtml(quizState[qi]?.exp)"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -812,841 +810,10 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script type="module" src="/js/app.js"></script>
|
||||||
const DRILLS = {
|
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.2.4/dist/purify.min.js" integrity="sha384-eEu5CTj3qGvu9PdJuS+YlkNi7d2XxQROAFYOr59zgObtlcux1ae1Il3u7jvdCSWu" crossorigin="anonymous" defer></script>
|
||||||
'c01':[
|
<script src="https://unpkg.com/lucide@0.344.0/dist/umd/lucide.min.js" integrity="sha384-tTkFttkBclaU1cloKwOi9xk3pbao3VZxTjLNBt8iFABWDBQibbAbWpVmO28zMuxq" crossorigin="anonymous" defer></script>
|
||||||
{q:'現金¥50,000が増加した場合、仕訳でどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:0,exp:'資産の増加は借方(左側)に記入します。'},
|
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.14.3/dist/cdn.min.js" integrity="sha384-iZD2X8o1Zdq0HR5H/7oa8W30WS4No+zWCKUPD7fHRay9I1Gf+C4F8sVmw7zec1wW" crossorigin="anonymous" defer></script>
|
||||||
{q:'売上¥100,000が発生した場合、仕訳でどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:1,exp:'収益の発生は貸方(右側)に記入します。'}
|
|
||||||
],
|
|
||||||
'c02':[
|
|
||||||
{q:'三分法で商品を仕入れたとき「仕入」勘定はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:0,exp:'費用の発生(仕入)は借方に記入します。'},
|
|
||||||
{q:'決算整理で期末商品を計上する際「繰越商品」はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:0,exp:'繰越商品(資産)の増加は借方に記入します。'}
|
|
||||||
],
|
|
||||||
'c03':[
|
|
||||||
{q:'間接法の減価償却で「減価償却累計額」はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:1,exp:'減価償却累計額(資産のマイナス評価勘定)は貸方に記入します。'},
|
|
||||||
{q:'帳簿価額より高く売却した場合に生じる「固定資産売却益」はどちらか。',choices:['借方(左側)','貸方(右側)'],answer:1,exp:'収益の発生は貸方に記入します。'}
|
|
||||||
],
|
|
||||||
'c04':[
|
|
||||||
{q:'「貸倒引当金繰入」(費用)の発生はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:0,exp:'費用の発生は借方に記入します。'},
|
|
||||||
{q:'「貸倒引当金」(評価性引当金)の設定はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:1,exp:'貸倒引当金(資産のマイナス)は貸方に計上します。'}
|
|
||||||
],
|
|
||||||
'c05':[
|
|
||||||
{q:'売買目的有価証券の期末時価が帳簿価額を上回った場合の評価差額はどこに計上するか。',choices:['損益計算書(収益)','純資産の部(B/S)'],answer:0,exp:'売買目的有価証券の評価損益は当期の損益計算書に計上します。'},
|
|
||||||
{q:'その他有価証券の評価差額金はどこに計上するか。',choices:['損益計算書','貸借対照表の純資産の部'],answer:1,exp:'その他有価証券評価差額金はB/S純資産の部に計上します(税効果考慮後)。'}
|
|
||||||
],
|
|
||||||
'c06':[
|
|
||||||
{q:'受取手形を受け取ったとき「受取手形」勘定はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:0,exp:'受取手形(資産)の増加は借方に記入します。'},
|
|
||||||
{q:'受取手形を割引に出したとき「受取手形」はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:1,exp:'受取手形(資産)が減少するため貸方に記入します。'}
|
|
||||||
],
|
|
||||||
'c07':[
|
|
||||||
{q:'円高になった場合、外貨建売掛金(輸出債権)の換算替えで生じるのはどちらか。',choices:['為替差損(不利)','為替差益(有利)'],answer:0,exp:'円高では売掛金の円換算額が減少するため為替差損が生じます。'},
|
|
||||||
{q:'円高になった場合、外貨建買掛金(輸入債務)の換算替えで生じるのはどちらか。',choices:['為替差損','為替差益'],answer:1,exp:'買掛金(債務)は円高で返済額が減少するため為替差益が生じます。'}
|
|
||||||
],
|
|
||||||
'c08':[
|
|
||||||
{q:'ファイナンス・リース開始時に計上する「リース資産」はどちらに記入するか。',choices:['借方(資産増加)','貸方(負債増加)'],answer:0,exp:'リース資産(資産)の増加は借方に記入します。'},
|
|
||||||
{q:'ファイナンス・リース開始時に計上する「リース債務」はどちらに記入するか。',choices:['借方','貸方'],answer:1,exp:'リース債務(負債)の増加は貸方に記入します。'}
|
|
||||||
],
|
|
||||||
'c09':[
|
|
||||||
{q:'将来減算一時差異が生じた場合「繰延税金資産」はB/Sのどの区分か。',choices:['資産の部(借方)','負債の部(貸方)'],answer:0,exp:'繰延税金資産は将来の税金軽減効果を資産として計上します。'},
|
|
||||||
{q:'交際費超過額(永久差異)は税効果会計の対象になるか。',choices:['対象になる','対象にならない'],answer:1,exp:'永久差異は将来も解消しないため税効果会計の対象外です。'}
|
|
||||||
],
|
|
||||||
'c10':[
|
|
||||||
{q:'株式を発行して現金を受け取ったとき「資本金」はどちらに記入するか。',choices:['借方','貸方'],answer:1,exp:'資本金(純資産)の増加は貸方に記入します。'},
|
|
||||||
{q:'自己株式はB/Sのどの区分に表示するか。',choices:['資産の部','純資産の部(マイナス項目)'],answer:1,exp:'自己株式は純資産の部から控除する形式で表示します(資産ではありません)。'}
|
|
||||||
],
|
|
||||||
'c11':[
|
|
||||||
{q:'社債を割引発行(額面>発行価額)した場合、毎期の帳簿価額はどうなるか。',choices:['増加する(額面に近づく)','減少する'],answer:0,exp:'割引発行では償却原価法で社債勘定を毎期増額し、満期に額面と一致させます。'},
|
|
||||||
{q:'社債利息(費用)の仕訳でどちらに記入するか。',choices:['借方(費用発生)','貸方'],answer:0,exp:'費用の発生は借方に記入します。'}
|
|
||||||
],
|
|
||||||
'c12':[
|
|
||||||
{q:'本店が支店に商品を送付したとき、本店の帳簿で「支店」勘定はどちらか。',choices:['借方(資産増加)','貸方(負債増加)'],answer:0,exp:'本店の「支店」勘定は資産勘定のため増加は借方に記入します。'},
|
|
||||||
{q:'合併財務諸表で内部取引(振替売上・振替仕入)はどう処理するか。',choices:['そのまま合算する','相殺消去する'],answer:1,exp:'内部取引は合併財務諸表から相殺消去します。'}
|
|
||||||
],
|
|
||||||
'c13':[
|
|
||||||
{q:'のれんは最長何年以内で規則的に償却するか。',choices:['10年以内','20年以内'],answer:1,exp:'のれんは20年以内の期間で規則的に償却します(日本基準)。'},
|
|
||||||
{q:'非支配株主持分はB/Sのどの区分に表示するか。',choices:['負債の部','純資産の部(株主資本と区分)'],answer:1,exp:'非支配株主持分はB/S純資産の部に株主資本とは別枠で表示します。'}
|
|
||||||
],
|
|
||||||
'c14':[
|
|
||||||
{q:'間接法のCF計算書で「減価償却費」を営業CFにどう調整するか。',choices:['加算する','減算する'],answer:0,exp:'減価償却費は現金支出なし→費用として差し引いた分を加算して戻します。'},
|
|
||||||
{q:'固定資産の取得はCF計算書のどの区分に記載するか。',choices:['営業活動CF','投資活動CF'],answer:1,exp:'固定資産の取得・売却は投資活動によるキャッシュフローに記載します。'}
|
|
||||||
],
|
|
||||||
'c15':[
|
|
||||||
{q:'流動比率の計算式「流動資産÷○○×100」の○○はどれか。',choices:['流動資産','流動負債'],answer:1,exp:'流動比率 = 流動資産 ÷ 流動負債 × 100。分母は流動負債です。'},
|
|
||||||
{q:'自己資本比率が高いほど財務安全性はどうなるか。',choices:['高くなる(良い)','低くなる(悪い)'],answer:0,exp:'自己資本比率が高いほど借入依存が少なく財務安全性が高いと評価されます。'}
|
|
||||||
],
|
|
||||||
'i01':[
|
|
||||||
{q:'工場の電力料は製造原価のどの区分に含まれるか。',choices:['直接費','製造間接費'],answer:1,exp:'複数製品に共通して発生する電力料は製造間接費(間接費)に分類されます。'},
|
|
||||||
{q:'仕掛品とはどういう状態の製品か。',choices:['完成した製品','製造途中の未完成品'],answer:1,exp:'仕掛品は製造途中でまだ完成していない製品のことです。'}
|
|
||||||
],
|
|
||||||
'i02':[
|
|
||||||
{q:'先入先出法で物価が上昇しているとき、材料費は移動平均法より高いか低いか。',choices:['高くなる','低くなる'],answer:1,exp:'先入先出法は古い(安い)材料から消費するため物価上昇時は材料費が低くなります。'},
|
|
||||||
{q:'材料費の計算で「月末在庫」はどのように作用するか。',choices:['材料費を増やす','材料費を減らす'],answer:1,exp:'月末在庫は未消費分のため「月初在庫+当月仕入−月末在庫」から差し引かれます。'}
|
|
||||||
],
|
|
||||||
'i03':[
|
|
||||||
{q:'直接工(製品に直接携わる作業員)の賃金はどの区分か。',choices:['直接労務費','製造間接費'],answer:0,exp:'直接工の賃金は直接労務費に分類されます。'},
|
|
||||||
{q:'予定賃率が実際賃率より低い場合、賃率差異はどちらか。',choices:['有利差異','不利差異'],answer:1,exp:'実際賃率が予定より高い→コスト超過→不利差異です。'}
|
|
||||||
],
|
|
||||||
'i04':[
|
|
||||||
{q:'配賦差異「実際発生額−予定配賦額」がプラスの場合はどちらか。',choices:['有利差異(配賦過剰)','不利差異(配賦不足)'],answer:1,exp:'実際発生額が予定配賦額より多い=コスト超過=不利差異(配賦不足)です。'},
|
|
||||||
{q:'製造間接費の予定配賦率は何を基準操業度で割って求めるか。',choices:['実際発生額','製造間接費予算額'],answer:1,exp:'予定配賦率 = 製造間接費予算額 ÷ 基準操業度で計算します。'}
|
|
||||||
],
|
|
||||||
'i05':[
|
|
||||||
{q:'個別原価計算で原価を集計する単位はどれか。',choices:['製造工程ごと','製造指図書ごと'],answer:1,exp:'個別原価計算は受注(製造指図書)ごとに原価を集計します。'},
|
|
||||||
{q:'月末に完成していない指図書の原価はどこに計上されるか。',choices:['製品勘定','仕掛品勘定'],answer:1,exp:'完成していない指図書の原価は期末仕掛品として仕掛品勘定に残ります。'}
|
|
||||||
],
|
|
||||||
'i06':[
|
|
||||||
{q:'月末仕掛品200個・加工進捗度50%のとき加工費の完成品換算量は何個か。',choices:['200個(そのまま)','100個(×50%)'],answer:1,exp:'換算量 = 200 × 50% = 100個。材料費(始点投入)は200個のまま。'},
|
|
||||||
{q:'始点で全量投入する材料費は月末仕掛品に含まれるか。',choices:['含まれる(100%)','含まれない'],answer:0,exp:'始点投入材料は製造開始時点で全量消費扱いのため月末仕掛品にも100%含まれます。'}
|
|
||||||
],
|
|
||||||
'i07':[
|
|
||||||
{q:'価格差異「(標準価格−実際価格)×実際消費量」がプラスのときはどちらか。',choices:['有利差異','不利差異'],answer:0,exp:'標準>実際(実際が安かった)→有利差異です。マイナスが不利差異。'},
|
|
||||||
{q:'数量差異の計算式で乗数(かける価格)はどちらか。',choices:['実際価格','標準価格'],answer:1,exp:'数量差異 =(標準消費量−実際消費量)×<strong>標準価格</strong>で計算します。'}
|
|
||||||
],
|
|
||||||
'i08':[
|
|
||||||
{q:'直接原価計算で固定製造間接費はどのように処理するか。',choices:['製品原価に含める','期間費用として全額計上'],answer:1,exp:'直接原価計算では固定費を製品原価に含めず発生した期の期間費用として処理します。'},
|
|
||||||
{q:'損益分岐点売上高の公式「固定費÷○○」の○○はどれか。',choices:['変動費率','貢献利益率'],answer:1,exp:'損益分岐点売上高 = 固定費 ÷ 貢献利益率(=1−変動費率)'}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
||||||
const CATEGORIES = [
|
|
||||||
{ id:'commercial', label:'商業簿記', icon:'landmark', units:[
|
|
||||||
{ id:'c01', num:'C01', title:'仕訳の基礎復習', freq:'high', diff:1,
|
|
||||||
concept:`<p><strong>仕訳</strong>とは取引を借方(左)と貸方(右)に分けて記録する作業です。<span class="hl">借方合計 = 貸方合計</span> が常に成立します。</p><div class="viz-taccount"><div class="tac-header">T 勘 定</div><div class="tac-body"><div class="tac-side tac-dr"><div class="tac-side-label">借方(左側)</div><div class="tac-side-desc">資産の増加<br>負債の減少<br>純資産の減少<br>費用の発生</div></div><div class="tac-divider"></div><div class="tac-side tac-cr"><div class="tac-side-label">貸方(右側)</div><div class="tac-side-desc">資産の減少<br>負債の増加<br>純資産の増加<br>収益の発生</div></div></div></div><p>勘定科目は5グループに分類されます。</p><div class="viz-groups"><div class="vg-card vg-asset"><div class="vg-name">資産</div><div class="vg-rule">増加→借方<br>減少→貸方</div></div><div class="vg-card vg-liability"><div class="vg-name">負債</div><div class="vg-rule">増加→貸方<br>減少→借方</div></div><div class="vg-card vg-equity"><div class="vg-name">純資産</div><div class="vg-rule">増加→貸方<br>減少→借方</div></div><div class="vg-card vg-revenue"><div class="vg-name">収益</div><div class="vg-rule">発生→貸方<br>消滅→借方</div></div><div class="vg-card vg-expense"><div class="vg-name">費用</div><div class="vg-rule">発生→借方<br>消滅→貸方</div></div></div><p>例:商品¥100,000を掛けで仕入れた</p><div class="journal-wrap"><table class="journal-table"><tr><th>科目</th><th>金額</th><th>科目</th><th>金額</th></tr><tr><td class="dr">仕入</td><td class="amount">100,000</td><td class="cr">買掛金</td><td class="amount">100,000</td></tr></table></div>`,
|
|
||||||
examtips:['第1問の仕訳問題は5問×4点=<strong>20点</strong>。確実に取りに行く単元。','勘定科目名は<strong>正式名称</strong>で書くこと(例:「売掛」ではなく「売掛金」)。略称は不正解。','複合仕訳(借方または貸方が複数行)も頻出。合計金額が一致するか必ず確認。'],
|
|
||||||
keypoints:['資産の増加 → 借方、減少 → 貸方','負債・純資産の増加 → 貸方、減少 → 借方','費用の発生 → 借方、収益の発生 → 貸方','<strong>貸借平均の原理</strong>:借方合計と貸方合計は必ず一致する'],
|
|
||||||
quiz:[
|
|
||||||
{q:'現金¥50,000を受け取り売上として計上した。正しい仕訳はどれか。',choices:['現金 50,000 /売上 50,000','売上 50,000 /現金 50,000','現金 50,000 /買掛金 50,000','売掛金 50,000 /売上 50,000'],answer:0,exp:'現金(資産)の増加は借方。売上(収益)の発生は貸方。'},
|
|
||||||
{q:'負債が増加するとき、仕訳上どちらに記載するか。',choices:['借方(左側)','貸方(右側)','どちらでもよい','仕訳不要'],answer:1,exp:'負債の増加は貸方(右側)に記載します。減少は借方です。'},
|
|
||||||
{q:'費用の発生は仕訳のどちらに記載するか。',choices:['貸方','借方','どちらでもない','発生しない'],answer:1,exp:'費用の発生は借方(左側)に記載します。'},
|
|
||||||
{q:'建物¥5,000,000を購入し、代金のうち¥2,000,000は現金で支払い、残額は来月払いとした。この取引の仕訳として正しいものはどれか。',choices:['建物5,000,000 /現金2,000,000・未払金3,000,000','建物2,000,000 /現金2,000,000','現金5,000,000 /建物5,000,000','建物5,000,000 /買掛金5,000,000'],answer:0,exp:'複合仕訳。建物(資産)全額借方、現金(資産)減少と未払金(負債)増加を貸方に。買掛金は商品の掛け仕入に使う勘定で、固定資産は未払金を使う。'},
|
|
||||||
{q:'当期に未収収益¥30,000(前期に計上した利息の未収分)を現金で受け取った。仕訳として正しいものはどれか。',choices:['現金30,000 /受取利息30,000','現金30,000 /未収収益30,000','未収収益30,000 /現金30,000','受取利息30,000 /現金30,000'],answer:1,exp:'前期に未収収益(資産)として計上済みの利息を受け取ったので、未収収益(資産)を減らし現金(資産)を増やす。受取利息を使うと二重計上になる。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c02', num:'C02', title:'商品売買と売上原価', freq:'high', diff:1,
|
|
||||||
concept:`<p>2級では<strong>三分法</strong>が基本です。仕入・売上・繰越商品の3勘定を使います。</p><div class="formula-box"><div class="formula-label">売上原価の算定(決算整理仕訳)</div>①(借)仕入 /(貸)繰越商品 ← 期首商品を仕入に振替<br>②(借)繰越商品 /(貸)仕入 ← 期末商品を控除<br><br>売上原価 = 期首商品 + 当期仕入 − 期末商品</div><p>例:期首¥30,000・仕入¥200,000・期末¥40,000 → 売上原価 <span class="hl">¥190,000</span></p>`,
|
|
||||||
examtips:['精算表(第3問)で必出。決算整理仕訳の<strong>2本セット</strong>(期首振替・期末控除)を忘れずに。','「売上原価 = 期首 + 仕入 − 期末」の公式は反射的に出るまで暗記。','仕入値引・仕入返品は仕入勘定を減額。売上値引・売上返品は売上勘定を減額することを覚えておく。'],
|
|
||||||
keypoints:['三分法:仕入(費用)・売上(収益)・繰越商品(資産)','売上原価 = 期首 + 仕入 − 期末','決算整理で「仕入」勘定を売上原価に確定させる','売上総利益 = 売上高 − 売上原価'],
|
|
||||||
quiz:[
|
|
||||||
{q:'期首商品¥20,000、当期仕入¥150,000、期末商品¥25,000のとき売上原価はいくらか。',choices:['¥145,000','¥155,000','¥170,000','¥125,000'],answer:0,exp:'売上原価 = 20,000 + 150,000 − 25,000 = 145,000円'},
|
|
||||||
{q:'決算整理で期末商品¥40,000を計上する仕訳はどれか。',choices:['仕入 40,000 /繰越商品 40,000','繰越商品 40,000 /仕入 40,000','売上 40,000 /繰越商品 40,000','繰越商品 40,000 /売上 40,000'],answer:1,exp:'期末商品は(借)繰越商品 /(貸)仕入 で仕入勘定から控除します。'},
|
|
||||||
{q:'売上高¥300,000、売上原価¥190,000のとき売上総利益はいくらか。',choices:['¥490,000','¥110,000','¥190,000','¥300,000'],answer:1,exp:'売上総利益 = 300,000 − 190,000 = 110,000円'},
|
|
||||||
{q:'当期中に仕入¥500,000のうち¥20,000分を品質不良で返品した。仕入勘定の純額はいくらか。',choices:['¥520,000','¥480,000','¥500,000','¥20,000'],answer:1,exp:'仕入返品は仕入勘定を減額。純仕入額 = 500,000 − 20,000 = 480,000円'},
|
|
||||||
{q:'売上高¥800,000、期首商品¥50,000、当期仕入¥600,000、期末商品¥80,000のとき売上総利益はいくらか。',choices:['¥230,000','¥170,000','¥250,000','¥800,000'],answer:0,exp:'売上原価 = 50,000 + 600,000 − 80,000 = 570,000。売上総利益 = 800,000 − 570,000 = 230,000円'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c03', num:'C03', title:'固定資産と減価償却',
|
|
||||||
freq:'high', diff:2,
|
|
||||||
concept:`<p>固定資産は使用に伴い価値が減少します。この減少額を<strong>減価償却費</strong>として費用計上します。</p><div class="formula-box"><div class="formula-label">主要な償却方法</div>定額法:(取得原価 − 残存価額)÷ 耐用年数<br>定率法:期首帳簿価額 × 償却率<br>生産高比例法:(取得 − 残存)× 当期利用量 ÷ 総利用可能量</div><p>仕訳(間接法):(借)減価償却費 /(貸)減価償却累計額</p><p>売却時:帳簿価額¥100,000の備品を¥80,000で売却<br>(借)現金80,000・固定資産売却損20,000 /(貸)備品100,000</p>`,
|
|
||||||
examtips:['精算表・財務諸表問題(第3・4問)で頻出。定額法の計算式は反射的に出てくるまで練習する。', '期中取得は<strong>月割り計算</strong>(使用月数÷12)を忘れずに。年度途中の取得・売却問題で必ず問われる。', '間接法:帳簿価額=取得原価−累計額。売却損益=売却価額−帳簿価額。符号ミスに注意。'],
|
|
||||||
keypoints:['定額法:毎期同額','定率法:期首帳簿価額に率をかける→年々減少','間接法:備品勘定は取得原価のまま・累計額を別勘定で管理','売却損益 = 売却価額 − 帳簿価額(取得原価 − 累計額)'],
|
|
||||||
quiz:[
|
|
||||||
{q:'取得原価¥500,000・残存価額¥0・耐用年数5年を定額法で償却する場合の毎期償却費は?',choices:['¥50,000','¥100,000','¥125,000','¥500,000'],answer:1,exp:'(500,000 − 0)÷ 5 = 100,000円/年'},
|
|
||||||
{q:'帳簿価額¥200,000の車両を¥250,000で売却した場合に計上される損益は?',choices:['固定資産売却損¥50,000','固定資産売却益¥50,000','固定資産売却損¥200,000','損益なし'],answer:1,exp:'250,000 − 200,000 = 50,000円の固定資産売却益'},
|
|
||||||
{q:'間接法で減価償却を行うとき使用する勘定科目の組み合わせはどれか。',choices:['備品と現金','減価償却費と減価償却累計額','備品減価償却費のみ','減価償却費と備品'],answer:1,exp:'間接法では「減価償却費」(費用)と「減価償却累計額」(資産のマイナス)を使います。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c04', num:'C04', title:'引当金',
|
|
||||||
freq:'high', diff:2,
|
|
||||||
concept:`<p><strong>引当金</strong>とは将来発生が見込まれる費用・損失を当期に見越計上するものです。</p><div class="formula-box"><div class="formula-label">貸倒引当金(差額補充法)</div>設定額 = 売上債権残高 × 貸倒実績率<br>繰入額 = 設定額 − 既存の引当金残高</div><p>設定:(借)貸倒引当金繰入 /(貸)貸倒引当金<br>貸倒発生(引当金範囲内):(借)貸倒引当金 /(貸)売掛金<br>超過分:(借)貸倒損失 /(貸)売掛金</p><p><strong>退職給付引当金</strong>:(借)退職給付費用 /(貸)退職給付引当金</p>`,
|
|
||||||
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円'},
|
|
||||||
{q:'貸倒引当金残高¥10,000のとき売掛金¥8,000が貸倒れた場合の仕訳は?',choices:['貸倒損失8,000 /売掛金8,000','貸倒引当金8,000 /売掛金8,000','売掛金8,000 /貸倒引当金8,000','貸倒引当金10,000 /売掛金8,000'],answer:1,exp:'貸倒額が引当金残高以内のため全額引当金で処理します。'},
|
|
||||||
{q:'引当金の設定要件として正しくないものはどれか。',choices:['将来の費用・損失である','当期以前の事象に起因する','金額の合理的見積もりが可能','すでに確定した債務である'],answer:3,exp:'引当金は「確定した債務」ではなく「将来発生が見込まれる不確実なもの」が対象です。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c05', num:'C05', title:'有価証券',
|
|
||||||
freq:'high', diff:2,
|
|
||||||
concept:`<p>有価証券は保有目的により4分類されます。</p><div class="formula-box"><div class="formula-label">分類と評価</div>売買目的有価証券 → 時価評価(差額は当期損益)<br>満期保有目的債券 → 原価法または償却原価法<br>子会社・関連会社株式 → 取得原価法<br>その他有価証券 → 時価評価(差額は純資産:その他包括利益)</div><p>売買目的(時価↑¥10,000):(借)有価証券10,000 /(貸)有価証券評価益10,000<br>その他有価証券(時価↑¥10,000):(借)その他有価証券10,000 /(貸)その他有価証券評価差額金10,000</p>`,
|
|
||||||
examtips:['4分類(売買目的・満期保有・子会社株式・その他)と評価方法のマトリクスを表で暗記。損益計上先(P/L or B/S純資産)の違いが最頻出。', '「その他有価証券評価差額金」はB/S純資産の部。<strong>損益計算書には計上しない</strong>。頻出の引っかけ。', '売買目的と「その他有価証券」の仕訳で使う勘定科目名が異なることに注意(「有価証券」vs「その他有価証券」)。'],
|
|
||||||
keypoints:['売買目的:流動資産、時価評価、評価損益はP/Lへ','満期保有:固定資産、原価(or償却原価)法','子会社・関連会社株式:固定資産、取得原価のまま','その他有価証券:固定資産、評価差額はB/S純資産(税効果後)'],
|
|
||||||
quiz:[
|
|
||||||
{q:'売買目的有価証券(取得原価¥100,000)の期末時価が¥110,000のとき計上する損益は?',choices:['有価証券評価損¥10,000','有価証券評価益¥10,000','投資有価証券評価益¥10,000','損益は計上しない'],answer:1,exp:'売買目的有価証券は時価評価し差額を当期損益(有価証券評価益)に計上します。'},
|
|
||||||
{q:'その他有価証券の評価差額金はどこに計上するか。',choices:['損益計算書(営業外収益)','損益計算書(特別利益)','貸借対照表の純資産の部','貸借対照表の負債の部'],answer:2,exp:'B/S純資産の「その他有価証券評価差額金」に計上します(税効果考慮後)。'},
|
|
||||||
{q:'子会社株式の期末評価方法はどれか。',choices:['時価法','持分法','取得原価法','低価法'],answer:2,exp:'子会社株式・関連会社株式は取得原価法で評価します(時価変動は認識しない)。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c06', num:'C06', title:'手形取引',
|
|
||||||
freq:'mid', diff:2,
|
|
||||||
concept:`<p><strong>約束手形</strong>:振出人と受取人の2者。<strong>為替手形</strong>:振出人・引受人・受取人の3者。</p><div class="formula-box"><div class="formula-label">手形の割引</div>受取額 = 手形額面 − 割引料<br>割引料 = 手形額面 × 割引率 × 残存日数 ÷ 365</div><p>割引仕訳:(借)当座預金・手形売却損 /(貸)受取手形<br>裏書き(支払のため):(借)買掛金 /(貸)受取手形</p>`,
|
|
||||||
examtips:['手形割引料の計算は<strong>365日法 or 360日法</strong>を問題文で確認してから計算する。', '裏書き譲渡:買掛金 / 受取手形。受取手形が<strong>貸方</strong>に来ることを確認する。', '手形売却損(割引)と支払利息(借入)の区別がよく問われる。割引は売却なので支払利息ではない。'],
|
|
||||||
keypoints:['受取手形(資産)・支払手形(負債)','割引:銀行に売却→手形売却損(費用)計上','裏書き:受取手形を他者への支払いに使用','不渡り:決済されなかった手形→さかのぼり請求が発生'],
|
|
||||||
quiz:[
|
|
||||||
{q:'額面¥200,000の手形を年利3%・残存60日で割り引いた割引料(365日計算)は概算でいくらか。',choices:['¥985','¥1,479','¥6,000','¥3,000'],answer:0,exp:'割引料 = 200,000 × 3% × 60÷365 ≒ 985円'},
|
|
||||||
{q:'手形を裏書きして仕入代金に充当したときの貸方科目は?',choices:['支払手形','買掛金','受取手形','当座預金'],answer:2,exp:'裏書きで受取手形が減少するため貸方は「受取手形」です。'},
|
|
||||||
{q:'手形割引の仕訳で借方に計上される費用科目は?',choices:['支払利息','有価証券売却損','手形売却損','割引料'],answer:2,exp:'手形割引時の費用は「手形売却損」です。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c07', num:'C07', title:'外貨建取引',
|
|
||||||
freq:'high', diff:2,
|
|
||||||
concept:`<p>外貨建取引は取引発生時のレートで換算し、決算時に為替換算調整を行います。</p><div class="formula-box"><div class="formula-label">換算レートの原則</div>売上・仕入(収益・費用) → 取引日レート(HR)<br>売掛金・買掛金(流動) → 決算日レート(CR)<br>長期外貨建債権・債務 → 決算日レート(CR)</div><p>例:$1,000売掛金(HR=¥140)、決算時CR=¥145<br>(借)売掛金5,000 /(貸)為替差益5,000</p>`,
|
|
||||||
examtips:['換算レートの原則を表で整理:収益・費用→取引日レート(HR)、期末の外貨建金銭債権債務→決算日レート(CR)。', '円高になると→輸出企業の売掛金は為替差損、輸入企業の買掛金は為替差益。直感で判断できるように練習する。', '為替予約(振当処理):予約日から予約レートを適用。問題文に「振当処理」と書いてあれば即このルールを適用。'],
|
|
||||||
keypoints:['取引日:取引時のレートで記帳','決算日:外貨建金銭債権債務はCRで換算替え','差額:為替差損益(営業外損益)','為替予約(振当処理):予約レートを適用してヘッジ'],
|
|
||||||
quiz:[
|
|
||||||
{q:'ドル建て売掛金$2,000(計上時¥140)が決算日CR=¥138のとき為替差損はいくらか。',choices:['¥4,000','¥2,000','¥276,000','¥4,000の為替差益'],answer:0,exp:'円高になったため評価減。(140−138)× 2,000 = 4,000円の為替差損。'},
|
|
||||||
{q:'外貨建収益(売上)を換算するレートはどれか。',choices:['決算日レート(CR)','取引日レート(HR)','予算レート','前期末レート'],answer:1,exp:'収益・費用は取引日レート(HR)で換算します。'},
|
|
||||||
{q:'決算時に外貨建買掛金で為替差益が生じるのはどの場合か。',choices:['円高になった','円安になった','レートが変わらなかった','外貨の価値が上がった'],answer:0,exp:'買掛金(債務)は円高になると支払額が減少するため為替差益が生じます。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c08', num:'C08', title:'リース取引',
|
|
||||||
freq:'mid', diff:2,
|
|
||||||
concept:`<p>リース取引は2種類あります。</p><div class="formula-box"><div class="formula-label">分類</div>ファイナンス・リース:実質的に購入と同じ → 資産・負債を計上<br>オペレーティング・リース:賃貸借として処理 → 支払リース料(費用)</div><p>ファイナンス・リース開始時:(借)リース資産 /(貸)リース債務<br>リース料支払時:(借)リース債務・支払利息 /(貸)現金<br>決算時:(借)減価償却費 /(貸)減価償却累計額</p>`,
|
|
||||||
examtips:['ファイナンス・リースの判定基準3つ(所有権移転・割安購入選択権・リース期間が耐用年数の75%以上)を暗記。', 'ファイナンス開始仕訳:リース資産 / リース債務(双方同額)。利子抜き法では利息相当額を除いた金額で計上。', 'オペレーティング・リースは毎期「支払リース料 / 現金」のみ。資産・負債は計上しない。'],
|
|
||||||
keypoints:['ファイナンス:所有権移転・割安購入選択権・リース期間等で判定','利子抜き法:リース料総額から利息相当額を除いた金額で資産計上','オペレーティング:毎期「支払リース料」を計上するだけ','減価償却:ファイナンスは自己所有資産同様に行う'],
|
|
||||||
quiz:[
|
|
||||||
{q:'ファイナンス・リース取引開始時の借方科目はどれか。',choices:['リース費用','支払リース料','リース資産','減価償却費'],answer:2,exp:'ファイナンス・リースは資産計上します。(借)リース資産 /(貸)リース債務'},
|
|
||||||
{q:'オペレーティング・リースの毎期の仕訳として正しいものはどれか。',choices:['リース資産 /リース債務','支払リース料 /現金','減価償却費 /リース資産','リース債務 /現金'],answer:1,exp:'オペレーティング・リースは支払リース料として費用計上します。'},
|
|
||||||
{q:'ファイナンス・リースの判定基準として誤っているものはどれか。',choices:['所有権が借手に移転する','割安購入選択権がある','リース期間が耐用年数の75%以上','月々のリース料が高額である'],answer:3,exp:'「月々のリース料が高額」は判定基準ではありません。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c09', num:'C09', title:'税効果会計',
|
|
||||||
freq:'high', diff:3,
|
|
||||||
concept:`<p>会計上の利益と税務上の所得の差異(<strong>一時差異</strong>)を調整する手続きです。</p><div class="formula-box"><div class="formula-label">繰延税金資産・負債</div>将来減算一時差異(会計費用 > 税務損金)→ 繰延税金資産<br>将来加算一時差異(会計費用 < 税務損金)→ 繰延税金負債<br><br>繰延税金資産 = 一時差異 × 法定実効税率</div><p>例:貸倒引当金¥100,000が税務上損金不算入・実効税率30%<br>(借)繰延税金資産30,000 /(貸)法人税等調整額30,000</p>`,
|
|
||||||
examtips:['「将来減算一時差異→繰延税金資産」「将来加算一時差異→繰延税金負債」の対応を確実に。逆は絶対NG。', '<strong>永久差異</strong>(交際費超過・寄付金超過等)は税効果の対象外。一時差異との区別が頻出。', '繰延税金資産の計算:一時差異 × 法定実効税率。税率は問題文で与えられる。計算自体はシンプル。'],
|
|
||||||
keypoints:['一時差異:会計と税務の費用認識タイミングのズレ(いずれ解消)','永久差異(交際費超過額等)は税効果の対象外','繰延税金資産:将来の税金を前払い(資産)の概念','法人税等調整額:P/Lで税負担を調整する科目'],
|
|
||||||
quiz:[
|
|
||||||
{q:'将来減算一時差異が生じた場合に計上される勘定科目はどれか。',choices:['繰延税金負債','法人税等','繰延税金資産','法人税等調整額(借方)'],answer:2,exp:'将来減算一時差異は「繰延税金資産」として計上します(将来の税金軽減効果)。'},
|
|
||||||
{q:'貸倒引当金¥200,000が税務上全額損金不算入・実効税率30%のとき繰延税金資産は?',choices:['¥200,000','¥140,000','¥60,000','¥30,000'],answer:2,exp:'繰延税金資産 = 200,000 × 30% = 60,000円'},
|
|
||||||
{q:'税効果会計の対象とならない差異はどれか。',choices:['貸倒引当金の限度超過額','退職給付引当金の限度超過額','交際費の損金不算入額','減価償却の限度超過額'],answer:2,exp:'交際費超過額は永久差異のため税効果会計の対象外です。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c10', num:'C10', title:'純資産と株式',
|
|
||||||
freq:'mid', diff:2,
|
|
||||||
concept:`<p>株式会社の純資産は株主資本と評価・換算差額等等で構成されます。</p><div class="formula-box"><div class="formula-label">株主資本の構成</div>資本金 + 資本準備金 + その他資本剰余金<br>+ 利益準備金 + その他利益剰余金 − 自己株式</div><p>株式発行(¥1,000,000・うち資本金¥600,000):<br>(借)現金1,000,000 /(貸)資本金600,000・資本準備金400,000</p><p>剰余金配当¥500,000(利益準備金積立¥50,000):<br>(借)繰越利益剰余金550,000 /(貸)未払配当金500,000・利益準備金50,000</p>`,
|
|
||||||
examtips:['株式発行:払込額の<strong>最低1/2以上</strong>を資本金に計上。残りは資本準備金。問題文の指定を確認する。', '配当時の利益準備金積立:配当額×1/10(上限:資本金の1/4に達するまで)。計算手順を練習する。', '<strong>自己株式はB/S純資産のマイナス</strong>(資産ではない)。「資産の部に計上」という選択肢は頻出の引っかけ。'],
|
|
||||||
keypoints:['払込額の最低1/2を資本金、残りは資本準備金に計上可','配当時:利益準備金を資本金の1/4まで積立義務(配当額の1/10)','自己株式:純資産のマイナス項目(資産ではない)','その他有価証券評価差額金は純資産の部に表示'],
|
|
||||||
quiz:[
|
|
||||||
{q:'1株¥500で1,000株発行し全額を資本金とした場合、貸方に計上される金額は?',choices:['資本準備金¥500,000','資本金¥500,000','資本金¥250,000と資本準備金¥250,000','普通株式¥500,000'],answer:1,exp:'全額資本金の場合:(借)現金500,000 /(貸)資本金500,000'},
|
|
||||||
{q:'自己株式はB/Sのどこに表示するか。',choices:['流動資産','固定資産','純資産の部(控除)','負債の部'],answer:2,exp:'自己株式は純資産の部の株主資本から控除する形式で表示します(マイナス項目)。'},
|
|
||||||
{q:'剰余金配当¥1,000,000のとき利益準備金の積立額は(積立不足十分な場合)?',choices:['¥100,000','¥200,000','¥50,000','¥500,000'],answer:0,exp:'配当額の1/10を積立:1,000,000 × 1/10 = 100,000円'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c11', num:'C11', title:'社債',
|
|
||||||
freq:'mid', diff:2,
|
|
||||||
concept:`<p><strong>社債</strong>は企業が資金調達のために発行する債券です。</p><div class="formula-box"><div class="formula-label">償却原価法(定額法)</div>毎期の償却額 =(額面 − 発行価額)÷ 償還までの年数<br>割引発行:帳簿価額を毎期増額 割増発行:毎期減額</div><p>発行(額面¥1,000,000・発行¥970,000・3年):<br>(借)現金970,000 /(貸)社債970,000<br>決算時償却¥10,000:(借)社債利息10,000 /(貸)社債10,000<br>満期:(借)社債1,000,000 /(貸)現金1,000,000</p>`,
|
|
||||||
examtips:['割引発行(額面>発行価額)→毎期償却額を加算→帳簿価額が<strong>増加</strong>して満期に額面へ。方向を間違えやすい。', 'クーポン利息(額面×クーポン率×期間)と償却原価法の調整額の合算が「社債利息」として費用計上される。', '満期償還時は帳簿価額=額面になっている。仕訳後に差額が出ないことを確認する。'],
|
|
||||||
keypoints:['割引発行:額面>発行価額 → 社債勘定を毎期増額','割増発行:額面<発行価額 → 社債勘定を毎期減額','社債利息 = クーポン利息 + 償却原価法の調整額','社債は固定負債(1年以内償還分は流動負債)'],
|
|
||||||
quiz:[
|
|
||||||
{q:'額面¥2,000,000を¥1,940,000で発行・5年満期のとき定額法での毎期償却額は?',choices:['¥12,000','¥60,000','¥388,000','¥400,000'],answer:0,exp:'(2,000,000 − 1,940,000)÷ 5 = 12,000円/年'},
|
|
||||||
{q:'社債の割引発行(額面>発行価額)のとき毎期の償却により帳簿価額はどうなるか。',choices:['増加する','減少する','変わらない','満期まで発行価額のまま'],answer:0,exp:'割引発行では毎期償却額を社債勘定に加算するため帳簿価額は増加(額面に近づく)します。'},
|
|
||||||
{q:'社債はB/Sのどの区分に計上するか(原則)。',choices:['流動負債','固定負債','純資産','流動資産'],answer:1,exp:'社債は固定負債に計上します(1年以内に償還されるものは流動負債)。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c12', num:'C12', title:'本支店会計',
|
|
||||||
freq:'high', diff:3,
|
|
||||||
concept:`<p>本支店会計では本店と支店が独立した帳簿を持ちます。</p><div class="formula-box"><div class="formula-label">照合勘定</div>本店側:「支店」勘定(資産)<br>支店側:「本店」勘定(純資産的な勘定)<br>→ 未達取引調整後は必ず一致</div><p>内部利益の控除:本店が原価¥100,000の商品を¥120,000で支店に振替 → 内部利益¥20,000<br>合併財務諸表作成:①未達取引整理 ②照合勘定の相殺消去 ③内部利益の控除</p>`,
|
|
||||||
examtips:['未達取引整理後に「支店」勘定(本店帳)と「本店」勘定(支店帳)が一致するかを確認する手順が出題の核。', '内部利益の計算:振替価格−原価=内部利益単価。期末商品に含まれる分だけ合併B/Sから控除する。', '合併P/Lでは内部取引(振替売上・振替仕入)を相殺消去。消去後の売上高・仕入高を確認すること。'],
|
|
||||||
keypoints:['本店の「支店」勘定と支店の「本店」勘定は対応','未達取引:片方だけ処理済み → 調整して一致させる','内部利益:振替価格と原価の差 → 期末商品から控除','合併P/Lでは内部取引(振替売上・振替仕入)を相殺'],
|
|
||||||
quiz:[
|
|
||||||
{q:'本店が支店に商品を送付した際、本店で使用する勘定科目はどれか。',choices:['売上','支店','本店','商品振替'],answer:1,exp:'本店は「支店」勘定(資産)の増加として記帳します。'},
|
|
||||||
{q:'支店が本店から商品を受け取った際に使用する勘定科目はどれか。',choices:['仕入','本店','支店','受取商品'],answer:1,exp:'支店は「本店」勘定(本店への債務)の増加として記帳します。'},
|
|
||||||
{q:'合併財務諸表作成の手順として誤っているものはどれか。',choices:['未達取引の整理','照合勘定の相殺消去','内部利益の控除','支店を子会社として連結'],answer:3,exp:'本支店は同一企業内の組織のため子会社として連結処理は行いません。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c13', num:'C13', title:'連結会計の基礎',
|
|
||||||
freq:'high', diff:3,
|
|
||||||
concept:`<p><strong>連結財務諸表</strong>は親会社と子会社を一体とみなして作成します。議決権の<span class="hl">50%超</span>を保有する会社が子会社です。</p><div class="viz-org"><div class="vo-node vo-parent">親会社<div class="vo-sub">連結財務諸表を作成</div></div><div class="vo-connector"><div class="vo-vline"></div><div class="vo-pct">議決権 51〜100% 保有</div><div class="vo-vline"></div></div><div class="vo-row"><div class="vo-branch"><div class="vo-node vo-child1">子会社(100%)<div class="vo-sub">完全子会社</div></div></div><div class="vo-branch" style="margin-top:32px"><div class="vo-node vo-child2">子会社(60%)<div class="vo-sub">非支配株主持分 40%</div></div></div></div></div><div class="formula-box"><div class="formula-label">支配獲得時の連結修正仕訳</div>(借)子会社純資産 × 持分率<br>(借)のれん(差額)<br>(貸)子会社株式(投資)<br><br>のれん = 投資額 − 子会社純資産の持分相当額</div><p>のれんは20年以内で規則的に償却。毎期:①配当金消去 ②内部取引消去 ③未実現利益消去</p>`,
|
|
||||||
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円'},
|
|
||||||
{q:'連結財務諸表で親会社が受け取った子会社からの配当金はどう処理するか。',choices:['そのまま受取配当金として計上','受取配当金と利益剰余金を相殺消去','資本剰余金に振替','現金と相殺'],answer:1,exp:'連結上グループ内の配当は内部取引として消去します。'},
|
|
||||||
{q:'のれんの最長償却期間はどれか。',choices:['5年','10年','20年','50年'],answer:2,exp:'のれんは20年以内の期間で規則的に償却します。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c14', num:'C14', title:'キャッシュフロー計算書',
|
|
||||||
freq:'high', diff:2,
|
|
||||||
concept:`<p>CF計算書は<strong>営業・投資・財務</strong>の3区分でキャッシュの増減を示します。</p><div class="formula-box"><div class="formula-label">間接法(営業CF)の主な調整項目</div>税引前当期純利益<br>+ 減価償却費(非現金費用の加戻し)<br>+/− 売上債権の減少/増加(回収状況)<br>+/− 棚卸資産の減少/増加<br>+/− 仕入債務の増加/減少</div><p>投資CF:固定資産・有価証券の取得・売却<br>財務CF:借入・返済・社債発行・株式発行・配当金支払い</p>`,
|
|
||||||
examtips:['間接法の調整項目を表で整理:減価償却費→加算、売上債権増加→減算、棚卸資産増加→減算、仕入債務増加→加算。', '投資CF vs 財務CF の区分:固定資産・有価証券の取得/売却→投資CF、借入/返済/社債/株式/配当→財務CF。', '直接法と間接法では営業CFの表示方法が違うが、合計額は同じになることを理解しておく。'],
|
|
||||||
keypoints:['間接法:純利益からスタートし非現金項目を調整','減価償却費はキャッシュアウトなし → 加算して戻す','売上債権増加 → 現金未回収 → 営業CFから減算','固定資産の取得・売却 → 投資CF'],
|
|
||||||
quiz:[
|
|
||||||
{q:'間接法のCF計算書で減価償却費¥50,000は営業CFにどう影響するか。',choices:['¥50,000を減算','¥50,000を加算','影響なし','財務CFに計上'],answer:1,exp:'減価償却費は現金支出を伴わない費用のため純利益から控除した分を加算して戻します。'},
|
|
||||||
{q:'固定資産の取得による支出はCF計算書のどの区分か。',choices:['営業活動','投資活動','財務活動','表示しない'],answer:1,exp:'固定資産の取得・売却は投資活動によるキャッシュフローに表示します。'},
|
|
||||||
{q:'売掛金が前期比¥30,000増加した場合、間接法の営業CFにどう影響するか。',choices:['¥30,000加算','¥30,000減算','影響なし','財務CFへ計上'],answer:1,exp:'売上債権の増加は現金回収が少ないことを意味するため営業CFから減算します。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'c15', num:'C15', title:'財務諸表分析',
|
|
||||||
freq:'mid', diff:1,
|
|
||||||
concept:`<p>財務比率で企業の収益性・安全性・効率性を分析します。</p><div class="formula-box"><div class="formula-label">主要な財務比率</div>収益性:売上高総利益率 = 売上総利益 ÷ 売上高 × 100<br> ROE = 当期純利益 ÷ 自己資本 × 100<br>安全性:流動比率 = 流動資産 ÷ 流動負債 × 100(200%以上良好)<br> 自己資本比率 = 自己資本 ÷ 総資産 × 100<br>効率性:売上債権回転率 = 売上高 ÷ 売上債権<br> 棚卸資産回転率 = 売上高 ÷ 棚卸資産</div>`,
|
|
||||||
examtips:['計算式は「分子は何か・分母は何か」を意識して整理する。特に分母を流動負債にするか総資産にするかで迷いやすい。', 'ROEが高い ≠ 安全。自己資本比率が低い会社でもROEが高い場合がある(レバレッジ効果)という逆説も出題される。', '「改善策はどれか」という選択問題では指標の意味から考える。例:流動比率↑には流動資産増 or 流動負債減が必要。'],
|
|
||||||
keypoints:['流動比率が高い → 短期支払能力が高い','自己資本比率が高い → 財務安全性が高い','回転率が高い → 効率よく資産を活用','ROEが高い → 株主資本を効率よく使って利益創出'],
|
|
||||||
quiz:[
|
|
||||||
{q:'流動資産¥600,000・流動負債¥300,000のとき流動比率はいくらか。',choices:['50%','150%','200%','300%'],answer:2,exp:'流動比率 = 600,000 ÷ 300,000 × 100 = 200%'},
|
|
||||||
{q:'自己資本比率を高める効果がある事象はどれか。',choices:['借入金の増加','当期純利益の計上','社債の発行','買掛金の増加'],answer:1,exp:'当期純利益は利益剰余金として純資産を増やすため自己資本比率が上昇します。'},
|
|
||||||
{q:'売上高¥1,200,000・売上債権¥200,000のとき売上債権回転率はいくらか。',choices:['2回','4回','6回','8回'],answer:2,exp:'売上債権回転率 = 1,200,000 ÷ 200,000 = 6回'}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]},
|
|
||||||
{ id:'industrial', label:'工業簿記', icon:'factory', units:[
|
|
||||||
{ id:'i01', num:'I01', title:'工業簿記の基礎と勘定体系',
|
|
||||||
freq:'mid', diff:1,
|
|
||||||
concept:`<p><strong>工業簿記</strong>は製造業の原価計算を記録する簿記です。<span class="hl">材料 → 仕掛品 → 製品</span> の流れで原価を管理します。</p><div class="viz-flow"><div class="vf-node"><div>材料</div><div class="vf-sub">材料費</div></div><div class="vf-arrow">→</div><div class="vf-node vf-hl"><div>仕掛品</div><div class="vf-sub">製造途中</div></div><div class="vf-arrow">→</div><div class="vf-node"><div>製品</div><div class="vf-sub">完成品</div></div><div class="vf-arrow">→</div><div class="vf-node"><div>売上原価</div><div class="vf-sub">販売時</div></div></div><p>仕掛品には製造原価の3要素が集計されます。</p><div class="viz-cost3"><div class="vc3-inputs"><div class="vc3-item vc3-mat">直接材料費</div><div class="vc3-item vc3-lab">直接労務費</div><div class="vc3-item vc3-ovh">製造間接費<span class="vc3-note">(配賦)</span></div></div><div class="vc3-arr">→</div><div class="vc3-box vc3-wip">仕掛品<div class="vc3-sublbl">製造途中</div></div><div class="vc3-arr">→</div><div class="vc3-box vc3-fin">製品<div class="vc3-sublbl">完成品</div></div></div>`,
|
|
||||||
examtips:['商業簿記との違いは「製品原価を製造工程で集計する」点。フロー(材料→仕掛品→製品→売上原価)を図で描けるようにする。', '直接費と間接費の分類:特定製品に跡付けできるか否か。工場長の給与や電力料はすべて間接費。', '製造原価報告書の構造(期首仕掛品+当期製造費用−期末仕掛品=当期製造原価)を押さえる。工業簿記全体の土台になる。'],
|
|
||||||
keypoints:['直接費:特定製品に直接跡付けできる原価','間接費:複数製品に共通して発生→配賦が必要','仕掛品:製造途中の未完成品(期末に残る)','製造原価報告書→損益計算書の売上原価へ連動'],
|
|
||||||
quiz:[
|
|
||||||
{q:'工場の電力料は製造原価のどの区分に含まれるか。',choices:['直接材料費','直接労務費','製造間接費','販売費及び一般管理費'],answer:2,exp:'電力料は複数製品に共通して発生するため製造間接費に分類されます。'},
|
|
||||||
{q:'製造原価の3要素として誤っているものはどれか。',choices:['直接材料費','直接労務費','製造間接費','販売費'],answer:3,exp:'販売費は製造原価ではなく期間費用(販売費及び一般管理費)に分類されます。'},
|
|
||||||
{q:'仕掛品勘定に集計されないものはどれか。',choices:['直接材料費','直接労務費','製造間接費配賦額','販売員の給与'],answer:3,exp:'販売員の給与は製造原価ではなく販売費です。仕掛品には製造原価のみ集計されます。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'i02', num:'I02', title:'材料費の計算',
|
|
||||||
freq:'mid', diff:2,
|
|
||||||
concept:`<p>材料の消費額(材料費)は消費単価×消費量で計算します。</p><div class="formula-box"><div class="formula-label">消費単価の計算方法</div>先入先出法:先に仕入れた材料から順に消費<br>移動平均法:仕入のたびに平均単価を計算<br>総平均法:月末に全体の平均単価を計算</div><div class="formula-box"><div class="formula-label">材料費の計算式</div>材料費 = 月初在庫 + 当月仕入 − 月末在庫<br><br>棚卸減耗費 =(帳簿棚卸数量 − 実地棚卸数量)× 消費単価</div>`,
|
|
||||||
examtips:['先入先出法・移動平均法の計算手順を確実に。物価上昇時は先入先出法の方が材料費が<strong>低くなる</strong>ことを押さえる。', '予定消費単価を使う場合:月末に実際消費単価と比較して「材料消費価格差異」を把握する手順も出題される。', '棚卸減耗費の処理(製造間接費 or 営業外費用)は問題文の指示に従う。どちらの処理も練習する。'],
|
|
||||||
keypoints:['先入先出法:物価上昇時は期末在庫が高め・材料費が低め','移動平均法:仕入のたびに平均計算→実務でよく使われる','予定消費単価:年間平均などを事前設定・差額は材料消費価格差異','棚卸減耗費:原則として製造間接費または営業外費用'],
|
|
||||||
quiz:[
|
|
||||||
{q:'月初在庫¥30,000・当月仕入¥120,000・月末在庫¥25,000のとき当月材料費は?',choices:['¥115,000','¥125,000','¥150,000','¥95,000'],answer:1,exp:'材料費 = 30,000 + 120,000 − 25,000 = 125,000円'},
|
|
||||||
{q:'先入先出法で物価上昇時の材料費は移動平均法と比べてどうなるか。',choices:['高くなる','低くなる','同じになる','計算できない'],answer:1,exp:'先入先出法では古い(安い)材料から消費するため物価上昇時は材料費が低くなります。'},
|
|
||||||
{q:'棚卸減耗費の計算に使う数量の差はどれとどれか。',choices:['帳簿数量と予定消費数量','帳簿棚卸数量と実地棚卸数量','実地数量と予定数量','月初と月末の数量'],answer:1,exp:'棚卸減耗費 =(帳簿棚卸数量 − 実地棚卸数量)× 消費単価'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'i03', num:'I03', title:'労務費と経費',
|
|
||||||
freq:'mid', diff:2,
|
|
||||||
concept:`<p><strong>労務費</strong>は労働に対する対価。直接工の賃金は直接労務費、間接工・工場管理者の給与は間接労務費(製造間接費)。</p><div class="formula-box"><div class="formula-label">消費賃金・賃率差異の計算</div>消費賃金 = 実際消費時間 × 実際賃率(or 予定賃率)<br>賃率差異 =(予定賃率 − 実際賃率)× 実際消費時間</div><p><strong>経費</strong>は材料費・労務費以外の製造原価。<br>外注加工費・特許権使用料 → 直接経費(仕掛品へ直接)<br>工場家賃・減価償却費 → 間接経費(製造間接費へ)</p>`,
|
|
||||||
examtips:['直接工の賃金→直接労務費、間接工・工場管理者の給与→製造間接費(間接労務費)。分類の判断が頻出。', '予定賃率使用時の賃率差異:(予定−実際)×実際時間。プラスが有利差異。符号の向きを確実に。', '外注加工費・特許権使用料→直接経費として仕掛品へ直接集計(製造間接費を経由しない)。'],
|
|
||||||
keypoints:['予定賃率使用時:消費賃金は予定計算→月末に差異把握','賃率差異(有利):実際賃率が予定より低い','直接経費は仕掛品へ直接集計','間接経費は製造間接費へ集計し後で配賦'],
|
|
||||||
quiz:[
|
|
||||||
{q:'直接工の賃金はどのように分類されるか。',choices:['製造間接費','直接労務費','販売費','直接材料費'],answer:1,exp:'直接工(製品に直接携わる作業員)の賃金は直接労務費です。'},
|
|
||||||
{q:'予定賃率¥1,500/時・実際100時間・実際賃率¥1,600/時のとき賃率差異は?',choices:['¥10,000の有利差異','¥10,000の不利差異','¥1,000の有利差異','¥1,000の不利差異'],answer:1,exp:'賃率差異 =(1,500 − 1,600)× 100 = −10,000(不利差異:実際賃率が予定より高かった)'},
|
|
||||||
{q:'工場の減価償却費はどのように分類されるか。',choices:['直接材料費','直接経費','製造間接費','販売費及び一般管理費'],answer:2,exp:'工場の減価償却費は間接経費として製造間接費に分類されます。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'i04', num:'I04', title:'製造間接費の配賦',
|
|
||||||
freq:'high', diff:2,
|
|
||||||
concept:`<p>製造間接費は直接特定製品に割り当てられないため、何らかの基準で<strong>配賦</strong>します。</p><div class="formula-box"><div class="formula-label">予定配賦</div>予定配賦率 = 製造間接費予算額 ÷ 基準操業度<br>予定配賦額 = 予定配賦率 × 実際操業度<br>配賦差異 = 実際発生額 − 予定配賦額(プラス=不利)</div><div class="formula-box"><div class="formula-label">差異の3分析</div>予算差異 = 変動費予算 + 固定費予算 − 実際発生額<br>操業度差異 = 固定費率 ×(実際操業度 − 基準操業度)<br>能率差異 = 変動費率 ×(標準操業度 − 実際操業度)</div>`,
|
|
||||||
examtips:['予定配賦率=製造間接費予算÷基準操業度。配賦差異=実際発生額−予定配賦額(プラスが不利差異)。', '3分析の公式(予算差異・操業度差異・能率差異)はそれぞれの意味と公式を表で整理して暗記する。', '操業度差異は「設備の遊休や過稼働による固定費の回収差」。実際操業度が基準を下回ると不利差異になる。'],
|
|
||||||
keypoints:['配賦基準:直接作業時間・機械時間・直接材料費など','配賦差異 = 実際 − 予定(プラスなら不利差異)','予算差異:コスト管理の問題','操業度差異:設備の遊休・過稼働による差異'],
|
|
||||||
quiz:[
|
|
||||||
{q:'製造間接費予算¥600,000・基準操業度600時間のとき予定配賦率はいくらか。',choices:['¥100/時間','¥1,000/時間','¥600/時間','¥10/時間'],answer:1,exp:'予定配賦率 = 600,000 ÷ 600 = 1,000円/時間'},
|
|
||||||
{q:'予定配賦率¥1,000/時間・実際操業度580時間のとき予定配賦額は?',choices:['¥580,000','¥600,000','¥620,000','¥1,000,000'],answer:0,exp:'予定配賦額 = 1,000 × 580 = 580,000円'},
|
|
||||||
{q:'実際製造間接費¥620,000・予定配賦額¥580,000のとき差異は何か。',choices:['¥40,000の有利差異','¥40,000の不利差異(配賦不足)','¥40,000の配賦過剰','差異なし'],answer:1,exp:'配賦差異 = 実際620,000 − 予定580,000 = 40,000の不利差異(配賦不足)'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'i05', num:'I05', title:'個別原価計算',
|
|
||||||
freq:'mid', diff:2,
|
|
||||||
concept:`<p><strong>個別原価計算</strong>は受注ごとに原価を集計する方法です。製造指図書ごとに原価計算表を作成します。</p><div class="formula-box"><div class="formula-label">原価計算表(例:指図書#101)</div>直接材料費 ¥50,000<br>直接労務費 ¥30,000<br>製造間接費 ¥20,000(配賦)<br>─────────────<br>製造原価合計 ¥100,000</div><p>完成時:(借)製品 /(貸)仕掛品<br>販売時:(借)売上原価 /(貸)製品<br>月末仕掛品:完成していない指図書の原価合計</p>`,
|
|
||||||
examtips:['製造指図書ごとの原価計算表を頭の中に描く。指図書が完成→製品へ振替、未完成→期末仕掛品残高。', '製造間接費は「予定配賦率 × その指図書の操業時間」で按分。配賦額の計算は確実に。', '複数指図書が同時進行する問題では、合計が仕掛品・製品の期末残高と一致するか検算する習慣をつける。'],
|
|
||||||
keypoints:['各指図書を「小さな仕掛品勘定」と考えると整理しやすい','製造間接費は予定配賦率 × その指図書の操業量で按分','指図書が完成 → 製品勘定へ振替','月末に完成していない指図書の合計 → 期末仕掛品残高'],
|
|
||||||
quiz:[
|
|
||||||
{q:'個別原価計算で使用する原価集計の単位はどれか。',choices:['製品の種類ごと','製造工程ごと','製造指図書ごと','月ごと'],answer:2,exp:'個別原価計算では製造指図書(受注)ごとに原価を集計します。'},
|
|
||||||
{q:'直接材料費¥80,000・直接労務費¥40,000・製造間接費配賦額¥30,000のとき製造原価は?',choices:['¥120,000','¥150,000','¥110,000','¥70,000'],answer:1,exp:'製造原価 = 80,000 + 40,000 + 30,000 = 150,000円'},
|
|
||||||
{q:'月末時点で完成していない製造指図書の原価は何に計上されるか。',choices:['製品','売上原価','期末仕掛品','製造間接費'],answer:2,exp:'未完成の指図書の原価は期末仕掛品として仕掛品勘定に残ります。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'i06', num:'I06', title:'総合原価計算',
|
|
||||||
freq:'high', diff:3,
|
|
||||||
concept:`<p><strong>総合原価計算</strong>は同種製品を大量生産する場合に使います。月末仕掛品を完成品換算量に変換して原価を按分します。</p><div class="formula-box"><div class="formula-label">完成品換算量と計算方法</div>月末仕掛品の換算量(加工費)= 月末仕掛品数量 × 加工進捗度<br><br>平均法:単価 =(月初仕掛品原価 + 当月投入原価)÷(完成品量 + 月末換算量)<br>先入先出法:月初仕掛品は先に完成したと仮定して計算</div><p>材料費は<strong>投入時点</strong>(通常始点)、加工費は<strong>加工進捗度</strong>に応じて配分。</p>`,
|
|
||||||
examtips:['加工費の完成品換算量(月末仕掛品数量 × 進捗度)の計算が最頻出。材料費(始点投入)は進捗度不要=数量そのまま。', '平均法と先入先出法の違い:先入先出法は月初仕掛品を先に完成させる前提で計算(月初分を別途計算)。', '検算:完成品原価 + 月末仕掛品原価 = 月初仕掛品原価 + 当月投入原価。計算後は必ず確認する。'],
|
|
||||||
keypoints:['始点投入材料:月末仕掛品も100%消費済み','終点投入材料:月末仕掛品には含まれない','加工費(労務費+製造間接費):進捗度に応じて按分','先入先出法:月初仕掛品分と当月分を分けて計算'],
|
|
||||||
quiz:[
|
|
||||||
{q:'月末仕掛品200個・加工進捗度50%のとき加工費の完成品換算量は?',choices:['200個','100個','150個','400個'],answer:1,exp:'換算量 = 200 × 50% = 100個'},
|
|
||||||
{q:'材料を工程の始点で全量投入する場合、月末仕掛品の材料費の按分は?',choices:['進捗度に応じて按分','月末仕掛品数量分すべて計上','含めない','半分を計上'],answer:1,exp:'始点で全量投入の場合、月末仕掛品も材料費を100%(数量分すべて)負担します。'},
|
|
||||||
{q:'平均法と先入先出法の主な違いはどれか。',choices:['材料費の計算方法が異なる','月初仕掛品の扱い方が異なる','配賦基準が異なる','適用できる業種が異なる'],answer:1,exp:'平均法は月初と当月を一体計算、先入先出法は月初仕掛品を先に完成させる前提で計算します。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'i07', num:'I07', title:'標準原価計算',
|
|
||||||
freq:'high', diff:3,
|
|
||||||
concept:`<p><strong>標準原価計算</strong>はあらかじめ設定した標準原価と実際原価との差異(<strong>原価差異</strong>)を分析します。</p><div class="formula-box"><div class="formula-label">差異分析(直接材料費)</div>価格差異 =(標準価格 − 実際価格)× 実際消費量<br>数量差異 =(標準消費量 − 実際消費量)× 標準価格</div><div class="formula-box"><div class="formula-label">差異分析(直接労務費)</div>賃率差異 =(標準賃率 − 実際賃率)× 実際時間<br>時間差異 =(標準時間 − 実際時間)× 標準賃率</div>`,
|
|
||||||
examtips:['差異の計算:「標準−実際」の符号でプラスが有利・マイナスが不利。価格と数量の2分析公式を確実に暗記。', '価格差異=(標準価格−実際価格)×実際消費量。数量差異=(標準量−実際量)×標準価格。混同に注意。', '製造間接費差異の3分析はI04の配賦差異をさらに細分化したもの。I04の理解が前提になる。'],
|
|
||||||
keypoints:['有利差異:標準より少ないコスト','不利差異:標準より多いコスト(管理改善が必要)','直接労務費差異 → 賃率差異 + 時間差異','製造間接費差異 → 予算差異 + 操業度差異(+能率差異)'],
|
|
||||||
quiz:[
|
|
||||||
{q:'標準価格¥200/kg・実際価格¥210/kg・実際消費量500kgのとき価格差異は?',choices:['¥5,000の有利差異','¥5,000の不利差異','¥500の有利差異','¥500の不利差異'],answer:1,exp:'価格差異 =(200 − 210)× 500 = −5,000(不利差異:実際が標準より高かった)'},
|
|
||||||
{q:'標準消費量600kg・実際消費量580kg・標準価格¥200/kgのとき数量差異は?',choices:['¥4,000の有利差異','¥4,000の不利差異','¥2,000の有利差異','¥2,000の不利差異'],answer:0,exp:'数量差異 =(600 − 580)× 200 = 4,000円(有利差異:実際消費量が標準より少なかった)'},
|
|
||||||
{q:'標準原価計算の主なメリットはどれか。',choices:['実際原価を正確に計算できる','原価差異を通じてコスト管理・改善を促せる','税務上の申告に使用できる','製品の販売価格を自動決定できる'],answer:1,exp:'標準原価計算の主なメリットは原価差異分析によるコスト管理と改善活動への活用です。'}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ id:'i08', num:'I08', title:'直接原価計算とCVP分析',
|
|
||||||
freq:'high', diff:2,
|
|
||||||
concept:`<p><strong>直接原価計算</strong>は変動費のみを製品原価とし、固定費は期間費用として処理します。</p><div class="formula-box"><div class="formula-label">直接原価計算P/L</div>売上高<br>− 変動費(変動製造原価 + 変動販売費)<br>= 貢献利益<br>− 固定費(固定製造間接費 + 固定販売費 + 一般管理費)<br>= 営業利益</div><div class="formula-box"><div class="formula-label">CVP分析(損益分岐点)</div>貢献利益率 = 貢献利益 ÷ 売上高<br>損益分岐点売上高 = 固定費 ÷ 貢献利益率<br>目標利益達成売上高 =(固定費 + 目標利益)÷ 貢献利益率</div><p>損益分岐点グラフ:売上高線と総原価線の交点が損益分岐点です。</p><svg viewBox="0 0 300 190" style="width:100%;max-width:380px;display:block;margin:12px auto;font-family:JetBrains Mono,monospace" aria-label="CVP分析グラフ"><rect width="300" height="190" fill="none"/><line x1="44" y1="10" x2="44" y2="155" stroke="rgba(255,255,255,0.15)" stroke-width="1.5"/><line x1="44" y1="155" x2="285" y2="155" stroke="rgba(255,255,255,0.15)" stroke-width="1.5"/><text x="38" y="158" text-anchor="end" font-size="9" fill="#64748B">0</text><text x="155" y="170" text-anchor="middle" font-size="9" fill="#64748B">販売量</text><text x="22" y="85" text-anchor="middle" font-size="9" fill="#64748B" transform="rotate(-90,22,85)">金額</text><line x1="44" y1="105" x2="275" y2="105" stroke="rgba(251,146,60,0.6)" stroke-width="1.5" stroke-dasharray="5,3"/><text x="278" y="108" font-size="9" fill="#FB923C">固定費</text><line x1="44" y1="155" x2="255" y2="25" stroke="#22D3EE" stroke-width="2"/><text x="258" y="22" font-size="9" fill="#22D3EE">売上高</text><line x1="44" y1="105" x2="255" y2="55" stroke="rgba(167,139,250,0.85)" stroke-width="2"/><text x="258" y="58" font-size="9" fill="#A78BFA">総原価</text><line x1="44" y1="105" x2="44" y2="155" stroke="rgba(251,146,60,0.4)" stroke-width="1.5" stroke-dasharray="3,3"/><circle cx="152" cy="90" r="5" fill="none" stroke="#4ADE80" stroke-width="2"/><line x1="152" y1="90" x2="152" y2="155" stroke="rgba(74,222,128,0.4)" stroke-width="1" stroke-dasharray="3,3"/><text x="152" y="180" text-anchor="middle" font-size="9" fill="#4ADE80">損益分岐点</text><text x="200" y="70" font-size="9" fill="rgba(74,222,128,0.8)">利益ゾーン</text><text x="75" y="135" font-size="9" fill="rgba(248,113,113,0.8)">損失ゾーン</text></svg>`,
|
|
||||||
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円'},
|
|
||||||
{q:'固定費¥300,000・貢献利益率40%のとき損益分岐点売上高は?',choices:['¥120,000','¥500,000','¥750,000','¥300,000'],answer:2,exp:'損益分岐点売上高 = 300,000 ÷ 40% = 750,000円'},
|
|
||||||
{q:'直接原価計算で固定製造間接費はどのように処理するか。',choices:['製品原価に含める','期間費用として当期に全額費用計上','繰延処理する','資産計上する'],answer:1,exp:'直接原価計算では固定製造間接費を製品原価に含めず発生した期の期間費用として全額処理します。'}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
];
|
|
||||||
|
|
||||||
function bokiApp(){
|
|
||||||
return {
|
|
||||||
categories:[],
|
|
||||||
currentUnit:null,
|
|
||||||
quizState:{},
|
|
||||||
search:'',
|
|
||||||
sidebarOpen:false,
|
|
||||||
isDark:true,
|
|
||||||
progress:{},
|
|
||||||
scores:{},
|
|
||||||
wrongUnits:{},
|
|
||||||
keys:['A','B','C','D','E'],
|
|
||||||
// concept fold
|
|
||||||
conceptExpanded:false,
|
|
||||||
// step mode
|
|
||||||
stepMode:false,
|
|
||||||
stepStep:1,
|
|
||||||
stepKpIdx:0,
|
|
||||||
stepFlashRevealed:false,
|
|
||||||
stepDrillIdx:0,
|
|
||||||
stepDrillAnswered:false,
|
|
||||||
stepDrillSelected:-1,
|
|
||||||
// weak drill
|
|
||||||
weakDrillActive:false,
|
|
||||||
weakDrillUnits:[],
|
|
||||||
weakDrillUnitIdx:0,
|
|
||||||
weakDrillQuizState:{},
|
|
||||||
weakDrillResults:[],
|
|
||||||
weakDrillDone:false,
|
|
||||||
|
|
||||||
init(){
|
|
||||||
this.categories = CATEGORIES.map(cat=>({
|
|
||||||
...cat,
|
|
||||||
units: cat.units.map(u=>({...u, catLabel:cat.label}))
|
|
||||||
}));
|
|
||||||
try{ this.progress = JSON.parse(localStorage.getItem('posimai-boki-progress')||'{}'); }
|
|
||||||
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();
|
|
||||||
if(uid){
|
|
||||||
const u=this.allUnits().find(x=>x.id===uid);
|
|
||||||
if(u){ this.currentUnit=u; this.quizState={}; }
|
|
||||||
else{ try{ const url=new URL(window.location.href); url.searchParams.delete('unit'); const q=url.searchParams.toString(); history.replaceState(null,'',url.pathname+(q?'?'+q:'')+url.hash); }catch(e){} }
|
|
||||||
}
|
|
||||||
this.syncUnitToUrl();
|
|
||||||
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
|
||||||
if('serviceWorker' in navigator){
|
|
||||||
navigator.serviceWorker.register('/sw.js').catch(()=>{});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
syncUnitToUrl(){
|
|
||||||
try{
|
|
||||||
const url=new URL(window.location.href);
|
|
||||||
if(this.currentUnit&&this.currentUnit.id) url.searchParams.set('unit',this.currentUnit.id);
|
|
||||||
else url.searchParams.delete('unit');
|
|
||||||
const q=url.searchParams.toString();
|
|
||||||
const path=url.pathname+(q?'?'+q:'')+url.hash;
|
|
||||||
if(path!==window.location.pathname+window.location.search+window.location.hash)
|
|
||||||
history.replaceState(null,'',path);
|
|
||||||
}catch(e){}
|
|
||||||
},
|
|
||||||
|
|
||||||
goHome(){
|
|
||||||
this.currentUnit=null;
|
|
||||||
this.quizState={};
|
|
||||||
this.conceptExpanded=false;
|
|
||||||
this.stepMode=false;
|
|
||||||
this.weakDrillActive=false;
|
|
||||||
this.syncUnitToUrl();
|
|
||||||
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
|
||||||
},
|
|
||||||
|
|
||||||
get filteredCats(){
|
|
||||||
if(!this.search) return this.categories;
|
|
||||||
const q=this.search.toLowerCase();
|
|
||||||
return this.categories.map(cat=>({
|
|
||||||
...cat,
|
|
||||||
units:cat.units.filter(u=>u.title.toLowerCase().includes(q)||u.num.toLowerCase().includes(q))
|
|
||||||
})).filter(cat=>cat.units.length>0);
|
|
||||||
},
|
|
||||||
|
|
||||||
get totalCount(){ return this.categories.reduce((s,c)=>s+c.units.length,0); },
|
|
||||||
get doneCount(){ return Object.keys(this.progress).length; },
|
|
||||||
get progressPct(){ return this.totalCount ? Math.round(this.doneCount/this.totalCount*100) : 0; },
|
|
||||||
|
|
||||||
get quizAnswered(){
|
|
||||||
let n=0;
|
|
||||||
Object.values(this.quizState).forEach(s=>{ if(s) n++; });
|
|
||||||
return n;
|
|
||||||
},
|
|
||||||
get quizCorrect(){
|
|
||||||
let n=0;
|
|
||||||
Object.values(this.quizState).forEach(s=>{ if(s?.correct) n++; });
|
|
||||||
return n;
|
|
||||||
},
|
|
||||||
|
|
||||||
catPct(cat){
|
|
||||||
if(!cat.units.length) return 0;
|
|
||||||
return Math.round(cat.units.filter(u=>this.progress[u.id]).length/cat.units.length*100);
|
|
||||||
},
|
|
||||||
|
|
||||||
allUnits(){ return this.categories.flatMap(c=>c.units); },
|
|
||||||
|
|
||||||
isDone(id){ return !!this.progress[id]; },
|
|
||||||
markDone(){
|
|
||||||
if(!this.currentUnit) return;
|
|
||||||
this.progress[this.currentUnit.id]=true;
|
|
||||||
localStorage.setItem('posimai-boki-progress',JSON.stringify(this.progress));
|
|
||||||
},
|
|
||||||
bestScore(id){
|
|
||||||
const s=this.scores[id];
|
|
||||||
if(!s) return '';
|
|
||||||
return s.best+'/'+s.total;
|
|
||||||
},
|
|
||||||
scoreChipCls(id){
|
|
||||||
const s=this.scores[id];
|
|
||||||
if(!s) return 'zero';
|
|
||||||
if(s.best===s.total) return '';
|
|
||||||
if(s.best>=s.total*0.6) return 'partial';
|
|
||||||
return 'zero';
|
|
||||||
},
|
|
||||||
saveScore(id,correct,total){
|
|
||||||
const prev=this.scores[id];
|
|
||||||
if(!prev||correct>prev.best){
|
|
||||||
this.scores[id]={best:correct,total};
|
|
||||||
localStorage.setItem('posimai-boki-scores',JSON.stringify(this.scores));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
get freqBadgeCls(){
|
|
||||||
const f=this.currentUnit?.freq;
|
|
||||||
if(f==='high') return 'badge badge-high';
|
|
||||||
if(f==='mid') return 'badge badge-mid';
|
|
||||||
return 'badge badge-base';
|
|
||||||
},
|
|
||||||
get freqLabel(){
|
|
||||||
const f=this.currentUnit?.freq;
|
|
||||||
if(f==='high') return '頻出';
|
|
||||||
if(f==='mid') return '重要';
|
|
||||||
return '基礎';
|
|
||||||
},
|
|
||||||
get diffLabel(){
|
|
||||||
const d=this.currentUnit?.diff||1;
|
|
||||||
return '難易度 '+'★'.repeat(d)+'☆'.repeat(3-d);
|
|
||||||
},
|
|
||||||
|
|
||||||
openUnit(unit){
|
|
||||||
this.currentUnit=unit;
|
|
||||||
this.quizState={};
|
|
||||||
this.conceptExpanded=false;
|
|
||||||
this.stepMode=false;
|
|
||||||
this.syncUnitToUrl();
|
|
||||||
this.$nextTick(()=>{
|
|
||||||
if(window.lucide) lucide.createIcons();
|
|
||||||
const m=document.getElementById('main');
|
|
||||||
if(m) m.scrollTo({top:0,behavior:'smooth'});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
// 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];
|
|
||||||
if(!s) return '';
|
|
||||||
return s.correct?'correct':'wrong';
|
|
||||||
},
|
|
||||||
choiceCls(qi,ci,correct){
|
|
||||||
const s=this.quizState[qi];
|
|
||||||
if(!s) return '';
|
|
||||||
if(ci===s.selected && s.correct) return 'sel-ok';
|
|
||||||
if(ci===s.selected && !s.correct) return 'sel-ng';
|
|
||||||
if(ci===correct && !s.correct) return 'rev-ok';
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
get scoreLabel(){
|
|
||||||
const total=this.currentUnit?.quiz?.length||0;
|
|
||||||
const answered=Object.keys(this.quizState).length;
|
|
||||||
const correct=Object.values(this.quizState).filter(s=>s?.correct).length;
|
|
||||||
if(!answered) return total+'問';
|
|
||||||
return correct+'/'+answered+'問正解';
|
|
||||||
},
|
|
||||||
get allAnswered(){
|
|
||||||
const total=this.currentUnit?.quiz?.length||0;
|
|
||||||
return total>0 && Object.keys(this.quizState).length>=total;
|
|
||||||
},
|
|
||||||
get resultScore(){
|
|
||||||
const correct=Object.values(this.quizState).filter(s=>s?.correct).length;
|
|
||||||
const total=this.currentUnit?.quiz?.length||0;
|
|
||||||
if(this.currentUnit) this.saveScore(this.currentUnit.id,correct,total);
|
|
||||||
return correct+' / '+total;
|
|
||||||
},
|
|
||||||
get resultMsg(){
|
|
||||||
const correct=Object.values(this.quizState).filter(s=>s?.correct).length;
|
|
||||||
const total=this.currentUnit?.quiz?.length||0;
|
|
||||||
if(correct===total) return '完璧です!次の単元へ進みましょう。';
|
|
||||||
if(correct>=total*0.8) return 'よくできました。あと少しで完璧です。';
|
|
||||||
if(correct>=total*0.6) return '合格ラインです。間違えた問題の解説を確認しましょう。';
|
|
||||||
return '解説をよく読んで、もう一度チャレンジしてみましょう。';
|
|
||||||
},
|
|
||||||
resetQuiz(){ this.quizState={}; },
|
|
||||||
|
|
||||||
// Navigation
|
|
||||||
currentIdx(){ return this.allUnits().findIndex(u=>u.id===this.currentUnit?.id); },
|
|
||||||
get hasPrev(){ return this.currentIdx()>0; },
|
|
||||||
get hasNext(){ return this.currentIdx()<this.allUnits().length-1; },
|
|
||||||
prevUnit(){
|
|
||||||
const i=this.currentIdx();
|
|
||||||
if(i>0) this.openUnit(this.allUnits()[i-1]);
|
|
||||||
},
|
|
||||||
nextUnit(){
|
|
||||||
const i=this.currentIdx();
|
|
||||||
const all=this.allUnits();
|
|
||||||
if(i<all.length-1) this.openUnit(all[i+1]);
|
|
||||||
},
|
|
||||||
|
|
||||||
toggleTheme(){
|
|
||||||
this.isDark=!this.isDark;
|
|
||||||
const val=this.isDark?'dark':'light';
|
|
||||||
document.documentElement.setAttribute('data-theme',val);
|
|
||||||
localStorage.setItem('posimai-boki-theme',val);
|
|
||||||
},
|
|
||||||
|
|
||||||
// ---- Concept expand ----
|
|
||||||
get conceptPreview(){
|
|
||||||
const c=this.currentUnit?.concept||'';
|
|
||||||
const i=c.indexOf('</p>');
|
|
||||||
return i===-1 ? c : c.substring(0,i+4);
|
|
||||||
},
|
|
||||||
get conceptRest(){
|
|
||||||
const c=this.currentUnit?.concept||'';
|
|
||||||
const i=c.indexOf('</p>');
|
|
||||||
return i===-1 ? '' : c.substring(i+4);
|
|
||||||
},
|
|
||||||
|
|
||||||
// ---- Weak drill ----
|
|
||||||
get weakDrillCandidates(){
|
|
||||||
return this.allUnits()
|
|
||||||
.filter(u=>this.hasWrong(u.id))
|
|
||||||
.sort((a,b)=>{
|
|
||||||
const sa=this.scores[a.id]?.best||0;
|
|
||||||
const sb=this.scores[b.id]?.best||0;
|
|
||||||
return sa-sb;
|
|
||||||
})
|
|
||||||
.slice(0,5);
|
|
||||||
},
|
|
||||||
startWeakDrill(){
|
|
||||||
this.weakDrillUnits=[...this.weakDrillCandidates];
|
|
||||||
this.weakDrillUnitIdx=0;
|
|
||||||
this.weakDrillQuizState={};
|
|
||||||
this.weakDrillResults=[];
|
|
||||||
this.weakDrillDone=false;
|
|
||||||
this.weakDrillActive=true;
|
|
||||||
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
|
||||||
},
|
|
||||||
exitWeakDrill(){
|
|
||||||
this.weakDrillActive=false;
|
|
||||||
this.weakDrillDone=false;
|
|
||||||
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
|
||||||
},
|
|
||||||
get weakDrillCurrentUnit(){
|
|
||||||
return this.weakDrillUnits[this.weakDrillUnitIdx]||null;
|
|
||||||
},
|
|
||||||
wdAnswered(qi){ return !!this.weakDrillQuizState[qi]; },
|
|
||||||
wdQCardCls(qi){
|
|
||||||
const s=this.weakDrillQuizState[qi];
|
|
||||||
if(!s) return '';
|
|
||||||
return s.correct?'correct':'wrong';
|
|
||||||
},
|
|
||||||
wdChoiceCls(qi,ci,correct){
|
|
||||||
const s=this.weakDrillQuizState[qi];
|
|
||||||
if(!s) return '';
|
|
||||||
if(ci===s.selected&&s.correct) return 'sel-ok';
|
|
||||||
if(ci===s.selected&&!s.correct) return 'sel-ng';
|
|
||||||
if(ci===correct&&!s.correct) return 'rev-ok';
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
doWeakDrillAnswer(qi,ci,correct,exp){
|
|
||||||
if(this.weakDrillQuizState[qi]) return;
|
|
||||||
this.weakDrillQuizState[qi]={selected:ci,correct:ci===correct,exp};
|
|
||||||
this.weakDrillQuizState={...this.weakDrillQuizState};
|
|
||||||
},
|
|
||||||
get weakDrillAllAnswered(){
|
|
||||||
const total=this.weakDrillCurrentUnit?.quiz?.length||0;
|
|
||||||
return total>0 && Object.keys(this.weakDrillQuizState).length>=total;
|
|
||||||
},
|
|
||||||
get weakDrillUnitScore(){
|
|
||||||
const correct=Object.values(this.weakDrillQuizState).filter(s=>s?.correct).length;
|
|
||||||
const total=this.weakDrillCurrentUnit?.quiz?.length||0;
|
|
||||||
return correct+' / '+total;
|
|
||||||
},
|
|
||||||
nextWeakDrillUnit(){
|
|
||||||
const unit=this.weakDrillCurrentUnit;
|
|
||||||
if(!unit) return;
|
|
||||||
const correct=Object.values(this.weakDrillQuizState).filter(s=>s?.correct).length;
|
|
||||||
const total=unit.quiz?.length||0;
|
|
||||||
this.weakDrillResults.push({unitId:unit.id,num:unit.num,unitTitle:unit.title,correct,total});
|
|
||||||
// Update wrong tracking
|
|
||||||
if(correct>=total){
|
|
||||||
delete this.wrongUnits[unit.id];
|
|
||||||
localStorage.setItem('posimai-boki-wrong',JSON.stringify(this.wrongUnits));
|
|
||||||
this.wrongUnits={...this.wrongUnits};
|
|
||||||
}
|
|
||||||
if(this.weakDrillUnitIdx<this.weakDrillUnits.length-1){
|
|
||||||
this.weakDrillUnitIdx++;
|
|
||||||
this.weakDrillQuizState={};
|
|
||||||
} else {
|
|
||||||
this.weakDrillDone=true;
|
|
||||||
}
|
|
||||||
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
|
||||||
},
|
|
||||||
get weakDrillClearCount(){
|
|
||||||
return this.weakDrillResults.filter(r=>r.correct>=r.total).length;
|
|
||||||
},
|
|
||||||
|
|
||||||
// ---- Step mode ----
|
|
||||||
startStepMode(){
|
|
||||||
this.stepMode=true;
|
|
||||||
this.stepStep=1;
|
|
||||||
this.stepKpIdx=0;
|
|
||||||
this.resetFlashRevealState();
|
|
||||||
this.stepDrillIdx=0;
|
|
||||||
this.stepDrillAnswered=false;
|
|
||||||
this.stepDrillSelected=-1;
|
|
||||||
this.quizState={};
|
|
||||||
this.$nextTick(()=>{
|
|
||||||
if(window.lucide) lucide.createIcons();
|
|
||||||
const m=document.getElementById('main');
|
|
||||||
if(m) m.scrollTo({top:0,behavior:'smooth'});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
exitStepMode(){
|
|
||||||
this.stepMode=false;
|
|
||||||
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
|
||||||
},
|
|
||||||
stepPipCls(n){
|
|
||||||
if(this.stepStep===n) return 's-active';
|
|
||||||
if(this.stepStep>n) return 's-done';
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
_kpDelimiterIndex(kp){
|
|
||||||
if(!kp||typeof kp!=='string') return -1;
|
|
||||||
const iw=kp.indexOf(':');
|
|
||||||
const ia=kp.indexOf(':');
|
|
||||||
if(iw<0&&ia<0) return -1;
|
|
||||||
if(iw<0) return ia;
|
|
||||||
if(ia<0) return iw;
|
|
||||||
return Math.min(iw,ia);
|
|
||||||
},
|
|
||||||
keypointHasFlip(idx){
|
|
||||||
const kp=(this.currentUnit?.keypoints||[])[idx];
|
|
||||||
const i=this._kpDelimiterIndex(kp);
|
|
||||||
return i>0;
|
|
||||||
},
|
|
||||||
keypointTerm(idx){
|
|
||||||
const kp=(this.currentUnit?.keypoints||[])[idx];
|
|
||||||
const i=this._kpDelimiterIndex(kp);
|
|
||||||
return i>0 ? kp.slice(0,i).trim() : '';
|
|
||||||
},
|
|
||||||
resetFlashRevealState(){
|
|
||||||
this.stepFlashRevealed=!this.keypointHasFlip(this.stepKpIdx);
|
|
||||||
},
|
|
||||||
advanceStep1Card(){
|
|
||||||
if(this.stepStep!==1) return;
|
|
||||||
if(this.keypointHasFlip(this.stepKpIdx)&&!this.stepFlashRevealed){
|
|
||||||
this.stepFlashRevealed=true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.nextStepFlash();
|
|
||||||
},
|
|
||||||
nextStepFlash(){
|
|
||||||
const kps=this.currentUnit?.keypoints||[];
|
|
||||||
if(this.stepKpIdx<kps.length-1){
|
|
||||||
this.stepKpIdx++;
|
|
||||||
this.resetFlashRevealState();
|
|
||||||
} else {
|
|
||||||
// All keypoints done — go to step 2 (or 3 if no drills)
|
|
||||||
const drills=DRILLS[this.currentUnit?.id]||[];
|
|
||||||
this.stepStep=drills.length>0 ? 2 : 3;
|
|
||||||
this.stepDrillIdx=0;
|
|
||||||
this.stepDrillAnswered=false;
|
|
||||||
this.stepDrillSelected=-1;
|
|
||||||
if(this.stepStep===3){
|
|
||||||
this.$nextTick(()=>{
|
|
||||||
const m=document.getElementById('main');
|
|
||||||
if(m) m.scrollTo({top:m.scrollHeight,behavior:'smooth'});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
|
||||||
}
|
|
||||||
},
|
|
||||||
get unitDrills(){
|
|
||||||
return DRILLS[this.currentUnit?.id]||[];
|
|
||||||
},
|
|
||||||
get unitVizHtml(){
|
|
||||||
const c=this.currentUnit?.concept||'';
|
|
||||||
if(!c) return '';
|
|
||||||
const d=document.createElement('div');
|
|
||||||
d.innerHTML=c;
|
|
||||||
const v=d.querySelector('.viz-taccount');
|
|
||||||
return v?v.outerHTML:'';
|
|
||||||
},
|
|
||||||
doStepDrill(ci){
|
|
||||||
if(this.stepDrillAnswered) return;
|
|
||||||
this.stepDrillSelected=ci;
|
|
||||||
this.stepDrillAnswered=true;
|
|
||||||
},
|
|
||||||
nextStepDrill(){
|
|
||||||
const drills=this.unitDrills;
|
|
||||||
if(this.stepDrillIdx<drills.length-1){
|
|
||||||
this.stepDrillIdx++;
|
|
||||||
this.stepDrillAnswered=false;
|
|
||||||
this.stepDrillSelected=-1;
|
|
||||||
} else {
|
|
||||||
// All drills done — go to step 3
|
|
||||||
this.stepStep=3;
|
|
||||||
this.$nextTick(()=>{
|
|
||||||
if(window.lucide) lucide.createIcons();
|
|
||||||
const m=document.getElementById('main');
|
|
||||||
if(m) m.scrollTo({top:m.scrollHeight,behavior:'smooth'});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,501 @@
|
||||||
|
/**
|
||||||
|
* Alpine アプリ本体。単元データは ./data/categories.js と ./data/drills.js。
|
||||||
|
* 表示系 HTML は safeHtml() 経由(DOMPurify)でサニタイズすること。
|
||||||
|
*/
|
||||||
|
import { DRILLS } from './data/drills.js';
|
||||||
|
import { CATEGORIES } from './data/categories.js';
|
||||||
|
|
||||||
|
function sanitizeTrustedHtml(dirty) {
|
||||||
|
if (dirty == null || dirty === '') return '';
|
||||||
|
const s = String(dirty);
|
||||||
|
if (typeof window.DOMPurify === 'undefined') {
|
||||||
|
const d = document.createElement('div');
|
||||||
|
d.textContent = s;
|
||||||
|
return d.innerHTML;
|
||||||
|
}
|
||||||
|
return window.DOMPurify.sanitize(s, {
|
||||||
|
USE_PROFILES: { html: true, svg: true, svgFilters: true },
|
||||||
|
ALLOW_UNKNOWN_PROTOCOLS: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('alpine:init', () => {
|
||||||
|
Alpine.data('bokiApp', () => ({
|
||||||
|
safeHtml(s) {
|
||||||
|
return sanitizeTrustedHtml(s);
|
||||||
|
},
|
||||||
|
categories:[],
|
||||||
|
currentUnit:null,
|
||||||
|
quizState:{},
|
||||||
|
search:'',
|
||||||
|
sidebarOpen:false,
|
||||||
|
isDark:true,
|
||||||
|
progress:{},
|
||||||
|
scores:{},
|
||||||
|
wrongUnits:{},
|
||||||
|
keys:['A','B','C','D','E'],
|
||||||
|
// concept fold
|
||||||
|
conceptExpanded:false,
|
||||||
|
// step mode
|
||||||
|
stepMode:false,
|
||||||
|
stepStep:1,
|
||||||
|
stepKpIdx:0,
|
||||||
|
stepFlashRevealed:false,
|
||||||
|
stepDrillIdx:0,
|
||||||
|
stepDrillAnswered:false,
|
||||||
|
stepDrillSelected:-1,
|
||||||
|
// weak drill
|
||||||
|
weakDrillActive:false,
|
||||||
|
weakDrillUnits:[],
|
||||||
|
weakDrillUnitIdx:0,
|
||||||
|
weakDrillQuizState:{},
|
||||||
|
weakDrillResults:[],
|
||||||
|
weakDrillDone:false,
|
||||||
|
|
||||||
|
init(){
|
||||||
|
this.categories = CATEGORIES.map(cat=>({
|
||||||
|
...cat,
|
||||||
|
units: cat.units.map(u=>({...u, catLabel:cat.label}))
|
||||||
|
}));
|
||||||
|
try{ this.progress = JSON.parse(localStorage.getItem('posimai-boki-progress')||'{}'); }
|
||||||
|
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();
|
||||||
|
if(uid){
|
||||||
|
const u=this.allUnits().find(x=>x.id===uid);
|
||||||
|
if(u){ this.currentUnit=u; this.quizState={}; }
|
||||||
|
else{ try{ const url=new URL(window.location.href); url.searchParams.delete('unit'); const q=url.searchParams.toString(); history.replaceState(null,'',url.pathname+(q?'?'+q:'')+url.hash); }catch(e){} }
|
||||||
|
}
|
||||||
|
this.syncUnitToUrl();
|
||||||
|
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
||||||
|
if('serviceWorker' in navigator){
|
||||||
|
navigator.serviceWorker.register('/sw.js').catch(()=>{});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
syncUnitToUrl(){
|
||||||
|
try{
|
||||||
|
const url=new URL(window.location.href);
|
||||||
|
if(this.currentUnit&&this.currentUnit.id) url.searchParams.set('unit',this.currentUnit.id);
|
||||||
|
else url.searchParams.delete('unit');
|
||||||
|
const q=url.searchParams.toString();
|
||||||
|
const path=url.pathname+(q?'?'+q:'')+url.hash;
|
||||||
|
if(path!==window.location.pathname+window.location.search+window.location.hash)
|
||||||
|
history.replaceState(null,'',path);
|
||||||
|
}catch(e){}
|
||||||
|
},
|
||||||
|
|
||||||
|
goHome(){
|
||||||
|
this.currentUnit=null;
|
||||||
|
this.quizState={};
|
||||||
|
this.conceptExpanded=false;
|
||||||
|
this.stepMode=false;
|
||||||
|
this.weakDrillActive=false;
|
||||||
|
this.syncUnitToUrl();
|
||||||
|
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
||||||
|
},
|
||||||
|
|
||||||
|
get filteredCats(){
|
||||||
|
if(!this.search) return this.categories;
|
||||||
|
const q=this.search.toLowerCase();
|
||||||
|
return this.categories.map(cat=>({
|
||||||
|
...cat,
|
||||||
|
units:cat.units.filter(u=>u.title.toLowerCase().includes(q)||u.num.toLowerCase().includes(q))
|
||||||
|
})).filter(cat=>cat.units.length>0);
|
||||||
|
},
|
||||||
|
|
||||||
|
get totalCount(){ return this.categories.reduce((s,c)=>s+c.units.length,0); },
|
||||||
|
get doneCount(){ return Object.keys(this.progress).length; },
|
||||||
|
get progressPct(){ return this.totalCount ? Math.round(this.doneCount/this.totalCount*100) : 0; },
|
||||||
|
|
||||||
|
get quizAnswered(){
|
||||||
|
let n=0;
|
||||||
|
Object.values(this.quizState).forEach(s=>{ if(s) n++; });
|
||||||
|
return n;
|
||||||
|
},
|
||||||
|
get quizCorrect(){
|
||||||
|
let n=0;
|
||||||
|
Object.values(this.quizState).forEach(s=>{ if(s?.correct) n++; });
|
||||||
|
return n;
|
||||||
|
},
|
||||||
|
|
||||||
|
catPct(cat){
|
||||||
|
if(!cat.units.length) return 0;
|
||||||
|
return Math.round(cat.units.filter(u=>this.progress[u.id]).length/cat.units.length*100);
|
||||||
|
},
|
||||||
|
|
||||||
|
allUnits(){ return this.categories.flatMap(c=>c.units); },
|
||||||
|
|
||||||
|
isDone(id){ return !!this.progress[id]; },
|
||||||
|
markDone(){
|
||||||
|
if(!this.currentUnit) return;
|
||||||
|
this.progress[this.currentUnit.id]=true;
|
||||||
|
localStorage.setItem('posimai-boki-progress',JSON.stringify(this.progress));
|
||||||
|
},
|
||||||
|
bestScore(id){
|
||||||
|
const s=this.scores[id];
|
||||||
|
if(!s) return '';
|
||||||
|
return s.best+'/'+s.total;
|
||||||
|
},
|
||||||
|
scoreChipCls(id){
|
||||||
|
const s=this.scores[id];
|
||||||
|
if(!s) return 'zero';
|
||||||
|
if(s.best===s.total) return '';
|
||||||
|
if(s.best>=s.total*0.6) return 'partial';
|
||||||
|
return 'zero';
|
||||||
|
},
|
||||||
|
saveScore(id,correct,total){
|
||||||
|
const prev=this.scores[id];
|
||||||
|
if(!prev||correct>prev.best){
|
||||||
|
this.scores[id]={best:correct,total};
|
||||||
|
localStorage.setItem('posimai-boki-scores',JSON.stringify(this.scores));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
get freqBadgeCls(){
|
||||||
|
const f=this.currentUnit?.freq;
|
||||||
|
if(f==='high') return 'badge badge-high';
|
||||||
|
if(f==='mid') return 'badge badge-mid';
|
||||||
|
return 'badge badge-base';
|
||||||
|
},
|
||||||
|
get freqLabel(){
|
||||||
|
const f=this.currentUnit?.freq;
|
||||||
|
if(f==='high') return '頻出';
|
||||||
|
if(f==='mid') return '重要';
|
||||||
|
return '基礎';
|
||||||
|
},
|
||||||
|
get diffLabel(){
|
||||||
|
const d=this.currentUnit?.diff||1;
|
||||||
|
return '難易度 '+'★'.repeat(d)+'☆'.repeat(3-d);
|
||||||
|
},
|
||||||
|
|
||||||
|
openUnit(unit){
|
||||||
|
this.currentUnit=unit;
|
||||||
|
this.quizState={};
|
||||||
|
this.conceptExpanded=false;
|
||||||
|
this.stepMode=false;
|
||||||
|
this.syncUnitToUrl();
|
||||||
|
this.$nextTick(()=>{
|
||||||
|
if(window.lucide) lucide.createIcons();
|
||||||
|
const m=document.getElementById('main');
|
||||||
|
if(m) m.scrollTo({top:0,behavior:'smooth'});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// 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];
|
||||||
|
if(!s) return '';
|
||||||
|
return s.correct?'correct':'wrong';
|
||||||
|
},
|
||||||
|
choiceCls(qi,ci,correct){
|
||||||
|
const s=this.quizState[qi];
|
||||||
|
if(!s) return '';
|
||||||
|
if(ci===s.selected && s.correct) return 'sel-ok';
|
||||||
|
if(ci===s.selected && !s.correct) return 'sel-ng';
|
||||||
|
if(ci===correct && !s.correct) return 'rev-ok';
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
get scoreLabel(){
|
||||||
|
const total=this.currentUnit?.quiz?.length||0;
|
||||||
|
const answered=Object.keys(this.quizState).length;
|
||||||
|
const correct=Object.values(this.quizState).filter(s=>s?.correct).length;
|
||||||
|
if(!answered) return total+'問';
|
||||||
|
return correct+'/'+answered+'問正解';
|
||||||
|
},
|
||||||
|
get allAnswered(){
|
||||||
|
const total=this.currentUnit?.quiz?.length||0;
|
||||||
|
return total>0 && Object.keys(this.quizState).length>=total;
|
||||||
|
},
|
||||||
|
get resultScore(){
|
||||||
|
const correct=Object.values(this.quizState).filter(s=>s?.correct).length;
|
||||||
|
const total=this.currentUnit?.quiz?.length||0;
|
||||||
|
if(this.currentUnit) this.saveScore(this.currentUnit.id,correct,total);
|
||||||
|
return correct+' / '+total;
|
||||||
|
},
|
||||||
|
get resultMsg(){
|
||||||
|
const correct=Object.values(this.quizState).filter(s=>s?.correct).length;
|
||||||
|
const total=this.currentUnit?.quiz?.length||0;
|
||||||
|
if(correct===total) return '完璧です!次の単元へ進みましょう。';
|
||||||
|
if(correct>=total*0.8) return 'よくできました。あと少しで完璧です。';
|
||||||
|
if(correct>=total*0.6) return '合格ラインです。間違えた問題の解説を確認しましょう。';
|
||||||
|
return '解説をよく読んで、もう一度チャレンジしてみましょう。';
|
||||||
|
},
|
||||||
|
resetQuiz(){ this.quizState={}; },
|
||||||
|
|
||||||
|
// Navigation
|
||||||
|
currentIdx(){ return this.allUnits().findIndex(u=>u.id===this.currentUnit?.id); },
|
||||||
|
get hasPrev(){ return this.currentIdx()>0; },
|
||||||
|
get hasNext(){ return this.currentIdx()<this.allUnits().length-1; },
|
||||||
|
prevUnit(){
|
||||||
|
const i=this.currentIdx();
|
||||||
|
if(i>0) this.openUnit(this.allUnits()[i-1]);
|
||||||
|
},
|
||||||
|
nextUnit(){
|
||||||
|
const i=this.currentIdx();
|
||||||
|
const all=this.allUnits();
|
||||||
|
if(i<all.length-1) this.openUnit(all[i+1]);
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleTheme(){
|
||||||
|
this.isDark=!this.isDark;
|
||||||
|
const val=this.isDark?'dark':'light';
|
||||||
|
document.documentElement.setAttribute('data-theme',val);
|
||||||
|
localStorage.setItem('posimai-boki-theme',val);
|
||||||
|
},
|
||||||
|
|
||||||
|
// ---- Concept expand ----
|
||||||
|
get conceptPreview(){
|
||||||
|
const c=this.currentUnit?.concept||'';
|
||||||
|
const i=c.indexOf('</p>');
|
||||||
|
return i===-1 ? c : c.substring(0,i+4);
|
||||||
|
},
|
||||||
|
get conceptRest(){
|
||||||
|
const c=this.currentUnit?.concept||'';
|
||||||
|
const i=c.indexOf('</p>');
|
||||||
|
return i===-1 ? '' : c.substring(i+4);
|
||||||
|
},
|
||||||
|
|
||||||
|
// ---- Weak drill ----
|
||||||
|
get weakDrillCandidates(){
|
||||||
|
return this.allUnits()
|
||||||
|
.filter(u=>this.hasWrong(u.id))
|
||||||
|
.sort((a,b)=>{
|
||||||
|
const sa=this.scores[a.id]?.best||0;
|
||||||
|
const sb=this.scores[b.id]?.best||0;
|
||||||
|
return sa-sb;
|
||||||
|
})
|
||||||
|
.slice(0,5);
|
||||||
|
},
|
||||||
|
startWeakDrill(){
|
||||||
|
this.weakDrillUnits=[...this.weakDrillCandidates];
|
||||||
|
this.weakDrillUnitIdx=0;
|
||||||
|
this.weakDrillQuizState={};
|
||||||
|
this.weakDrillResults=[];
|
||||||
|
this.weakDrillDone=false;
|
||||||
|
this.weakDrillActive=true;
|
||||||
|
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
||||||
|
},
|
||||||
|
exitWeakDrill(){
|
||||||
|
this.weakDrillActive=false;
|
||||||
|
this.weakDrillDone=false;
|
||||||
|
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
||||||
|
},
|
||||||
|
get weakDrillCurrentUnit(){
|
||||||
|
return this.weakDrillUnits[this.weakDrillUnitIdx]||null;
|
||||||
|
},
|
||||||
|
wdAnswered(qi){ return !!this.weakDrillQuizState[qi]; },
|
||||||
|
wdQCardCls(qi){
|
||||||
|
const s=this.weakDrillQuizState[qi];
|
||||||
|
if(!s) return '';
|
||||||
|
return s.correct?'correct':'wrong';
|
||||||
|
},
|
||||||
|
wdChoiceCls(qi,ci,correct){
|
||||||
|
const s=this.weakDrillQuizState[qi];
|
||||||
|
if(!s) return '';
|
||||||
|
if(ci===s.selected&&s.correct) return 'sel-ok';
|
||||||
|
if(ci===s.selected&&!s.correct) return 'sel-ng';
|
||||||
|
if(ci===correct&&!s.correct) return 'rev-ok';
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
doWeakDrillAnswer(qi,ci,correct,exp){
|
||||||
|
if(this.weakDrillQuizState[qi]) return;
|
||||||
|
this.weakDrillQuizState[qi]={selected:ci,correct:ci===correct,exp};
|
||||||
|
this.weakDrillQuizState={...this.weakDrillQuizState};
|
||||||
|
},
|
||||||
|
get weakDrillAllAnswered(){
|
||||||
|
const total=this.weakDrillCurrentUnit?.quiz?.length||0;
|
||||||
|
return total>0 && Object.keys(this.weakDrillQuizState).length>=total;
|
||||||
|
},
|
||||||
|
get weakDrillUnitScore(){
|
||||||
|
const correct=Object.values(this.weakDrillQuizState).filter(s=>s?.correct).length;
|
||||||
|
const total=this.weakDrillCurrentUnit?.quiz?.length||0;
|
||||||
|
return correct+' / '+total;
|
||||||
|
},
|
||||||
|
nextWeakDrillUnit(){
|
||||||
|
const unit=this.weakDrillCurrentUnit;
|
||||||
|
if(!unit) return;
|
||||||
|
const correct=Object.values(this.weakDrillQuizState).filter(s=>s?.correct).length;
|
||||||
|
const total=unit.quiz?.length||0;
|
||||||
|
this.weakDrillResults.push({unitId:unit.id,num:unit.num,unitTitle:unit.title,correct,total});
|
||||||
|
// Update wrong tracking
|
||||||
|
if(correct>=total){
|
||||||
|
delete this.wrongUnits[unit.id];
|
||||||
|
localStorage.setItem('posimai-boki-wrong',JSON.stringify(this.wrongUnits));
|
||||||
|
this.wrongUnits={...this.wrongUnits};
|
||||||
|
}
|
||||||
|
if(this.weakDrillUnitIdx<this.weakDrillUnits.length-1){
|
||||||
|
this.weakDrillUnitIdx++;
|
||||||
|
this.weakDrillQuizState={};
|
||||||
|
} else {
|
||||||
|
this.weakDrillDone=true;
|
||||||
|
}
|
||||||
|
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
||||||
|
},
|
||||||
|
get weakDrillClearCount(){
|
||||||
|
return this.weakDrillResults.filter(r=>r.correct>=r.total).length;
|
||||||
|
},
|
||||||
|
|
||||||
|
// ---- Step mode ----
|
||||||
|
startStepMode(){
|
||||||
|
this.stepMode=true;
|
||||||
|
this.stepStep=1;
|
||||||
|
this.stepKpIdx=0;
|
||||||
|
this.resetFlashRevealState();
|
||||||
|
this.stepDrillIdx=0;
|
||||||
|
this.stepDrillAnswered=false;
|
||||||
|
this.stepDrillSelected=-1;
|
||||||
|
this.quizState={};
|
||||||
|
this.$nextTick(()=>{
|
||||||
|
if(window.lucide) lucide.createIcons();
|
||||||
|
const m=document.getElementById('main');
|
||||||
|
if(m) m.scrollTo({top:0,behavior:'smooth'});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
exitStepMode(){
|
||||||
|
this.stepMode=false;
|
||||||
|
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
||||||
|
},
|
||||||
|
stepPipCls(n){
|
||||||
|
if(this.stepStep===n) return 's-active';
|
||||||
|
if(this.stepStep>n) return 's-done';
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
_kpDelimiterIndex(kp){
|
||||||
|
if(!kp||typeof kp!=='string') return -1;
|
||||||
|
const iw=kp.indexOf(':');
|
||||||
|
const ia=kp.indexOf(':');
|
||||||
|
if(iw<0&&ia<0) return -1;
|
||||||
|
if(iw<0) return ia;
|
||||||
|
if(ia<0) return iw;
|
||||||
|
return Math.min(iw,ia);
|
||||||
|
},
|
||||||
|
keypointHasFlip(idx){
|
||||||
|
const kp=(this.currentUnit?.keypoints||[])[idx];
|
||||||
|
const i=this._kpDelimiterIndex(kp);
|
||||||
|
return i>0;
|
||||||
|
},
|
||||||
|
keypointTerm(idx){
|
||||||
|
const kp=(this.currentUnit?.keypoints||[])[idx];
|
||||||
|
const i=this._kpDelimiterIndex(kp);
|
||||||
|
return i>0 ? kp.slice(0,i).trim() : '';
|
||||||
|
},
|
||||||
|
resetFlashRevealState(){
|
||||||
|
this.stepFlashRevealed=!this.keypointHasFlip(this.stepKpIdx);
|
||||||
|
},
|
||||||
|
advanceStep1Card(){
|
||||||
|
if(this.stepStep!==1) return;
|
||||||
|
if(this.keypointHasFlip(this.stepKpIdx)&&!this.stepFlashRevealed){
|
||||||
|
this.stepFlashRevealed=true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.nextStepFlash();
|
||||||
|
},
|
||||||
|
nextStepFlash(){
|
||||||
|
const kps=this.currentUnit?.keypoints||[];
|
||||||
|
if(this.stepKpIdx<kps.length-1){
|
||||||
|
this.stepKpIdx++;
|
||||||
|
this.resetFlashRevealState();
|
||||||
|
} else {
|
||||||
|
// All keypoints done — go to step 2 (or 3 if no drills)
|
||||||
|
const drills=DRILLS[this.currentUnit?.id]||[];
|
||||||
|
this.stepStep=drills.length>0 ? 2 : 3;
|
||||||
|
this.stepDrillIdx=0;
|
||||||
|
this.stepDrillAnswered=false;
|
||||||
|
this.stepDrillSelected=-1;
|
||||||
|
if(this.stepStep===3){
|
||||||
|
this.$nextTick(()=>{
|
||||||
|
const m=document.getElementById('main');
|
||||||
|
if(m) m.scrollTo({top:m.scrollHeight,behavior:'smooth'});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.$nextTick(()=>{ if(window.lucide) lucide.createIcons(); });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
get unitDrills(){
|
||||||
|
return DRILLS[this.currentUnit?.id]||[];
|
||||||
|
},
|
||||||
|
get unitVizHtml(){
|
||||||
|
const c=this.currentUnit?.concept||'';
|
||||||
|
if(!c) return '';
|
||||||
|
const d=document.createElement('div');
|
||||||
|
d.innerHTML=sanitizeTrustedHtml(c);
|
||||||
|
const v=d.querySelector('.viz-taccount');
|
||||||
|
return v?v.outerHTML:'';
|
||||||
|
},
|
||||||
|
doStepDrill(ci){
|
||||||
|
if(this.stepDrillAnswered) return;
|
||||||
|
this.stepDrillSelected=ci;
|
||||||
|
this.stepDrillAnswered=true;
|
||||||
|
},
|
||||||
|
nextStepDrill(){
|
||||||
|
const drills=this.unitDrills;
|
||||||
|
if(this.stepDrillIdx<drills.length-1){
|
||||||
|
this.stepDrillIdx++;
|
||||||
|
this.stepDrillAnswered=false;
|
||||||
|
this.stepDrillSelected=-1;
|
||||||
|
} else {
|
||||||
|
// All drills done — go to step 3
|
||||||
|
this.stepStep=3;
|
||||||
|
this.$nextTick(()=>{
|
||||||
|
if(window.lucide) lucide.createIcons();
|
||||||
|
const m=document.getElementById('main');
|
||||||
|
if(m) m.scrollTo({top:m.scrollHeight,behavior:'smooth'});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,261 @@
|
||||||
|
export const CATEGORIES = [
|
||||||
|
{ id:'commercial', label:'商業簿記', icon:'landmark', units:[
|
||||||
|
{ id:'c01', num:'C01', title:'仕訳の基礎復習', freq:'high', diff:1,
|
||||||
|
concept:`<p><strong>仕訳</strong>とは取引を借方(左)と貸方(右)に分けて記録する作業です。<span class="hl">借方合計 = 貸方合計</span> が常に成立します。</p><div class="viz-taccount"><div class="tac-header">T 勘 定</div><div class="tac-body"><div class="tac-side tac-dr"><div class="tac-side-label">借方(左側)</div><div class="tac-side-desc">資産の増加<br>負債の減少<br>純資産の減少<br>費用の発生</div></div><div class="tac-divider"></div><div class="tac-side tac-cr"><div class="tac-side-label">貸方(右側)</div><div class="tac-side-desc">資産の減少<br>負債の増加<br>純資産の増加<br>収益の発生</div></div></div></div><p>勘定科目は5グループに分類されます。</p><div class="viz-groups"><div class="vg-card vg-asset"><div class="vg-name">資産</div><div class="vg-rule">増加→借方<br>減少→貸方</div></div><div class="vg-card vg-liability"><div class="vg-name">負債</div><div class="vg-rule">増加→貸方<br>減少→借方</div></div><div class="vg-card vg-equity"><div class="vg-name">純資産</div><div class="vg-rule">増加→貸方<br>減少→借方</div></div><div class="vg-card vg-revenue"><div class="vg-name">収益</div><div class="vg-rule">発生→貸方<br>消滅→借方</div></div><div class="vg-card vg-expense"><div class="vg-name">費用</div><div class="vg-rule">発生→借方<br>消滅→貸方</div></div></div><p>例:商品¥100,000を掛けで仕入れた</p><div class="journal-wrap"><table class="journal-table"><tr><th>科目</th><th>金額</th><th>科目</th><th>金額</th></tr><tr><td class="dr">仕入</td><td class="amount">100,000</td><td class="cr">買掛金</td><td class="amount">100,000</td></tr></table></div>`,
|
||||||
|
examtips:['第1問の仕訳問題は5問×4点=<strong>20点</strong>。確実に取りに行く単元。','勘定科目名は<strong>正式名称</strong>で書くこと(例:「売掛」ではなく「売掛金」)。略称は不正解。','複合仕訳(借方または貸方が複数行)も頻出。合計金額が一致するか必ず確認。'],
|
||||||
|
keypoints:['資産の増加 → 借方、減少 → 貸方','負債・純資産の増加 → 貸方、減少 → 借方','費用の発生 → 借方、収益の発生 → 貸方','<strong>貸借平均の原理</strong>:借方合計と貸方合計は必ず一致する'],
|
||||||
|
quiz:[
|
||||||
|
{q:'現金¥50,000を受け取り売上として計上した。正しい仕訳はどれか。',choices:['現金 50,000 /売上 50,000','売上 50,000 /現金 50,000','現金 50,000 /買掛金 50,000','売掛金 50,000 /売上 50,000'],answer:0,exp:'現金(資産)の増加は借方。売上(収益)の発生は貸方。'},
|
||||||
|
{q:'負債が増加するとき、仕訳上どちらに記載するか。',choices:['借方(左側)','貸方(右側)','どちらでもよい','仕訳不要'],answer:1,exp:'負債の増加は貸方(右側)に記載します。減少は借方です。'},
|
||||||
|
{q:'費用の発生は仕訳のどちらに記載するか。',choices:['貸方','借方','どちらでもない','発生しない'],answer:1,exp:'費用の発生は借方(左側)に記載します。'},
|
||||||
|
{q:'建物¥5,000,000を購入し、代金のうち¥2,000,000は現金で支払い、残額は来月払いとした。この取引の仕訳として正しいものはどれか。',choices:['建物5,000,000 /現金2,000,000・未払金3,000,000','建物2,000,000 /現金2,000,000','現金5,000,000 /建物5,000,000','建物5,000,000 /買掛金5,000,000'],answer:0,exp:'複合仕訳。建物(資産)全額借方、現金(資産)減少と未払金(負債)増加を貸方に。買掛金は商品の掛け仕入に使う勘定で、固定資産は未払金を使う。'},
|
||||||
|
{q:'当期に未収収益¥30,000(前期に計上した利息の未収分)を現金で受け取った。仕訳として正しいものはどれか。',choices:['現金30,000 /受取利息30,000','現金30,000 /未収収益30,000','未収収益30,000 /現金30,000','受取利息30,000 /現金30,000'],answer:1,exp:'前期に未収収益(資産)として計上済みの利息を受け取ったので、未収収益(資産)を減らし現金(資産)を増やす。受取利息を使うと二重計上になる。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c02', num:'C02', title:'商品売買と売上原価', freq:'high', diff:1,
|
||||||
|
concept:`<p>2級では<strong>三分法</strong>が基本です。仕入・売上・繰越商品の3勘定を使います。</p><div class="formula-box"><div class="formula-label">売上原価の算定(決算整理仕訳)</div>①(借)仕入 /(貸)繰越商品 ← 期首商品を仕入に振替<br>②(借)繰越商品 /(貸)仕入 ← 期末商品を控除<br><br>売上原価 = 期首商品 + 当期仕入 − 期末商品</div><p>例:期首¥30,000・仕入¥200,000・期末¥40,000 → 売上原価 <span class="hl">¥190,000</span></p>`,
|
||||||
|
examtips:['精算表(第3問)で必出。決算整理仕訳の<strong>2本セット</strong>(期首振替・期末控除)を忘れずに。','「売上原価 = 期首 + 仕入 − 期末」の公式は反射的に出るまで暗記。','仕入値引・仕入返品は仕入勘定を減額。売上値引・売上返品は売上勘定を減額することを覚えておく。'],
|
||||||
|
keypoints:['三分法:仕入(費用)・売上(収益)・繰越商品(資産)','売上原価 = 期首 + 仕入 − 期末','決算整理で「仕入」勘定を売上原価に確定させる','売上総利益 = 売上高 − 売上原価'],
|
||||||
|
quiz:[
|
||||||
|
{q:'期首商品¥20,000、当期仕入¥150,000、期末商品¥25,000のとき売上原価はいくらか。',choices:['¥145,000','¥155,000','¥170,000','¥125,000'],answer:0,exp:'売上原価 = 20,000 + 150,000 − 25,000 = 145,000円'},
|
||||||
|
{q:'決算整理で期末商品¥40,000を計上する仕訳はどれか。',choices:['仕入 40,000 /繰越商品 40,000','繰越商品 40,000 /仕入 40,000','売上 40,000 /繰越商品 40,000','繰越商品 40,000 /売上 40,000'],answer:1,exp:'期末商品は(借)繰越商品 /(貸)仕入 で仕入勘定から控除します。'},
|
||||||
|
{q:'売上高¥300,000、売上原価¥190,000のとき売上総利益はいくらか。',choices:['¥490,000','¥110,000','¥190,000','¥300,000'],answer:1,exp:'売上総利益 = 300,000 − 190,000 = 110,000円'},
|
||||||
|
{q:'当期中に仕入¥500,000のうち¥20,000分を品質不良で返品した。仕入勘定の純額はいくらか。',choices:['¥520,000','¥480,000','¥500,000','¥20,000'],answer:1,exp:'仕入返品は仕入勘定を減額。純仕入額 = 500,000 − 20,000 = 480,000円'},
|
||||||
|
{q:'売上高¥800,000、期首商品¥50,000、当期仕入¥600,000、期末商品¥80,000のとき売上総利益はいくらか。',choices:['¥230,000','¥170,000','¥250,000','¥800,000'],answer:0,exp:'売上原価 = 50,000 + 600,000 − 80,000 = 570,000。売上総利益 = 800,000 − 570,000 = 230,000円'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c03', num:'C03', title:'固定資産と減価償却',
|
||||||
|
freq:'high', diff:2,
|
||||||
|
concept:`<p>固定資産は使用に伴い価値が減少します。この減少額を<strong>減価償却費</strong>として費用計上します。</p><div class="formula-box"><div class="formula-label">主要な償却方法</div>定額法:(取得原価 − 残存価額)÷ 耐用年数<br>定率法:期首帳簿価額 × 償却率<br>生産高比例法:(取得 − 残存)× 当期利用量 ÷ 総利用可能量</div><p>仕訳(間接法):(借)減価償却費 /(貸)減価償却累計額</p><p>売却時:帳簿価額¥100,000の備品を¥80,000で売却<br>(借)現金80,000・固定資産売却損20,000 /(貸)備品100,000</p>`,
|
||||||
|
examtips:['精算表・財務諸表問題(第3・4問)で頻出。定額法の計算式は反射的に出てくるまで練習する。', '期中取得は<strong>月割り計算</strong>(使用月数÷12)を忘れずに。年度途中の取得・売却問題で必ず問われる。', '間接法:帳簿価額=取得原価−累計額。売却損益=売却価額−帳簿価額。符号ミスに注意。'],
|
||||||
|
keypoints:['定額法:毎期同額','定率法:期首帳簿価額に率をかける→年々減少','間接法:備品勘定は取得原価のまま・累計額を別勘定で管理','売却損益 = 売却価額 − 帳簿価額(取得原価 − 累計額)'],
|
||||||
|
quiz:[
|
||||||
|
{q:'取得原価¥500,000・残存価額¥0・耐用年数5年を定額法で償却する場合の毎期償却費は?',choices:['¥50,000','¥100,000','¥125,000','¥500,000'],answer:1,exp:'(500,000 − 0)÷ 5 = 100,000円/年'},
|
||||||
|
{q:'帳簿価額¥200,000の車両を¥250,000で売却した場合に計上される損益は?',choices:['固定資産売却損¥50,000','固定資産売却益¥50,000','固定資産売却損¥200,000','損益なし'],answer:1,exp:'250,000 − 200,000 = 50,000円の固定資産売却益'},
|
||||||
|
{q:'間接法で減価償却を行うとき使用する勘定科目の組み合わせはどれか。',choices:['備品と現金','減価償却費と減価償却累計額','備品減価償却費のみ','減価償却費と備品'],answer:1,exp:'間接法では「減価償却費」(費用)と「減価償却累計額」(資産のマイナス)を使います。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c04', num:'C04', title:'引当金',
|
||||||
|
freq:'high', diff:2,
|
||||||
|
concept:`<p><strong>引当金</strong>とは将来発生が見込まれる費用・損失を当期に見越計上するものです。</p><div class="formula-box"><div class="formula-label">貸倒引当金(差額補充法)</div>設定額 = 売上債権残高 × 貸倒実績率<br>繰入額 = 設定額 − 既存の引当金残高</div><p>設定:(借)貸倒引当金繰入 /(貸)貸倒引当金<br>貸倒発生(引当金範囲内):(借)貸倒引当金 /(貸)売掛金<br>超過分:(借)貸倒損失 /(貸)売掛金</p><p><strong>退職給付引当金</strong>:(借)退職給付費用 /(貸)退職給付引当金</p>`,
|
||||||
|
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円'},
|
||||||
|
{q:'貸倒引当金残高¥10,000のとき売掛金¥8,000が貸倒れた場合の仕訳は?',choices:['貸倒損失8,000 /売掛金8,000','貸倒引当金8,000 /売掛金8,000','売掛金8,000 /貸倒引当金8,000','貸倒引当金10,000 /売掛金8,000'],answer:1,exp:'貸倒額が引当金残高以内のため全額引当金で処理します。'},
|
||||||
|
{q:'引当金の設定要件として正しくないものはどれか。',choices:['将来の費用・損失である','当期以前の事象に起因する','金額の合理的見積もりが可能','すでに確定した債務である'],answer:3,exp:'引当金は「確定した債務」ではなく「将来発生が見込まれる不確実なもの」が対象です。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c05', num:'C05', title:'有価証券',
|
||||||
|
freq:'high', diff:2,
|
||||||
|
concept:`<p>有価証券は保有目的により4分類されます。</p><div class="formula-box"><div class="formula-label">分類と評価</div>売買目的有価証券 → 時価評価(差額は当期損益)<br>満期保有目的債券 → 原価法または償却原価法<br>子会社・関連会社株式 → 取得原価法<br>その他有価証券 → 時価評価(差額は純資産:その他包括利益)</div><p>売買目的(時価↑¥10,000):(借)有価証券10,000 /(貸)有価証券評価益10,000<br>その他有価証券(時価↑¥10,000):(借)その他有価証券10,000 /(貸)その他有価証券評価差額金10,000</p>`,
|
||||||
|
examtips:['4分類(売買目的・満期保有・子会社株式・その他)と評価方法のマトリクスを表で暗記。損益計上先(P/L or B/S純資産)の違いが最頻出。', '「その他有価証券評価差額金」はB/S純資産の部。<strong>損益計算書には計上しない</strong>。頻出の引っかけ。', '売買目的と「その他有価証券」の仕訳で使う勘定科目名が異なることに注意(「有価証券」vs「その他有価証券」)。'],
|
||||||
|
keypoints:['売買目的:流動資産、時価評価、評価損益はP/Lへ','満期保有:固定資産、原価(or償却原価)法','子会社・関連会社株式:固定資産、取得原価のまま','その他有価証券:固定資産、評価差額はB/S純資産(税効果後)'],
|
||||||
|
quiz:[
|
||||||
|
{q:'売買目的有価証券(取得原価¥100,000)の期末時価が¥110,000のとき計上する損益は?',choices:['有価証券評価損¥10,000','有価証券評価益¥10,000','投資有価証券評価益¥10,000','損益は計上しない'],answer:1,exp:'売買目的有価証券は時価評価し差額を当期損益(有価証券評価益)に計上します。'},
|
||||||
|
{q:'その他有価証券の評価差額金はどこに計上するか。',choices:['損益計算書(営業外収益)','損益計算書(特別利益)','貸借対照表の純資産の部','貸借対照表の負債の部'],answer:2,exp:'B/S純資産の「その他有価証券評価差額金」に計上します(税効果考慮後)。'},
|
||||||
|
{q:'子会社株式の期末評価方法はどれか。',choices:['時価法','持分法','取得原価法','低価法'],answer:2,exp:'子会社株式・関連会社株式は取得原価法で評価します(時価変動は認識しない)。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c06', num:'C06', title:'手形取引',
|
||||||
|
freq:'mid', diff:2,
|
||||||
|
concept:`<p><strong>約束手形</strong>:振出人と受取人の2者。<strong>為替手形</strong>:振出人・引受人・受取人の3者。</p><div class="formula-box"><div class="formula-label">手形の割引</div>受取額 = 手形額面 − 割引料<br>割引料 = 手形額面 × 割引率 × 残存日数 ÷ 365</div><p>割引仕訳:(借)当座預金・手形売却損 /(貸)受取手形<br>裏書き(支払のため):(借)買掛金 /(貸)受取手形</p>`,
|
||||||
|
examtips:['手形割引料の計算は<strong>365日法 or 360日法</strong>を問題文で確認してから計算する。', '裏書き譲渡:買掛金 / 受取手形。受取手形が<strong>貸方</strong>に来ることを確認する。', '手形売却損(割引)と支払利息(借入)の区別がよく問われる。割引は売却なので支払利息ではない。'],
|
||||||
|
keypoints:['受取手形(資産)・支払手形(負債)','割引:銀行に売却→手形売却損(費用)計上','裏書き:受取手形を他者への支払いに使用','不渡り:決済されなかった手形→さかのぼり請求が発生'],
|
||||||
|
quiz:[
|
||||||
|
{q:'額面¥200,000の手形を年利3%・残存60日で割り引いた割引料(365日計算)は概算でいくらか。',choices:['¥985','¥1,479','¥6,000','¥3,000'],answer:0,exp:'割引料 = 200,000 × 3% × 60÷365 ≒ 985円'},
|
||||||
|
{q:'手形を裏書きして仕入代金に充当したときの貸方科目は?',choices:['支払手形','買掛金','受取手形','当座預金'],answer:2,exp:'裏書きで受取手形が減少するため貸方は「受取手形」です。'},
|
||||||
|
{q:'手形割引の仕訳で借方に計上される費用科目は?',choices:['支払利息','有価証券売却損','手形売却損','割引料'],answer:2,exp:'手形割引時の費用は「手形売却損」です。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c07', num:'C07', title:'外貨建取引',
|
||||||
|
freq:'high', diff:2,
|
||||||
|
concept:`<p>外貨建取引は取引発生時のレートで換算し、決算時に為替換算調整を行います。</p><div class="formula-box"><div class="formula-label">換算レートの原則</div>売上・仕入(収益・費用) → 取引日レート(HR)<br>売掛金・買掛金(流動) → 決算日レート(CR)<br>長期外貨建債権・債務 → 決算日レート(CR)</div><p>例:$1,000売掛金(HR=¥140)、決算時CR=¥145<br>(借)売掛金5,000 /(貸)為替差益5,000</p>`,
|
||||||
|
examtips:['換算レートの原則を表で整理:収益・費用→取引日レート(HR)、期末の外貨建金銭債権債務→決算日レート(CR)。', '円高になると→輸出企業の売掛金は為替差損、輸入企業の買掛金は為替差益。直感で判断できるように練習する。', '為替予約(振当処理):予約日から予約レートを適用。問題文に「振当処理」と書いてあれば即このルールを適用。'],
|
||||||
|
keypoints:['取引日:取引時のレートで記帳','決算日:外貨建金銭債権債務はCRで換算替え','差額:為替差損益(営業外損益)','為替予約(振当処理):予約レートを適用してヘッジ'],
|
||||||
|
quiz:[
|
||||||
|
{q:'ドル建て売掛金$2,000(計上時¥140)が決算日CR=¥138のとき為替差損はいくらか。',choices:['¥4,000','¥2,000','¥276,000','¥4,000の為替差益'],answer:0,exp:'円高になったため評価減。(140−138)× 2,000 = 4,000円の為替差損。'},
|
||||||
|
{q:'外貨建収益(売上)を換算するレートはどれか。',choices:['決算日レート(CR)','取引日レート(HR)','予算レート','前期末レート'],answer:1,exp:'収益・費用は取引日レート(HR)で換算します。'},
|
||||||
|
{q:'決算時に外貨建買掛金で為替差益が生じるのはどの場合か。',choices:['円高になった','円安になった','レートが変わらなかった','外貨の価値が上がった'],answer:0,exp:'買掛金(債務)は円高になると支払額が減少するため為替差益が生じます。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c08', num:'C08', title:'リース取引',
|
||||||
|
freq:'mid', diff:2,
|
||||||
|
concept:`<p>リース取引は2種類あります。</p><div class="formula-box"><div class="formula-label">分類</div>ファイナンス・リース:実質的に購入と同じ → 資産・負債を計上<br>オペレーティング・リース:賃貸借として処理 → 支払リース料(費用)</div><p>ファイナンス・リース開始時:(借)リース資産 /(貸)リース債務<br>リース料支払時:(借)リース債務・支払利息 /(貸)現金<br>決算時:(借)減価償却費 /(貸)減価償却累計額</p>`,
|
||||||
|
examtips:['ファイナンス・リースの判定基準3つ(所有権移転・割安購入選択権・リース期間が耐用年数の75%以上)を暗記。', 'ファイナンス開始仕訳:リース資産 / リース債務(双方同額)。利子抜き法では利息相当額を除いた金額で計上。', 'オペレーティング・リースは毎期「支払リース料 / 現金」のみ。資産・負債は計上しない。'],
|
||||||
|
keypoints:['ファイナンス:所有権移転・割安購入選択権・リース期間等で判定','利子抜き法:リース料総額から利息相当額を除いた金額で資産計上','オペレーティング:毎期「支払リース料」を計上するだけ','減価償却:ファイナンスは自己所有資産同様に行う'],
|
||||||
|
quiz:[
|
||||||
|
{q:'ファイナンス・リース取引開始時の借方科目はどれか。',choices:['リース費用','支払リース料','リース資産','減価償却費'],answer:2,exp:'ファイナンス・リースは資産計上します。(借)リース資産 /(貸)リース債務'},
|
||||||
|
{q:'オペレーティング・リースの毎期の仕訳として正しいものはどれか。',choices:['リース資産 /リース債務','支払リース料 /現金','減価償却費 /リース資産','リース債務 /現金'],answer:1,exp:'オペレーティング・リースは支払リース料として費用計上します。'},
|
||||||
|
{q:'ファイナンス・リースの判定基準として誤っているものはどれか。',choices:['所有権が借手に移転する','割安購入選択権がある','リース期間が耐用年数の75%以上','月々のリース料が高額である'],answer:3,exp:'「月々のリース料が高額」は判定基準ではありません。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c09', num:'C09', title:'税効果会計',
|
||||||
|
freq:'high', diff:3,
|
||||||
|
concept:`<p>会計上の利益と税務上の所得の差異(<strong>一時差異</strong>)を調整する手続きです。</p><div class="formula-box"><div class="formula-label">繰延税金資産・負債</div>将来減算一時差異(会計費用 > 税務損金)→ 繰延税金資産<br>将来加算一時差異(会計費用 < 税務損金)→ 繰延税金負債<br><br>繰延税金資産 = 一時差異 × 法定実効税率</div><p>例:貸倒引当金¥100,000が税務上損金不算入・実効税率30%<br>(借)繰延税金資産30,000 /(貸)法人税等調整額30,000</p>`,
|
||||||
|
examtips:['「将来減算一時差異→繰延税金資産」「将来加算一時差異→繰延税金負債」の対応を確実に。逆は絶対NG。', '<strong>永久差異</strong>(交際費超過・寄付金超過等)は税効果の対象外。一時差異との区別が頻出。', '繰延税金資産の計算:一時差異 × 法定実効税率。税率は問題文で与えられる。計算自体はシンプル。'],
|
||||||
|
keypoints:['一時差異:会計と税務の費用認識タイミングのズレ(いずれ解消)','永久差異(交際費超過額等)は税効果の対象外','繰延税金資産:将来の税金を前払い(資産)の概念','法人税等調整額:P/Lで税負担を調整する科目'],
|
||||||
|
quiz:[
|
||||||
|
{q:'将来減算一時差異が生じた場合に計上される勘定科目はどれか。',choices:['繰延税金負債','法人税等','繰延税金資産','法人税等調整額(借方)'],answer:2,exp:'将来減算一時差異は「繰延税金資産」として計上します(将来の税金軽減効果)。'},
|
||||||
|
{q:'貸倒引当金¥200,000が税務上全額損金不算入・実効税率30%のとき繰延税金資産は?',choices:['¥200,000','¥140,000','¥60,000','¥30,000'],answer:2,exp:'繰延税金資産 = 200,000 × 30% = 60,000円'},
|
||||||
|
{q:'税効果会計の対象とならない差異はどれか。',choices:['貸倒引当金の限度超過額','退職給付引当金の限度超過額','交際費の損金不算入額','減価償却の限度超過額'],answer:2,exp:'交際費超過額は永久差異のため税効果会計の対象外です。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c10', num:'C10', title:'純資産と株式',
|
||||||
|
freq:'mid', diff:2,
|
||||||
|
concept:`<p>株式会社の純資産は株主資本と評価・換算差額等等で構成されます。</p><div class="formula-box"><div class="formula-label">株主資本の構成</div>資本金 + 資本準備金 + その他資本剰余金<br>+ 利益準備金 + その他利益剰余金 − 自己株式</div><p>株式発行(¥1,000,000・うち資本金¥600,000):<br>(借)現金1,000,000 /(貸)資本金600,000・資本準備金400,000</p><p>剰余金配当¥500,000(利益準備金積立¥50,000):<br>(借)繰越利益剰余金550,000 /(貸)未払配当金500,000・利益準備金50,000</p>`,
|
||||||
|
examtips:['株式発行:払込額の<strong>最低1/2以上</strong>を資本金に計上。残りは資本準備金。問題文の指定を確認する。', '配当時の利益準備金積立:配当額×1/10(上限:資本金の1/4に達するまで)。計算手順を練習する。', '<strong>自己株式はB/S純資産のマイナス</strong>(資産ではない)。「資産の部に計上」という選択肢は頻出の引っかけ。'],
|
||||||
|
keypoints:['払込額の最低1/2を資本金、残りは資本準備金に計上可','配当時:利益準備金を資本金の1/4まで積立義務(配当額の1/10)','自己株式:純資産のマイナス項目(資産ではない)','その他有価証券評価差額金は純資産の部に表示'],
|
||||||
|
quiz:[
|
||||||
|
{q:'1株¥500で1,000株発行し全額を資本金とした場合、貸方に計上される金額は?',choices:['資本準備金¥500,000','資本金¥500,000','資本金¥250,000と資本準備金¥250,000','普通株式¥500,000'],answer:1,exp:'全額資本金の場合:(借)現金500,000 /(貸)資本金500,000'},
|
||||||
|
{q:'自己株式はB/Sのどこに表示するか。',choices:['流動資産','固定資産','純資産の部(控除)','負債の部'],answer:2,exp:'自己株式は純資産の部の株主資本から控除する形式で表示します(マイナス項目)。'},
|
||||||
|
{q:'剰余金配当¥1,000,000のとき利益準備金の積立額は(積立不足十分な場合)?',choices:['¥100,000','¥200,000','¥50,000','¥500,000'],answer:0,exp:'配当額の1/10を積立:1,000,000 × 1/10 = 100,000円'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c11', num:'C11', title:'社債',
|
||||||
|
freq:'mid', diff:2,
|
||||||
|
concept:`<p><strong>社債</strong>は企業が資金調達のために発行する債券です。</p><div class="formula-box"><div class="formula-label">償却原価法(定額法)</div>毎期の償却額 =(額面 − 発行価額)÷ 償還までの年数<br>割引発行:帳簿価額を毎期増額 割増発行:毎期減額</div><p>発行(額面¥1,000,000・発行¥970,000・3年):<br>(借)現金970,000 /(貸)社債970,000<br>決算時償却¥10,000:(借)社債利息10,000 /(貸)社債10,000<br>満期:(借)社債1,000,000 /(貸)現金1,000,000</p>`,
|
||||||
|
examtips:['割引発行(額面>発行価額)→毎期償却額を加算→帳簿価額が<strong>増加</strong>して満期に額面へ。方向を間違えやすい。', 'クーポン利息(額面×クーポン率×期間)と償却原価法の調整額の合算が「社債利息」として費用計上される。', '満期償還時は帳簿価額=額面になっている。仕訳後に差額が出ないことを確認する。'],
|
||||||
|
keypoints:['割引発行:額面>発行価額 → 社債勘定を毎期増額','割増発行:額面<発行価額 → 社債勘定を毎期減額','社債利息 = クーポン利息 + 償却原価法の調整額','社債は固定負債(1年以内償還分は流動負債)'],
|
||||||
|
quiz:[
|
||||||
|
{q:'額面¥2,000,000を¥1,940,000で発行・5年満期のとき定額法での毎期償却額は?',choices:['¥12,000','¥60,000','¥388,000','¥400,000'],answer:0,exp:'(2,000,000 − 1,940,000)÷ 5 = 12,000円/年'},
|
||||||
|
{q:'社債の割引発行(額面>発行価額)のとき毎期の償却により帳簿価額はどうなるか。',choices:['増加する','減少する','変わらない','満期まで発行価額のまま'],answer:0,exp:'割引発行では毎期償却額を社債勘定に加算するため帳簿価額は増加(額面に近づく)します。'},
|
||||||
|
{q:'社債はB/Sのどの区分に計上するか(原則)。',choices:['流動負債','固定負債','純資産','流動資産'],answer:1,exp:'社債は固定負債に計上します(1年以内に償還されるものは流動負債)。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c12', num:'C12', title:'本支店会計',
|
||||||
|
freq:'high', diff:3,
|
||||||
|
concept:`<p>本支店会計では本店と支店が独立した帳簿を持ちます。</p><div class="formula-box"><div class="formula-label">照合勘定</div>本店側:「支店」勘定(資産)<br>支店側:「本店」勘定(純資産的な勘定)<br>→ 未達取引調整後は必ず一致</div><p>内部利益の控除:本店が原価¥100,000の商品を¥120,000で支店に振替 → 内部利益¥20,000<br>合併財務諸表作成:①未達取引整理 ②照合勘定の相殺消去 ③内部利益の控除</p>`,
|
||||||
|
examtips:['未達取引整理後に「支店」勘定(本店帳)と「本店」勘定(支店帳)が一致するかを確認する手順が出題の核。', '内部利益の計算:振替価格−原価=内部利益単価。期末商品に含まれる分だけ合併B/Sから控除する。', '合併P/Lでは内部取引(振替売上・振替仕入)を相殺消去。消去後の売上高・仕入高を確認すること。'],
|
||||||
|
keypoints:['本店の「支店」勘定と支店の「本店」勘定は対応','未達取引:片方だけ処理済み → 調整して一致させる','内部利益:振替価格と原価の差 → 期末商品から控除','合併P/Lでは内部取引(振替売上・振替仕入)を相殺'],
|
||||||
|
quiz:[
|
||||||
|
{q:'本店が支店に商品を送付した際、本店で使用する勘定科目はどれか。',choices:['売上','支店','本店','商品振替'],answer:1,exp:'本店は「支店」勘定(資産)の増加として記帳します。'},
|
||||||
|
{q:'支店が本店から商品を受け取った際に使用する勘定科目はどれか。',choices:['仕入','本店','支店','受取商品'],answer:1,exp:'支店は「本店」勘定(本店への債務)の増加として記帳します。'},
|
||||||
|
{q:'合併財務諸表作成の手順として誤っているものはどれか。',choices:['未達取引の整理','照合勘定の相殺消去','内部利益の控除','支店を子会社として連結'],answer:3,exp:'本支店は同一企業内の組織のため子会社として連結処理は行いません。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c13', num:'C13', title:'連結会計の基礎',
|
||||||
|
freq:'high', diff:3,
|
||||||
|
concept:`<p><strong>連結財務諸表</strong>は親会社と子会社を一体とみなして作成します。議決権の<span class="hl">50%超</span>を保有する会社が子会社です。</p><div class="viz-org"><div class="vo-node vo-parent">親会社<div class="vo-sub">連結財務諸表を作成</div></div><div class="vo-connector"><div class="vo-vline"></div><div class="vo-pct">議決権 51〜100% 保有</div><div class="vo-vline"></div></div><div class="vo-row"><div class="vo-branch"><div class="vo-node vo-child1">子会社(100%)<div class="vo-sub">完全子会社</div></div></div><div class="vo-branch" style="margin-top:32px"><div class="vo-node vo-child2">子会社(60%)<div class="vo-sub">非支配株主持分 40%</div></div></div></div></div><div class="formula-box"><div class="formula-label">支配獲得時の連結修正仕訳</div>(借)子会社純資産 × 持分率<br>(借)のれん(差額)<br>(貸)子会社株式(投資)<br><br>のれん = 投資額 − 子会社純資産の持分相当額</div><p>のれんは20年以内で規則的に償却。毎期:①配当金消去 ②内部取引消去 ③未実現利益消去</p>`,
|
||||||
|
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円'},
|
||||||
|
{q:'連結財務諸表で親会社が受け取った子会社からの配当金はどう処理するか。',choices:['そのまま受取配当金として計上','受取配当金と利益剰余金を相殺消去','資本剰余金に振替','現金と相殺'],answer:1,exp:'連結上グループ内の配当は内部取引として消去します。'},
|
||||||
|
{q:'のれんの最長償却期間はどれか。',choices:['5年','10年','20年','50年'],answer:2,exp:'のれんは20年以内の期間で規則的に償却します。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c14', num:'C14', title:'キャッシュフロー計算書',
|
||||||
|
freq:'high', diff:2,
|
||||||
|
concept:`<p>CF計算書は<strong>営業・投資・財務</strong>の3区分でキャッシュの増減を示します。</p><div class="formula-box"><div class="formula-label">間接法(営業CF)の主な調整項目</div>税引前当期純利益<br>+ 減価償却費(非現金費用の加戻し)<br>+/− 売上債権の減少/増加(回収状況)<br>+/− 棚卸資産の減少/増加<br>+/− 仕入債務の増加/減少</div><p>投資CF:固定資産・有価証券の取得・売却<br>財務CF:借入・返済・社債発行・株式発行・配当金支払い</p>`,
|
||||||
|
examtips:['間接法の調整項目を表で整理:減価償却費→加算、売上債権増加→減算、棚卸資産増加→減算、仕入債務増加→加算。', '投資CF vs 財務CF の区分:固定資産・有価証券の取得/売却→投資CF、借入/返済/社債/株式/配当→財務CF。', '直接法と間接法では営業CFの表示方法が違うが、合計額は同じになることを理解しておく。'],
|
||||||
|
keypoints:['間接法:純利益からスタートし非現金項目を調整','減価償却費はキャッシュアウトなし → 加算して戻す','売上債権増加 → 現金未回収 → 営業CFから減算','固定資産の取得・売却 → 投資CF'],
|
||||||
|
quiz:[
|
||||||
|
{q:'間接法のCF計算書で減価償却費¥50,000は営業CFにどう影響するか。',choices:['¥50,000を減算','¥50,000を加算','影響なし','財務CFに計上'],answer:1,exp:'減価償却費は現金支出を伴わない費用のため純利益から控除した分を加算して戻します。'},
|
||||||
|
{q:'固定資産の取得による支出はCF計算書のどの区分か。',choices:['営業活動','投資活動','財務活動','表示しない'],answer:1,exp:'固定資産の取得・売却は投資活動によるキャッシュフローに表示します。'},
|
||||||
|
{q:'売掛金が前期比¥30,000増加した場合、間接法の営業CFにどう影響するか。',choices:['¥30,000加算','¥30,000減算','影響なし','財務CFへ計上'],answer:1,exp:'売上債権の増加は現金回収が少ないことを意味するため営業CFから減算します。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'c15', num:'C15', title:'財務諸表分析',
|
||||||
|
freq:'mid', diff:1,
|
||||||
|
concept:`<p>財務比率で企業の収益性・安全性・効率性を分析します。</p><div class="formula-box"><div class="formula-label">主要な財務比率</div>収益性:売上高総利益率 = 売上総利益 ÷ 売上高 × 100<br> ROE = 当期純利益 ÷ 自己資本 × 100<br>安全性:流動比率 = 流動資産 ÷ 流動負債 × 100(200%以上良好)<br> 自己資本比率 = 自己資本 ÷ 総資産 × 100<br>効率性:売上債権回転率 = 売上高 ÷ 売上債権<br> 棚卸資産回転率 = 売上高 ÷ 棚卸資産</div>`,
|
||||||
|
examtips:['計算式は「分子は何か・分母は何か」を意識して整理する。特に分母を流動負債にするか総資産にするかで迷いやすい。', 'ROEが高い ≠ 安全。自己資本比率が低い会社でもROEが高い場合がある(レバレッジ効果)という逆説も出題される。', '「改善策はどれか」という選択問題では指標の意味から考える。例:流動比率↑には流動資産増 or 流動負債減が必要。'],
|
||||||
|
keypoints:['流動比率が高い → 短期支払能力が高い','自己資本比率が高い → 財務安全性が高い','回転率が高い → 効率よく資産を活用','ROEが高い → 株主資本を効率よく使って利益創出'],
|
||||||
|
quiz:[
|
||||||
|
{q:'流動資産¥600,000・流動負債¥300,000のとき流動比率はいくらか。',choices:['50%','150%','200%','300%'],answer:2,exp:'流動比率 = 600,000 ÷ 300,000 × 100 = 200%'},
|
||||||
|
{q:'自己資本比率を高める効果がある事象はどれか。',choices:['借入金の増加','当期純利益の計上','社債の発行','買掛金の増加'],answer:1,exp:'当期純利益は利益剰余金として純資産を増やすため自己資本比率が上昇します。'},
|
||||||
|
{q:'売上高¥1,200,000・売上債権¥200,000のとき売上債権回転率はいくらか。',choices:['2回','4回','6回','8回'],answer:2,exp:'売上債権回転率 = 1,200,000 ÷ 200,000 = 6回'}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]},
|
||||||
|
{ id:'industrial', label:'工業簿記', icon:'factory', units:[
|
||||||
|
{ id:'i01', num:'I01', title:'工業簿記の基礎と勘定体系',
|
||||||
|
freq:'mid', diff:1,
|
||||||
|
concept:`<p><strong>工業簿記</strong>は製造業の原価計算を記録する簿記です。<span class="hl">材料 → 仕掛品 → 製品</span> の流れで原価を管理します。</p><div class="viz-flow"><div class="vf-node"><div>材料</div><div class="vf-sub">材料費</div></div><div class="vf-arrow">→</div><div class="vf-node vf-hl"><div>仕掛品</div><div class="vf-sub">製造途中</div></div><div class="vf-arrow">→</div><div class="vf-node"><div>製品</div><div class="vf-sub">完成品</div></div><div class="vf-arrow">→</div><div class="vf-node"><div>売上原価</div><div class="vf-sub">販売時</div></div></div><p>仕掛品には製造原価の3要素が集計されます。</p><div class="viz-cost3"><div class="vc3-inputs"><div class="vc3-item vc3-mat">直接材料費</div><div class="vc3-item vc3-lab">直接労務費</div><div class="vc3-item vc3-ovh">製造間接費<span class="vc3-note">(配賦)</span></div></div><div class="vc3-arr">→</div><div class="vc3-box vc3-wip">仕掛品<div class="vc3-sublbl">製造途中</div></div><div class="vc3-arr">→</div><div class="vc3-box vc3-fin">製品<div class="vc3-sublbl">完成品</div></div></div>`,
|
||||||
|
examtips:['商業簿記との違いは「製品原価を製造工程で集計する」点。フロー(材料→仕掛品→製品→売上原価)を図で描けるようにする。', '直接費と間接費の分類:特定製品に跡付けできるか否か。工場長の給与や電力料はすべて間接費。', '製造原価報告書の構造(期首仕掛品+当期製造費用−期末仕掛品=当期製造原価)を押さえる。工業簿記全体の土台になる。'],
|
||||||
|
keypoints:['直接費:特定製品に直接跡付けできる原価','間接費:複数製品に共通して発生→配賦が必要','仕掛品:製造途中の未完成品(期末に残る)','製造原価報告書→損益計算書の売上原価へ連動'],
|
||||||
|
quiz:[
|
||||||
|
{q:'工場の電力料は製造原価のどの区分に含まれるか。',choices:['直接材料費','直接労務費','製造間接費','販売費及び一般管理費'],answer:2,exp:'電力料は複数製品に共通して発生するため製造間接費に分類されます。'},
|
||||||
|
{q:'製造原価の3要素として誤っているものはどれか。',choices:['直接材料費','直接労務費','製造間接費','販売費'],answer:3,exp:'販売費は製造原価ではなく期間費用(販売費及び一般管理費)に分類されます。'},
|
||||||
|
{q:'仕掛品勘定に集計されないものはどれか。',choices:['直接材料費','直接労務費','製造間接費配賦額','販売員の給与'],answer:3,exp:'販売員の給与は製造原価ではなく販売費です。仕掛品には製造原価のみ集計されます。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'i02', num:'I02', title:'材料費の計算',
|
||||||
|
freq:'mid', diff:2,
|
||||||
|
concept:`<p>材料の消費額(材料費)は消費単価×消費量で計算します。</p><div class="formula-box"><div class="formula-label">消費単価の計算方法</div>先入先出法:先に仕入れた材料から順に消費<br>移動平均法:仕入のたびに平均単価を計算<br>総平均法:月末に全体の平均単価を計算</div><div class="formula-box"><div class="formula-label">材料費の計算式</div>材料費 = 月初在庫 + 当月仕入 − 月末在庫<br><br>棚卸減耗費 =(帳簿棚卸数量 − 実地棚卸数量)× 消費単価</div>`,
|
||||||
|
examtips:['先入先出法・移動平均法の計算手順を確実に。物価上昇時は先入先出法の方が材料費が<strong>低くなる</strong>ことを押さえる。', '予定消費単価を使う場合:月末に実際消費単価と比較して「材料消費価格差異」を把握する手順も出題される。', '棚卸減耗費の処理(製造間接費 or 営業外費用)は問題文の指示に従う。どちらの処理も練習する。'],
|
||||||
|
keypoints:['先入先出法:物価上昇時は期末在庫が高め・材料費が低め','移動平均法:仕入のたびに平均計算→実務でよく使われる','予定消費単価:年間平均などを事前設定・差額は材料消費価格差異','棚卸減耗費:原則として製造間接費または営業外費用'],
|
||||||
|
quiz:[
|
||||||
|
{q:'月初在庫¥30,000・当月仕入¥120,000・月末在庫¥25,000のとき当月材料費は?',choices:['¥115,000','¥125,000','¥150,000','¥95,000'],answer:1,exp:'材料費 = 30,000 + 120,000 − 25,000 = 125,000円'},
|
||||||
|
{q:'先入先出法で物価上昇時の材料費は移動平均法と比べてどうなるか。',choices:['高くなる','低くなる','同じになる','計算できない'],answer:1,exp:'先入先出法では古い(安い)材料から消費するため物価上昇時は材料費が低くなります。'},
|
||||||
|
{q:'棚卸減耗費の計算に使う数量の差はどれとどれか。',choices:['帳簿数量と予定消費数量','帳簿棚卸数量と実地棚卸数量','実地数量と予定数量','月初と月末の数量'],answer:1,exp:'棚卸減耗費 =(帳簿棚卸数量 − 実地棚卸数量)× 消費単価'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'i03', num:'I03', title:'労務費と経費',
|
||||||
|
freq:'mid', diff:2,
|
||||||
|
concept:`<p><strong>労務費</strong>は労働に対する対価。直接工の賃金は直接労務費、間接工・工場管理者の給与は間接労務費(製造間接費)。</p><div class="formula-box"><div class="formula-label">消費賃金・賃率差異の計算</div>消費賃金 = 実際消費時間 × 実際賃率(or 予定賃率)<br>賃率差異 =(予定賃率 − 実際賃率)× 実際消費時間</div><p><strong>経費</strong>は材料費・労務費以外の製造原価。<br>外注加工費・特許権使用料 → 直接経費(仕掛品へ直接)<br>工場家賃・減価償却費 → 間接経費(製造間接費へ)</p>`,
|
||||||
|
examtips:['直接工の賃金→直接労務費、間接工・工場管理者の給与→製造間接費(間接労務費)。分類の判断が頻出。', '予定賃率使用時の賃率差異:(予定−実際)×実際時間。プラスが有利差異。符号の向きを確実に。', '外注加工費・特許権使用料→直接経費として仕掛品へ直接集計(製造間接費を経由しない)。'],
|
||||||
|
keypoints:['予定賃率使用時:消費賃金は予定計算→月末に差異把握','賃率差異(有利):実際賃率が予定より低い','直接経費は仕掛品へ直接集計','間接経費は製造間接費へ集計し後で配賦'],
|
||||||
|
quiz:[
|
||||||
|
{q:'直接工の賃金はどのように分類されるか。',choices:['製造間接費','直接労務費','販売費','直接材料費'],answer:1,exp:'直接工(製品に直接携わる作業員)の賃金は直接労務費です。'},
|
||||||
|
{q:'予定賃率¥1,500/時・実際100時間・実際賃率¥1,600/時のとき賃率差異は?',choices:['¥10,000の有利差異','¥10,000の不利差異','¥1,000の有利差異','¥1,000の不利差異'],answer:1,exp:'賃率差異 =(1,500 − 1,600)× 100 = −10,000(不利差異:実際賃率が予定より高かった)'},
|
||||||
|
{q:'工場の減価償却費はどのように分類されるか。',choices:['直接材料費','直接経費','製造間接費','販売費及び一般管理費'],answer:2,exp:'工場の減価償却費は間接経費として製造間接費に分類されます。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'i04', num:'I04', title:'製造間接費の配賦',
|
||||||
|
freq:'high', diff:2,
|
||||||
|
concept:`<p>製造間接費は直接特定製品に割り当てられないため、何らかの基準で<strong>配賦</strong>します。</p><div class="formula-box"><div class="formula-label">予定配賦</div>予定配賦率 = 製造間接費予算額 ÷ 基準操業度<br>予定配賦額 = 予定配賦率 × 実際操業度<br>配賦差異 = 実際発生額 − 予定配賦額(プラス=不利)</div><div class="formula-box"><div class="formula-label">差異の3分析</div>予算差異 = 変動費予算 + 固定費予算 − 実際発生額<br>操業度差異 = 固定費率 ×(実際操業度 − 基準操業度)<br>能率差異 = 変動費率 ×(標準操業度 − 実際操業度)</div>`,
|
||||||
|
examtips:['予定配賦率=製造間接費予算÷基準操業度。配賦差異=実際発生額−予定配賦額(プラスが不利差異)。', '3分析の公式(予算差異・操業度差異・能率差異)はそれぞれの意味と公式を表で整理して暗記する。', '操業度差異は「設備の遊休や過稼働による固定費の回収差」。実際操業度が基準を下回ると不利差異になる。'],
|
||||||
|
keypoints:['配賦基準:直接作業時間・機械時間・直接材料費など','配賦差異 = 実際 − 予定(プラスなら不利差異)','予算差異:コスト管理の問題','操業度差異:設備の遊休・過稼働による差異'],
|
||||||
|
quiz:[
|
||||||
|
{q:'製造間接費予算¥600,000・基準操業度600時間のとき予定配賦率はいくらか。',choices:['¥100/時間','¥1,000/時間','¥600/時間','¥10/時間'],answer:1,exp:'予定配賦率 = 600,000 ÷ 600 = 1,000円/時間'},
|
||||||
|
{q:'予定配賦率¥1,000/時間・実際操業度580時間のとき予定配賦額は?',choices:['¥580,000','¥600,000','¥620,000','¥1,000,000'],answer:0,exp:'予定配賦額 = 1,000 × 580 = 580,000円'},
|
||||||
|
{q:'実際製造間接費¥620,000・予定配賦額¥580,000のとき差異は何か。',choices:['¥40,000の有利差異','¥40,000の不利差異(配賦不足)','¥40,000の配賦過剰','差異なし'],answer:1,exp:'配賦差異 = 実際620,000 − 予定580,000 = 40,000の不利差異(配賦不足)'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'i05', num:'I05', title:'個別原価計算',
|
||||||
|
freq:'mid', diff:2,
|
||||||
|
concept:`<p><strong>個別原価計算</strong>は受注ごとに原価を集計する方法です。製造指図書ごとに原価計算表を作成します。</p><div class="formula-box"><div class="formula-label">原価計算表(例:指図書#101)</div>直接材料費 ¥50,000<br>直接労務費 ¥30,000<br>製造間接費 ¥20,000(配賦)<br>─────────────<br>製造原価合計 ¥100,000</div><p>完成時:(借)製品 /(貸)仕掛品<br>販売時:(借)売上原価 /(貸)製品<br>月末仕掛品:完成していない指図書の原価合計</p>`,
|
||||||
|
examtips:['製造指図書ごとの原価計算表を頭の中に描く。指図書が完成→製品へ振替、未完成→期末仕掛品残高。', '製造間接費は「予定配賦率 × その指図書の操業時間」で按分。配賦額の計算は確実に。', '複数指図書が同時進行する問題では、合計が仕掛品・製品の期末残高と一致するか検算する習慣をつける。'],
|
||||||
|
keypoints:['各指図書を「小さな仕掛品勘定」と考えると整理しやすい','製造間接費は予定配賦率 × その指図書の操業量で按分','指図書が完成 → 製品勘定へ振替','月末に完成していない指図書の合計 → 期末仕掛品残高'],
|
||||||
|
quiz:[
|
||||||
|
{q:'個別原価計算で使用する原価集計の単位はどれか。',choices:['製品の種類ごと','製造工程ごと','製造指図書ごと','月ごと'],answer:2,exp:'個別原価計算では製造指図書(受注)ごとに原価を集計します。'},
|
||||||
|
{q:'直接材料費¥80,000・直接労務費¥40,000・製造間接費配賦額¥30,000のとき製造原価は?',choices:['¥120,000','¥150,000','¥110,000','¥70,000'],answer:1,exp:'製造原価 = 80,000 + 40,000 + 30,000 = 150,000円'},
|
||||||
|
{q:'月末時点で完成していない製造指図書の原価は何に計上されるか。',choices:['製品','売上原価','期末仕掛品','製造間接費'],answer:2,exp:'未完成の指図書の原価は期末仕掛品として仕掛品勘定に残ります。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'i06', num:'I06', title:'総合原価計算',
|
||||||
|
freq:'high', diff:3,
|
||||||
|
concept:`<p><strong>総合原価計算</strong>は同種製品を大量生産する場合に使います。月末仕掛品を完成品換算量に変換して原価を按分します。</p><div class="formula-box"><div class="formula-label">完成品換算量と計算方法</div>月末仕掛品の換算量(加工費)= 月末仕掛品数量 × 加工進捗度<br><br>平均法:単価 =(月初仕掛品原価 + 当月投入原価)÷(完成品量 + 月末換算量)<br>先入先出法:月初仕掛品は先に完成したと仮定して計算</div><p>材料費は<strong>投入時点</strong>(通常始点)、加工費は<strong>加工進捗度</strong>に応じて配分。</p>`,
|
||||||
|
examtips:['加工費の完成品換算量(月末仕掛品数量 × 進捗度)の計算が最頻出。材料費(始点投入)は進捗度不要=数量そのまま。', '平均法と先入先出法の違い:先入先出法は月初仕掛品を先に完成させる前提で計算(月初分を別途計算)。', '検算:完成品原価 + 月末仕掛品原価 = 月初仕掛品原価 + 当月投入原価。計算後は必ず確認する。'],
|
||||||
|
keypoints:['始点投入材料:月末仕掛品も100%消費済み','終点投入材料:月末仕掛品には含まれない','加工費(労務費+製造間接費):進捗度に応じて按分','先入先出法:月初仕掛品分と当月分を分けて計算'],
|
||||||
|
quiz:[
|
||||||
|
{q:'月末仕掛品200個・加工進捗度50%のとき加工費の完成品換算量は?',choices:['200個','100個','150個','400個'],answer:1,exp:'換算量 = 200 × 50% = 100個'},
|
||||||
|
{q:'材料を工程の始点で全量投入する場合、月末仕掛品の材料費の按分は?',choices:['進捗度に応じて按分','月末仕掛品数量分すべて計上','含めない','半分を計上'],answer:1,exp:'始点で全量投入の場合、月末仕掛品も材料費を100%(数量分すべて)負担します。'},
|
||||||
|
{q:'平均法と先入先出法の主な違いはどれか。',choices:['材料費の計算方法が異なる','月初仕掛品の扱い方が異なる','配賦基準が異なる','適用できる業種が異なる'],answer:1,exp:'平均法は月初と当月を一体計算、先入先出法は月初仕掛品を先に完成させる前提で計算します。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'i07', num:'I07', title:'標準原価計算',
|
||||||
|
freq:'high', diff:3,
|
||||||
|
concept:`<p><strong>標準原価計算</strong>はあらかじめ設定した標準原価と実際原価との差異(<strong>原価差異</strong>)を分析します。</p><div class="formula-box"><div class="formula-label">差異分析(直接材料費)</div>価格差異 =(標準価格 − 実際価格)× 実際消費量<br>数量差異 =(標準消費量 − 実際消費量)× 標準価格</div><div class="formula-box"><div class="formula-label">差異分析(直接労務費)</div>賃率差異 =(標準賃率 − 実際賃率)× 実際時間<br>時間差異 =(標準時間 − 実際時間)× 標準賃率</div>`,
|
||||||
|
examtips:['差異の計算:「標準−実際」の符号でプラスが有利・マイナスが不利。価格と数量の2分析公式を確実に暗記。', '価格差異=(標準価格−実際価格)×実際消費量。数量差異=(標準量−実際量)×標準価格。混同に注意。', '製造間接費差異の3分析はI04の配賦差異をさらに細分化したもの。I04の理解が前提になる。'],
|
||||||
|
keypoints:['有利差異:標準より少ないコスト','不利差異:標準より多いコスト(管理改善が必要)','直接労務費差異 → 賃率差異 + 時間差異','製造間接費差異 → 予算差異 + 操業度差異(+能率差異)'],
|
||||||
|
quiz:[
|
||||||
|
{q:'標準価格¥200/kg・実際価格¥210/kg・実際消費量500kgのとき価格差異は?',choices:['¥5,000の有利差異','¥5,000の不利差異','¥500の有利差異','¥500の不利差異'],answer:1,exp:'価格差異 =(200 − 210)× 500 = −5,000(不利差異:実際が標準より高かった)'},
|
||||||
|
{q:'標準消費量600kg・実際消費量580kg・標準価格¥200/kgのとき数量差異は?',choices:['¥4,000の有利差異','¥4,000の不利差異','¥2,000の有利差異','¥2,000の不利差異'],answer:0,exp:'数量差異 =(600 − 580)× 200 = 4,000円(有利差異:実際消費量が標準より少なかった)'},
|
||||||
|
{q:'標準原価計算の主なメリットはどれか。',choices:['実際原価を正確に計算できる','原価差異を通じてコスト管理・改善を促せる','税務上の申告に使用できる','製品の販売価格を自動決定できる'],answer:1,exp:'標準原価計算の主なメリットは原価差異分析によるコスト管理と改善活動への活用です。'}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ id:'i08', num:'I08', title:'直接原価計算とCVP分析',
|
||||||
|
freq:'high', diff:2,
|
||||||
|
concept:`<p><strong>直接原価計算</strong>は変動費のみを製品原価とし、固定費は期間費用として処理します。</p><div class="formula-box"><div class="formula-label">直接原価計算P/L</div>売上高<br>− 変動費(変動製造原価 + 変動販売費)<br>= 貢献利益<br>− 固定費(固定製造間接費 + 固定販売費 + 一般管理費)<br>= 営業利益</div><div class="formula-box"><div class="formula-label">CVP分析(損益分岐点)</div>貢献利益率 = 貢献利益 ÷ 売上高<br>損益分岐点売上高 = 固定費 ÷ 貢献利益率<br>目標利益達成売上高 =(固定費 + 目標利益)÷ 貢献利益率</div><p>損益分岐点グラフ:売上高線と総原価線の交点が損益分岐点です。</p><svg viewBox="0 0 300 190" style="width:100%;max-width:380px;display:block;margin:12px auto;font-family:JetBrains Mono,monospace" aria-label="CVP分析グラフ"><rect width="300" height="190" fill="none"/><line x1="44" y1="10" x2="44" y2="155" stroke="rgba(255,255,255,0.15)" stroke-width="1.5"/><line x1="44" y1="155" x2="285" y2="155" stroke="rgba(255,255,255,0.15)" stroke-width="1.5"/><text x="38" y="158" text-anchor="end" font-size="9" fill="#64748B">0</text><text x="155" y="170" text-anchor="middle" font-size="9" fill="#64748B">販売量</text><text x="22" y="85" text-anchor="middle" font-size="9" fill="#64748B" transform="rotate(-90,22,85)">金額</text><line x1="44" y1="105" x2="275" y2="105" stroke="rgba(251,146,60,0.6)" stroke-width="1.5" stroke-dasharray="5,3"/><text x="278" y="108" font-size="9" fill="#FB923C">固定費</text><line x1="44" y1="155" x2="255" y2="25" stroke="#22D3EE" stroke-width="2"/><text x="258" y="22" font-size="9" fill="#22D3EE">売上高</text><line x1="44" y1="105" x2="255" y2="55" stroke="rgba(167,139,250,0.85)" stroke-width="2"/><text x="258" y="58" font-size="9" fill="#A78BFA">総原価</text><line x1="44" y1="105" x2="44" y2="155" stroke="rgba(251,146,60,0.4)" stroke-width="1.5" stroke-dasharray="3,3"/><circle cx="152" cy="90" r="5" fill="none" stroke="#4ADE80" stroke-width="2"/><line x1="152" y1="90" x2="152" y2="155" stroke="rgba(74,222,128,0.4)" stroke-width="1" stroke-dasharray="3,3"/><text x="152" y="180" text-anchor="middle" font-size="9" fill="#4ADE80">損益分岐点</text><text x="200" y="70" font-size="9" fill="rgba(74,222,128,0.8)">利益ゾーン</text><text x="75" y="135" font-size="9" fill="rgba(248,113,113,0.8)">損失ゾーン</text></svg>`,
|
||||||
|
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円'},
|
||||||
|
{q:'固定費¥300,000・貢献利益率40%のとき損益分岐点売上高は?',choices:['¥120,000','¥500,000','¥750,000','¥300,000'],answer:2,exp:'損益分岐点売上高 = 300,000 ÷ 40% = 750,000円'},
|
||||||
|
{q:'直接原価計算で固定製造間接費はどのように処理するか。',choices:['製品原価に含める','期間費用として当期に全額費用計上','繰延処理する','資産計上する'],answer:1,exp:'直接原価計算では固定製造間接費を製品原価に含めず発生した期の期間費用として全額処理します。'}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,94 @@
|
||||||
|
export const DRILLS = {
|
||||||
|
'c01':[
|
||||||
|
{q:'現金¥50,000が増加した場合、仕訳でどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:0,exp:'資産の増加は借方(左側)に記入します。'},
|
||||||
|
{q:'売上¥100,000が発生した場合、仕訳でどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:1,exp:'収益の発生は貸方(右側)に記入します。'}
|
||||||
|
],
|
||||||
|
'c02':[
|
||||||
|
{q:'三分法で商品を仕入れたとき「仕入」勘定はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:0,exp:'費用の発生(仕入)は借方に記入します。'},
|
||||||
|
{q:'決算整理で期末商品を計上する際「繰越商品」はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:0,exp:'繰越商品(資産)の増加は借方に記入します。'}
|
||||||
|
],
|
||||||
|
'c03':[
|
||||||
|
{q:'間接法の減価償却で「減価償却累計額」はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:1,exp:'減価償却累計額(資産のマイナス評価勘定)は貸方に記入します。'},
|
||||||
|
{q:'帳簿価額より高く売却した場合に生じる「固定資産売却益」はどちらか。',choices:['借方(左側)','貸方(右側)'],answer:1,exp:'収益の発生は貸方に記入します。'}
|
||||||
|
],
|
||||||
|
'c04':[
|
||||||
|
{q:'「貸倒引当金繰入」(費用)の発生はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:0,exp:'費用の発生は借方に記入します。'},
|
||||||
|
{q:'「貸倒引当金」(評価性引当金)の設定はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:1,exp:'貸倒引当金(資産のマイナス)は貸方に計上します。'}
|
||||||
|
],
|
||||||
|
'c05':[
|
||||||
|
{q:'売買目的有価証券の期末時価が帳簿価額を上回った場合の評価差額はどこに計上するか。',choices:['損益計算書(収益)','純資産の部(B/S)'],answer:0,exp:'売買目的有価証券の評価損益は当期の損益計算書に計上します。'},
|
||||||
|
{q:'その他有価証券の評価差額金はどこに計上するか。',choices:['損益計算書','貸借対照表の純資産の部'],answer:1,exp:'その他有価証券評価差額金はB/S純資産の部に計上します(税効果考慮後)。'}
|
||||||
|
],
|
||||||
|
'c06':[
|
||||||
|
{q:'受取手形を受け取ったとき「受取手形」勘定はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:0,exp:'受取手形(資産)の増加は借方に記入します。'},
|
||||||
|
{q:'受取手形を割引に出したとき「受取手形」はどちらに記入するか。',choices:['借方(左側)','貸方(右側)'],answer:1,exp:'受取手形(資産)が減少するため貸方に記入します。'}
|
||||||
|
],
|
||||||
|
'c07':[
|
||||||
|
{q:'円高になった場合、外貨建売掛金(輸出債権)の換算替えで生じるのはどちらか。',choices:['為替差損(不利)','為替差益(有利)'],answer:0,exp:'円高では売掛金の円換算額が減少するため為替差損が生じます。'},
|
||||||
|
{q:'円高になった場合、外貨建買掛金(輸入債務)の換算替えで生じるのはどちらか。',choices:['為替差損','為替差益'],answer:1,exp:'買掛金(債務)は円高で返済額が減少するため為替差益が生じます。'}
|
||||||
|
],
|
||||||
|
'c08':[
|
||||||
|
{q:'ファイナンス・リース開始時に計上する「リース資産」はどちらに記入するか。',choices:['借方(資産増加)','貸方(負債増加)'],answer:0,exp:'リース資産(資産)の増加は借方に記入します。'},
|
||||||
|
{q:'ファイナンス・リース開始時に計上する「リース債務」はどちらに記入するか。',choices:['借方','貸方'],answer:1,exp:'リース債務(負債)の増加は貸方に記入します。'}
|
||||||
|
],
|
||||||
|
'c09':[
|
||||||
|
{q:'将来減算一時差異が生じた場合「繰延税金資産」はB/Sのどの区分か。',choices:['資産の部(借方)','負債の部(貸方)'],answer:0,exp:'繰延税金資産は将来の税金軽減効果を資産として計上します。'},
|
||||||
|
{q:'交際費超過額(永久差異)は税効果会計の対象になるか。',choices:['対象になる','対象にならない'],answer:1,exp:'永久差異は将来も解消しないため税効果会計の対象外です。'}
|
||||||
|
],
|
||||||
|
'c10':[
|
||||||
|
{q:'株式を発行して現金を受け取ったとき「資本金」はどちらに記入するか。',choices:['借方','貸方'],answer:1,exp:'資本金(純資産)の増加は貸方に記入します。'},
|
||||||
|
{q:'自己株式はB/Sのどの区分に表示するか。',choices:['資産の部','純資産の部(マイナス項目)'],answer:1,exp:'自己株式は純資産の部から控除する形式で表示します(資産ではありません)。'}
|
||||||
|
],
|
||||||
|
'c11':[
|
||||||
|
{q:'社債を割引発行(額面>発行価額)した場合、毎期の帳簿価額はどうなるか。',choices:['増加する(額面に近づく)','減少する'],answer:0,exp:'割引発行では償却原価法で社債勘定を毎期増額し、満期に額面と一致させます。'},
|
||||||
|
{q:'社債利息(費用)の仕訳でどちらに記入するか。',choices:['借方(費用発生)','貸方'],answer:0,exp:'費用の発生は借方に記入します。'}
|
||||||
|
],
|
||||||
|
'c12':[
|
||||||
|
{q:'本店が支店に商品を送付したとき、本店の帳簿で「支店」勘定はどちらか。',choices:['借方(資産増加)','貸方(負債増加)'],answer:0,exp:'本店の「支店」勘定は資産勘定のため増加は借方に記入します。'},
|
||||||
|
{q:'合併財務諸表で内部取引(振替売上・振替仕入)はどう処理するか。',choices:['そのまま合算する','相殺消去する'],answer:1,exp:'内部取引は合併財務諸表から相殺消去します。'}
|
||||||
|
],
|
||||||
|
'c13':[
|
||||||
|
{q:'のれんは最長何年以内で規則的に償却するか。',choices:['10年以内','20年以内'],answer:1,exp:'のれんは20年以内の期間で規則的に償却します(日本基準)。'},
|
||||||
|
{q:'非支配株主持分はB/Sのどの区分に表示するか。',choices:['負債の部','純資産の部(株主資本と区分)'],answer:1,exp:'非支配株主持分はB/S純資産の部に株主資本とは別枠で表示します。'}
|
||||||
|
],
|
||||||
|
'c14':[
|
||||||
|
{q:'間接法のCF計算書で「減価償却費」を営業CFにどう調整するか。',choices:['加算する','減算する'],answer:0,exp:'減価償却費は現金支出なし→費用として差し引いた分を加算して戻します。'},
|
||||||
|
{q:'固定資産の取得はCF計算書のどの区分に記載するか。',choices:['営業活動CF','投資活動CF'],answer:1,exp:'固定資産の取得・売却は投資活動によるキャッシュフローに記載します。'}
|
||||||
|
],
|
||||||
|
'c15':[
|
||||||
|
{q:'流動比率の計算式「流動資産÷○○×100」の○○はどれか。',choices:['流動資産','流動負債'],answer:1,exp:'流動比率 = 流動資産 ÷ 流動負債 × 100。分母は流動負債です。'},
|
||||||
|
{q:'自己資本比率が高いほど財務安全性はどうなるか。',choices:['高くなる(良い)','低くなる(悪い)'],answer:0,exp:'自己資本比率が高いほど借入依存が少なく財務安全性が高いと評価されます。'}
|
||||||
|
],
|
||||||
|
'i01':[
|
||||||
|
{q:'工場の電力料は製造原価のどの区分に含まれるか。',choices:['直接費','製造間接費'],answer:1,exp:'複数製品に共通して発生する電力料は製造間接費(間接費)に分類されます。'},
|
||||||
|
{q:'仕掛品とはどういう状態の製品か。',choices:['完成した製品','製造途中の未完成品'],answer:1,exp:'仕掛品は製造途中でまだ完成していない製品のことです。'}
|
||||||
|
],
|
||||||
|
'i02':[
|
||||||
|
{q:'先入先出法で物価が上昇しているとき、材料費は移動平均法より高いか低いか。',choices:['高くなる','低くなる'],answer:1,exp:'先入先出法は古い(安い)材料から消費するため物価上昇時は材料費が低くなります。'},
|
||||||
|
{q:'材料費の計算で「月末在庫」はどのように作用するか。',choices:['材料費を増やす','材料費を減らす'],answer:1,exp:'月末在庫は未消費分のため「月初在庫+当月仕入−月末在庫」から差し引かれます。'}
|
||||||
|
],
|
||||||
|
'i03':[
|
||||||
|
{q:'直接工(製品に直接携わる作業員)の賃金はどの区分か。',choices:['直接労務費','製造間接費'],answer:0,exp:'直接工の賃金は直接労務費に分類されます。'},
|
||||||
|
{q:'予定賃率が実際賃率より低い場合、賃率差異はどちらか。',choices:['有利差異','不利差異'],answer:1,exp:'実際賃率が予定より高い→コスト超過→不利差異です。'}
|
||||||
|
],
|
||||||
|
'i04':[
|
||||||
|
{q:'配賦差異「実際発生額−予定配賦額」がプラスの場合はどちらか。',choices:['有利差異(配賦過剰)','不利差異(配賦不足)'],answer:1,exp:'実際発生額が予定配賦額より多い=コスト超過=不利差異(配賦不足)です。'},
|
||||||
|
{q:'製造間接費の予定配賦率は何を基準操業度で割って求めるか。',choices:['実際発生額','製造間接費予算額'],answer:1,exp:'予定配賦率 = 製造間接費予算額 ÷ 基準操業度で計算します。'}
|
||||||
|
],
|
||||||
|
'i05':[
|
||||||
|
{q:'個別原価計算で原価を集計する単位はどれか。',choices:['製造工程ごと','製造指図書ごと'],answer:1,exp:'個別原価計算は受注(製造指図書)ごとに原価を集計します。'},
|
||||||
|
{q:'月末に完成していない指図書の原価はどこに計上されるか。',choices:['製品勘定','仕掛品勘定'],answer:1,exp:'完成していない指図書の原価は期末仕掛品として仕掛品勘定に残ります。'}
|
||||||
|
],
|
||||||
|
'i06':[
|
||||||
|
{q:'月末仕掛品200個・加工進捗度50%のとき加工費の完成品換算量は何個か。',choices:['200個(そのまま)','100個(×50%)'],answer:1,exp:'換算量 = 200 × 50% = 100個。材料費(始点投入)は200個のまま。'},
|
||||||
|
{q:'始点で全量投入する材料費は月末仕掛品に含まれるか。',choices:['含まれる(100%)','含まれない'],answer:0,exp:'始点投入材料は製造開始時点で全量消費扱いのため月末仕掛品にも100%含まれます。'}
|
||||||
|
],
|
||||||
|
'i07':[
|
||||||
|
{q:'価格差異「(標準価格−実際価格)×実際消費量」がプラスのときはどちらか。',choices:['有利差異','不利差異'],answer:0,exp:'標準>実際(実際が安かった)→有利差異です。マイナスが不利差異。'},
|
||||||
|
{q:'数量差異の計算式で乗数(かける価格)はどちらか。',choices:['実際価格','標準価格'],answer:1,exp:'数量差異 =(標準消費量−実際消費量)×<strong>標準価格</strong>で計算します。'}
|
||||||
|
],
|
||||||
|
'i08':[
|
||||||
|
{q:'直接原価計算で固定製造間接費はどのように処理するか。',choices:['製品原価に含める','期間費用として全額計上'],answer:1,exp:'直接原価計算では固定費を製品原価に含めず発生した期の期間費用として処理します。'},
|
||||||
|
{q:'損益分岐点売上高の公式「固定費÷○○」の○○はどれか。',choices:['変動費率','貢献利益率'],answer:1,exp:'損益分岐点売上高 = 固定費 ÷ 貢献利益率(=1−変動費率)'}
|
||||||
|
]
|
||||||
|
};
|
||||||
4
sw.js
4
sw.js
|
|
@ -1,6 +1,6 @@
|
||||||
// posimai-boki SW — stale-while-revalidate + skipWaiting
|
// posimai-boki SW — stale-while-revalidate + skipWaiting
|
||||||
const CACHE = 'posimai-boki-v13';
|
const CACHE = 'posimai-boki-v14';
|
||||||
const STATIC = ['/', '/index.html', '/manifest.json', '/logo.png'];
|
const STATIC = ['/', '/index.html', '/manifest.json', '/logo.png', '/js/app.js', '/js/data/drills.js', '/js/data/categories.js'];
|
||||||
|
|
||||||
self.addEventListener('install', e => {
|
self.addEventListener('install', e => {
|
||||||
e.waitUntil(
|
e.waitUntil(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue