diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrder.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrder.kt new file mode 100644 index 0000000..273074f --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrder.kt @@ -0,0 +1,57 @@ +package com.ffii.fpsms.modules.pickOrder.entity + +import com.fasterxml.jackson.annotation.JsonManagedReference +import com.ffii.core.entity.BaseEntity +import com.ffii.fpsms.modules.deliveryOrder.entity.DeliveryOrder +import com.ffii.fpsms.modules.jobOrder.entity.JobOrder +import com.ffii.fpsms.modules.master.entity.BomMaterial +import com.ffii.fpsms.modules.user.entity.User +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Size +import org.hibernate.annotations.Formula +import java.time.LocalDateTime + +@Entity +@Table(name = "pick_order") +open class PickOrder: BaseEntity() { + @Size(max = 255) + @NotNull + @Column(name = "code", nullable = false) + open var code: String? = null + + @Size(max = 255) + @Column(name = "consoCode") + open var consoCode: String? = null + + @ManyToOne + @JoinColumn(name = "joId") + open var jobOrder: JobOrder? = null + + @ManyToOne + @JoinColumn(name = "doId") + open var deliveryOrder: DeliveryOrder? = null + + @Column(name = "targetDate") + open var targetDate: LocalDateTime? = null + + @Column(name = "completeDate") + open var completeDate: LocalDateTime? = null + + @Size(max = 30) + @Column(name = "type", length = 30) + open var type: String? = null + + @Size(max = 30) + @NotNull + @Column(name = "status", nullable = false, length = 30) + open var status: String? = null + + @ManyToOne + @JoinColumn(name = "releasedBy", referencedColumnName = "id") + open var releasedBy: User? = null + + @JsonManagedReference + @OneToMany(mappedBy = "pickOrder", cascade = [CascadeType.ALL], orphanRemoval = true) + open var pickOrderLines: MutableList = mutableListOf() +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderLine.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderLine.kt new file mode 100644 index 0000000..8bfccd1 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderLine.kt @@ -0,0 +1,38 @@ +package com.ffii.fpsms.modules.pickOrder.entity + +import com.ffii.core.entity.BaseEntity +import com.ffii.fpsms.modules.master.entity.Items +import com.ffii.fpsms.modules.master.entity.UomConversion +import jakarta.persistence.* +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Size +import java.math.BigDecimal + +@Entity +@Table(name = "pick_order_line") +open class PickOrderLine : BaseEntity() { + + @NotNull + @ManyToOne + @JoinColumn(name = "poId", nullable = false) + open var pickOrder: PickOrder? = null + + @NotNull + @ManyToOne + @JoinColumn(name = "itemId", nullable = false) + open var item: Items? = null + + @NotNull + @Column(name = "qty", nullable = false, precision = 14, scale = 2) + open var qty: BigDecimal? = null + + @NotNull + @ManyToOne + @JoinColumn(name = "uomId", nullable = false) + open var uom: UomConversion? = null + + @Size(max = 30) + @NotNull + @Column(name = "status", nullable = false, length = 30) + open var status: String? = null +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderLineRepository.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderLineRepository.kt new file mode 100644 index 0000000..5960349 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderLineRepository.kt @@ -0,0 +1,9 @@ +package com.ffii.fpsms.modules.pickOrder.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository + +@Repository +interface PickOrderLineRepository : AbstractRepository { + +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt new file mode 100644 index 0000000..80f3634 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt @@ -0,0 +1,11 @@ +package com.ffii.fpsms.modules.pickOrder.entity + +import com.ffii.core.support.AbstractRepository +import com.ffii.fpsms.modules.pickOrder.entity.projection.PickOrderInfo +import org.springframework.data.jpa.repository.Query +import org.springframework.stereotype.Repository + +@Repository +interface PickOrderRepository: AbstractRepository { + fun findPickOrderInfoByDeletedIsFalse(): List +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/projection/PickOrderInfo.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/projection/PickOrderInfo.kt new file mode 100644 index 0000000..bcfbe5f --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/projection/PickOrderInfo.kt @@ -0,0 +1,24 @@ +package com.ffii.fpsms.modules.pickOrder.entity.projection + +import org.springframework.beans.factory.annotation.Value +import java.time.LocalDateTime + +data class PickOrderItemInfo( + val name: String?, + val type: String?, +) + +interface PickOrderInfo { + val id: Long? + val code: String? + val consoCode: String? + val targetDate: LocalDateTime? + val completeDate: LocalDateTime? + val type: String? + val status: String? + + @get:Value("#{target.releasedBy.name}") + val releasedBy: String? + @get:Value("#{target.pickOrderLines?.size() > 0 ? target.pickOrderLines.![new com.ffii.fpsms.modules.pickOrder.entity.projection.PickOrderItemInfo(item.name, item.type)] : null}") + val items: List? +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt new file mode 100644 index 0000000..13f08b8 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt @@ -0,0 +1,19 @@ +package com.ffii.fpsms.modules.pickOrder.service + +import com.ffii.fpsms.modules.pickOrder.entity.PickOrderRepository +import com.ffii.fpsms.modules.pickOrder.entity.projection.PickOrderInfo +import org.springframework.stereotype.Service + +@Service +open class PickOrderService( + val pickOrderRepository: PickOrderRepository, +) { + open fun allPickOrders(): List { + return pickOrderRepository.findPickOrderInfoByDeletedIsFalse() + } + + // Consolidating Pick Orders + open fun consoPickOrders() { + + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt new file mode 100644 index 0000000..b12fd9d --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/web/PickOrderController.kt @@ -0,0 +1,18 @@ +package com.ffii.fpsms.modules.pickOrder.web + +import com.ffii.fpsms.modules.pickOrder.entity.projection.PickOrderInfo +import com.ffii.fpsms.modules.pickOrder.service.PickOrderService +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/pickOrder") +class PickOrderController( + private val pickOrderService: PickOrderService, +) { + @GetMapping("/list") + fun allPickOrders(): List { + return pickOrderService.allPickOrders(); + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/Inventory.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/Inventory.kt index 49496ed..29f3c95 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/Inventory.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/Inventory.kt @@ -22,8 +22,9 @@ open class Inventory: BaseEntity(){ @Column(name = "price") open var price: BigDecimal? = null - @Column(name = "stockInLineId") - open var stockInLine: Long? = null // change this later + @ManyToOne + @JoinColumn(name = "itemId") + open var item: Items? = null @ManyToOne @JoinColumn(name = "currencyId") @@ -48,7 +49,7 @@ open class Inventory: BaseEntity(){ @NotNull @ManyToOne @JoinColumn(name = "uomId") - open var uomId: UomConversion? = null + open var uom: UomConversion? = null // @NotNull @Column(name = "status") diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryRepository.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryRepository.kt index 354ed59..82a0bd3 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryRepository.kt @@ -1,8 +1,10 @@ package com.ffii.fpsms.modules.stock.entity import com.ffii.core.support.AbstractRepository +import com.ffii.fpsms.modules.stock.entity.projection.InventoryInfo import org.springframework.stereotype.Repository @Repository interface InventoryRepository: AbstractRepository { + fun findInventoryInfoByDeletedIsFalse(): List } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/InventoryInfo.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/InventoryInfo.kt new file mode 100644 index 0000000..70db487 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/InventoryInfo.kt @@ -0,0 +1,35 @@ +package com.ffii.fpsms.modules.stock.entity.projection + +import org.springframework.beans.factory.annotation.Value +import java.math.BigDecimal + +interface InventoryInfo{ + val id: Long? + @get:Value("#{target.item.code}") + val code: String? + @get:Value("#{target.item.name}") + val name: String? + @get:Value("#{target.item.type}") + val type: String? + val qty: BigDecimal? + @get:Value("#{target.uom.code}") + val uomCode: String? + @get:Value("#{target.uom.udfudesc}") + val uomUdfudesc: String? + @get:Value("#{target.qty * target.uom.gramPerSmallestUnit}") + val germPerSmallestUnit: BigDecimal? + @get:Value("#{target.qty * (target.uom.unit4 != '' ? target.uom.unit4Qty " + + ": target.uom.unit3 != '' ? target.uom.unit3Qty " + + ": target.uom.unit2 != '' ? target.uom.unit2Qty " + + ": target.uom.unit1Qty)}") + val qtyPerSmallestUnit: BigDecimal? + @get:Value("#{target.uom.unit4 != '' ? target.uom.unit4 " + + ": target.uom.unit3 != '' ? target.uom.unit3 " + + ": target.uom.unit2 != '' ? target.uom.unit2 " + + ": target.uom.unit1}") + val smallestUnit: String? + val price: BigDecimal? + @get:Value("#{target.currency?.name}") + val currencyName: String? + val status: String? +} diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryService.kt index 653267d..01d959d 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryService.kt @@ -8,6 +8,7 @@ import com.ffii.fpsms.modules.master.entity.ItemsRepository import com.ffii.fpsms.modules.master.web.models.MessageResponse import com.ffii.fpsms.modules.stock.entity.Inventory import com.ffii.fpsms.modules.stock.entity.InventoryRepository +import com.ffii.fpsms.modules.stock.entity.projection.InventoryInfo import com.ffii.fpsms.modules.stock.web.model.SaveInventoryRequest import org.springframework.stereotype.Service import java.io.IOException @@ -25,6 +26,11 @@ open class InventoryService( val inventory = inventoryRepository.findAll() return inventory } + + open fun allInventories(): List{ + return inventoryRepository.findInventoryInfoByDeletedIsFalse(); + } + // @Throws(IOException::class) // open fun updateInventory(request: SaveInventoryRequest): MessageResponse { // // out need id diff --git a/src/main/java/com/ffii/fpsms/modules/stock/web/InventoryController.kt b/src/main/java/com/ffii/fpsms/modules/stock/web/InventoryController.kt new file mode 100644 index 0000000..f2aa678 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/stock/web/InventoryController.kt @@ -0,0 +1,18 @@ +package com.ffii.fpsms.modules.stock.web + +import com.ffii.fpsms.modules.stock.entity.projection.InventoryInfo +import com.ffii.fpsms.modules.stock.service.InventoryService +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/inventory") +class InventoryController( + private val inventoryService: InventoryService, +) { + @GetMapping("/list") + fun allInventories(): List { + return inventoryService.allInventories() + } +} \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/20250604_01_cyril/01_create_pick_order.sql b/src/main/resources/db/changelog/changes/20250604_01_cyril/01_create_pick_order.sql new file mode 100644 index 0000000..9636ba5 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20250604_01_cyril/01_create_pick_order.sql @@ -0,0 +1,46 @@ +-- liquibase formatted sql +-- changeset cyril:create pick order + +CREATE TABLE `pick_order` +( + `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(255) NOT NULL, + `consoCode` VARCHAR(255) NULL, + `joId` INT NULL, + `doId` INT NULL, + `targetDate` DATETIME NULL, + `completeDate` DATETIME NULL, + `type` VARCHAR(30) NULL, + `status` VARCHAR(30) NOT NULL DEFAULT 'pending', + `releasedBy` INT NULL, + CONSTRAINT pk_pick_order PRIMARY KEY (id), + CONSTRAINT `FK_PICK_ORDER_ON_JOID` FOREIGN KEY (`joId`) REFERENCES `job_order` (`id`), + CONSTRAINT `FK_PICK_ORDER_ON_DOID` FOREIGN KEY (`doId`) REFERENCES `delivery_order` (`id`), + CONSTRAINT `FK_PICK_ORDER_ON_RELEASEDBY` FOREIGN KEY (`releasedBy`) REFERENCES `user` (`id`) +); + +CREATE TABLE `pick_order_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', + `poId` INT NOT NULL, + `itemId` INT NOT NULL, + `qty` DECIMAL(14, 2) NOT NULL DEFAULT 0, + `uomId` INT NOT NULL, + `status` VARCHAR(30) NOT NULL DEFAULT 'pending', + CONSTRAINT pk_pick_order_line PRIMARY KEY (id), + CONSTRAINT `FK_PICK_ORDER_LINE_ON_POID` FOREIGN KEY (`poId`) REFERENCES `pick_order` (`id`), + CONSTRAINT `FK_PICK_ORDER_LINE_ON_ITEMID` FOREIGN KEY (`itemId`) REFERENCES `items` (`id`), + CONSTRAINT `FK_PICK_ORDER_LINE_ON_UOMID` FOREIGN KEY (`uomId`) REFERENCES `uom_conversion` (`id`) +); \ No newline at end of file