From e5a0023f3eabf19a2deda1f749bcb1d08dc425a2 Mon Sep 17 00:00:00 2001 From: Wayne Date: Sun, 28 Jan 2024 18:26:48 +0900 Subject: [PATCH] Add project entities --- build.gradle | 6 +- settings.gradle | 8 +++ .../project/entity/PaymentMilestone.kt | 19 +++++++ .../entity/PaymentMilestoneRepository.kt | 6 ++ .../tsms/modules/project/entity/Project.kt | 55 +++++++++++++++++++ .../project/entity/ProjectRepository.kt | 6 ++ .../modules/project/entity/ProjectTask.kt | 29 ++++++++++ .../project/entity/ProjectTaskRepository.kt | 6 ++ .../modules/project/entity/StaffAllocation.kt | 43 +++++++++++++++ .../entity/StaffAllocationRepository.kt | 6 ++ .../ffii/tsms/modules/project/entity/Task.kt | 30 ++++++++++ .../modules/project/entity/TaskRepository.kt | 6 ++ .../modules/project/entity/TaskTemplate.kt | 23 ++++++++ .../project/entity/TaskTemplateRepository.kt | 6 ++ .../changes/20240128_01_wayne/01_project.sql | 30 ++++++++++ .../changes/20240128_01_wayne/02_task.sql | 32 +++++++++++ .../20240128_01_wayne/03_milestone.sql | 9 +++ .../20240128_01_wayne/04_project_task.sql | 18 ++++++ .../20240128_01_wayne/05_staff_allocation.sql | 21 +++++++ 19 files changed, 358 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/PaymentMilestone.kt create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/PaymentMilestoneRepository.kt create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/Project.kt create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/ProjectRepository.kt create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/ProjectTask.kt create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/ProjectTaskRepository.kt create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/StaffAllocation.kt create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/StaffAllocationRepository.kt create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/Task.kt create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/TaskRepository.kt create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/TaskTemplate.kt create mode 100644 src/main/java/com/ffii/tsms/modules/project/entity/TaskTemplateRepository.kt create mode 100644 src/main/resources/db/changelog/changes/20240128_01_wayne/01_project.sql create mode 100644 src/main/resources/db/changelog/changes/20240128_01_wayne/02_task.sql create mode 100644 src/main/resources/db/changelog/changes/20240128_01_wayne/03_milestone.sql create mode 100644 src/main/resources/db/changelog/changes/20240128_01_wayne/04_project_task.sql create mode 100644 src/main/resources/db/changelog/changes/20240128_01_wayne/05_staff_allocation.sql diff --git a/build.gradle b/build.gradle index 5bc33a9..b6b333e 100644 --- a/build.gradle +++ b/build.gradle @@ -2,13 +2,13 @@ plugins { id 'java' id 'org.springframework.boot' version '3.1.1' id 'io.spring.dependency-management' version '1.1.0' + id 'org.jetbrains.kotlin.jvm' } group = 'com.ffii' version = '0.0.1-SNAPSHOT' java { - sourceCompatibility = '17' } repositories { @@ -47,6 +47,7 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } configurations { @@ -54,3 +55,6 @@ configurations { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } } +kotlin { + jvmToolchain(17) +} diff --git a/settings.gradle b/settings.gradle index 3de5431..6741f12 100644 --- a/settings.gradle +++ b/settings.gradle @@ -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' diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/PaymentMilestone.kt b/src/main/java/com/ffii/tsms/modules/project/entity/PaymentMilestone.kt new file mode 100644 index 0000000..474bdd3 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/PaymentMilestone.kt @@ -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() { + @NotNull + @Column(name = "name") + open var name: String? = null + + @NotNull + @Column(name = "description") + open var description: String? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/PaymentMilestoneRepository.kt b/src/main/java/com/ffii/tsms/modules/project/entity/PaymentMilestoneRepository.kt new file mode 100644 index 0000000..4af39cf --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/PaymentMilestoneRepository.kt @@ -0,0 +1,6 @@ +package com.ffii.tsms.modules.project.entity; + +import com.ffii.core.support.AbstractRepository + +interface PaymentMilestoneRepository : AbstractRepository { +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/Project.kt b/src/main/java/com/ffii/tsms/modules/project/entity/Project.kt new file mode 100644 index 0000000..daa4a96 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/Project.kt @@ -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() { + @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 +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/ProjectRepository.kt b/src/main/java/com/ffii/tsms/modules/project/entity/ProjectRepository.kt new file mode 100644 index 0000000..2fbadce --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/ProjectRepository.kt @@ -0,0 +1,6 @@ +package com.ffii.tsms.modules.project.entity; + +import com.ffii.core.support.AbstractRepository + +interface ProjectRepository : AbstractRepository { +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/ProjectTask.kt b/src/main/java/com/ffii/tsms/modules/project/entity/ProjectTask.kt new file mode 100644 index 0000000..000a4d1 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/ProjectTask.kt @@ -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() { + @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 +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/ProjectTaskRepository.kt b/src/main/java/com/ffii/tsms/modules/project/entity/ProjectTaskRepository.kt new file mode 100644 index 0000000..bc0dff7 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/ProjectTaskRepository.kt @@ -0,0 +1,6 @@ +package com.ffii.tsms.modules.project.entity; + +import com.ffii.core.support.AbstractRepository + +interface ProjectTaskRepository : AbstractRepository { +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/StaffAllocation.kt b/src/main/java/com/ffii/tsms/modules/project/entity/StaffAllocation.kt new file mode 100644 index 0000000..6fdfe59 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/StaffAllocation.kt @@ -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() { + @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 +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/StaffAllocationRepository.kt b/src/main/java/com/ffii/tsms/modules/project/entity/StaffAllocationRepository.kt new file mode 100644 index 0000000..38a06a8 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/StaffAllocationRepository.kt @@ -0,0 +1,6 @@ +package com.ffii.tsms.modules.project.entity; + +import com.ffii.core.support.AbstractRepository + +interface StaffAllocationRepository : AbstractRepository { +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/Task.kt b/src/main/java/com/ffii/tsms/modules/project/entity/Task.kt new file mode 100644 index 0000000..3d8d3cd --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/Task.kt @@ -0,0 +1,30 @@ +package com.ffii.tsms.modules.project.entity + +import com.ffii.core.entity.BaseEntity +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.Table +import org.hibernate.proxy.HibernateProxy + +@Entity +@Table(name = "task") +open class Task : BaseEntity() { + @Column(name = "name") + open var name: String? = null + + @Column(name = "description") + open var description: 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 Task + + return id != null && id == other.id + } + + final override fun hashCode(): Int = if (this is HibernateProxy) this.hibernateLazyInitializer.persistentClass.hashCode() else javaClass.hashCode() +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/TaskRepository.kt b/src/main/java/com/ffii/tsms/modules/project/entity/TaskRepository.kt new file mode 100644 index 0000000..f76d823 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/TaskRepository.kt @@ -0,0 +1,6 @@ +package com.ffii.tsms.modules.project.entity; + +import com.ffii.core.support.AbstractRepository + +interface TaskRepository : AbstractRepository { +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/TaskTemplate.kt b/src/main/java/com/ffii/tsms/modules/project/entity/TaskTemplate.kt new file mode 100644 index 0000000..06dfcf8 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/TaskTemplate.kt @@ -0,0 +1,23 @@ +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() { + @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")]) + open var tasks: MutableSet = mutableSetOf() +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/TaskTemplateRepository.kt b/src/main/java/com/ffii/tsms/modules/project/entity/TaskTemplateRepository.kt new file mode 100644 index 0000000..90efb7c --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/project/entity/TaskTemplateRepository.kt @@ -0,0 +1,6 @@ +package com.ffii.tsms.modules.project.entity; + +import com.ffii.core.support.AbstractRepository + +interface TaskTemplateRepository : AbstractRepository { +} \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/20240128_01_wayne/01_project.sql b/src/main/resources/db/changelog/changes/20240128_01_wayne/01_project.sql new file mode 100644 index 0000000..8958e49 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20240128_01_wayne/01_project.sql @@ -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); \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/20240128_01_wayne/02_task.sql b/src/main/resources/db/changelog/changes/20240128_01_wayne/02_task.sql new file mode 100644 index 0000000..d53374c --- /dev/null +++ b/src/main/resources/db/changelog/changes/20240128_01_wayne/02_task.sql @@ -0,0 +1,32 @@ +-- liquibase formatted sql + +-- changeset wayne:task +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) NULL, + `description` VARCHAR(255) NULL, + CONSTRAINT pk_task PRIMARY KEY (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); \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/20240128_01_wayne/03_milestone.sql b/src/main/resources/db/changelog/changes/20240128_01_wayne/03_milestone.sql new file mode 100644 index 0000000..72d7550 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20240128_01_wayne/03_milestone.sql @@ -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) +); diff --git a/src/main/resources/db/changelog/changes/20240128_01_wayne/04_project_task.sql b/src/main/resources/db/changelog/changes/20240128_01_wayne/04_project_task.sql new file mode 100644 index 0000000..c387cb6 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20240128_01_wayne/04_project_task.sql @@ -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); \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/20240128_01_wayne/05_staff_allocation.sql b/src/main/resources/db/changelog/changes/20240128_01_wayne/05_staff_allocation.sql new file mode 100644 index 0000000..1513069 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20240128_01_wayne/05_staff_allocation.sql @@ -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); \ No newline at end of file