| @@ -0,0 +1,63 @@ | |||
| package com.ffii.fpsms.modules.master.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 jakarta.validation.constraints.Size | |||
| @Entity | |||
| @Table(name = "shop") | |||
| open class Shop : BaseEntity<Long>() { | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "code", nullable = false, length = 30) | |||
| open var code: String? = null | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "name", nullable = false, length = 30) | |||
| open var name: String? = null | |||
| @Size(max = 30) | |||
| @Column(name = "brNo", length = 30) | |||
| open var brNo: String? = null | |||
| @Size(max = 30) | |||
| @Column(name = "contactNo", length = 30) | |||
| open var contactNo: String? = null | |||
| @Size(max = 30) | |||
| @Column(name = "contactEmail", length = 30) | |||
| open var contactEmail: String? = null | |||
| @Size(max = 30) | |||
| @Column(name = "contactName", length = 30) | |||
| open var contactName: String? = null | |||
| @Size(max = 30) | |||
| @Column(name = "addr1", length = 30) | |||
| open var addr1: String? = null | |||
| @Size(max = 30) | |||
| @Column(name = "addr2", length = 30) | |||
| open var addr2: String? = null | |||
| @Size(max = 30) | |||
| @Column(name = "addr3", length = 30) | |||
| open var addr3: String? = null | |||
| @Size(max = 30) | |||
| @Column(name = "addr4", length = 30) | |||
| open var addr4: String? = null | |||
| @Size(max = 30) | |||
| @Column(name = "district", length = 30) | |||
| open var district: String? = null | |||
| @Size(max = 10) | |||
| @Column(name = "type", length = 10) | |||
| open var type: String? = null | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface ShopRepository : AbstractRepository<Shop, Long> { | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| package com.ffii.fpsms.modules.master.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 jakarta.validation.constraints.Size | |||
| import java.math.BigDecimal | |||
| @Entity | |||
| @Table(name = "warehouse") | |||
| open class Warehouse : BaseEntity<Long>() { | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "code", nullable = false, length = 30) | |||
| open var code: String? = null | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "name", nullable = false, length = 30) | |||
| open var name: String? = null | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "description", nullable = false, length = 30) | |||
| open var description: String? = null | |||
| @NotNull | |||
| @Column(name = "capacity", nullable = false, precision = 14, scale = 2) | |||
| open var capacity: BigDecimal? = null | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface WarehouseRepository : AbstractRepository<Warehouse, Long> { | |||
| } | |||
| @@ -2,8 +2,11 @@ package com.ffii.fpsms.modules.stock.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import com.ffii.fpsms.modules.master.entity.Items | |||
| import com.ffii.fpsms.modules.master.entity.Warehouse | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| import jakarta.validation.constraints.Size | |||
| import java.math.BigDecimal | |||
| import java.time.LocalDate | |||
| @Entity | |||
| @@ -36,4 +39,16 @@ open class Inventory: BaseEntity<Long>(){ | |||
| // @NotNull | |||
| @Column(name = "status") | |||
| open var status: String? = null | |||
| @NotNull | |||
| @ManyToOne(fetch = FetchType.LAZY, optional = false) | |||
| @JoinColumn(name = "warehouseId", nullable = false) | |||
| open var warehouse: Warehouse? = null | |||
| @Column(name = "price", precision = 14, scale = 2) | |||
| open var price: BigDecimal? = null | |||
| @Size(max = 5) | |||
| @Column(name = "priceUnit", length = 5) | |||
| open var priceUnit: String? = null | |||
| } | |||
| @@ -0,0 +1,25 @@ | |||
| package com.ffii.fpsms.modules.stock.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| import jakarta.validation.constraints.Size | |||
| import org.hibernate.annotations.JdbcTypeCode | |||
| import org.hibernate.type.SqlTypes | |||
| @Entity | |||
| @Table(name = "inventory_lot_no") | |||
| open class InventoryLotNo : BaseEntity<Long>() { | |||
| @NotNull | |||
| @ManyToOne(fetch = FetchType.LAZY, optional = false) | |||
| @JoinColumn(name = "inventoryId", nullable = false) | |||
| open var inventory: Inventory? = null | |||
| @Size(max = 30) | |||
| @Column(name = "lotNo", length = 30) | |||
| open var lotNo: String? = null | |||
| @JdbcTypeCode(SqlTypes.JSON) | |||
| @Column(name = "qrCodeJson") | |||
| open var qrCodeJson: MutableMap<String, Any>? = null | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.stock.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface InventoryLotNoRepository : AbstractRepository<InventoryLotNo, Long> { | |||
| } | |||
| @@ -0,0 +1,33 @@ | |||
| package com.ffii.fpsms.modules.stock.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 jakarta.validation.constraints.Size | |||
| import org.hibernate.annotations.JdbcTypeCode | |||
| import org.hibernate.type.SqlTypes | |||
| @Entity | |||
| @Table(name = "m18_data_log") | |||
| open class M18DataLog : BaseEntity<Long>() { | |||
| @Size(max = 10) | |||
| @NotNull | |||
| @Column(name = "refType", nullable = false, length = 10) | |||
| open var refType: String? = null | |||
| @NotNull | |||
| @Column(name = "m18Key", nullable = false) | |||
| open var m18Key: Int? = null | |||
| @NotNull | |||
| @JdbcTypeCode(SqlTypes.JSON) | |||
| @Column(name = "dataLog", nullable = false) | |||
| open var dataLog: MutableMap<String, Any>? = null | |||
| @Size(max = 5) | |||
| @NotNull | |||
| @Column(name = "status", nullable = false, length = 5) | |||
| open var status: String? = null | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.stock.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface M18DataLogRepository : AbstractRepository<M18DataLog, Long> { | |||
| } | |||
| @@ -0,0 +1,50 @@ | |||
| package com.ffii.fpsms.modules.stock.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import com.ffii.fpsms.modules.master.entity.Shop | |||
| import com.ffii.fpsms.modules.stock.entity.enum.StockInStatus | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| import jakarta.validation.constraints.Size | |||
| import java.time.Instant | |||
| import java.time.LocalDate | |||
| import java.time.LocalDateTime | |||
| @Entity | |||
| @Table(name = "stock_in") | |||
| open class StockIn : BaseEntity<Long>() { | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "code", nullable = false, length = 30) | |||
| open var code: String? = null | |||
| @ManyToOne(fetch = FetchType.LAZY, optional = false) | |||
| @JoinColumn(name = "supplierId") | |||
| open var supplier: Shop? = null | |||
| @ManyToOne(fetch = FetchType.LAZY, optional = false) | |||
| @JoinColumn(name = "shopId") | |||
| open var shop: Shop? = null | |||
| @Column(name = "refId") | |||
| open var refId: Int? = null | |||
| @Size(max = 5) | |||
| @Column(name = "refType", length = 5) | |||
| open var refType: String? = null | |||
| @Column(name = "orderDate") | |||
| open var orderDate: LocalDateTime? = null | |||
| @Column(name = "estimatedCompleteDate") | |||
| open var estimatedCompleteDate: LocalDate? = null | |||
| @Column(name = "completeDate") | |||
| open var completeDate: LocalDateTime? = null | |||
| @Size(max = 10) | |||
| @NotNull | |||
| @Column(name = "status", nullable = false, length = 10) | |||
| @Enumerated(EnumType.STRING) | |||
| open var status: StockInStatus? = null | |||
| } | |||
| @@ -0,0 +1,64 @@ | |||
| package com.ffii.fpsms.modules.stock.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import com.ffii.fpsms.modules.master.entity.Items | |||
| import com.ffii.fpsms.modules.stock.entity.enum.StockInLineStatus | |||
| import com.ffii.fpsms.modules.user.entity.User | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| import jakarta.validation.constraints.Size | |||
| import java.math.BigDecimal | |||
| import java.time.Instant | |||
| @Entity | |||
| @Table(name = "stock_in_line") | |||
| open class StockInLine : BaseEntity<Long>() { | |||
| @NotNull | |||
| @ManyToOne(fetch = FetchType.LAZY, optional = false) | |||
| @JoinColumn(name = "itemId", nullable = false) | |||
| open var item: Items? = null | |||
| @Size(max = 20) | |||
| @NotNull | |||
| @Column(name = "itemNo", nullable = false, length = 20) | |||
| open var itemNo: String? = null | |||
| @NotNull | |||
| @ManyToOne(fetch = FetchType.LAZY, optional = false) | |||
| @JoinColumn(name = "stockInId", nullable = false) | |||
| open var stockIn: StockIn? = null | |||
| @Column(name = "demandQty", precision = 14, scale = 2) | |||
| open var demandQty: BigDecimal? = null | |||
| @Column(name = "acceptedQty", precision = 14, scale = 2) | |||
| open var acceptedQty: BigDecimal? = null | |||
| @Column(name = "price", precision = 14, scale = 2) | |||
| open var price: BigDecimal? = null | |||
| @Size(max = 5) | |||
| @Column(name = "priceUnit", length = 5) | |||
| open var priceUnit: String? = null | |||
| @Column(name = "productDate") | |||
| open var productDate: Instant? = null | |||
| @Column(name = "shelfLifeDate") | |||
| open var shelfLifeDate: Instant? = null | |||
| @Size(max = 10) | |||
| @NotNull | |||
| @Column(name = "status", nullable = false, length = 10) | |||
| @Enumerated(EnumType.STRING) | |||
| open var status: StockInLineStatus? = null | |||
| @ManyToOne(fetch = FetchType.LAZY) | |||
| @JoinColumn(name = "userId") | |||
| open var user: User? = null | |||
| @NotNull | |||
| @ManyToOne(fetch = FetchType.LAZY, optional = false) | |||
| @JoinColumn(name = "m18DataLogId", nullable = false) | |||
| open var m18DataLog: M18DataLog? = null | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.stock.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface StockInLineRepository : AbstractRepository<StockInLine, Long> { | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.stock.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface StockInRepository : AbstractRepository<StockIn, Long> { | |||
| } | |||
| @@ -0,0 +1,10 @@ | |||
| package com.ffii.fpsms.modules.stock.entity.enum | |||
| enum class StockInLineStatus(val status: String) { | |||
| PENDING("pending"), | |||
| QC1("qc1"), | |||
| QC2("qc2"), | |||
| QC3("qc3"), | |||
| RECEIVING("receiving"), | |||
| COMPLETED("completed") | |||
| } | |||
| @@ -0,0 +1,7 @@ | |||
| package com.ffii.fpsms.modules.stock.entity.enum | |||
| enum class StockInStatus(val status: String) { | |||
| PENDING("pending"), | |||
| RECEIVING("receiving"), | |||
| COMPLETED("completed") | |||
| } | |||
| @@ -0,0 +1,43 @@ | |||
| --liquibase formatted sql | |||
| --changeset cyril:master data for shop and warehouse | |||
| CREATE TABLE `shop` | |||
| ( | |||
| `id` INT NOT NULL AUTO_INCREMENT, | |||
| `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `createdBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `version` INT NOT NULL DEFAULT '0', | |||
| `modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `modifiedBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `deleted` TINYINT(1) NOT NULL DEFAULT '0', | |||
| `code` VARCHAR(30) NOT NULL, | |||
| `name` VARCHAR(30) NOT NULL, | |||
| `brNo` VARCHAR(30) NULL, | |||
| `contactNo` VARCHAR(30) NULL, | |||
| `contactEmail` VARCHAR(30) NULL, | |||
| `contactName` VARCHAR(30) NULL, | |||
| `addr1` VARCHAR(30) NULL, | |||
| `addr2` VARCHAR(30) NULL, | |||
| `addr3` VARCHAR(30) NULL, | |||
| `addr4` VARCHAR(30) NULL, | |||
| `district` VARCHAR(30) NULL, | |||
| `type` VARCHAR(10) NULL, | |||
| `m18Id` INT NOT NULL, | |||
| CONSTRAINT pk_shop PRIMARY KEY (id) | |||
| ); | |||
| CREATE TABLE `warehouse` | |||
| ( | |||
| `id` INT NOT NULL AUTO_INCREMENT, | |||
| `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `createdBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `version` INT NOT NULL DEFAULT '0', | |||
| `modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `modifiedBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `deleted` TINYINT(1) NOT NULL DEFAULT '0', | |||
| `code` VARCHAR(30) NOT NULL, | |||
| `name` VARCHAR(30) NOT NULL, | |||
| `description` VARCHAR(30) NOT NULL, | |||
| `capacity` DECIMAL(14, 2) NOT NULL, | |||
| CONSTRAINT pk_warehouse PRIMARY KEY (id) | |||
| ); | |||
| @@ -0,0 +1,18 @@ | |||
| --liquibase formatted sql | |||
| --changeset cyril:m18 data log | |||
| CREATE TABLE `m18_data_log` | |||
| ( | |||
| `id` INT NOT NULL AUTO_INCREMENT, | |||
| `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `createdBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `version` INT NOT NULL DEFAULT '0', | |||
| `modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `modifiedBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `deleted` TINYINT(1) NOT NULL DEFAULT '0', | |||
| `refType` VARCHAR(10) NOT NULL, | |||
| `m18Key` INT NOT NULL, | |||
| `dataLog` JSON NOT NULL, | |||
| `status` VARCHAR(5) NOT NULL, | |||
| CONSTRAINT pk_m18_data_log PRIMARY KEY (id) | |||
| ); | |||
| @@ -0,0 +1,55 @@ | |||
| --liquibase formatted sql | |||
| --changeset cyril:stock in | |||
| CREATE TABLE `stock_in` | |||
| ( | |||
| `id` INT NOT NULL AUTO_INCREMENT, | |||
| `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `createdBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `version` INT NOT NULL DEFAULT '0', | |||
| `modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `modifiedBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `deleted` TINYINT(1) NOT NULL DEFAULT '0', | |||
| `code` VARCHAR(30) NOT NULL, | |||
| `supplierId` INT NULL, | |||
| `shopId` INT NULL, | |||
| `refId` INT NULL, | |||
| `refType` VARCHAR(5) NULL, | |||
| `orderDate` DATETIME NULL, | |||
| `estimatedCompleteDate` DATETIME NULL, | |||
| `completeDate` DATETIME NULL, | |||
| `status` VARCHAR(10) NOT NULL DEFAULT 'pending', | |||
| `m18DataLogId` INT NOT NULL, | |||
| CONSTRAINT pk_stock_in PRIMARY KEY (id), | |||
| CONSTRAINT FK_STOCK_IN_ON_SUPPLIERID FOREIGN KEY (supplierId) REFERENCES shop (id), | |||
| CONSTRAINT FK_STOCK_IN_ON_SHOPID FOREIGN KEY (shopId) REFERENCES shop (id), | |||
| CONSTRAINT FK_STOCK_IN_ON_M18DATALOGID FOREIGN KEY (m18DataLogId) REFERENCES m18_data_log (id) | |||
| ); | |||
| CREATE TABLE `stock_in_line` | |||
| ( | |||
| `id` INT NOT NULL AUTO_INCREMENT, | |||
| `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `createdBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `version` INT NOT NULL DEFAULT '0', | |||
| `modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `modifiedBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `deleted` TINYINT(1) NOT NULL DEFAULT '0', | |||
| `itemId` INT NOT NULL, | |||
| `itemNo` VARCHAR(20) NOT NULL, | |||
| `stockInId` INT NOT NULL, | |||
| `demandQty` DECIMAL(14, 2) NULL, | |||
| `acceptedQty` DECIMAL(14, 2) NULL, | |||
| `price` DECIMAL(14, 2) NULL, | |||
| `priceUnit` VARCHAR(5) NULL, | |||
| `productDate` DATETIME NULL, | |||
| `shelfLifeDate` DATETIME NULL, | |||
| `status` VARCHAR(10) NOT NULL DEFAULT 'pending', | |||
| `userId` INT NULL, | |||
| `m18DataLogId` INT NOT NULL, | |||
| CONSTRAINT pk_stock_in_line PRIMARY KEY (id), | |||
| CONSTRAINT FK_STOCK_IN_LINE_ON_ITEMID FOREIGN KEY (itemId) REFERENCES items (id), | |||
| CONSTRAINT FK_STOCK_IN_LINE_ON_STOCKINID FOREIGN KEY (stockInId) REFERENCES stock_in (id), | |||
| CONSTRAINT FK_STOCK_IN_LINE_ON_USERID FOREIGN KEY (userId) REFERENCES user (id), | |||
| CONSTRAINT FK_STOCK_IN_LINE_ON_M18DATALOGID FOREIGN KEY (m18DataLogId) REFERENCES m18_data_log (id) | |||
| ); | |||
| @@ -0,0 +1,25 @@ | |||
| --liquibase formatted sql | |||
| --changeset cyril:inventory | |||
| ALTER TABLE `inventory` | |||
| ADD COLUMN `price` DECIMAL(14, 2) NULL AFTER `qty`, | |||
| ADD COLUMN `priceUnit` VARCHAR(5) NULL AFTER `price`, | |||
| ADD COLUMN `warehouseId` INT NOT NULL AFTER `stockInLineId`, | |||
| ADD CONSTRAINT FK_INVENTORY_STOCKINLINEID FOREIGN KEY (stockInLineId) REFERENCES stock_in_line (id), | |||
| ADD CONSTRAINT FK_INVENTORY_WAREHOUSEID FOREIGN KEY (warehouseId) REFERENCES warehouse (id); | |||
| CREATE TABLE `inventory_lot_no` | |||
| ( | |||
| `id` INT NOT NULL AUTO_INCREMENT, | |||
| `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `createdBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `version` INT NOT NULL DEFAULT '0', | |||
| `modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||
| `modifiedBy` VARCHAR(30) NULL DEFAULT NULL, | |||
| `deleted` TINYINT(1) NOT NULL DEFAULT '0', | |||
| `inventoryId` INT NOT NULL, | |||
| `lotNo` VARCHAR(30) NULL, | |||
| `qrCodeJson` JSON NULL, | |||
| CONSTRAINT pk_inventory_lot_no PRIMARY KEY (id), | |||
| CONSTRAINT FK_INVENTORY_LOT_NO_INVENTORYID FOREIGN KEY (inventoryId) REFERENCES inventory (id) | |||
| ); | |||