@@ -12,5 +12,6 @@ interface PurchaseOrderLineRepository : AbstractRepository<PurchaseOrderLine, Lo | |||
fun findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLineInfo> | |||
fun findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLine> | |||
fun findAllByPurchaseOrderIdAndStatusNotAndDeletedIsFalse(purchaseOrderId: Long, status: PurchaseOrderLineStatus): List<PurchaseOrderLine> | |||
// fun findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLine> | |||
// fun find | |||
} |
@@ -1,19 +1,20 @@ | |||
package com.ffii.fpsms.modules.purchaseOrder.entity | |||
import com.ffii.core.support.AbstractRepository | |||
import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderDataClass | |||
import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo | |||
import org.springframework.data.domain.Page | |||
import org.springframework.stereotype.Repository | |||
import java.io.Serializable | |||
import java.util.Optional | |||
import org.springframework.data.domain.Pageable | |||
import org.springframework.data.jpa.repository.Query | |||
import org.springframework.data.repository.query.Param | |||
@Repository | |||
interface PurchaseOrderRepository : AbstractRepository<PurchaseOrder, Long> { | |||
fun findTopByM18DataLogIdAndDeletedIsFalseOrderByModifiedDesc(m18datalogId: Serializable): PurchaseOrder? | |||
fun findPurchaseOrderInfoByDeletedIsFalse(): List<PurchaseOrderInfo> | |||
fun findPurchaseOrderInfoByDeletedIsFalse(pageable: Pageable): Page<PurchaseOrderInfo> | |||
fun findPurchaseOrderInfoByIdAndDeletedIsFalse(id: Long): PurchaseOrderInfo | |||
fun findByIdAndDeletedFalse(id: Long): Optional<PurchaseOrder> | |||
@@ -14,7 +14,7 @@ interface PurchaseOrderInfo { | |||
val status: String | |||
@get:Value("#{target.supplier?.name}") | |||
val supplier: String? | |||
// var escalated: Boolean? | |||
var escalated: Boolean? | |||
} | |||
data class PurchaseOrderDataClass( | |||
@@ -30,6 +30,7 @@ import org.springframework.data.domain.Pageable | |||
import org.springframework.stereotype.Service | |||
import org.springframework.transaction.annotation.Transactional | |||
import java.io.IOException | |||
import java.time.LocalDateTime | |||
import java.util.HashMap | |||
import java.util.Objects | |||
import kotlin.jvm.optionals.getOrDefault | |||
@@ -47,33 +48,69 @@ open class PurchaseOrderService( | |||
private val currencyService: CurrencyService, | |||
private val shopService: ShopService, | |||
) : AbstractBaseEntityService<PurchaseOrder, Long, PurchaseOrderRepository>(jdbcDao, purchaseOrderRepository) { | |||
open fun getPoList(request: PagingRequest): RecordsRes<PurchaseOrderDataClass> { | |||
println(request) | |||
val totalCount = purchaseOrderRepository.count().toInt() | |||
val list: List<PurchaseOrderInfo> = if (request.pageNum != null && request.pageSize != null) { | |||
val pageable = PageRequest.of(request.pageNum!!, request.pageSize!!) | |||
purchaseOrderRepository.findPurchaseOrderInfoByDeletedIsFalse(pageable).content | |||
} else { | |||
purchaseOrderRepository.findPurchaseOrderInfoByDeletedIsFalse() | |||
// open fun getPurchaseOrderInfo(args: Map<String, Any>): List<Map<String, Any>> { | |||
// val sql = StringBuilder( | |||
// "SELECT " + | |||
// "po.* " + | |||
// "FROM purchase_order po " + | |||
// "WHERE po.deleted = FALSE" | |||
// ); | |||
// if (args.containsKey("name")){ | |||
// sql.append(" AND i.name like :name "); | |||
// } | |||
// } | |||
open fun getPoList(args: MutableMap<String, Any>): List<PurchaseOrderDataClass> { | |||
val sql = StringBuilder( | |||
" select " | |||
+ " po.*, " | |||
+ " s.name as supplier, " | |||
+ " CASE " | |||
+ " WHEN sil.purchaseOrderId IS NOT NULL THEN 1 " | |||
+ " ELSE 0 " | |||
+ " END AS escalated " | |||
+ " from purchase_order po " | |||
+ " left join shop s on s.id = po.supplierId " | |||
+ " left join ( " | |||
+ " select " | |||
+ " sil.purchaseOrderId " | |||
+ " from stock_in_line sil " | |||
+ " where sil.status like 'determine%' " | |||
+ " ) sil on sil.purchaseOrderId = po.id " | |||
+ " where po.deleted = false " | |||
) | |||
if (args.containsKey("code")){ | |||
sql.append(" AND po.code like :code "); | |||
} | |||
if (args.containsKey("status")){ | |||
sql.append(" AND po.status = :status "); | |||
} | |||
if (args.containsKey("escalated")) { | |||
if (args["escalated"] == true) { | |||
sql.append(" and sil.purchaseOrderId IS NOT NULL "); | |||
} else { | |||
sql.append(" and sil.purchaseOrderId IS NULL "); | |||
} | |||
} | |||
val list = jdbcDao.queryForList(sql.toString(), args); | |||
println(list) | |||
val mappedList = list.map { | |||
val escalated = stockInLineRepository.findAllStockInLineInfoByPurchaseOrderIdAndStatusStartsWithAndDeletedFalse( | |||
purchaseOrderId = it.id, | |||
status = "determine" | |||
) | |||
PurchaseOrderDataClass( | |||
id = it.id, | |||
code = it.code, | |||
orderDate = it.orderDate, | |||
estimatedArrivalDate = it.estimatedArrivalDate, | |||
completeDate = it.completeDate, | |||
status = it.status, | |||
supplier = it.supplier, | |||
escalated = escalated.isNotEmpty(), | |||
id = (it["id"] as Int).toLong(), | |||
code = it["code"] as String, | |||
orderDate = it["orderDate"] as LocalDateTime?, | |||
estimatedArrivalDate = it["estimatedArrivalDate"] as LocalDateTime?, | |||
completeDate = it["completeDate"] as LocalDateTime?, | |||
status = it["status"] as String, | |||
supplier = it["supplier"] as String?, | |||
escalated = it["escalated"] == 1L, | |||
) | |||
} | |||
return RecordsRes(mappedList, totalCount) | |||
// println(value1) | |||
// println(value1 == 1L) | |||
// println(value2) | |||
println(mappedList) | |||
return mappedList | |||
} | |||
open fun allPurchaseOrder(): List<PurchaseOrder> { | |||
@@ -188,6 +225,13 @@ open class PurchaseOrderService( | |||
@Transactional | |||
open fun checkPolAndCompletePo(id: Long): MessageResponse { | |||
val unfinishedLines = polRepository.findAllByPurchaseOrderIdAndStatusNotAndDeletedIsFalse(purchaseOrderId = id, status = PurchaseOrderLineStatus.COMPLETED) | |||
// val unfinishedLines = polRepository.findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId = id) | |||
// .filter { | |||
// it.status != PurchaseOrderLineStatus.COMPLETED | | |||
// it.status != PurchaseOrderLineStatus. | |||
// } | |||
println("unfinishedLines") | |||
println(unfinishedLines) | |||
val po = purchaseOrderRepository.findById(id).orElseThrow() | |||
if (unfinishedLines.isEmpty()) { | |||
po.apply { | |||
@@ -3,6 +3,7 @@ package com.ffii.fpsms.modules.purchaseOrder.web | |||
import com.ffii.core.response.RecordsRes | |||
import com.ffii.core.support.JdbcDao | |||
import com.ffii.core.utils.CriteriaArgsBuilder | |||
import com.ffii.core.utils.PagingUtils | |||
import com.ffii.fpsms.modules.master.entity.Items | |||
import com.ffii.fpsms.modules.master.service.ItemsService | |||
import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||
@@ -24,16 +25,24 @@ class PurchaseOrderController( | |||
) { | |||
@GetMapping("/list") | |||
fun getPoList( | |||
request: HttpServletRequest | |||
// @RequestParam(required = false) pageNum: Int, | |||
// @RequestParam(required = false) pageSize: Int | |||
): RecordsRes<PurchaseOrderDataClass> { | |||
// println("request") | |||
// println(pageSize) | |||
// println(pageNum - 1) | |||
// request pageNum starts from 1, but pagingRequest starts with 0 | |||
// val pageRequest = PagingRequest(pageSize = pageSize, pageNum = pageNum - 1,) // not start from 0 | |||
val pageRequest = PagingRequest(pageSize = null, pageNum = null) // not start from 0 | |||
return purchaseOrderService.getPoList(pageRequest) | |||
println("request") | |||
println(request) | |||
val criteriaArgs = CriteriaArgsBuilder.withRequest(request) | |||
.addStringLike("code") | |||
.addString("status") | |||
.addBoolean("escalated") | |||
.build() | |||
println(criteriaArgs) | |||
val pageSize = request.getParameter("pageSize")?.toIntOrNull() ?: 10 // Default to 10 if not provided | |||
val pageNum = request.getParameter("pageNum")?.toIntOrNull() ?: 1 // Default to 1 if not provided | |||
val fullList = purchaseOrderService.getPoList(criteriaArgs) | |||
val paginatedList = PagingUtils.getPaginatedList(fullList,pageSize, pageNum) | |||
return RecordsRes(paginatedList, fullList.size) | |||
} | |||
@GetMapping("/testing") | |||
@@ -41,6 +50,7 @@ class PurchaseOrderController( | |||
val criteriaArgs = CriteriaArgsBuilder.withRequest(request) | |||
.addStringLike("code") | |||
.addStringLike("name") | |||
.addBoolean("escalated") | |||
.build() | |||
println("criteriaArgs") | |||
println(criteriaArgs) | |||
@@ -13,6 +13,7 @@ interface StockInLineRepository : AbstractRepository<StockInLine, Long> { | |||
fun findStockInLineInfoByIdAndDeletedFalse(id: Long): StockInLineInfo | |||
fun findStockInLineInfoByIdInAndDeletedFalse(id: List<Long>): List<StockInLineInfo> | |||
fun findStockInLineInfoByPurchaseOrderLineIdAndStatusNotAndDeletedFalse(purchaseOrderLineId: Long, status: String): List<StockInLineInfo> | |||
fun findStockInLineInfoByPurchaseOrderLineIdAndDeletedFalse(purchaseOrderLineId: Long): List<StockInLineInfo> | |||
fun findStockInLineInfoByIdAndStatusAndDeletedFalse(id: Long, status: String): Optional<StockInLineInfo> | |||
fun findAllStockInLineInfoByPurchaseOrderIdAndStatusStartsWithAndDeletedFalse(purchaseOrderId: Long, status: String): List<Optional<StockInLineInfo>> | |||
} |
@@ -191,8 +191,16 @@ open class StockInLineService( | |||
@Throws(IOException::class) | |||
@Transactional | |||
fun updatePurchaseOrderLineStatus(request: SaveStockInLineRequest) { | |||
if (request.status == StockInLineStatus.COMPLETE.status) { | |||
val unfinishedLines = stockInLineRepository.findStockInLineInfoByPurchaseOrderLineIdAndStatusNotAndDeletedFalse(purchaseOrderLineId = request.purchaseOrderLineId, status = request.status!!) | |||
println(request.status) | |||
if (request.status == StockInLineStatus.COMPLETE.status || request.status == StockInLineStatus.REJECT.status) { | |||
// val unfinishedLines = stockInLineRepository.findStockInLineInfoByPurchaseOrderLineIdAndStatusNotAndDeletedFalse(purchaseOrderLineId = request.purchaseOrderLineId, status = request.status!!) | |||
val unfinishedLines = stockInLineRepository.findStockInLineInfoByPurchaseOrderLineIdAndDeletedFalse(purchaseOrderLineId = request.purchaseOrderLineId) | |||
.filter { | |||
it.status != StockInLineStatus.COMPLETE.status | |||
&& it.status != StockInLineStatus.REJECT.status | |||
} | |||
println("unfinishedLines") | |||
println(unfinishedLines) | |||
if (unfinishedLines.isEmpty()) { | |||
// all stock in lines finished | |||
// change status of purchase order line | |||