diff --git a/src/main/java/com/ffii/fpsms/m18/service/M18DeliveryOrderService.kt b/src/main/java/com/ffii/fpsms/m18/service/M18DeliveryOrderService.kt index 576dd7c..fad9c3f 100644 --- a/src/main/java/com/ffii/fpsms/m18/service/M18DeliveryOrderService.kt +++ b/src/main/java/com/ffii/fpsms/m18/service/M18DeliveryOrderService.kt @@ -137,7 +137,7 @@ open class M18DeliveryOrderService( // Process for Delivery Order (mainpo) // Assume only one DO in the DO (search by DO ID) val mainpo = deliveryOrderDetail?.data?.mainpo?.get(0) - logger.info("deliveryOrderDetail: data is null? ${deliveryOrderDetail?.data == null} | mainpo is null? ${deliveryOrderDetail?.data?.mainpo == null} | get(0) is null? ${deliveryOrderDetail?.data?.mainpo?.get(0) == null}") +// logger.info("deliveryOrderDetail: data is null? ${deliveryOrderDetail?.data == null} | mainpo is null? ${deliveryOrderDetail?.data?.mainpo == null} | get(0) is null? ${deliveryOrderDetail?.data?.mainpo?.get(0) == null}") val pot = deliveryOrderDetail?.data?.pot val deliveryOrderLineMessage = deliveryOrderDetail?.messages diff --git a/src/main/java/com/ffii/fpsms/modules/common/CodeGenerator.kt b/src/main/java/com/ffii/fpsms/modules/common/CodeGenerator.kt index d4c633c..ff4f193 100644 --- a/src/main/java/com/ffii/fpsms/modules/common/CodeGenerator.kt +++ b/src/main/java/com/ffii/fpsms/modules/common/CodeGenerator.kt @@ -4,7 +4,7 @@ import java.time.LocalDate import java.time.format.DateTimeFormatter object CodeGenerator { - // Default Value for Lot No + // Old Function private var dateFormat = DateTimeFormatter.ofPattern("yyMMdd") fun generateCode(prefix: String, itemId: Long, count: Int): String { // prefix = "ITEM" || "LOT" @@ -15,12 +15,12 @@ object CodeGenerator { return "$prefix-$todayStr$itemStr$countStr" } - // Default Value for Order No - val DEFAULT_SUFFIX_FORMAT = "%03d"; + // Default Value for Order No & Lot No. + val DEFAULT_SUFFIX_FORMAT = "%04d"; val DEFAULT_PATTERN = "yyyyMMdd"; val DEFAULT_FORMATTER = DateTimeFormatter.ofPattern(DEFAULT_PATTERN) val DEFAULT_MIDFIX = LocalDate.now().format(DEFAULT_FORMATTER) - fun generateOrderNo( + fun generateNo( suffixFormat: String? = null, pattern: String? = null, prefix: String, diff --git a/src/main/java/com/ffii/fpsms/modules/common/scheduler/service/SchedulerService.kt b/src/main/java/com/ffii/fpsms/modules/common/scheduler/service/SchedulerService.kt index 74dfb0d..596d20d 100644 --- a/src/main/java/com/ffii/fpsms/modules/common/scheduler/service/SchedulerService.kt +++ b/src/main/java/com/ffii/fpsms/modules/common/scheduler/service/SchedulerService.kt @@ -74,7 +74,7 @@ open class SchedulerService( // Init Scheduler // @PostConstruct fun init() { - scheduleM18PoTask(); +// scheduleM18PoTask(); scheduleM18MasterData(); scheduleRoughProd(); scheduleDetailedProd(); @@ -160,8 +160,8 @@ open class SchedulerService( ) m18PurchaseOrderService.savePurchaseOrders(request); m18DeliveryOrderService.saveDeliveryOrders(request); - logger.info("today: ${today.format(dataStringFormat)}") - logger.info("yesterday: ${yesterday.format(dataStringFormat)}") +// logger.info("today: ${today.format(dataStringFormat)}") +// logger.info("yesterday: ${yesterday.format(dataStringFormat)}") } open fun getM18MasterData() { @@ -179,7 +179,7 @@ open class SchedulerService( m18MasterDataService.saveVendors(request) m18MasterDataService.saveBusinessUnits(request) m18MasterDataService.saveCurrencies(request) - logger.info("today: ${today.format(dataStringFormat)}") - logger.info("yesterday: ${yesterday.format(dataStringFormat)}") +// logger.info("today: ${today.format(dataStringFormat)}") +// logger.info("yesterday: ${yesterday.format(dataStringFormat)}") } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/WarehouseService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/WarehouseService.kt index 2f91488..4be4358 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/WarehouseService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/WarehouseService.kt @@ -2,6 +2,8 @@ package com.ffii.fpsms.modules.master.service import com.ffii.core.support.AbstractBaseEntityService import com.ffii.core.support.JdbcDao +import com.ffii.core.utils.ExcelUtils +import com.ffii.core.utils.JwtTokenUtil import com.ffii.fpsms.modules.master.entity.ItemsRepository import com.ffii.fpsms.modules.master.entity.Warehouse import com.ffii.fpsms.modules.master.entity.WarehouseRepository @@ -14,15 +16,19 @@ import com.ffii.fpsms.modules.stock.entity.StockInLineRepository import com.ffii.fpsms.modules.stock.entity.StockInRepository import com.ffii.fpsms.modules.stock.service.InventoryLotService import com.ffii.fpsms.modules.stock.service.StockInService +import org.apache.poi.ss.usermodel.Sheet +import org.apache.poi.ss.usermodel.Workbook +import org.slf4j.Logger +import org.slf4j.LoggerFactory import org.springframework.stereotype.Service +import java.math.BigDecimal import kotlin.jvm.optionals.getOrNull @Service open class WarehouseService( private val jdbcDao: JdbcDao, private val warehouseRepository: WarehouseRepository, -): AbstractBaseEntityService(jdbcDao, warehouseRepository) { - +) : AbstractBaseEntityService(jdbcDao, warehouseRepository) { open fun getWarehouses(): List { return warehouseRepository.findAll().filter { it.deleted == false } } @@ -51,4 +57,56 @@ open class WarehouseService( return warehouseRepository.save(warehouse); } + + open fun importExcel(workbook: Workbook?): String { + logger.info("--------- Start - Import Warehouse Excel -------"); + + if (workbook == null) { + logger.error("No Excel Import"); + return "Import Excel failure"; + } + val sheet: Sheet = workbook.getSheetAt(0); + + // Columns + val COLUMN_WAREHOSE_INDEX = 1; + val COLUMN_ZONE_INDEX = 2; + val COLUMN_SLOT_INDEX = 3; + val COLUMN_FLOOR_INDEX = 4; + val COLUMN_PLACE_INDEX = 5; + + val START_ROW_INDEX = 2; + + // Start Import + for (i in START_ROW_INDEX.. { return warehouseService.findCombo() } + + @PostMapping("/import") + @Throws(ServletRequestBindingException::class) + fun importExcel(request: HttpServletRequest): ResponseEntity<*> { + var workbook: Workbook? = null; + + try { + val multipartFile = (request as MultipartHttpServletRequest).getFile("multipartFileList") + workbook = XSSFWorkbook(multipartFile?.inputStream) + } catch (e: Exception) { + println(e) + } + + return ResponseEntity.ok(warehouseService.importExcel(workbook)) + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotRepository.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotRepository.kt index 93cf17e..7a951e6 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotRepository.kt @@ -1,6 +1,7 @@ package com.ffii.fpsms.modules.stock.entity import com.ffii.core.support.AbstractRepository +import org.springframework.data.jpa.repository.Query import org.springframework.stereotype.Repository import java.io.Serializable @@ -10,4 +11,8 @@ interface InventoryLotRepository: AbstractRepository { fun findByItemIdAndDeletedFalse(itemId: Long): List + @Query(""" + select il.lotNo from InventoryLot il where il.lotNo like :prefix% order by il.lotNo desc limit 1 + """) + fun findLatestLotNoByPrefix(prefix: String): String? } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryService.kt index 2c53af9..06f9292 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryService.kt @@ -81,6 +81,13 @@ open class InventoryService( return inventoryRepository.findInventoryInfoByItemIdInAndDeletedIsFalse(itemIds); } + open fun assignLotNo(): String { + val prefix = "LT" + val midfix = CodeGenerator.DEFAULT_MIDFIX + val latestCode = inventoryLotRepository.findLatestLotNoByPrefix("${prefix}-${midfix}") + return CodeGenerator.generateNo(prefix = prefix, latestCode = latestCode) + } + fun save_po(): PurchaseOrder { val poCode = "MANUAL-IMPORT ${LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE)}" val po = PurchaseOrder().apply { @@ -269,11 +276,12 @@ open class InventoryService( // stock in line val oneYearExpiry = 1L val stockInLineEntries = polList.map { pol -> - val newLotNo = CodeGenerator.generateCode( - prefix = "MPO", - itemId = pol.item!!.id!!, - count = pol.id!!.toInt() - ) +// val newLotNo = CodeGenerator.generateCode( +// prefix = "MPO", +// itemId = pol.item!!.id!!, +// count = pol.id!!.toInt() +// ) + val newLotNo = assignLotNo() StockInLine().apply { this.purchaseOrder = po this.purchaseOrderLine = pol diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt index 21d4a0d..63f18c1 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt @@ -79,6 +79,14 @@ open class StockInLineService( open fun getReceivedStockInLineInfo(stockInLineId: Long): StockInLineInfo { return stockInLineRepository.findStockInLineInfoByIdAndStatusAndDeletedFalse(id = stockInLineId, status = StockInLineStatus.RECEIVED.status).orElseThrow() } + + open fun assignLotNo(): String { + val prefix = "LT" + val midfix = CodeGenerator.DEFAULT_MIDFIX + val latestCode = inventoryLotRepository.findLatestLotNoByPrefix("${prefix}-${midfix}") + return CodeGenerator.generateNo(prefix = prefix, latestCode = latestCode) + } + @Throws(IOException::class) @Transactional open fun create(request: SaveStockInLineRequest): MessageResponse { @@ -179,7 +187,8 @@ open class StockInLineService( "itemId" to stockInLine.item!!.id ) val inventoryCount = jdbcDao.queryForInt(INVENTORY_COUNT.toString(), args) - val newLotNo = CodeGenerator.generateCode(prefix = "MPO", itemId = stockInLine.item!!.id!!, count = inventoryCount) +// val newLotNo = CodeGenerator.generateCode(prefix = "MPO", itemId = stockInLine.item!!.id!!, count = inventoryCount) + val newLotNo = assignLotNo() inventoryLot.apply { this.item = stockInLine.item this.stockInLine = stockInLine diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeService.kt index 1a6c47e..3a79407 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/StockTakeService.kt @@ -21,7 +21,6 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.stereotype.Service import java.math.BigDecimal -import java.time.LocalDate import java.time.LocalDateTime @Service @@ -42,7 +41,7 @@ class StockTakeService( val prefix = "ST" val midfix = CodeGenerator.DEFAULT_MIDFIX val latestCode = stockTakeRepository.findLatestCodeByPrefix("${prefix}-${midfix}") - return CodeGenerator.generateOrderNo(prefix = prefix, latestCode = latestCode) + return CodeGenerator.generateNo(prefix = prefix, latestCode = latestCode) } fun saveStockTake(request: SaveStockTakeRequest): StockTake {