diff --git a/src/main/java/com/fowoco/server/worker/api/WorkerController.java b/src/main/java/com/fowoco/server/worker/api/WorkerController.java index 905fbd50..e1aa9e6d 100644 --- a/src/main/java/com/fowoco/server/worker/api/WorkerController.java +++ b/src/main/java/com/fowoco/server/worker/api/WorkerController.java @@ -78,14 +78,20 @@ public WorkerController( public WorkerPageResponse list( @Parameter(description = "근무 상태 필터") @RequestParam(required = false) WorkerStatus status, @Parameter(description = "선호 언어 필터") @RequestParam(required = false) String language, - @Parameter(description = "체류 만료일 이전 필터") @RequestParam(required = false) LocalDate expiryBefore, + @Parameter(description = "체류자격 만료일 이전 필터") @RequestParam(required = false) LocalDate stayExpiryBefore, + @Parameter(description = "근로계약 종료일 이전 필터") @RequestParam(required = false) LocalDate contractEndBefore, + @Parameter(description = "고용허가 기준 종료일 이전 필터") @RequestParam(required = false) LocalDate employmentPermitEndBefore, + @Parameter(description = "취업활동기간 종료일 이전 필터") @RequestParam(required = false) LocalDate employmentActivityEndBefore, @Parameter(description = "페이지 번호 (0부터 시작)") @RequestParam(defaultValue = "0") @Min(0) int page, @Parameter(description = "페이지당 항목 수 (1~100)") @RequestParam(defaultValue = "20") @Min(1) @Max(100) int size ) { ActorContext actor = actorContextProvider.requireCurrentActor(); - WorkerSearchQuery query = new WorkerSearchQuery(status, language, expiryBefore, page, size); + WorkerSearchQuery query = new WorkerSearchQuery( + status, language, stayExpiryBefore, contractEndBefore, + employmentPermitEndBefore, employmentActivityEndBefore, page, size + ); WorkerPageResult result = workerService.findPage(actor, query); List items = result.items().stream().map(WorkerResponse::from).toList(); return new WorkerPageResponse(items, result.page(), result.size(), result.totalElements()); @@ -118,9 +124,12 @@ public ResponseEntity register(@Valid @RequestBody WorkerCreateR request.getDisplayName(), request.getNationalityCode(), request.getPreferredLanguage(), + request.getVisaType(), request.getStayExpiryDate(), request.getContractStartDate(), - request.getContractEndDate() + request.getContractEndDate(), + request.getEmploymentPermitEndDate(), + request.getEmploymentActivityEndDate() ); Worker worker = workerService.register(command, actor); return ResponseEntity.status(HttpStatus.CREATED).body(WorkerResponse.from(worker)); @@ -201,9 +210,12 @@ public WorkerResponse patch( request.getNationalityCode(), request.getPreferredLanguage(), request.getWorkStatus(), + request.getVisaType(), request.getStayExpiryDate(), request.getContractStartDate(), request.getContractEndDate(), + request.getEmploymentPermitEndDate(), + request.getEmploymentActivityEndDate(), request.getExpectedVersion() ); Worker worker = workerService.patch(command, actor); diff --git a/src/main/java/com/fowoco/server/worker/api/WorkerCreateRequest.java b/src/main/java/com/fowoco/server/worker/api/WorkerCreateRequest.java index a84cda2b..be93c828 100644 --- a/src/main/java/com/fowoco/server/worker/api/WorkerCreateRequest.java +++ b/src/main/java/com/fowoco/server/worker/api/WorkerCreateRequest.java @@ -43,9 +43,18 @@ public final class WorkerCreateRequest { @Size(max = 20, message = "선호 언어는 20자 이하여야 합니다.") private final String preferredLanguage; + @Schema( + name = "visa_type", + description = "체류자격 종류", + example = "E-9", + maxLength = 20 + ) + @Size(max = 20, message = "체류자격 종류는 20자 이하여야 합니다.") + private final String visaType; + @Schema( name = "stay_expiry_date", - description = "체류 만료일", + description = "체류자격이 만료되는 날", example = "2027-03-01", format = "date" ) @@ -61,27 +70,49 @@ public final class WorkerCreateRequest { @Schema( name = "contract_end_date", - description = "계약 종료일. contract_start_date보다 빠를 수 없습니다.", + description = "현재 근로계약이 끝나는 날. contract_start_date보다 빠를 수 없습니다.", example = "2027-12-31", format = "date" ) private final LocalDate contractEndDate; + @Schema( + name = "employment_permit_end_date", + description = "사업장의 고용허가 관련 기준 종료일", + example = "2028-03-01", + format = "date" + ) + private final LocalDate employmentPermitEndDate; + + @Schema( + name = "employment_activity_end_date", + description = "E-9 근로자가 취업활동할 수 있는 기간의 종료일", + example = "2028-03-01", + format = "date" + ) + private final LocalDate employmentActivityEndDate; + @JsonCreator public WorkerCreateRequest( @JsonProperty("display_name") String displayName, @JsonProperty("nationality_code") String nationalityCode, @JsonProperty("preferred_language") String preferredLanguage, + @JsonProperty("visa_type") String visaType, @JsonProperty("stay_expiry_date") LocalDate stayExpiryDate, @JsonProperty("contract_start_date") LocalDate contractStartDate, - @JsonProperty("contract_end_date") LocalDate contractEndDate + @JsonProperty("contract_end_date") LocalDate contractEndDate, + @JsonProperty("employment_permit_end_date") LocalDate employmentPermitEndDate, + @JsonProperty("employment_activity_end_date") LocalDate employmentActivityEndDate ) { this.displayName = displayName; this.nationalityCode = nationalityCode; this.preferredLanguage = preferredLanguage; + this.visaType = visaType; this.stayExpiryDate = stayExpiryDate; this.contractStartDate = contractStartDate; this.contractEndDate = contractEndDate; + this.employmentPermitEndDate = employmentPermitEndDate; + this.employmentActivityEndDate = employmentActivityEndDate; } @AssertTrue(message = "contract_end_date는 contract_start_date보다 빠를 수 없습니다.") @@ -105,6 +136,10 @@ public String getPreferredLanguage() { return preferredLanguage; } + public String getVisaType() { + return visaType; + } + public LocalDate getStayExpiryDate() { return stayExpiryDate; } @@ -116,4 +151,12 @@ public LocalDate getContractStartDate() { public LocalDate getContractEndDate() { return contractEndDate; } + + public LocalDate getEmploymentPermitEndDate() { + return employmentPermitEndDate; + } + + public LocalDate getEmploymentActivityEndDate() { + return employmentActivityEndDate; + } } diff --git a/src/main/java/com/fowoco/server/worker/api/WorkerPatchRequest.java b/src/main/java/com/fowoco/server/worker/api/WorkerPatchRequest.java index 25bf1a8e..7efe554b 100644 --- a/src/main/java/com/fowoco/server/worker/api/WorkerPatchRequest.java +++ b/src/main/java/com/fowoco/server/worker/api/WorkerPatchRequest.java @@ -48,9 +48,18 @@ public final class WorkerPatchRequest { ) private final WorkerStatus workStatus; + @Schema( + name = "visa_type", + description = "체류자격 종류. 생략 시 변경하지 않습니다.", + example = "E-9", + maxLength = 20 + ) + @Size(max = 20, message = "체류자격 종류는 20자 이하여야 합니다.") + private final String visaType; + @Schema( name = "stay_expiry_date", - description = "체류 만료일. 생략 시 변경하지 않습니다.", + description = "체류자격이 만료되는 날. 생략 시 변경하지 않습니다.", example = "2027-03-01", format = "date" ) @@ -66,12 +75,28 @@ public final class WorkerPatchRequest { @Schema( name = "contract_end_date", - description = "계약 종료일. 생략 시 변경하지 않습니다.", + description = "현재 근로계약이 끝나는 날. 생략 시 변경하지 않습니다.", example = "2027-12-31", format = "date" ) private final LocalDate contractEndDate; + @Schema( + name = "employment_permit_end_date", + description = "사업장의 고용허가 관련 기준 종료일. 생략 시 변경하지 않습니다.", + example = "2028-03-01", + format = "date" + ) + private final LocalDate employmentPermitEndDate; + + @Schema( + name = "employment_activity_end_date", + description = "E-9 근로자가 취업활동할 수 있는 기간의 종료일. 생략 시 변경하지 않습니다.", + example = "2028-03-01", + format = "date" + ) + private final LocalDate employmentActivityEndDate; + @Schema( name = "expected_version", description = "낙관적 잠금 버전. 마지막으로 조회한 WorkerResponse.version을 그대로 보내야 합니다.", @@ -88,18 +113,24 @@ public WorkerPatchRequest( @JsonProperty("nationality_code") String nationalityCode, @JsonProperty("preferred_language") String preferredLanguage, @JsonProperty("work_status") WorkerStatus workStatus, + @JsonProperty("visa_type") String visaType, @JsonProperty("stay_expiry_date") LocalDate stayExpiryDate, @JsonProperty("contract_start_date") LocalDate contractStartDate, @JsonProperty("contract_end_date") LocalDate contractEndDate, + @JsonProperty("employment_permit_end_date") LocalDate employmentPermitEndDate, + @JsonProperty("employment_activity_end_date") LocalDate employmentActivityEndDate, @JsonProperty("expected_version") Long expectedVersion ) { this.displayName = displayName; this.nationalityCode = nationalityCode; this.preferredLanguage = preferredLanguage; this.workStatus = workStatus; + this.visaType = visaType; this.stayExpiryDate = stayExpiryDate; this.contractStartDate = contractStartDate; this.contractEndDate = contractEndDate; + this.employmentPermitEndDate = employmentPermitEndDate; + this.employmentActivityEndDate = employmentActivityEndDate; this.expectedVersion = expectedVersion; } @@ -134,6 +165,10 @@ public WorkerStatus getWorkStatus() { return workStatus; } + public String getVisaType() { + return visaType; + } + public LocalDate getStayExpiryDate() { return stayExpiryDate; } @@ -146,6 +181,14 @@ public LocalDate getContractEndDate() { return contractEndDate; } + public LocalDate getEmploymentPermitEndDate() { + return employmentPermitEndDate; + } + + public LocalDate getEmploymentActivityEndDate() { + return employmentActivityEndDate; + } + public Long getExpectedVersion() { return expectedVersion; } diff --git a/src/main/java/com/fowoco/server/worker/api/WorkerResponse.java b/src/main/java/com/fowoco/server/worker/api/WorkerResponse.java index 3a529f7f..725facbb 100644 --- a/src/main/java/com/fowoco/server/worker/api/WorkerResponse.java +++ b/src/main/java/com/fowoco/server/worker/api/WorkerResponse.java @@ -22,6 +22,7 @@ public final class WorkerResponse { requiredMode = Schema.RequiredMode.REQUIRED ) private final UUID workerId; + @JsonProperty("company_id") @Schema( name = "company_id", @@ -30,6 +31,7 @@ public final class WorkerResponse { requiredMode = Schema.RequiredMode.REQUIRED ) private final UUID companyId; + @JsonProperty("display_name") @Schema( name = "display_name", @@ -38,6 +40,7 @@ public final class WorkerResponse { requiredMode = Schema.RequiredMode.REQUIRED ) private final String displayName; + @JsonProperty("nationality_code") @Schema( name = "nationality_code", @@ -45,6 +48,7 @@ public final class WorkerResponse { example = "VN" ) private final String nationalityCode; + @JsonProperty("preferred_language") @Schema( name = "preferred_language", @@ -52,6 +56,7 @@ public final class WorkerResponse { example = "vi" ) private final String preferredLanguage; + @JsonProperty("work_status") @Schema( name = "work_status", @@ -59,13 +64,23 @@ public final class WorkerResponse { requiredMode = Schema.RequiredMode.REQUIRED ) private final WorkerStatus workStatus; + + @JsonProperty("visa_type") + @Schema( + name = "visa_type", + description = "체류자격 종류", + example = "E-9" + ) + private final String visaType; + @JsonProperty("stay_expiry_date") @Schema( name = "stay_expiry_date", - description = "체류 만료일", + description = "체류자격이 만료되는 날", format = "date" ) private final LocalDate stayExpiryDate; + @JsonProperty("contract_start_date") @Schema( name = "contract_start_date", @@ -73,13 +88,31 @@ public final class WorkerResponse { format = "date" ) private final LocalDate contractStartDate; + @JsonProperty("contract_end_date") @Schema( name = "contract_end_date", - description = "계약 종료일", + description = "현재 근로계약이 끝나는 날", format = "date" ) private final LocalDate contractEndDate; + + @JsonProperty("employment_permit_end_date") + @Schema( + name = "employment_permit_end_date", + description = "사업장의 고용허가 관련 기준 종료일", + format = "date" + ) + private final LocalDate employmentPermitEndDate; + + @JsonProperty("employment_activity_end_date") + @Schema( + name = "employment_activity_end_date", + description = "E-9 근로자가 취업활동할 수 있는 기간의 종료일", + format = "date" + ) + private final LocalDate employmentActivityEndDate; + @JsonProperty("created_at") @Schema( name = "created_at", @@ -88,6 +121,7 @@ public final class WorkerResponse { requiredMode = Schema.RequiredMode.REQUIRED ) private final Instant createdAt; + @JsonProperty("updated_at") @Schema( name = "updated_at", @@ -96,6 +130,7 @@ public final class WorkerResponse { requiredMode = Schema.RequiredMode.REQUIRED ) private final Instant updatedAt; + @JsonProperty("version") @Schema( description = "낙관적 잠금 버전. PATCH 요청 시 expected_version으로 그대로 보내야 합니다.", @@ -112,9 +147,12 @@ private WorkerResponse( String nationalityCode, String preferredLanguage, WorkerStatus workStatus, + String visaType, LocalDate stayExpiryDate, LocalDate contractStartDate, LocalDate contractEndDate, + LocalDate employmentPermitEndDate, + LocalDate employmentActivityEndDate, Instant createdAt, Instant updatedAt, long version @@ -125,9 +163,12 @@ private WorkerResponse( this.nationalityCode = nationalityCode; this.preferredLanguage = preferredLanguage; this.workStatus = workStatus; + this.visaType = visaType; this.stayExpiryDate = stayExpiryDate; this.contractStartDate = contractStartDate; this.contractEndDate = contractEndDate; + this.employmentPermitEndDate = employmentPermitEndDate; + this.employmentActivityEndDate = employmentActivityEndDate; this.createdAt = createdAt; this.updatedAt = updatedAt; this.version = version; @@ -141,9 +182,12 @@ public static WorkerResponse from(Worker worker) { worker.nationalityCode(), worker.preferredLanguage(), worker.workStatus(), + worker.visaType(), worker.stayExpiryDate(), worker.contractStartDate(), worker.contractEndDate(), + worker.employmentPermitEndDate(), + worker.employmentActivityEndDate(), worker.createdAt(), worker.updatedAt(), worker.version() @@ -174,6 +218,10 @@ public WorkerStatus getWorkStatus() { return workStatus; } + public String getVisaType() { + return visaType; + } + public LocalDate getStayExpiryDate() { return stayExpiryDate; } @@ -186,6 +234,14 @@ public LocalDate getContractEndDate() { return contractEndDate; } + public LocalDate getEmploymentPermitEndDate() { + return employmentPermitEndDate; + } + + public LocalDate getEmploymentActivityEndDate() { + return employmentActivityEndDate; + } + public Instant getCreatedAt() { return createdAt; } diff --git a/src/main/java/com/fowoco/server/worker/application/WorkerCreateCommand.java b/src/main/java/com/fowoco/server/worker/application/WorkerCreateCommand.java index 9caa5b08..204cd4d2 100644 --- a/src/main/java/com/fowoco/server/worker/application/WorkerCreateCommand.java +++ b/src/main/java/com/fowoco/server/worker/application/WorkerCreateCommand.java @@ -7,24 +7,33 @@ public final class WorkerCreateCommand { private final String displayName; private final String nationalityCode; private final String preferredLanguage; + private final String visaType; private final LocalDate stayExpiryDate; private final LocalDate contractStartDate; private final LocalDate contractEndDate; + private final LocalDate employmentPermitEndDate; + private final LocalDate employmentActivityEndDate; public WorkerCreateCommand( String displayName, String nationalityCode, String preferredLanguage, + String visaType, LocalDate stayExpiryDate, LocalDate contractStartDate, - LocalDate contractEndDate + LocalDate contractEndDate, + LocalDate employmentPermitEndDate, + LocalDate employmentActivityEndDate ) { this.displayName = displayName; this.nationalityCode = nationalityCode; this.preferredLanguage = preferredLanguage; + this.visaType = visaType; this.stayExpiryDate = stayExpiryDate; this.contractStartDate = contractStartDate; this.contractEndDate = contractEndDate; + this.employmentPermitEndDate = employmentPermitEndDate; + this.employmentActivityEndDate = employmentActivityEndDate; } public String displayName() { @@ -39,6 +48,10 @@ public String preferredLanguage() { return preferredLanguage; } + public String visaType() { + return visaType; + } + public LocalDate stayExpiryDate() { return stayExpiryDate; } @@ -50,4 +63,12 @@ public LocalDate contractStartDate() { public LocalDate contractEndDate() { return contractEndDate; } + + public LocalDate employmentPermitEndDate() { + return employmentPermitEndDate; + } + + public LocalDate employmentActivityEndDate() { + return employmentActivityEndDate; + } } diff --git a/src/main/java/com/fowoco/server/worker/application/WorkerPatchCommand.java b/src/main/java/com/fowoco/server/worker/application/WorkerPatchCommand.java index abd7a34c..9894181d 100644 --- a/src/main/java/com/fowoco/server/worker/application/WorkerPatchCommand.java +++ b/src/main/java/com/fowoco/server/worker/application/WorkerPatchCommand.java @@ -11,9 +11,12 @@ public final class WorkerPatchCommand { private final String nationalityCode; private final String preferredLanguage; private final WorkerStatus workStatus; + private final String visaType; private final LocalDate stayExpiryDate; private final LocalDate contractStartDate; private final LocalDate contractEndDate; + private final LocalDate employmentPermitEndDate; + private final LocalDate employmentActivityEndDate; private final long expectedVersion; public WorkerPatchCommand( @@ -22,9 +25,12 @@ public WorkerPatchCommand( String nationalityCode, String preferredLanguage, WorkerStatus workStatus, + String visaType, LocalDate stayExpiryDate, LocalDate contractStartDate, LocalDate contractEndDate, + LocalDate employmentPermitEndDate, + LocalDate employmentActivityEndDate, long expectedVersion ) { this.workerId = workerId; @@ -32,9 +38,12 @@ public WorkerPatchCommand( this.nationalityCode = nationalityCode; this.preferredLanguage = preferredLanguage; this.workStatus = workStatus; + this.visaType = visaType; this.stayExpiryDate = stayExpiryDate; this.contractStartDate = contractStartDate; this.contractEndDate = contractEndDate; + this.employmentPermitEndDate = employmentPermitEndDate; + this.employmentActivityEndDate = employmentActivityEndDate; this.expectedVersion = expectedVersion; } @@ -58,6 +67,10 @@ public WorkerStatus workStatus() { return workStatus; } + public String visaType() { + return visaType; + } + public LocalDate stayExpiryDate() { return stayExpiryDate; } @@ -70,6 +83,14 @@ public LocalDate contractEndDate() { return contractEndDate; } + public LocalDate employmentPermitEndDate() { + return employmentPermitEndDate; + } + + public LocalDate employmentActivityEndDate() { + return employmentActivityEndDate; + } + public long expectedVersion() { return expectedVersion; } diff --git a/src/main/java/com/fowoco/server/worker/application/WorkerSearchQuery.java b/src/main/java/com/fowoco/server/worker/application/WorkerSearchQuery.java index e78ac4f2..81f57ad6 100644 --- a/src/main/java/com/fowoco/server/worker/application/WorkerSearchQuery.java +++ b/src/main/java/com/fowoco/server/worker/application/WorkerSearchQuery.java @@ -10,20 +10,29 @@ public final class WorkerSearchQuery { private final WorkerStatus status; private final String language; - private final LocalDate expiryBefore; + private final LocalDate stayExpiryBefore; + private final LocalDate contractEndBefore; + private final LocalDate employmentPermitEndBefore; + private final LocalDate employmentActivityEndBefore; private final int page; private final int size; public WorkerSearchQuery( WorkerStatus status, String language, - LocalDate expiryBefore, + LocalDate stayExpiryBefore, + LocalDate contractEndBefore, + LocalDate employmentPermitEndBefore, + LocalDate employmentActivityEndBefore, Integer page, Integer size ) { this.status = status; this.language = language; - this.expiryBefore = expiryBefore; + this.stayExpiryBefore = stayExpiryBefore; + this.contractEndBefore = contractEndBefore; + this.employmentPermitEndBefore = employmentPermitEndBefore; + this.employmentActivityEndBefore = employmentActivityEndBefore; this.page = page == null ? 0 : page; this.size = size == null ? 20 : size; if (this.page < 0) { @@ -42,8 +51,20 @@ public String language() { return language; } - public LocalDate expiryBefore() { - return expiryBefore; + public LocalDate stayExpiryBefore() { + return stayExpiryBefore; + } + + public LocalDate contractEndBefore() { + return contractEndBefore; + } + + public LocalDate employmentPermitEndBefore() { + return employmentPermitEndBefore; + } + + public LocalDate employmentActivityEndBefore() { + return employmentActivityEndBefore; } public int page() { diff --git a/src/main/java/com/fowoco/server/worker/application/WorkerService.java b/src/main/java/com/fowoco/server/worker/application/WorkerService.java index 307721e3..38f95192 100644 --- a/src/main/java/com/fowoco/server/worker/application/WorkerService.java +++ b/src/main/java/com/fowoco/server/worker/application/WorkerService.java @@ -43,9 +43,12 @@ public Worker register(WorkerCreateCommand command, ActorContext actor) { command.displayName(), command.nationalityCode(), command.preferredLanguage(), + command.visaType(), command.stayExpiryDate(), command.contractStartDate(), command.contractEndDate(), + command.employmentPermitEndDate(), + command.employmentActivityEndDate(), DatabaseTimestamp.now(clock) ); workerRepository.insert(worker); @@ -82,9 +85,12 @@ public Worker patch(WorkerPatchCommand command, ActorContext actor) { orElseKeep(command.nationalityCode(), existing.nationalityCode()), orElseKeep(command.preferredLanguage(), existing.preferredLanguage()), orElseKeep(command.workStatus(), existing.workStatus()), + orElseKeep(command.visaType(), existing.visaType()), orElseKeep(command.stayExpiryDate(), existing.stayExpiryDate()), orElseKeep(command.contractStartDate(), existing.contractStartDate()), orElseKeep(command.contractEndDate(), existing.contractEndDate()), + orElseKeep(command.employmentPermitEndDate(), existing.employmentPermitEndDate()), + orElseKeep(command.employmentActivityEndDate(), existing.employmentActivityEndDate()), existing.createdAt(), DatabaseTimestamp.nowNotBefore(clock, existing.createdAt()), existing.version() diff --git a/src/main/java/com/fowoco/server/worker/domain/Worker.java b/src/main/java/com/fowoco/server/worker/domain/Worker.java index 5326ce6a..cbd65046 100644 --- a/src/main/java/com/fowoco/server/worker/domain/Worker.java +++ b/src/main/java/com/fowoco/server/worker/domain/Worker.java @@ -15,9 +15,12 @@ public final class Worker { private final String nationalityCode; private final String preferredLanguage; private final WorkerStatus workStatus; + private final String visaType; private final LocalDate stayExpiryDate; private final LocalDate contractStartDate; private final LocalDate contractEndDate; + private final LocalDate employmentPermitEndDate; + private final LocalDate employmentActivityEndDate; private final Instant createdAt; private final Instant updatedAt; private final long version; @@ -29,9 +32,12 @@ public Worker( String nationalityCode, String preferredLanguage, WorkerStatus workStatus, + String visaType, LocalDate stayExpiryDate, LocalDate contractStartDate, LocalDate contractEndDate, + LocalDate employmentPermitEndDate, + LocalDate employmentActivityEndDate, Instant createdAt, Instant updatedAt, long version @@ -42,9 +48,12 @@ public Worker( this.nationalityCode = nationalityCode; this.preferredLanguage = preferredLanguage; this.workStatus = Objects.requireNonNull(workStatus, "workStatus must not be null"); + this.visaType = visaType; this.stayExpiryDate = stayExpiryDate; this.contractStartDate = contractStartDate; this.contractEndDate = contractEndDate; + this.employmentPermitEndDate = employmentPermitEndDate; + this.employmentActivityEndDate = employmentActivityEndDate; this.createdAt = Objects.requireNonNull(createdAt, "createdAt must not be null"); this.updatedAt = Objects.requireNonNull(updatedAt, "updatedAt must not be null"); if (updatedAt.isBefore(createdAt)) { @@ -66,9 +75,12 @@ public static Worker create( String displayName, String nationalityCode, String preferredLanguage, + String visaType, LocalDate stayExpiryDate, LocalDate contractStartDate, LocalDate contractEndDate, + LocalDate employmentPermitEndDate, + LocalDate employmentActivityEndDate, Instant now ) { Objects.requireNonNull(now, "now must not be null"); @@ -79,9 +91,12 @@ public static Worker create( nationalityCode, preferredLanguage, WorkerStatus.ACTIVE, + visaType, stayExpiryDate, contractStartDate, contractEndDate, + employmentPermitEndDate, + employmentActivityEndDate, now, now, 0L @@ -116,6 +131,10 @@ public WorkerStatus workStatus() { return workStatus; } + public String visaType() { + return visaType; + } + public LocalDate stayExpiryDate() { return stayExpiryDate; } @@ -128,6 +147,14 @@ public LocalDate contractEndDate() { return contractEndDate; } + public LocalDate employmentPermitEndDate() { + return employmentPermitEndDate; + } + + public LocalDate employmentActivityEndDate() { + return employmentActivityEndDate; + } + public Instant createdAt() { return createdAt; } diff --git a/src/main/java/com/fowoco/server/worker/infrastructure/persistence/JpaWorkerRepository.java b/src/main/java/com/fowoco/server/worker/infrastructure/persistence/JpaWorkerRepository.java index 624cffa8..34fb20d3 100644 --- a/src/main/java/com/fowoco/server/worker/infrastructure/persistence/JpaWorkerRepository.java +++ b/src/main/java/com/fowoco/server/worker/infrastructure/persistence/JpaWorkerRepository.java @@ -121,8 +121,17 @@ private String buildWhereClause(WorkerSearchQuery query) { if (query.language() != null) { where.append(" and worker.preferredLanguage = :language"); } - if (query.expiryBefore() != null) { - where.append(" and worker.stayExpiryDate < :expiryBefore"); + if (query.stayExpiryBefore() != null) { + where.append(" and worker.stayExpiryDate < :stayExpiryBefore"); + } + if (query.contractEndBefore() != null) { + where.append(" and worker.contractEndDate < :contractEndBefore"); + } + if (query.employmentPermitEndBefore() != null) { + where.append(" and worker.employmentPermitEndDate < :employmentPermitEndBefore"); + } + if (query.employmentActivityEndBefore() != null) { + where.append(" and worker.employmentActivityEndDate < :employmentActivityEndBefore"); } return where.toString(); } @@ -135,8 +144,17 @@ private void bindParameters(Query jpaQuery, UUID companyId, WorkerSearchQuery qu if (query.language() != null) { jpaQuery.setParameter("language", query.language()); } - if (query.expiryBefore() != null) { - jpaQuery.setParameter("expiryBefore", query.expiryBefore()); + if (query.stayExpiryBefore() != null) { + jpaQuery.setParameter("stayExpiryBefore", query.stayExpiryBefore()); + } + if (query.contractEndBefore() != null) { + jpaQuery.setParameter("contractEndBefore", query.contractEndBefore()); + } + if (query.employmentPermitEndBefore() != null) { + jpaQuery.setParameter("employmentPermitEndBefore", query.employmentPermitEndBefore()); + } + if (query.employmentActivityEndBefore() != null) { + jpaQuery.setParameter("employmentActivityEndBefore", query.employmentActivityEndBefore()); } } } diff --git a/src/main/java/com/fowoco/server/worker/infrastructure/persistence/WorkerJpaEntity.java b/src/main/java/com/fowoco/server/worker/infrastructure/persistence/WorkerJpaEntity.java index 46bc3aae..cb6095b4 100644 --- a/src/main/java/com/fowoco/server/worker/infrastructure/persistence/WorkerJpaEntity.java +++ b/src/main/java/com/fowoco/server/worker/infrastructure/persistence/WorkerJpaEntity.java @@ -38,6 +38,9 @@ public class WorkerJpaEntity { @Column(name = "work_status", nullable = false, length = 20) private WorkerStatus workStatus; + @Column(name = "visa_type", length = 20) + private String visaType; + @Column(name = "stay_expiry_date") private LocalDate stayExpiryDate; @@ -47,6 +50,12 @@ public class WorkerJpaEntity { @Column(name = "contract_end_date") private LocalDate contractEndDate; + @Column(name = "employment_permit_end_date") + private LocalDate employmentPermitEndDate; + + @Column(name = "employment_activity_end_date") + private LocalDate employmentActivityEndDate; + @Column(name = "created_at", nullable = false, updatable = false) private Instant createdAt; @@ -67,9 +76,12 @@ private WorkerJpaEntity( String nationalityCode, String preferredLanguage, WorkerStatus workStatus, + String visaType, LocalDate stayExpiryDate, LocalDate contractStartDate, LocalDate contractEndDate, + LocalDate employmentPermitEndDate, + LocalDate employmentActivityEndDate, Instant createdAt, Instant updatedAt, long version @@ -80,9 +92,12 @@ private WorkerJpaEntity( this.nationalityCode = nationalityCode; this.preferredLanguage = preferredLanguage; this.workStatus = workStatus; + this.visaType = visaType; this.stayExpiryDate = stayExpiryDate; this.contractStartDate = contractStartDate; this.contractEndDate = contractEndDate; + this.employmentPermitEndDate = employmentPermitEndDate; + this.employmentActivityEndDate = employmentActivityEndDate; this.createdAt = createdAt; this.updatedAt = updatedAt; this.version = version; @@ -97,9 +112,12 @@ public static WorkerJpaEntity fromDomain(Worker worker) { worker.nationalityCode(), worker.preferredLanguage(), worker.workStatus(), + worker.visaType(), worker.stayExpiryDate(), worker.contractStartDate(), worker.contractEndDate(), + worker.employmentPermitEndDate(), + worker.employmentActivityEndDate(), worker.createdAt(), worker.updatedAt(), worker.version() @@ -114,9 +132,12 @@ public Worker toDomain() { nationalityCode, preferredLanguage, workStatus, + visaType, stayExpiryDate, contractStartDate, contractEndDate, + employmentPermitEndDate, + employmentActivityEndDate, createdAt, updatedAt, version @@ -137,9 +158,12 @@ public void applyState(Worker worker) { this.nationalityCode = worker.nationalityCode(); this.preferredLanguage = worker.preferredLanguage(); this.workStatus = worker.workStatus(); + this.visaType = worker.visaType(); this.stayExpiryDate = worker.stayExpiryDate(); this.contractStartDate = worker.contractStartDate(); this.contractEndDate = worker.contractEndDate(); + this.employmentPermitEndDate = worker.employmentPermitEndDate(); + this.employmentActivityEndDate = worker.employmentActivityEndDate(); this.updatedAt = worker.updatedAt(); } } diff --git a/src/main/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedCatalog.java b/src/main/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedCatalog.java index e98f1712..273618b9 100644 --- a/src/main/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedCatalog.java +++ b/src/main/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedCatalog.java @@ -7,42 +7,42 @@ final class DemoWorkerSeedCatalog { private static final List DEMO_WORKERS = List.of( - activeWorker("92000000-0000-0000-0000-000000000001", "리웨이", "CN", "zh-Hans", 30, 180), - activeWorker("92000000-0000-0000-0000-000000000002", "속 체아", "KH", "km", 60, 210), - activeWorker("92000000-0000-0000-0000-000000000003", "아르준 타파", "NP", "en", 90, 240), - activeWorker("92000000-0000-0000-0000-000000000004", "부디 산토소", "ID", "id", 120, 270), - activeWorker("92000000-0000-0000-0000-000000000005", "마크 레예스", "PH", "en", 180, 365), - activeWorker("92000000-0000-0000-0000-000000000006", "응웬반A", "VN", "vi", 45, 180), - activeWorker("92000000-0000-0000-0000-000000000007", "아디 수르야", "ID", "id", 365, 365), - activeWorker("92000000-0000-0000-0000-000000000008", "바트 에르덴", "MN", "mn", 21, 120), - activeWorker("92000000-0000-0000-0000-000000000009", "라니 위자야", "ID", "id", 7, 90), - activeWorker("92000000-0000-0000-0000-000000000010", "민 아웅", "MM", "en", 62, 20), - activeWorker("92000000-0000-0000-0000-000000000011", "파티마 누르", "ID", "id", 35, 150), - activeWorker("92000000-0000-0000-0000-000000000012", "트란 티 마이", "VN", "vi", 3, 45), - activeWorker("92000000-0000-0000-0000-000000000013", "쩐 꾸옥 바오", "VN", "vi", 5, 75), - onLeaveWorker("92000000-0000-0000-0000-000000000014", "아이다나 베크", "KG", "ky", 7, 100), - activeWorker("92000000-0000-0000-0000-000000000015", "찬다라 소쿤", "KH", "km", 21, 135), - activeWorker("92000000-0000-0000-0000-000000000016", "니말 페레라", "LK", "si", 35, 180), - activeWorker("92000000-0000-0000-0000-000000000017", "알리 칸", "PK", "ur", 62, 210), - activeWorker("92000000-0000-0000-0000-000000000018", "모하메드 라힘", "BD", "bn", 75, 240), - activeWorker("92000000-0000-0000-0000-000000000019", "누르 아지자", "ID", "id", 89, 270), - activeWorker("92000000-0000-0000-0000-000000000020", "아지즈 라히모프", "UZ", "uz", 91, 300), - onLeaveWorker("92000000-0000-0000-0000-000000000021", "알렉세이 이바노프", "RU", "ru", 150, 330), - activeWorker("92000000-0000-0000-0000-000000000022", "마리아 산토스", "PH", "fil", 240, 365), - activeWorker("92000000-0000-0000-0000-000000000023", "솜차이 차이야", "TH", "th", 365, 400), - activeWorker("92000000-0000-0000-0000-000000000024", "응우옌 티 란", "VN", "vi", 6, 60), - onLeaveWorker("92000000-0000-0000-0000-000000000025", "데위 사푸트리", "ID", "id", null, 240), - activeWorker("92000000-0000-0000-0000-000000000026", "조제 다 코스타", "TL", "tet", 12, 90), - activeWorker("92000000-0000-0000-0000-000000000027", "압둘 카림", "BD", "bn", 90, 180), - activeWorker("92000000-0000-0000-0000-000000000028", "비벡 타파", "NP", "en", 540, 540) + activeWorker("92000000-0000-0000-0000-000000000001", "리웨이", "CN", "zh-Hans", 30, 180, 45, 35), + activeWorker("92000000-0000-0000-0000-000000000002", "속 체아", "KH", "km", 60, 210, 75, 60), + activeWorker("92000000-0000-0000-0000-000000000003", "아르준 타파", "NP", "en", 90, 240, 105, 95), + activeWorker("92000000-0000-0000-0000-000000000004", "부디 산토소", "ID", "id", 120, 270, 135, 120), + activeWorker("92000000-0000-0000-0000-000000000005", "마크 레예스", "PH", "en", 180, 365, 195, 185), + activeWorker("92000000-0000-0000-0000-000000000006", "응웬반A", "VN", "vi", 45, 180, null, null), + activeWorker("92000000-0000-0000-0000-000000000007", "아디 수르야", "ID", "id", 365, 365, 380, 370), + activeWorker("92000000-0000-0000-0000-000000000008", "바트 에르덴", "MN", "mn", 21, 120, 36, 21), + activeWorker("92000000-0000-0000-0000-000000000009", "라니 위자야", "ID", "id", 7, 90, 22, 12), + activeWorker("92000000-0000-0000-0000-000000000010", "민 아웅", "MM", "en", 62, 20, 77, 62), + activeWorker("92000000-0000-0000-0000-000000000011", "파티마 누르", "ID", "id", 35, 150, 50, 40), + activeWorker("92000000-0000-0000-0000-000000000012", "트란 티 마이", "VN", "vi", 3, 45, 18, 3), + activeWorker("92000000-0000-0000-0000-000000000013", "쩐 꾸옥 바오", "VN", "vi", 5, 75, 20, 10), + onLeaveWorker("92000000-0000-0000-0000-000000000014", "아이다나 베크", "KG", "ky", 7, 100, 22, 7), + activeWorker("92000000-0000-0000-0000-000000000015", "찬다라 소쿤", "KH", "km", 21, 135, 36, 26), + activeWorker("92000000-0000-0000-0000-000000000016", "니말 페레라", "LK", "si", 35, 180, 50, 35), + activeWorker("92000000-0000-0000-0000-000000000017", "알리 칸", "PK", "ur", 62, 210, 77, 67), + activeWorker("92000000-0000-0000-0000-000000000018", "모하메드 라힘", "BD", "bn", 75, 240, 90, 75), + activeWorker("92000000-0000-0000-0000-000000000019", "누르 아지자", "ID", "id", 89, 270, 104, 94), + activeWorker("92000000-0000-0000-0000-000000000020", "아지즈 라히모프", "UZ", "uz", 91, 300, 106, 91), + onLeaveWorker("92000000-0000-0000-0000-000000000021", "알렉세이 이바노프", "RU", "ru", 150, 330, 165, 155), + activeWorker("92000000-0000-0000-0000-000000000022", "마리아 산토스", "PH", "fil", 240, 365, 255, 240), + activeWorker("92000000-0000-0000-0000-000000000023", "솜차이 차이야", "TH", "th", 365, 400, 380, 370), + activeWorker("92000000-0000-0000-0000-000000000024", "응우옌 티 란", "VN", "vi", 6, 60, 21, 6), + onLeaveWorker("92000000-0000-0000-0000-000000000025", "데위 사푸트리", "ID", "id", null, 240, null, null), + activeWorker("92000000-0000-0000-0000-000000000026", "조제 다 코스타", "TL", "tet", 12, 90, 27, 12), + activeWorker("92000000-0000-0000-0000-000000000027", "압둘 카림", "BD", "bn", 90, 180, 105, 95), + activeWorker("92000000-0000-0000-0000-000000000028", "비벡 타파", "NP", "en", 540, 540, 555, 540) ); private static final List TEST_WORKERS = List.of( - activeWorker("93000000-0000-0000-0000-000000000001", "테스트 근로자 01", "TH", "th", 45, 190), - activeWorker("93000000-0000-0000-0000-000000000002", "테스트 근로자 02", "MN", "mn", 75, 220), - activeWorker("93000000-0000-0000-0000-000000000003", "테스트 근로자 03", "BD", "bn", 105, 250), - activeWorker("93000000-0000-0000-0000-000000000004", "테스트 근로자 04", "UZ", "uz", 135, 280), - activeWorker("93000000-0000-0000-0000-000000000005", "테스트 근로자 05", "LK", "si", 195, 370) + activeWorker("93000000-0000-0000-0000-000000000001", "테스트 근로자 01", "TH", "th", 45, 190, 60, 50), + activeWorker("93000000-0000-0000-0000-000000000002", "테스트 근로자 02", "MN", "mn", 75, 220, 90, 75), + activeWorker("93000000-0000-0000-0000-000000000003", "테스트 근로자 03", "BD", "bn", 105, 250, 120, 110), + activeWorker("93000000-0000-0000-0000-000000000004", "테스트 근로자 04", "UZ", "uz", 135, 280, 150, 135), + activeWorker("93000000-0000-0000-0000-000000000005", "테스트 근로자 05", "LK", "si", 195, 370, 210, 200) ); List demoWorkers() { @@ -59,7 +59,9 @@ private static WorkerSeed activeWorker( String nationalityCode, String preferredLanguage, Integer stayExpiryDays, - int contractEndDays + int contractEndDays, + Integer employmentPermitEndDays, + Integer employmentActivityEndDays ) { return worker( workerId, @@ -68,7 +70,9 @@ private static WorkerSeed activeWorker( preferredLanguage, WorkerStatus.ACTIVE, stayExpiryDays, - contractEndDays + contractEndDays, + employmentPermitEndDays, + employmentActivityEndDays ); } @@ -78,7 +82,9 @@ private static WorkerSeed onLeaveWorker( String nationalityCode, String preferredLanguage, Integer stayExpiryDays, - int contractEndDays + int contractEndDays, + Integer employmentPermitEndDays, + Integer employmentActivityEndDays ) { return worker( workerId, @@ -87,7 +93,9 @@ private static WorkerSeed onLeaveWorker( preferredLanguage, WorkerStatus.ON_LEAVE, stayExpiryDays, - contractEndDays + contractEndDays, + employmentPermitEndDays, + employmentActivityEndDays ); } @@ -98,7 +106,9 @@ private static WorkerSeed worker( String preferredLanguage, WorkerStatus workStatus, Integer stayExpiryDays, - int contractEndDays + int contractEndDays, + Integer employmentPermitEndDays, + Integer employmentActivityEndDays ) { return new WorkerSeed( UUID.fromString(workerId), @@ -107,7 +117,9 @@ private static WorkerSeed worker( preferredLanguage, workStatus, stayExpiryDays, - contractEndDays + contractEndDays, + employmentPermitEndDays, + employmentActivityEndDays ); } @@ -118,7 +130,9 @@ record WorkerSeed( String preferredLanguage, WorkerStatus workStatus, Integer stayExpiryDays, - int contractEndDays + int contractEndDays, + Integer employmentPermitEndDays, + Integer employmentActivityEndDays ) { } } diff --git a/src/main/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedRunner.java b/src/main/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedRunner.java index 0c32cffa..8d02aa78 100644 --- a/src/main/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedRunner.java +++ b/src/main/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedRunner.java @@ -88,9 +88,12 @@ private void seedWorker(UUID companyId, WorkerSeed workerSeed, LocalDate today, workerSeed.nationalityCode(), workerSeed.preferredLanguage(), workerSeed.workStatus(), + "E-9", relativeDate(today, workerSeed.stayExpiryDays()), today.minusYears(1), today.plusDays(workerSeed.contractEndDays()), + relativeDate(today, workerSeed.employmentPermitEndDays()), + relativeDate(today, workerSeed.employmentActivityEndDays()), now, now, 0L diff --git a/src/main/resources/db/migration/V29__add_worker_e9_fields.sql b/src/main/resources/db/migration/V29__add_worker_e9_fields.sql new file mode 100644 index 00000000..dcb27d62 --- /dev/null +++ b/src/main/resources/db/migration/V29__add_worker_e9_fields.sql @@ -0,0 +1,8 @@ +ALTER TABLE worker + ADD COLUMN visa_type VARCHAR(20); + +ALTER TABLE worker + ADD COLUMN employment_permit_end_date DATE; + +ALTER TABLE worker + ADD COLUMN employment_activity_end_date DATE; diff --git a/src/test/java/com/fowoco/server/worker/WorkerSecurityIntegrationTest.java b/src/test/java/com/fowoco/server/worker/WorkerSecurityIntegrationTest.java index abdaee64..bd1a3f5c 100644 --- a/src/test/java/com/fowoco/server/worker/WorkerSecurityIntegrationTest.java +++ b/src/test/java/com/fowoco/server/worker/WorkerSecurityIntegrationTest.java @@ -302,6 +302,85 @@ void viewerCannotRegisterButCanListAndGet() throws Exception { assertThat(getAttempt.statusCode()).isEqualTo(200); } + @Test + void e9FieldsAreStoredIndependentlyAndNullByDefault() throws Exception { + String accessToken = accessToken(login(HR_A_EMAIL)); + + String registerBody = """ + { + "display_name": "E9필드테스트", + "visa_type": "E-9", + "stay_expiry_date": "2027-03-01", + "contract_end_date": "2027-12-31", + "employment_permit_end_date": "2028-01-31", + "employment_activity_end_date": "2028-06-30" + } + """; + HttpResponse registerResponse = postJson("/api/v1/workers", registerBody, accessToken); + + assertThat(registerResponse.statusCode()).isEqualTo(201); + assertThat(JsonPath.read(registerResponse.body(), "$.visa_type")).isEqualTo("E-9"); + assertThat(JsonPath.read(registerResponse.body(), "$.stay_expiry_date")).isEqualTo("2027-03-01"); + assertThat(JsonPath.read(registerResponse.body(), "$.contract_end_date")).isEqualTo("2027-12-31"); + assertThat(JsonPath.read(registerResponse.body(), "$.employment_permit_end_date")) + .isEqualTo("2028-01-31"); + assertThat(JsonPath.read(registerResponse.body(), "$.employment_activity_end_date")) + .isEqualTo("2028-06-30"); + } + + @Test + void e9FieldsAreNullableAndOmittedFieldsStayNull() throws Exception { + String accessToken = accessToken(login(HR_A_EMAIL)); + + String registerBody = """ + {"display_name": "필드누락테스트"} + """; + HttpResponse registerResponse = postJson("/api/v1/workers", registerBody, accessToken); + + assertThat(registerResponse.statusCode()).isEqualTo(201); + assertThat(JsonPath.read(registerResponse.body(), "$.visa_type")).isNull(); + assertThat(JsonPath.read(registerResponse.body(), "$.employment_permit_end_date")).isNull(); + assertThat(JsonPath.read(registerResponse.body(), "$.employment_activity_end_date")).isNull(); + } + + @Test + void patchUpdatesEmploymentPermitEndDateIndependentlyOfOtherDates() throws Exception { + String accessToken = accessToken(login(HR_A_EMAIL)); + String workerId = registerWorker(accessToken, "부분수정테스트"); + + String patchBody = """ + {"employment_permit_end_date": "2028-02-28", "expected_version": 0} + """; + HttpResponse patchResponse = patchJson( + "/api/v1/workers/" + workerId, + patchBody, + accessToken + ); + + assertThat(patchResponse.statusCode()).isEqualTo(200); + assertThat(JsonPath.read(patchResponse.body(), "$.employment_permit_end_date")) + .isEqualTo("2028-02-28"); + assertThat(JsonPath.read(patchResponse.body(), "$.employment_activity_end_date")).isNull(); + assertThat(JsonPath.read(patchResponse.body(), "$.contract_end_date")).isNull(); + } + + @Test + void e9FieldsAcceptFarFutureDateBoundary() throws Exception { + String accessToken = accessToken(login(HR_A_EMAIL)); + + String registerBody = """ + { + "display_name": "날짜경계테스트", + "employment_activity_end_date": "2099-12-31" + } + """; + HttpResponse registerResponse = postJson("/api/v1/workers", registerBody, accessToken); + + assertThat(registerResponse.statusCode()).isEqualTo(201); + assertThat(JsonPath.read(registerResponse.body(), "$.employment_activity_end_date")) + .isEqualTo("2099-12-31"); + } + private String registerWorker(String accessToken, String displayName) throws Exception { String body = """ {"display_name": "%s"} diff --git a/src/test/java/com/fowoco/server/worker/infrastructure/persistence/PostgreSqlWorkerDataFixture.java b/src/test/java/com/fowoco/server/worker/infrastructure/persistence/PostgreSqlWorkerDataFixture.java index 645c1348..0177a37b 100644 --- a/src/test/java/com/fowoco/server/worker/infrastructure/persistence/PostgreSqlWorkerDataFixture.java +++ b/src/test/java/com/fowoco/server/worker/infrastructure/persistence/PostgreSqlWorkerDataFixture.java @@ -147,9 +147,12 @@ Worker newWorker(UUID workerId, String displayName) { displayName, "VN", "ko", + "E-9", LocalDate.of(2027, 8, 31), LocalDate.of(2026, 9, 1), LocalDate.of(2027, 8, 31), + null, + null, FIXTURE_TIME.plusSeconds(7200) ); } diff --git a/src/test/java/com/fowoco/server/worker/infrastructure/persistence/PostgreSqlWorkerRepositoryRlsTest.java b/src/test/java/com/fowoco/server/worker/infrastructure/persistence/PostgreSqlWorkerRepositoryRlsTest.java index 999828c1..37d2493a 100644 --- a/src/test/java/com/fowoco/server/worker/infrastructure/persistence/PostgreSqlWorkerRepositoryRlsTest.java +++ b/src/test/java/com/fowoco/server/worker/infrastructure/persistence/PostgreSqlWorkerRepositoryRlsTest.java @@ -64,6 +64,9 @@ void tearDownRestrictedRepositoryFixture() throws Exception { @Test void repositoryReadsWithTransactionWithoutTenantBindingFailClosed() { WorkerSearchQuery allWorkers = new WorkerSearchQuery( + null, + null, + null, null, null, null, @@ -161,9 +164,12 @@ void repositoryUpdateWithoutTransactionOrTenantBindingCannotModifyRows() { "PH", "en", WorkerStatus.ON_LEAVE, + "E-9", LocalDate.of(2027, 12, 31), LocalDate.of(2026, 9, 1), LocalDate.of(2027, 8, 31), + null, + null, dataFixture.fixtureTime(), dataFixture.fixtureTime().plusSeconds(3600), 0L diff --git a/src/test/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedRunnerTest.java b/src/test/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedRunnerTest.java index b3dba3a4..07758f64 100644 --- a/src/test/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedRunnerTest.java +++ b/src/test/java/com/fowoco/server/worker/infrastructure/seed/DemoWorkerSeedRunnerTest.java @@ -95,9 +95,6 @@ void createsOperationalDemoWorkersAndKeepsTestCompanySmall() throws Exception { .hasSize(5); assertThat(workerRepository.workers.values()) .allMatch(Worker::isCurrentlyEmployed); - assertThat(workerRepository.workers.get( - UUID.fromString("92000000-0000-0000-0000-000000000001") - ).stayExpiryDate()).isEqualTo(LocalDate.of(2026, 8, 30)); assertThat(workerRepository.workers.get( UUID.fromString("92000000-0000-0000-0000-000000000006") )).satisfies(worker -> { @@ -105,6 +102,18 @@ void createsOperationalDemoWorkersAndKeepsTestCompanySmall() throws Exception { assertThat(worker.nationalityCode()).isEqualTo("VN"); assertThat(worker.preferredLanguage()).isEqualTo("vi"); assertThat(worker.stayExpiryDate()).isEqualTo(LocalDate.of(2026, 9, 14)); + assertThat(worker.visaType()).isEqualTo("E-9"); + assertThat(worker.employmentPermitEndDate()).isNull(); + assertThat(worker.employmentActivityEndDate()).isNull(); + }); + assertThat(demoWorkers).allMatch(worker -> "E-9".equals(worker.visaType())); + assertThat(workerRepository.workers.get( + UUID.fromString("92000000-0000-0000-0000-000000000008") + )).satisfies(worker -> { + assertThat(worker.displayName()).isEqualTo("바트 에르덴"); + assertThat(worker.stayExpiryDate()).isEqualTo(LocalDate.of(2026, 8, 21)); + assertThat(worker.employmentPermitEndDate()).isEqualTo(LocalDate.of(2026, 9, 5)); + assertThat(worker.employmentActivityEndDate()).isEqualTo(LocalDate.of(2026, 8, 21)); }); assertThat(workerRepository.workers.values()) .filteredOn(worker -> worker.companyId().equals(DEMO_COMPANY_ID))