Исправление кодировки: восстановлена кириллица в комментариях и документации (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_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_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_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_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_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_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_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). Код функций: Спецификации функций и тест-планы: `func_specs/{функция}.md` (d-db-9). Код функций:
`functions/{сущность}_{действие}.sql` (db-func-4, расширение `.sql` — соглашение `functions/{сущность}_{действие}.sql` (db-func-4, расширение `.sql` — соглашение
репозитория). psql-тесты: `tests/test_{сущность}_{действие}.psql` (db-tst), репозитория). psql-тесты: `tests/test_{сущность}_{действие}.psql` (db-tst),
нумерация проверок = строкам таблиц «Тесты» спецификаций. Выполнение тестов — нумерация проверок = строкам таблиц «Тесты» спецификаций. Выполнение тестов —
на тестовой базе (db-tst-4): `psql -d <база> -f tests/test_*.psql`. на тестовой базе (db-tst-4): `psql -d <база> -f tests/test_*.psql`.
Статусы (d-dev-1, d-dev-2, d-dev-5): `Статус` = `DEV` (реализация начата); Статусы (d-dev-1, d-dev-2, d-dev-5): `Статус` = `DEV` (реализация начата);
колонка «Функция» = `CODE` (код и тесты написаны; `DONE` — после утверждения колонка «Функция» = `CODE` (код и тесты написаны; `DONE` — после утверждения
пользователем); «Репозиторий» = `REQ`. пользователем); «Репозиторий» = `REQ`.
Примечание к колонке «Репозиторий» (2026-09-08, решение пользователя): Примечание к колонке «Репозиторий» (2026-09-08, решение пользователя):
unit-тесты репозиториев не создаются вовсе; спецификации тестов сохранены как unit-тесты репозиториев не создаются вовсе; спецификации тестов сохранены как
документация ожидаемого поведения — `1-docs/2-core/chk/repository_tests/`. документация ожидаемого поведения — `1-docs/2-core/chk/repository_tests/`.
Код репозиториев написан (проект `MT.Checks`); статус `CODE` по d-dev-3 Код репозиториев написан (проект `MT.Checks`); статус `CODE` по d-dev-3
неприменим, Ñ‚.к. требует наличия тестов. неприменим, т.к. требует наличия тестов.

View File

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

View File

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

View File

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

View File

@ -1,50 +1,50 @@
namespace MT.Checks.Repository namespace MT.Checks.Repository
{ {
using Kit.Helpers.SqlHelperAbstract; using Kit.Helpers.SqlHelperAbstract;
using MT.Checks.Domain; using MT.Checks.Domain;
using MT.Checks.Repository.Filter; using MT.Checks.Repository.Filter;
/// <summary> /// <summary>
/// Репозиторий проверок организаций: чтение и запись через хранимые функции схемы chk. /// Репозиторий проверок организаций: чтение и запись через хранимые функции схемы chk.
/// Транзакцию из нескольких вызовов собирает вызывающий код. /// Транзакцию из нескольких вызовов собирает вызывающий код.
/// </summary> /// </summary>
public interface IChkCheckRepository public interface IChkCheckRepository
{ {
/// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой записи.</summary> /// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой записи.</summary>
int Insert(ChkCheck item); int Insert(ChkCheck item);
/// <summary>Записывает проверку целиком по Id (chk.chk_check_update); /// <summary>Записывает проверку целиком по Id (chk.chk_check_update);
/// возвращает число записанных строк. Изменяемый объект читается заранее /// возвращает число записанных строк. Изменяемый объект читается заранее
/// методом Get (read-modify-write).</summary> /// методом Get (read-modify-write).</summary>
int Update(ChkCheck item); int Update(ChkCheck item);
/// <summary>Удаляет проверку по Id (chk.chk_check_delete); /// <summary>Удаляет проверку по Id (chk.chk_check_delete);
/// возвращает число удалённых строк.</summary> /// возвращает число удалённых строк.</summary>
int Delete(int id); int Delete(int id);
/// <summary>Выбирает проверки по условиям фильтра (chk.chk_check_select); /// <summary>Выбирает проверки по условиям фильтра (chk.chk_check_select);
/// null свойства фильтра = условие не применяется.</summary> /// null свойства фильтра = условие не применяется.</summary>
IList<ChkCheck> Select(ChkCheckFilter filter); 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); ChkCheck? Get(int id);
} }
/// <summary> /// <summary>
/// Реализация: каждый метод вызывает ровно одну хранимую функцию; имена /// Реализация: каждый метод вызывает ровно одну хранимую функцию; имена
/// параметров вызова совпадают с именами параметров функции (p_*). /// параметров вызова совпадают с именами параметров функции (p_*).
/// </summary> /// </summary>
public class ChkCheckRepository : IChkCheckRepository public class ChkCheckRepository : IChkCheckRepository
{ {
private readonly IConnectionString _connectionString; private readonly IConnectionString _connectionString;
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary> /// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
public ChkCheckRepository(IConnectionString connectionString) public ChkCheckRepository(IConnectionString connectionString)
{ {
_connectionString = connectionString; _connectionString = connectionString;
} }
/// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой записи.</summary> /// <summary>Создаёт проверку (chk.chk_check_insert); возвращает id новой записи.</summary>
public int Insert(ChkCheck item) public int Insert(ChkCheck item)
{ {
return _connectionString.PrepareExecute<int>("chk.chk_check_insert") return _connectionString.PrepareExecute<int>("chk.chk_check_insert")
@ -59,14 +59,14 @@
.ExecuteScalar(); .ExecuteScalar();
} }
/// <summary>Записывает проверку целиком по Id (chk.chk_check_update); /// <summary>Записывает проверку целиком по Id (chk.chk_check_update);
/// возвращает число записанных строк. Изменяемый объект читается заранее /// возвращает число записанных строк. Изменяемый объект читается заранее
/// методом Get (read-modify-write).</summary> /// методом Get (read-modify-write).</summary>
public int Update(ChkCheck item) public int Update(ChkCheck item)
{ {
if (item.Id == 0) 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") return _connectionString.PrepareExecute<int>("chk.chk_check_update")
@ -82,13 +82,13 @@
.ExecuteScalar(); .ExecuteScalar();
} }
/// <summary>Удаляет проверку по Id (chk.chk_check_delete); /// <summary>Удаляет проверку по Id (chk.chk_check_delete);
/// возвращает число удалённых строк.</summary> /// возвращает число удалённых строк.</summary>
public int Delete(int id) public int Delete(int id)
{ {
if (id == 0) 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") return _connectionString.PrepareExecute<int>("chk.chk_check_delete")
@ -97,8 +97,8 @@
.ExecuteScalar(); .ExecuteScalar();
} }
/// <summary>Выбирает проверки по условиям фильтра (chk.chk_check_select); /// <summary>Выбирает проверки по условиям фильтра (chk.chk_check_select);
/// null свойства фильтра = условие не применяется.</summary> /// null свойства фильтра = условие не применяется.</summary>
public IList<ChkCheck> Select(ChkCheckFilter filter) public IList<ChkCheck> Select(ChkCheckFilter filter)
{ {
filter ??= new ChkCheckFilter(); filter ??= new ChkCheckFilter();
@ -128,12 +128,12 @@
.ToList(); .ToList();
} }
/// <summary>Возвращает проверку по Id (chk.chk_check_get); null — запись не найдена.</summary> /// <summary>Возвращает проверку по Id (chk.chk_check_get); null — запись не найдена.</summary>
public ChkCheck? Get(int id) public ChkCheck? Get(int id)
{ {
if (id == 0) 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") 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 Kit.Helpers.SqlHelperAbstract;
using MT.Checks.Domain; using MT.Checks.Domain;
/// <summary>Репозиторий справочника статусов проверок (только чтение).</summary> /// <summary>Репозиторий справочника статусов проверок (только чтение).</summary>
public interface IChkStatusRepository public interface IChkStatusRepository
{ {
/// <summary>Возвращает все строки справочника (chk.chk_status_select).</summary> /// <summary>Возвращает все строки справочника (chk.chk_status_select).</summary>
IList<ChkStatus> Select(); IList<ChkStatus> Select();
} }
/// <summary>Реализация: каждая выборка — вызов chk.chk_status_select.</summary> /// <summary>Реализация: каждая выборка — вызов chk.chk_status_select.</summary>
public class ChkStatusRepository : IChkStatusRepository public class ChkStatusRepository : IChkStatusRepository
{ {
private readonly IConnectionString _connectionString; private readonly IConnectionString _connectionString;
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary> /// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
public ChkStatusRepository(IConnectionString connectionString) public ChkStatusRepository(IConnectionString connectionString)
{ {
_connectionString = connectionString; _connectionString = connectionString;
} }
/// <summary>Возвращает все строки справочника (chk.chk_status_select).</summary> /// <summary>Возвращает все строки справочника (chk.chk_status_select).</summary>
public IList<ChkStatus> Select() public IList<ChkStatus> Select()
{ {
return _connectionString.PrepareExecute<ChkStatus>("chk.chk_status_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 Kit.Helpers.SqlHelperAbstract;
using MT.Checks.Domain; using MT.Checks.Domain;
/// <summary>Репозиторий справочника типов проверок (только чтение).</summary> /// <summary>Репозиторий справочника типов проверок (только чтение).</summary>
public interface IChkTypeRepository public interface IChkTypeRepository
{ {
/// <summary>Возвращает все строки справочника (chk.chk_type_select).</summary> /// <summary>Возвращает все строки справочника (chk.chk_type_select).</summary>
IList<ChkType> Select(); IList<ChkType> Select();
} }
/// <summary>Реализация: каждая выборка — вызов chk.chk_type_select.</summary> /// <summary>Реализация: каждая выборка — вызов chk.chk_type_select.</summary>
public class ChkTypeRepository : IChkTypeRepository public class ChkTypeRepository : IChkTypeRepository
{ {
private readonly IConnectionString _connectionString; private readonly IConnectionString _connectionString;
/// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary> /// <summary>Подключение передаётся снаружи и не открывается репозиторием.</summary>
public ChkTypeRepository(IConnectionString connectionString) public ChkTypeRepository(IConnectionString connectionString)
{ {
_connectionString = connectionString; _connectionString = connectionString;
} }
/// <summary>Возвращает все строки справочника (chk.chk_type_select).</summary> /// <summary>Возвращает все строки справочника (chk.chk_type_select).</summary>
public IList<ChkType> Select() public IList<ChkType> Select()
{ {
return _connectionString.PrepareExecute<ChkType>("chk.chk_type_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> /// <summary>
/// Условия выборки проверок; null свойства = условие не применяется. /// Условия выборки проверок; null свойства = условие не применяется.
/// </summary> /// </summary>
public class ChkCheckFilter public class ChkCheckFilter
{ {
/// <summary>День (дата) проверки.</summary> /// <summary>День (дата) проверки.</summary>
public DateTime? CheckDate { get; set; } public DateTime? CheckDate { get; set; }
/// <summary>Тип проверки (chk.chk_type.id).</summary> /// <summary>Тип проверки (chk.chk_type.id).</summary>
public int? TypeId { get; set; } public int? TypeId { get; set; }
/// <summary>Статус проверки (chk.chk_status.id).</summary> /// <summary>Статус проверки (chk.chk_status.id).</summary>
public int? StatusId { get; set; } public int? StatusId { get; set; }
/// <summary>Идентификатор организации РР.</summary> /// <summary>Идентификатор организации РР.</summary>
public string? RrOrganizationId { get; set; } 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 | | 0_scan (разведка) | done |
| 1_rules (правила MCP) | done | | 1_rules (правила MCP) | done |
| 2_spec (спецификации тестов) | done — утверждены пользователем | | 2_spec (спецификации тестов) | done — утверждены пользователем |
| 3_code (генерация) | done (тесты не создаются — решение пользователя) | | 3_code (генерация) | done (тесты не создаются — решение пользователя) |
| 4_validate | done — build 0 ошибок; check: 1 известный false positive (см. ниже) | | 4_validate | done — build 0 ошибок; check: 1 известный false positive (см. ниже) |
| 5_report | done — ожидание утверждения DONE | | 5_report | done — ожидание утверждения DONE |
## Версии правил ## Версии правил
- Каталог MCP standarts-catalog: **1.2** (= rules-baseline.json 1.2); расхождений - Каталог MCP standarts-catalog: **1.2** (= rules-baseline.json 1.2); расхождений
нет, `validate-rules` не требовался. нет, `validate-rules` не требовался.
- Использованные области: c-dal 1.1, d-tst 1.1, c-tst 1.1, c-cs 1.1, db-m 1.1, - Использованные области: 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). 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), - `MT.Checks.slnx` → проект `MT.Checks\MT.Checks.csproj` (net10.0),
ProjectReference на `I:\Gitea\Kit\Kit.Core\Kit.Core\Kit.Core.csproj` (Kit.Helpers). ProjectReference на `I:\Gitea\Kit\Kit.Core\Kit.Core\Kit.Core.csproj` (Kit.Helpers).
- Тестового проекта нет — решение пользователя «без тестов совсем» (2026-09-08). - Тестового проекта нет — решение пользователя «без тестов совсем» (2026-09-08).
### Файлы ### Файлы
| Файл | Содержимое | | Файл | Содержимое |
|---|---| |---|---|
| `Domain\ChkCheck.cs` | сущность проверки (+ Type/Status-справочники, Params — строка JSON) | | `Domain\ChkCheck.cs` | сущность проверки (+ Type/Status-справочники, Params — строка JSON) |
| `Domain\ChkType.cs` | справочник типов + константы `ChkTypes` (6 значений) | | `Domain\ChkType.cs` | справочник типов + константы `ChkTypes` (6 значений) |
| `Domain\ChkStatus.cs` | справочник статусов + константы `ChkStatuses` (4 значения) | | `Domain\ChkStatus.cs` | справочник статусов + константы `ChkStatuses` (4 значения) |
| `Repository\Filter\ChkCheckFilter.cs` | фильтр Select (null = условие не применяется) | | `Repository\Filter\ChkCheckFilter.cs` | фильтр Select (null = условие не применяется) |
| `Repository\ChkCheckRepository.cs` | Insert/Update/Delete/Select/Get | | `Repository\ChkCheckRepository.cs` | Insert/Update/Delete/Select/Get |
| `Repository\ChkTypeRepository.cs` | Select (справочник — только чтение) | | `Repository\ChkTypeRepository.cs` | Select (справочник — только чтение) |
| `Repository\ChkStatusRepository.cs` | Select (справочник — только чтение) | | `Repository\ChkStatusRepository.cs` | Select (справочник — только чтение) |
Неймспейсы: `MT.Checks.Domain`, `MT.Checks.Repository`, `MT.Checks.Repository.Filter` Неймспейсы: `MT.Checks.Domain`, `MT.Checks.Repository`, `MT.Checks.Repository.Filter`
(папка/префикс слоя `Chk` в коде не используются — решение пользователя). (папка/префикс слоя `Chk` в коде не используются — решение пользователя).
### Методы → функции БД ### Методы → функции БД
| Метод | Функция | Возврат | | Метод | Функция | Возврат |
|---|---|---| |---|---|---|
| `ChkCheckRepository.Insert(ChkCheck)` | `chk.chk_check_insert` | id записи | | `ChkCheckRepository.Insert(ChkCheck)` | `chk.chk_check_insert` | id записи |
| `ChkCheckRepository.Update(ChkCheck)` | `chk.chk_check_update` | число строк (read-modify-write; guard Id=0) | | `ChkCheckRepository.Update(ChkCheck)` | `chk.chk_check_update` | число строк (read-modify-write; guard Id=0) |
| `ChkCheckRepository.Delete(int)` | `chk.chk_check_delete` | число строк (guard id=0) | | `ChkCheckRepository.Delete(int)` | `chk.chk_check_delete` | число строк (guard id=0) |
| `ChkCheckRepository.Select(ChkCheckFilter)` | `chk.chk_check_select` | `IList<ChkCheck>` | | `ChkCheckRepository.Select(ChkCheckFilter)` | `chk.chk_check_select` | `IList<ChkCheck>` |
| `ChkCheckRepository.Get(int)` | `chk.chk_check_get` | `ChkCheck?` (guard id=0) | | `ChkCheckRepository.Get(int)` | `chk.chk_check_get` | `ChkCheck?` (guard id=0) |
| `ChkTypeRepository.Select()` | `chk.chk_type_select` | `IList<ChkType>` | | `ChkTypeRepository.Select()` | `chk.chk_type_select` | `IList<ChkType>` |
| `ChkStatusRepository.Select()` | `chk.chk_status_select` | `IList<ChkStatus>` | | `ChkStatusRepository.Select()` | `chk.chk_status_select` | `IList<ChkStatus>` |
Каждый метод — ровно одна хранимая функция, транспорт — fluent API Kit.Helpers Каждый метод — ровно одна хранимая функция, транспорт — fluent API Kit.Helpers
(`PrepareExecute<T>().AsStoredProcedure().AddParameter*().AddConverter(...)`), (`PrepareExecute<T>().AsStoredProcedure().AddParameter*().AddConverter(...)`),
конвертеры таблиц ответа — inline-лямбды. конвертеры таблиц ответа — inline-лямбды.
## Слой БД (этот же прогон) ## Слой БД (этот же прогон)
- `DB/chk/functions/*.sql` — 7 функций (параметры `p_*` по db-func-5); - `DB/chk/functions/*.sql` — 7 функций (параметры `p_*` по db-func-5);
- `DB/chk/func_specs/*.md` — 7 спецификаций с тест-планами (d-db-9); - `DB/chk/func_specs/*.md` — 7 спецификаций с тест-планами (d-db-9);
- `DB/chk/tests/test_*.psql` — 7 psql-тестов (**не исполнялись** — нужна тестовая - `DB/chk/tests/test_*.psql` — 7 psql-тестов (**не исполнялись** — нужна тестовая
база: `psql -d <база> -f DB/chk/tests/test_*.psql`); база: `psql -d <база> -f DB/chk/tests/test_*.psql`);
- `DB/chk/functions.md` — статусы: функции `DEV`/«Функция»=`CODE`; «Репозиторий»=`REQ` - `DB/chk/functions.md` — статусы: функции `DEV`/«Функция»=`CODE`; «Репозиторий»=`REQ`
с примечанием (unit-тесты не создаются, `CODE` по d-dev-3 неприменим). с примечанием (unit-тесты не создаются, `CODE` по d-dev-3 неприменим).
## Валидация ## Валидация
- `dotnet build MT.Checks.slnx` — **0 ошибок** (предупреждения NU1903/CS — из Kit.Core). - `dotnet build MT.Checks.slnx` **0 ошибок** (предупреждения NU1903/CS — из Kit.Core).
- DalTools `check` (с манифестом) — **1 нарушение c-dal-1, известный false positive**: - DalTools `check` (с манифестом) — **1 нарушение c-dal-1, известный false positive**:
эвристика «SQL в строке C#» сканирует текст между строковыми литералами файла и эвристика «SQL в строке C#» сканирует текст между строковыми литералами файла и
находит слово `Select` в сигнатуре метода `Select(ChkCheckFilter)` — имя метода находит слово `Select` в сигнатуре метода `Select(ChkCheckFilter)` — имя метода
обязательно по правилу c-dal-5 (имена CRUD: Insert/Update/Delete/Select/Get). обязательно по правилу c-dal-5 (имена CRUD: Insert/Update/Delete/Select/Get).
Неустранимо в коде без нарушения стандарта; SQL в строках отсутствует. Неустранимо в коде без нарушения стандарта; SQL в строках отсутствует.
## Спецификации тестов ## Спецификации тестов
`1-docs/2-core/chk/repository_tests/` — ChkCheckRepository.md (17 тестов), `1-docs/2-core/chk/repository_tests/` — ChkCheckRepository.md (17 тестов),
ChkTypeRepository.md, ChkStatusRepository.md — утверждены как документация ChkTypeRepository.md, ChkStatusRepository.md — утверждены как документация
ожидаемого поведения. Тестовый код по решению пользователя не создаётся ожидаемого поведения. Тестовый код по решению пользователя не создаётся
(см. `DB/chk/functions.md`, примечание к колонке «Репозиторий»). (см. `DB/chk/functions.md`, примечание к колонке «Репозиторий»).
## Известные ограничения и решения ## Известные ограничения и решения
1. **Транспорт `p_` vs `_`**: Kit.Helpers строит именованные аргументы `_<имя>`, 1. **Транспорт `p_` vs `_`**: Kit.Helpers строит именованные аргументы `_<имя>`,
функции chk объявлены с `p_<имя>` (db-func-5; решение пользователя — сохранить функции chk объявлены с `p_<имя>` (db-func-5; решение пользователя — сохранить
стандарт). До доработки Kit.Helpers (администратор Kit) вызовы репозиториев стандарт). До доработки Kit.Helpers (администратор Kit) вызовы репозиториев
против живой БД будут давать «function ... does not exist». против живой БД будут давать «function ... does not exist».
2. **Имена**: решение/проект `MT.Checks` — по указанию пользователя 2. **Имена**: решение/проект `MT.Checks` — по указанию пользователя
(в `MT.Check.Core.Dal`/`MT.Checks.Test` отказ). (в `MT.Check.Core.Dal`/`MT.Checks.Test` отказ).
3. **Без тестов**: тестовый проект отсутствует; `dotnet test` из конвейера исключён. 3. **Без тестов**: тестовый проект отсутствует; `dotnet test` из конвейера исключён.
4. Предупреждения сборки NU1903 (уязвимые пакеты Npgsql/SqlClient и др.) — 4. Предупреждения сборки NU1903 (уязвимые пакеты Npgsql/SqlClient и др.) —
из Kit.Core, вне рамок навыка. из Kit.Core, вне рамок навыка.
## Возобновление/завершение ## Возобновление/завершение
После доработки Kit.Helpers достаточно проверить вызовы на тестовой БД После доработки Kit.Helpers достаточно проверить вызовы на тестовой БД
(спецификации вызовов не меняются). Статусы `DONE` — после утверждения (спецификации вызовов не меняются). Статусы `DONE` — после утверждения
пользователем. пользователем.