package sample.model.master; import java.time.*; import java.util.*; import javax.persistence.*; import javax.validation.Valid; import lombok.*; import sample.context.Dto; import sample.context.orm.*; import sample.model.constraints.*; import sample.model.constraints.Year; import sample.util.DateUtils; /** * 休日マスタを表現します。 */ @Entity @Data @EqualsAndHashCode(callSuper = false) public class Holiday extends OrmActiveMetaRecord<Holiday> { private static final long serialVersionUID = 1l; public static final String CategoryDefault = "default"; /** ID */ @Id @GeneratedValue private Long id; /** 休日区分 */ @Category private String category; /** 休日 */ @ISODate private LocalDate day; /** 休日名称 */ @Name(max = 40) private String name; @ISODateTime private LocalDateTime createDate; @IdStr private String createId; @ISODateTime private LocalDateTime updateDate; @IdStr private String updateId; /** 休日マスタを取得します。 */ public static Optional<Holiday> get(final OrmRepository rep, LocalDate day) { return get(rep, day, CategoryDefault); } public static Optional<Holiday> get(final OrmRepository rep, LocalDate day, String category) { return rep.tmpl().get("from Holiday h where h.category=?1 and h.day=?2", category, day); } /** 休日マスタを取得します。(例外付) */ public static Holiday load(final OrmRepository rep, LocalDate day) { return load(rep, day, CategoryDefault); } public static Holiday load(final OrmRepository rep, LocalDate day, String category) { return rep.tmpl().load("from Holiday h where h.category=?1 and h.day=?2", category, day); } /** 休日情報を検索します。 */ public static List<Holiday> find(final OrmRepository rep, final int year) { return find(rep, year, CategoryDefault); } public static List<Holiday> find(final OrmRepository rep, final int year, final String category) { return rep.tmpl().find("from Holiday h where h.category=?1 and h.day between ?2 and ?3 order by h.day", category, LocalDate.ofYearDay(year, 1), DateUtils.dayTo(year)); } /** 休日マスタを登録します。 */ public static void register(final OrmRepository rep, final RegHoliday p) { rep.tmpl().execute("delete from Holiday h where h.category=?1 and h.day between ?2 and ?3", p.category, LocalDate.ofYearDay(p.year, 1), DateUtils.dayTo(p.year)); p.list.forEach(v -> v.create(p).save(rep)); } /** 登録パラメタ */ @Data @NoArgsConstructor @AllArgsConstructor public static class RegHoliday implements Dto { private static final long serialVersionUID = 1l; @CategoryEmpty private String category = CategoryDefault; @Year private int year; @Valid private List<RegHolidayItem> list; public RegHoliday(int year, final List<RegHolidayItem> list) { this.year = year; this.list = list; } } /** 登録パラメタ(要素) */ @Data @NoArgsConstructor @AllArgsConstructor public static class RegHolidayItem implements Dto { private static final long serialVersionUID = 1l; @ISODate private LocalDate day; @Name(max = 40) private String name; public Holiday create(RegHoliday p) { Holiday holiday = new Holiday(); holiday.setCategory(p.category); holiday.setDay(day); holiday.setName(name); return holiday; } } }