namespace Deal.Modules.Kanban.Application.Models;
///
/// Частичная правка карточки (ICardStore.PatchCardAsync; 1:1 patch_card projects.py L159–187).
///
///
/// Значение null у поля означает «поле не меняется» (конвенция ContainerPatchDto); пустая строка или
/// пустой массив — осмысленное значение и применяется. JSON-поля (stack/comments/links/files) заменяются
/// ЦЕЛИКОМ, не сливаясь с текущими значениями. budget — объект {from,to,cur} либо null = «не менять»;
/// явная очистка бюджета телом PATCH передаётся объектом с пустой Cur (BudgetCur пуст = «бюджета нет»;
/// хранилище пишет from/to=null и cur="", наружу бюджет снова null). Наружу сериализуется в camelCase.
///
/// Новый заголовок.
/// Новое краткое содержание.
/// Новая контактная строка.
/// Новый текст технического задания.
/// Новый стек (полная замена массива).
/// Новый бюджет (полная замена from/to/cur).
/// Новый массив комментариев (полная замена).
/// Новый массив ссылок (полная замена).
/// Новый массив файлов (полная замена).
public sealed record CardPatch(
string? Title,
string? Summary,
string? Contact,
string? TzText,
IReadOnlyList? Stack,
CardBudgetDto? Budget,
IReadOnlyList? Comments,
IReadOnlyList? Links,
IReadOnlyList? Files);