package com.lincfusion.udyamlinc.manualentry; import jakarta.persistence.*; import lombok.*; import java.time.LocalDateTime; /** * One upload. The audit anchor for every manually-sourced number in the system: * a supervisor asking "where did Bhopal's March milk rate come from" gets a * filename, a person and a timestamp, not a shrug. * *
A batch is staged as {@code PREVIEW} and writes nothing. Only * {@code COMMITTED} has touched {@code market_signal}. Uploading four hundred * rows and discovering the district column was misspelled afterwards is not a * recoverable situation, so nothing lands until someone has seen what will. */ @Entity @Table(name = "manual_entry_batch", indexes = { @Index(name = "ix_manual_batch_status", columnList = "status"), @Index(name = "ix_manual_batch_uploaded", columnList = "uploadedAt"), }) @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Builder public class ManualEntryBatch { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** MARKET_SIGNAL | LOAN_RECORD — which template was uploaded. */ @Column(nullable = false, length = 32) private String entryType; @Column(length = 260) private String filename; /** * {@code UPLOAD}, or the connector code the rows arrived through. * *
Kept on the batch rather than inferred from the filename, because once a * CBS connector runs nightly, "who put this number here" stops being answerable * by "someone uploaded a file" — and that question is the reason this table * exists. */ @Column(length = 40) private String source; /** The username from the JWT. Never a display name — this is an audit field. */ @Column(nullable = false, length = 64) private String uploadedBy; @Column(nullable = false) private LocalDateTime uploadedAt; /** PREVIEW | COMMITTED | DISCARDED. */ @Column(nullable = false, length = 16) private String status; private LocalDateTime committedAt; @Column(length = 64) private String committedBy; private Integer rowsParsed; private Integer rowsAccepted; private Integer rowsRejected; /** How many accepted rows would replace a value that already exists. */ private Integer rowsOverwriting; @Column(length = 500) private String note; @PrePersist void onCreate() { if (uploadedAt == null) uploadedAt = LocalDateTime.now(); if (status == null) status = "PREVIEW"; if (source == null) source = "UPLOAD"; } }