# CLAUDE.md

このファイルは、リポジトリのコードを扱う際にClaude Code (claude.ai/code) へのガイダンスを提供します。

## 概要

**CakePHP 2.x** 製の日本語介護管理SaaSプラットフォーム「Lecaldo」のWebアプリケーションです（reniadev.comは開発用ドメイン）。マルチテナント構成で、サブドメインによってテナントを識別し、`AppModel`がログインユーザーの`db_id`（テナントDB）に基づいてMySQLデータベースを動的に切り替えます。システム全体のユーザー・会社レコード用に共有の`super`データベースもあります。

アプリケーションは`/srv/reniadev.com/m/`（CakePHPルート）以下で動作します。Webrootは`m/app/webroot/`です。

## アプリケーションの起動

ビルド手順はありません。従来のLAMPスタックPHPアプリです：
- PHPはApache/Nginxを通じて`m/app/webroot/`を配信
- データベース: MySQL（認証情報は`m/app/Config/database.php`）
  - `default`接続: テナントごとのデータベース（名前は実行時に動的に設定）
  - `super`接続: `super`データベース（システム全体のユーザー・会社情報）

## コンソール（バッチジョブ）

CakePHP Shellコマンドは`m/app/Console/Command/`にあります。以下の方法で実行します：

```bash
cd /srv/reniadev.com/m
./Console/cake <ShellName>
```

各シェルには対応する`.sh`ラッパースクリプトがあります（例：`CheckData.sh`、`CreateResults.sh`）。cronジョブはこれらのシェルスクリプトを直接呼び出します。

## アーキテクチャ

### マルチテナント
- `AppModel::__construct()`が`UtilityComponent::check_user()`を呼び出し、`super`データベースから現在のユーザーの`db_id`を取得し、全モデルクエリのアクティブなMySQLデータベースを切り替えます。テナントデータはサブドメインごとに別データベースに格納されます。
- `super`データベースには`Users`テーブル（`sub_domain`と`db_id`フィールド）があり、サブドメインをテナントデータベースにマッピングします。

### 認証・認可
- セッションベース認証。`AppController::beforeFilter()`が全リクエストで`Session->read('id')`を確認します。
- 許可リストに登録されたアクション（ログイン、APIエンドポイントなど）は`AppController`の`$permit_actions`で定義されています。
- メニューレベルの権限は`LoginUserAuthorities`モデルと`m/app/Config/const.php`の`menuArr`設定で定義されています。
- `id == 1`のユーザー（本部）は専用の`honbu`レイアウトが適用されます。
- サブドメイン`urawa`は`oomiya.lecaldo.org`にハードリダイレクトされます。

### 主要ドメイン概念（介護管理）
- **ラダー**: 看護スタッフのスキル・コンピテンシー管理システム。エンティティ: `Ladders`、`LadderLevels`、`LadderSkills`、`LadderProcesses`、`LadderRanks`、`LadderUsers`。
- **Customers（利用者）**: 介護サービス利用者・患者。
- **Users / Loginuser**: スタッフ・看護師アカウント。
- **Companys**: テナント企業・事業所。
- **Parameters**: テナントごとの設定可能なシステムパラメータ。
- **Informations**: お知らせ・情報投稿。
- **MailTemplates / Mails**: メールテンプレートおよび送信管理。

### 設定
- `m/app/Config/const.php`: アプリケーション定数、`THIS_SERVICE_DOMAIN`、メニュー権限配列、アップロードディレクトリパス（実行時に置換される`[sub_domain]`プレースホルダーを使用）、ドメイン別設定配列。
- `m/app/Config/database.php`: DB認証情報。
- `m/app/Config/app_config.php`: `SHELL_PATH`定数を定義。
- `m/app/Config/routes.php`: ルートルートは`customers/login`を指定。

### コントローラー・コンポーネント
- `AppController`（`m/app/Controller/AppController.php`）: 認証チェック、セッション読み込み、操作ログ記録（`tmp/logs/`配下にサブドメインごとの日次ログファイル）、ヘルパーメソッド（`getTmpDir()`、`getUploadDir()`、`getUserSiteUrl()`）を持つ基底コントローラー。
- `UtilityComponent`（`m/app/Controller/Component/UtilityComponent.php`）: `check_user()`（テナント解決）、検索セッションヘルパー、Excelエクスポート（PHPExcelベンダー経由）、タブリンクHTMLジェネレーターを含む共通ユーティリティ。
- `ImageComponent`: 画像処理。
- `SoapComponent`: SOAPクライアントラッパー。
- `Base64Email`: Base64エンコードのメール送信。

### モデル
- `AppModel`（`m/app/Model/AppModel.php`）: SoftDeleteビヘイビア、コンストラクターでの動的DB切り替え、`beforeSave`での`mb_convert_kana`正規化を持つ基底モデル。
- モデルはSoftDeleteビヘイビアを使用します（物理削除ではなく論理削除フラグ）。

### ビュー
- テンプレートは`.ctp`拡張子を使用（CakePHPテンプレートファイル）。
- レイアウトは`m/app/View/Layouts/`配下: `default`、`honbu`、`adminlist`、`order`、`pet`、`ajax`。
- メールテンプレートは`m/app/View/Emails/`および`m/app/View/Layouts/Emails/`配下。
- PDF生成ビューは`m/app/View/PdfCommon/`配下。

### ファイルアップロード
アップロードディレクトリは`const.php`で`$config['*_UPLOAD_DIR']`として`[sub_domain]`プレースホルダーつきで設定されます。実行時に`AppController::getUploadDir($name)`がパスを解決し、必要に応じてディレクトリを作成します。アップロードパスは`/srv/reniadev.com/m/app/*_files/[sub_domain]/`配下です。

### `bk/`ディレクトリ
`Controller/`および`Console/Command/`配下の`bk/`サブディレクトリにあるファイルはバックアップ・旧バージョンであり、アクティブなコードではありません。
