From 51bef167584167d7fd57e33776053cc75c7d9fc4 Mon Sep 17 00:00:00 2001 From: nns <278048682+nurdotnet@users.noreply.github.com> Date: Fri, 24 Apr 2026 12:08:30 +0500 Subject: [PATCH] =?UTF-8?q?feat(org-settings):=20=D0=B2=D0=B0=D0=BB=D1=8E?= =?UTF-8?q?=D1=82=D0=B0=20read-only,=20=D1=82=D1=8F=D0=BD=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=B8=D0=B7=20=D1=81=D1=82=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D1=8B=20(=D0=BA=D0=B0=D0=BA=20=D0=9D=D0=94=D0=A1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Currency в настройках больше не выбирается, показывается disabled как "KZT (₸)", источник правды — Country.DefaultCurrencyId. - Backend: OrgSettingsInput больше не принимает DefaultCurrencyId; Update синхронизирует Organization.DefaultCurrencyId со страной. - UX: страна — единственный редактируемый вход, определяет и НДС, и валюту. - Мульти-валютный режим (Organization.MultiCurrencyEnabled) остаётся галкой; выбор валюты в закупках/продажах/карточке товара по-прежнему скрыт когда флаг выключен. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../OrganizationSettingsController.cs | 8 +++-- .../src/pages/OrganizationSettingsPage.tsx | 30 ++++++------------- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/food-market.api/Controllers/Organizations/OrganizationSettingsController.cs b/src/food-market.api/Controllers/Organizations/OrganizationSettingsController.cs index 1a8d102..c7368b8 100644 --- a/src/food-market.api/Controllers/Organizations/OrganizationSettingsController.cs +++ b/src/food-market.api/Controllers/Organizations/OrganizationSettingsController.cs @@ -32,10 +32,10 @@ public record OrgSettingsDto( decimal VatRate, bool ShowVatEnabledOnProduct); + // DefaultCurrencyId не принимается — он read-only, выводится из страны (Country.DefaultCurrencyId). public record OrgSettingsInput( string Name, string CountryCode, - Guid? DefaultCurrencyId, bool MultiCurrencyEnabled, bool ShowVatEnabledOnProduct); @@ -62,7 +62,11 @@ public async Task> Update([FromBody] OrgSettingsInp o.Name = input.Name; o.CountryCode = input.CountryCode; - o.DefaultCurrencyId = input.DefaultCurrencyId; + // Валюта организации жёстко следует за страной — не принимается от клиента. + o.DefaultCurrencyId = await _db.Countries + .Where(c => c.Code == input.CountryCode) + .Select(c => c.DefaultCurrencyId) + .FirstOrDefaultAsync(ct); o.MultiCurrencyEnabled = input.MultiCurrencyEnabled; o.ShowVatEnabledOnProduct = input.ShowVatEnabledOnProduct; await _db.SaveChangesAsync(ct); diff --git a/src/food-market.web/src/pages/OrganizationSettingsPage.tsx b/src/food-market.web/src/pages/OrganizationSettingsPage.tsx index 5dc5aea..5569c71 100644 --- a/src/food-market.web/src/pages/OrganizationSettingsPage.tsx +++ b/src/food-market.web/src/pages/OrganizationSettingsPage.tsx @@ -5,31 +5,27 @@ import { api } from '@/lib/api' import { PageHeader } from '@/components/PageHeader' import { Button } from '@/components/Button' import { Field, TextInput, Select, Checkbox } from '@/components/Field' -import { useCurrencies, useCountries } from '@/lib/useLookups' +import { useCountries } from '@/lib/useLookups' import { useOrgSettings, type OrgSettings } from '@/lib/useOrgSettings' export function OrganizationSettingsPage() { const qc = useQueryClient() const settings = useOrgSettings() - const currencies = useCurrencies() const countries = useCountries() const [form, setForm] = useState(null) useEffect(() => { if (settings.data && !form) setForm(settings.data) }, [settings.data, form]) - // При смене страны подтягиваем её валюту и ставку НДС (оба из справочника стран). + // При смене страны подтягиваем её валюту и ставку НДС (оба read-only, из справочника стран). const onCountryChange = (countryCode: string) => { if (!form) return const country = countries.data?.find((c) => c.code === countryCode) - const currency = country?.defaultCurrencyId - ? currencies.data?.find((c) => c.id === country.defaultCurrencyId) - : undefined setForm({ ...form, countryCode, - defaultCurrencyId: currency?.id ?? country?.defaultCurrencyId ?? null, - defaultCurrencyCode: currency?.code ?? country?.defaultCurrencyCode ?? null, - defaultCurrencySymbol: currency?.symbol ?? country?.defaultCurrencySymbol ?? null, + defaultCurrencyId: country?.defaultCurrencyId ?? null, + defaultCurrencyCode: country?.defaultCurrencyCode ?? null, + defaultCurrencySymbol: country?.defaultCurrencySymbol ?? null, vatRate: country?.vatRate ?? 0, }) } @@ -40,7 +36,6 @@ export function OrganizationSettingsPage() { const payload = { name: form.name, countryCode: form.countryCode, - defaultCurrencyId: form.defaultCurrencyId, multiCurrencyEnabled: form.multiCurrencyEnabled, showVatEnabledOnProduct: form.showVatEnabledOnProduct, } @@ -71,17 +66,10 @@ export function OrganizationSettingsPage() { - +