Adding registration date and multiple addresses for contacts and leads.

This commit is contained in:
2026-10-03 12:29:11 +03:30
parent 989c03b381
commit 1309da2281
22 changed files with 699 additions and 32 deletions
+38
View File
@@ -20,6 +20,11 @@ import {
type Actor,
elevated,
} from '../common/record-scope';
import {
asAddresses,
collectAddresses,
toJsonAddresses,
} from '../common/custom-fields';
import { emptyToNull, normalizePhone } from '../contacts/normalize';
import { LocalFileStorage } from '../storage/local-file.storage';
import { LeadStagesService } from './lead-stages.service';
@@ -238,6 +243,8 @@ export class LeadsService {
phone?: string | null;
city?: string | null;
region?: string | null;
instagram?: string | null;
addresses?: string[];
trade?: string | null;
source?: string | null;
notes?: string | null;
@@ -245,6 +252,7 @@ export class LeadsService {
stageId?: string;
assigneeId?: string | null;
nextFollowUpAt?: string | null;
registeredAt?: string | null;
},
): Promise<LeadDto> {
await this.stages.ensureDefaults(actor.organizationId);
@@ -271,6 +279,7 @@ export class LeadsService {
assigneeId = actor.userId;
}
const registeredAt = dto.registeredAt ? new Date(dto.registeredAt) : null;
const row = await this.prisma.lead.create({
data: {
organizationId: actor.organizationId,
@@ -280,6 +289,8 @@ export class LeadsService {
phone: emptyToNull(dto.phone),
city: emptyToNull(dto.city),
region: emptyToNull(dto.region),
instagram: emptyToNull(dto.instagram),
addresses: toJsonAddresses(dto.addresses),
trade: emptyToNull(dto.trade),
source: emptyToNull(dto.source),
notes: emptyToNull(dto.notes),
@@ -287,6 +298,9 @@ export class LeadsService {
dto.estimatedValue != null
? new Prisma.Decimal(dto.estimatedValue)
: null,
...(registeredAt && !Number.isNaN(registeredAt.getTime())
? { createdAt: registeredAt }
: {}),
stageId,
assigneeId,
createdById: actor.userId,
@@ -351,6 +365,12 @@ export class LeadsService {
...(dto.region !== undefined
? { region: emptyToNull(dto.region as string) }
: {}),
...(dto.instagram !== undefined
? { instagram: emptyToNull(dto.instagram as string) }
: {}),
...(dto.addresses !== undefined
? { addresses: toJsonAddresses(dto.addresses) }
: {}),
...(dto.trade !== undefined
? { trade: emptyToNull(dto.trade as string) }
: {}),
@@ -717,6 +737,8 @@ export class LeadsService {
lastName,
mobile: lead.mobile,
phone: lead.phone,
instagram: lead.instagram,
addresses: toJsonAddresses(asAddresses(lead.addresses)),
notes: [
lead.notes,
lead.city ? `شهر: ${lead.city}` : null,
@@ -727,6 +749,7 @@ export class LeadsService {
.filter(Boolean)
.join('\n'),
ownerId: lead.assigneeId ?? actor.userId,
createdAt: lead.createdAt,
},
});
createdPerson = true;
@@ -884,6 +907,11 @@ export class LeadsService {
phone?: string;
city?: string;
region?: string;
address?: string;
address2?: string;
homeAddress?: string;
instagram?: string;
registeredAt?: string;
trade?: string;
source?: string;
notes?: string;
@@ -910,6 +938,7 @@ export class LeadsService {
if (existingPerson) return 'duplicate';
try {
const registeredAt = row.registeredAt ? new Date(row.registeredAt) : null;
const lead = await this.prisma.lead.create({
data: {
organizationId,
@@ -919,11 +948,18 @@ export class LeadsService {
phone: emptyToNull(row.phone),
city: emptyToNull(row.city),
region: emptyToNull(row.region),
instagram: emptyToNull(row.instagram),
addresses: toJsonAddresses(
collectAddresses(row.address, row.address2, row.homeAddress),
),
trade: emptyToNull(row.trade),
source: emptyToNull(row.source) ?? 'ایمپورت اکسل',
notes: emptyToNull(row.notes),
stageId: defaultStageId,
createdById,
...(registeredAt && !Number.isNaN(registeredAt.getTime())
? { createdAt: registeredAt }
: {}),
},
});
await this.prisma.leadEvent.create({
@@ -990,6 +1026,8 @@ export class LeadsService {
phone: row.phone,
city: row.city,
region: row.region,
instagram: row.instagram,
addresses: asAddresses(row.addresses),
trade: row.trade,
source: row.source,
notes: row.notes,