README.md

# PhoenixKitCRM

CRM module for [PhoenixKit](https://github.com/BeamLabEU/phoenix_kit) — implements the `PhoenixKit.Module` behaviour for auto-discovery by a parent Phoenix application.

This is an early skeleton scaffolded from
[phoenix_kit_hello_world](https://github.com/BeamLabEU/phoenix_kit_hello_world).
The Companies subtab is a placeholder until the legal-entity schema lands;
roles and per-user view configuration are already wired up.

## Features

- **Admin sidebar** — `CRM` parent tab with **Overview** and (opt-in) **Companies** subtabs.
- **Role opt-in** — choose which non-system roles can access CRM; enabled roles get their own subtab under `/admin/crm/role/:role_uuid`.
- **Per-user column config** — each admin can pick which columns to show on the Companies and per-role pages; layout is persisted in `phoenix_kit_crm_user_role_view`.
- **Settings page** — toggle the module, opt roles in/out, and enable/disable the Companies section.
- **Auto-discovery** — no parent-app router edits; PhoenixKit picks the module up via the `@phoenix_kit_module` beam attribute.

## Installation

Add to the parent PhoenixKit app's `mix.exs`:

```elixir
# Local development
{:phoenix_kit_crm, path: "../phoenix_kit_crm"}

# or, once published / pinned to a tag
{:phoenix_kit_crm, "~> 0.1"}
```

Then `mix deps.get`. The module appears in **Admin > Modules** and the
sidebar automatically; toggle it on to expose `/admin/crm`.

## Routes

| Path                                   | LiveView                              |
|----------------------------------------|---------------------------------------|
| `/admin/crm`                           | `PhoenixKitCRM.Web.CRMLive`           |
| `/admin/crm/companies`                 | `PhoenixKitCRM.Web.CompaniesView`     |
| `/admin/crm/role/:role_uuid`           | `PhoenixKitCRM.Web.RoleView`          |
| `/admin/settings/crm`                  | `PhoenixKitCRM.Web.SettingsLive`      |

The `Companies` and per-role routes are gated by settings — the section
appears only after it's toggled on under **Admin > Settings > CRM**.

## Database

Two module-owned tables are required:

- `phoenix_kit_crm_role_settings` — which roles have CRM access enabled
- `phoenix_kit_crm_user_role_view` — per-user, per-scope view configuration

Following the PhoenixKit convention, **migrations live in `phoenix_kit`
core**, not in this repo. The parent app applies them via
`mix phoenix_kit.install` / `mix phoenix_kit.update`.

## Settings keys

- `crm_enabled` — module on/off (also reflected on the Modules page)
- `crm_companies_enabled` — Companies subtab visibility

## Development

```sh
mix deps.get
mix compile
mix test            # unit tests; integration tests excluded if no DB
mix precommit       # compile + format + credo --strict + dialyzer
```

For integration tests, create the test database once:

```sh
createdb phoenix_kit_crm_test
mix test.setup      # ecto.create + ecto.migrate against the test repo
```

See [`AGENTS.md`](AGENTS.md) for the development conventions, file layout,
and testing setup.

## License

MIT — see [LICENSE](LICENSE).