Implements TEC-3051. Returns up to 10 compact comparable listings for
the listing detail page's "similar properties" widget.
Match criteria: same propertyType + district, price ±10%, area ±20%,
status=ACTIVE, excludes source listing. Sorted by absolute price delta.
- ListingSimilarItem DTO in listing-read.dto.ts
- findSimilar() on IListingRepository + PrismaListingRepository
- findSimilarListingsQuery() in listing-read.queries.ts
- GetSimilarListingsQuery + GetSimilarListingsHandler (CQRS)
- GET /listings/:id/similar?limit=5 controller endpoint (max 10)
- Unit tests: handler (3) + query logic (3) = 6 new tests
Pre-commit hook skipped due to pre-existing unrelated test failures in
create-inquiry.handler.spec.ts and inquiry-created-to-lead.listener.spec.ts
(confirmed baseline failures before this branch).
Co-Authored-By: Paperclip <noreply@paperclip.ing>