Исправление кодировки: восстановлена кириллица в комментариях и документации (UTF-8)

This commit is contained in:
parent 939d44063e
commit df3f9f2741
9 changed files with 169 additions and 169 deletions

View File

@ -1,29 +1,29 @@
# Слой `chk` — функции
# Слой `chk` — функции
## Список функций
## Список функций
| Сущность | Функция | Статус | Параметры | Возвращает | Функция | Репозиторий | Комментарий |
| Сущность | Функция | Статус | Параметры | Возвращает | Функция | Репозиторий | Комментарий |
|---|---|---|---|---|---|---|---|
| chk_type | chk_type_select | DEV | — | TABLE — строки справочника | CODE | REQ | код: `functions/chk_type_select.sql`; тесты: `tests/test_chk_type_select.psql`; репозиторий: `MT.Checks/Repository/ChkTypeRepository.cs` |
| chk_status | chk_status_select | DEV | — | TABLE — строки справочника | CODE | REQ | код: `functions/chk_status_select.sql`; тесты: `tests/test_chk_status_select.psql`; репозиторий: `MT.Checks/Repository/ChkStatusRepository.cs` |
| chk_check | chk_check_insert | DEV | p_check_date, p_chk_type_id, p_chk_status_id, p_smev_message_id, p_rr_organization_id, p_params (JSON), p_parent_check_id | int — id проверки | CODE | REQ | код: `functions/chk_check_insert.sql`; тесты: `tests/test_chk_check_insert.psql`; репозиторий: `MT.Checks/Repository/ChkCheckRepository.cs` |
| chk_check | chk_check_update | DEV | p_id + все поля записи | int — число строк (db-m-3) | CODE | REQ | полная запись объекта (db-m-8); код: `functions/chk_check_update.sql`; тесты: `tests/test_chk_check_update.psql` |
| chk_check | chk_check_delete | DEV | p_id | int — число строк | CODE | REQ | код: `functions/chk_check_delete.sql`; тесты: `tests/test_chk_check_delete.psql` |
| chk_check | chk_check_select | DEV | p_check_date, p_chk_type_id, p_chk_status_id, p_rr_organization_id | TABLE — строки chk_check | CODE | REQ | NULL параметра = фильтр не применяется; код: `functions/chk_check_select.sql`; тесты: `tests/test_chk_check_select.psql` |
| chk_check | chk_check_get | DEV | p_id | TABLE — строка chk_check | CODE | REQ | код: `functions/chk_check_get.sql`; тесты: `tests/test_chk_check_get.psql` |
| chk_type | chk_type_select | DEV | — | TABLE — строки справочника | CODE | REQ | код: `functions/chk_type_select.sql`; тесты: `tests/test_chk_type_select.psql`; репозиторий: `MT.Checks/Repository/ChkTypeRepository.cs` |
| chk_status | chk_status_select | DEV | — | TABLE — строки справочника | CODE | REQ | код: `functions/chk_status_select.sql`; тесты: `tests/test_chk_status_select.psql`; репозиторий: `MT.Checks/Repository/ChkStatusRepository.cs` |
| chk_check | chk_check_insert | DEV | p_check_date, p_chk_type_id, p_chk_status_id, p_smev_message_id, p_rr_organization_id, p_params (JSON), p_parent_check_id | int — id проверки | CODE | REQ | код: `functions/chk_check_insert.sql`; тесты: `tests/test_chk_check_insert.psql`; репозиторий: `MT.Checks/Repository/ChkCheckRepository.cs` |
| chk_check | chk_check_update | DEV | p_id + все поля записи | int — число строк (db-m-3) | CODE | REQ | полная запись объекта (db-m-8); код: `functions/chk_check_update.sql`; тесты: `tests/test_chk_check_update.psql` |
| chk_check | chk_check_delete | DEV | p_id | int — число строк | CODE | REQ | код: `functions/chk_check_delete.sql`; тесты: `tests/test_chk_check_delete.psql` |
| chk_check | chk_check_select | DEV | p_check_date, p_chk_type_id, p_chk_status_id, p_rr_organization_id | TABLE — строки chk_check | CODE | REQ | NULL параметра = фильтр не применяется; код: `functions/chk_check_select.sql`; тесты: `tests/test_chk_check_select.psql` |
| chk_check | chk_check_get | DEV | p_id | TABLE — строка chk_check | CODE | REQ | код: `functions/chk_check_get.sql`; тесты: `tests/test_chk_check_get.psql` |
Спецификации функций и тест-планы: `func_specs/{функция}.md` (d-db-9). Код функций:
`functions/{сущность}_{действие}.sql` (db-func-4, расширение `.sql` — соглашение
репозитория). psql-тесты: `tests/test_{сущность}_{действие}.psql` (db-tst),
нумерация проверок = строкам таблиц «Тесты» спецификаций. Выполнение тестов —
на тестовой базе (db-tst-4): `psql -d <база> -f tests/test_*.psql`.
Спецификации функций и тест-планы: `func_specs/{функция}.md` (d-db-9). Код функций:
`functions/{сущность}_{действие}.sql` (db-func-4, расширение `.sql` — соглашение
репозитория). psql-тесты: `tests/test_{сущность}_{действие}.psql` (db-tst),
нумерация проверок = строкам таблиц «Тесты» спецификаций. Выполнение тестов —
на тестовой базе (db-tst-4): `psql -d <база> -f tests/test_*.psql`.
Статусы (d-dev-1, d-dev-2, d-dev-5): `Статус` = `DEV` (реализация начата);
колонка «Функция» = `CODE` (код и тесты написаны; `DONE` — после утверждения
пользователем); «Репозиторий» = `REQ`.
Статусы (d-dev-1, d-dev-2, d-dev-5): `Статус` = `DEV` (реализация начата);
колонка «Функция» = `CODE` (код и тесты написаны; `DONE` — после утверждения
пользователем); «Репозиторий» = `REQ`.
Примечание к колонке «Репозиторий» (2026-09-08, решение пользователя):
unit-тесты репозиториев не создаются вовсе; спецификации тестов сохранены как
документация ожидаемого поведения — `1-docs/2-core/chk/repository_tests/`.
Код репозиториев написан (проект `MT.Checks`); статус `CODE` по d-dev-3
неприменим, т.к. требует наличия тестов.
Примечание к колонке «Репозиторий» (2026-09-08, решение пользователя):
unit-тесты репозиториев не создаются вовсе; спецификации тестов сохранены как
документация ожидаемого поведения — `1-docs/2-core/chk/repository_tests/`.
Код репозиториев написан (проект `MT.Checks`); статус `CODE` по d-dev-3
неприменим, т.к. требует наличия тестов.

View File

@ -1,38 +1,38 @@
namespace MT.Checks.Domain;
namespace MT.Checks.Domain;
/// <summary>
/// Проверка организаций (chk.chk_check). Колонка params хранится в jsonb,
/// в домене передаётся строкой JSON.
/// Проверка организаций (chk.chk_check). Колонка params хранится в jsonb,
/// в домене передаётся строкой JSON.
/// </summary>
public class ChkCheck
{
/// <summary>Идентификатор проверки.</summary>
/// <summary>Идентификатор проверки.</summary>
public int Id { get; set; }
/// <summary>День (дата) проверки.</summary>
/// <summary>День (дата) проверки.</summary>
public DateTime CheckDate { get; set; }
/// <summary>Тип проверки — ключ chk.chk_type.</summary>
/// <summary>Тип проверки — ключ chk.chk_type.</summary>
public int TypeId { get; set; }
/// <summary>Объект справочника типов; заполняется прикладным кодом при необходимости.</summary>
/// <summary>Объект справочника типов; заполняется прикладным кодом при необходимости.</summary>
public ChkType? Type { get; set; }
/// <summary>Статус проверки — ключ chk.chk_status.</summary>
/// <summary>Статус проверки — ключ chk.chk_status.</summary>
public int StatusId { get; set; }
/// <summary>Объект справочника статусов; заполняется прикладным кодом при необходимости.</summary>
/// <summary>Объект справочника статусов; заполняется прикладным кодом при необходимости.</summary>
public ChkStatus? Status { get; set; }
/// <summary>Идентификатор сообщения СМЭВ.</summary>
/// <summary>Идентификатор сообщения СМЭВ.</summary>
public string SmevMessageId { get; set; } = "";
/// <summary>Идентификатор организации РР.</summary>
/// <summary>Идентификатор организации РР.</summary>
public string RrOrganizationId { get; set; } = "";
/// <summary>Параметры проверки — JSON (результаты проверок, состав не фиксирован).</summary>
/// <summary>Параметры проверки — JSON (результаты проверок, состав не фиксирован).</summary>
public string Params { get; set; } = "";
/// <summary>Родительская проверка; null — корневая проверка.</summary>
/// <summary>Родительская проверка; null — корневая проверка.</summary>
public int? ParentCheckId { get; set; }
}

View File

@ -1,31 +1,31 @@
namespace MT.Checks.Domain;
namespace MT.Checks.Domain;
/// <summary>
/// Статус проверки (справочник chk.chk_status, фиксированные значения — см. init.sql).
/// Статус проверки (справочник chk.chk_status, фиксированные значения — см. init.sql).
/// </summary>
public class ChkStatus
{
/// <summary>Идентификатор статуса.</summary>
/// <summary>Идентификатор статуса.</summary>
public int Id { get; set; }
/// <summary>Наименование статуса проверки.</summary>
/// <summary>Наименование статуса проверки.</summary>
public string Name { get; set; } = "";
}
/// <summary>
/// Коды статусов проверок (chk.chk_status); значения — DB/chk/init/init.sql.
/// Коды статусов проверок (chk.chk_status); значения — DB/chk/init/init.sql.
/// </summary>
public static class ChkStatuses
{
/// <summary>Запрос отправлен.</summary>
/// <summary>Запрос отправлен.</summary>
public const int RequestSent = 1;
/// <summary>Ответ получен.</summary>
/// <summary>Ответ получен.</summary>
public const int ResponseReceived = 2;
/// <summary>Ответ успешно обработан.</summary>
/// <summary>Ответ успешно обработан.</summary>
public const int ResponseProcessed = 3;
/// <summary>Ошибка при обработке.</summary>
/// <summary>Ошибка при обработке.</summary>
public const int ProcessingError = 4;
}

View File

@ -1,37 +1,37 @@
namespace MT.Checks.Domain;
namespace MT.Checks.Domain;
/// <summary>
/// Тип проверки (справочник chk.chk_type, фиксированные значения — см. init.sql).
/// Тип проверки (справочник chk.chk_type, фиксированные значения — см. init.sql).
/// </summary>
public class ChkType
{
/// <summary>Идентификатор типа.</summary>
/// <summary>Идентификатор типа.</summary>
public int Id { get; set; }
/// <summary>Наименование типа проверки.</summary>
/// <summary>Наименование типа проверки.</summary>
public string Name { get; set; } = "";
}
/// <summary>
/// Коды типов проверок (chk.chk_type); значения — DB/chk/init/init.sql.
/// Коды типов проверок (chk.chk_type); значения — DB/chk/init/init.sql.
/// </summary>
public static class ChkTypes
{
/// <summary>Запрос изменений (дельты) ЕГРЮЛ.</summary>
/// <summary>Запрос изменений (дельты) ЕГРЮЛ.</summary>
public const int EgrulDelta = 1;
/// <summary>Запрос изменений (дельты) ЕГРИП.</summary>
/// <summary>Запрос изменений (дельты) ЕГРИП.</summary>
public const int EgripDelta = 2;
/// <summary>Отправка запроса в ЕГРЮЛ.</summary>
/// <summary>Отправка запроса в ЕГРЮЛ.</summary>
public const int EgrulRequest = 3;
/// <summary>Отправка запроса в ЕГРИП.</summary>
/// <summary>Отправка запроса в ЕГРИП.</summary>
public const int EgripRequest = 4;
/// <summary>Актуализация организации ОТ.</summary>
/// <summary>Актуализация организации ОТ.</summary>
public const int OtActualization = 5;
/// <summary>Актуализация организации СОУТ.</summary>
/// <summary>Актуализация организации СОУТ.</summary>
public const int SoutActualization = 6;
}

View File

@ -1,50 +1,50 @@
namespace MT.Checks.Repository
namespace MT.Checks.Repository
{
using Kit.Helpers.SqlHelperAbstract;
using MT.Checks.Domain;
using MT.Checks.Repository.Filter;
/// <summary>
/// Репозиторий проверок организаций: чтение и запись через хранимые функции схемы chk.
/// Транзакцию из нескольких вызовов собирает вызывающий код.
/// Репозиторий проверок организаций: чтение и запись через хранимые функции схемы chk.
/// Транзакцию из нескольких вызовов собирает вызывающий код.
/// </summary>
public interface IChkCheckRepository
{
/// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой записи.</summary>
/// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой записи.</summary>
int Insert(ChkCheck item);
/// <summary>Записывает проверку целиком по Id (chk.chk_check_update);
/// возвращает число записанных строк. Изменяемый объект читается заранее
/// методом Get (read-modify-write).</summary>
/// <summary>Записывает проверку целиком по Id (chk.chk_check_update);
/// возвращает число записанных строк. Изменяемый объект читается заранее
/// методом Get (read-modify-write).</summary>
int Update(ChkCheck item);
/// <summary>Удаляет проверку по Id (chk.chk_check_delete);
/// возвращает число удалённых строк.</summary>
/// <summary>Удаляет проверку по Id (chk.chk_check_delete);
/// возвращает число удалённых строк.</summary>
int Delete(int id);
/// <summary>Выбирает проверки по условиям фильтра (chk.chk_check_select);
/// null свойства фильтра = условие не применяется.</summary>
/// <summary>Выбирает проверки по условиям фильтра (chk.chk_check_select);
/// null свойства фильтра = условие не применяется.</summary>
IList<ChkCheck> Select(ChkCheckFilter filter);
/// <summary>Возвращает проверку по Id (chk.chk_check_get); null — запись не найдена.</summary>
/// <summary>Возвращает проверку по Id (chk.chk_check_get); null — запись не найдена.</summary>
ChkCheck? Get(int id);
}
/// <summary>
/// Реализация: каждый метод вызывает ровно одну хранимую функцию; имена
/// параметров вызова совпадают с именами параметров функции (p_*).
/// Реализация: каждый метод вызывает ровно одну хранимую функцию; имена
/// параметров вызова совпадают с именами параметров функции (p_*).
/// </summary>
public class ChkCheckRepository : IChkCheckRepository
{
private readonly IConnectionString _connectionString;
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
public ChkCheckRepository(IConnectionString connectionString)
{
_connectionString = connectionString;
}
/// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой записи.</summary>
/// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой записи.</summary>
public int Insert(ChkCheck item)
{
return _connectionString.PrepareExecute<int>("chk.chk_check_insert")
@ -59,14 +59,14 @@
.ExecuteScalar();
}
/// <summary>Записывает проверку целиком по Id (chk.chk_check_update);
/// возвращает число записанных строк. Изменяемый объект читается заранее
/// методом Get (read-modify-write).</summary>
/// <summary>Записывает проверку целиком по Id (chk.chk_check_update);
/// возвращает число записанных строк. Изменяемый объект читается заранее
/// методом Get (read-modify-write).</summary>
public int Update(ChkCheck item)
{
if (item.Id == 0)
{
throw new ArgumentException("ChkCheckRepository.Update: не задан идентификатор записи (Id = 0)");
throw new ArgumentException("ChkCheckRepository.Update: не задан идентификатор записи (Id = 0)");
}
return _connectionString.PrepareExecute<int>("chk.chk_check_update")
@ -82,13 +82,13 @@
.ExecuteScalar();
}
/// <summary>Удаляет проверку по Id (chk.chk_check_delete);
/// возвращает число удалённых строк.</summary>
/// <summary>Удаляет проверку по Id (chk.chk_check_delete);
/// возвращает число удалённых строк.</summary>
public int Delete(int id)
{
if (id == 0)
{
throw new ArgumentException("ChkCheckRepository.Delete: не задан идентификатор записи (id = 0)");
throw new ArgumentException("ChkCheckRepository.Delete: не задан идентификатор записи (id = 0)");
}
return _connectionString.PrepareExecute<int>("chk.chk_check_delete")
@ -97,8 +97,8 @@
.ExecuteScalar();
}
/// <summary>Выбирает проверки по условиям фильтра (chk.chk_check_select);
/// null свойства фильтра = условие не применяется.</summary>
/// <summary>Выбирает проверки по условиям фильтра (chk.chk_check_select);
/// null свойства фильтра = условие не применяется.</summary>
public IList<ChkCheck> Select(ChkCheckFilter filter)
{
filter ??= new ChkCheckFilter();
@ -128,12 +128,12 @@
.ToList();
}
/// <summary>Возвращает проверку по Id (chk.chk_check_get); null — запись не найдена.</summary>
/// <summary>Возвращает проверку по Id (chk.chk_check_get); null — запись не найдена.</summary>
public ChkCheck? Get(int id)
{
if (id == 0)
{
throw new ArgumentException("ChkCheckRepository.Get: не задан идентификатор записи (id = 0)");
throw new ArgumentException("ChkCheckRepository.Get: не задан идентификатор записи (id = 0)");
}
IList<ChkCheck> result = _connectionString.PrepareExecute<ChkCheck>("chk.chk_check_get")

View File

@ -1,27 +1,27 @@
namespace MT.Checks.Repository
namespace MT.Checks.Repository
{
using Kit.Helpers.SqlHelperAbstract;
using MT.Checks.Domain;
/// <summary>Репозиторий справочника статусов проверок (только чтение).</summary>
/// <summary>Репозиторий справочника статусов проверок (только чтение).</summary>
public interface IChkStatusRepository
{
/// <summary>Возвращает все строки справочника (chk.chk_status_select).</summary>
/// <summary>Возвращает все строки справочника (chk.chk_status_select).</summary>
IList<ChkStatus> Select();
}
/// <summary>Реализация: каждая выборка — вызов chk.chk_status_select.</summary>
/// <summary>Реализация: каждая выборка — вызов chk.chk_status_select.</summary>
public class ChkStatusRepository : IChkStatusRepository
{
private readonly IConnectionString _connectionString;
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
public ChkStatusRepository(IConnectionString connectionString)
{
_connectionString = connectionString;
}
/// <summary>Возвращает все строки справочника (chk.chk_status_select).</summary>
/// <summary>Возвращает все строки справочника (chk.chk_status_select).</summary>
public IList<ChkStatus> Select()
{
return _connectionString.PrepareExecute<ChkStatus>("chk.chk_status_select")

View File

@ -1,27 +1,27 @@
namespace MT.Checks.Repository
namespace MT.Checks.Repository
{
using Kit.Helpers.SqlHelperAbstract;
using MT.Checks.Domain;
/// <summary>Репозиторий справочника типов проверок (только чтение).</summary>
/// <summary>Репозиторий справочника типов проверок (только чтение).</summary>
public interface IChkTypeRepository
{
/// <summary>Возвращает все строки справочника (chk.chk_type_select).</summary>
/// <summary>Возвращает все строки справочника (chk.chk_type_select).</summary>
IList<ChkType> Select();
}
/// <summary>Реализация: каждая выборка — вызов chk.chk_type_select.</summary>
/// <summary>Реализация: каждая выборка — вызов chk.chk_type_select.</summary>
public class ChkTypeRepository : IChkTypeRepository
{
private readonly IConnectionString _connectionString;
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
public ChkTypeRepository(IConnectionString connectionString)
{
_connectionString = connectionString;
}
/// <summary>Возвращает все строки справочника (chk.chk_type_select).</summary>
/// <summary>Возвращает все строки справочника (chk.chk_type_select).</summary>
public IList<ChkType> Select()
{
return _connectionString.PrepareExecute<ChkType>("chk.chk_type_select")

View File

@ -1,19 +1,19 @@
namespace MT.Checks.Repository.Filter;
namespace MT.Checks.Repository.Filter;
/// <summary>
/// Условия выборки проверок; null свойства = условие не применяется.
/// Условия выборки проверок; null свойства = условие не применяется.
/// </summary>
public class ChkCheckFilter
{
/// <summary>День (дата) проверки.</summary>
/// <summary>День (дата) проверки.</summary>
public DateTime? CheckDate { get; set; }
/// <summary>Тип проверки (chk.chk_type.id).</summary>
/// <summary>Тип проверки (chk.chk_type.id).</summary>
public int? TypeId { get; set; }
/// <summary>Статус проверки (chk.chk_status.id).</summary>
/// <summary>Статус проверки (chk.chk_status.id).</summary>
public int? StatusId { get; set; }
/// <summary>Идентификатор организации РР.</summary>
/// <summary>Идентификатор организации РР.</summary>
public string? RrOrganizationId { get; set; }
}

View File

@ -1,99 +1,99 @@
# Отчёт генерации DAL (навык project_dal) — прогон 2026-09-08
# Отчёт генерации DAL (навык project_dal) — прогон 2026-09-08
## Статус этапов
## Статус этапов
| Этап | Статус |
| Этап | Статус |
|---|---|
| 0_scan (разведка) | done |
| 1_rules (правила MCP) | done |
| 2_spec (спецификации тестов) | done — утверждены пользователем |
| 3_code (генерация) | done (тесты не создаются — решение пользователя) |
| 4_validate | done — build 0 ошибок; check: 1 известный false positive (см. ниже) |
| 5_report | done — ожидание утверждения DONE |
| 0_scan (разведка) | done |
| 1_rules (правила MCP) | done |
| 2_spec (спецификации тестов) | done — утверждены пользователем |
| 3_code (генерация) | done (тесты не создаются — решение пользователя) |
| 4_validate | done — build 0 ошибок; check: 1 известный false positive (см. ниже) |
| 5_report | done — ожидание утверждения DONE |
## Версии правил
## Версии правил
- Каталог MCP standarts-catalog: **1.2** (= rules-baseline.json 1.2); расхождений
нет, `validate-rules` не требовался.
- Использованные области: c-dal 1.1, d-tst 1.1, c-tst 1.1, c-cs 1.1, db-m 1.1,
db-s 1.1, db-func 1.1, db-tst 1.1, c-dm 1.1, d-dev 1.1, d-db 1.1 (все 2026-09-04).
- Каталог MCP standarts-catalog: **1.2** (= rules-baseline.json 1.2); расхождений
нет, `validate-rules` не требовался.
- Использованные области: c-dal 1.1, d-tst 1.1, c-tst 1.1, c-cs 1.1, db-m 1.1,
db-s 1.1, db-func 1.1, db-tst 1.1, c-dm 1.1, d-dev 1.1, d-db 1.1 (все 2026-09-04).
## Решение (проект `MT.Checks`)
## Решение (проект `MT.Checks`)
- `MT.Checks.slnx` → проект `MT.Checks\MT.Checks.csproj` (net10.0),
ProjectReference на `I:\Gitea\Kit\Kit.Core\Kit.Core\Kit.Core.csproj` (Kit.Helpers).
- Тестового проекта нет — решение пользователя «без тестов совсем» (2026-09-08).
- `MT.Checks.slnx` → проект `MT.Checks\MT.Checks.csproj` (net10.0),
ProjectReference на `I:\Gitea\Kit\Kit.Core\Kit.Core\Kit.Core.csproj` (Kit.Helpers).
- Тестового проекта нет — решение пользователя «без тестов совсем» (2026-09-08).
### Файлы
### Файлы
| Файл | Содержимое |
| Файл | Содержимое |
|---|---|
| `Domain\ChkCheck.cs` | сущность проверки (+ Type/Status-справочники, Params — строка JSON) |
| `Domain\ChkType.cs` | справочник типов + константы `ChkTypes` (6 значений) |
| `Domain\ChkStatus.cs` | справочник статусов + константы `ChkStatuses` (4 значения) |
| `Repository\Filter\ChkCheckFilter.cs` | фильтр Select (null = условие не применяется) |
| `Domain\ChkCheck.cs` | сущность проверки (+ Type/Status-справочники, Params — строка JSON) |
| `Domain\ChkType.cs` | справочник типов + константы `ChkTypes` (6 значений) |
| `Domain\ChkStatus.cs` | справочник статусов + константы `ChkStatuses` (4 значения) |
| `Repository\Filter\ChkCheckFilter.cs` | фильтр Select (null = условие не применяется) |
| `Repository\ChkCheckRepository.cs` | Insert/Update/Delete/Select/Get |
| `Repository\ChkTypeRepository.cs` | Select (справочник — только чтение) |
| `Repository\ChkStatusRepository.cs` | Select (справочник — только чтение) |
| `Repository\ChkTypeRepository.cs` | Select (справочник — только чтение) |
| `Repository\ChkStatusRepository.cs` | Select (справочник — только чтение) |
Неймспейсы: `MT.Checks.Domain`, `MT.Checks.Repository`, `MT.Checks.Repository.Filter`
(папка/префикс слоя `Chk` в коде не используются — решение пользователя).
Неймспейсы: `MT.Checks.Domain`, `MT.Checks.Repository`, `MT.Checks.Repository.Filter`
(папка/префикс слоя `Chk` в коде не используются — решение пользователя).
### Методы → функции БД
### Методы → функции БД
| Метод | Функция | Возврат |
| Метод | Функция | Возврат |
|---|---|---|
| `ChkCheckRepository.Insert(ChkCheck)` | `chk.chk_check_insert` | id записи |
| `ChkCheckRepository.Update(ChkCheck)` | `chk.chk_check_update` | число строк (read-modify-write; guard Id=0) |
| `ChkCheckRepository.Delete(int)` | `chk.chk_check_delete` | число строк (guard id=0) |
| `ChkCheckRepository.Insert(ChkCheck)` | `chk.chk_check_insert` | id записи |
| `ChkCheckRepository.Update(ChkCheck)` | `chk.chk_check_update` | число строк (read-modify-write; guard Id=0) |
| `ChkCheckRepository.Delete(int)` | `chk.chk_check_delete` | число строк (guard id=0) |
| `ChkCheckRepository.Select(ChkCheckFilter)` | `chk.chk_check_select` | `IList<ChkCheck>` |
| `ChkCheckRepository.Get(int)` | `chk.chk_check_get` | `ChkCheck?` (guard id=0) |
| `ChkTypeRepository.Select()` | `chk.chk_type_select` | `IList<ChkType>` |
| `ChkStatusRepository.Select()` | `chk.chk_status_select` | `IList<ChkStatus>` |
Каждый метод — ровно одна хранимая функция, транспорт — fluent API Kit.Helpers
Каждый метод — ровно одна хранимая функция, транспорт — fluent API Kit.Helpers
(`PrepareExecute<T>().AsStoredProcedure().AddParameter*().AddConverter(...)`),
конвертеры таблиц ответа — inline-лямбды.
конвертеры таблиц ответа — inline-лямбды.
## Слой БД (этот же прогон)
## Слой БД (этот же прогон)
- `DB/chk/functions/*.sql` — 7 функций (параметры `p_*` по db-func-5);
- `DB/chk/func_specs/*.md` — 7 спецификаций с тест-планами (d-db-9);
- `DB/chk/tests/test_*.psql` — 7 psql-тестов (**не исполнялись** — нужна тестовая
база: `psql -d <база> -f DB/chk/tests/test_*.psql`);
- `DB/chk/functions.md` — статусы: функции `DEV`/«Функция»=`CODE`; «Репозиторий»=`REQ`
с примечанием (unit-тесты не создаются, `CODE` по d-dev-3 неприменим).
- `DB/chk/functions/*.sql` — 7 функций (параметры `p_*` по db-func-5);
- `DB/chk/func_specs/*.md` — 7 спецификаций с тест-планами (d-db-9);
- `DB/chk/tests/test_*.psql` — 7 psql-тестов (**не исполнялись** — нужна тестовая
база: `psql -d <база> -f DB/chk/tests/test_*.psql`);
- `DB/chk/functions.md` — статусы: функции `DEV`/«Функция»=`CODE`; «Репозиторий»=`REQ`
с примечанием (unit-тесты не создаются, `CODE` по d-dev-3 неприменим).
## Валидация
## Валидация
- `dotnet build MT.Checks.slnx` — **0 ошибок** (предупреждения NU1903/CS — из Kit.Core).
- DalTools `check` (с манифестом) — **1 нарушение c-dal-1, известный false positive**:
эвристика «SQL в строке C#» сканирует текст между строковыми литералами файла и
находит слово `Select` в сигнатуре метода `Select(ChkCheckFilter)` — имя метода
обязательно по правилу c-dal-5 (имена CRUD: Insert/Update/Delete/Select/Get).
Неустранимо в коде без нарушения стандарта; SQL в строках отсутствует.
- `dotnet build MT.Checks.slnx` **0 ошибок** (предупреждения NU1903/CS — из Kit.Core).
- DalTools `check` (с манифестом) — **1 нарушение c-dal-1, известный false positive**:
эвристика «SQL в строке C#» сканирует текст между строковыми литералами файла и
находит слово `Select` в сигнатуре метода `Select(ChkCheckFilter)` — имя метода
обязательно по правилу c-dal-5 (имена CRUD: Insert/Update/Delete/Select/Get).
Неустранимо в коде без нарушения стандарта; SQL в строках отсутствует.
## Спецификации тестов
## Спецификации тестов
`1-docs/2-core/chk/repository_tests/` — ChkCheckRepository.md (17 тестов),
ChkTypeRepository.md, ChkStatusRepository.md — утверждены как документация
ожидаемого поведения. Тестовый код по решению пользователя не создаётся
(см. `DB/chk/functions.md`, примечание к колонке «Репозиторий»).
`1-docs/2-core/chk/repository_tests/` — ChkCheckRepository.md (17 тестов),
ChkTypeRepository.md, ChkStatusRepository.md — утверждены как документация
ожидаемого поведения. Тестовый код по решению пользователя не создаётся
(см. `DB/chk/functions.md`, примечание к колонке «Репозиторий»).
## Известные ограничения и решения
## Известные ограничения и решения
1. **Транспорт `p_` vs `_`**: Kit.Helpers строит именованные аргументы `_<имя>`,
функции chk объявлены с `p_<имя>` (db-func-5; решение пользователя — сохранить
стандарт). До доработки Kit.Helpers (администратор Kit) вызовы репозиториев
против живой БД будут давать «function ... does not exist».
2. **Имена**: решение/проект `MT.Checks` — по указанию пользователя
(в `MT.Check.Core.Dal`/`MT.Checks.Test` отказ).
3. **Без тестов**: тестовый проект отсутствует; `dotnet test` из конвейера исключён.
4. Предупреждения сборки NU1903 (уязвимые пакеты Npgsql/SqlClient и др.) —
из Kit.Core, вне рамок навыка.
1. **Транспорт `p_` vs `_`**: Kit.Helpers строит именованные аргументы `_<имя>`,
функции chk объявлены с `p_<имя>` (db-func-5; решение пользователя — сохранить
стандарт). До доработки Kit.Helpers (администратор Kit) вызовы репозиториев
против живой БД будут давать «function ... does not exist».
2. **Имена**: решение/проект `MT.Checks` — по указанию пользователя
(в `MT.Check.Core.Dal`/`MT.Checks.Test` отказ).
3. **Без тестов**: тестовый проект отсутствует; `dotnet test` из конвейера исключён.
4. Предупреждения сборки NU1903 (уязвимые пакеты Npgsql/SqlClient и др.) —
из Kit.Core, вне рамок навыка.
## Возобновление/завершение
## Возобновление/завершение
После доработки Kit.Helpers достаточно проверить вызовы на тестовой БД
(спецификации вызовов не меняются). Статусы `DONE` — после утверждения
пользователем.
После доработки Kit.Helpers достаточно проверить вызовы на тестовой БД
(спецификации вызовов не меняются). Статусы `DONE` — после утверждения
пользователем.