金額内訳AmountBreakdownBeta
金額の内訳、控除、小計、導出合計を読み取り専用で表示する明細ブロックです。
プレビュー
過失割合
認定損害額
修理費
¥480,000
レッカー費用
¥22,000
代車費用
¥38,000
認定損害額 計
¥540,000
過失相殺
認定額 × 過失割合 30%
控除 −¥162,000
免責金額
控除 −¥50,000
既払金(内払)
控除 −¥100,000
今回支払額
¥228,000
今回支払額 = 認定損害額 - 過失相殺 - 免責 - 既払金
状態とバリエーション
支払明細
行、控除、小計、導出合計を1つの読み取り専用ブロックで表示します。
過失割合
認定損害額
修理費
¥480,000
レッカー費用
¥22,000
代車費用
¥38,000
認定損害額 計
¥540,000
過失相殺
認定額 × 過失割合 30%
控除 −¥162,000
免責金額
控除 −¥50,000
既払金(内払)
控除 −¥100,000
今回支払額
¥228,000
今回支払額 = 認定損害額 - 過失相殺 - 免責 - 既払金
控除なし
上位の入力で金額が変わる場合も、AmountBreakdown は導出済みの値を表示します。
過失割合
認定損害額
修理費
¥480,000
レッカー費用
¥22,000
代車費用
¥38,000
認定損害額 計
¥540,000
過失相殺
認定額 × 過失割合 0%
控除 −¥0
免責金額
控除 −¥50,000
既払金(内払)
控除 −¥100,000
今回支払額
¥390,000
今回支払額 = 認定損害額 - 過失相殺 - 免責 - 既払金
合計のトーン
戻る額は positive、足りない額は negative。控除行のマイナスは本物の − 記号なので、色が読めなくても符号が分かります。
中途解約の精算
年間保険料
¥84,000
経過分保険料
5か月ぶん
控除 −¥35,000
返戻金
¥49,000
返戻金 = 年間保険料 - 経過分保険料
認定損害額
修理費
¥180,000
認定損害額 計
¥180,000
過失相殺
認定額 × 過失割合 50%
控除 −¥90,000
免責金額
控除 −¥50,000
既払金(内払)
控除 −¥100,000
今回支払額
-¥60,000
今回支払額 = 認定損害額 - 過失相殺 - 免責 - 既払金
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| lines | AmountLine[] | - | 内訳行です。line / subtotal / heading を順番通りに混在できます。 |
| AmountLine.kind | "add" | "subtract" | "add" | subtract は金額にマイナス記号を付け、控除として読み取れるトーンで表示します。 |
| total | { label: ReactNode; amount: number; tone?: 'neutral' | 'positive' | 'negative' } | - | 強調する導出合計です。 |
| formula | ReactNode | - | 合計の下に表示する計算式や補足です。 |
| formatValue | (value: number) => string | formatCurrency | 金額の整形関数です。既定は ja-JP / JPY の formatCurrency です。 |
使い方
import * as React from "react";
import { AmountBreakdown, Card, ToggleGroup, ToggleGroupItem, type AmountLine } from "@gunjo/ui";
const certified = [
{ label: "修理費", amount: 480000 },
{ label: "レッカー費用", amount: 22000 },
{ label: "代車費用", amount: 38000 },
];
export function ClaimPaymentBreakdown() {
const [fault, setFault] = React.useState("30");
const certifiedTotal = certified.reduce((sum, line) => sum + line.amount, 0);
const faultDeduction = Math.round(certifiedTotal * (Number(fault) / 100));
const deductible = 50000;
const paid = 100000;
const payment = certifiedTotal - faultDeduction - deductible - paid;
const lines: AmountLine[] = [
{ type: "heading", label: "認定損害額" },
...certified,
{ type: "subtotal", label: "認定損害額 計", amount: certifiedTotal },
{
label: "過失相殺",
kind: "subtract",
amount: faultDeduction,
note: `認定額 × 過失割合 ${fault}%`,
},
{ label: "免責金額", kind: "subtract", amount: deductible },
{ label: "既払金(内払)", kind: "subtract", amount: paid },
];
return (
<div className="flex w-full max-w-md flex-col gap-4">
<div className="flex flex-wrap items-center gap-3 text-sm">
<span className="text-muted-foreground">過失割合</span>
<ToggleGroup
type="single"
value={fault}
onValueChange={(value) => value && setFault(value)}
variant="outline"
size="sm"
disallowEmpty
aria-label="過失割合"
>
{["0", "20", "30", "50"].map((option) => (
<ToggleGroupItem
key={option}
value={option}
aria-label={`過失割合 ${option}%`}
>
{option}%
</ToggleGroupItem>
))}
</ToggleGroup>
</div>
<Card className="p-5">
<AmountBreakdown
lines={lines}
total={{ label: "今回支払額", amount: payment, tone: payment >= 0 ? "neutral" : "negative" }}
formula="今回支払額 = 認定損害額 - 過失相殺 - 免責 - 既払金"
/>
</Card>
</div>
);
}