You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

377 regels
20 KiB

  1. package com.ffii.fpsms.m18.service
  2. import com.ffii.core.utils.JwtTokenUtil
  3. import com.ffii.fpsms.api.service.ApiCallerService
  4. import com.ffii.fpsms.m18.M18Config
  5. import com.ffii.fpsms.m18.model.*
  6. import com.ffii.fpsms.m18.utils.CommonUtils
  7. import com.ffii.fpsms.modules.master.service.ItemsService
  8. import com.ffii.fpsms.modules.master.service.ShopService
  9. import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus
  10. import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus
  11. import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderType
  12. import com.ffii.fpsms.modules.purchaseOrder.service.PurchaseOrderLineService
  13. import com.ffii.fpsms.modules.purchaseOrder.service.PurchaseOrderService
  14. import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderLineRequest
  15. import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderRequest
  16. import org.slf4j.Logger
  17. import org.slf4j.LoggerFactory
  18. import org.springframework.stereotype.Service
  19. import java.time.LocalDateTime
  20. import kotlin.reflect.full.memberProperties
  21. @Service
  22. open class M18PurchaseOrderService(
  23. val m18Config: M18Config,
  24. val apiCallerService: ApiCallerService,
  25. val m18DataLogService: M18DataLogService,
  26. val purchaseOrderService: PurchaseOrderService,
  27. val purchaseOrderLineService: PurchaseOrderLineService,
  28. val itemsService: ItemsService,
  29. val shopService: ShopService,
  30. ) {
  31. val commonUtils = CommonUtils()
  32. val logger: Logger = LoggerFactory.getLogger(JwtTokenUtil::class.java)
  33. val lastModifyDate = LocalDateTime.now().minusMinutes(30)
  34. // val commonConds =
  35. // "(beId=equal=${m18Config.BEID_PF}=or=beId=equal=${m18Config.BEID_PP}=or=beId=equal=${m18Config.BEID_TOA})=and=lastModifyDate=largerOrEqual=${lastModifyDate}"
  36. // M18 API
  37. val M18_LOAD_PURCHASE_ORDER_API = "/root/api/read/po"
  38. val M18_FETCH_PURCHASE_ORDER_LIST_API = "/search/search"
  39. // Include material po, shop po, oem po
  40. open fun getPurchaseOrdersWithType(): M18PurchaseOrderListResponseWithType? {
  41. val purchaseOrders = M18PurchaseOrderListResponseWithType(mutableListOf())
  42. // Material PO
  43. val materialPoBuyers =
  44. commonUtils.ListToString(listOf(m18Config.BEID_PP, m18Config.BEID_PF), "beId=equal=", "=or=")
  45. val materialPoSupplierNot = "venId=unequal=${m18Config.MATERIAL_PO_SUPPLIER_NOT}"
  46. val materialPoConds = "${materialPoBuyers}=and=${materialPoSupplierNot}"
  47. val materialPoParams = M18PurchaseOrderListRequest(
  48. params = null,
  49. conds = materialPoConds
  50. )
  51. try {
  52. purchaseOrders.valuesWithType += Pair(
  53. PurchaseOrderType.MATERIAL,
  54. apiCallerService.get<M18PurchaseOrderListResponse, M18PurchaseOrderListRequest>(
  55. M18_FETCH_PURCHASE_ORDER_LIST_API,
  56. materialPoParams
  57. ).block()?.values ?: mutableListOf()
  58. )
  59. } catch (e: Exception) {
  60. logger.error("Error on Function - ${e.stackTrace}")
  61. logger.error(e.message)
  62. }
  63. // Shop PO
  64. val shopPoBuyers = commonUtils.ListToString(listOf(m18Config.BEID_TOA), "beId=equal=", "=or=")
  65. val shopPoSupplier = "venId=equal=${m18Config.SHOP_PO_SUPPLIER}"
  66. val shopPoConds = "${shopPoBuyers}=and=${shopPoSupplier}"
  67. val shopPoParams = M18PurchaseOrderListRequest(
  68. params = null,
  69. conds = shopPoConds
  70. )
  71. try {
  72. purchaseOrders.valuesWithType += Pair(
  73. PurchaseOrderType.SHOP, apiCallerService.get<M18PurchaseOrderListResponse, M18PurchaseOrderListRequest>(
  74. M18_FETCH_PURCHASE_ORDER_LIST_API,
  75. shopPoParams
  76. ).block()?.values ?: mutableListOf()
  77. )
  78. } catch (e: Exception) {
  79. logger.error("Error on Function - ${e.stackTrace}")
  80. logger.error(e.message)
  81. }
  82. // OEM PO
  83. val oemPoBuyers = commonUtils.ListToString(listOf(m18Config.BEID_PF, m18Config.BEID_PP), "beId=equal=", "=or=")
  84. val oemPoSupplier = "venId=equal=${m18Config.OEM_PO_SUPPLIER}"
  85. val oemPoConds = "${oemPoBuyers}=and=${oemPoSupplier}"
  86. val oemPoParams = M18PurchaseOrderListRequest(
  87. params = null,
  88. conds = oemPoConds
  89. )
  90. try {
  91. purchaseOrders.valuesWithType += Pair(
  92. PurchaseOrderType.OEM, apiCallerService.get<M18PurchaseOrderListResponse, M18PurchaseOrderListRequest>(
  93. M18_FETCH_PURCHASE_ORDER_LIST_API,
  94. oemPoParams
  95. ).block()?.values
  96. )
  97. } catch (e: Exception) {
  98. logger.error("Error on Function - ${e.stackTrace}")
  99. logger.error(e.message)
  100. }
  101. return purchaseOrders
  102. }
  103. open fun getPurchaseOrder(id: Long): M18PurchaseOrderResponse? {
  104. val purchaseOrderParams = M18PurchaseOrderRequest(
  105. id = id
  106. )
  107. var purchaseOrder: M18PurchaseOrderResponse? = null
  108. try {
  109. purchaseOrder = apiCallerService.get<M18PurchaseOrderResponse, M18PurchaseOrderRequest>(
  110. M18_LOAD_PURCHASE_ORDER_API,
  111. purchaseOrderParams
  112. ).block()
  113. } catch (e: Exception) {
  114. logger.error("Error on Function - ${e.stackTrace}")
  115. logger.error(e.message)
  116. }
  117. return purchaseOrder
  118. }
  119. open fun savePurchaseOrders() {
  120. logger.info("--------------------------------------------Start - Saving M18 Purchase Order--------------------------------------------")
  121. val purchaseOrdersWithType = getPurchaseOrdersWithType()
  122. val examplePurchaseOrders = listOf<Long>(4764034L)
  123. val successList = mutableListOf<Long>()
  124. val successDetailList = mutableListOf<Long>()
  125. val failList = mutableListOf<Long>()
  126. val failDetailList = mutableListOf<Long>()
  127. val poRefType = "Purchase Order"
  128. val poLineRefType = "Purchase Order Line"
  129. if (purchaseOrdersWithType != null) {
  130. // Loop for Purchase Orders (values)
  131. purchaseOrdersWithType.valuesWithType.forEach { purchaseOrderWithType ->
  132. val type = purchaseOrderWithType.first
  133. val purchaseOrders = purchaseOrderWithType.second
  134. if (purchaseOrders != null) {
  135. purchaseOrders.forEach { purchaseOrder ->
  136. val purchaseOrderDetail = getPurchaseOrder(purchaseOrder.id)
  137. var purchaseOrderId: Long? = null //FP-MTMS
  138. // Process for Purchase Order (mainpo)
  139. // Assume only one PO in the PO (search by PO ID)
  140. val mainpo = purchaseOrderDetail?.data?.mainpo?.get(0)
  141. val pot = purchaseOrderDetail?.data?.pot
  142. // purchase_order + m18_data_log table
  143. if (mainpo != null) {
  144. // Find the latest m18 data log by m18 id & type
  145. logger.info("${poRefType}: Finding For Latest M18 Data Log...")
  146. val latestPurchaseOrderLog =
  147. m18DataLogService.findLatestM18DataLog(purchaseOrder.id, poRefType)
  148. // logger.info("${poRefType}: Latest M18 Data Log ID: ${latestPurchaseOrderLog?.id}")
  149. // Save to m18_data_log table
  150. logger.info("${poRefType}: Saving for M18 Data Log...")
  151. val mainpoJson =
  152. mainpo::class.memberProperties.associate { prop -> prop.name to prop.getter.call(mainpo) }
  153. .toMutableMap()
  154. val saveM18PurchaseOrderLogRequest = SaveM18DataLogRequest(
  155. id = null,
  156. refType = poRefType,
  157. m18Id = purchaseOrder.id,
  158. m18LastModifyDate = commonUtils.InstantToLocalDateTime(mainpo.lastModifyDate),
  159. dataLog = mainpoJson,
  160. status = true
  161. )
  162. val saveM18PurchaseOrderLog =
  163. m18DataLogService.saveM18DataLog(saveM18PurchaseOrderLogRequest)
  164. // logger.info("${poRefType}: Saved M18 Data Log. ID: ${saveM18PurchaseOrderLog.id}")
  165. try {
  166. // Find the purchase_order if exist
  167. logger.info("${poRefType}: Finding exising purchase order...")
  168. val existingPurchaseOrder =
  169. latestPurchaseOrderLog?.id?.let { purchaseOrderService.findPurchaseOrderByM18Id(it) }
  170. logger.info("${poRefType}: Exising purchase order ID: ${existingPurchaseOrder?.id}")
  171. // Save to purchase_order table
  172. logger.info("${poRefType}: Saving purchase order...")
  173. val supplierId = shopService.findByM18Id(mainpo.venId)?.id
  174. val savePurchaseOrderRequest = SavePurchaseOrderRequest(
  175. id = existingPurchaseOrder?.id,
  176. code = mainpo.code,
  177. supplierId = supplierId,
  178. orderDate = commonUtils.InstantToLocalDateTime(mainpo.tDate),
  179. estimatedArrivalDate = commonUtils.InstantToLocalDateTime(mainpo.dDate),
  180. completeDate = null,
  181. status = PurchaseOrderStatus.PENDING.value,
  182. type = type.value,
  183. m18DataLogId = saveM18PurchaseOrderLog.id,
  184. )
  185. val savePurchaseOrderResponse =
  186. purchaseOrderService.savePurchaseOrder(savePurchaseOrderRequest)
  187. purchaseOrderId = savePurchaseOrderResponse.id
  188. successList.add(purchaseOrder.id)
  189. logger.info("${poRefType}: Saved purchase order. ID: ${savePurchaseOrderResponse.id} | M18 ${poRefType} ID: ${purchaseOrder.id}")
  190. } catch (e: Exception) {
  191. failList.add(purchaseOrder.id)
  192. logger.error("${poRefType}: Saving Failure!")
  193. logger.error("Error on Function - ${e.stackTrace} | Type: ${poRefType} | M18 ID: ${purchaseOrder.id} | Different? ${mainpo.id}")
  194. logger.error(e.message)
  195. val errorSaveM18PurchaseOrderLogRequest = SaveM18DataLogRequest(
  196. id = saveM18PurchaseOrderLogRequest.id,
  197. refType = poRefType,
  198. m18Id = purchaseOrder.id,
  199. m18LastModifyDate = commonUtils.InstantToLocalDateTime(mainpo.lastModifyDate),
  200. dataLog = mainpoJson,
  201. status = false
  202. )
  203. m18DataLogService.saveM18DataLog(errorSaveM18PurchaseOrderLogRequest)
  204. logger.error("${poRefType}: M18 Data Log Updated! Please see the error. ID: ${saveM18PurchaseOrderLogRequest.id}")
  205. }
  206. // purchase_order_line + m18_data_log
  207. if (pot != null) {
  208. // Loop for Purchase Order Lines (pot)
  209. pot.forEach { line ->
  210. // // Find the latest m18 data log by m18 id & type
  211. logger.info("${poLineRefType}: Finding For Latest M18 Data Log...")
  212. val latestPurchaseOrderLineLog =
  213. m18DataLogService.findLatestM18DataLog(line.id, poLineRefType)
  214. // logger.info("${poLineRefType}: Latest M18 Data Log ID: ${latestPurchaseOrderLineLog?.id}")
  215. // Save to m18_data_log table
  216. logger.info("${poLineRefType}: Saving for M18 Data Log...")
  217. val lineJson =
  218. line::class.memberProperties.associate { prop ->
  219. prop.name to prop.getter.call(
  220. line
  221. )
  222. }
  223. .toMutableMap()
  224. val saveM18PurchaseOrderLineLogRequest = SaveM18DataLogRequest(
  225. id = null,
  226. refType = poLineRefType,
  227. m18Id = line.id,
  228. m18LastModifyDate = commonUtils.InstantToLocalDateTime(mainpo.lastModifyDate),
  229. dataLog = lineJson,
  230. status = true
  231. )
  232. val saveM18PurchaseOrderLineLog =
  233. m18DataLogService.saveM18DataLog(saveM18PurchaseOrderLineLogRequest)
  234. // logger.info("${poLineRefType}: Saved M18 Data Log. ID: ${saveM18PurchaseOrderLineLog.id}")
  235. logger.info("${poLineRefType}: Finding item...")
  236. val item = itemsService.findByM18Id(line.proId)
  237. logger.info("${poLineRefType}: Item ID: ${item?.id} | M18 Item ID: ${line.proId}")
  238. try {
  239. // Find the purchase_order_line if exist
  240. logger.info("${poLineRefType}: Finding exising purchase order line...")
  241. val existingPurchaseOrderLine = latestPurchaseOrderLineLog?.id?.let {
  242. purchaseOrderLineService.findPurchaseOrderLineByM18Id(it)
  243. }
  244. logger.info("${poLineRefType}: Exising purchase order line ID: ${existingPurchaseOrderLine?.id}")
  245. // Save to purchase_order_line table
  246. logger.info("${poLineRefType}: Saving purchase order line...")
  247. val lineUom =
  248. val savePurchaseOrderLineRequest = SavePurchaseOrderLineRequest(
  249. id = existingPurchaseOrderLine?.id,
  250. itemId = item?.id,
  251. uomId = null,
  252. purchaseOrderId = purchaseOrderId,
  253. qty = line.qty,
  254. price = line.amt,
  255. m18CurrencyId = line.curId,
  256. status = existingPurchaseOrderLine?.status?.value
  257. ?: PurchaseOrderLineStatus.PENDING.value,
  258. m18DataLogId = saveM18PurchaseOrderLineLog.id,
  259. )
  260. val savePurchaseOrderLineResponse =
  261. purchaseOrderLineService.savePurchaseOrderLine(savePurchaseOrderLineRequest)
  262. logger.info("${poLineRefType}: Purchase order ID: ${purchaseOrderId} | M18 ID: ${purchaseOrder.id}")
  263. logger.info("${poLineRefType}: Saved purchase order line. ID: ${savePurchaseOrderLineResponse.id} | M18 Line ID: ${line.id}")
  264. } catch (e: Exception) {
  265. failDetailList.add(line.id)
  266. logger.error("${poLineRefType}: Saving Failure!")
  267. logger.error("Error on Function - ${e.stackTrace} | Type: ${poLineRefType} | M18 ID: ${line.id}")
  268. logger.error(e.message)
  269. val errorSaveM18PurchaseOrderLineLogRequest = SaveM18DataLogRequest(
  270. id = saveM18PurchaseOrderLineLog.id,
  271. refType = "${poRefType}",
  272. m18Id = line.id,
  273. m18LastModifyDate = commonUtils.InstantToLocalDateTime(mainpo.lastModifyDate),
  274. dataLog = lineJson,
  275. status = false
  276. )
  277. m18DataLogService.saveM18DataLog(errorSaveM18PurchaseOrderLineLogRequest)
  278. logger.error("${poLineRefType}: M18 Data Log Updated! Please see the error. ID: ${saveM18PurchaseOrderLineLog.id}")
  279. }
  280. }
  281. } else {
  282. // pot
  283. logger.error("${poLineRefType}: Saving Failure!")
  284. val saveM18PurchaseOrderLineLogRequest = SaveM18DataLogRequest(
  285. id = null,
  286. refType = "${poLineRefType}",
  287. m18Id = purchaseOrder.id,
  288. m18LastModifyDate = commonUtils.InstantToLocalDateTime(mainpo.lastModifyDate),
  289. dataLog = mutableMapOf(Pair("Error Message", "${poLineRefType} is null")),
  290. status = false
  291. )
  292. val errorLog = m18DataLogService.saveM18DataLog(saveM18PurchaseOrderLineLogRequest)
  293. logger.error("${poLineRefType}: M18 Data Log Updated! Please see the error. ID: ${errorLog.id}")
  294. }
  295. } else {
  296. // mainpo
  297. logger.error("${poRefType}: Saving Failure!")
  298. val saveM18DataLogRequest = SaveM18DataLogRequest(
  299. id = null,
  300. refType = "${poRefType}",
  301. m18Id = purchaseOrder.id,
  302. // m18LastModifyDate = if(mainpo?.lastModifyDate != null) commonUtils.InstantToLocalDateTime(mainpo.lastModifyDate) else LocalDateTime.now(),
  303. m18LastModifyDate = LocalDateTime.now(),
  304. dataLog = mutableMapOf(Pair("Error Message", "${poRefType} is null")),
  305. status = false
  306. )
  307. val errorLog = m18DataLogService.saveM18DataLog(saveM18DataLogRequest)
  308. logger.error("${poLineRefType}: M18 Data Log Updated! Please see the error. ID: ${errorLog.id}")
  309. }
  310. }
  311. } else {
  312. logger.error("${poRefType} List is null. May occur errors.")
  313. }
  314. }
  315. } else {
  316. logger.error("${poRefType} List is null. May occur errors.")
  317. }
  318. // End of save. Check result
  319. logger.info("Total Success (${poRefType}) (${successList.size}): $successList")
  320. if (failList.size > 0) {
  321. logger.error("Total Fail (${poRefType}) (${failList.size}): $failList")
  322. }
  323. logger.info("Total Success (${poLineRefType}) (${successDetailList.size}): $successDetailList")
  324. if (failDetailList.size > 0) {
  325. logger.error("Total Fail (${poLineRefType}) (${failDetailList.size}): $failDetailList")
  326. }
  327. logger.info("--------------------------------------------End - Saving M18 Purchase Order--------------------------------------------")
  328. }
  329. }