| @@ -19,7 +19,7 @@ open class PurchaseOrder : BaseEntity<Long>() { | |||
| @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<Long>() { | |||
| open var status: PurchaseOrderStatus? = null | |||
| @NotNull | |||
| @ManyToOne(fetch = FetchType.LAZY, optional = false) | |||
| @ManyToOne | |||
| @JoinColumn(name = "m18DataLogId", nullable = false) | |||
| open var m18DataLog: M18DataLog? = null | |||
| } | |||
| @@ -15,7 +15,7 @@ import java.math.BigDecimal | |||
| @Table(name = "purchase_order_line") | |||
| open class PurchaseOrderLine : BaseEntity<Long>(){ | |||
| @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<Long>(){ | |||
| // 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<Long>(){ | |||
| open var status: PurchaseOrderLineStatus? = null | |||
| @NotNull | |||
| @ManyToOne(fetch = FetchType.LAZY, optional = false) | |||
| @ManyToOne | |||
| @JoinColumn(name = "m18DataLogId", nullable = false) | |||
| open var m18DataLog: M18DataLog? = null | |||
| } | |||
| @@ -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<PurchaseOrderLine, Long> { | |||
| 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 | |||
| 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<PurchaseOrder, Long> { | |||
| 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.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<PurchaseOrderLine> { | |||
| 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<PurchaseOrderLineInfo> { | |||
| return purchaseOrderLineRepository.findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(poId) | |||
| } | |||
| open fun savePurchaseOrderLine(request: SavePurchaseOrderLineRequest): SavePurchaseOrderLineResponse { | |||
| val purchaseOrderLine = | |||
| @@ -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<PurchaseOrder, Long, PurchaseOrderRepository>(jdbcDao, purchaseOrderRepository) { | |||
| open fun getPoList(): List<PurchaseOrderInfo> { | |||
| return purchaseOrderRepository.findPurchaseOrderInfoByDeletedIsFalse() | |||
| } | |||
| open fun allPurchaseOrder(): List<PurchaseOrder> { | |||
| 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? { | |||
| 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.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<Long>() { | |||
| @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 | |||
| @@ -5,4 +5,5 @@ import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface StockInLineRepository : AbstractRepository<StockInLine, Long> { | |||
| fun findAllByStockInIdAndDeletedFalse(stockInId: Long): List<StockInLine> | |||
| } | |||
| @@ -5,4 +5,5 @@ import org.springframework.stereotype.Repository | |||
| @Repository | |||
| 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`); | |||