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);