fix(tradein/ui): этаж сделки скрывался у всех 96 974 — требовалось второе поле (#2674) #2861

Merged
bot-backend merged 1 commit from fix/2674-deal-floor-display into main 2026-08-13 08:46:46 +00:00
2 changed files with 66 additions and 2 deletions

View file

@ -156,8 +156,15 @@ function DealRow({ deal }: { deal: AnalogLot }) {
<span className="a-main">{deal.address}</span>
<span className="a-sub">
{deal.area_m2.toFixed(1)} м² · {deal.rooms === 0 ? "студия" : `${deal.rooms}`}
{deal.floor !== null && deal.total_floors !== null
? ` · этаж ${deal.floor}/${deal.total_floors}`
{/* #2674: этажность у сделок Росреестра пуста ВСЕГДА (0 из 96 974
открытый набор её не содержит), а этаж заполнен у 96 974 из 96 974.
Прежнее условие требовало оба поля, поэтому этаж был скрыт у ВСЕХ
сделок. Печатаем «этаж N», когда этажности нет, ровно так уже
делает BuildingListingsDrawer для объявлений. */}
{deal.floor !== null
? deal.total_floors !== null
? ` · этаж ${deal.floor}/${deal.total_floors}`
: ` · этаж ${deal.floor}`
: ""}
</span>
</div>

View file

@ -0,0 +1,57 @@
/**
* #2674 этаж сделки скрывался у ВСЕХ сделок из-за требования второго поля.
*
* Замер на проде 13.08.2026: `deals.floor` заполнен у 96 974 из 96 974,
* `deals.total_floors` у 0 из 96 974. Открытый набор Росреестра этажности не
* содержит в принципе, то есть это не «данные не доехали», а свойство источника.
*
* Прежнее условие печатало «этаж X/Y» только когда непусты ОБА поля, поэтому
* этаж не показывался никогда. Соседний компонент (BuildingListingsDrawer) уже
* делал правильно печатал «этаж N», когда этажность неизвестна.
*/
import { render, screen } from "@testing-library/react";
import { describe, expect, it } from "vitest";
import { DealsCard } from "../DealsCard";
import type { AggregatedEstimate, AnalogLot } from "@/types/trade-in";
function makeDeal(overrides: Partial<AnalogLot> = {}): AnalogLot {
return {
address: "Екатеринбург, Ленина 5",
area_m2: 55.4,
rooms: 2,
floor: 7,
total_floors: null,
price_rub: 6_500_000,
price_per_m2: 117_328,
source: "rosreestr",
deal_date: "2026-01-01",
...overrides,
} as AnalogLot;
}
function makeEstimate(deals: AnalogLot[]): AggregatedEstimate {
return {
actual_deals: deals,
period_months: 12,
} as unknown as AggregatedEstimate;
}
describe("DealsCard — этаж сделки", () => {
it("печатает этаж, когда этажность неизвестна (боевой случай: 100% сделок)", () => {
render(<DealsCard estimate={makeEstimate([makeDeal()])} />);
// Именно «этаж 7» без дроби — этажности у сделок Росреестра нет никогда.
expect(screen.getByText(/этаж 7/)).toBeTruthy();
expect(screen.queryByText(/этаж 7\//)).toBeNull();
});
it("печатает дробь, когда этажность известна — прежнее поведение цело", () => {
render(<DealsCard estimate={makeEstimate([makeDeal({ total_floors: 9 })])} />);
expect(screen.getByText(/этаж 7\/9/)).toBeTruthy();
});
it("не печатает ничего, когда неизвестен сам этаж", () => {
render(<DealsCard estimate={makeEstimate([makeDeal({ floor: null })])} />);
expect(screen.queryByText(/этаж/)).toBeNull();
});
});