@@ -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`); |