{"id":16287201,"url":"https://github.com/htomsik/simplecrm","last_synced_at":"2025-10-16T11:05:42.862Z","repository":{"id":50496504,"uuid":"518374505","full_name":"Htomsik/SimpleCRM","owner":"Htomsik","description":"Simple CRM with patically autogenerated GUI","archived":false,"fork":false,"pushed_at":"2023-02-04T17:58:33.000Z","size":12496,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-14T23:44:35.356Z","etag":null,"topics":["crm","database","entity-framework-core","mvvm","wpf"],"latest_commit_sha":null,"homepage":"","language":"C#","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/Htomsik.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}},"created_at":"2022-07-27T08:33:35.000Z","updated_at":"2023-06-01T10:59:33.000Z","dependencies_parsed_at":"2023-02-15T18:30:54.852Z","dependency_job_id":null,"html_url":"https://github.com/Htomsik/SimpleCRM","commit_stats":null,"previous_names":["htomsik/simplecrm"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Htomsik%2FSimpleCRM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Htomsik%2FSimpleCRM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Htomsik%2FSimpleCRM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Htomsik%2FSimpleCRM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Htomsik","download_url":"https://codeload.github.com/Htomsik/SimpleCRM/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247981149,"owners_count":21027874,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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","database","entity-framework-core","mvvm","wpf"],"created_at":"2024-10-10T19:44:35.983Z","updated_at":"2025-10-16T11:05:37.842Z","avatar_url":"https://github.com/Htomsik.png","language":"C#","readme":"\n \u003col\u003e\n    \u003cli\u003e\u003ca href=\"#Инструкция\"\u003eИнструкция\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#Основные-идеи\"\u003eОсновные идеи\u003c/a\u003e\u003c/li\u003e\n  \u003cli\u003e\u003ca href=\"#Отклонения-от-тз\"\u003eОтклонения от тз\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\n\n\n## Инструкция\n\n### Первый запуск\n\nПеред первым включением требуется провести настройку конфигурации приложения - appsettings.json.\n\n\u003eВ проекте используется Entity Framework Core с системой миграции, в следствии чего бд создаётся при первом подключении к MsSql серверу или к существующией бд.\n\u003e \n\u003e Файл конфигурации в каталоге ProjectMateTask\n\u003e \n\u003e Файл импортированной базы данных находится в Assets\n\nВ appsettings.json в строке MSSQL указать ссылку на ваш MsSql сервер и выбрать название каталога, после чего можно приступать к запуску приложения.\n\n\n    {\n        \"Database\": \n        {\n            \"Type\": \"MSSQL\",\n            \"ConnectionStrings\": \n            {\n                \"MSSQL\": \"Data Source=ССЫЛКА НА СЕРВЕР;Initial Catalog=НАЗВАНИЕ КАТАЛОГА;Integrated Security=True\"\n            }\n        },\n        \"AppInfo\": \n        {\n            \"AppVersion\": \"0.0.1\"\n        }\n    }\n\n## Описание идей. Трудности с которыми столкнулся и как решал.\n\n\n### 1. Создание автоматически генерируемых страниц для редактирования рзных сущностей (Таблиц из бд).\n\n#### Режим просмотра:\n\n * У всех сущностей есть базовый набор атрибутов (Id и Имя) (Дальше: базовая сущность).\n * Для сущностей создаются базовые шаблоны отображения (DataTemplate).\n * Когда нужно вывести данные в список, достаточно указать сущность и интерфейс сам подставит нужный Datatemplate.\n * Если у сущности нет своей карточки то она отображаетя как базовая сущность. \n\n\u003e Полная реализация как и планировал.\n\n#### Режим редактирования:\n\n* Так как многие сущности содержат ссылки (связи в таблицах) на другие сущности то сама сущность состоит из набора определенных атрибутов.\n* Для атрибутов создаются карточки редактирования по типу атрибута. (Datatemplate)\n* Когда сущность помещается в поле для редактирования то оно автоматически генерируется из Datatemplate-ов для тех атрибутов которые есть в редактирумой сущности.\n\n  \u003e Не удалось сделать так как планировал, изначально не смог найти способа отображать сущность как список атрибутов.\n  \u003e \n  \u003e Уже в конце создания я понял что можно было бы сущности сделать IEnumerable типами, и в качестве Enumerator-а для них указать массив всех атрибутов сущности.\n  \u003e \n  \u003e Таким образом можно было бы использовать списочные контейнеры (listbox, listview и т.д.), которые сами подбирали бы Datatemplate-ы по типу атрибута.\n  \u003e \n  \u003e В текущей реализации система частично как в режиме просмотра. Для каждой заранее известной сущности создана отдельная карточка редактиования, а если карточки нет,\n  \u003e то сущность невозможно редактировать.\n\n### 2. Межстраничная навигация.\n\n* Навигация осуществляется с помошью контейнеров, хранящих текущую Viewmodel определенного типа и сервисов которые отвечают за смену этих Viewmodel-ей в контейнерах.\n* Контейнеры бывают как глобальные, смена Viewmodel-ей в которых может осуществлятся из любой точки проекта, куда передан его сервис. Так и локальные, навигация в которых осуществляется в определенных рамках проекта.\n\n\u003e Полная реализация как и планировал.\n\n### 3. Логирование и глобальная отловка необработанных исключений\n\n* Глобальный Exception handler выявляет необработанные исключения, а также исключения полученные вследствви повреждения appsettings.json\n* Логирование происходит в файл и в шину сообщений которая выводит часть информации для уведомления пользователя о проделанном событии.\n\n\u003e Новая лично для меня функция, еще не полностью разобрался.\n\u003e \n\u003e Вследствии чего не все исключения удаётся отлавливать, а также отловка необработанных исключений зависит от момента их возникновения. \n\u003e \n\u003e Если исключение возникнет до момента создания логгера, то приложение покажет ошибку и аварийно завершит работу, но в файл ошибку не запишет.\n\n\n## Отклонения от тз\n\n### Функциональность:\n\n* Для всех сущностей все атрибуты являются обязательными, так было сделано из за неудачного использования INotiyDataError для валидации данных и ошибочного изначально планирования в некоторых пунктах.\n\n\u003e В остальном все требования к функциональности самого приложения по моему мнению выполнены.\n\u003e На счёт дизайна особо сильно не заморачивался, главное в этом проекте считай что сама суть.\n\n### Проектирование бд:\n\n#### Товар (Product):\n* Не знал как правильно реализовать тип и срок подписки.\nЕсли использовать два атрибута (тип и срок) то получалось что требовалось каким либо образом в самой бд запрещать для определенных типов иметь срок.\nИли если вести учёт подписок, то требовалась бы отдельная таблицу куда записывались дата начала подписки и дата окончания, и в ней бы хранились все купленные когда либо\nпользователем подписки\n\n* Решил просто сделать типы со сроками.Указывается дата начала подписки и тип подписки.\n\n\u003e Если бы кто нибудь подсказал где посмотреть как такое реализуется по нормальному было бы неплохо.\n\n\n### Тестирование:\n\n* Юнит тесты были написаны по мере возможности. В основном тесты присуствуют для базовой инфраструктуры.\n\n\u003e Хотелось бы узнать что можно почитать о том как писать тесты для сложных типов. \n\u003e \n\u003e Например для таких: у меня есть навигационный сервис который взаимодейтсвует с IOC контейнером.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhtomsik%2Fsimplecrm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhtomsik%2Fsimplecrm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhtomsik%2Fsimplecrm/lists"}