Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/htomsik/simplecrm

Simple CRM with patically autogenerated GUI
https://github.com/htomsik/simplecrm

crm database entity-framework-core mvvm wpf

Last synced: about 18 hours ago
JSON representation

Simple CRM with patically autogenerated GUI

Awesome Lists containing this project

README

        


  1. Инструкция

  2. Основные идеи

  3. Отклонения от тз

## Инструкция

### Первый запуск

Перед первым включением требуется провести настройку конфигурации приложения - appsettings.json.

>В проекте используется Entity Framework Core с системой миграции, в следствии чего бд создаётся при первом подключении к MsSql серверу или к существующией бд.
>
> Файл конфигурации в каталоге ProjectMateTask
>
> Файл импортированной базы данных находится в Assets

В appsettings.json в строке MSSQL указать ссылку на ваш MsSql сервер и выбрать название каталога, после чего можно приступать к запуску приложения.

{
"Database":
{
"Type": "MSSQL",
"ConnectionStrings":
{
"MSSQL": "Data Source=ССЫЛКА НА СЕРВЕР;Initial Catalog=НАЗВАНИЕ КАТАЛОГА;Integrated Security=True"
}
},
"AppInfo":
{
"AppVersion": "0.0.1"
}
}

## Описание идей. Трудности с которыми столкнулся и как решал.

### 1. Создание автоматически генерируемых страниц для редактирования рзных сущностей (Таблиц из бд).

#### Режим просмотра:

* У всех сущностей есть базовый набор атрибутов (Id и Имя) (Дальше: базовая сущность).
* Для сущностей создаются базовые шаблоны отображения (DataTemplate).
* Когда нужно вывести данные в список, достаточно указать сущность и интерфейс сам подставит нужный Datatemplate.
* Если у сущности нет своей карточки то она отображаетя как базовая сущность.

> Полная реализация как и планировал.

#### Режим редактирования:

* Так как многие сущности содержат ссылки (связи в таблицах) на другие сущности то сама сущность состоит из набора определенных атрибутов.
* Для атрибутов создаются карточки редактирования по типу атрибута. (Datatemplate)
* Когда сущность помещается в поле для редактирования то оно автоматически генерируется из Datatemplate-ов для тех атрибутов которые есть в редактирумой сущности.

> Не удалось сделать так как планировал, изначально не смог найти способа отображать сущность как список атрибутов.
>
> Уже в конце создания я понял что можно было бы сущности сделать IEnumerable типами, и в качестве Enumerator-а для них указать массив всех атрибутов сущности.
>
> Таким образом можно было бы использовать списочные контейнеры (listbox, listview и т.д.), которые сами подбирали бы Datatemplate-ы по типу атрибута.
>
> В текущей реализации система частично как в режиме просмотра. Для каждой заранее известной сущности создана отдельная карточка редактиования, а если карточки нет,
> то сущность невозможно редактировать.

### 2. Межстраничная навигация.

* Навигация осуществляется с помошью контейнеров, хранящих текущую Viewmodel определенного типа и сервисов которые отвечают за смену этих Viewmodel-ей в контейнерах.
* Контейнеры бывают как глобальные, смена Viewmodel-ей в которых может осуществлятся из любой точки проекта, куда передан его сервис. Так и локальные, навигация в которых осуществляется в определенных рамках проекта.

> Полная реализация как и планировал.

### 3. Логирование и глобальная отловка необработанных исключений

* Глобальный Exception handler выявляет необработанные исключения, а также исключения полученные вследствви повреждения appsettings.json
* Логирование происходит в файл и в шину сообщений которая выводит часть информации для уведомления пользователя о проделанном событии.

> Новая лично для меня функция, еще не полностью разобрался.
>
> Вследствии чего не все исключения удаётся отлавливать, а также отловка необработанных исключений зависит от момента их возникновения.
>
> Если исключение возникнет до момента создания логгера, то приложение покажет ошибку и аварийно завершит работу, но в файл ошибку не запишет.

## Отклонения от тз

### Функциональность:

* Для всех сущностей все атрибуты являются обязательными, так было сделано из за неудачного использования INotiyDataError для валидации данных и ошибочного изначально планирования в некоторых пунктах.

> В остальном все требования к функциональности самого приложения по моему мнению выполнены.
> На счёт дизайна особо сильно не заморачивался, главное в этом проекте считай что сама суть.

### Проектирование бд:

#### Товар (Product):
* Не знал как правильно реализовать тип и срок подписки.
Если использовать два атрибута (тип и срок) то получалось что требовалось каким либо образом в самой бд запрещать для определенных типов иметь срок.
Или если вести учёт подписок, то требовалась бы отдельная таблицу куда записывались дата начала подписки и дата окончания, и в ней бы хранились все купленные когда либо
пользователем подписки

* Решил просто сделать типы со сроками.Указывается дата начала подписки и тип подписки.

> Если бы кто нибудь подсказал где посмотреть как такое реализуется по нормальному было бы неплохо.

### Тестирование:

* Юнит тесты были написаны по мере возможности. В основном тесты присуствуют для базовой инфраструктуры.

> Хотелось бы узнать что можно почитать о том как писать тесты для сложных типов.
>
> Например для таких: у меня есть навигационный сервис который взаимодейтсвует с IOC контейнером.