- CartService: единая корзина для Прайс-листа и Отправить - Прайс-лист: выбор позиции + кол-во + «Добавить в заказ», индикатор корзины - Настройки (диалог ⚙ в шапке): адрес API, тема (свет/тьма, применяется сразу), грузополучатель по умолчанию; сохранение в %APPDATA% - SettingsStore (Core) + AppConfig читает сохранённый API-адрес - тема применяется на старте Проверено вживую: добавление из Прайс-листа в корзину, диалог настроек. Реальная отправка заказа (POST) — собрана и связана, живой заказ по явному «да» (автозащита блокирует боевую транзакцию без подтверждения). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
72 lines
1.9 KiB
C#
72 lines
1.9 KiB
C#
using System;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using Elfisa.Core;
|
|
|
|
namespace Elfisa.Avalonia.ViewModels;
|
|
|
|
public partial class CartItem : ObservableObject
|
|
{
|
|
public PriceItem Source { get; }
|
|
public string Name => Source.DrugName ?? "";
|
|
public string Supplier => Source.SupplierName ?? "";
|
|
public decimal Price => Source.Price;
|
|
|
|
[ObservableProperty] private decimal _qty = 1;
|
|
public decimal LineSum => Price * Qty;
|
|
|
|
public event Action? Changed;
|
|
|
|
public CartItem(PriceItem src) => Source = src;
|
|
|
|
partial void OnQtyChanged(decimal value)
|
|
{
|
|
OnPropertyChanged(nameof(LineSum));
|
|
Changed?.Invoke();
|
|
}
|
|
}
|
|
|
|
/// <summary>Единая корзина заказа — общая для «Прайс-листа» и «Отправить».</summary>
|
|
public sealed class CartService
|
|
{
|
|
public static CartService Instance { get; } = new();
|
|
|
|
public ObservableCollection<CartItem> Items { get; } = new();
|
|
public event Action? Changed;
|
|
|
|
public decimal Total => Items.Sum(c => c.LineSum);
|
|
public int Count => Items.Count;
|
|
|
|
public void Add(PriceItem src, decimal qty = 1)
|
|
{
|
|
if (src is null || string.IsNullOrEmpty(src.SupplierPriceId)) return;
|
|
var existing = Items.FirstOrDefault(c => c.Source.SupplierPriceId == src.SupplierPriceId);
|
|
if (existing != null) existing.Qty += qty;
|
|
else
|
|
{
|
|
var ci = new CartItem(src) { Qty = qty };
|
|
ci.Changed += Raise;
|
|
Items.Add(ci);
|
|
}
|
|
Raise();
|
|
}
|
|
|
|
public void Remove(CartItem item)
|
|
{
|
|
if (item is null) return;
|
|
item.Changed -= Raise;
|
|
Items.Remove(item);
|
|
Raise();
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
foreach (var i in Items) i.Changed -= Raise;
|
|
Items.Clear();
|
|
Raise();
|
|
}
|
|
|
|
private void Raise() => Changed?.Invoke();
|
|
}
|