Source: tree/treeQueue/treeAdd.familyActions.js

// @ts-check
/**
 * @import {treeAction} from './../../types.js'
 */
import { query, HEX2uuid } from '@commtool/sql-query'
import rebuildFees from '../rebuildFees.js'
import { familyAddress } from '../familyAddress.js'
import { errorLoggerUpdate } from '../../utils/requestLogger.js'

/**
 * Handles the `family` and `familyB` add actions.
 *
 * Fired when a family member is added to a family and the organisation uses
 * family-based fees. Recalculates membership fees and updates family indices
 * for the target family.
 *
 * @param {treeAction} action
 * @returns {Promise<void>}
 */
export const addFamilyAction = async (action) => {
    try {
        // The link has already been created when the member was created.
        rebuildFees(action.UIDnewTarget, HEX2uuid(action.UIDroot))
    } catch (e) {
        errorLoggerUpdate(e || new Error('treeAdd.familyActions.addFamilyAction: Unknown error occurred'))
    }
}

/**
 * Handles the `familySync` add action.
 *
 * Syncs addresses, phone numbers, email addresses, and accounts between
 * family members when a family-shared contact detail is created or modified.
 *
 * @param {treeAction} action
 * @returns {Promise<void>}
 */
export const addFamilySyncAction = async (action) => {
    try {
    const persons = await query(
        `SELECT Member.UID, Member.Data, Links.UIDTarget AS MemberA,
                ObjectBase.Data AS BaseData, ObjectBase.dindex, ObjectBase.Type,
                ObjectBase.SortName AS SortBase,
                ObjectBase.ValidFrom, ObjectBase.ValidUntil, ObjectBase.dindex
         FROM ObjectBase
         INNER JOIN Member ON (Member.UID=ObjectBase.UIDBelongsTo)
         INNER JOIN Links  ON (Links.Type='memberA' AND Links.UID=ObjectBase.UID)
         INNER JOIN ObjectBase AS MainGroup ON (Links.UIDTarget=MainGroup.UID AND MainGroup.Type='group')
         WHERE ObjectBase.UID=? AND ObjectBase.Type IN ('person','extern')`,
        [action.UIDBelongsTo],
        { log: false, cast: ['json'] },
    )
    if (persons.length > 0)
        familyAddress(/** @type {import('../familyAddress.js').FamilyMemberObject} */ (persons[0]), HEX2uuid(action.UIDroot))
    } catch (e) {
        errorLoggerUpdate(e || new Error('treeAdd.familyActions.addFamilySyncAction: Unknown error occurred'))
    }
}