Reviewed-on: https://git.2fi-solutions.com/davidhui/TSMS-backend/pulls/2tags/Baseline_30082024_BACKEND_UAT
| @@ -35,3 +35,6 @@ out/ | |||||
| ### VS Code ### | ### VS Code ### | ||||
| .vscode/ | .vscode/ | ||||
| ### JPA Buddy ### | |||||
| .jpb/ | |||||
| @@ -1,11 +1,9 @@ | |||||
| # Backend readme | |||||
| 1. Create a schema named "tsmsdb" in MySQL workbench | |||||
| 2. Put the launch.json file into the .vscode folder | |||||
| 3. Put the settings.json file into the .vscode folder | |||||
| 4. Run and Debug "Launch Local" | |||||
| # TSMS Backend | |||||
| # launch.json | |||||
| ``` | |||||
| ## Getting started | |||||
| 1. Create a schema named `tsmsdb` in MySQL workbench | |||||
| 2. Create a `launch.json` file and put it into the `.vscode` folder | |||||
| ```json | |||||
| { | { | ||||
| "version": "0.2.0", | "version": "0.2.0", | ||||
| "configurations": [ | "configurations": [ | ||||
| @@ -28,12 +26,24 @@ | |||||
| ] | ] | ||||
| } | } | ||||
| ``` | ``` | ||||
| # settings.json | |||||
| You may need to change some settings depending on your development environment | |||||
| ``` | |||||
| 3. Create a `settings.json` file and put it into the `.vscode` folder | |||||
| *(You may need to change some settings depending on your development environment)* | |||||
| ```json | |||||
| { | { | ||||
| "java.configuration.updateBuildConfiguration": "interactive", | "java.configuration.updateBuildConfiguration": "interactive", | ||||
| "java.jdt.ls.java.home": "C:\\java\\jdk-17.0.8", | "java.jdt.ls.java.home": "C:\\java\\jdk-17.0.8", | ||||
| "java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx2G -Xms100m -Xlog:disable" | "java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx2G -Xms100m -Xlog:disable" | ||||
| } | } | ||||
| ``` | |||||
| ``` | |||||
| 4. Run and Debug "Launch Local" | |||||
| ## Using gradle | |||||
| This project can also be run using gradle. | |||||
| ### Running the application | |||||
| After creating the table in MySQL, run | |||||
| ```shell | |||||
| SPRING_PROFILES_ACTIVE=db-local,ldap-local ./gradlew bootRun | |||||
| ``` | |||||
| @@ -2,13 +2,13 @@ plugins { | |||||
| id 'java' | id 'java' | ||||
| id 'org.springframework.boot' version '3.1.1' | id 'org.springframework.boot' version '3.1.1' | ||||
| id 'io.spring.dependency-management' version '1.1.0' | id 'io.spring.dependency-management' version '1.1.0' | ||||
| id 'org.jetbrains.kotlin.jvm' | |||||
| } | } | ||||
| group = 'com.ffii' | group = 'com.ffii' | ||||
| version = '0.0.1-SNAPSHOT' | version = '0.0.1-SNAPSHOT' | ||||
| java { | java { | ||||
| sourceCompatibility = '17' | |||||
| } | } | ||||
| repositories { | repositories { | ||||
| @@ -22,10 +22,10 @@ dependencies { | |||||
| implementation 'org.springframework.boot:spring-boot-starter-security' | implementation 'org.springframework.boot:spring-boot-starter-security' | ||||
| implementation 'org.springframework.boot:spring-boot-starter-web' | implementation 'org.springframework.boot:spring-boot-starter-web' | ||||
| implementation 'org.springframework.boot:spring-boot-starter-validation' | implementation 'org.springframework.boot:spring-boot-starter-validation' | ||||
| implementation 'org.springframework.boot:spring-boot-starter-log4j2' | |||||
| implementation 'org.springframework.boot:spring-boot-starter-log4j2' | |||||
| implementation 'org.springframework.security:spring-security-ldap' | implementation 'org.springframework.security:spring-security-ldap' | ||||
| implementation 'org.liquibase:liquibase-core' | implementation 'org.liquibase:liquibase-core' | ||||
| implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0' | implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0' | ||||
| implementation group: 'org.apache.poi', name: 'poi', version: '5.2.3' | implementation group: 'org.apache.poi', name: 'poi', version: '5.2.3' | ||||
| implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '5.2.3' | implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '5.2.3' | ||||
| @@ -35,13 +35,18 @@ dependencies { | |||||
| implementation group: 'jakarta.validation', name: 'jakarta.validation-api', version: '3.0.2' | implementation group: 'jakarta.validation', name: 'jakarta.validation-api', version: '3.0.2' | ||||
| implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.15.2' | implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.15.2' | ||||
| implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.15.2' | implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.15.2' | ||||
| implementation group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.15.2' | |||||
| implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5' | implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5' | ||||
| implementation group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5' | implementation group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5' | ||||
| implementation group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5' | implementation group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5' | ||||
| implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" | |||||
| implementation "org.jetbrains.kotlin:kotlin-reflect" | |||||
| compileOnly group: 'jakarta.servlet', name: 'jakarta.servlet-api', version: '6.0.0' | compileOnly group: 'jakarta.servlet', name: 'jakarta.servlet-api', version: '6.0.0' | ||||
| runtimeOnly 'com.mysql:mysql-connector-j' | runtimeOnly 'com.mysql:mysql-connector-j' | ||||
| runtimeOnly 'com.unboundid:unboundid-ldapsdk:6.0.9' | runtimeOnly 'com.unboundid:unboundid-ldapsdk:6.0.9' | ||||
| @@ -50,7 +55,10 @@ dependencies { | |||||
| } | } | ||||
| configurations { | configurations { | ||||
| all { | |||||
| exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' | |||||
| } | |||||
| configureEach { | |||||
| exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' | |||||
| } | |||||
| } | |||||
| kotlin { | |||||
| jvmToolchain(17) | |||||
| } | } | ||||
| @@ -1 +1,9 @@ | |||||
| pluginManagement { | |||||
| plugins { | |||||
| id 'org.jetbrains.kotlin.jvm' version '1.9.21' | |||||
| } | |||||
| } | |||||
| plugins { | |||||
| id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0' | |||||
| } | |||||
| rootProject.name = 'TSMS-backend' | rootProject.name = 'TSMS-backend' | ||||
| @@ -0,0 +1,158 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| import java.time.LocalTime; | |||||
| @Entity | |||||
| @Table(name = "company") | |||||
| public class Company extends BaseEntity<Long> { | |||||
| @NotNull | |||||
| @Column(name = "companyCode", length = 30) | |||||
| private String companyCode; | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @Column(name = "brNo", length = 20) | |||||
| private String brNo; | |||||
| @Column(name = "contactName", length = 30) | |||||
| private String contactName; | |||||
| @Column(name = "phone", length = 20) | |||||
| private String phone; | |||||
| @Column(name = "otHourTo") | |||||
| private LocalTime otHourTo; | |||||
| @Column(name = "otHourFrom") | |||||
| private LocalTime otHourFrom; | |||||
| @Column(name = "normalHourTo") | |||||
| private LocalTime normalHourTo; | |||||
| @Column(name = "normalHourFrom") | |||||
| private LocalTime normalHourFrom; | |||||
| @Column(name = "currency", length = 20) | |||||
| private String currency; | |||||
| @Column(name = "address", length = 500) | |||||
| private String address; | |||||
| @Column(name = "district", length = 30) | |||||
| private String district; | |||||
| @Column(name = "email") | |||||
| private String email; | |||||
| public LocalTime getOtHourTo() { | |||||
| return otHourTo; | |||||
| } | |||||
| public void setOtHourTo(LocalTime otHourTo) { | |||||
| this.otHourTo = otHourTo; | |||||
| } | |||||
| public LocalTime getOtHourFrom() { | |||||
| return otHourFrom; | |||||
| } | |||||
| public void setOtHourFrom(LocalTime otHourFrom) { | |||||
| this.otHourFrom = otHourFrom; | |||||
| } | |||||
| public LocalTime getNormalHourTo() { | |||||
| return normalHourTo; | |||||
| } | |||||
| public void setNormalHourTo(LocalTime normalHourTo) { | |||||
| this.normalHourTo = normalHourTo; | |||||
| } | |||||
| public LocalTime getNormalHourFrom() { | |||||
| return normalHourFrom; | |||||
| } | |||||
| public void setNormalHourFrom(LocalTime normalHourFrom) { | |||||
| this.normalHourFrom = normalHourFrom; | |||||
| } | |||||
| public String getCurrency() { | |||||
| return currency; | |||||
| } | |||||
| public void setCurrency(String currency) { | |||||
| this.currency = currency; | |||||
| } | |||||
| public String getAddress() { | |||||
| return address; | |||||
| } | |||||
| public void setAddress(String address) { | |||||
| this.address = address; | |||||
| } | |||||
| public String getDistrict() { | |||||
| return district; | |||||
| } | |||||
| public void setDistrict(String district) { | |||||
| this.district = district; | |||||
| } | |||||
| public String getEmail() { | |||||
| return email; | |||||
| } | |||||
| public void setEmail(String email) { | |||||
| this.email = email; | |||||
| } | |||||
| public String getPhone() { | |||||
| return phone; | |||||
| } | |||||
| public void setPhone(String phone) { | |||||
| this.phone = phone; | |||||
| } | |||||
| public String getContactName() { | |||||
| return contactName; | |||||
| } | |||||
| public void setContactName(String contactName) { | |||||
| this.contactName = contactName; | |||||
| } | |||||
| public String getBrNo() { | |||||
| return brNo; | |||||
| } | |||||
| public void setBrNo(String brNo) { | |||||
| this.brNo = brNo; | |||||
| } | |||||
| public String getCompanyCode() { | |||||
| return companyCode; | |||||
| } | |||||
| public void setCompanyCode(String companyCode) { | |||||
| this.companyCode = companyCode; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,37 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| import java.time.LocalDate; | |||||
| @Entity | |||||
| @Table(name = "company_holiday") | |||||
| public class CompanyHoliday extends BaseEntity<Long> { | |||||
| @NotNull | |||||
| @Column(name = "date") | |||||
| private LocalDate date; | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| public LocalDate getDate() { | |||||
| return date; | |||||
| } | |||||
| public void setDate(LocalDate date) { | |||||
| this.date = date; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface CompanyHolidayRepository extends AbstractRepository<CompanyHoliday, Long> { | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface CompanyRepository extends AbstractRepository<Company, Long> { | |||||
| } | |||||
| @@ -0,0 +1,101 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| @Entity | |||||
| @Table(name = "customer") | |||||
| public class Customer extends BaseEntity<Long> { | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @NotNull | |||||
| @Column(name = "code", length = 30) | |||||
| private String code; | |||||
| @Column(name = "address", length = 500) | |||||
| private String address; | |||||
| @Column(name = "district", length = 30) | |||||
| private String district; | |||||
| @Column(name = "email") | |||||
| private String email; | |||||
| @Column(name = "phone", length = 20) | |||||
| private String phone; | |||||
| @Column(name = "contactName", length = 30) | |||||
| private String contactName; | |||||
| @Column(name = "brNo", length = 20) | |||||
| private String brNo; | |||||
| public String getAddress() { | |||||
| return address; | |||||
| } | |||||
| public void setAddress(String address) { | |||||
| this.address = address; | |||||
| } | |||||
| public String getDistrict() { | |||||
| return district; | |||||
| } | |||||
| public void setDistrict(String district) { | |||||
| this.district = district; | |||||
| } | |||||
| public String getEmail() { | |||||
| return email; | |||||
| } | |||||
| public void setEmail(String email) { | |||||
| this.email = email; | |||||
| } | |||||
| public String getPhone() { | |||||
| return phone; | |||||
| } | |||||
| public void setPhone(String phone) { | |||||
| this.phone = phone; | |||||
| } | |||||
| public String getContactName() { | |||||
| return contactName; | |||||
| } | |||||
| public void setContactName(String contactName) { | |||||
| this.contactName = contactName; | |||||
| } | |||||
| public String getBrNo() { | |||||
| return brNo; | |||||
| } | |||||
| public void setBrNo(String brNo) { | |||||
| this.brNo = brNo; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface CustomerRepository extends AbstractRepository<Customer, Long> { | |||||
| } | |||||
| @@ -0,0 +1,35 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.IdEntity; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.JoinColumn; | |||||
| import jakarta.persistence.ManyToOne; | |||||
| import jakarta.persistence.Table; | |||||
| @Entity | |||||
| @Table(name = "customer_subsidiary") | |||||
| public class CustomerSubsidiary extends IdEntity<Long> { | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "customerId") | |||||
| private Customer customer; | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "subsidiaryId") | |||||
| private Subsidiary subsidiary; | |||||
| public Subsidiary getSubsidiary() { | |||||
| return subsidiary; | |||||
| } | |||||
| public void setSubsidiary(Subsidiary subsidiary) { | |||||
| this.subsidiary = subsidiary; | |||||
| } | |||||
| public Customer getCustomer() { | |||||
| return customer; | |||||
| } | |||||
| public void setCustomerId(Customer customer) { | |||||
| this.customer = customer; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,46 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| @Entity | |||||
| @Table(name = "department") | |||||
| public class Department extends BaseEntity<Long> { | |||||
| @Column(name = "description", length = 1500) | |||||
| private String description; | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @NotNull | |||||
| @Column(name = "code", length = 30) | |||||
| private String code; | |||||
| public String getDescription() { | |||||
| return description; | |||||
| } | |||||
| public void setDescription(String description) { | |||||
| this.description = description; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface DepartmentRepository extends AbstractRepository<Department, Long> { | |||||
| } | |||||
| @@ -0,0 +1,46 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| @Entity | |||||
| @Table(name = "grade") | |||||
| public class Grade extends BaseEntity<Long> { | |||||
| @Column(name = "description", length = 1500) | |||||
| private String description; | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @NotNull | |||||
| @Column(name = "code", length = 30) | |||||
| private String code; | |||||
| public String getDescription() { | |||||
| return description; | |||||
| } | |||||
| public void setDescription(String description) { | |||||
| this.description = description; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface GradeRepository extends AbstractRepository<Grade, Long> { | |||||
| } | |||||
| @@ -0,0 +1,81 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| import java.time.LocalDate; | |||||
| @Entity | |||||
| @Table(name = "internal_rate") | |||||
| public class InternalRate extends BaseEntity<Long> { | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @NotNull | |||||
| @Column(name = "code", length = 30) | |||||
| private String code; | |||||
| @Column(name = "effectFrom") | |||||
| private LocalDate effectFrom; | |||||
| @Column(name = "effectTo") | |||||
| private LocalDate effectTo; | |||||
| @Column(name = "normalRate") | |||||
| private Double normalRate; | |||||
| @Column(name = "otRate") | |||||
| private Double otRate; | |||||
| public Double getOtRate() { | |||||
| return otRate; | |||||
| } | |||||
| public void setOtRate(Double otRate) { | |||||
| this.otRate = otRate; | |||||
| } | |||||
| public Double getNormalRate() { | |||||
| return normalRate; | |||||
| } | |||||
| public void setNormalRate(Double normalRate) { | |||||
| this.normalRate = normalRate; | |||||
| } | |||||
| public LocalDate getEffectTo() { | |||||
| return effectTo; | |||||
| } | |||||
| public void setEffectTo(LocalDate effectTo) { | |||||
| this.effectTo = effectTo; | |||||
| } | |||||
| public LocalDate getEffectFrom() { | |||||
| return effectFrom; | |||||
| } | |||||
| public void setEffectFrom(LocalDate effectFrom) { | |||||
| this.effectFrom = effectFrom; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,46 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| @Entity | |||||
| @Table(name = "position") | |||||
| public class Position extends BaseEntity<Long> { | |||||
| @Column(name = "description", length = 1500) | |||||
| private String description; | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @NotNull | |||||
| @Column(name = "code", length = 30) | |||||
| private String code; | |||||
| public String getDescription() { | |||||
| return description; | |||||
| } | |||||
| public void setDescription(String description) { | |||||
| this.description = description; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface PositionRepository extends AbstractRepository<Position, Long> { | |||||
| } | |||||
| @@ -0,0 +1,81 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| import java.time.LocalDate; | |||||
| @Entity | |||||
| @Table(name = "rate") | |||||
| public class Rate extends BaseEntity<Long> { | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @NotNull | |||||
| @Column(name = "code", length = 30) | |||||
| private String code; | |||||
| @Column(name = "effectFrom") | |||||
| private LocalDate effectFrom; | |||||
| @Column(name = "effectTo") | |||||
| private LocalDate effectTo; | |||||
| @Column(name = "normalRate") | |||||
| private Double normalRate; | |||||
| @Column(name = "otRate") | |||||
| private Double otRate; | |||||
| public Double getOtRate() { | |||||
| return otRate; | |||||
| } | |||||
| public void setOtRate(Double otRate) { | |||||
| this.otRate = otRate; | |||||
| } | |||||
| public Double getNormalRate() { | |||||
| return normalRate; | |||||
| } | |||||
| public void setNormalRate(Double normalRate) { | |||||
| this.normalRate = normalRate; | |||||
| } | |||||
| public LocalDate getEffectTo() { | |||||
| return effectTo; | |||||
| } | |||||
| public void setEffectTo(LocalDate effectTo) { | |||||
| this.effectTo = effectTo; | |||||
| } | |||||
| public LocalDate getEffectFrom() { | |||||
| return effectFrom; | |||||
| } | |||||
| public void setEffectFrom(LocalDate effectFrom) { | |||||
| this.effectFrom = effectFrom; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface RateRepository extends AbstractRepository<Rate, Long> { | |||||
| } | |||||
| @@ -0,0 +1,59 @@ | |||||
| 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 = "salary") | |||||
| public class Salary extends IdEntity<Long> { | |||||
| @NotNull | |||||
| @Column(name = "salaryPoint") | |||||
| private Integer salaryPoint; | |||||
| @NotNull | |||||
| @Column(name = "lowerLimit") | |||||
| private Integer lowerLimit; | |||||
| @NotNull | |||||
| @Column(name = "upperLimit") | |||||
| private Integer upperLimit; | |||||
| @NotNull | |||||
| @Column(name = "increment") | |||||
| private Integer increment; | |||||
| public Integer getIncrement() { | |||||
| return increment; | |||||
| } | |||||
| public void setIncrement(Integer increment) { | |||||
| this.increment = increment; | |||||
| } | |||||
| public Integer getLowerLimit() { | |||||
| return lowerLimit; | |||||
| } | |||||
| public void setLowerLimit(Integer lowerLimit) { | |||||
| this.lowerLimit = lowerLimit; | |||||
| } | |||||
| public Integer getUpperLimit() { | |||||
| return upperLimit; | |||||
| } | |||||
| public void setUpperLimit(Integer upperLimit) { | |||||
| this.upperLimit = upperLimit; | |||||
| } | |||||
| public void setSalaryPoint(Integer salaryPoint) { | |||||
| this.salaryPoint = salaryPoint; | |||||
| } | |||||
| public Integer getSalaryPoint() { | |||||
| return salaryPoint; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,40 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.IdEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.JoinColumn; | |||||
| import jakarta.persistence.ManyToOne; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| import java.time.LocalDate; | |||||
| @Entity | |||||
| @Table(name = "salary_effective") | |||||
| public class SalaryEffective extends IdEntity<Long> { | |||||
| @NotNull | |||||
| @Column(name = "date") | |||||
| private LocalDate date; | |||||
| public LocalDate getDate() { | |||||
| return date; | |||||
| } | |||||
| public void setDate(LocalDate date) { | |||||
| this.date = date; | |||||
| } | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "salaryId") | |||||
| @NotNull | |||||
| private Salary salary; | |||||
| public Salary getSalary() { | |||||
| return salary; | |||||
| } | |||||
| public void setSalary(Salary salary) { | |||||
| this.salary = salary; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface SalaryRepository extends AbstractRepository<Salary, Long> { | |||||
| } | |||||
| @@ -0,0 +1,46 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| @Entity | |||||
| @Table(name = "service") | |||||
| public class Service extends BaseEntity<Long> { | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @NotNull | |||||
| @Column(name = "type", length = 30) | |||||
| private String type; | |||||
| @NotNull | |||||
| @Column(name = "code", length = 30) | |||||
| private String code; | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getType() { | |||||
| return type; | |||||
| } | |||||
| public void setType(String type) { | |||||
| this.type = type; | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,35 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.IdEntity; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.JoinColumn; | |||||
| import jakarta.persistence.ManyToOne; | |||||
| import jakarta.persistence.Table; | |||||
| @Entity | |||||
| @Table(name = "service_rate") | |||||
| public class ServiceRate extends IdEntity<Long> { | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "rateId") | |||||
| private Rate rate; | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "serviceId") | |||||
| private Service service; | |||||
| public Rate getRate() { | |||||
| return rate; | |||||
| } | |||||
| public void setRate(Rate rate) { | |||||
| this.rate = rate; | |||||
| } | |||||
| public Service getService() { | |||||
| return service; | |||||
| } | |||||
| public void setService(Service service) { | |||||
| this.service = service; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface ServiceRepository extends AbstractRepository<Service, Long> { | |||||
| } | |||||
| @@ -0,0 +1,46 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| @Entity | |||||
| @Table(name = "skill") | |||||
| public class Skill extends BaseEntity<Long> { | |||||
| @Column(name = "description", length = 1500) | |||||
| private String description; | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @NotNull | |||||
| @Column(name = "code", length = 30) | |||||
| private String code; | |||||
| public String getDescription() { | |||||
| return description; | |||||
| } | |||||
| public void setDescription(String description) { | |||||
| this.description = description; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface SkillRepository extends AbstractRepository<Skill, Long> { | |||||
| } | |||||
| @@ -0,0 +1,257 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import com.ffii.tsms.modules.user.entity.User; | |||||
| import jakarta.persistence.*; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| import java.time.LocalDate; | |||||
| @Entity | |||||
| @Table(name = "staff") | |||||
| public class Staff extends BaseEntity<Long> { | |||||
| @NotNull | |||||
| @OneToOne | |||||
| @JoinColumn(name = "userId", unique = true) | |||||
| private User user; | |||||
| @Column(name = "joinDate") | |||||
| private LocalDate joinDate; | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @NotNull | |||||
| @Column(name = "staffId", length = 30) | |||||
| private String staffId; | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "currentPosition") | |||||
| private Position currentPosition; | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "joinPosition") | |||||
| private Position joinPosition; | |||||
| @NotNull | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "companyId") | |||||
| private Company company; | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "gradeId") | |||||
| private Grade grade; | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "teamId") | |||||
| private Team team; | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "skillSetId") | |||||
| private Skill skill; | |||||
| @NotNull | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "salaryEffId") | |||||
| private SalaryEffective salaryEffective; | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "departmentId") | |||||
| private Department department; | |||||
| @Column(name = "phone2", length = 20) | |||||
| private String phone2; | |||||
| @Column(name = "phone1", length = 20) | |||||
| private String phone1; | |||||
| @Column(name = "email") | |||||
| private String email; | |||||
| @Column(name = "emergContactName", length = 150) | |||||
| private String emergContactName; | |||||
| @Column(name = "emergContactPhone", length = 20) | |||||
| private String emergContactPhone; | |||||
| @Column(name = "employType", length = 30) | |||||
| private String employType; | |||||
| @Column(name = "departDate") | |||||
| private LocalDate departDate; | |||||
| @Column(name = "departReason", length = 500) | |||||
| private String departReason; | |||||
| @Column(name = "remark", length = 1500) | |||||
| private String remark; | |||||
| public String getRemark() { | |||||
| return remark; | |||||
| } | |||||
| public void setRemark(String remark) { | |||||
| this.remark = remark; | |||||
| } | |||||
| public String getDepartReason() { | |||||
| return departReason; | |||||
| } | |||||
| public void setDepartReason(String departReason) { | |||||
| this.departReason = departReason; | |||||
| } | |||||
| public LocalDate getDepartDate() { | |||||
| return departDate; | |||||
| } | |||||
| public void setDepartDate(LocalDate departDate) { | |||||
| this.departDate = departDate; | |||||
| } | |||||
| public String getEmployType() { | |||||
| return employType; | |||||
| } | |||||
| public void setEmployType(String employType) { | |||||
| this.employType = employType; | |||||
| } | |||||
| public String getEmergContactPhone() { | |||||
| return emergContactPhone; | |||||
| } | |||||
| public void setEmergContactPhone(String emergContactPhone) { | |||||
| this.emergContactPhone = emergContactPhone; | |||||
| } | |||||
| public String getEmergContactName() { | |||||
| return emergContactName; | |||||
| } | |||||
| public void setEmergContactName(String emergContactName) { | |||||
| this.emergContactName = emergContactName; | |||||
| } | |||||
| public String getPhone2() { | |||||
| return phone2; | |||||
| } | |||||
| public void setPhone2(String phone2) { | |||||
| this.phone2 = phone2; | |||||
| } | |||||
| public String getPhone1() { | |||||
| return phone1; | |||||
| } | |||||
| public void setPhone1(String phone1) { | |||||
| this.phone1 = phone1; | |||||
| } | |||||
| public String getEmail() { | |||||
| return email; | |||||
| } | |||||
| public void setEmail(String email) { | |||||
| this.email = email; | |||||
| } | |||||
| public SalaryEffective getSalaryEffective() { | |||||
| return salaryEffective; | |||||
| } | |||||
| public void setSalaryEffective(SalaryEffective salaryEffective) { | |||||
| this.salaryEffective = salaryEffective; | |||||
| } | |||||
| public Skill getSkill() { | |||||
| return skill; | |||||
| } | |||||
| public void setSkill(Skill skill) { | |||||
| this.skill = skill; | |||||
| } | |||||
| public Company getCompany() { | |||||
| return company; | |||||
| } | |||||
| public void setCompany(Company company) { | |||||
| this.company = company; | |||||
| } | |||||
| public Grade getGrade() { | |||||
| return grade; | |||||
| } | |||||
| public void setGrade(Grade grade) { | |||||
| this.grade = grade; | |||||
| } | |||||
| public Team getTeam() { | |||||
| return team; | |||||
| } | |||||
| public void setTeam(Team team) { | |||||
| this.team = team; | |||||
| } | |||||
| public Department getDepartment() { | |||||
| return department; | |||||
| } | |||||
| public void setDepartment(Department department) { | |||||
| this.department = department; | |||||
| } | |||||
| public Position getCurrentPosition() { | |||||
| return currentPosition; | |||||
| } | |||||
| public void setCurrentPosition(Position currentPosition) { | |||||
| this.currentPosition = currentPosition; | |||||
| } | |||||
| public Position getJoinPosition() { | |||||
| return joinPosition; | |||||
| } | |||||
| public void setJoinPosition(Position joinPosition) { | |||||
| this.joinPosition = joinPosition; | |||||
| } | |||||
| public LocalDate getJoinDate() { | |||||
| return joinDate; | |||||
| } | |||||
| public void setJoinDate(LocalDate joinDate) { | |||||
| this.joinDate = joinDate; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getStaffId() { | |||||
| return staffId; | |||||
| } | |||||
| public void setStaffId(String staffId) { | |||||
| this.staffId = staffId; | |||||
| } | |||||
| public User getUser() { | |||||
| return user; | |||||
| } | |||||
| public void setUser(User user) { | |||||
| this.user = user; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface StaffRepository extends AbstractRepository<Staff, Long> { | |||||
| } | |||||
| @@ -0,0 +1,103 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| import java.time.LocalTime; | |||||
| @Entity | |||||
| @Table(name = "subsidiary") | |||||
| public class Subsidiary extends BaseEntity<Long> { | |||||
| @NotNull | |||||
| @Column(name = "code", length = 30) | |||||
| private String code; | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @Column(name = "brNo", length = 20) | |||||
| private String brNo; | |||||
| @Column(name = "contactName", length = 30) | |||||
| private String contactName; | |||||
| @Column(name = "phone", length = 20) | |||||
| private String phone; | |||||
| @Column(name = "address", length = 500) | |||||
| private String address; | |||||
| @Column(name = "district", length = 30) | |||||
| private String district; | |||||
| @Column(name = "email") | |||||
| private String email; | |||||
| public String getAddress() { | |||||
| return address; | |||||
| } | |||||
| public void setAddress(String address) { | |||||
| this.address = address; | |||||
| } | |||||
| public String getDistrict() { | |||||
| return district; | |||||
| } | |||||
| public void setDistrict(String district) { | |||||
| this.district = district; | |||||
| } | |||||
| public String getEmail() { | |||||
| return email; | |||||
| } | |||||
| public void setEmail(String email) { | |||||
| this.email = email; | |||||
| } | |||||
| public String getPhone() { | |||||
| return phone; | |||||
| } | |||||
| public void setPhone(String phone) { | |||||
| this.phone = phone; | |||||
| } | |||||
| public String getContactName() { | |||||
| return contactName; | |||||
| } | |||||
| public void setContactName(String contactName) { | |||||
| this.contactName = contactName; | |||||
| } | |||||
| public String getBrNo() { | |||||
| return brNo; | |||||
| } | |||||
| public void setBrNo(String brNo) { | |||||
| this.brNo = brNo; | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface SubsidiaryRepository extends AbstractRepository<Subsidiary, Long> { | |||||
| } | |||||
| @@ -0,0 +1,46 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.entity.BaseEntity; | |||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.validation.constraints.NotNull; | |||||
| @Entity | |||||
| @Table(name = "team") | |||||
| public class Team extends BaseEntity<Long> { | |||||
| @Column(name = "description", length = 1500) | |||||
| private String description; | |||||
| @NotNull | |||||
| @Column(name = "name", length = 150) | |||||
| private String name; | |||||
| @NotNull | |||||
| @Column(name = "code", length = 30) | |||||
| private String code; | |||||
| public String getDescription() { | |||||
| return description; | |||||
| } | |||||
| public void setDescription(String description) { | |||||
| this.description = description; | |||||
| } | |||||
| public String getName() { | |||||
| return name; | |||||
| } | |||||
| public void setName(String name) { | |||||
| this.name = name; | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | |||||
| import com.ffii.core.support.AbstractRepository; | |||||
| public interface TeamRepository extends AbstractRepository<Team, Long> { | |||||
| } | |||||
| @@ -0,0 +1,19 @@ | |||||
| package com.ffii.tsms.modules.project.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 = "milestone") | |||||
| open class PaymentMilestone : IdEntity<Long>() { | |||||
| @NotNull | |||||
| @Column(name = "name") | |||||
| open var name: String? = null | |||||
| @NotNull | |||||
| @Column(name = "description") | |||||
| open var description: String? = null | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.project.entity; | |||||
| import com.ffii.core.support.AbstractRepository | |||||
| interface PaymentMilestoneRepository : AbstractRepository<PaymentMilestone, Long> { | |||||
| } | |||||
| @@ -0,0 +1,55 @@ | |||||
| 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 jakarta.persistence.* | |||||
| import jakarta.validation.constraints.NotNull | |||||
| import java.time.LocalDate | |||||
| @Entity | |||||
| @Table(name = "project") | |||||
| open class Project : BaseEntity<Long>() { | |||||
| @NotNull | |||||
| @Column(name = "name", length = 100) | |||||
| open var name: String? = null | |||||
| @NotNull | |||||
| @Column(name = "description") | |||||
| open var description: String? = null | |||||
| @Column(name = "planStart") | |||||
| open var planStart: LocalDate? = null | |||||
| @Column(name = "actualStart") | |||||
| open var actualStart: LocalDate? = null | |||||
| @Column(name = "planEnd") | |||||
| open var planEnd: LocalDate? = null | |||||
| @Column(name = "actualEnd") | |||||
| open var actualEnd: LocalDate? = null | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "teamLead") | |||||
| open var teamLead: Staff? = null | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "customerId") | |||||
| open var customer: Customer? = null | |||||
| @Column(name = "custLeadName", length = 30) | |||||
| open var custLeadName: String? = null | |||||
| @Column(name = "custLeadPhone", length = 20) | |||||
| open var custLeadPhone: String? = null | |||||
| @Column(name = "custLeadEmail") | |||||
| open var custLeadEmail: String? = null | |||||
| @Column(name = "remark", length = 1500) | |||||
| open var remark: String? = null | |||||
| @Column(name = "billStatus") | |||||
| open var billStatus: Boolean? = null | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.project.entity; | |||||
| import com.ffii.core.support.AbstractRepository | |||||
| interface ProjectRepository : AbstractRepository<Project, Long> { | |||||
| } | |||||
| @@ -0,0 +1,29 @@ | |||||
| package com.ffii.tsms.modules.project.entity | |||||
| import com.ffii.core.entity.IdEntity | |||||
| import jakarta.persistence.* | |||||
| import jakarta.validation.constraints.NotNull | |||||
| @Entity | |||||
| @Table(name = "project_task") | |||||
| open class ProjectTask : IdEntity<Long>() { | |||||
| @NotNull | |||||
| @ManyToOne | |||||
| open var project: Project? = null | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "milestoneId") | |||||
| open var paymentMilestone: PaymentMilestone? = null | |||||
| @NotNull | |||||
| @ManyToOne | |||||
| open var task: Task? = null | |||||
| @NotNull | |||||
| @Column(name = "paymentPercentage") | |||||
| open var paymentPercentage: Double? = null | |||||
| @NotNull | |||||
| @Column(name = "reminderPercentage") | |||||
| open var reminderPercentage: Double? = null | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.project.entity; | |||||
| import com.ffii.core.support.AbstractRepository | |||||
| interface ProjectTaskRepository : AbstractRepository<ProjectTask, Long> { | |||||
| } | |||||
| @@ -0,0 +1,43 @@ | |||||
| package com.ffii.tsms.modules.project.entity | |||||
| import com.ffii.core.entity.IdEntity | |||||
| import com.ffii.tsms.modules.data.entity.Staff | |||||
| import jakarta.persistence.* | |||||
| import jakarta.validation.constraints.NotNull | |||||
| import java.time.LocalDate | |||||
| @Entity | |||||
| @Table(name = "staff_allocation") | |||||
| open class StaffAllocation : IdEntity<Long>() { | |||||
| @NotNull | |||||
| @ManyToOne | |||||
| open var project: Project? = null | |||||
| @NotNull | |||||
| @ManyToOne | |||||
| open var staff: Staff? = null | |||||
| @Column(name = "allocatedDateFrom") | |||||
| open var allocatedDateFrom: LocalDate? = null | |||||
| @Column(name = "allocatedDateTo") | |||||
| open var allocatedDateTo: LocalDate? = null | |||||
| @Column(name = "normalAllocated") | |||||
| open var normalAllocated: Double? = null | |||||
| @Column(name = "normalConsumed") | |||||
| open var normalConsumed: Double? = null | |||||
| @Column(name = "otAllocated") | |||||
| open var otAllocated: Double? = null | |||||
| @Column(name = "otConsumed") | |||||
| open var otConsumed: Double? = null | |||||
| @Column(name = "normalBilled") | |||||
| open var normalBilled: Double? = null | |||||
| @Column(name = "otBilled") | |||||
| open var otBilled: Double? = null | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.project.entity; | |||||
| import com.ffii.core.support.AbstractRepository | |||||
| interface StaffAllocationRepository : AbstractRepository<StaffAllocation, Long> { | |||||
| } | |||||
| @@ -0,0 +1,34 @@ | |||||
| package com.ffii.tsms.modules.project.entity | |||||
| import com.ffii.core.entity.BaseEntity | |||||
| import jakarta.persistence.* | |||||
| import jakarta.validation.constraints.NotNull | |||||
| import org.hibernate.proxy.HibernateProxy | |||||
| @Entity | |||||
| @Table(name = "task") | |||||
| open class Task : BaseEntity<Long>() { | |||||
| @NotNull | |||||
| @Column(name = "name") | |||||
| open var name: String? = null | |||||
| @Column(name = "description") | |||||
| open var description: String? = null | |||||
| @ManyToOne | |||||
| @JoinColumn(name = "taskGroupId") | |||||
| open var taskGroup: TaskGroup? = 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 Task | |||||
| 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,13 @@ | |||||
| package com.ffii.tsms.modules.project.entity | |||||
| import com.ffii.core.entity.IdEntity | |||||
| import jakarta.persistence.Column | |||||
| import jakarta.persistence.Entity | |||||
| import jakarta.persistence.Table | |||||
| @Entity | |||||
| @Table(name = "task_group") | |||||
| open class TaskGroup : IdEntity<Long>() { | |||||
| @Column(name = "name") | |||||
| open var name: String? = null | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.project.entity; | |||||
| import com.ffii.core.support.AbstractRepository | |||||
| interface TaskRepository : AbstractRepository<Task, Long> { | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| package com.ffii.tsms.modules.project.entity | |||||
| import com.ffii.core.entity.IdEntity | |||||
| import jakarta.persistence.* | |||||
| import jakarta.validation.constraints.NotNull | |||||
| @Entity | |||||
| @Table(name = "task_template") | |||||
| open class TaskTemplate : IdEntity<Long>() { | |||||
| @NotNull | |||||
| @Column(name = "code") | |||||
| open var code: String? = null | |||||
| @NotNull | |||||
| @Column(name = "name") | |||||
| open var name: String? = null | |||||
| @ManyToMany | |||||
| @JoinTable(name = "task_template_tasks", | |||||
| joinColumns = [JoinColumn(name = "taskTemplateId")], | |||||
| inverseJoinColumns = [JoinColumn(name = "tasksId")]) | |||||
| @OrderBy | |||||
| open var tasks: MutableList<Task> = mutableListOf() | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.tsms.modules.project.entity; | |||||
| import com.ffii.core.support.AbstractRepository | |||||
| interface TaskTemplateRepository : AbstractRepository<TaskTemplate, Long> { | |||||
| } | |||||
| @@ -0,0 +1,31 @@ | |||||
| package com.ffii.tsms.modules.project.service | |||||
| import com.ffii.tsms.modules.project.entity.Task | |||||
| import com.ffii.tsms.modules.project.entity.TaskRepository | |||||
| import com.ffii.tsms.modules.project.entity.TaskTemplate | |||||
| import com.ffii.tsms.modules.project.entity.TaskTemplateRepository | |||||
| import org.springframework.stereotype.Service | |||||
| @Service | |||||
| class TasksService( | |||||
| private val taskTemplateRepository: TaskTemplateRepository, | |||||
| private val taskRepository: TaskRepository | |||||
| ) { | |||||
| fun allTasks(): List<Task> { | |||||
| return taskRepository.findAll() | |||||
| } | |||||
| fun allTaskTemplates(): List<TaskTemplate> { | |||||
| return taskTemplateRepository.findAll() | |||||
| } | |||||
| fun saveTaskTemplate(code: String, name: String, taskIds: List<Long>): TaskTemplate { | |||||
| return taskTemplateRepository.save<TaskTemplate>( | |||||
| TaskTemplate().apply { | |||||
| this.name = name | |||||
| this.code = code | |||||
| this.tasks = taskRepository.findAllById(taskIds) | |||||
| } | |||||
| ) | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,14 @@ | |||||
| package com.ffii.tsms.modules.project.web | |||||
| import org.springframework.web.bind.annotation.GetMapping | |||||
| import org.springframework.web.bind.annotation.RequestMapping | |||||
| import org.springframework.web.bind.annotation.RestController | |||||
| @RestController | |||||
| @RequestMapping("/projects") | |||||
| class ProjectsController { | |||||
| @GetMapping | |||||
| fun allProjects() { | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,35 @@ | |||||
| package com.ffii.tsms.modules.project.web | |||||
| import com.ffii.tsms.modules.project.entity.Task | |||||
| import com.ffii.tsms.modules.project.entity.TaskTemplate | |||||
| import com.ffii.tsms.modules.project.service.TasksService | |||||
| import com.ffii.tsms.modules.project.web.models.NewTaskTemplateRequest | |||||
| import jakarta.validation.Valid | |||||
| import org.springframework.web.bind.annotation.GetMapping | |||||
| import org.springframework.web.bind.annotation.PostMapping | |||||
| import org.springframework.web.bind.annotation.RequestBody | |||||
| import org.springframework.web.bind.annotation.RequestMapping | |||||
| import org.springframework.web.bind.annotation.RestController | |||||
| @RestController | |||||
| @RequestMapping("/tasks") | |||||
| class TasksController(private val tasksService: TasksService) { | |||||
| @GetMapping | |||||
| fun allTasks(): List<Task> { | |||||
| return tasksService.allTasks() | |||||
| } | |||||
| @GetMapping("/templates") | |||||
| fun allTaskTemplates(): List<TaskTemplate> { | |||||
| return tasksService.allTaskTemplates() | |||||
| } | |||||
| @PostMapping("/templates/new") | |||||
| fun saveTaskTemplate(@Valid @RequestBody newTaskTemplate: NewTaskTemplateRequest): TaskTemplate { | |||||
| return tasksService.saveTaskTemplate( | |||||
| newTaskTemplate.code, | |||||
| newTaskTemplate.name, | |||||
| newTaskTemplate.taskIds | |||||
| ) | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,11 @@ | |||||
| package com.ffii.tsms.modules.project.web.models | |||||
| import jakarta.validation.constraints.NotBlank | |||||
| data class NewTaskTemplateRequest( | |||||
| @field:NotBlank(message = "code cannot be empty") | |||||
| val code: String, | |||||
| @field:NotBlank(message = "name cannot be empty") | |||||
| val name: String, | |||||
| val taskIds: List<Long> = emptyList() | |||||
| ) | |||||
| @@ -0,0 +1,26 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:company | |||||
| CREATE TABLE company ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| companyCode VARCHAR(30) NOT NULL, | |||||
| name VARCHAR(150) NOT NULL, | |||||
| brNo VARCHAR(20) NULL, | |||||
| contactName VARCHAR(30) NULL, | |||||
| phone VARCHAR(20) NULL, | |||||
| otHourTo time NULL, | |||||
| otHourFrom time NULL, | |||||
| normalHourTo time NULL, | |||||
| normalHourFrom time NULL, | |||||
| currency VARCHAR(20) NULL, | |||||
| address VARCHAR(500) NULL, | |||||
| district VARCHAR(30) NULL, | |||||
| email VARCHAR(255) NULL, | |||||
| CONSTRAINT pk_company PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,15 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:company_holiday | |||||
| CREATE TABLE company_holiday ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| date date NOT NULL, | |||||
| name VARCHAR(150) NOT NULL, | |||||
| CONSTRAINT pk_company_holiday PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,21 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:customer | |||||
| CREATE TABLE customer ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| name VARCHAR(150) NOT NULL, | |||||
| code VARCHAR(30) NOT NULL, | |||||
| address VARCHAR(500) NULL, | |||||
| district VARCHAR(30) NULL, | |||||
| email VARCHAR(255) NULL, | |||||
| phone VARCHAR(20) NULL, | |||||
| contactName VARCHAR(30) NULL, | |||||
| brNo VARCHAR(20) NULL, | |||||
| CONSTRAINT pk_customer PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,21 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:subsidiary | |||||
| CREATE TABLE subsidiary ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| code VARCHAR(30) NOT NULL, | |||||
| name VARCHAR(150) NOT NULL, | |||||
| brNo VARCHAR(20) NULL, | |||||
| contactName VARCHAR(30) NULL, | |||||
| phone VARCHAR(20) NULL, | |||||
| address VARCHAR(500) NULL, | |||||
| district VARCHAR(30) NULL, | |||||
| email VARCHAR(255) NULL, | |||||
| CONSTRAINT pk_subsidiary PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,13 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:customer_subsidiary | |||||
| CREATE TABLE customer_subsidiary ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| customerId INT NULL, | |||||
| subsidiaryId INT NULL, | |||||
| CONSTRAINT pk_customer_subsidiary PRIMARY KEY (id) | |||||
| ); | |||||
| ALTER TABLE customer_subsidiary ADD CONSTRAINT FK_CUSTOMER_SUBSIDIARY_ON_CUSTOMERID FOREIGN KEY (customerId) REFERENCES customer (id); | |||||
| ALTER TABLE customer_subsidiary ADD CONSTRAINT FK_CUSTOMER_SUBSIDIARY_ON_SUBSIDIARYID FOREIGN KEY (subsidiaryId) REFERENCES subsidiary (id); | |||||
| @@ -0,0 +1,16 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:department | |||||
| CREATE TABLE department ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| `description` VARCHAR(1500) NULL, | |||||
| name VARCHAR(150) NOT NULL, | |||||
| code VARCHAR(30) NOT NULL, | |||||
| CONSTRAINT pk_department PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,16 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:grade | |||||
| CREATE TABLE grade ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| `description` VARCHAR(1500) NULL, | |||||
| name VARCHAR(150) NOT NULL, | |||||
| code VARCHAR(30) NOT NULL, | |||||
| CONSTRAINT pk_grade PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,19 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:internal_rate | |||||
| CREATE TABLE internal_rate ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| name VARCHAR(150) NOT NULL, | |||||
| code VARCHAR(30) NOT NULL, | |||||
| effectFrom date NULL, | |||||
| effectTo date NULL, | |||||
| normalRate DOUBLE NULL, | |||||
| otRate DOUBLE NULL, | |||||
| CONSTRAINT pk_internal_rate PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,16 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:position | |||||
| CREATE TABLE position ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| `description` VARCHAR(1500) NULL, | |||||
| name VARCHAR(150) NOT NULL, | |||||
| code VARCHAR(30) NOT NULL, | |||||
| CONSTRAINT pk_position PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,19 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:rate | |||||
| CREATE TABLE rate ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| name VARCHAR(150) NOT NULL, | |||||
| code VARCHAR(30) NOT NULL, | |||||
| effectFrom date NULL, | |||||
| effectTo date NULL, | |||||
| normalRate DOUBLE NULL, | |||||
| otRate DOUBLE NULL, | |||||
| CONSTRAINT pk_rate PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,11 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:salary | |||||
| CREATE TABLE salary ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| salaryPoint INT NOT NULL, | |||||
| lowerLimit INT NOT NULL, | |||||
| upperLimit INT NOT NULL, | |||||
| increment INT NOT NULL, | |||||
| CONSTRAINT pk_salary PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,11 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:salary_effective | |||||
| CREATE TABLE salary_effective ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| date date NOT NULL, | |||||
| salaryId INT NOT NULL, | |||||
| CONSTRAINT pk_salary_effective PRIMARY KEY (id) | |||||
| ); | |||||
| ALTER TABLE salary_effective ADD CONSTRAINT FK_SALARY_EFFECTIVE_ON_SALARYID FOREIGN KEY (salaryId) REFERENCES salary (id); | |||||
| @@ -0,0 +1,16 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:service | |||||
| CREATE TABLE service ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| name VARCHAR(150) NULL, | |||||
| type VARCHAR(30) NOT NULL, | |||||
| code VARCHAR(30) NOT NULL, | |||||
| CONSTRAINT pk_service PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,13 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:service_rate | |||||
| CREATE TABLE service_rate ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| rateId INT NULL, | |||||
| serviceId INT NULL, | |||||
| CONSTRAINT pk_service_rate PRIMARY KEY (id) | |||||
| ); | |||||
| ALTER TABLE service_rate ADD CONSTRAINT FK_SERVICE_RATE_ON_RATEID FOREIGN KEY (rateId) REFERENCES rate (id); | |||||
| ALTER TABLE service_rate ADD CONSTRAINT FK_SERVICE_RATE_ON_SERVICEID FOREIGN KEY (serviceId) REFERENCES service (id); | |||||
| @@ -0,0 +1,16 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:skill | |||||
| CREATE TABLE skill ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| `description` VARCHAR(1500) NULL, | |||||
| name VARCHAR(150) NOT NULL, | |||||
| code VARCHAR(30) NOT NULL, | |||||
| CONSTRAINT pk_skill PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,16 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:team | |||||
| CREATE TABLE team ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| `description` VARCHAR(1500) NULL, | |||||
| name VARCHAR(150) NOT NULL, | |||||
| code VARCHAR(30) NOT NULL, | |||||
| CONSTRAINT pk_team PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,54 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:staff | |||||
| CREATE TABLE staff ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| userId INT NOT NULL, | |||||
| joinDate date NULL, | |||||
| name VARCHAR(150) NOT NULL, | |||||
| staffId VARCHAR(30) NOT NULL, | |||||
| currentPosition INT NULL, | |||||
| joinPosition INT NULL, | |||||
| companyId INT NOT NULL, | |||||
| gradeId INT NULL, | |||||
| teamId INT NULL, | |||||
| skillSetId INT NULL, | |||||
| salaryEffId INT NOT NULL, | |||||
| departmentId INT NULL, | |||||
| phone2 VARCHAR(20) NULL, | |||||
| phone1 VARCHAR(20) NULL, | |||||
| email VARCHAR(255) NULL, | |||||
| emergContactName VARCHAR(150) NULL, | |||||
| emergContactPhone VARCHAR(20) NULL, | |||||
| employType VARCHAR(30) NULL, | |||||
| departDate date NULL, | |||||
| departReason VARCHAR(500) NULL, | |||||
| remark VARCHAR(1500) NULL, | |||||
| CONSTRAINT pk_staff PRIMARY KEY (id) | |||||
| ); | |||||
| ALTER TABLE staff ADD CONSTRAINT uc_staff_userid UNIQUE (userId); | |||||
| ALTER TABLE staff ADD CONSTRAINT FK_STAFF_ON_COMPANYID FOREIGN KEY (companyId) REFERENCES company (id); | |||||
| ALTER TABLE staff ADD CONSTRAINT FK_STAFF_ON_CURRENTPOSITION FOREIGN KEY (currentPosition) REFERENCES position (id); | |||||
| ALTER TABLE staff ADD CONSTRAINT FK_STAFF_ON_DEPARTMENTID FOREIGN KEY (departmentId) REFERENCES department (id); | |||||
| ALTER TABLE staff ADD CONSTRAINT FK_STAFF_ON_GRADEID FOREIGN KEY (gradeId) REFERENCES grade (id); | |||||
| ALTER TABLE staff ADD CONSTRAINT FK_STAFF_ON_JOINPOSITION FOREIGN KEY (joinPosition) REFERENCES position (id); | |||||
| ALTER TABLE staff ADD CONSTRAINT FK_STAFF_ON_SALARYEFFID FOREIGN KEY (salaryEffId) REFERENCES salary_effective (id); | |||||
| ALTER TABLE staff ADD CONSTRAINT FK_STAFF_ON_SKILLSETID FOREIGN KEY (skillSetId) REFERENCES skill (id); | |||||
| ALTER TABLE staff ADD CONSTRAINT FK_STAFF_ON_TEAMID FOREIGN KEY (teamId) REFERENCES team (id); | |||||
| ALTER TABLE staff ADD CONSTRAINT FK_STAFF_ON_USERID FOREIGN KEY (userId) REFERENCES user (id); | |||||
| @@ -0,0 +1,30 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:project | |||||
| CREATE TABLE project ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| name VARCHAR(100) NOT NULL, | |||||
| `description` VARCHAR(255) NOT NULL, | |||||
| planStart date NULL, | |||||
| actualStart date NULL, | |||||
| planEnd date NULL, | |||||
| actualEnd date NULL, | |||||
| teamLead INT NULL, | |||||
| customerId INT NULL, | |||||
| custLeadName VARCHAR(30) NULL, | |||||
| custLeadPhone VARCHAR(20) NULL, | |||||
| custLeadEmail VARCHAR(255) NULL, | |||||
| remark VARCHAR(1500) NULL, | |||||
| billStatus TINYINT NULL, | |||||
| CONSTRAINT pk_project PRIMARY KEY (id) | |||||
| ); | |||||
| ALTER TABLE project ADD CONSTRAINT FK_PROJECT_ON_CUSTOMERID FOREIGN KEY (customerId) REFERENCES customer (id); | |||||
| ALTER TABLE project ADD CONSTRAINT FK_PROJECT_ON_TEAMLEAD FOREIGN KEY (teamLead) REFERENCES staff (id); | |||||
| @@ -0,0 +1,41 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:task | |||||
| CREATE TABLE task_group ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| name VARCHAR(255) NULL, | |||||
| CONSTRAINT pk_task_group PRIMARY KEY (id) | |||||
| ); | |||||
| CREATE TABLE task ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| version INT NOT NULL DEFAULT '0', | |||||
| created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| createdBy VARCHAR(30) NULL, | |||||
| modified datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
| modifiedBy VARCHAR(30) NULL, | |||||
| deleted TINYINT(1) NOT NULL DEFAULT '0', | |||||
| name VARCHAR(255) NOT NULL, | |||||
| `description` VARCHAR(255) NULL, | |||||
| taskGroupId INT NULL, | |||||
| CONSTRAINT pk_task PRIMARY KEY (id) | |||||
| ); | |||||
| ALTER TABLE task ADD CONSTRAINT FK_TASK_ON_TASKGROUPID FOREIGN KEY (taskGroupId) REFERENCES task_group (id); | |||||
| CREATE TABLE task_template ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| code VARCHAR(255) NOT NULL, | |||||
| name VARCHAR(255) NOT NULL, | |||||
| CONSTRAINT pk_task_template PRIMARY KEY (id) | |||||
| ); | |||||
| CREATE TABLE task_template_tasks ( | |||||
| taskTemplateId INT NOT NULL, | |||||
| tasksId INT NOT NULL, | |||||
| CONSTRAINT pk_task_template_tasks PRIMARY KEY (taskTemplateId, tasksId) | |||||
| ); | |||||
| ALTER TABLE task_template_tasks ADD CONSTRAINT fk_tastemtas_on_task FOREIGN KEY (tasksId) REFERENCES task (id); | |||||
| ALTER TABLE task_template_tasks ADD CONSTRAINT fk_tastemtas_on_task_template FOREIGN KEY (taskTemplateId) REFERENCES task_template (id); | |||||
| @@ -0,0 +1,9 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:milestone | |||||
| CREATE TABLE milestone ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| name VARCHAR(255) NOT NULL, | |||||
| `description` VARCHAR(255) NOT NULL, | |||||
| CONSTRAINT pk_milestone PRIMARY KEY (id) | |||||
| ); | |||||
| @@ -0,0 +1,18 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:project_task | |||||
| CREATE TABLE project_task ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| project_id INT NOT NULL, | |||||
| milestoneId INT NULL, | |||||
| task_id INT NOT NULL, | |||||
| paymentPercentage DOUBLE NOT NULL, | |||||
| reminderPercentage DOUBLE NOT NULL, | |||||
| CONSTRAINT pk_project_task PRIMARY KEY (id) | |||||
| ); | |||||
| ALTER TABLE project_task ADD CONSTRAINT FK_PROJECT_TASK_ON_MILESTONEID FOREIGN KEY (milestoneId) REFERENCES milestone (id); | |||||
| ALTER TABLE project_task ADD CONSTRAINT FK_PROJECT_TASK_ON_PROJECT FOREIGN KEY (project_id) REFERENCES project (id); | |||||
| ALTER TABLE project_task ADD CONSTRAINT FK_PROJECT_TASK_ON_TASK FOREIGN KEY (task_id) REFERENCES task (id); | |||||
| @@ -0,0 +1,21 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:staff_allocation | |||||
| CREATE TABLE staff_allocation ( | |||||
| id INT NOT NULL AUTO_INCREMENT, | |||||
| project_id INT NOT NULL, | |||||
| staff_id INT NOT NULL, | |||||
| allocatedDateFrom date NULL, | |||||
| allocatedDateTo date NULL, | |||||
| normalAllocated DOUBLE NULL, | |||||
| normalConsumed DOUBLE NULL, | |||||
| otAllocated DOUBLE NULL, | |||||
| otConsumed DOUBLE NULL, | |||||
| normalBilled DOUBLE NULL, | |||||
| otBilled DOUBLE NULL, | |||||
| CONSTRAINT pk_staff_allocation PRIMARY KEY (id) | |||||
| ); | |||||
| ALTER TABLE staff_allocation ADD CONSTRAINT FK_STAFF_ALLOCATION_ON_PROJECT FOREIGN KEY (project_id) REFERENCES project (id); | |||||
| ALTER TABLE staff_allocation ADD CONSTRAINT FK_STAFF_ALLOCATION_ON_STAFF FOREIGN KEY (staff_id) REFERENCES staff (id); | |||||
| @@ -0,0 +1,63 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:task_data | |||||
| INSERT | |||||
| INTO | |||||
| task_group | |||||
| (name) | |||||
| VALUES | |||||
| ('1. Design & Cost Planning / Estimating'), | |||||
| ('2. Tender Documentation'), | |||||
| ('3. Tender Analysis & Report & Contract Documentation'), | |||||
| ('4. Construction / Post Construction'), | |||||
| ('5. Miscellaneous'); | |||||
| INSERT | |||||
| INTO | |||||
| task | |||||
| (name, taskGroupId) | |||||
| VALUES | |||||
| ('1.1 Preparation of preliminary Cost Estimate / Cost Plan including Revised & Refined', 1), | |||||
| ('1.2 Cash flow forecast', 1), | |||||
| ('1.3 Cost studies for alternative design solutions', 1), | |||||
| ('1.4 Attend design co-ordination / project review meetings', 1), | |||||
| ('1.5 Prepare / Review RIC', 1), | |||||
| ('2.1 Advise on tendering & contractual arrangement', 2), | |||||
| ('2.2 Drafting / Vetting front-parts (incl. Main Contract, Sub-contracts & Direct Contracts)', 2), | |||||
| ('2.3 Carry out pre-qualification exercise / EOI', 2), | |||||
| ('2.4 Measurement (incl. billing of items) for Works Packages', 2), | |||||
| ('2.5 Measurement (incl. billing of items) for tender addendum for Works Packages', 2), | |||||
| ('2.6 Bulk Checking of Bills of Quantities', 2), | |||||
| ('2.7 Line through drawings & specifications to check against Bills of Quantities / SOR', 2), | |||||
| ('2.8 Update cash flow forecast', 2), | |||||
| ('2.9 Edit tender documents (Incl. Bills of Quantities / SOR)', 2), | |||||
| ('2.10 Preparation of pre-tender estimates', 2), | |||||
| ('2.11 Attend design co-ordination / project review meetings / project meetings', 2), | |||||
| ('3.1 Evaluation of tenders (incl. arithmetical checking, submission checking, etc)', 3), | |||||
| ('3.2 Preparation of 3-rates bills', 3), | |||||
| ('3.3 Preparation of Report on Tenderers (incl. three-rates bills)', 3), | |||||
| ('3.4 Preparation of tender queries', 3), | |||||
| ('3.5 Attend tender interviews', 3), | |||||
| ('3.6 Draft Letter of Acceptance / Award', 3), | |||||
| ('3.7 Preparation of Contract Documents for Works Packages', 3), | |||||
| ('4.1 Check insurance policies, surety bond, guarantee, etc.', 4), | |||||
| ('4.2 Valuation of works completed for progress payment (incl. site visits)', 4), | |||||
| ('4.3 Preparation of financial statements (incl. cash flow forecasts)', 4), | |||||
| ('4.4 Cost check / advice on a alternative design solutions', 4), | |||||
| ('4.5 Cost estimate for draft AIs/EIs/SIs', 4), | |||||
| ('4.6 Advise on contractual issues & evaluate monetary contractual claim', 4), | |||||
| ('4.7 Attend site meetings / project co-ordination meetings / project meetings', 4), | |||||
| ('4.8 Measurement & valuation of variations / prime cost & provisional sums', 4), | |||||
| ('4.9 Negotiation and settlement of final accounts (incl. meetings)', 4), | |||||
| ('4.10 Preparation of Statement of Final Account', 4), | |||||
| ('4.11 Preparation of Cost Analysis for the Completed project', 4), | |||||
| ('4.12 Check / Review draft final bills', 4), | |||||
| ('4.13 Carry out site check for draft final bills', 4), | |||||
| ('5.1 Preparation of Fee Proposal / Expression of Interest', 5), | |||||
| ('5.2 Attend Management Meeting / Management Workshop', 5), | |||||
| ('5.3 Preparation of project budget i.e. manhours vs fee receivables', 5), | |||||
| ('5.4 Attend Local / International Conference / Seminar / Webinar', 5); | |||||
| @@ -0,0 +1,57 @@ | |||||
| -- liquibase formatted sql | |||||
| -- changeset wayne:mock_task_templates | |||||
| INSERT INTO task_template (code,name) VALUES | |||||
| ('Pre-001','Pre-contract Template'), | |||||
| ('Post-001','Post-contract Template'), | |||||
| ('Full-001','Full Project Template'); | |||||
| INSERT INTO task_template_tasks (taskTemplateId,tasksId) VALUES | |||||
| (1,1), | |||||
| (2,1), | |||||
| (3,1), | |||||
| (1,2), | |||||
| (3,2), | |||||
| (1,3), | |||||
| (2,3), | |||||
| (3,3), | |||||
| (3,4), | |||||
| (3,5), | |||||
| (1,6), | |||||
| (3,6), | |||||
| (1,7), | |||||
| (3,7), | |||||
| (3,8), | |||||
| (3,9), | |||||
| (3,10), | |||||
| (3,11), | |||||
| (3,12), | |||||
| (3,13), | |||||
| (3,14), | |||||
| (3,15), | |||||
| (3,16), | |||||
| (3,17), | |||||
| (3,18), | |||||
| (3,19), | |||||
| (3,20), | |||||
| (3,21), | |||||
| (3,22), | |||||
| (3,23), | |||||
| (3,24), | |||||
| (3,25), | |||||
| (3,26), | |||||
| (3,27), | |||||
| (3,28), | |||||
| (3,29), | |||||
| (3,30), | |||||
| (3,31), | |||||
| (3,32), | |||||
| (3,33), | |||||
| (3,34), | |||||
| (3,35), | |||||
| (3,36), | |||||
| (3,37), | |||||
| (3,38), | |||||
| (3,39), | |||||
| (3,40); | |||||