ContactMerge.kt
55 lignes · 2047 octets
package fr.ebii.card2vcf.crm import fr.ebii.card2vcf.data.CrmContactEntity data class MergeFieldChoices( val fullNameFromId: Long, val firstNameFromId: Long, val lastNameFromId: Long, val companyFromId: Long, val jobTitleFromId: Long, val websiteFromId: Long, val addressFromId: Long, val notesMode: NotesMode, val cardImageFromId: Long?, val profileImageFromId: Long?, val keepId: Long, ) enum class NotesMode { KEEP_PRIMARY, CONCAT } object ContactMerge { fun merge( sources: Map<Long, CrmContactEntity>, choices: MergeFieldChoices, now: Long = System.currentTimeMillis(), ): CrmContactEntity { fun scalar(picker: Long, sel: (CrmContactEntity) -> String?) = sources.getValue(picker).let(sel) val keep = sources.getValue(choices.keepId) val phones = sources.values.flatMap { it.phones }.distinct() val emails = sources.values.flatMap { it.emails }.distinct() val notes = when (choices.notesMode) { NotesMode.KEEP_PRIMARY -> keep.notes NotesMode.CONCAT -> sources.values.mapNotNull { it.notes?.takeIf { n -> n.isNotBlank() } } .distinct() .joinToString("\n---\n") .ifBlank { null } } return keep.copy( fullName = scalar(choices.fullNameFromId) { it.fullName }, firstName = scalar(choices.firstNameFromId) { it.firstName }, lastName = scalar(choices.lastNameFromId) { it.lastName }, company = scalar(choices.companyFromId) { it.company }, jobTitle = scalar(choices.jobTitleFromId) { it.jobTitle }, website = scalar(choices.websiteFromId) { it.website }, address = scalar(choices.addressFromId) { it.address }, notes = notes, phones = phones, emails = emails, phonesText = phones.joinToString(" "), emailsText = emails.joinToString(" "), updatedAt = now, ) } }
GitRust