fix(pwa): в штрафах «погашен», а не «оплачен»
Слово «оплачен» водитель читает как «я ничего не должен», а постановление к тому моменту оплачено парком — не им. Поэтому в списке и карточке состояние теперь «не погашен / погашен / не выставлялся / уточняется», долг в шапке берётся из баланса 1С, а карточка объясняет расхождение сумм: «постановление — 750 ₽, парк оплатил его со скидкой и выставил вам фактическую сумму». Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -4,17 +4,22 @@ import userEvent from "@testing-library/user-event";
|
||||
import { MemoryRouter, Route, Routes } from "react-router-dom";
|
||||
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||||
|
||||
// Реальный случай: парк уже погасил постановление в ГИБДД со скидкой, а водитель
|
||||
// парку ещё должен. Именно на нём приложение показывало «неоплаченных нет».
|
||||
const FINE = {
|
||||
id: 12, number: "18810525260813035846", date: "2026-08-12",
|
||||
article: "12.09.2 - Превышение скорости", address: "Владивосток, Некрасовская, 90",
|
||||
car_number: "А947УТ125", amount: 562.5, discount_amount: 281.25,
|
||||
discount_until: "2026-09-01", paid: false, cancelled: false, has_photo: true,
|
||||
car_number: "А947УТ125", amount: 618.75, billed: true, fine_amount: 750,
|
||||
discount_amount: 375, discount_until: "2026-09-01",
|
||||
settled: "owed" as const, closed_with_gibdd: true, cancelled: false, has_photo: true,
|
||||
};
|
||||
|
||||
vi.mock("@/api/driver", () => ({
|
||||
getFines: vi.fn(async (status: string) => ({
|
||||
items: status === "open" ? [FINE] : [FINE, { ...FINE, id: 13, paid: true, amount: 500 }],
|
||||
open_count: 1, open_sum: 562.5,
|
||||
items: status === "open"
|
||||
? [FINE]
|
||||
: [FINE, { ...FINE, id: 13, settled: "paid" as const, amount: 500 }],
|
||||
open_count: 1, debt: -5156,
|
||||
})),
|
||||
getFine: vi.fn(async () => ({
|
||||
...FINE, post_date: "2026-08-13", speed: 63, speed_limit: 40, speed_excess: 23,
|
||||
@@ -46,17 +51,25 @@ function wrap(path = "/fines") {
|
||||
describe("список штрафов", () => {
|
||||
beforeEach(() => vi.clearAllMocks());
|
||||
|
||||
it("открывается на неоплаченных и показывает сумму долга", async () => {
|
||||
it("долг берётся из баланса 1С, а не из сумм постановлений", async () => {
|
||||
wrap();
|
||||
expect(await screen.findByText(/Не оплачено: 1 на 562,50 ₽/)).toBeInTheDocument();
|
||||
// Парк гасит ГИБДД авансом: если считать по «оплачен/не оплачен» из
|
||||
// постановлений, экран покажет «долгов нет» при −5 156 ₽ на главном.
|
||||
expect(await screen.findByText(/Долг по штрафам −5 156 ₽ · не погашено: 1/)).toBeInTheDocument();
|
||||
expect(vi.mocked(driver.getFines).mock.calls[0][0]).toBe("open");
|
||||
});
|
||||
|
||||
it("вкладка «Все» показывает и оплаченные", async () => {
|
||||
it("закрытый в ГИБДД штраф остаётся непогашенным для водителя", async () => {
|
||||
wrap();
|
||||
await screen.findByText(/Не оплачено/);
|
||||
expect(await screen.findByText("не погашен")).toBeInTheDocument();
|
||||
expect(screen.queryByText("оплачен")).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("вкладка «Все» показывает и погашенные", async () => {
|
||||
wrap();
|
||||
await screen.findByText(/Долг по штрафам/);
|
||||
await userEvent.click(screen.getByRole("button", { name: "Все" }));
|
||||
expect(await screen.findByText("оплачен")).toBeInTheDocument();
|
||||
expect(await screen.findByText("погашен")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("штраф открывается в карточку", async () => {
|
||||
@@ -76,10 +89,12 @@ describe("карточка штрафа", () => {
|
||||
expect(img.closest("a")).toHaveAttribute("target", "_blank");
|
||||
});
|
||||
|
||||
it("скорость и скидка объясняют штраф без звонка в парк", async () => {
|
||||
it("объясняет, почему начислено меньше номинала постановления", async () => {
|
||||
wrap("/fines/12");
|
||||
expect(await screen.findByText(/63 км\/ч при разрешённых 40/)).toBeInTheDocument();
|
||||
expect(screen.getByText(/281,25 ₽ со скидкой/)).toBeInTheDocument();
|
||||
expect(await screen.findByText("618,75 ₽")).toBeInTheDocument();
|
||||
expect(screen.getByText(/Постановление — 750 ₽/)).toBeInTheDocument();
|
||||
expect(screen.getByText(/В ГИБДД постановление закрыто/)).toBeInTheDocument();
|
||||
expect(screen.getByText(/63 км\/ч при разрешённых 40/)).toBeInTheDocument();
|
||||
expect(screen.getByText("18810525260813035846")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user