@@ -19,7 +19,7 @@ open class PurchaseOrder : BaseEntity<Long>() { | |||||
@Column(name = "code", nullable = false, length = 30) | @Column(name = "code", nullable = false, length = 30) | ||||
open var code: String? = null | open var code: String? = null | ||||
@ManyToOne(fetch = FetchType.LAZY) | |||||
@ManyToOne | |||||
@JoinColumn(name = "supplierId") | @JoinColumn(name = "supplierId") | ||||
open var supplier: Shop? = null | open var supplier: Shop? = null | ||||
@@ -38,7 +38,7 @@ open class PurchaseOrder : BaseEntity<Long>() { | |||||
open var status: PurchaseOrderStatus? = null | open var status: PurchaseOrderStatus? = null | ||||
@NotNull | @NotNull | ||||
@ManyToOne(fetch = FetchType.LAZY, optional = false) | |||||
@ManyToOne | |||||
@JoinColumn(name = "m18DataLogId", nullable = false) | @JoinColumn(name = "m18DataLogId", nullable = false) | ||||
open var m18DataLog: M18DataLog? = null | open var m18DataLog: M18DataLog? = null | ||||
} | } |
@@ -15,7 +15,7 @@ import java.math.BigDecimal | |||||
@Table(name = "purchase_order_line") | @Table(name = "purchase_order_line") | ||||
open class PurchaseOrderLine : BaseEntity<Long>(){ | open class PurchaseOrderLine : BaseEntity<Long>(){ | ||||
@NotNull | @NotNull | ||||
@ManyToOne(fetch = FetchType.LAZY, optional = false) | |||||
@ManyToOne | |||||
@JoinColumn(name = "itemId", nullable = false) | @JoinColumn(name = "itemId", nullable = false) | ||||
open var item: Items? = null | open var item: Items? = null | ||||
@@ -30,7 +30,7 @@ open class PurchaseOrderLine : BaseEntity<Long>(){ | |||||
// open var uom: UomConversion? = null | // open var uom: UomConversion? = null | ||||
@NotNull | @NotNull | ||||
@ManyToOne(fetch = FetchType.LAZY, optional = false) | |||||
@ManyToOne | |||||
@JoinColumn(name = "purchaseOrderId", nullable = false) | @JoinColumn(name = "purchaseOrderId", nullable = false) | ||||
open var purchaseOrder: PurchaseOrder? = null | open var purchaseOrder: PurchaseOrder? = null | ||||
@@ -50,7 +50,7 @@ open class PurchaseOrderLine : BaseEntity<Long>(){ | |||||
open var status: PurchaseOrderLineStatus? = null | open var status: PurchaseOrderLineStatus? = null | ||||
@NotNull | @NotNull | ||||
@ManyToOne(fetch = FetchType.LAZY, optional = false) | |||||
@ManyToOne | |||||
@JoinColumn(name = "m18DataLogId", nullable = false) | @JoinColumn(name = "m18DataLogId", nullable = false) | ||||
open var m18DataLog: M18DataLog? = null | open var m18DataLog: M18DataLog? = null | ||||
} | } |
@@ -1,10 +1,15 @@ | |||||
package com.ffii.fpsms.modules.purchaseOrder.entity | package com.ffii.fpsms.modules.purchaseOrder.entity | ||||
import com.ffii.core.support.AbstractRepository | import com.ffii.core.support.AbstractRepository | ||||
import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderLineInfo | |||||
import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||
import java.io.Serializable | import java.io.Serializable | ||||
@Repository | @Repository | ||||
interface PurchaseOrderLineRepository : AbstractRepository<PurchaseOrderLine, Long> { | interface PurchaseOrderLineRepository : AbstractRepository<PurchaseOrderLine, Long> { | ||||
fun findByM18DataLogIdAndDeletedIsFalse(m18datalogId: Serializable): PurchaseOrderLine? | fun findByM18DataLogIdAndDeletedIsFalse(m18datalogId: Serializable): PurchaseOrderLine? | ||||
fun findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLineInfo> | |||||
fun findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLine> | |||||
// fun find | |||||
} | } |
@@ -1,10 +1,14 @@ | |||||
package com.ffii.fpsms.modules.purchaseOrder.entity | package com.ffii.fpsms.modules.purchaseOrder.entity | ||||
import com.ffii.core.support.AbstractRepository | import com.ffii.core.support.AbstractRepository | ||||
import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo | |||||
import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||
import java.io.Serializable | import java.io.Serializable | ||||
@Repository | @Repository | ||||
interface PurchaseOrderRepository : AbstractRepository<PurchaseOrder, Long> { | interface PurchaseOrderRepository : AbstractRepository<PurchaseOrder, Long> { | ||||
fun findByM18DataLogIdAndDeletedIsFalse(m18datalogId: Serializable): PurchaseOrder? | fun findByM18DataLogIdAndDeletedIsFalse(m18datalogId: Serializable): PurchaseOrder? | ||||
fun findPurchaseOrderInfoByDeletedIsFalse(): List<PurchaseOrderInfo> | |||||
fun findPurchaseOrderInfoByIdAndDeletedIsFalse(id: Long): PurchaseOrderInfo | |||||
} | } |
@@ -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? | |||||
} |
@@ -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<StockInLine>? | |||||
) |
@@ -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.PurchaseOrderLine | ||||
import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository | import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository | ||||
import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository | 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.enums.PurchaseOrderLineStatus | ||||
import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderLineRequest | import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderLineRequest | ||||
import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderLineResponse | import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderLineResponse | ||||
@@ -17,11 +18,11 @@ import kotlin.jvm.optionals.getOrNull | |||||
@Service | @Service | ||||
open class PurchaseOrderLineService( | 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<PurchaseOrderLine> { | open fun allPurchaseOrderLine(): List<PurchaseOrderLine> { | ||||
return purchaseOrderLineRepository.findAll() | return purchaseOrderLineRepository.findAll() | ||||
@@ -30,6 +31,9 @@ open class PurchaseOrderLineService( | |||||
open fun findPurchaseOrderLineByM18Id(m18DataLogId: Long): PurchaseOrderLine? { | open fun findPurchaseOrderLineByM18Id(m18DataLogId: Long): PurchaseOrderLine? { | ||||
return purchaseOrderLineRepository.findByM18DataLogIdAndDeletedIsFalse(m18DataLogId) | return purchaseOrderLineRepository.findByM18DataLogIdAndDeletedIsFalse(m18DataLogId) | ||||
} | } | ||||
open fun findAllPoLineInfoByPoId(poId: Long): List<PurchaseOrderLineInfo> { | |||||
return purchaseOrderLineRepository.findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(poId) | |||||
} | |||||
open fun savePurchaseOrderLine(request: SavePurchaseOrderLineRequest): SavePurchaseOrderLineResponse { | open fun savePurchaseOrderLine(request: SavePurchaseOrderLineRequest): SavePurchaseOrderLineResponse { | ||||
val purchaseOrderLine = | val purchaseOrderLine = | ||||
@@ -1,26 +1,74 @@ | |||||
package com.ffii.fpsms.modules.purchaseOrder.service | 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.m18.entity.M18DataLogRepository | ||||
import com.ffii.fpsms.modules.master.entity.ShopRepository | import com.ffii.fpsms.modules.master.entity.ShopRepository | ||||
import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder | 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.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.enums.PurchaseOrderStatus | ||||
import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderRequest | import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderRequest | ||||
import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderResponse | 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 org.springframework.stereotype.Service | ||||
import java.util.HashMap | |||||
import java.util.Objects | |||||
import kotlin.jvm.optionals.getOrDefault | import kotlin.jvm.optionals.getOrDefault | ||||
import kotlin.jvm.optionals.getOrNull | import kotlin.jvm.optionals.getOrNull | ||||
@Service | @Service | ||||
open class PurchaseOrderService( | 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<PurchaseOrder, Long, PurchaseOrderRepository>(jdbcDao, purchaseOrderRepository) { | |||||
open fun getPoList(): List<PurchaseOrderInfo> { | |||||
return purchaseOrderRepository.findPurchaseOrderInfoByDeletedIsFalse() | |||||
} | |||||
open fun allPurchaseOrder(): List<PurchaseOrder> { | open fun allPurchaseOrder(): List<PurchaseOrder> { | ||||
return purchaseOrderRepository.findAll() | return purchaseOrderRepository.findAll() | ||||
} | } | ||||
open fun getDetailedPo(id: Long): Map<String, Any> { | |||||
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? { | open fun findPurchaseOrderByM18Id(m18DataLogId: Long): PurchaseOrder? { | ||||
return purchaseOrderRepository.findByM18DataLogIdAndDeletedIsFalse(m18DataLogId) | return purchaseOrderRepository.findByM18DataLogIdAndDeletedIsFalse(m18DataLogId) | ||||
} | } | ||||
@@ -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<PurchaseOrderInfo> { | |||||
return purchaseOrderService.getPoList() | |||||
} | |||||
@GetMapping("/detail/{id}") | |||||
fun getDetailedPo(@PathVariable id: Long): Map<String, Any> { | |||||
return purchaseOrderService.getDetailedPo(id) | |||||
} | |||||
} |
@@ -2,6 +2,7 @@ package com.ffii.fpsms.modules.stock.entity | |||||
import com.ffii.core.entity.BaseEntity | import com.ffii.core.entity.BaseEntity | ||||
import com.ffii.fpsms.modules.master.entity.Shop | 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 com.ffii.fpsms.modules.stock.entity.enum.StockInStatus | ||||
import jakarta.persistence.* | import jakarta.persistence.* | ||||
import jakarta.validation.constraints.NotNull | import jakarta.validation.constraints.NotNull | ||||
@@ -18,20 +19,21 @@ open class StockIn : BaseEntity<Long>() { | |||||
@Column(name = "code", nullable = false, length = 30) | @Column(name = "code", nullable = false, length = 30) | ||||
open var code: String? = null | open var code: String? = null | ||||
@ManyToOne(fetch = FetchType.LAZY, optional = false) | |||||
@ManyToOne | |||||
@JoinColumn(name = "supplierId") | @JoinColumn(name = "supplierId") | ||||
open var supplier: Shop? = null | open var supplier: Shop? = null | ||||
@ManyToOne(fetch = FetchType.LAZY, optional = false) | |||||
@ManyToOne | |||||
@JoinColumn(name = "shopId") | @JoinColumn(name = "shopId") | ||||
open var shop: Shop? = null | 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") | @Column(name = "orderDate") | ||||
open var orderDate: LocalDateTime? = null | open var orderDate: LocalDateTime? = null | ||||
@@ -5,4 +5,5 @@ import org.springframework.stereotype.Repository | |||||
@Repository | @Repository | ||||
interface StockInLineRepository : AbstractRepository<StockInLine, Long> { | interface StockInLineRepository : AbstractRepository<StockInLine, Long> { | ||||
fun findAllByStockInIdAndDeletedFalse(stockInId: Long): List<StockInLine> | |||||
} | } |
@@ -5,4 +5,5 @@ import org.springframework.stereotype.Repository | |||||
@Repository | @Repository | ||||
interface StockInRepository : AbstractRepository<StockIn, Long> { | interface StockInRepository : AbstractRepository<StockIn, Long> { | ||||
fun findByPurchaseOrderIdAndDeletedFalse(purchaseOrderId: Long): StockIn? | |||||
} | } |
@@ -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`); |