feat(leads): keep gender on leads and form submissions
A lead can carry the same honorific as a person, and a form that asks gender writes it onto the lead. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -32,6 +32,8 @@ const MAP_TO = [
|
||||
'lead.trade',
|
||||
'lead.notes',
|
||||
'lead.source',
|
||||
'lead.gender',
|
||||
'person.gender',
|
||||
'notes',
|
||||
'custom',
|
||||
] as const;
|
||||
|
||||
@@ -13,6 +13,7 @@ import type {
|
||||
SubmitLeadFormResponse,
|
||||
UpdateLeadFormRequest,
|
||||
} from '@mento/shared';
|
||||
import { isGenderQuestionLabel, parsePersonGenderAnswer } from '@mento/shared';
|
||||
import { Prisma } from '@prisma/client';
|
||||
import { PrismaService } from '../prisma/prisma.service';
|
||||
import { LocalFileStorage } from '../storage/local-file.storage';
|
||||
@@ -548,6 +549,7 @@ export class LeadFormsService {
|
||||
trade: emptyToNull(mapped.trade) ?? existingLead.trade,
|
||||
source: source ?? existingLead.source,
|
||||
notes: emptyToNull(mapped.notes) ?? existingLead.notes,
|
||||
...(mapped.gender ? { gender: mapped.gender } : {}),
|
||||
assigneeId: existingLead.assigneeId ?? assigneeId,
|
||||
lastContactAt: new Date(),
|
||||
},
|
||||
@@ -596,6 +598,7 @@ export class LeadFormsService {
|
||||
trade: emptyToNull(mapped.trade),
|
||||
source,
|
||||
notes: emptyToNull(mapped.notes),
|
||||
gender: mapped.gender ?? 'none',
|
||||
stageId,
|
||||
position: (maxPos._max.position ?? -1) + 1,
|
||||
assigneeId,
|
||||
@@ -655,6 +658,7 @@ export class LeadFormsService {
|
||||
phone: phone ?? existing.phone,
|
||||
position: emptyToNull(mapped.position) ?? existing.position,
|
||||
notes: emptyToNull(mapped.notes) ?? existing.notes,
|
||||
...(mapped.gender ? { gender: mapped.gender } : {}),
|
||||
ownerId: existing.ownerId ?? ownerId,
|
||||
},
|
||||
});
|
||||
@@ -671,6 +675,7 @@ export class LeadFormsService {
|
||||
phone,
|
||||
position: emptyToNull(mapped.position),
|
||||
notes: emptyToNull(mapped.notes),
|
||||
gender: mapped.gender ?? 'none',
|
||||
ownerId,
|
||||
},
|
||||
});
|
||||
@@ -926,6 +931,7 @@ type MappedValues = {
|
||||
region?: string;
|
||||
trade?: string;
|
||||
leadSource?: string;
|
||||
gender?: 'male' | 'female' | 'none';
|
||||
};
|
||||
|
||||
function mapValues(
|
||||
@@ -946,6 +952,15 @@ function mapValues(
|
||||
throw new BadRequestException(`فیلد «${field.label}» الزامی است`);
|
||||
}
|
||||
if (!raw) continue;
|
||||
if (
|
||||
field.mapTo === 'lead.gender' ||
|
||||
field.mapTo === 'person.gender' ||
|
||||
isGenderQuestionLabel(field.label)
|
||||
) {
|
||||
const gender = parsePersonGenderAnswer(raw);
|
||||
if (gender) mapped.gender = gender;
|
||||
continue;
|
||||
}
|
||||
switch (field.mapTo) {
|
||||
case 'person.fullName': {
|
||||
const parts = raw.split(/\s+/).filter(Boolean);
|
||||
@@ -1069,7 +1084,8 @@ function collectExtras(
|
||||
for (const field of fields) {
|
||||
if (field.fieldType === 'heading' || field.mapTo !== 'custom') continue;
|
||||
const raw = (values?.[field.key] ?? '').toString().trim();
|
||||
if (raw) lines.push(`${field.label}: ${raw}`);
|
||||
if (!raw || (isGenderQuestionLabel(field.label) && parsePersonGenderAnswer(raw))) continue;
|
||||
lines.push(`${field.label}: ${raw}`);
|
||||
}
|
||||
return lines.join('\n');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user