feat(org-settings): настройка ShowMinMaxStock для мин/макс остатков
Добавлена Organization.ShowMinMaxStock (bool, default false) — флаг видимости полей «Минимальный / Максимальный остаток» на карточке товара. В UI настроек магазина появилась соответствующая галка с подсказкой. По умолчанию выключено — большинству магазинов эти поля не нужны. Миграция Phase5f_ShowMinMaxStock добавляет колонку. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
ed00e85140
commit
a94c38d074
|
|
@ -32,7 +32,8 @@ public record OrgSettingsDto(
|
|||
decimal VatRate,
|
||||
bool ShowVatEnabledOnProduct,
|
||||
bool ShowServiceOnProduct,
|
||||
bool ShowMarkedOnProduct);
|
||||
bool ShowMarkedOnProduct,
|
||||
bool ShowMinMaxStock);
|
||||
|
||||
// DefaultCurrencyId не принимается — он read-only, выводится из страны (Country.DefaultCurrencyId).
|
||||
public record OrgSettingsInput(
|
||||
|
|
@ -41,7 +42,8 @@ public record OrgSettingsInput(
|
|||
bool MultiCurrencyEnabled,
|
||||
bool ShowVatEnabledOnProduct,
|
||||
bool ShowServiceOnProduct,
|
||||
bool ShowMarkedOnProduct);
|
||||
bool ShowMarkedOnProduct,
|
||||
bool ShowMinMaxStock);
|
||||
|
||||
[HttpGet("settings")]
|
||||
public async Task<ActionResult<OrgSettingsDto>> Get(CancellationToken ct)
|
||||
|
|
@ -75,6 +77,7 @@ public async Task<ActionResult<OrgSettingsDto>> Update([FromBody] OrgSettingsInp
|
|||
o.ShowVatEnabledOnProduct = input.ShowVatEnabledOnProduct;
|
||||
o.ShowServiceOnProduct = input.ShowServiceOnProduct;
|
||||
o.ShowMarkedOnProduct = input.ShowMarkedOnProduct;
|
||||
o.ShowMinMaxStock = input.ShowMinMaxStock;
|
||||
await _db.SaveChangesAsync(ct);
|
||||
|
||||
await _db.Entry(o).Reference(x => x.DefaultCurrency).LoadAsync(ct);
|
||||
|
|
@ -100,5 +103,6 @@ private async Task<decimal> ReadVatRateAsync(string countryCode, CancellationTok
|
|||
vat,
|
||||
o.ShowVatEnabledOnProduct,
|
||||
o.ShowServiceOnProduct,
|
||||
o.ShowMarkedOnProduct);
|
||||
o.ShowMarkedOnProduct,
|
||||
o.ShowMinMaxStock);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,4 +41,9 @@ public class Organization : Entity
|
|||
/// Маркировка требуется только в нишевых категориях (алкоголь, лекарства,
|
||||
/// табак) — по умолчанию выключено.</summary>
|
||||
public bool ShowMarkedOnProduct { get; set; }
|
||||
|
||||
/// <summary>Показывать ли поля «Минимальный остаток» / «Максимальный остаток»
|
||||
/// на карточке товара и одноимённую колонку в списке. Нужно в основном
|
||||
/// торговым сетям со свободным местом на полке — по умолчанию выключено.</summary>
|
||||
public bool ShowMinMaxStock { get; set; }
|
||||
}
|
||||
|
|
|
|||
1885
src/food-market.infrastructure/Persistence/Migrations/20260424230000_Phase5f_ShowMinMaxStock.Designer.cs
generated
Normal file
1885
src/food-market.infrastructure/Persistence/Migrations/20260424230000_Phase5f_ShowMinMaxStock.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,24 @@
|
|||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace foodmarket.Infrastructure.Persistence.Migrations
|
||||
{
|
||||
/// <summary>Добавляет organizations.ShowMinMaxStock — флаг видимости
|
||||
/// полей мин/макс остатка на карточке товара и одноимённой колонки
|
||||
/// в списке. По умолчанию false.</summary>
|
||||
public partial class Phase5f_ShowMinMaxStock : Migration
|
||||
{
|
||||
protected override void Up(MigrationBuilder b)
|
||||
{
|
||||
b.AddColumn<bool>(
|
||||
name: "ShowMinMaxStock", schema: "public", table: "organizations",
|
||||
type: "boolean", nullable: false, defaultValue: false);
|
||||
}
|
||||
|
||||
protected override void Down(MigrationBuilder b)
|
||||
{
|
||||
b.DropColumn(name: "ShowMinMaxStock", schema: "public", table: "organizations");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -473,9 +473,6 @@ protected override void BuildModel(ModelBuilder modelBuilder)
|
|||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<bool>("IsActive")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<int>("MinorUnit")
|
||||
.HasColumnType("integer");
|
||||
|
||||
|
|
@ -1096,6 +1093,9 @@ protected override void BuildModel(ModelBuilder modelBuilder)
|
|||
b.Property<bool>("ShowMarkedOnProduct")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<bool>("ShowMinMaxStock")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<bool>("ShowServiceOnProduct")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ export interface OrgSettings {
|
|||
showVatEnabledOnProduct: boolean
|
||||
showServiceOnProduct: boolean
|
||||
showMarkedOnProduct: boolean
|
||||
showMinMaxStock: boolean
|
||||
}
|
||||
|
||||
export function useOrgSettings() {
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ export function OrganizationSettingsPage() {
|
|||
showVatEnabledOnProduct: form.showVatEnabledOnProduct,
|
||||
showServiceOnProduct: form.showServiceOnProduct,
|
||||
showMarkedOnProduct: form.showMarkedOnProduct,
|
||||
showMinMaxStock: form.showMinMaxStock,
|
||||
}
|
||||
return (await api.put<OrgSettings>('/api/organization/settings', payload)).data
|
||||
},
|
||||
|
|
@ -125,6 +126,16 @@ export function OrganizationSettingsPage() {
|
|||
Включать, только если продаётся маркируемая категория (алкоголь, табак, лекарства).
|
||||
По умолчанию галка скрыта.
|
||||
</p>
|
||||
|
||||
<Checkbox
|
||||
label='Показывать мин/макс остатки на товаре'
|
||||
checked={form.showMinMaxStock}
|
||||
onChange={(v) => setForm({ ...form, showMinMaxStock: v })}
|
||||
/>
|
||||
<p className="text-xs text-slate-500 -mt-2">
|
||||
Если включено — на карточке товара есть поля «Минимальный / Максимальный остаток»
|
||||
для автозаказа. По умолчанию скрыто.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<div className="mt-4 flex gap-3 items-center">
|
||||
|
|
|
|||
Loading…
Reference in a new issue