package com.ffii.fpsms.m18.service import com.ffii.core.utils.JwtTokenUtil import com.ffii.fpsms.api.service.ApiCallerService import com.ffii.fpsms.m18.M18Config import com.ffii.fpsms.m18.model.M18PurchaseQuotationListRequest import com.ffii.fpsms.m18.model.M18PurchaseQuotationListResponse import com.ffii.fpsms.m18.model.M18PurchaseQuotationRequest import com.ffii.fpsms.m18.model.M18PurchaseQuotationResponse import com.ffii.fpsms.m18.utils.CommonUtils import com.ffii.fpsms.m18.web.models.M18CommonRequest import com.ffii.fpsms.modules.master.service.ItemUomService import com.ffii.fpsms.modules.master.service.ItemsService import com.ffii.fpsms.modules.purchaseQuotation.service.PurchaseQuotationLineService import com.ffii.fpsms.modules.purchaseQuotation.service.PurchaseQuotationService import com.ffii.fpsms.modules.purchaseQuotation.web.model.SavePurchaseQuotationLineRequest import com.ffii.fpsms.modules.purchaseQuotation.web.model.SavePurchaseQuotationRequest import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.stereotype.Service @Service open class M18PurchaseQuotationService( val m18Config: M18Config, val apiCallerService: ApiCallerService, val itemsService: ItemsService, val purchaseQuotationService: PurchaseQuotationService, val purchaseQuotationLineService: PurchaseQuotationLineService, val itemUomService: ItemUomService, ) { val commonUtils = CommonUtils() val logger: Logger = LoggerFactory.getLogger(JwtTokenUtil::class.java) // val lastModifyDateStart = "2025-05-14 14:00:00" // val lastModifyDateEnd = "2025-05-14 14:30:00" // val lastModifyDateConds = // "lastModifyDate=largerOrEqual=${lastModifyDateStart}=and=lastModifyDate=lessOrEqual=${lastModifyDateEnd}" // M18 Conditions val beIdList = listOf(m18Config.BEID_PF, m18Config.BEID_PP, m18Config.BEID_TOA) val beIdConds = "(" + commonUtils.listToString(beIdList.filterNotNull(), "beId=equal=", "=or=") + ")" // M18 API val M18_LOAD_PURCHASE_QUOTATION_API = "/root/api/read/vqu" val M18_FETCH_PURCHASE_QUOTATION_LIST_API = "/search/search" open fun getPurchaseQuotations(request: M18CommonRequest): M18PurchaseQuotationListResponse? { val lastModifyDateFromConds = request.modifiedDateFrom?.let { "lastModifyDate=largerOrEqual=${it}" } val lastModifyDateToConds = request.modifiedDateTo?.let{ "lastModifyDate=lessOrEqual=${it}" } val haveFromAndTo = lastModifyDateFromConds != null && lastModifyDateToConds != null val finalConds = if (lastModifyDateFromConds == null && lastModifyDateToConds == null) { beIdConds } else { beIdConds + "=and=(${lastModifyDateFromConds ?: ""}${if(haveFromAndTo) "=and=" else ""}${lastModifyDateToConds ?: ""})" } val params = M18PurchaseQuotationListRequest( conds = finalConds ) var purchaseQuotations: M18PurchaseQuotationListResponse? = null try { purchaseQuotations = apiCallerService.get( M18_FETCH_PURCHASE_QUOTATION_LIST_API, params ).block() } catch (e: Exception) { logger.error("(Getting Purchase Quotation list) Error on Function - ${e.stackTrace}") logger.error(e.message) } return purchaseQuotations } open fun getPurchaseQuotation(id: Long): M18PurchaseQuotationResponse? { val params = M18PurchaseQuotationRequest( id = id ) var purchaseQuotation: M18PurchaseQuotationResponse? = null try { purchaseQuotation = apiCallerService.get( M18_LOAD_PURCHASE_QUOTATION_API, params ).block() } catch (e: Exception) { logger.error("(Getting Purchase Quotation Detail) Error on Function - ${e.stackTrace}") logger.error(e.message) } return purchaseQuotation } open fun savePurchaseQuotations(request: M18CommonRequest) { logger.info("--------------------------------------------Start - Saving M18 Purchase Quotations--------------------------------------------") val purchaseQuotations = getPurchaseQuotations(request) val pqRefType = "Purchase Quotation" val pqLineRefType = "Purchase Quotation Line" val successList = mutableListOf() val successDetailList = mutableListOf() val failList = mutableListOf() val failDetailList = mutableListOf() val values = purchaseQuotations?.values val pqsMessages = purchaseQuotations?.messages?.get(0) if (values != null) { values.forEach { purchaseQuotation -> try { val pqDetail = getPurchaseQuotation(purchaseQuotation.id) val mainvqu = if(pqDetail?.data?.mainvqu?.isNotEmpty() == true) pqDetail.data.mainvqu[0] else null val remvqu = if(pqDetail?.data?.remvqu?.isNotEmpty() == true) pqDetail.data.remvqu[0] else null val vqut = if(pqDetail?.data?.vqut?.isNotEmpty() == true) pqDetail.data.vqut else null val pqMessages = if(pqDetail?.messages?.isNotEmpty() == true) pqDetail.messages[0] else null var pqId: Long? = null if (mainvqu != null) { // Save Purchase Quotation try { val savePqRequest = SavePurchaseQuotationRequest( code = mainvqu.code, expiryDate = commonUtils.timestampToLocalDateTime(mainvqu.expDate), effectiveDate = commonUtils.timestampToLocalDateTime(mainvqu.tDate), m18ShopId = mainvqu.venId, m18CurrencyId = mainvqu.curId, remarks = remvqu?.remarks, m18Id = mainvqu.id, m18LastModifyDate = commonUtils.timestampToLocalDateTime(mainvqu.lastModifyDate) ) pqId = purchaseQuotationService.savePurchaseQuotation(savePqRequest).id successList += mainvqu.id logger.info("${pqRefType}: Saved purchase quotation. ID: ${pqId} | M18 ID: ${purchaseQuotation.id}") } catch (e: Exception) { failList.add(mainvqu.id) logger.error("${pqRefType}: Saving Failure!") logger.error("Error on Function - ${e.stackTrace} | Type: ${pqRefType} | M18 ID: ${purchaseQuotation.id}") logger.error(e.message) } // Save Purchase Quotation Line if (vqut != null) { vqut.forEach { line -> try { val savePqLineRequest = SavePurchaseQuotationLineRequest( purchaseQuotationId = pqId, m18ItemId = line.proId, code = line.refCode, description = line.bDesc, price = line.up, m18Id = line.id, m18LastModifyDate = commonUtils.timestampToLocalDateTime(mainvqu.lastModifyDate) ) val pqLineId = purchaseQuotationLineService.savePurchaseQuotationLine(savePqLineRequest).id successDetailList += line.id logger.info("${pqRefType}: Saved purchase quotation line. ID: ${pqLineId} | M18 ID: ${purchaseQuotation.id} | M18 Line ID: ${line.id}") } catch (e: Exception) { failDetailList.add(line.id) logger.error("${pqLineRefType}: Saving Failure!") logger.error("Error on Function - ${e.stackTrace} | Type: ${pqLineRefType} | M18 ID: ${purchaseQuotation.id} | M18 Line ID: ${line.id}") logger.error(e.message) } } } else { logger.error("Purchase Quotation Line is null. May occur errors.") } } else { logger.error("Purchase Quotation is null. May occur errors.") logger.error("Error code: ${pqMessages?.msgDetail}") logger.error("Error messages: ${pqMessages?.msgDetail}") } } catch (e: Exception) { failList.add(purchaseQuotation.id) logger.error("${pqRefType} / ${pqLineRefType}: Saving Failure!") logger.error("Error on Function - ${e.stackTrace} | Type: ${pqRefType} / ${pqLineRefType} | M18 ID: ${purchaseQuotation.id}") logger.error(e.message) } } } else { logger.error("Purchase Quotation List is null. May occur errors.") logger.error("Error code: ${pqsMessages?.msgDetail}") logger.error("Error messages: ${pqsMessages?.msgDetail}") } logger.info("Total Purchase Quotation Save Success (${successList.size})") logger.info("Total Purchase Quotation Save Detail Success (${successDetailList.size})") if (failList.size > 0) { logger.error("Total Purchase Quotation Fail (${failList.size}): $failList") } if (failDetailList.size > 0) { logger.error("Total Purchase Quotation Detail Fail (${failDetailList.size}): $failDetailList") } logger.info("--------------------------------------------End - Saving M18 Purchase Quotations--------------------------------------------") } }