| @@ -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); | |||||