11/* eslint-disable no-continue */
2+ import lodash from 'lodash'
23import { Transaction } from 'sequelize'
34
4- import { Error404 } from '@crowd/common'
5+ import { Error404 , sanitizeMemberOrganizationDateRange } from '@crowd/common'
56import { CommonMemberService } from '@crowd/common_services'
67import {
78 OrganizationField ,
@@ -10,6 +11,7 @@ import {
1011 cleanSoftDeletedMemberOrganization ,
1112 createMemberOrganization ,
1213 deleteMemberOrganizations ,
14+ fetchMemberOrganizationById ,
1315 fetchMemberOrganizations ,
1416 findMemberAffiliationOverrides ,
1517 optionsQx ,
@@ -167,12 +169,18 @@ export default class MemberOrganizationsService extends LoggerBase {
167169
168170 try {
169171 const qx = SequelizeRepository . getQueryExecutor ( repositoryOptions )
172+ const dates = sanitizeMemberOrganizationDateRange ( data . dateStart , data . dateEnd , true )
173+ const memberOrgData : Partial < IMemberOrganization > = {
174+ ...data ,
175+ dateStart : dates . dateStart ,
176+ dateEnd : dates . dateEnd ,
177+ }
170178
171179 // Clean up any soft-deleted entries
172- await cleanSoftDeletedMemberOrganization ( qx , memberId , data . organizationId , data )
180+ await cleanSoftDeletedMemberOrganization ( qx , memberId , data . organizationId , memberOrgData )
173181
174182 // Create new member organization
175- const newMemberOrgId = await createMemberOrganization ( qx , memberId , data )
183+ const newMemberOrgId = await createMemberOrganization ( qx , memberId , memberOrgData )
176184
177185 // Check if organization affiliation is blocked
178186 const isAffiliationBlocked = await checkOrganizationAffiliationPolicy ( qx , data . organizationId )
@@ -214,26 +222,44 @@ export default class MemberOrganizationsService extends LoggerBase {
214222 try {
215223 const qx = SequelizeRepository . getQueryExecutor ( repositoryOptions )
216224
217- const update : MemberOrganizationUpdate = Object . fromEntries (
218- Object . entries ( {
225+ const existing = await fetchMemberOrganizationById ( qx , id )
226+ if ( ! existing || existing . memberId !== memberId ) {
227+ throw new Error404 ( `Member organization with id ${ id } not found!` )
228+ }
229+
230+ const hasDateStart = data . dateStart !== undefined
231+ const hasDateEnd = data . dateEnd !== undefined
232+ const targetDateRange = sanitizeMemberOrganizationDateRange (
233+ hasDateStart ? data . dateStart : existing . dateStart ,
234+ hasDateEnd ? data . dateEnd : existing . dateEnd ,
235+ true ,
236+ )
237+
238+ const update = lodash . pickBy (
239+ {
219240 organizationId : data . organizationId ,
220241 title : data . title ,
221- dateStart : data . dateStart ,
222- dateEnd : data . dateEnd ,
242+ dateStart : hasDateStart ? targetDateRange . dateStart : undefined ,
243+ dateEnd : hasDateEnd ? targetDateRange . dateEnd : undefined ,
244+
223245 verified : data . verified ,
224246 verifiedBy : data . verifiedBy ,
225- } ) . filter ( ( [ , v ] ) => v !== undefined ) ,
226- )
247+ } ,
248+ ( v ) => v !== undefined ,
249+ ) as MemberOrganizationUpdate
227250
228- await cleanSoftDeletedMemberOrganization ( qx , memberId , data . organizationId , data )
229- // Any manual edit from the frontend promotes ownership to UI so automated
230- // sources (e.g. email-domain inference) no longer overwrite user intent.
251+ await cleanSoftDeletedMemberOrganization ( qx , memberId , data . organizationId , update )
231252 await updateMemberOrganization ( qx , memberId , id , {
232253 ...update ,
233254 source : OrganizationSource . UI ,
234255 } )
235256
236- await this . commonMemberService . startAffiliationRecalculation ( memberId , [ data . organizationId ] )
257+ // Trigger recalculation for old and new orgs if changed
258+ const orgsToRecalculate = Array . from (
259+ new Set ( [ existing . organizationId , data . organizationId ] ) ,
260+ ) . filter ( ( orgId ) : orgId is string => Boolean ( orgId ) )
261+
262+ await this . commonMemberService . startAffiliationRecalculation ( memberId , orgsToRecalculate )
237263
238264 const result = await this . list ( memberId , transaction )
239265
0 commit comments