金額内訳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

今回支払額 = 認定損害額 - 過失相殺 - 免責 - 既払金

プロパティ

表は横にスクロールできます
プロパティ初期値説明
linesAmountLine[]-内訳行です。line / subtotal / heading を順番通りに混在できます。
AmountLine.kind"add" | "subtract""add"subtract は金額にマイナス記号を付け、控除として読み取れるトーンで表示します。
total{ label: ReactNode; amount: number; tone?: 'neutral' | 'positive' | 'negative' }-強調する導出合計です。
formulaReactNode-合計の下に表示する計算式や補足です。
formatValue(value: number) => stringformatCurrency金額の整形関数です。既定は 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>
  );
}

使用コンポーネント