< Summary

Information
Class: OzonDomains.Models.SupplierStatuses.SupplierOrderIntent
Assembly: OzonDomains
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonDomains/Models/SupplierStatuses/SupplierOrderIntent.cs
Line coverage
100%
Covered lines: 13
Uncovered lines: 0
Coverable lines: 13
Total lines: 77
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Id()100%11100%
get_RequestId()100%11100%
get_ProviderKey()100%11100%
get_StudioOrderId()100%11100%
get_ActiveStudioOrderId()100%11100%
get_Status()100%11100%
get_ExternalOrderNumber()100%11100%
get_Source()100%11100%
get_RequestedBy()100%11100%
get_CreatedAtUtc()100%11100%
get_UpdatedAtUtc()100%11100%
get_Note()100%11100%
get_ResolvedBy()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonDomains/Models/SupplierStatuses/SupplierOrderIntent.cs

#LineLine coverage
 1using System.ComponentModel.DataAnnotations;
 2using System.ComponentModel.DataAnnotations.Schema;
 3
 4namespace OzonDomains.Models.SupplierStatuses;
 5
 6/// <summary>
 7/// Намерение оформить заказ Studio2 у API-поставщика (outbox). Запись создаётся и фиксируется в БД ДО обращения
 8/// к поставщику, отдельной транзакцией, и поэтому переживает обрыв запроса и падение процесса.
 9/// Уникальный индекс <c>(ProviderKey, ActiveStudioOrderId)</c> не даёт завести второе активное намерение
 10/// на тот же заказ у того же поставщика даже при гонке запросов или двух инстансах.
 11/// </summary>
 12[Table("SupplierOrderIntents")]
 13public class SupplierOrderIntent
 14{
 6715    public long Id { get; set; }
 16
 17    /// <summary>Идентификатор Commit/запроса, в рамках которого создано намерение.</summary>
 18    [Required, MaxLength(64)]
 26319    public string RequestId { get; set; } = string.Empty;
 20
 21    [Required, MaxLength(64)]
 24222    public string ProviderKey { get; set; } = string.Empty;
 23
 12724    public int StudioOrderId { get; set; }
 25
 26    /// <summary>
 27    /// Равен <see cref="StudioOrderId"/>, пока намерение активно (Placing/Placed), и NULL после завершения.
 28    /// Приём тот же, что у <c>OrderSupplierStates.ActiveOrderId</c>: NULL не участвует в уникальном индексе.
 29    /// </summary>
 7030    public int? ActiveStudioOrderId { get; set; }
 31
 32    /// <summary>Placing / Placed / Failed / Superseded / Released — см. <see cref="SupplierOrderIntentStatus"/>.</summa
 33    [Required, MaxLength(20)]
 29134    public string Status { get; set; } = SupplierOrderIntentStatus.Placing;
 35
 36    /// <summary>Номер заказа у поставщика (после Placed).</summary>
 37    [MaxLength(200)]
 8538    public string? ExternalOrderNumber { get; set; }
 39
 40    /// <summary>Grid / SupplierCart / Legacy — откуда пришёл запрос.</summary>
 41    [Required, MaxLength(30)]
 17342    public string Source { get; set; } = string.Empty;
 43
 44    [MaxLength(450)]
 11045    public string? RequestedBy { get; set; }
 46
 23947    public DateTime CreatedAtUtc { get; set; } = DateTime.UtcNow;
 48
 26149    public DateTime UpdatedAtUtc { get; set; } = DateTime.UtcNow;
 50
 51    /// <summary>Как намерение закрыто: ответ поставщика, результат сверки, подтверждение пользователя.</summary>
 52    [MaxLength(500)]
 2353    public string? Note { get; set; }
 54
 55    [MaxLength(450)]
 2256    public string? ResolvedBy { get; set; }
 57}
 58
 59public static class SupplierOrderIntentStatus
 60{
 61    /// <summary>Запрос поставщику отправляется или отправлен, результат неизвестен.</summary>
 62    public const string Placing = "Placing";
 63
 64    /// <summary>Поставщик создал заказ.</summary>
 65    public const string Placed = "Placed";
 66
 67    /// <summary>Поставщик точно отклонил заказ (или запрос до него не дошёл) — повтор разрешён.</summary>
 68    public const string Failed = "Failed";
 69
 70    /// <summary>Заменено новым намерением после явного подтверждения пользователя.</summary>
 71    public const string Superseded = "Superseded";
 72
 73    /// <summary>Закрыто: заказ у поставщика отменён/закрыт, либо сверка не нашла заказа.</summary>
 74    public const string Released = "Released";
 75
 76    public static bool IsActive(string status) => status is Placing or Placed;
 77}