# ERP会計管理システム 論理データモデル

以下に、ERP会計管理システムの論理データモデルをmermaidで表現します。モデルは予算管理、実績管理、固定資産管理、棚卸資産管理、税務管理、連結会計などの機能をカバーしています。

```mermaid
erDiagram
    User ||--o{ UserRole : has
    UserRole }o--|| Role : belongs_to
    Department ||--o{ User : belongs_to
    Department ||--o{ BudgetPlan : creates
    Department ||--o{ ActualData : has
    Department ||--o{ InternalTransaction : participates
    
    BudgetTemplate ||--o{ BudgetPlan : based_on
    BudgetTemplate {
        int template_id PK
        string template_name
        string description
        date created_at
        date updated_at
        bool is_standard
        int department_id FK
        int fiscal_year
    }
    
    BudgetPlan ||--o{ BudgetRevisionRequest : has
    BudgetPlan ||--o{ BudgetItem : contains
    BudgetPlan {
        int budget_plan_id PK
        int department_id FK
        int fiscal_year
        date submission_date
        string status
        string version
        int template_id FK
        int created_by FK
        date created_at
        date updated_at
    }
    
    BudgetItem {
        int budget_item_id PK
        int budget_plan_id FK
        int account_id FK
        decimal amount
        string period
        string description
        date created_at
        date updated_at
    }
    
    BudgetRevisionRequest {
        int revision_request_id PK
        int budget_plan_id FK
        string revision_details
        date request_date
        string status
        int requested_by FK
        int responded_by FK
        date response_date
        string response_details
    }
    
    ConsolidatedBudget ||--o{ BudgetPlan : includes
    ConsolidatedBudget {
        int consolidated_budget_id PK
        int fiscal_year
        date creation_date
        string status
        string version
        int created_by FK
        date created_at
        date updated_at
    }
    
    BudgetApprovalWorkflow ||--|| ConsolidatedBudget : approves
    BudgetApprovalWorkflow {
        int workflow_id PK
        int consolidated_budget_id FK
        string current_status
        date start_date
        date end_date
        string comments
    }
    
    BudgetApprovalStep ||--|| BudgetApprovalWorkflow : part_of
    BudgetApprovalStep {
        int step_id PK
        int workflow_id FK
        int approver_id FK
        int step_order
        string status
        date action_date
        string comments
    }
    
    BudgetSimulation ||--|| ConsolidatedBudget : based_on
    BudgetSimulation {
        int simulation_id PK
        int consolidated_budget_id FK
        string simulation_name
        string description
        json parameters
        date created_at
        int created_by FK
    }
    
    ActualData ||--o{ ActualDataItem : contains
    ActualData {
        int actual_data_id PK
        int department_id FK
        date period_start
        date period_end
        date import_date
        string source_system
        string status
        int imported_by FK
    }
    
    ActualDataItem {
        int actual_item_id PK
        int actual_data_id FK
        int account_id FK
        decimal amount
        date transaction_date
        string description
        string reference_no
    }
    
    BudgetActualComparison ||--|| BudgetPlan : compares_budget
    BudgetActualComparison ||--|| ActualData : compares_actual
    BudgetActualComparison {
        int comparison_id PK
        int budget_plan_id FK
        int actual_data_id FK
        date period_start
        date period_end
        date calculation_date
        string status
    }
    
    VarianceAnalysis ||--|| BudgetActualComparison : analyzes
    VarianceAnalysis {
        int analysis_id PK
        int comparison_id FK
        string analysis_method
        json analysis_results
        date analysis_date
        int analyzed_by FK
    }
    
    BudgetActualAlert ||--|| BudgetActualComparison : triggered_by
    BudgetActualAlert {
        int alert_id PK
        int comparison_id FK
        string alert_type
        string alert_message
        decimal threshold_value
        decimal actual_value
        date alert_date
        bool is_acknowledged
        date acknowledged_at
        int acknowledged_by FK
    }
    
    Report ||--o{ ReportDistribution : has
    Report {
        int report_id PK
        string report_type
        string report_name
        string description
        date report_period_start
        date report_period_end
        date generated_at
        int generated_by FK
        string file_format
        string file_path
        bool is_custom
        json template_parameters
    }
    
    ReportDistribution {
        int distribution_id PK
        int report_id FK
        int recipient_id FK
        string distribution_method
        date scheduled_date
        date sent_date
        string status
    }
    
    Account ||--|| AccountCategory : belongs_to
    Account {
        int account_id PK
        string account_code
        string account_name
        string description
        bool is_active
        int category_id FK
        bool is_budget_relevant
        string budget_control_type
    }
    
    AccountCategory {
        int category_id PK
        string category_name
        string description
        int parent_category_id FK
        int display_order
    }
    
    User {
        int user_id PK
        string username
        string email
        string full_name
        string password_hash
        bool is_active
        date last_login
        int department_id FK
        string contact_info
    }
    
    Role {
        int role_id PK
        string role_name
        string description
        json permissions
    }
    
    UserRole {
        int user_role_id PK
        int user_id FK
        int role_id FK
        date assigned_date
        int assigned_by FK
    }
    
    Department {
        int department_id PK
        string department_code
        string department_name
        string description
        int parent_department_id FK
        int manager_id FK
        bool is_active
        string cost_allocation_rule
    }
    
    FixedAsset ||--|| DepreciationSchedule : has
    FixedAsset {
        int asset_id PK
        string asset_code
        string asset_name
        string description
        date acquisition_date
        decimal acquisition_cost
        int department_id FK
        string location
        string asset_status
        date disposal_date
        decimal disposal_value
        string asset_category
        string serial_number
        int useful_life_years
        int created_by FK
        date created_at
        date updated_at
    }
    
    DepreciationSchedule {
        int schedule_id PK
        int asset_id FK
        string depreciation_method
        decimal salvage_value
        date start_date
        int useful_life_months
        decimal monthly_depreciation
        bool is_active
    }
    
    DepreciationEntry ||--|| DepreciationSchedule : based_on
    DepreciationEntry {
        int entry_id PK
        int schedule_id FK
        date entry_date
        decimal depreciation_amount
        decimal accumulated_depreciation
        decimal book_value
        bool is_posted
        date posted_date
        int accounting_period_id FK
    }
    
    InventoryItem {
        int inventory_item_id PK
        string item_code
        string item_name
        string description
        string category
        string unit_of_measure
        decimal standard_cost
        string valuation_method
        bool is_active
        int department_id FK
    }
    
    InventoryCount ||--o{ InventoryCountItem : includes
    InventoryCount {
        int count_id PK
        date count_date
        string status
        int department_id FK
        int initiated_by FK
        int approved_by FK
        date approved_date
        string comments
    }
    
    InventoryCountItem ||--|| InventoryItem : counts
    InventoryCountItem {
        int count_item_id PK
        int count_id FK
        int inventory_item_id FK
        decimal book_quantity
        decimal counted_quantity
        decimal variance_quantity
        decimal variance_value
        string variance_reason
        string location
    }
    
    InventoryValuation ||--o{ InventoryValuationItem : contains
    InventoryValuation {
        int valuation_id PK
        date valuation_date
        int department_id FK
        string status
        int performed_by FK
        date created_at
    }
    
    InventoryValuationItem ||--|| InventoryItem : values
    InventoryValuationItem {
        int valuation_item_id PK
        int valuation_id FK
        int inventory_item_id FK
        decimal quantity
        decimal unit_value
        decimal total_value
        decimal adjustment_value
        string adjustment_reason
    }
    
    TaxData {
        int tax_data_id PK
        int fiscal_year
        int fiscal_period
        date period_start
        date period_end
        int department_id FK
        string data_source
        date collection_date
        int collected_by FK
    }
    
    ConsumptionTaxCalculation ||--|| TaxData : based_on
    ConsumptionTaxCalculation {
        int calculation_id PK
        int tax_data_id FK
        decimal taxable_sales
        decimal non_taxable_sales
        decimal exempt_sales
        decimal taxable_purchases
        decimal tax_amount
        decimal deductible_tax
        decimal payable_tax
        date calculation_date
        int calculated_by FK
    }
    
    CorporateTaxCalculation ||--|| TaxData : based_on
    CorporateTaxCalculation {
        int calculation_id PK
        int tax_data_id FK
        decimal taxable_income
        decimal tax_credits
        decimal carried_losses
        decimal tax_amount
        json tax_adjustments
        date calculation_date
        int calculated_by FK
    }
    
    LocalTaxCalculation ||--|| TaxData : based_on
    LocalTaxCalculation {
        int calculation_id PK
        int tax_data_id FK
        decimal business_tax_base
        decimal resident_tax_base
        decimal business_tax_amount
        decimal resident_tax_amount
        decimal property_tax_amount
        decimal total_tax_amount
        date calculation_date
        int calculated_by FK
    }
    
    TaxReturn ||--o{ TaxReturnDocument : includes
    TaxReturn {
        int return_id PK
        string tax_type
        int fiscal_year
        date filing_period_start
        date filing_period_end
        date submission_deadline
        date submission_date
        string submission_method
        string receipt_number
        string status
        int prepared_by FK
        int reviewed_by FK
        date reviewed_date
        string comments
    }
    
    TaxReturnDocument {
        int document_id PK
        int return_id FK
        string document_type
        string document_name
        string file_path
        date created_date
        int created_by FK
    }
    
    InternalTransaction ||--|| Department : from_department
    InternalTransaction ||--|| Department : to_department
    InternalTransaction {
        int transaction_id PK
        int from_department_id FK
        int to_department_id FK
        date transaction_date
        decimal amount
        string description
        string transaction_type
        string reference_number
        string status
        bool is_reconciled
    }
    
    InternalTransactionReconciliation ||--|| InternalTransaction : reconciles
    InternalTransactionReconciliation {
        int reconciliation_id PK
        int transaction_id FK
        date reconciliation_date
        string reconciliation_status
        decimal variance_amount
        string variance_reason
        int reconciled_by FK
    }
    
    ConsolidationJournal {
        int journal_id PK
        int fiscal_year
        int fiscal_period
        date journal_date
        string journal_type
        string description
        decimal total_debit
        decimal total_credit
        string status
        int created_by FK
        date created_at
    }
    
    ConsolidationJournalEntry ||--|| ConsolidationJournal : belongs_to
    ConsolidationJournalEntry ||--|| Account : affects_account
    ConsolidationJournalEntry {
        int entry_id PK
        int journal_id FK
        int account_id FK
        string entry_type
        decimal amount
        string description
        int department_id FK
    }
    
    ConsolidatedFinancialStatement ||--o{ ConsolidationJournal : based_on
    ConsolidatedFinancialStatement {
        int statement_id PK
        string statement_type
        int fiscal_year
        int fiscal_period
        date period_start
        date period_end
        date generation_date
        string status
        int generated_by FK
        date approved_date
        int approved_by FK
    }
    
    AccountingPeriod {
        int period_id PK
        string period_name
        date start_date
        date end_date
        int fiscal_year
        int period_number
        string status
        date closing_date
    }
    
    ExchangeRate {
        int rate_id PK
        string from_currency
        string to_currency
        date effective_date
        decimal rate_value
        string rate_type
        int created_by FK
        date created_at
    }
    
    AuditLog {
        int log_id PK
        int user_id FK
        date log_date
        string action_type
        string entity_type
        int entity_id
        json old_values
        json new_values
        string ip_address
    }
```

## エンティティ説明

### 1. ユーザー管理関連

#### User（ユーザー）
システムを利用するユーザーの情報を管理します。経理担当者、経理部長、各部門担当者などのユーザー情報が格納されます。

#### Role（役割）
システム内での役割（経理担当者、経理部長、部門担当者など）と、それぞれの権限セットを定義します。

#### UserRole（ユーザー役割）
ユーザーと役割の関連付けを管理します。一人のユーザーが複数の役割を持つことができます。

#### Department（部門）
組織の部門構造を管理します。部門階層、コスト配賦ルール、責任者などの情報が含まれます。

### 2. 予算管理関連

#### BudgetTemplate（予算テンプレート）
予算作成の基礎となるテンプレートを管理します。標準テンプレートや部門別にカスタマイズされたテンプレートがあります。

#### BudgetPlan（予算案）
各部門が作成する予算案を管理します。予算テンプレートに基づいて作成され、各勘定科目の予算金額が含まれます。

#### BudgetItem（予算項目）
予算案の個別項目を管理します。特定の勘定科目に対する予算金額、期間、説明などが含まれます。

#### BudgetRevisionRequest（予算修正依頼）
予算案に対する修正依頼を管理します。修正内容、依頼者、対応状況などの情報が含まれます。

#### ConsolidatedBudget（全社予算）
各部門の予算案を統合した全社予算を管理します。承認ワークフローの対象となります。

#### BudgetApprovalWorkflow（予算承認ワークフロー）
全社予算の承認プロセスを管理します。承認状態、開始日、終了日などの情報が含まれます。

#### BudgetApprovalStep（予算承認ステップ）
予算承認ワークフローの個別ステップを管理します。承認者、承認順序、ステータスなどの情報が含まれます。

#### BudgetSimulation（予算シミュレーション）
様々なシナリオに基づく予算シミュレーションを管理します。シミュレーションパラメータや結果が含まれます。

### 3. 実績管理関連

#### ActualData（実績データ）
会計システムから取得した実績データを管理します。部門、期間、インポート日などの情報が含まれます。

#### ActualDataItem（実績データ項目）
実績データの個別項目を管理します。勘定科目、金額、取引日などの情報が含まれます。

#### BudgetActualComparison（予算実績比較）
予算と実績の比較分析を管理します。比較期間、計算日、ステータスなどの情報が含まれます。

#### VarianceAnalysis（差異分析）
予算実績比較の差異分析結果を管理します。分析方法、分析結果、分析日などの情報が含まれます。

#### BudgetActualAlert（予算実績アラート）
予算と実績の差異が閾値を超えた場合のアラートを管理します。アラートタイプ、メッセージ、閾値などの情報が含まれます。

### 4. レポート関連

#### Report（レポート）
システムで生成されるレポートを管理します。レポートタイプ、名前、生成日などの情報が含まれます。

#### ReportDistribution（レポート配信）
レポートの配信情報を管理します。受信者、配信方法、配信日などの情報が含まれます。

### 5. 勘定科目関連

#### Account（勘定科目）
システムで使用する勘定科目を管理します。勘定科目コード、名前、カテゴリなどの情報が含まれます。

#### AccountCategory（勘定科目カテゴリ）
勘定科目の分類カテゴリを管理します。カテゴリ名、説明、親カテゴリなどの情報が含まれます。

### 6. 固定資産管理関連

#### FixedAsset（固定資産）
会社が保有する固定資産を管理します。資産コード、名前、取得日、取得原価などの情報が含まれます。

#### DepreciationSchedule（減価償却スケジュール）
固定資産の減価償却スケジュールを管理します。償却方法、残存価額、耐用年数などの情報が含まれます。

#### DepreciationEntry（減価償却仕訳）
減価償却の個別仕訳を管理します。仕訳日、償却額、累計償却額などの情報が含まれます。

### 7. 棚卸資産管理関連

#### InventoryItem（棚卸資産項目）
棚卸対象となる資産項目を管理します。項目コード、名前、標準原価などの情報が含まれます。

#### InventoryCount（棚卸実施）
実地棚卸の実施情報を管理します。棚卸日、ステータス、実施部門などの情報が含まれます。

#### InventoryCountItem（棚卸実施項目）
棚卸の個別項目を管理します。帳簿数量、実地数量、差異などの情報が含まれます。

#### InventoryValuation（棚卸資産評価）
棚卸資産の評価情報を管理します。評価日、部門、ステータスなどの情報が含まれます。

#### InventoryValuationItem（棚卸資産評価項目）
棚卸資産評価の個別項目を管理します。数量、単価、総額などの情報が含まれます。

### 8. 税務管理関連

#### TaxData（税務データ）
税務計算の基礎となるデータを管理します。会計年度、期間、データソースなどの情報が含まれます。

#### ConsumptionTaxCalculation（消費税計算）
消費税の計算結果を管理します。課税売上、非課税売上、税額などの情報が含まれます。

#### CorporateTaxCalculation（法人税計算）
法人税の計算結果を管理します。課税所得、税額控除、納税額などの情報が含まれます。

#### LocalTaxCalculation（地方税計算）
地方税の計算結果を管理します。事業税、住民税、固定資産税などの情報が含まれます。

#### TaxReturn（税務申告）
税務申告書の提出情報を管理します。税種、会計年度、提出期限などの情報が含まれます。

#### TaxReturnDocument（税務申告書類）
税務申告に関連する書類を管理します。書類タイプ、ファイルパスなどの情報が含まれます。

### 9. 連結会計関連

#### InternalTransaction（内部取引）
グループ会社間の内部取引を管理します。取引部門、金額、取引タイプなどの情報が含まれます。

#### InternalTransactionReconciliation（内部取引照合）
内部取引の照合結果を管理します。照合日、ステータス、差異などの情報が含まれます。

#### ConsolidationJournal（連結仕訳）
連結決算のための仕訳を管理します。仕訳日、仕訳タイプ、合計金額などの情報が含まれます。

#### ConsolidationJournalEntry（連結仕訳明細）
連結仕訳の明細を管理します。勘定科目、金額、説明などの情報が含まれます。

#### ConsolidatedFinancialStatement（連結財務諸表）
連結財務諸表の情報を管理します。財務諸表タイプ、会計年度、作成日などの情報が含まれます。

### 10. システム管理関連

#### AccountingPeriod（会計期間）
システムで使用する会計期間を管理します。期間名、開始日、終了日などの情報が含まれます。

#### ExchangeRate（為替レート）
連結会計で使用する為替レートを管理します。通貨ペア、レート値、有効日などの情報が含まれます。

#### AuditLog（監査ログ）
システム内の重要な操作の監査ログを管理します。ユーザー、操作日時、操作内容などの情報が含まれます。
