package gov.nysenate.openleg.model.spotcheck.daybreak; import gov.nysenate.openleg.model.base.Version; import gov.nysenate.openleg.model.bill.BaseBillId; import gov.nysenate.openleg.model.bill.BillAction; import gov.nysenate.openleg.model.bill.BillId; import gov.nysenate.openleg.model.spotcheck.SpotCheckRefType; import gov.nysenate.openleg.model.spotcheck.SpotCheckReferenceId; import java.time.LocalDate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * A DaybreakBill serves as a model to store extracted bill content from the DaybreakFragments. */ public class DaybreakBill { protected SpotCheckReferenceId referenceId; /** Date of the report that created this instance. */ protected LocalDate reportDate; /** Below are a subset of fields similarly found in {@link gov.nysenate.openleg.model.bill.Bill} */ protected BaseBillId baseBillId; protected Version activeVersion; protected String title; protected String sponsor; protected List<String> cosponsors; protected List<String> multiSponsors; protected String lawCodeAndSummary; protected String lawSection; protected List<BillAction> actions; /** Mapping of amendments to their version id. */ protected Map<Version, DaybreakBillAmendment> amendments; /** --- Constructors --- */ public DaybreakBill() { cosponsors = new ArrayList<>(); multiSponsors = new ArrayList<>(); actions = new ArrayList<>(); amendments = new HashMap<>(); } public DaybreakBill(DaybreakBillId daybreakBillId) { this(); this.baseBillId = daybreakBillId.getBaseBillId(); this.reportDate = daybreakBillId.getReportDate(); } /** --- Functional Getters/Setters --- */ public DaybreakBillId getDaybreakBillId(){ return new DaybreakBillId(baseBillId, reportDate); } public SpotCheckReferenceId getReferenceId() { return new SpotCheckReferenceId(SpotCheckRefType.LBDC_DAYBREAK, this.reportDate.atStartOfDay()); } /** * Handle edge cases in daybreak sponsor name formatting. * * Sponsor names usually match short names, however if the short name contains initials * they are formatted with initials first in the daybreak files. * * E.g. shortname = "MILLER MG" * daybreak = "G M. MILLER" */ private String adjustSponsorsWithInitials(String sponsor) { if (sponsor.equals("G M. MILLER")) return "MILLER MG"; if (sponsor.equals("L M. MILLER")) return "MILLER ML"; return sponsor; } public BillId getActiveVersionBillId() { return new BillId(baseBillId, activeVersion); } /** --- Basic Getters/Setters --- */ public LocalDate getReportDate() { return reportDate; } public void setReportDate(LocalDate reportDate) { this.reportDate = reportDate; } public BaseBillId getBaseBillId() { return baseBillId; } public void setBaseBillId(BaseBillId baseBillId) { this.baseBillId = baseBillId; } public Version getActiveVersion() { return activeVersion; } public void setActiveVersion(Version activeVersion) { this.activeVersion = activeVersion; } public String getSponsor() { return sponsor; } public void setSponsor(String sponsor) { this.sponsor = adjustSponsorsWithInitials(sponsor); } public List<String> getCosponsors() { return cosponsors; } public void setCosponsors(List<String> cosponsors) { this.cosponsors = cosponsors.stream().map(this::adjustSponsorsWithInitials).collect(Collectors.toList()); } public List<String> getMultiSponsors() { return multiSponsors; } public void setMultiSponsors(List<String> multiSponsors) { this.multiSponsors = multiSponsors.stream().map(this::adjustSponsorsWithInitials).collect(Collectors.toList()); } public String getLawCodeAndSummary() { return lawCodeAndSummary; } public void setLawCodeAndSummary(String lawCodeAndSummary) { this.lawCodeAndSummary = lawCodeAndSummary; } public String getLawSection() { return lawSection; } public void setLawSection(String lawSection) { this.lawSection = lawSection; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public List<BillAction> getActions() { return actions; } public void setActions(List<BillAction> actions) { this.actions = actions; } public Map<Version, DaybreakBillAmendment> getAmendments() { return amendments; } public void setAmendments(Map<Version, DaybreakBillAmendment> amendments) { this.amendments = amendments; } }