| @@ -0,0 +1,32 @@ | |||
| package com.ffii.tsms.modules.data.entity | |||
| import com.ffii.core.entity.IdEntity | |||
| import jakarta.persistence.Column | |||
| import jakarta.persistence.Entity | |||
| import jakarta.persistence.Table | |||
| import jakarta.validation.constraints.NotNull | |||
| import org.hibernate.proxy.HibernateProxy | |||
| @Entity | |||
| @Table(name = "building_type") | |||
| open class BuildingType : IdEntity<Long>() { | |||
| @NotNull | |||
| @Column(name = "name") | |||
| open var name: String? = null | |||
| final override fun equals(other: Any?): Boolean { | |||
| if (this === other) return true | |||
| if (other == null) return false | |||
| val oEffectiveClass = | |||
| if (other is HibernateProxy) other.hibernateLazyInitializer.persistentClass else other.javaClass | |||
| val thisEffectiveClass = | |||
| if (this is HibernateProxy) this.hibernateLazyInitializer.persistentClass else this.javaClass | |||
| if (thisEffectiveClass != oEffectiveClass) return false | |||
| other as BuildingType | |||
| return id != null && id == other.id | |||
| } | |||
| final override fun hashCode(): Int = | |||
| if (this is HibernateProxy) this.hibernateLazyInitializer.persistentClass.hashCode() else javaClass.hashCode() | |||
| } | |||
| @@ -0,0 +1,15 @@ | |||
| package com.ffii.tsms.modules.data.entity | |||
| import com.ffii.core.entity.IdEntity | |||
| import jakarta.persistence.Column | |||
| import jakarta.persistence.Entity | |||
| import jakarta.persistence.Table | |||
| import jakarta.validation.constraints.NotNull | |||
| @Entity | |||
| @Table(name = "contract_type") | |||
| open class ContractType : IdEntity<Long>() { | |||
| @NotNull | |||
| @Column(name = "name") | |||
| open var name: String? = null | |||
| } | |||
| @@ -0,0 +1,15 @@ | |||
| package com.ffii.tsms.modules.data.entity | |||
| import com.ffii.core.entity.IdEntity | |||
| import jakarta.persistence.Column | |||
| import jakarta.persistence.Entity | |||
| import jakarta.persistence.Table | |||
| import jakarta.validation.constraints.NotNull | |||
| @Entity | |||
| @Table(name = "funding_type") | |||
| open class FundingType : IdEntity<Long>() { | |||
| @NotNull | |||
| @Column(name = "name") | |||
| open var name: String? = null | |||
| } | |||
| @@ -0,0 +1,15 @@ | |||
| package com.ffii.tsms.modules.data.entity | |||
| import com.ffii.core.entity.IdEntity | |||
| import jakarta.persistence.Column | |||
| import jakarta.persistence.Entity | |||
| import jakarta.persistence.Table | |||
| import jakarta.validation.constraints.NotNull | |||
| @Entity | |||
| @Table(name = "location") | |||
| open class Location : IdEntity<Long>() { | |||
| @NotNull | |||
| @Column(name = "name") | |||
| open var name: String? = null | |||
| } | |||
| @@ -0,0 +1,15 @@ | |||
| package com.ffii.tsms.modules.data.entity | |||
| import com.ffii.core.entity.IdEntity | |||
| import jakarta.persistence.Column | |||
| import jakarta.persistence.Entity | |||
| import jakarta.persistence.Table | |||
| import jakarta.validation.constraints.NotNull | |||
| @Entity | |||
| @Table(name = "service_type") | |||
| open class ServiceType : IdEntity<Long>() { | |||
| @NotNull | |||
| @Column(name = "name") | |||
| open var name: String? = null | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| package com.ffii.tsms.modules.data.entity | |||
| import com.ffii.core.entity.IdEntity | |||
| import jakarta.persistence.Column | |||
| import jakarta.persistence.Entity | |||
| import jakarta.persistence.Table | |||
| import jakarta.validation.constraints.NotNull | |||
| import org.hibernate.proxy.HibernateProxy | |||
| @Entity | |||
| @Table(name = "work_nature") | |||
| open class WorkNature : IdEntity<Long>() { | |||
| @NotNull | |||
| @Column(name = "name") | |||
| open var name: String? = null | |||
| final override fun equals(other: Any?): Boolean { | |||
| if (this === other) return true | |||
| if (other == null) return false | |||
| val oEffectiveClass = | |||
| if (other is HibernateProxy) other.hibernateLazyInitializer.persistentClass else other.javaClass | |||
| val thisEffectiveClass = | |||
| if (this is HibernateProxy) this.hibernateLazyInitializer.persistentClass else this.javaClass | |||
| if (thisEffectiveClass != oEffectiveClass) return false | |||
| other as WorkNature | |||
| return id != null && id == other.id | |||
| } | |||
| final override fun hashCode(): Int = | |||
| if (this is HibernateProxy) this.hibernateLazyInitializer.persistentClass.hashCode() else javaClass.hashCode() | |||
| } | |||
| @@ -10,13 +10,13 @@ interface StaffSearchInfo { | |||
| val staffId: String? | |||
| val name: String? | |||
| @get:Value("#{target.team.code}") | |||
| @get:Value("#{target.team?.code}") | |||
| val team: String? | |||
| @get:Value("#{target.grade.name}") | |||
| @get:Value("#{target.grade?.name}") | |||
| val grade: String? | |||
| @get:Value("#{target.currentPosition.name}") | |||
| @get:Value("#{target.currentPosition?.name}") | |||
| val currentPosition: String? | |||
| } | |||
| @@ -1,97 +1,96 @@ | |||
| package com.ffii.tsms.modules.data.service | |||
| import com.ffii.tsms.modules.data.entity.Staff | |||
| import com.ffii.tsms.modules.data.entity.StaffRepository | |||
| import com.ffii.tsms.modules.user.entity.UserRepository | |||
| import com.ffii.tsms.modules.data.entity.PositionRepository | |||
| import com.ffii.tsms.modules.data.entity.CompanyRepository | |||
| import com.ffii.tsms.modules.data.entity.GradeRepository | |||
| import com.ffii.tsms.modules.data.entity.TeamRepository | |||
| import com.ffii.tsms.modules.data.entity.SkillRepository | |||
| import com.ffii.tsms.modules.data.entity.SalaryEffectiveRepository | |||
| import com.ffii.tsms.modules.data.entity.DepartmentRepository | |||
| import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo | |||
| import com.ffii.tsms.modules.project.web.models.NewStaffRequest | |||
| // import com.ffii.tsms.modules.data.web.models.NewStaffRequest | |||
| import org.springframework.stereotype.Service | |||
| import com.ffii.core.support.JdbcDao; | |||
| import com.ffii.core.support.AbstractBaseEntityService; | |||
| @Service | |||
| public final class StaffsService( | |||
| private val staffRepository: StaffRepository, | |||
| private val userRepository: UserRepository, | |||
| private val positionRepository: PositionRepository, | |||
| private val companyRepository: CompanyRepository, | |||
| private val gradeRepository: GradeRepository, | |||
| private val teamRepository: TeamRepository, | |||
| private val skillRepository: SkillRepository, | |||
| private val salaryEffectiveRepository: SalaryEffectiveRepository, | |||
| private val departmentRepository: DepartmentRepository, | |||
| private val jdbcDao: JdbcDao, | |||
| ) { | |||
| fun getTeamLeads(): List<Staff> { | |||
| // TODO: Replace with actual logic and make a projection instead of returning all fields | |||
| return staffRepository.findAll() | |||
| } | |||
| fun allStaff(): List<StaffSearchInfo> { | |||
| return staffRepository.findStaffSearchInfoBy(); | |||
| } | |||
| // fun fetchStaffList(args: Map<String, Any>): List<Map<String, Any>> { | |||
| // val sql = StringBuilder("select" | |||
| // + " s.*," | |||
| // + " date_format(s.created, '%Y-%m-%d') as created," | |||
| // + " date_format(s.departDate, '%Y-%m-%d') as departDate," | |||
| // + " date_format(s.joinDate, '%Y-%m-%d') as joinDate" | |||
| // + " from staff s" | |||
| // + " where s.deleted = false" | |||
| // ) | |||
| // if (args != null) { | |||
| // if (args.containsKey("staffId")) | |||
| // sql.append(" AND s.staffId = :staffId "); | |||
| // } | |||
| // return jdbcDao.queryForList(sql.toString(), args) | |||
| // } | |||
| fun saveStaff(req: NewStaffRequest): Staff { | |||
| val user = userRepository.findById(req.userId).orElseThrow() | |||
| val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() | |||
| val joinPosition = positionRepository.findById(req.joinPositionId).orElseThrow() | |||
| val company = companyRepository.findById(req.companyId).orElseThrow() | |||
| val grade = gradeRepository.findById(req.gradeId).orElseThrow() | |||
| val team = teamRepository.findById(req.teamId).orElseThrow() | |||
| val skill = skillRepository.findById(req.skillSetId).orElseThrow() | |||
| val salaryEffective = salaryEffectiveRepository.findById(req.salaryEffId).orElseThrow() | |||
| val department = departmentRepository.findById(req.departmentId).orElseThrow() | |||
| // // TODO: Add tasks, milestones, allocated | |||
| val staff = Staff().apply { | |||
| joinDate = req.joinDate | |||
| name = req.name | |||
| staffId = req.staffId | |||
| phone1 = req.phone1 | |||
| phone2 = req.phone2 | |||
| email = req.email | |||
| emergContactName = req.emergContactName | |||
| emergContactPhone = req.emergContactPhone | |||
| employType = req.employType | |||
| departDate = req.departDate | |||
| departReason = req.departReason | |||
| remark = req.remark | |||
| this.user = user | |||
| this.currentPosition = currentPosition | |||
| this.joinPosition = joinPosition | |||
| this.company = company | |||
| this.grade = grade | |||
| this.team = team | |||
| this.skill = skill | |||
| this.salaryEffective = salaryEffective | |||
| this.department = department | |||
| } | |||
| return staffRepository.save(staff) | |||
| } | |||
| package com.ffii.tsms.modules.data.service | |||
| import com.ffii.tsms.modules.data.entity.Staff | |||
| import com.ffii.tsms.modules.data.entity.StaffRepository | |||
| import com.ffii.tsms.modules.user.entity.UserRepository | |||
| import com.ffii.tsms.modules.data.entity.PositionRepository | |||
| import com.ffii.tsms.modules.data.entity.CompanyRepository | |||
| import com.ffii.tsms.modules.data.entity.GradeRepository | |||
| import com.ffii.tsms.modules.data.entity.TeamRepository | |||
| import com.ffii.tsms.modules.data.entity.SkillRepository | |||
| import com.ffii.tsms.modules.data.entity.SalaryEffectiveRepository | |||
| import com.ffii.tsms.modules.data.entity.DepartmentRepository | |||
| import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo | |||
| import com.ffii.tsms.modules.project.web.models.NewStaffRequest | |||
| // import com.ffii.tsms.modules.data.web.models.NewStaffRequest | |||
| import org.springframework.stereotype.Service | |||
| import com.ffii.core.support.JdbcDao; | |||
| import com.ffii.core.support.AbstractBaseEntityService; | |||
| @Service | |||
| public final class StaffsService( | |||
| private val staffRepository: StaffRepository, | |||
| private val userRepository: UserRepository, | |||
| private val positionRepository: PositionRepository, | |||
| private val companyRepository: CompanyRepository, | |||
| private val gradeRepository: GradeRepository, | |||
| private val teamRepository: TeamRepository, | |||
| private val skillRepository: SkillRepository, | |||
| private val salaryEffectiveRepository: SalaryEffectiveRepository, | |||
| private val departmentRepository: DepartmentRepository, | |||
| private val jdbcDao: JdbcDao, | |||
| ) { | |||
| fun getTeamLeads(): List<StaffSearchInfo> { | |||
| // TODO: Replace with actual logic and make a projection instead of returning all fields | |||
| return staffRepository.findStaffSearchInfoBy() | |||
| } | |||
| fun allStaff(): List<StaffSearchInfo> { | |||
| return staffRepository.findStaffSearchInfoBy(); | |||
| } | |||
| // fun fetchStaffList(args: Map<String, Any>): List<Map<String, Any>> { | |||
| // val sql = StringBuilder("select" | |||
| // + " s.*," | |||
| // + " date_format(s.created, '%Y-%m-%d') as created," | |||
| // + " date_format(s.departDate, '%Y-%m-%d') as departDate," | |||
| // + " date_format(s.joinDate, '%Y-%m-%d') as joinDate" | |||
| // + " from staff s" | |||
| // + " where s.deleted = false" | |||
| // ) | |||
| // if (args != null) { | |||
| // if (args.containsKey("staffId")) | |||
| // sql.append(" AND s.staffId = :staffId "); | |||
| // } | |||
| // return jdbcDao.queryForList(sql.toString(), args) | |||
| // } | |||
| fun saveStaff(req: NewStaffRequest): Staff { | |||
| val user = userRepository.findById(req.userId).orElseThrow() | |||
| val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() | |||
| val joinPosition = positionRepository.findById(req.joinPositionId).orElseThrow() | |||
| val company = companyRepository.findById(req.companyId).orElseThrow() | |||
| val grade = gradeRepository.findById(req.gradeId).orElseThrow() | |||
| val team = teamRepository.findById(req.teamId).orElseThrow() | |||
| val skill = skillRepository.findById(req.skillSetId).orElseThrow() | |||
| val salaryEffective = salaryEffectiveRepository.findById(req.salaryEffId).orElseThrow() | |||
| val department = departmentRepository.findById(req.departmentId).orElseThrow() | |||
| // // TODO: Add tasks, milestones, allocated | |||
| val staff = Staff().apply { | |||
| joinDate = req.joinDate | |||
| name = req.name | |||
| staffId = req.staffId | |||
| phone1 = req.phone1 | |||
| phone2 = req.phone2 | |||
| email = req.email | |||
| emergContactName = req.emergContactName | |||
| emergContactPhone = req.emergContactPhone | |||
| employType = req.employType | |||
| departDate = req.departDate | |||
| departReason = req.departReason | |||
| remark = req.remark | |||
| this.user = user | |||
| this.currentPosition = currentPosition | |||
| this.joinPosition = joinPosition | |||
| this.company = company | |||
| this.grade = grade | |||
| this.team = team | |||
| this.skill = skill | |||
| this.salaryEffective = salaryEffective | |||
| this.department = department | |||
| } | |||
| return staffRepository.save(staff) | |||
| } | |||
| } | |||
| @@ -1,48 +1,43 @@ | |||
| package com.ffii.tsms.modules.data.web | |||
| import com.ffii.tsms.modules.data.entity.Staff | |||
| import com.ffii.tsms.modules.data.service.StaffsService | |||
| import org.springframework.web.bind.annotation.GetMapping | |||
| import org.springframework.web.bind.annotation.RequestMapping | |||
| import org.springframework.web.bind.annotation.RestController | |||
| import org.springframework.web.bind.annotation.PostMapping | |||
| import org.springframework.web.bind.annotation.RequestBody | |||
| import com.ffii.tsms.modules.project.web.models.NewStaffRequest | |||
| import jakarta.validation.Valid | |||
| import org.springframework.web.bind.annotation.* | |||
| import jakarta.servlet.http.HttpServletRequest; | |||
| import com.ffii.core.utils.CriteriaArgsBuilder; | |||
| import com.ffii.core.response.IdRes; | |||
| import com.ffii.core.response.RecordsRes; | |||
| import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo | |||
| @RestController | |||
| @RequestMapping("/staffs") | |||
| class StaffsController(private val staffsService: StaffsService) { | |||
| @GetMapping("/teamLeads") | |||
| fun teamLeads(): List<Staff> { | |||
| return staffsService.getTeamLeads() | |||
| } | |||
| @GetMapping | |||
| fun allStaff(): List<StaffSearchInfo> { | |||
| return staffsService.allStaff() | |||
| } | |||
| @GetMapping("/list") | |||
| fun list(): List<Staff> { | |||
| return staffsService.getTeamLeads() | |||
| } | |||
| @PostMapping("/new") | |||
| fun saveStaff(@Valid @RequestBody newStaff: NewStaffRequest): Staff { | |||
| return staffsService.saveStaff(newStaff) | |||
| } | |||
| // @GetMapping("/newlist") | |||
| // fun list(request: HttpServletRequest): RecordsRes<Map<String, Any>> { | |||
| // return RecordsRes(staffsService.fetchStaffList( | |||
| // CriteriaArgsBuilder.withRequest(request) | |||
| // .addString("staffId") | |||
| // .build() | |||
| // )) | |||
| // } | |||
| package com.ffii.tsms.modules.data.web | |||
| import com.ffii.tsms.modules.data.entity.Staff | |||
| import com.ffii.tsms.modules.data.service.StaffsService | |||
| import org.springframework.web.bind.annotation.GetMapping | |||
| import org.springframework.web.bind.annotation.RequestMapping | |||
| import org.springframework.web.bind.annotation.RestController | |||
| import org.springframework.web.bind.annotation.PostMapping | |||
| import org.springframework.web.bind.annotation.RequestBody | |||
| import com.ffii.tsms.modules.project.web.models.NewStaffRequest | |||
| import jakarta.validation.Valid | |||
| import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo | |||
| @RestController | |||
| @RequestMapping("/staffs") | |||
| class StaffsController(private val staffsService: StaffsService) { | |||
| @GetMapping("/teamLeads") | |||
| fun teamLeads(): List<StaffSearchInfo> { | |||
| return staffsService.getTeamLeads() | |||
| } | |||
| @GetMapping | |||
| fun allStaff(): List<StaffSearchInfo> { | |||
| return staffsService.allStaff() | |||
| } | |||
| // @GetMapping("/list") | |||
| // fun list(): List<Staff> { | |||
| // return staffsService.getTeamLeads() | |||
| // } | |||
| @PostMapping("/new") | |||
| fun saveStaff(@Valid @RequestBody newStaff: NewStaffRequest): Staff { | |||
| return staffsService.saveStaff(newStaff) | |||
| } | |||
| // @GetMapping("/newlist") | |||
| // fun list(request: HttpServletRequest): RecordsRes<Map<String, Any>> { | |||
| // return RecordsRes(staffsService.fetchStaffList( | |||
| // CriteriaArgsBuilder.withRequest(request) | |||
| // .addString("staffId") | |||
| // .build() | |||
| // )) | |||
| // } | |||
| } | |||
| @@ -1,8 +1,7 @@ | |||
| package com.ffii.tsms.modules.project.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import com.ffii.tsms.modules.data.entity.Customer | |||
| import com.ffii.tsms.modules.data.entity.Staff | |||
| import com.ffii.tsms.modules.data.entity.* | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| import java.time.LocalDate | |||
| @@ -60,4 +59,39 @@ open class Project : BaseEntity<Long>() { | |||
| @Column(name = "billStatus") | |||
| open var billStatus: Boolean? = null | |||
| @Column(name = "expectedTotalFee") | |||
| open var expectedTotalFee: Double? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "serviceTypeId") | |||
| open var serviceType: ServiceType? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "fundingTypeId") | |||
| open var fundingType: FundingType? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "contractTypeId") | |||
| open var contractType: ContractType? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "locationId") | |||
| open var location: Location? = null | |||
| @ManyToMany | |||
| @JoinTable( | |||
| name = "project_buildingTypes", | |||
| joinColumns = [JoinColumn(name = "projectId")], | |||
| inverseJoinColumns = [JoinColumn(name = "buildingTypesId")] | |||
| ) | |||
| open var buildingTypes: MutableSet<BuildingType> = mutableSetOf() | |||
| @ManyToMany | |||
| @JoinTable( | |||
| name = "project_workNatures", | |||
| joinColumns = [JoinColumn(name = "projectId")], | |||
| inverseJoinColumns = [JoinColumn(name = "workNaturesId")] | |||
| ) | |||
| open var workNatures: MutableSet<WorkNature> = mutableSetOf() | |||
| } | |||
| @@ -1,7 +1,7 @@ | |||
| package com.ffii.tsms.modules.project.entity; | |||
| import com.ffii.core.support.AbstractRepository | |||
| import com.ffii.tsms.modules.data.entity.projections.ProjectSearchInfo | |||
| import com.ffii.tsms.modules.project.entity.projections.ProjectSearchInfo | |||
| interface ProjectRepository : AbstractRepository<Project, Long> { | |||
| fun findProjectSearchInfoBy(): List<ProjectSearchInfo> | |||
| @@ -1,4 +1,4 @@ | |||
| package com.ffii.tsms.modules.data.entity.projections | |||
| package com.ffii.tsms.modules.project.entity.projections | |||
| import org.springframework.beans.factory.annotation.Value | |||
| @@ -1,14 +1,13 @@ | |||
| package com.ffii.tsms.modules.project.service | |||
| import com.ffii.tsms.modules.data.entity.StaffRepository | |||
| import com.ffii.tsms.modules.data.entity.projections.ProjectSearchInfo | |||
| import com.ffii.tsms.modules.project.entity.projections.ProjectSearchInfo | |||
| import com.ffii.tsms.modules.data.service.CustomerService | |||
| import com.ffii.tsms.modules.project.entity.Project | |||
| import com.ffii.tsms.modules.project.entity.ProjectCategory | |||
| import com.ffii.tsms.modules.project.entity.ProjectCategoryRepository | |||
| import com.ffii.tsms.modules.project.entity.ProjectRepository | |||
| import com.ffii.tsms.modules.project.web.models.NewProjectRequest | |||
| import com.ffii.tsms.modules.project.web.models.SaveCustomerRequest | |||
| import org.springframework.stereotype.Service | |||
| @Service | |||
| @@ -1,6 +1,6 @@ | |||
| package com.ffii.tsms.modules.project.web | |||
| import com.ffii.tsms.modules.data.entity.projections.ProjectSearchInfo | |||
| import com.ffii.tsms.modules.project.entity.projections.ProjectSearchInfo | |||
| import com.ffii.tsms.modules.project.entity.Project | |||
| import com.ffii.tsms.modules.project.entity.ProjectCategory | |||
| import com.ffii.tsms.modules.project.service.ProjectsService | |||
| @@ -0,0 +1,27 @@ | |||
| -- liquibase formatted sql | |||
| -- changeset wayne:service_type | |||
| CREATE TABLE service_type ( | |||
| id INT NOT NULL AUTO_INCREMENT, | |||
| name VARCHAR(255) NOT NULL, | |||
| CONSTRAINT pk_service_type PRIMARY KEY (id) | |||
| ); | |||
| INSERT | |||
| INTO | |||
| service_type | |||
| (name) | |||
| VALUES | |||
| ('Audit'), | |||
| ('Cost Management'), | |||
| ('Direct Contract'), | |||
| ('Due Diligence'), | |||
| ('Estimate'), | |||
| ('Expert Report'), | |||
| ('Feasibility'), | |||
| ('Final Account'), | |||
| ('Full QS Services'), | |||
| ('Joint Venture'), | |||
| ('Measurement'), | |||
| ('Post Contract'), | |||
| ('Sub-Consultants'); | |||
| @@ -0,0 +1,17 @@ | |||
| -- liquibase formatted sql | |||
| -- changeset wayne:funding_type | |||
| CREATE TABLE funding_type ( | |||
| id INT NOT NULL AUTO_INCREMENT, | |||
| name VARCHAR(255) NOT NULL, | |||
| CONSTRAINT pk_funding_type PRIMARY KEY (id) | |||
| ); | |||
| INSERT | |||
| INTO | |||
| funding_type | |||
| (name) | |||
| VALUES | |||
| ('Government'), | |||
| ('Private'), | |||
| ('Subvented'); | |||
| @@ -0,0 +1,19 @@ | |||
| -- liquibase formatted sql | |||
| -- changeset wayne:contract_type | |||
| CREATE TABLE contract_type ( | |||
| id INT NOT NULL AUTO_INCREMENT, | |||
| name VARCHAR(255) NOT NULL, | |||
| CONSTRAINT pk_contract_type PRIMARY KEY (id) | |||
| ); | |||
| INSERT | |||
| INTO | |||
| contract_type | |||
| (name) | |||
| VALUES | |||
| ('Bills of Quantities'), | |||
| ('Design and Build'), | |||
| ('Schedule of Rate'), | |||
| ('Specification Drawings'), | |||
| ('Term Contract'); | |||
| @@ -0,0 +1,18 @@ | |||
| -- liquibase formatted sql | |||
| -- changeset wayne:location | |||
| CREATE TABLE location ( | |||
| id INT NOT NULL AUTO_INCREMENT, | |||
| name VARCHAR(255) NOT NULL, | |||
| CONSTRAINT pk_location PRIMARY KEY (id) | |||
| ); | |||
| INSERT | |||
| INTO | |||
| location | |||
| (name) | |||
| VALUES | |||
| ('Hong Kong'), | |||
| ('China'), | |||
| ('Macau'), | |||
| ('Others'); | |||
| @@ -0,0 +1,30 @@ | |||
| -- liquibase formatted sql | |||
| -- changeset wayne:building_type | |||
| CREATE TABLE building_type ( | |||
| id INT NOT NULL AUTO_INCREMENT, | |||
| name VARCHAR(255) NOT NULL, | |||
| CONSTRAINT pk_building_type PRIMARY KEY (id) | |||
| ); | |||
| INSERT | |||
| INTO | |||
| building_type | |||
| (name) | |||
| VALUES | |||
| ('Residential'), | |||
| ('Office'), | |||
| ('Commercial'), | |||
| ('Hotel & Resort'), | |||
| ('Entertainment & Leisure'), | |||
| ('Hospital'), | |||
| ('School'), | |||
| ('Post Secondary College'), | |||
| ('Industrial'), | |||
| ('Data Center'), | |||
| ('Open Space'), | |||
| ('Civil Engineering'), | |||
| ('Electricity'), | |||
| ('Public Transportation'), | |||
| ('Retail'), | |||
| ('Others'); | |||
| @@ -0,0 +1,21 @@ | |||
| -- liquibase formatted sql | |||
| -- changeset wayne:work_nature | |||
| CREATE TABLE work_nature ( | |||
| id INT NOT NULL AUTO_INCREMENT, | |||
| name VARCHAR(255) NOT NULL, | |||
| CONSTRAINT pk_work_nature PRIMARY KEY (id) | |||
| ); | |||
| INSERT | |||
| INTO | |||
| work_nature | |||
| (name) | |||
| VALUES | |||
| ('New Capital Works'), | |||
| ('Maintenance Term Contract'), | |||
| ('Addition and Alteration'), | |||
| ('Civil Works'), | |||
| ('Fitting Out Works'), | |||
| ('Revitalization'), | |||
| ('Others'); | |||
| @@ -0,0 +1,10 @@ | |||
| -- liquibase formatted sql | |||
| -- changeset wayne:update_project_category | |||
| UPDATE | |||
| project_category | |||
| SET | |||
| name = 'Awarded Project' | |||
| WHERE | |||
| id = 2 | |||
| ; | |||
| @@ -0,0 +1,4 @@ | |||
| -- liquibase formatted sql | |||
| -- changeset wayne:update_project_expected_total_fee | |||
| ALTER TABLE project ADD expectedTotalFee DOUBLE NULL; | |||
| @@ -0,0 +1,32 @@ | |||
| -- liquibase formatted sql | |||
| -- changeset wayne:update_project_types | |||
| ALTER TABLE project ADD serviceTypeId INT NULL, ADD fundingTypeId INT NULL, ADD contractTypeId INT NULL, ADD locationId INT NULL; | |||
| ALTER TABLE project ADD CONSTRAINT FK_PROJECT_ON_CONTRACTTYPEID FOREIGN KEY (contractTypeId) REFERENCES contract_type (id); | |||
| ALTER TABLE project ADD CONSTRAINT FK_PROJECT_ON_FUNDINGTYPEID FOREIGN KEY (fundingTypeId) REFERENCES funding_type (id); | |||
| ALTER TABLE project ADD CONSTRAINT FK_PROJECT_ON_LOCATIONID FOREIGN KEY (locationId) REFERENCES location (id); | |||
| ALTER TABLE project ADD CONSTRAINT FK_PROJECT_ON_SERVICETYPEID FOREIGN KEY (serviceTypeId) REFERENCES service_type (id); | |||
| CREATE TABLE project_buildingTypes ( | |||
| buildingTypesId INT NOT NULL, | |||
| projectId INT NOT NULL, | |||
| CONSTRAINT pk_project_buildingtypes PRIMARY KEY (buildingTypesId, projectId) | |||
| ); | |||
| CREATE TABLE project_workNatures ( | |||
| projectId INT NOT NULL, | |||
| workNaturesId INT NOT NULL, | |||
| CONSTRAINT pk_project_worknatures PRIMARY KEY (projectId, workNaturesId) | |||
| ); | |||
| ALTER TABLE project_workNatures ADD CONSTRAINT fk_prowor_on_project FOREIGN KEY (projectId) REFERENCES project (id); | |||
| ALTER TABLE project_workNatures ADD CONSTRAINT fk_prowor_on_work_nature FOREIGN KEY (workNaturesId) REFERENCES work_nature (id); | |||
| ALTER TABLE project_buildingTypes ADD CONSTRAINT fk_probui_on_building_type FOREIGN KEY (buildingTypesId) REFERENCES building_type (id); | |||
| ALTER TABLE project_buildingTypes ADD CONSTRAINT fk_probui_on_project FOREIGN KEY (projectId) REFERENCES project (id); | |||