diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrder.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrder.kt index 69f7226..2f7972f 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrder.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrder.kt @@ -19,7 +19,7 @@ open class PurchaseOrder : BaseEntity() { @Column(name = "code", nullable = false, length = 30) open var code: String? = null - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne @JoinColumn(name = "supplierId") open var supplier: Shop? = null @@ -38,7 +38,7 @@ open class PurchaseOrder : BaseEntity() { open var status: PurchaseOrderStatus? = null @NotNull - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne @JoinColumn(name = "m18DataLogId", nullable = false) open var m18DataLog: M18DataLog? = null } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLine.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLine.kt index cc462c8..edb6cfa 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLine.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLine.kt @@ -15,7 +15,7 @@ import java.math.BigDecimal @Table(name = "purchase_order_line") open class PurchaseOrderLine : BaseEntity(){ @NotNull - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne @JoinColumn(name = "itemId", nullable = false) open var item: Items? = null @@ -30,7 +30,7 @@ open class PurchaseOrderLine : BaseEntity(){ // open var uom: UomConversion? = null @NotNull - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne @JoinColumn(name = "purchaseOrderId", nullable = false) open var purchaseOrder: PurchaseOrder? = null @@ -50,7 +50,7 @@ open class PurchaseOrderLine : BaseEntity(){ open var status: PurchaseOrderLineStatus? = null @NotNull - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne @JoinColumn(name = "m18DataLogId", nullable = false) open var m18DataLog: M18DataLog? = null } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt index 9bb07d0..83f3e5d 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt @@ -1,10 +1,15 @@ package com.ffii.fpsms.modules.purchaseOrder.entity import com.ffii.core.support.AbstractRepository +import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderLineInfo import org.springframework.stereotype.Repository import java.io.Serializable @Repository interface PurchaseOrderLineRepository : AbstractRepository { fun findByM18DataLogIdAndDeletedIsFalse(m18datalogId: Serializable): PurchaseOrderLine? + fun findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List + fun findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List + +// fun find } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderRepository.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderRepository.kt index 4e80f50..41691a1 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderRepository.kt @@ -1,10 +1,14 @@ package com.ffii.fpsms.modules.purchaseOrder.entity import com.ffii.core.support.AbstractRepository +import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo import org.springframework.stereotype.Repository import java.io.Serializable @Repository interface PurchaseOrderRepository : AbstractRepository { fun findByM18DataLogIdAndDeletedIsFalse(m18datalogId: Serializable): PurchaseOrder? + + fun findPurchaseOrderInfoByDeletedIsFalse(): List + fun findPurchaseOrderInfoByIdAndDeletedIsFalse(id: Long): PurchaseOrderInfo } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderInfo.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderInfo.kt new file mode 100644 index 0000000..9378faf --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderInfo.kt @@ -0,0 +1,18 @@ +package com.ffii.fpsms.modules.purchaseOrder.entity.projections + +import com.ffii.fpsms.modules.stock.entity.StockInLine +import org.springframework.beans.factory.annotation.Value +import java.time.LocalDate +import java.time.LocalDateTime + +interface PurchaseOrderInfo { + val id: Long + val code: String + val orderDate: LocalDateTime + val estimatedArrivalDate: LocalDateTime + val completeDate: LocalDateTime + val status: String + +// @get:Value("#{target.supplier?.name}") +// val supplier: String? +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderLineInfo.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderLineInfo.kt new file mode 100644 index 0000000..821edf2 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderLineInfo.kt @@ -0,0 +1,29 @@ +package com.ffii.fpsms.modules.purchaseOrder.entity.projections + +import com.ffii.fpsms.modules.stock.entity.StockInLine +import org.springframework.beans.factory.annotation.Value +import java.math.BigDecimal + +interface PurchaseOrderLineInfo { + val id: Long + @get:Value("#{target.purchaseOrder.id}") + val purchaseOrderId: Long + val itemNo: String + @get:Value("#{target.items?.name}") + val itemName: String? + val qty: BigDecimal + val price: BigDecimal + val status: String +} + +data class PoLineWithStockInLine ( + val id: Long, + val purchaseOrderId: Long, + val itemNo: String, + val itemName: String?, + val qty: BigDecimal, + val price: BigDecimal, + val status: String, + + val stockInLine: List? +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderLineService.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderLineService.kt index 53814c3..6f2ad54 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderLineService.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderLineService.kt @@ -7,6 +7,7 @@ import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLine import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository +import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderLineInfo import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderLineRequest import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderLineResponse @@ -17,11 +18,11 @@ import kotlin.jvm.optionals.getOrNull @Service open class PurchaseOrderLineService( - val purchaseOrderLineRepository: PurchaseOrderLineRepository, - val itemsService: ItemsService, - val itemsRepository: ItemsRepository, - val purchaseOrderRepository: PurchaseOrderRepository, - val m18DataLogRepository: M18DataLogRepository + private val purchaseOrderLineRepository: PurchaseOrderLineRepository, + private val itemsService: ItemsService, + private val itemsRepository: ItemsRepository, + private val purchaseOrderRepository: PurchaseOrderRepository, + private val m18DataLogRepository: M18DataLogRepository ) { open fun allPurchaseOrderLine(): List { return purchaseOrderLineRepository.findAll() @@ -30,6 +31,9 @@ open class PurchaseOrderLineService( open fun findPurchaseOrderLineByM18Id(m18DataLogId: Long): PurchaseOrderLine? { return purchaseOrderLineRepository.findByM18DataLogIdAndDeletedIsFalse(m18DataLogId) } + open fun findAllPoLineInfoByPoId(poId: Long): List { + return purchaseOrderLineRepository.findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(poId) + } open fun savePurchaseOrderLine(request: SavePurchaseOrderLineRequest): SavePurchaseOrderLineResponse { val purchaseOrderLine = diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt index 98ffe77..b381b93 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt @@ -1,26 +1,74 @@ package com.ffii.fpsms.modules.purchaseOrder.service +import com.ffii.core.support.AbstractBaseEntityService +import com.ffii.core.support.JdbcDao import com.ffii.fpsms.m18.entity.M18DataLogRepository import com.ffii.fpsms.modules.master.entity.ShopRepository import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder +import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository +import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PoLineWithStockInLine +import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderRequest import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderResponse +import com.ffii.fpsms.modules.stock.entity.StockInLine +import com.ffii.fpsms.modules.stock.entity.StockInLineRepository +import com.ffii.fpsms.modules.stock.entity.StockInRepository import org.springframework.stereotype.Service +import java.util.HashMap +import java.util.Objects import kotlin.jvm.optionals.getOrDefault import kotlin.jvm.optionals.getOrNull @Service open class PurchaseOrderService( - val purchaseOrderRepository: PurchaseOrderRepository, - val shopRepository: ShopRepository, - val m18DataLogRepository: M18DataLogRepository, -) { + private val jdbcDao: JdbcDao, + private val purchaseOrderRepository: PurchaseOrderRepository, + private val polRepository: PurchaseOrderLineRepository, + private val shopRepository: ShopRepository, + private val m18DataLogRepository: M18DataLogRepository, + private val stockInRepository: StockInRepository, + private val stockInLineRepository: StockInLineRepository, +): AbstractBaseEntityService(jdbcDao, purchaseOrderRepository) { + open fun getPoList(): List { + return purchaseOrderRepository.findPurchaseOrderInfoByDeletedIsFalse() + } open fun allPurchaseOrder(): List { return purchaseOrderRepository.findAll() } - + open fun getDetailedPo(id: Long): Map { + val po = purchaseOrderRepository.findPurchaseOrderInfoByIdAndDeletedIsFalse(id) + val pol = polRepository.findAllByPurchaseOrderIdAndDeletedIsFalse(id) +// val pol = polRepository.findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(id) + val stockIn = stockInRepository.findByPurchaseOrderIdAndDeletedFalse(id) + val stockInLine = if (stockIn == null) listOf() else { + stockInLineRepository.findAllByStockInIdAndDeletedFalse(stockIn.id!!) + } + val mappedPoLine = pol.map { thisPol -> + val inLine = stockInLine.filter { it.itemNo.equals(thisPol.itemNo)} + PoLineWithStockInLine( + thisPol.id!!, + thisPol.purchaseOrder!!.id!!, + thisPol.itemNo!!, + thisPol.item!!.name, + thisPol.qty!!, + thisPol.price!!, + thisPol.status!!.toString(), + inLine + ) + } + val result = mapOf( + "id" to po.id, + "code" to po.code, + "orderDate" to po.orderDate, + "estimatedArrivalDate" to po.estimatedArrivalDate, + "completeDate" to po.completeDate, + "status" to po.status, + "pol" to mappedPoLine + ) + return result + } open fun findPurchaseOrderByM18Id(m18DataLogId: Long): PurchaseOrder? { return purchaseOrderRepository.findByM18DataLogIdAndDeletedIsFalse(m18DataLogId) } diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/PurchaseOrderController.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/PurchaseOrderController.kt new file mode 100644 index 0000000..8db33db --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/PurchaseOrderController.kt @@ -0,0 +1,27 @@ +package com.ffii.fpsms.modules.purchaseOrder.web + +import com.ffii.core.support.JdbcDao +import com.ffii.fpsms.modules.master.entity.Items +import com.ffii.fpsms.modules.master.service.ItemsService +import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder +import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo +import com.ffii.fpsms.modules.purchaseOrder.service.PurchaseOrderService +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/po") +class PurchaseOrderController( + private val purchaseOrderService: PurchaseOrderService +) { + @GetMapping("/list") + fun getPoList(): List { + return purchaseOrderService.getPoList() + } + @GetMapping("/detail/{id}") + fun getDetailedPo(@PathVariable id: Long): Map { + return purchaseOrderService.getDetailedPo(id) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockIn.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockIn.kt index 5e7013e..c06cf39 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockIn.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockIn.kt @@ -2,6 +2,7 @@ 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.purchaseOrder.entity.PurchaseOrder import com.ffii.fpsms.modules.stock.entity.enum.StockInStatus import jakarta.persistence.* import jakarta.validation.constraints.NotNull @@ -18,20 +19,21 @@ open class StockIn : BaseEntity() { @Column(name = "code", nullable = false, length = 30) open var code: String? = null - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne @JoinColumn(name = "supplierId") open var supplier: Shop? = null - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne @JoinColumn(name = "shopId") open var shop: Shop? = null - @Column(name = "refId") - open var refId: Int? = null + @OneToOne + @JoinColumn(name = "purchaseOrderId") + open var purchaseOrder: PurchaseOrder? = null - @Size(max = 5) - @Column(name = "refType", length = 5) - open var refType: String? = null + @ManyToOne + @JoinColumn(name = "stockOutId") + open var stockOutId: StockOut? = null @Column(name = "orderDate") open var orderDate: LocalDateTime? = null diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLineRepository.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLineRepository.kt index 1ceb9d4..c65778c 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLineRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLineRepository.kt @@ -5,4 +5,5 @@ import org.springframework.stereotype.Repository @Repository interface StockInLineRepository : AbstractRepository { + fun findAllByStockInIdAndDeletedFalse(stockInId: Long): List } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInRepository.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInRepository.kt index 7f33738..7cfabfd 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInRepository.kt @@ -5,4 +5,5 @@ import org.springframework.stereotype.Repository @Repository interface StockInRepository : AbstractRepository { + fun findByPurchaseOrderIdAndDeletedFalse(purchaseOrderId: Long): StockIn? } \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/20250509_01_derek/01_update_stock_in_ref.sql b/src/main/resources/db/changelog/changes/20250509_01_derek/01_update_stock_in_ref.sql new file mode 100644 index 0000000..e0c7b9b --- /dev/null +++ b/src/main/resources/db/changelog/changes/20250509_01_derek/01_update_stock_in_ref.sql @@ -0,0 +1,12 @@ +--liquibase formatted sql + +--changeset derek:update stock in ref cols +ALTER TABLE `stock_in` +DROP COLUMN `refId`, +DROP COLUMN `refType`, +ADD COLUMN `purchaseOrderId` INT NULL, +ADD COLUMN `stockOutId` INT NULL, +ADD CONSTRAINT `FK_STOCK_IN_JOB_ORDER_ON_PURCHASEORDERID` + FOREIGN KEY (`purchaseOrderId`) REFERENCES `purchase_order` (`id`), +ADD CONSTRAINT `FK_STOCK_IN_STOCK_OUT_ON_STOCKOUTID` + FOREIGN KEY (`stockOutId`) REFERENCES `stock_out` (`id`); \ No newline at end of file