# 複数税率対応実装完了

## 概要

一般税率（10%）と軽減税率（8%）など、実際の請求行内に複数税率が存在する場合や、請求項目追加後に税率をユーザーが変更する場合でも、リアルタイムに正しく計算されるシステムを実装しました。

## 実装内容

### 1. フロントエンド（JavaScript）の改善

#### 請求項目（`js/ktp-invoice-items.js`）
- **`updateTotalAndProfit()`関数の修正**
  - 各項目の税率を個別に計算
  - 税率別の集計機能を追加
  - 内税・外税の両方で税率別の内訳表示

#### コスト項目（`js/ktp-cost-items.js`）
- **`updateProfitDisplay()`関数の修正**
  - 税率別の計算を実装
  - 税率変更時のリアルタイム再計算を追加

#### 税率変更時のリアルタイム再計算
- 税率フィールドの`change`イベントで自動保存と再計算
- 税率フィールドの`input`イベントでリアルタイム表示更新
- 請求項目とコスト項目の両方に対応

### 2. バックエンド（PHP）の改善

#### メール本文生成（`includes/class-ktpwp-ajax.php`）
- **`ajax_get_email_content()`メソッドの修正**
  - 税率別の集計機能を追加
  - 内税計算を複数税率に対応

#### 受注書表示（`includes/class-tab-order.php`）
- **メール生成部分の修正**
  - 税率別の集計機能を追加
  - 旧形式JSONデータの処理も対応
- **プレビュー生成部分の修正**
  - 税率別の内訳表示を実装

### 3. 計算ロジックの改善

#### 内税計算
```php
// 税率別に集計
$tax_rate_groups = array();
foreach ($items as $item) {
    $tax_rate_key = number_format($tax_rate, 1);
    if (!isset($tax_rate_groups[$tax_rate_key])) {
        $tax_rate_groups[$tax_rate_key] = 0;
    }
    $tax_rate_groups[$tax_rate_key] += $item_amount;
}

// 各税率グループごとに計算
foreach ($tax_rate_groups as $tax_rate => $group_amount) {
    $tax_rate_value = floatval($tax_rate);
    $tax_amount = ceil($group_amount * ($tax_rate_value / 100) / (1 + $tax_rate_value / 100));
    $total_tax_amount += $tax_amount;
    $tax_rate_details[] = $tax_rate . '%: ' . number_format($tax_amount) . '円';
}
```

#### 外税計算
```php
// 各項目ごとに計算
foreach ($items as $item) {
    $tax_amount = ceil($item_amount * ($tax_rate / 100));
    $total_tax_amount += $tax_amount;
}
```

### 4. 表示機能の改善

#### 税率別の表示
- **内税表示**: `金額合計：3,500円　（内税：10%: 273円, 8%: 119円）`
- **外税表示**: `消費税 : 392円 (10%: 200円, 8%: 120円)`

#### 単一税率の場合
- **内税表示**: `金額合計：3,500円　（内税：273円）`
- **外税表示**: `消費税 : 273円`

## 主な特徴

### 1. リアルタイム計算
- 税率を変更すると即座に合計と利益が再計算
- 入力中でもリアルタイムで表示更新

### 2. 複数税率対応
- 一般税率（10%）と軽減税率（8%）が混在しても正しく計算
- 税率別の内訳表示で透明性を確保

### 3. 自動保存
- 税率変更時にデータベースに自動保存
- データの整合性を維持

### 4. 税率別表示
- 複数税率がある場合は税率別の内訳を表示
- 単一税率の場合は従来通りの表示

### 5. 小数点以下切り上げ
- すべての計算で小数点以下切り上げを統一
- 税務処理に準拠

## テスト方法

### 1. 基本テスト
1. 請求項目を追加し、異なる税率を設定
2. 税率を変更してリアルタイム計算を確認
3. メール本文の税率計算を確認

### 2. 複数税率テスト
1. 10%税率の項目と8%税率の項目を混在
2. 内税・外税の両方で計算を確認
3. 税率別の内訳表示を確認

### 3. テストファイル
`test_multiple_tax_rates.php`で様々な税率の組み合わせをテスト可能

## 対応ファイル一覧

### JavaScript
- `js/ktp-invoice-items.js` - 請求項目の複数税率対応
- `js/ktp-cost-items.js` - コスト項目の複数税率対応

### PHP
- `includes/class-ktpwp-ajax.php` - メール本文生成の複数税率対応
- `includes/class-tab-order.php` - 受注書表示の複数税率対応

### テスト
- `test_multiple_tax_rates.php` - 複数税率計算テスト

## 技術仕様

### 計算式
- **内税**: `Math.ceil(金額 × 税率 / (1 + 税率))`
- **外税**: `Math.ceil(金額 × 税率)`

### データ構造
```php
$tax_rate_groups = [
    '10.0' => 3000,  // 10%税率の項目合計
    '8.0' => 500     // 8%税率の項目合計
];
```

### 表示形式
```php
// 複数税率の場合
'（内税：10.0%: 273円, 8.0%: 37円）'

// 単一税率の場合
'（内税：273円）'
```

## 今後の拡張性

1. **新しい税率の追加**: 税率設定を動的に管理可能
2. **税率履歴**: 税率変更の履歴を記録
3. **税率検証**: 不正な税率の入力チェック
4. **税率テンプレート**: よく使う税率の組み合わせを保存

## 注意事項

1. **小数点以下切り上げ**: すべての計算で統一
2. **税率の有効性**: 0%以上100%未満の範囲で検証
3. **データ整合性**: 税率変更時の自動保存で整合性を維持
4. **パフォーマンス**: 大量データでもリアルタイム計算が可能

## 実装完了日

2025年1月22日

## 実装者

AI Assistant

---

この実装により、複数税率に対応した正確で透明性の高い税計算システムが完成しました。 