You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

265 lines
7.4 KiB
Java

package at.procon.ted.model.dto;
import at.procon.ted.model.entity.ContractNature;
import at.procon.ted.model.entity.NoticeType;
import at.procon.ted.model.entity.ProcedureType;
import at.procon.ted.model.entity.VectorizationStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.UUID;
/**
* DTOs for procurement document API responses.
*
* @author Martin.Schweitzer@procon.co.at and claude.ai
*/
public class DocumentDtos {
/**
* Summary DTO for list views and search results.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class DocumentSummary {
private UUID id;
private String publicationId;
private String noticeId;
private NoticeType noticeType;
private String projectTitle;
private String buyerName;
private String buyerCountryCode;
private String buyerCity;
private ContractNature contractNature;
private ProcedureType procedureType;
private LocalDate publicationDate;
private OffsetDateTime submissionDeadline;
private List<String> cpvCodes;
private Integer totalLots;
private BigDecimal estimatedValue;
private String estimatedValueCurrency;
private Double similarity; // For semantic search results
}
/**
* Detailed DTO for single document view.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class DocumentDetail {
private UUID id;
private String documentHash;
// Identifiers
private String publicationId;
private String noticeId;
private String ojsId;
private String contractFolderId;
// Classification
private NoticeType noticeType;
private String noticeSubtypeCode;
private String sdkVersion;
private String ublVersion;
private String languageCode;
// Dates
private OffsetDateTime issueDateTime;
private LocalDate publicationDate;
private OffsetDateTime submissionDeadline;
// Buyer information
private String buyerName;
private String buyerCountryCode;
private String buyerCity;
private String buyerPostalCode;
private String buyerNutsCode;
private String buyerActivityType;
private String buyerLegalType;
// Project information
private String projectTitle;
private String projectDescription;
private String internalReference;
private ContractNature contractNature;
private ProcedureType procedureType;
// Classification codes
private List<String> cpvCodes;
private List<String> nutsCodes;
// Financial
private BigDecimal estimatedValue;
private String estimatedValueCurrency;
// Lots
private Integer totalLots;
private Integer maxLotsAwarded;
private Integer maxLotsSubmitted;
private List<LotSummary> lots;
// Organizations
private List<OrganizationSummary> organizations;
// Legal
private String regulatoryDomain;
private Boolean euFunded;
// Vectorization
private VectorizationStatus vectorizationStatus;
private OffsetDateTime vectorizedAt;
// Metadata
private String sourceFilename;
private Long fileSizeBytes;
private OffsetDateTime createdAt;
private OffsetDateTime updatedAt;
}
/**
* Lot summary for document detail view.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class LotSummary {
private UUID id;
private String lotId;
private String internalId;
private String title;
private String description;
private List<String> cpvCodes;
private List<String> nutsCodes;
private BigDecimal estimatedValue;
private String estimatedValueCurrency;
private Double durationValue;
private String durationUnit;
private OffsetDateTime submissionDeadline;
private Boolean euFunded;
}
/**
* Organization summary for document detail view.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class OrganizationSummary {
private UUID id;
private String orgReference;
private String role;
private String name;
private String companyId;
private String countryCode;
private String city;
private String postalCode;
private String nutsCode;
private String websiteUri;
private String email;
private String phone;
}
/**
* Search request for structured + semantic search.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class SearchRequest {
// Structured filters
private String countryCode;
private List<String> countryCodes;
private NoticeType noticeType;
private ContractNature contractNature;
private ProcedureType procedureType;
private String cpvPrefix;
private List<String> cpvCodes;
private String nutsCode;
private List<String> nutsCodes;
private LocalDate publicationDateFrom;
private LocalDate publicationDateTo;
private OffsetDateTime submissionDeadlineAfter;
private Boolean euFunded;
private String buyerNameContains;
private String projectTitleContains;
// Semantic search
private String semanticQuery;
private Double similarityThreshold;
// Pagination
private Integer page;
private Integer size;
private String sortBy;
private String sortDirection;
}
/**
* Search response with pagination.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class SearchResponse {
private List<DocumentSummary> documents;
private int page;
private int size;
private long totalElements;
private int totalPages;
private boolean hasNext;
private boolean hasPrevious;
}
/**
* Statistics response.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class StatisticsResponse {
private long totalDocuments;
private long vectorizedDocuments;
private long pendingVectorization;
private long failedVectorization;
private int uniqueCountries;
private LocalDate earliestPublication;
private LocalDate latestPublication;
private long totalLots;
private List<CountryStats> countryStatistics;
private List<NoticeTypeStats> noticeTypeStatistics;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class CountryStats {
private String countryCode;
private long documentCount;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class NoticeTypeStats {
private NoticeType noticeType;
private long documentCount;
}
}