@@ -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 { | ||||
@@ -47,6 +47,7 @@ dependencies { | |||||
testImplementation 'org.springframework.boot:spring-boot-starter-test' | testImplementation 'org.springframework.boot:spring-boot-starter-test' | ||||
testImplementation 'org.springframework.security:spring-security-test' | testImplementation 'org.springframework.security:spring-security-test' | ||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" | |||||
} | } | ||||
configurations { | configurations { | ||||
@@ -54,3 +55,6 @@ configurations { | |||||
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' | 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,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,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<Long>() { | |||||
@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() | |||||
} |
@@ -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,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<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")]) | |||||
open var tasks: MutableSet<Task> = mutableSetOf() | |||||
} |
@@ -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,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,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); |
@@ -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); |