- Отправить: поиск по прайсу → корзина (кол-во через NumericUpDown,
сумма/итого) → выбор грузополучателя + комментарий → создание заказа
POST /api/buyer/orders
- Core: CreateOrderAsync + DTO (BuyerOrderCreateRequest/ItemReq/Response)
- Отказы: заглушка с точным пояснением (нужен серверный эндпоинт;
RefuseItemsCount живёт только в локальной SQLite WinForms)
Итог: 6/7 разделов функциональны (Прайс-лист, Заказы, Накладные, Отчёты,
Справочник, Отправить), Отказы — заглушка. Собирается.
⚠️ Реальная отправка заказа (POST) не тестировалась — создаёт заказ на
проде; проверять вживую отдельно.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
61 lines
2.2 KiB
C#
61 lines
2.2 KiB
C#
using System;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using Elfisa.Core;
|
|
|
|
namespace Elfisa.Avalonia.ViewModels;
|
|
|
|
public class NavItem
|
|
{
|
|
public string Title { get; }
|
|
public string Icon { get; }
|
|
public Func<ViewModelBase> Factory { get; }
|
|
public NavItem(string title, string icon, Func<ViewModelBase> factory)
|
|
{
|
|
Title = title; Icon = icon; Factory = factory;
|
|
}
|
|
}
|
|
|
|
public partial class ShellViewModel : ViewModelBase
|
|
{
|
|
private readonly Action _logout;
|
|
|
|
public ObservableCollection<NavItem> NavItems { get; }
|
|
|
|
[ObservableProperty] private NavItem? _selectedNav;
|
|
[ObservableProperty] private ViewModelBase? _currentPage;
|
|
|
|
public string UserName => Session.Current.Username ?? "";
|
|
public string RoleLabel => Session.Current.Role switch
|
|
{
|
|
"buyer" => "Покупатель",
|
|
"supplier" => "Поставщик",
|
|
"manager" => "Менеджер",
|
|
"admin" => "Администратор",
|
|
_ => Session.Current.Role ?? ""
|
|
};
|
|
|
|
public ShellViewModel(Action logout)
|
|
{
|
|
_logout = logout;
|
|
NavItems = new ObservableCollection<NavItem>
|
|
{
|
|
new("Прайс-лист", "🧾", () => new PriceListViewModel()),
|
|
new("Заказы", "🛒", () => new OrdersViewModel()),
|
|
new("Накладные", "📄", () => new InvoicesViewModel()),
|
|
new("Отчёты", "📊", () => new ReportsViewModel()),
|
|
new("Отправить", "📤", () => new SendOrderViewModel()),
|
|
new("Отказы", "⛔", () => new PlaceholderPageViewModel("Отказы",
|
|
"Отказные позиции по заказам. Нужен серверный эндпоинт: данные (RefuseItemsCount) сейчас есть только в локальной БД WinForms-клиента.")),
|
|
new("Справочник", "📖", () => new DirectoryViewModel()),
|
|
};
|
|
SelectedNav = NavItems.First(n => n.Title == "Отчёты");
|
|
}
|
|
|
|
partial void OnSelectedNavChanged(NavItem? value) => CurrentPage = value?.Factory();
|
|
|
|
[RelayCommand] private void Logout() => _logout();
|
|
}
|