| @@ -12,5 +12,6 @@ interface PurchaseOrderLineRepository : AbstractRepository<PurchaseOrderLine, Lo | |||||
| fun findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLineInfo> | fun findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLineInfo> | ||||
| fun findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLine> | fun findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLine> | ||||
| fun findAllByPurchaseOrderIdAndStatusNotAndDeletedIsFalse(purchaseOrderId: Long, status: PurchaseOrderLineStatus): List<PurchaseOrderLine> | fun findAllByPurchaseOrderIdAndStatusNotAndDeletedIsFalse(purchaseOrderId: Long, status: PurchaseOrderLineStatus): List<PurchaseOrderLine> | ||||
| // fun findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLine> | |||||
| // fun find | // fun find | ||||
| } | } | ||||
| @@ -1,19 +1,20 @@ | |||||
| 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.PurchaseOrderDataClass | |||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo | import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo | ||||
| import org.springframework.data.domain.Page | import org.springframework.data.domain.Page | ||||
| import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||
| import java.io.Serializable | import java.io.Serializable | ||||
| import java.util.Optional | import java.util.Optional | ||||
| import org.springframework.data.domain.Pageable | import org.springframework.data.domain.Pageable | ||||
| import org.springframework.data.jpa.repository.Query | |||||
| import org.springframework.data.repository.query.Param | |||||
| @Repository | @Repository | ||||
| interface PurchaseOrderRepository : AbstractRepository<PurchaseOrder, Long> { | interface PurchaseOrderRepository : AbstractRepository<PurchaseOrder, Long> { | ||||
| fun findTopByM18DataLogIdAndDeletedIsFalseOrderByModifiedDesc(m18datalogId: Serializable): PurchaseOrder? | fun findTopByM18DataLogIdAndDeletedIsFalseOrderByModifiedDesc(m18datalogId: Serializable): PurchaseOrder? | ||||
| fun findPurchaseOrderInfoByDeletedIsFalse(): List<PurchaseOrderInfo> | |||||
| fun findPurchaseOrderInfoByDeletedIsFalse(pageable: Pageable): Page<PurchaseOrderInfo> | |||||
| fun findPurchaseOrderInfoByIdAndDeletedIsFalse(id: Long): PurchaseOrderInfo | fun findPurchaseOrderInfoByIdAndDeletedIsFalse(id: Long): PurchaseOrderInfo | ||||
| fun findByIdAndDeletedFalse(id: Long): Optional<PurchaseOrder> | fun findByIdAndDeletedFalse(id: Long): Optional<PurchaseOrder> | ||||
| @@ -14,7 +14,7 @@ interface PurchaseOrderInfo { | |||||
| val status: String | val status: String | ||||
| @get:Value("#{target.supplier?.name}") | @get:Value("#{target.supplier?.name}") | ||||
| val supplier: String? | val supplier: String? | ||||
| // var escalated: Boolean? | |||||
| var escalated: Boolean? | |||||
| } | } | ||||
| data class PurchaseOrderDataClass( | data class PurchaseOrderDataClass( | ||||
| @@ -30,6 +30,7 @@ import org.springframework.data.domain.Pageable | |||||
| import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||
| import org.springframework.transaction.annotation.Transactional | import org.springframework.transaction.annotation.Transactional | ||||
| import java.io.IOException | import java.io.IOException | ||||
| import java.time.LocalDateTime | |||||
| import java.util.HashMap | import java.util.HashMap | ||||
| import java.util.Objects | import java.util.Objects | ||||
| import kotlin.jvm.optionals.getOrDefault | import kotlin.jvm.optionals.getOrDefault | ||||
| @@ -47,33 +48,69 @@ open class PurchaseOrderService( | |||||
| private val currencyService: CurrencyService, | private val currencyService: CurrencyService, | ||||
| private val shopService: ShopService, | private val shopService: ShopService, | ||||
| ) : AbstractBaseEntityService<PurchaseOrder, Long, PurchaseOrderRepository>(jdbcDao, purchaseOrderRepository) { | ) : 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 mappedList = list.map { | ||||
| val escalated = stockInLineRepository.findAllStockInLineInfoByPurchaseOrderIdAndStatusStartsWithAndDeletedFalse( | |||||
| purchaseOrderId = it.id, | |||||
| status = "determine" | |||||
| ) | |||||
| PurchaseOrderDataClass( | 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> { | open fun allPurchaseOrder(): List<PurchaseOrder> { | ||||
| @@ -188,6 +225,13 @@ open class PurchaseOrderService( | |||||
| @Transactional | @Transactional | ||||
| open fun checkPolAndCompletePo(id: Long): MessageResponse { | open fun checkPolAndCompletePo(id: Long): MessageResponse { | ||||
| val unfinishedLines = polRepository.findAllByPurchaseOrderIdAndStatusNotAndDeletedIsFalse(purchaseOrderId = id, status = PurchaseOrderLineStatus.COMPLETED) | 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() | val po = purchaseOrderRepository.findById(id).orElseThrow() | ||||
| if (unfinishedLines.isEmpty()) { | if (unfinishedLines.isEmpty()) { | ||||
| po.apply { | po.apply { | ||||
| @@ -3,6 +3,7 @@ package com.ffii.fpsms.modules.purchaseOrder.web | |||||
| import com.ffii.core.response.RecordsRes | import com.ffii.core.response.RecordsRes | ||||
| import com.ffii.core.support.JdbcDao | import com.ffii.core.support.JdbcDao | ||||
| import com.ffii.core.utils.CriteriaArgsBuilder | 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.entity.Items | ||||
| import com.ffii.fpsms.modules.master.service.ItemsService | import com.ffii.fpsms.modules.master.service.ItemsService | ||||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | import com.ffii.fpsms.modules.master.web.models.MessageResponse | ||||
| @@ -24,16 +25,24 @@ class PurchaseOrderController( | |||||
| ) { | ) { | ||||
| @GetMapping("/list") | @GetMapping("/list") | ||||
| fun getPoList( | fun getPoList( | ||||
| request: HttpServletRequest | |||||
| // @RequestParam(required = false) pageNum: Int, | // @RequestParam(required = false) pageNum: Int, | ||||
| // @RequestParam(required = false) pageSize: Int | // @RequestParam(required = false) pageSize: Int | ||||
| ): RecordsRes<PurchaseOrderDataClass> { | ): 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") | @GetMapping("/testing") | ||||
| @@ -41,6 +50,7 @@ class PurchaseOrderController( | |||||
| val criteriaArgs = CriteriaArgsBuilder.withRequest(request) | val criteriaArgs = CriteriaArgsBuilder.withRequest(request) | ||||
| .addStringLike("code") | .addStringLike("code") | ||||
| .addStringLike("name") | .addStringLike("name") | ||||
| .addBoolean("escalated") | |||||
| .build() | .build() | ||||
| println("criteriaArgs") | println("criteriaArgs") | ||||
| println(criteriaArgs) | println(criteriaArgs) | ||||
| @@ -13,6 +13,7 @@ interface StockInLineRepository : AbstractRepository<StockInLine, Long> { | |||||
| fun findStockInLineInfoByIdAndDeletedFalse(id: Long): StockInLineInfo | fun findStockInLineInfoByIdAndDeletedFalse(id: Long): StockInLineInfo | ||||
| fun findStockInLineInfoByIdInAndDeletedFalse(id: List<Long>): List<StockInLineInfo> | fun findStockInLineInfoByIdInAndDeletedFalse(id: List<Long>): List<StockInLineInfo> | ||||
| fun findStockInLineInfoByPurchaseOrderLineIdAndStatusNotAndDeletedFalse(purchaseOrderLineId: Long, status: String): 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 findStockInLineInfoByIdAndStatusAndDeletedFalse(id: Long, status: String): Optional<StockInLineInfo> | ||||
| fun findAllStockInLineInfoByPurchaseOrderIdAndStatusStartsWithAndDeletedFalse(purchaseOrderId: Long, status: String): List<Optional<StockInLineInfo>> | fun findAllStockInLineInfoByPurchaseOrderIdAndStatusStartsWithAndDeletedFalse(purchaseOrderId: Long, status: String): List<Optional<StockInLineInfo>> | ||||
| } | } | ||||
| @@ -191,8 +191,16 @@ open class StockInLineService( | |||||
| @Throws(IOException::class) | @Throws(IOException::class) | ||||
| @Transactional | @Transactional | ||||
| fun updatePurchaseOrderLineStatus(request: SaveStockInLineRequest) { | 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()) { | if (unfinishedLines.isEmpty()) { | ||||
| // all stock in lines finished | // all stock in lines finished | ||||
| // change status of purchase order line | // change status of purchase order line | ||||