{"id":49109250,"url":"https://github.com/kuan-m/crm","last_synced_at":"2026-04-21T03:34:16.737Z","repository":{"id":343986185,"uuid":"1177770978","full_name":"kuan-m/crm","owner":"kuan-m","description":"A modular monolith CRM built with Laravel","archived":false,"fork":false,"pushed_at":"2026-03-28T13:26:25.000Z","size":224,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-28T16:32:33.836Z","etag":null,"topics":["crm","crud","docker","laravel","modular-monolith","rest-api"],"latest_commit_sha":null,"homepage":"https://crm.kuan.uk/widget","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kuan-m.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-10T11:00:54.000Z","updated_at":"2026-03-28T13:26:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kuan-m/crm","commit_stats":null,"previous_names":["kuan-m/crm"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kuan-m/crm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuan-m%2Fcrm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuan-m%2Fcrm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuan-m%2Fcrm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuan-m%2Fcrm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kuan-m","download_url":"https://codeload.github.com/kuan-m/crm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuan-m%2Fcrm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32075253,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T02:38:07.213Z","status":"ssl_error","status_checked_at":"2026-04-21T02:38:06.559Z","response_time":128,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crm","crud","docker","laravel","modular-monolith","rest-api"],"created_at":"2026-04-21T03:34:15.213Z","updated_at":"2026-04-21T03:34:16.727Z","avatar_url":"https://github.com/kuan-m.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CRM \r\nСистема для управления тикетами. Состоит из клиентского виджета для подачи заявок и панели управления для менеджеров\r\n\r\n## Быстрый старт\r\n\r\nРазвернуть локально можно одной командой:\r\n```bash\r\nmake dev-init\r\n```\r\n*С нуля до конца поднимет приложение, накатит миграции и применит сидеры (tickets, users (manager), customer). В последующем проект поднимать через make up*\r\n\r\n### 🔗Ссылки:\r\n- **Приложение:** [http://localhost:8085](http://localhost:8085)\r\n- **Виджет:** [http://localhost:8085/widget](http://localhost:8085/widget)\r\n- **Админка:** [http://localhost:8085/manager/login](http://localhost:8085/manager/login) (Данные уже подставлены (если нет то запустите make dev-seed), просто нажмите \"Войти\". Данные для ручного ввода: `admin@crm.test` / `password`)\r\n- **Swagger:** [http://localhost:8085/swagger](http://localhost:8085/swagger)\r\n\r\n---\r\n## Интеграция виджета\r\n\r\nЧтобы поставить виджет на любой свой сайт, просто добавьте этот код:\r\n```html\r\n\u003ciframe \r\n    src=\"https://crm.kuan.uk/widget\" \r\n    style=\"width: 100%; height: 100%; border: none;\"\u003e\r\n\u003c/iframe\u003e\r\n```\r\n- Виджет уже доступен и работает по адресу https://crm.kuan.uk/widget\r\n- Админка https://crm.kuan.uk/manager/login (`admin@crm.test` / `password`)\r\n\r\n---\r\n## 🏗 Архитектура (Модульный Монолит)\r\n\r\nПроект разбит на независимые куски — **модули** (`app/Modules`). Главная цель — чтобы модули не зависели друг от друга напрямую.\r\n\r\n### 🔌 Главное правило: работаем только через интерфейсы\r\n**Модуль не должен знать о \"внутренностях\" другого.** Общение идет только через **Contracts**.\r\n\r\n#### ✅ Правильно (через контракт)\r\nЕсли `Ticket` хочет сохранить файлы, он просит об этом `IFileService`.\r\n```php\r\npublic function __construct(\r\n    protected IFileService $fileService // ✅ Просто просим интерфейс\r\n) {}\r\n```\r\n\r\n#### ❌ Неправильно (напрямую)\r\nНельзя импортировать реализацию (`Services`) или модели (`Models`) из чужого модуля:\r\n```php\r\nuse App\\Modules\\File\\Services\\Service; // ❌ Нельзя! Прямая связь\r\n```\r\n\r\n---\r\n\r\n## 💎 4 принципf \"невидимых границ\"\r\n1. **Интерфейсы** — модуль показывает наружу только \"кнопки\", остальное скрыто.\r\n2. **Изоляция** — не лезем в чужие модели и таблицы напрямую.\r\n3. **DTO** — передаем данные через простые классы, а не Laravel-модели.\r\n4. **DI** — Laravel сам подставит нужную реализацию (через сервис-провайдеры).\r\n\r\n### 🚀 Зачем это надо?\r\n- **Тесты**: можно заменить реальный модуль \"заглушкой\" (Mock).\r\n- **Микросервисы**: модуль легко вынести отдельно, просто заменив интерфейс на HTTP-запрос. Код в других модулях при этом **не изменится**.\r\n\r\n---\r\n\r\n### Сущности:\r\n1. **Manager (User)** — сотрудники, которые обрабатывают заявки\r\n2. **Customer** — клиенты (создаются автоматически при подаче тикета)\r\n3. **Ticket** — само обращение (тема, текст, статус, файлы)\r\n4. **File (Media)** — общий модуль, тикет ссылаются на него\r\n\r\n### Репозитории (Data Layer):\r\nДля работы с данными использован паттерн \"Репозиторий\". Это позволит легко менять хранилище (в зависимости от откружений, тестов и тд.)\r\n- **EloquentRepository** — основная работа с БД\r\n- **InMemoryRepository** — удобно для быстрых тестов в ОЗУ без участия базы\r\n\r\n### Безопасность и API:\r\n- **Авторизация:** Используются стандартные сессии Laravel\r\n- **Публичные эндпоинты:** Создание тикета, загрузка файлов, просмотр виджета\r\n- **Защищенные эндпоинты:** Статистика, смена статусов, просмотр деталей тикета (доступны только после входа в админку)\r\n- **API тикетов** services/crm/app/Modules/Ticket/Routes/api.php\r\n- **Роуты админов** services/crm/app/Modules/Manager/Routes/web.php\r\n- **Роуты web** services/crm/routes/web.php\r\n\r\n---\r\n## Тестовые данные (Seeders)\r\nПри запуске `make dev-init` создаются:\r\n- Администратор: `admin@crm.test` / `password`.\r\n- 10 случайных клиентов\r\n- Около 50 тикетов с разными статусами\r\n\r\n---\r\n**Библиотеки:**\r\n   - `spatie/laravel-medialibrary` — для работы с файлами\r\n   - `fakerphp/faker` — для генерации тестовых данных\r\n   - `tailwind/axios` — в виджете для легкости и быстрого UI (Tailwind через CDN. Это делает его быстрым для загрузки на сторонних сайтах, Верстка и фронтенд писался через ИИ, чтобы сэкономить время)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkuan-m%2Fcrm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkuan-m%2Fcrm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkuan-m%2Fcrm/lists"}