diff --git a/packages/twenty-server/src/engine/twenty-orm/repository/workspace-insert-query-builder.ts b/packages/twenty-server/src/engine/twenty-orm/repository/workspace-insert-query-builder.ts index f79c4e17f6..4968334f35 100644 --- a/packages/twenty-server/src/engine/twenty-orm/repository/workspace-insert-query-builder.ts +++ b/packages/twenty-server/src/engine/twenty-orm/repository/workspace-insert-query-builder.ts @@ -115,6 +115,40 @@ export class WorkspaceInsertQueryBuilder< shouldBypassPermissionChecks: this.shouldBypassPermissionChecks, }); + // Fix overwrites for composite fields - valuesSet contains formatted/flattened column names + // but overwrites was computed before formatData, missing composite field columns + if ( + isDefined(this.expressionMap.onUpdate?.overwrite) && + isDefined(this.expressionMap.valuesSet) + ) { + const valuesArray = Array.isArray(this.expressionMap.valuesSet) + ? this.expressionMap.valuesSet + : [this.expressionMap.valuesSet]; + + const allValueKeys = new Set( + valuesArray.flatMap((value) => Object.keys(value)), + ); + + const mainAliasMetadata = this.expressionMap.mainAlias?.metadata; + + if (mainAliasMetadata) { + const missingColumns = mainAliasMetadata.columns + .filter( + (col) => + allValueKeys.has(col.databaseName) && + !this.expressionMap.onUpdate.overwrite!.includes( + col.databaseName, + ), + ) + .map((col) => col.databaseName); + + this.expressionMap.onUpdate.overwrite = [ + ...this.expressionMap.onUpdate.overwrite, + ...missingColumns, + ]; + } + } + const mainAliasTarget = this.getMainAliasTarget(); const objectMetadata = getObjectMetadataFromEntityTarget(