7 Commits

26 changed files with 523 additions and 507 deletions

View File

@@ -59,8 +59,6 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>

View File

@@ -1,7 +1,5 @@
package com.example.rhizome.app.domain.model;
import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -31,6 +29,10 @@ public class Employee {
* パスワード
*/
private final String password;
/**
* 入社年月日
*/
private final String hireDate;
/**
* 管理者権限
*/
@@ -39,9 +41,5 @@ public class Employee {
* 部署ID
*/
private final Integer idDepartment;
/**
* 入社年月日
*/
private final LocalDate dateHired;
}

View File

@@ -6,8 +6,6 @@
*/
package com.example.rhizome.app.domain.model;
import java.time.Period;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -27,9 +25,4 @@ public class EmployeeInfo {
*/
private final Department department;
/**
* 勤続年数
*/
private final Period lengthOfService;
}

View File

@@ -1,7 +1,5 @@
package com.example.rhizome.app.domain.model;
import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -42,11 +40,6 @@ public class LoginUser {
*/
private final Integer idDepartment;
/**
* 入社年月日
*/
private final LocalDate dateHired;
/**
* ログインユーザが管理者か
*

View File

@@ -1,20 +1,16 @@
package com.example.rhizome.app.domain.service.impl;
import java.time.LocalDate;
import java.time.Period;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.rhizome.app.domain.model.EmployeeInfo;
import com.example.rhizome.app.domain.model.SearchConditionEmployee;
import com.example.rhizome.app.domain.service.SearchEmployeeInfo;
import com.example.rhizome.app.infra.entity.EmployeeDepartmentEntity;
import com.example.rhizome.app.infra.repository.EmployeeInfoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* SearchEmployeeInfoImpl (employee join department) 検索系の機能を集約させるサービスクラスです
@@ -30,6 +26,7 @@ public class SearchEmployeeInfoImpl implements SearchEmployeeInfo {
this.employeeInfoRepository = employeeInfoRepository;
}
/**
* EmployeeInfo (employee join department) のレコードを全件取得
*
@@ -37,14 +34,7 @@ public class SearchEmployeeInfoImpl implements SearchEmployeeInfo {
*/
public List<EmployeeInfo> selectAll() {
List<EmployeeDepartmentEntity> entityList = employeeInfoRepository.findAll();
List<Period> lengthOfServiceList = new ArrayList<>();
for (EmployeeDepartmentEntity entity : entityList) {
lengthOfServiceList.add(Period.between(entity.getDateHired(), LocalDate.now()));
}
return EmployeeDepartmentEntity.createEmployeeInfoList(entityList, lengthOfServiceList);
return EmployeeDepartmentEntity.createEmployeeInfoList(employeeInfoRepository.findAll());
}
@@ -57,21 +47,16 @@ public class SearchEmployeeInfoImpl implements SearchEmployeeInfo {
public List<EmployeeInfo> searchBy(SearchConditionEmployee searchConditionEmployee) {
// 動的に検索条件を絞り込む
// Specification は Criteria API の Predicate をラップしたもの
List<EmployeeDepartmentEntity> entityList = employeeInfoRepository.findAll(Specification
return EmployeeDepartmentEntity
.createEmployeeInfoList(
employeeInfoRepository.findAll(Specification
.where(EmployeeInfoRepository.idEmployeeEqual(searchConditionEmployee.getIdEmployee()))
.and(EmployeeInfoRepository.nmEmployeeEqual(searchConditionEmployee.getNmEmployee()))
.and(EmployeeInfoRepository.knEmployeeEqual(searchConditionEmployee.getKnEmployee()))
.and(EmployeeInfoRepository.mailAddressEqual(searchConditionEmployee.getMailAddress()))
.and(EmployeeInfoRepository.idDepartmentEqual(searchConditionEmployee.getIdDepartment())));
List<Period> lengthOfServiceList = new ArrayList<>();
for (EmployeeDepartmentEntity entity : entityList) {
lengthOfServiceList.add(Period.between(entity.getDateHired(), LocalDate.now()));
}
return EmployeeDepartmentEntity.createEmployeeInfoList(entityList, lengthOfServiceList);
.and(EmployeeInfoRepository.idDepartmentEqual(searchConditionEmployee.getIdDepartment()))
)
);
}
}

View File

@@ -52,9 +52,9 @@ public class UpdateEmployeeImpl implements UpdateEmployee {
updateEmployee.getKnEmployee(),
updateEmployee.getMailAddress(),
updateEmployee.getPassword().isBlank() ? beforeEmployee.getPassword() : updateEmployee.getPassword(),
updateEmployee.getHireDate(),
updateEmployee.getAdminAuth() == null ? beforeEmployee.getAdminAuth() : updateEmployee.getAdminAuth(),
updateEmployee.getIdDepartment() == null ? beforeEmployee.getIdDepartment() : updateEmployee.getIdDepartment(),
beforeEmployee.getDateHired()
updateEmployee.getIdDepartment() == null ? beforeEmployee.getIdDepartment() : updateEmployee.getIdDepartment()
);
}

View File

@@ -1,9 +1,6 @@
package com.example.rhizome.app.infra.entity;
import java.time.LocalDate;
import java.time.Period;
import java.util.List;
import java.util.stream.IntStream;
import javax.persistence.Column;
import javax.persistence.Entity;
@@ -74,6 +71,12 @@ public class EmployeeDepartmentEntity {
@Column(name = "password", nullable = false)
private String password;
/**
* 入社年月日
*/
@Column(name = "hire_date", nullable = false)
private String hireDate;
/**
* 管理者権限
*/
@@ -85,20 +88,14 @@ public class EmployeeDepartmentEntity {
@Fetch(FetchMode.JOIN)
private DepartmentEntity department;
/*
* 入社年月日
*/
@Column(name = "date_hired", nullable = false)
private LocalDate dateHired;
/**
* EmployeeDepartmentEntity(DataAccess層依存) を EmployeeInfo(BusinessLogic層依存) に変換します。
*
* @param employeeDepartmentEntity  EmployeeDepartmentEntity のインスタンス
* @param lengthOfService  勤続年数
* @return EmployeeInfo のインスタンス
*/
public static EmployeeInfo createEmployeeInfo(EmployeeDepartmentEntity employeeDepartmentEntity, Period lengthOfService) {
public static EmployeeInfo createEmployeeInfo(EmployeeDepartmentEntity employeeDepartmentEntity) {
// コンストラクタを使って書くとSetterを使用するより簡略化出来ます。
// 混乱してしまう人は落ち着いて EmployeeInfo のフィールドを見に行って、
@@ -110,15 +107,13 @@ public class EmployeeDepartmentEntity {
employeeDepartmentEntity.getKnEmployee(),
employeeDepartmentEntity.getMailAddress(),
employeeDepartmentEntity.getPassword(),
employeeDepartmentEntity.getHireDate(),
employeeDepartmentEntity.getAdminAuth(),
employeeDepartmentEntity.getDepartment() == null ? null : employeeDepartmentEntity.getDepartment().getIdDepartment(),
employeeDepartmentEntity.getDateHired()
),
employeeDepartmentEntity.getDepartment() == null ? null : employeeDepartmentEntity.getDepartment().getIdDepartment() ),
new Department(
employeeDepartmentEntity.getDepartment() == null ? null : employeeDepartmentEntity.getDepartment().getIdDepartment(),
employeeDepartmentEntity.getDepartment() == null ? null : employeeDepartmentEntity.getDepartment().getNmDepartment()
),
lengthOfService
)
);
}
@@ -128,25 +123,14 @@ public class EmployeeDepartmentEntity {
* (リスト版)
*
* @param employeeDepartmentEntityList EmployeeDepartmentEntity インスタンスのリスト
* @param 勤続年数のリスト
* @return EmployeeInfo インスタンスのリスト
*/
public static List<EmployeeInfo> createEmployeeInfoList(
List<EmployeeDepartmentEntity> employeeDepartmentEntityList,
List<Period> lengthOfServiceList) {
public static List<EmployeeInfo> createEmployeeInfoList(List<EmployeeDepartmentEntity> employeeDepartmentEntityList) {
// StreamAPI を使うとこうなります。
return employeeDepartmentEntityList.stream().map(EmployeeDepartmentEntity::createEmployeeInfo).toList();
if (employeeDepartmentEntityList.size() != lengthOfServiceList.size()) {
throw new IllegalArgumentException(
"社員情報と勤続年数の件数が一致しません。");
}
return IntStream.range(0, employeeDepartmentEntityList.size())
.mapToObj(index -> EmployeeDepartmentEntity
.createEmployeeInfo(employeeDepartmentEntityList.get(index), lengthOfServiceList.get(index)))
.toList();
}
}

View File

@@ -7,7 +7,6 @@
package com.example.rhizome.app.infra.entity;
import java.time.LocalDate;
import java.util.List;
import javax.persistence.Column;
@@ -69,6 +68,11 @@ public class EmployeeEntity {
@Column(name = "password", nullable = false)
private String password;
/**
* 入社年月日
*/
@Column(name = "hire_Date", nullable = false)
private String hireDate;
/**
* 管理者権限
*/
@@ -81,11 +85,6 @@ public class EmployeeEntity {
@Column(name = "id_department", nullable = false)
private Integer idDepartment;
/**
* 入社年月日
*/
@Column(name = "date_hired", nullable = false)
private LocalDate dateHired;
/**
@@ -102,9 +101,9 @@ public class EmployeeEntity {
employee.getKnEmployee(),
employee.getMailAddress(),
employee.getPassword(),
employee.getHireDate(),
employee.getAdminAuth(),
employee.getIdDepartment(),
employee.getDateHired()
employee.getIdDepartment()
);
}
@@ -143,9 +142,9 @@ public class EmployeeEntity {
employeeEntity.getKnEmployee(),
employeeEntity.getMailAddress(),
employeeEntity.getPassword(),
employeeEntity.getHireDate(),
employeeEntity.getAdminAuth(),
employeeEntity.getIdDepartment(),
employeeEntity.getDateHired()
employeeEntity.getIdDepartment()
);
}
@@ -183,8 +182,7 @@ public class EmployeeEntity {
getMailAddress(),
getPassword(),
getAdminAuth(),
getIdDepartment(),
getDateHired()
getIdDepartment()
);
}

View File

@@ -2,7 +2,6 @@ package com.example.rhizome.app.presentation.controller;
import static com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword.*;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
@@ -84,9 +83,9 @@ public class InsertEmployeeController {
insertEmployeeForm.getKnEmployee(),
insertEmployeeForm.getMailAddress(),
insertEmployeeForm.getPassword(),
insertEmployeeForm.getHireDate(),
insertEmployeeForm.getAdminAuth(),
insertEmployeeForm.getIdDepartment(),
insertEmployeeForm.getDateHired()
insertEmployeeForm.getIdDepartment()
);
// エラーが1件以上有る場合
@@ -129,18 +128,18 @@ public class InsertEmployeeController {
String employeeKana,
String mailAddress,
String password,
String hireDate,
Integer management,
Integer departmentId,
LocalDate hireDate
Integer departmentId
) {
final String EMPLOYEE_NAME_NULL_BLANK = "社員名";
final String EMPLOYEE_KANA_NULL_BLANK = "社員名フリガナ";
final String MAIL_ADDRESS_NULL_BLANK = "メールアドレス";
final String PASSWORD_NULL_BLANK = "パスワード";
final String HIREDATE_NULL_BLANK = "入社年月日";
final String MANAGEMENT_ERROR = "管理者権限指定";
final String DEPARTMENT_ID_NULL_BLANK = "所属部署";
final String HIRE_DATE_NULL_BLANK = "入社年月日";
List<String> error = new ArrayList<>();
@@ -167,6 +166,11 @@ public class InsertEmployeeController {
// エラー内容を追加
error.add(PASSWORD_NULL_BLANK);
}
// null or 空文字判定
if (isNullOrBlank(hireDate)) {
// エラー内容を追加
error.add(HIREDATE_NULL_BLANK);
}
// 管理者権限の値が不正か
if (management == null) {
@@ -180,12 +184,6 @@ public class InsertEmployeeController {
error.add(DEPARTMENT_ID_NULL_BLANK);
}
// null判定
if (hireDate == null) {
//エラー内容を追加
error.add(HIRE_DATE_NULL_BLANK);
}
return error;
}

View File

@@ -1,14 +1,11 @@
package com.example.rhizome.app.presentation.controller;
import com.example.rhizome.aop.aspect.PermissionCheck;
import com.example.rhizome.aop.aspect.SessionCheck;
import com.example.rhizome.app.domain.service.SearchDepartment;
import com.example.rhizome.app.domain.service.SearchEmployeeInfo;
import com.example.rhizome.app.presentation.controller.pageproperty.PageReturnAttributeKeyword;
import com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword;
import com.example.rhizome.app.presentation.form.DepartmentForm;
import com.example.rhizome.app.presentation.form.EmployeeInfoForm;
import com.example.rhizome.app.presentation.form.SearchConditionEmployeeForm;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
@@ -16,9 +13,16 @@ import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpSession;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.example.rhizome.aop.aspect.PermissionCheck;
import com.example.rhizome.aop.aspect.SessionCheck;
import com.example.rhizome.app.domain.service.SearchDepartment;
import com.example.rhizome.app.domain.service.SearchEmployeeInfo;
import com.example.rhizome.app.domain.service.TenureCalc;
import com.example.rhizome.app.presentation.controller.pageproperty.PageReturnAttributeKeyword;
import com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword;
import com.example.rhizome.app.presentation.form.DepartmentForm;
import com.example.rhizome.app.presentation.form.EmployeeInfoForm;
import com.example.rhizome.app.presentation.form.SearchConditionEmployeeForm;
/**
* 社員検索画面用コントローラ リスト全件表示、検索表示、更新、削除が可能
@@ -34,12 +38,13 @@ public class SelectEmployeeController {
HttpSession httpSession;
SearchDepartment searchDepartment;
SearchEmployeeInfo searchEmployeeInfo;
TenureCalc tenureCalc;
@Autowired
public SelectEmployeeController(HttpSession httpSession, SearchDepartment searchDepartment, SearchEmployeeInfo searchEmployeeInfo) {
public SelectEmployeeController(HttpSession httpSession, SearchDepartment searchDepartment, SearchEmployeeInfo searchEmployeeInfo ,TenureCalc tenureCalc) {
this.httpSession = httpSession;
this.searchDepartment = searchDepartment;
this.searchEmployeeInfo = searchEmployeeInfo;
this.tenureCalc = tenureCalc;
}
@ModelAttribute
@@ -70,7 +75,14 @@ public class SelectEmployeeController {
// 検索条件を元に検索を実施
// 取得した EmployeeInfo( employee + department )の情報を画面に返す用の型に詰め替えてセット
model.addAttribute(PageReturnAttributeKeyword.EMPLOYEE_INFO_FORM_LIST, EmployeeInfoForm.convertFrom(searchEmployeeInfo.searchBy(SearchConditionEmployeeForm.convertTo(searchConditionEmployeeForm))));
List<EmployeeInfoForm>employeeInfoForm = EmployeeInfoForm.convertFrom(searchEmployeeInfo.searchBy(SearchConditionEmployeeForm.convertTo(searchConditionEmployeeForm)));
for(EmployeeInfoForm form:employeeInfoForm) {
String tenure = tenureCalc.tenureCalc(form.getHireDate());
form.setTenure(tenure);
}
model.addAttribute(PageReturnAttributeKeyword.EMPLOYEE_INFO_FORM_LIST, employeeInfoForm);
// 検索ページに遷移
return TransitionTargetPageNameKeyword.SELECT_EMPLOYEE_HTML;
@@ -109,11 +121,16 @@ public class SelectEmployeeController {
);
// 検索条件を元に検索を実施
model.addAttribute(PageReturnAttributeKeyword.EMPLOYEE_INFO_FORM_LIST,
EmployeeInfoForm.convertFrom(
List<EmployeeInfoForm>employeeInfoForm =EmployeeInfoForm.convertFrom(
searchEmployeeInfo.searchBy(
SearchConditionEmployeeForm.convertTo(searchConditionEmployeeForm())
)));
));
for(EmployeeInfoForm form:employeeInfoForm) {
String tenure = tenureCalc.tenureCalc(form.getHireDate());
form.setTenure(tenure);
}
model.addAttribute(PageReturnAttributeKeyword.EMPLOYEE_INFO_FORM_LIST,employeeInfoForm);
// 検索ページに遷移
return TransitionTargetPageNameKeyword.SELECT_EMPLOYEE_HTML;

View File

@@ -1,6 +1,20 @@
package com.example.rhizome.app.presentation.controller;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.example.rhizome.aop.aspect.PermissionCheck;
import com.example.rhizome.aop.aspect.SessionCheck;
import com.example.rhizome.app.domain.model.Employee;
@@ -15,18 +29,6 @@ import com.example.rhizome.app.presentation.form.DepartmentForm;
import com.example.rhizome.app.presentation.form.LoginUserForm;
import com.example.rhizome.app.presentation.form.MessageForm;
import com.example.rhizome.app.presentation.form.UpdateEmployeeInfoForm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* employee を更新して結果を返す為のコントローラ
@@ -148,7 +150,10 @@ public class UpdateEmployeeResultController {
return TransitionTargetPageNameKeyword.UPDATE_EMPLOYEE_INPUT_HTML;
}
updateEmployeeInfoForm.setHireDate(beforeEmployee.getHireDate());
// 画面用の型からビジネスロジック用のモデルに変換し、Updateを実行
updateEmployee.updateEmployee(beforeEmployee, UpdateEmployeeInfoForm.convertTo(updateEmployeeInfoForm));
// Update後の情報を再取得

View File

@@ -1,6 +1,20 @@
package com.example.rhizome.app.presentation.controller;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.example.rhizome.aop.aspect.PermissionCheck;
import com.example.rhizome.aop.aspect.SessionCheck;
import com.example.rhizome.app.domain.model.Employee;
@@ -12,18 +26,6 @@ import com.example.rhizome.app.presentation.controller.pageproperty.TransitionTa
import com.example.rhizome.app.presentation.form.LoginUserForm;
import com.example.rhizome.app.presentation.form.MessageForm;
import com.example.rhizome.app.presentation.form.UpdatePersonalUserForm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* 個人情報更新用コントローラ
@@ -134,11 +136,15 @@ public class UpdatePersonalEmployeeResultController {
}
//更新前のEmployeeの情報を取得
Employee beforeEmployee =searchEmployee.searchEmployeeByIdEmployee(updatePersonalUserForm.getIdEmployee());
updatePersonalUserForm.setHireDate(beforeEmployee.getHireDate());
// 画面用のインスタンスから更新用のインスタンスに変換し、Update実施
updateEmployee.updateEmployee(
searchEmployee.searchEmployeeByIdEmployee(updatePersonalUserForm.getIdEmployee()),
UpdatePersonalUserForm.convertTo(updatePersonalUserForm)
);
beforeEmployee,
UpdatePersonalUserForm.convertTo(updatePersonalUserForm))
;
// ログイン者の情報をセッション情報に格納
httpSession.setAttribute(

View File

@@ -1,8 +1,6 @@
package com.example.rhizome.app.presentation.form;
import java.time.LocalDate;
import java.time.Period;
import java.util.List;
import com.example.rhizome.app.domain.model.EmployeeInfo;
@@ -40,7 +38,15 @@ public class EmployeeInfoForm {
*/
private String password;
/**
* パスワード
* 入社年月日
*/
private String hireDate;
/**
* 勤続年数
*/
private String tenure;
/**
* 管理者権限
*/
private Integer adminAuth;
/**
@@ -52,16 +58,6 @@ public class EmployeeInfoForm {
*/
private String nmDepartment;
/**
* 入社年月日
*/
private LocalDate dateHired;
/**
* 勤続年数
*/
private String lengthOfService;
/**
* business 層の EmployeeInfo クラスから画面用(presentation 層)の EmployeeInfoForm に
* 変換します。
@@ -70,22 +66,17 @@ public class EmployeeInfoForm {
* @return クラスから画面用(presentation 層)の EmployeeInfoForm インスタンス
*/
public static EmployeeInfoForm convertFrom(EmployeeInfo employeeInfo) {
Period period = employeeInfo.getLengthOfService();
String lengthOfService =
period.getYears() + "年" + period.getMonths() + "ヵ月";
return new EmployeeInfoForm(
employeeInfo.getEmployee().getIdEmployee(),
employeeInfo.getEmployee().getNmEmployee(),
employeeInfo.getEmployee().getKnEmployee(),
employeeInfo.getEmployee().getMailAddress(),
employeeInfo.getEmployee().getPassword(),
employeeInfo.getEmployee().getHireDate(),
null,
employeeInfo.getEmployee().getAdminAuth(),
employeeInfo.getDepartment().getIdDepartment(),
employeeInfo.getDepartment().getNmDepartment(),
employeeInfo.getEmployee().getDateHired(),
lengthOfService
employeeInfo.getDepartment().getNmDepartment()
);
}

View File

@@ -1,11 +1,8 @@
package com.example.rhizome.app.presentation.form;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import org.springframework.format.annotation.DateTimeFormat;
import com.example.rhizome.app.domain.model.Employee;
import lombok.AllArgsConstructor;
@@ -44,6 +41,10 @@ public class InsertEmployeeForm {
* 確認用パスワード
*/
private String passwordConfirm;
/**
* 入社年月日
*/
private String hireDate;
/**
* 管理者権限
@@ -55,12 +56,6 @@ public class InsertEmployeeForm {
*/
private Integer idDepartment;
/**
* 入社年月日
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate dateHired;
/**
* パスワードのValidation
@@ -116,9 +111,9 @@ public class InsertEmployeeForm {
insertEmployeeForm.getKnEmployee(),
insertEmployeeForm.getMailAddress(),
insertEmployeeForm.getPassword(),
insertEmployeeForm.getHireDate(),
insertEmployeeForm.getAdminAuth(),
insertEmployeeForm.getIdDepartment(),
insertEmployeeForm.getDateHired()
insertEmployeeForm.getIdDepartment()
);
}
@@ -133,7 +128,7 @@ public class InsertEmployeeForm {
final String MAIL_ADDRESS_NULL_BLANK = "メールアドレス";
final String MANAGEMENT_ERROR = "管理者権限指定";
final String DEPARTMENT_ID_NULL_BLANK = "所属部署";
final String HIRE_DATE_NULL = "入社年月日";
final String HIREDATE_NULL_BLANK ="入社年月日";
List<String> error = new ArrayList<>();
@@ -146,9 +141,6 @@ public class InsertEmployeeForm {
if (isNullOrBlank(mailAddress)) {
error.add(MAIL_ADDRESS_NULL_BLANK);
}
if(dateHired == null) {
error.add(HIRE_DATE_NULL);
}
// パスワードが仕様を満たしているか確認
checkPassword(password, passwordConfirm, error);
@@ -160,6 +152,9 @@ public class InsertEmployeeForm {
if (idDepartment == null) {
error.add(DEPARTMENT_ID_NULL_BLANK);
}
if(isNullOrBlank(hireDate)) {
error.add(HIREDATE_NULL_BLANK);
}
return error;

View File

@@ -1,10 +1,7 @@
package com.example.rhizome.app.presentation.form;
import java.time.LocalDate;
import com.example.rhizome.app.domain.model.LoginUser;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -44,11 +41,6 @@ public class LoginUserForm {
*/
private Integer idDepartment;
/**
* 入社年月日
*/
private LocalDate dateHired;
/**
* business 層の LoginUser クラスから画面用(presentation 層)の LoginUserForm に
* 変換します。
@@ -64,8 +56,7 @@ public class LoginUserForm {
loginUser.getMailAddress(),
loginUser.getPassword(),
loginUser.getAdminAuth(),
loginUser.getIdDepartment(),
loginUser.getDateHired()
loginUser.getIdDepartment()
);
}
@@ -84,8 +75,7 @@ public class LoginUserForm {
loginUserForm.getMailAddress(),
loginUserForm.getPassword(),
loginUserForm.getAdminAuth(),
loginUserForm.getIdDepartment(),
loginUserForm.getDateHired()
loginUserForm.getIdDepartment()
);
}

View File

@@ -1,6 +1,5 @@
package com.example.rhizome.app.presentation.form;
import java.time.LocalDate;
import java.util.List;
import com.example.rhizome.app.domain.model.Employee;
@@ -42,6 +41,10 @@ public class UpdateEmployeeInfoForm {
* パスワード確認用
*/
private String passwordConfirm;
/**
* 入社年月日
*/
private String hireDate;
/**
* 管理者権限
*/
@@ -50,10 +53,6 @@ public class UpdateEmployeeInfoForm {
* 部署ID
*/
private Integer idDepartment;
/**
* 入社年月日
*/
private LocalDate dateHired;
/**
* business 層の EmployeeInfo クラスから画面用(presentation 層)の UpdateEmployeeInfoForm に
@@ -70,9 +69,9 @@ public class UpdateEmployeeInfoForm {
employeeInfo.getEmployee().getMailAddress(),
employeeInfo.getEmployee().getPassword(),
null,
employeeInfo.getEmployee().getHireDate(),
employeeInfo.getEmployee().getAdminAuth(),
employeeInfo.getDepartment().getIdDepartment(),
employeeInfo.getEmployee().getDateHired()
employeeInfo.getDepartment().getIdDepartment()
);
}
@@ -101,9 +100,9 @@ public class UpdateEmployeeInfoForm {
updateEmployeeInfoForm.getKnEmployee(),
updateEmployeeInfoForm.getMailAddress(),
updateEmployeeInfoForm.getPassword(),
updateEmployeeInfoForm.getHireDate(),
updateEmployeeInfoForm.getAdminAuth(),
updateEmployeeInfoForm.getIdDepartment(),
updateEmployeeInfoForm.getDateHired()
updateEmployeeInfoForm.getIdDepartment()
);
}

View File

@@ -38,7 +38,10 @@ public class UpdatePersonalUserForm {
* パスワード確認用
*/
private String passwordConfirm;
/**
* 入社年月日
*/
private String hireDate;
/**
* 画面用(presentation 層)の UpdatePersonalUserForm クラスから business 層の Employee クラスに
@@ -54,7 +57,7 @@ public class UpdatePersonalUserForm {
updatePersonalUserForm.getKnEmployee(),
updatePersonalUserForm.getMailAddress(),
updatePersonalUserForm.getPassword(),
null,
updatePersonalUserForm.getHireDate(),
null,
null
);
@@ -74,7 +77,9 @@ public class UpdatePersonalUserForm {
employee.getKnEmployee(),
employee.getMailAddress(),
employee.getPassword(),
null
null,
employee.getHireDate()
);
}
@@ -92,6 +97,7 @@ public class UpdatePersonalUserForm {
loginUser.getKnEmployee(),
loginUser.getMailAddress(),
loginUser.getPassword(),
null,
null
);
}

View File

@@ -20,7 +20,10 @@
</div>
</h1>
<form action="insertEmployee" id="insertForm" method="post" th:object="${insertEmployeeForm}">
<form action="insertEmployee"
id="insertForm"
method="post"
th:object="${insertEmployeeForm}">
<div class="msgBox error" th:if="${messageError != null}">
<span class="error" th:each="message : ${messageError.message}" th:text="${message}"></span>
@@ -30,7 +33,11 @@
<th class="header">社員ID</th>
<td>
<label>
<input class="readOnly" name="empId" readonly="readonly" type="text" value="自動で設定されます" />
<input class="readOnly"
name="empId"
readonly="readonly"
type="text"
value="自動で設定されます"/>
</label>
</td>
</tr>
@@ -38,7 +45,10 @@
<th class="header">社員名</th>
<td>
<label>
<input class="readOnly" name="nmEmployee" readonly="readonly" th:value="*{nmEmployee}"
<input class="readOnly"
name="nmEmployee"
readonly="readonly"
th:value="*{nmEmployee}"
type="text"/>
</label>
</td>
@@ -47,7 +57,10 @@
<th class="header">社員名フリガナ</th>
<td>
<label>
<input class="readOnly" name="knEmployee" readonly="readonly" th:value="*{knEmployee}"
<input class="readOnly"
name="knEmployee"
readonly="readonly"
th:value="*{knEmployee}"
type="text"/>
</label>
</td>
@@ -56,7 +69,10 @@
<th class="header">メールアドレス</th>
<td>
<label>
<input class="readOnly" name="mailAddress" readonly="readonly" th:value="*{mailAddress}"
<input class="readOnly"
name="mailAddress"
readonly="readonly"
th:value="*{mailAddress}"
type="text"/>
</label>
</td>
@@ -65,22 +81,39 @@
<th class="header">パスワード</th>
<td>
<label>
<input class="readOnly" name="password" readonly="readonly" th:value="*{password}"
<input class="readOnly"
name="password"
readonly="readonly"
th:value="*{password}"
type="password"/>
</label>
</td>
</tr>
<tr>
<th class="header">入社年月日</th>
<td>
<label>
<input class="readOnly"
name="hireDate"
readonly="readonly"
th:value="*{hireDate}"
type="date"/>
</label>
</td>
</tr>
<tr>
<th class="header">管理者権限</th>
<td>
<label>
<input id="adminAuth1" name="adminAuth" onclick="return false;"
th:checked="${insertEmployeeForm .adminAuth == 1}" type="radio" value="1"> 管理者権限
th:checked="${insertEmployeeForm .adminAuth == 1}" type="radio"
value="1"> 管理者権限
</label>
<label>
<input id="adminAuth0" name="adminAuth" onclick="return false;"
th:checked="${insertEmployeeForm.adminAuth == null or insertEmployeeForm.adminAuth == 0}"
type="radio" value="0">
type="radio"
value="0">
一般権限
</label>
</td>
@@ -93,7 +126,8 @@
<th:block th:each="department : ${departmentFormList}">
<th:block
th:if="${insertEmployeeForm.idDepartment != null && department.idDepartment == insertEmployeeForm.idDepartment}">
<option th:text="${department.nmDepartment}" th:value="${department.idDepartment}">
<option th:text="${department.nmDepartment}"
th:value="${department.idDepartment}">
</option>
</th:block>
</th:block>
@@ -101,15 +135,6 @@
</label>
</td>
</tr>
<tr>
<th class="header">入社年月日</th>
<td>
<label>
<input class="readOnly" name="dateHired" readonly="readonly" th:value="*{dateHired}"
type="text" />
</label>
</td>
</tr>
<tr>
<td class="btnArea" colspan="2">
<input type="submit" value="登録"/>
@@ -141,5 +166,4 @@
</script>
</body>
</html>

View File

@@ -20,7 +20,9 @@
<button class="logoutButton" onclick="logoutSubmit()">ログアウト</button>
</div>
</h1>
<form action="insertEmployeeConfirm" method="post" th:object="${insertEmployeeForm}">
<form action="insertEmployeeConfirm"
method="post"
th:object="${insertEmployeeForm}">
<div class="msgBox error" th:if="${messageError} != null">
<span class="error" th:text="${messageError.message}"></span>
@@ -31,7 +33,11 @@
<th class="header">社員ID</th>
<td>
<label>
<input class="readOnly" readonly="readonly" type="text" value="自動で設定されます" />
<input class="readOnly"
readonly="readonly"
type="text"
value="自動で設定されます"
/>
</label>
</td>
</tr>
@@ -39,8 +45,12 @@
<th class="header">社員名</th>
<td>
<label>
<input maxlength="50" placeholder="社員名" required="required" th:field="*{nmEmployee}"
type="text" />
<input maxlength="50"
placeholder="社員名"
required="required"
th:field="*{nmEmployee}"
type="text"
/>
</label>
</td>
</tr>
@@ -48,8 +58,13 @@
<th class="header">社員名フリガナ</th>
<td>
<label>
<input maxlength="50" oninput="convertToKatakana(this)" placeholder="フリガナ" required="required"
th:field="*{knEmployee}" type="text" />
<input maxlength="50"
oninput="convertToKatakana(this)"
placeholder="フリガナ"
required="required"
th:field="*{knEmployee}"
type="text"
/>
</label>
</td>
</tr>
@@ -57,8 +72,12 @@
<th class="header">メールアドレス</th>
<td>
<label>
<input maxlength="100" placeholder="メールアドレス" required="required" th:field="*{mailAddress}"
type="email" />
<input maxlength="100"
placeholder="メールアドレス"
required="required"
th:field="*{mailAddress}"
type="email"
/>
</label>
</td>
</tr>
@@ -66,23 +85,45 @@
<th class="header">パスワード</th>
<td>
<label>
<input pattern="^(?=.*?[a-zA-Z])(?=.*?\d)[a-zA-Z\d]{3,10}$" placeholder="パスワード"
required="required" th:field="*{password}" type="password" />
<input pattern="^(?=.*?[a-zA-Z])(?=.*?\d)[a-zA-Z\d]{3,10}$"
placeholder="パスワード"
required="required"
th:field="*{password}"
type="password"
/>
</label>
</td>
</tr>
<!-- *** Chrome等のブラウザの場合自動でセットされる可能性があるので注意書きを外にも *** -->
<tr>
<th></th>
<td><span style="font-size:8pt; font-weight:bold; color:red;">※半角英数字をそれぞれ1種類以上含む3-10文字</span>
<td><span
style="font-size:8pt; font-weight:bold; color:red;">※半角英数字をそれぞれ1種類以上含む3-10文字</span>
</td>
</tr>
<tr>
<th class="header">パスワード確認用</th>
<td>
<label>
<input pattern="^(?=.*?[a-zA-Z])(?=.*?\d)[a-zA-Z\d]{3,10}$" placeholder="パスワード確認用"
required="required" th:field="*{passwordConfirm}" type="password" />
<input pattern="^(?=.*?[a-zA-Z])(?=.*?\d)[a-zA-Z\d]{3,10}$"
placeholder="パスワード確認用"
required="required"
th:field="*{passwordConfirm}"
type="password"
/>
</label>
</td>
</tr>
<tr>
<th class="header">入社年月日</th>
<td>
<label>
<input
placeholder="入社年月日"
required="required"
th:field="*{hireDate}"
type="date"
/>
</label>
</td>
</tr>
@@ -91,12 +132,14 @@
<td>
<label>
<input id="adminAuth1" name="adminAuth" th:checked="${insertEmployeeForm .adminAuth == 1}"
type="radio" value="1"> 管理者権限
type="radio"
value="1"> 管理者権限
</label>
<label>
<input id="adminAuth0" name="adminAuth"
th:checked="${insertEmployeeForm.adminAuth == null or insertEmployeeForm.adminAuth == 0}"
type="radio" value="0">
type="radio"
value="0">
一般権限
</label>
</td>
@@ -109,21 +152,13 @@
<select required="required" th:field="*{idDepartment}">
<option th:each="department : ${departmentFormList}"
th:selected="${insertEmployeeForm.idDepartment != null && department.idDepartment == insertEmployeeForm.idDepartment}"
th:text="${department.nmDepartment}" th:value="${department.idDepartment}">
th:text="${department.nmDepartment}"
th:value="${department.idDepartment}">
</option>
</select>
</label>
</td>
</tr>
<tr>
<th class="header">入社年月日</th>
<td>
<label>
<input required="required" th:field="*{dateHired}"
type="date" />
</label>
</td>
</tr>
<tr>
<td class="btnArea" colspan="2">
<input type="submit" value="登録確認"/>
@@ -133,5 +168,4 @@
</form>
<a href="showMenu">メニューに戻る</a>
</body>
</html>

View File

@@ -105,11 +105,11 @@
<th style="width: 150px;">フリガナ</th>
<th style="width: 150px;">メールアドレス</th>
<th style="width: 100px;">パスワード</th>
<th style="width: 60px;">入社年月日</th>
<th style="width: 60px;">勤続年数</th>
<th style="width: 70px;">管理者フラグ</th>
<th style="width: 150px;">所属部署</th>
<th style="width: 80px;">入社年月日</th>
<th style="width: 80px;">勤続年数</th>
<th style="width: 100px;">操作</th>
<th style="width: 150px;">操作</th>
</tr>
</thead>
<tbody>
@@ -119,10 +119,10 @@
<td th:text="${employeeInfoForm.knEmployee}"></td>
<td th:text="${employeeInfoForm.mailAddress}"></td>
<td th:text="${employeeInfoForm.password}"></td>
<td th:text="${employeeInfoForm.hireDate}"></td>
<td th:text="${employeeInfoForm.tenure}"></td>
<td th:text="${employeeInfoForm.adminAuth}"></td>
<td th:text="${employeeInfoForm.nmDepartment}"></td>
<td th:text="${employeeInfoForm.dateHired}"></td>
<td th:text="${employeeInfoForm.lengthOfService}"></td>
<td>
<!-- 更新フォーム -->
<form action="showUpdateEmployee" method="post" style="display: inline;">

View File

@@ -4,6 +4,7 @@
-- CREATE USER 'rezouser'@'localhost' IDENTIFIED BY 'Rezo_0000';
-- GRANT ALL ON rezodb.* TO 'rezouser'@'localhost';
-- employee<65>e<EFBFBD>[<5B>u<EFBFBD><75><EFBFBD>̍쐬
DROP TABLE IF EXISTS employee;
CREATE TABLE employee (
@@ -14,6 +15,7 @@ CREATE TABLE employee (
, password VARCHAR(10) NOT NULL
, admin_auth INT NOT NULL
, id_department INT NOT NULL
, hire_date DATE NOT NULL
)
AUTO_INCREMENT = 10000;
@@ -26,16 +28,16 @@ CREATE TABLE department (
AUTO_INCREMENT = 10;
-- <20>Ј<EFBFBD><D088>e<EFBFBD>[<5B>u<EFBFBD><75><EFBFBD>̃f<CC83>[<5B>^
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department) VALUES ('<EFBFBD>R<EFBFBD>c<EFBFBD><EFBFBD><EFBFBD><EFBFBD>','<EFBFBD><EFBFBD><EFBFBD>}<7D>_<EFBFBD>^<5E>c<EFBFBD><63>','yamada@hoge.jp','aaa',1,10);
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department) VALUES ('<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>','<EFBFBD>^<5E>J<EFBFBD>n<EFBFBD>V<EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD>','jtaka@hoge.jp','bbb',0,10);
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department) VALUES ('<EFBFBD><EFBFBD><EFBFBD>}<7D>j<EFBFBD><6A>','<EFBFBD>}<7D>G<EFBFBD>_<EFBFBD>t<EFBFBD>~<7E>A<EFBFBD>L','fmak@hoge.jp','ccc',0,11);
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department) VALUES ('<EFBFBD>یˏ͉<EFBFBD>','<EFBFBD>}<7D><><EFBFBD>g<EFBFBD>V<EFBFBD><56><EFBFBD>E<EFBFBD>X<EFBFBD>P','marusyo@hoge.jp','ddd',0,12);
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department) VALUES ('<EFBFBD>O<EFBFBD>','<EFBFBD>~<7E><><EFBFBD>P<EFBFBD>^<5E>P<EFBFBD>V','miya@hoge.jp','eee',0,13);
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department) VALUES ('<EFBFBD>ۈ<EFBFBD><EFBFBD>I','<EFBFBD>}<7D><><EFBFBD>C<EFBFBD>n<EFBFBD><6E><EFBFBD>J','haru@hoge.jp','fff',0,13);
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department) VALUES ('<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D','<EFBFBD>X<EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>J<EFBFBD>I<EFBFBD><EFBFBD>','suzumoto@hoge.jp','ggg',0,13);
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department) VALUES ('<EFBFBD>t<EFBFBD>R<EFBFBD><EFBFBD>','<EFBFBD>n<EFBFBD><EFBFBD><EFBFBD>}<7D>~<7E>m<EFBFBD><6D>','mhayama@hoge.jp','hhh',0,14);
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department) VALUES ('<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>闢','<EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>~<7E>A<EFBFBD>J<EFBFBD><4A>','kawakami@hoge.jp','iii',0,14);
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department) VALUES ('<EFBFBD><EFBFBD><EFBFBD>䔣','<EFBFBD>X<EFBFBD>M<EFBFBD>C<EFBFBD>n<EFBFBD>W<EFBFBD><EFBFBD>','sugi@hoge.jp','jjj',0,15);
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department, hire_date) VALUES ('<EFBFBD>R<EFBFBD>c<EFBFBD><EFBFBD><EFBFBD><EFBFBD>','<EFBFBD><EFBFBD><EFBFBD>}<7D>_<EFBFBD>^<5E>c<EFBFBD><63>','yamada@hoge.jp','aaa',1,10,'1990-01-01');
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department, hire_date) VALUES ('<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>','<EFBFBD>^<5E>J<EFBFBD>n<EFBFBD>V<EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD>','jtaka@hoge.jp','bbb',0,10,'2000-02-02');
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department, hire_date) VALUES ('<EFBFBD><EFBFBD><EFBFBD>}<7D>j<EFBFBD><6A>','<EFBFBD>}<7D>G<EFBFBD>_<EFBFBD>t<EFBFBD>~<7E>A<EFBFBD>L','fmak@hoge.jp','ccc',0,11,'1990-02-02');
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department, hire_date) VALUES ('<EFBFBD>یˏ͉<EFBFBD>','<EFBFBD>}<7D><><EFBFBD>g<EFBFBD>V<EFBFBD><56><EFBFBD>E<EFBFBD>X<EFBFBD>P','marusyo@hoge.jp','ddd',0,12,'1990-03-03');
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department, hire_date) VALUES ('<EFBFBD>O<EFBFBD>','<EFBFBD>~<7E><><EFBFBD>P<EFBFBD>^<5E>P<EFBFBD>V','miya@hoge.jp','eee',0,13,'1999-04-04');
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department, hire_date) VALUES ('<EFBFBD>ۈ<EFBFBD><EFBFBD>I','<EFBFBD>}<7D><><EFBFBD>C<EFBFBD>n<EFBFBD><6E><EFBFBD>J','haru@hoge.jp','fff',0,13,'2000-03-03');
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department, hire_date) VALUES ('<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D','<EFBFBD>X<EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>J<EFBFBD>I<EFBFBD><EFBFBD>','suzumoto@hoge.jp','ggg',0,13,'2001-05-05');
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department, hire_date) VALUES ('<EFBFBD>t<EFBFBD>R<EFBFBD><EFBFBD>','<EFBFBD>n<EFBFBD><EFBFBD><EFBFBD>}<7D>~<7E>m<EFBFBD><6D>','mhayama@hoge.jp','hhh',0,14,'2016-08-08');
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department, hire_date) VALUES ('<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>闢','<EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>~<7E>A<EFBFBD>J<EFBFBD><4A>','kawakami@hoge.jp','iii',0,14,'2025-10-10');
INSERT INTO employee (nm_employee, kn_employee, mail_address, password, admin_auth, id_department, hire_date) VALUES ('<EFBFBD><EFBFBD><EFBFBD>䔣','<EFBFBD>X<EFBFBD>M<EFBFBD>C<EFBFBD>n<EFBFBD>W<EFBFBD><EFBFBD>','sugi@hoge.jp','jjj',0,15,'2026-04-04');
-- <20><><EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>[<5B>u<EFBFBD><75><EFBFBD>̃f<CC83>[<5B>^
INSERT INTO department (nm_department) VALUES ('<EFBFBD><EFBFBD><EFBFBD><EFBFBD>');

Binary file not shown.