Browse Source

update migration phoneUserPbx, budget

masarifyuli 1 week ago
parent
commit
00ff442537

+ 1 - 1
config/general-setting.yml

@@ -182,7 +182,7 @@ redirectUrl:
 - http://localhost:4200/oauth2redirect
 - https://cmpd.telmessenger.com/oauth2redirect
 - https://app.insomnia.rest/oauth/redirect
-dataKey: jRA4iyjy1ZCaIdlJBe6Cm%2BRPGb%2BwcO85%2FWR7Z9%2B8AFVJ6uwomb2YRYofgQlAjM3gQofyhQQc1IbUhh%2BvBsYk1AO%2BKXSrp4POmJMYfmO8hryzt2OTo%2BpH9Bf3bH049SQ1fK97a9hq42fBI7Pj%2FX01zg%3D%3D
+dataKey: aY6tKotSoUoMIi7JiTBZq0KhtC4bslM0qvnU1EZgmMJ9rsAaBP8fCV3cugOaHB%2BO0rdqCT8BLvRpW3zZRMyaZN%2BOgLPchzBSS4WXWMJ2e%2BWfVKtx1U0WBWevGkoDU3IK
 
 #database: 
 #  type: sqlserver

+ 4 - 0
config/migration.yml

@@ -97,6 +97,7 @@ migration:
     table: phoneuser
     history: phoneuserhistory
     group: phoneuserextlist
+    unique: code
     attribute:
       id: history.phoneuser_id
       code: phoneuser_code
@@ -115,6 +116,9 @@ migration:
       pbx__list: group.pbx_list
       budget__maxCost: history.max_cost
       budget__warnCost: history.warn_cost
+      corcosNormal_id: history.pbx_0_day
+      corcosReducing_id: history.pbx_1_day
+      corcosBlock_id: history.pbx_1_day
   - target: callTransaction
     table: calltransaction_20260127
     history: null

+ 1 - 1
src/main/kotlin/com/datacomsolusindo/migration/General.kt

@@ -31,7 +31,7 @@ object General {
             "provider" -> Provider::class.java
             "rate" -> Rate::class.java
             "webUser" -> WebUser::class.java
-            "corcos" -> Corcos::class.java
+            "corcos", "corcosNormal", "corcosReducing", "corcosBlock" -> Corcos::class.java
             else -> null
         }
     }

+ 36 - 20
src/main/kotlin/com/datacomsolusindo/migration/MigrationEntity.kt

@@ -124,7 +124,9 @@ class MigrationEntity(val passwordEncoder: PasswordEncoder, val queryNativeServi
                 queueInsertData.put((clazz as Class<out BaseEntity>) to data)
             }
         } else {
-            val chunkData = rootData.chunked(1000)
+            val chunkData = rootData
+//                .take(3)
+                .chunked(1000)
             logger.info("data migration class ${clazz.simpleName} chunk data ${chunkData.size}")
             chunkData.forEachIndexed { _, data ->
                 val dataMap = data.map { row ->
@@ -192,10 +194,9 @@ class MigrationEntity(val passwordEncoder: PasswordEncoder, val queryNativeServi
                         if (target.contains("_")) {
                             val codeKey = uniqueField.removePrefix("history.")
                             val joinCode = historyIndexById?.get(valHis)?.get(codeKey)
-                            joinCode
+                            joinCode ?: valHis
                         } else valHis
                     }
-
                 }
 
                 sourceFull.startsWith("group.") -> {
@@ -382,6 +383,9 @@ class MigrationEntity(val passwordEncoder: PasswordEncoder, val queryNativeServi
                 val finalizer = finalizeMap(clazz.simpleName.camelCase(), map)
                 val phoneUserPin = finalizer["pin"]
                 val phoneUserExtension = finalizer["extension"]
+                val corcosNormal = finalizer["corcosNormal_id"]
+                val corcosReducing = finalizer["corcosReducing_id"]
+                val corcosBlock = finalizer["corcosBlock_id"]
 
                 // budget
                 val budgetAnnual = (finalizer["budget.maxCost"]?.toString()
@@ -422,12 +426,18 @@ class MigrationEntity(val passwordEncoder: PasswordEncoder, val queryNativeServi
                             "budget.warnCost",
                             "budget__warnCost",
                             "maxCost",
-                            "warnCost"
+                            "warnCost",
+                            "corcosNormal_id",
+                            "corcosReducing_id",
+                            "corcosBlock_id"
                         ).any { a -> a == fi.key }
                     } as MutableMap<String, Any?>
                     finalMap["corcos"] = if (phoneUserPbxIds.isEmpty()) "" else "[${
                         phoneUserPbxIds.distinct().joinToString(",") { m ->
-                            "{\"pbx\":\"$m\",\"normal\":\"\",\"reducing\":\"\",\"block\":\"\"}"
+                            "{\"pbx\":\"$m\"," +
+                                    "\"normal\":\"${corcosNormal ?: ""}\"," +
+                                    "\"reducing\":\"${corcosReducing ?: ""}\"," +
+                                    "\"block\":\"${corcosBlock ?: ""}\"}"
                         }
                     }]"
                     if (phoneUserPbxIds.isEmpty()) {
@@ -436,7 +446,7 @@ class MigrationEntity(val passwordEncoder: PasswordEncoder, val queryNativeServi
                     finalMap
                 } else finalizer
 
-                queryNativeService.insertDataWithNativeQuery(clazz, finalMapEntity, functionAfter = { uid ->
+                queryNativeService.insertDataWithNativeQuery(clazz, finalMapEntity, functionAfter = { uid, isUpdate ->
                     // create budget
                     if (BudgetUserType.entries.any { a -> a.name.snakeToCamel() == clazz.simpleName.camelCase() }) {
                         queryNativeService.insertDataWithNativeQuery(
@@ -465,6 +475,9 @@ class MigrationEntity(val passwordEncoder: PasswordEncoder, val queryNativeServi
                                     "extension" to phoneUserExtension,
                                     "pbx_id" to pbxId,
                                     "phoneUser_id" to uid,
+                                    "corcos_normal_uid" to corcosNormal,
+                                    "corcos_reducing_uid" to corcosReducing,
+                                    "corcos_block_uid" to corcosBlock
                                 )
                             )
                         }
@@ -523,7 +536,8 @@ class MigrationEntity(val passwordEncoder: PasswordEncoder, val queryNativeServi
                     findUidByCode(Pbx::class.java, u ?: "PBX01")
                 } else u?.toString()?.let { code ->
                     val clazzEntity = General.clazzEntity(if (isParent) className else t.split("_")[0])
-                    clazzEntity?.let { findUidByCode(it, code) }
+                    val field = if (t.split("_")[0].lowercase().startsWith("corcos")) "command" else "code"
+                    clazzEntity?.let { findUidByCode(it, code, field) }
                 }
 
                 if (value != null) {
@@ -620,11 +634,11 @@ class MigrationEntity(val passwordEncoder: PasswordEncoder, val queryNativeServi
         ).firstOrNull()?.get("uid")
     }
 
-    private fun <T : BaseEntity> findUidByCode(clazz: Class<T>, value: Any): String? {
+    private fun <T : BaseEntity> findUidByCode(clazz: Class<T>, value: Any, field: String = "code"): String? {
         return temporaryDataByCode["${clazz.simpleName};$value"] ?: run {
             val uid = temporaryDataEntity["${clazz.simpleName};$value"]?.get("uid") ?: run {
                 apiService.findListPage(
-                    clazz, filter = FilterData.filter("code", FilterData.FILTEROP.EQ, "$value")
+                    clazz, filter = FilterData.filter(field, FilterData.FILTEROP.EQ, "$value")
                 ).firstOrNull()?.let { data ->
                     temporaryDataEntity["${clazz.simpleName};$value"] = data
                     temporaryDataByCode["${clazz.simpleName};$value"] = data["uid"].toString()
@@ -704,12 +718,17 @@ class QueryNativeService(
     fun <T> insertDataWithNativeQuery(
         clazz: Class<T>,
         mapData: MutableMap<String, Any?>,
-        functionAfter: ((uid: String) -> Unit)? = null
+        functionAfter: ((uid: String, isUpdate: Boolean) -> Unit)? = null
     ): String? {
+        val className = clazz.simpleName
+        val fieldUnique = when (className.lowercase()) {
+            "phoneuserpbx" -> "phone_user_uid;pbx_uid"
+            "budget" -> "user_uid"
+            else -> migrationSettingService.schema.firstOrNull {
+                it.table.equals(clazz.simpleName, ignoreCase = true)
+            }?.unique
+        }
 
-        val fieldUnique = migrationSettingService.schema.firstOrNull {
-            it.table.equals(clazz.simpleName, ignoreCase = true)
-        }?.unique
         val fieldKey = fieldUnique?.split(";")?.mapNotNull { m -> mapData[m]?.toString() }?.joinToString(";")
 
         val uidFromDb = temporaryDataEntity["${clazz.simpleName};$fieldKey"]?.get("uid")?.toString()
@@ -725,19 +744,19 @@ class QueryNativeService(
         val structure = finalMap["parent_id"]?.toString()?.let {
             fields.add("structure")
             val parentUid = EntityUtility(
-                apiService, General.clazzEntity(clazz.simpleName.camelCase())!!
+                apiService, General.clazzEntity(className.camelCase())!!
             ).parentStructure(it)
             "$parentUid|$uid"
         }
 
-        val tableName = when (clazz.simpleName.lowercase()) {
+        val tableName = when (className.lowercase()) {
             "phoneuserpbx" -> "phoneuserpbx"
             "transaction" -> {
                 fields.remove("uid")
                 "calltransaction"
             }
 
-            else -> clazz.simpleName.camelToSnake().lowercase()
+            else -> className.camelToSnake().lowercase()
         }
 
         val query = fieldUnique?.let { fu ->
@@ -760,7 +779,6 @@ class QueryNativeService(
 //        val tempField = fields.joinToString() { it.camelToSnake() }
 //        val query = "INSERT INTO $tableName ($tempField) " +
 //                "VALUES (${fields.joinToString() { ":$it" }})"
-
         val sqlNative = apiService.em.createNativeQuery(query)
 
         if (clazz.simpleName.lowercase() != "transaction") {
@@ -770,9 +788,7 @@ class QueryNativeService(
         finalMap.forEach { (t, u) -> sqlNative.setParameter(t.replace("_id", "_uid"), u) }
         sqlNative.executeUpdate()
 
-        if (isUpdate) {
-            functionAfter?.invoke(uid)
-        }
+        functionAfter?.invoke(uid, isUpdate)
 
         return uid
     }