food-market/tests/food-market.IntegrationTests/SupplierReconciliationTests.cs
nns 524f8f41b1
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
feat(money): акт сверки с поставщиком — печать/PDF (п.7)
GET /api/money/reports/supplier-reconciliation?supplierId=&from=&to=: начальное
сальдо (до from), движения периода (приёмка +долг, возврат/оплата −долг) с бегущим
сальдо, конечное сальдо. Веб-страница /money/supplier-debts/:id/reconciliation —
печатная форма акта (window.print()/PDF) + кнопка «Акт сверки» в долгах поставщикам.
Integration-тест: приёмка как debit, конечное сальдо.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-09 06:39:08 +05:00

38 lines
1.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Net.Http.Json;
using System.Text.Json;
using FluentAssertions;
using foodmarket.IntegrationTests.Support;
using Xunit;
namespace foodmarket.IntegrationTests;
/// <summary>Паритет п.7: акт сверки с поставщиком — начальное сальдо, движения
/// периода, конечное сальдо.</summary>
[Collection(ApiCollection.Name)]
public class SupplierReconciliationTests
{
private readonly ApiFactory _factory;
public SupplierReconciliationTests(ApiFactory factory) => _factory = factory;
private static string RandomBarcode()
=> string.Concat(Enumerable.Range(0, 13).Select(_ => Random.Shared.Next(0, 10)));
[Fact]
public async Task Reconciliation_includes_supply_as_debit_and_closing_balance()
{
var api = new ApiActor(_factory.CreateClient());
await api.SignupAndLoginAsync($"recon-{Guid.NewGuid():N}");
var refs = await api.LoadRefsAsync();
var supplier = await api.CreateCounterpartyAsync($"S-{Guid.NewGuid():N}");
var product = await api.CreateProductAsync(refs, $"P-{Guid.NewGuid():N}", 500m, RandomBarcode());
// Приёмка 10×100 = 1000 → мы должны 1000.
var (_, total) = await api.CreatePostedSupplyAsync(refs, supplier, product, 10m, 100m);
var recon = await api.GetJsonAsync($"/api/money/reports/supplier-reconciliation?supplierId={supplier}");
recon.GetProperty("supplierId").GetString().Should().Be(supplier);
var rows = recon.GetProperty("rows").EnumerateArray().ToList();
rows.Should().Contain(r => r.GetProperty("docType").GetString() == "Приёмка" && r.GetProperty("debit").GetDecimal() == total);
recon.GetProperty("closingBalance").GetDecimal().Should().Be(total, "конечное сальдо = сумма приёмки (неоплачено)");
}
}