Adding registration date and multiple addresses for contacts and leads.
This commit is contained in:
@@ -4,9 +4,13 @@ import { PERSON_MOOD_LABELS, PERSON_MOODS } from '@mento/shared';
|
||||
import { PrismaService } from '../prisma/prisma.service';
|
||||
import type { Actor } from '../common/record-scope';
|
||||
import { ownerWhere, resolveOwnerId } from '../common/record-scope';
|
||||
import {
|
||||
collectAddresses,
|
||||
} from '../common/custom-fields';
|
||||
import {
|
||||
formatJalaliDate,
|
||||
parseExcelMapping,
|
||||
parseJalaliDateTime,
|
||||
previewExcel,
|
||||
readMappedRows,
|
||||
writeXlsx,
|
||||
@@ -73,8 +77,17 @@ const PERSON_ALIASES: Record<string, string> = {
|
||||
گروهمشتری: 'group',
|
||||
آدرس: 'address',
|
||||
آدرس1: 'address',
|
||||
آدرساصلی: 'address',
|
||||
address: 'address',
|
||||
address2: 'address2',
|
||||
آدرس۲: 'address2',
|
||||
آدرس2: 'address2',
|
||||
آدرس_1: 'address2',
|
||||
آدرسدوم: 'address2',
|
||||
آدرسمنزل: 'homeAddress',
|
||||
آدرمنزل: 'homeAddress',
|
||||
آدرسخانه: 'homeAddress',
|
||||
homeaddress: 'homeAddress',
|
||||
کدپستی: 'postalCode',
|
||||
کدپستی1: 'postalCode',
|
||||
استانفیلدپیشفرض: 'province',
|
||||
@@ -93,8 +106,13 @@ const PERSON_ALIASES: Record<string, string> = {
|
||||
type: '_type',
|
||||
_type: '_type',
|
||||
آیدیاینستاگرام: 'instagram',
|
||||
اینستاگرام: 'instagram',
|
||||
پیجاینستاگرام: 'instagram',
|
||||
instagram: 'instagram',
|
||||
معرف: 'referrer',
|
||||
سایتهایمشتری: 'website',
|
||||
تاریخثبت: 'registeredAt',
|
||||
registeredat: 'registeredAt',
|
||||
شمارهفکس: 'fax',
|
||||
تلفن2: 'phone2',
|
||||
تلفنهایدیگرمشتری: 'otherPhones',
|
||||
@@ -128,6 +146,11 @@ const PERSON_FIELDS = [
|
||||
{ key: 'position', label: 'سمت' },
|
||||
{ key: 'companyName', label: 'شرکت' },
|
||||
{ key: 'ownerName', label: 'کارشناس فروش' },
|
||||
{ key: 'address', label: 'آدرس' },
|
||||
{ key: 'address2', label: 'آدرس ۲' },
|
||||
{ key: 'homeAddress', label: 'آدرس منزل' },
|
||||
{ key: 'instagram', label: 'اینستاگرام' },
|
||||
{ key: 'registeredAt', label: 'تاریخ ثبت' },
|
||||
{ key: 'notes', label: 'یادداشت' },
|
||||
{ key: 'mood', label: 'وضعیت مشتری' },
|
||||
];
|
||||
@@ -218,6 +241,7 @@ const CUSTOM_KEYS = [
|
||||
'province',
|
||||
'city',
|
||||
'address',
|
||||
'address2',
|
||||
'nationalId',
|
||||
'birthDate',
|
||||
'group',
|
||||
@@ -279,20 +303,20 @@ export class ContactsExcelService {
|
||||
birthDate: extra.birthDate ?? '',
|
||||
mood: extra.group || PERSON_MOOD_LABELS[p.mood || 'newcomer'],
|
||||
otherPhones: extra.otherPhones ?? '',
|
||||
address: extra.address ?? '',
|
||||
website: extra.website ?? '',
|
||||
address: p.addresses[0] ?? extra.address ?? '',
|
||||
website: p.website ?? extra.website ?? '',
|
||||
otherEmails: extra.otherEmails ?? '',
|
||||
position2: p.position ?? extra.position ?? '',
|
||||
city2: extra.city ?? '',
|
||||
code2: extra.customerCode ?? '',
|
||||
group2: extra.group ?? '',
|
||||
address2: extra.address ?? '',
|
||||
address2: p.addresses[1] ?? extra.address ?? '',
|
||||
phone2: extra.phone2 ?? p.phone ?? '',
|
||||
postalCode2: extra.postalCode ?? '',
|
||||
referrer: extra.referrer ?? '',
|
||||
homeAddress: extra.homeAddress ?? '',
|
||||
referrer: extra.referrer ?? p.referrer ?? '',
|
||||
homeAddress: p.addresses[2] ?? extra.homeAddress ?? '',
|
||||
birthDate2: extra.birthDate ?? '',
|
||||
instagram: extra.instagram ?? '',
|
||||
instagram: p.instagram ?? extra.instagram ?? '',
|
||||
group: extra.group ?? '',
|
||||
colleagueContact: extra.colleagueContact ?? '',
|
||||
previousCompany: extra.previousCompany ?? '',
|
||||
@@ -388,10 +412,33 @@ export class ContactsExcelService {
|
||||
|
||||
const customFields: Record<string, string> = {};
|
||||
for (const key of CUSTOM_KEYS) {
|
||||
if (
|
||||
key === 'address' ||
|
||||
key === 'address2' ||
|
||||
key === 'homeAddress' ||
|
||||
key === 'instagram' ||
|
||||
key === 'website'
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
const value = row[key]?.trim();
|
||||
if (value) customFields[key] = value;
|
||||
}
|
||||
|
||||
const addresses = collectAddresses(
|
||||
row.address,
|
||||
row.address2,
|
||||
row.homeAddress,
|
||||
);
|
||||
const registeredAt =
|
||||
parseJalaliDateTime(row.registeredAt) ??
|
||||
(() => {
|
||||
const raw = row.registeredAt?.trim();
|
||||
if (!raw) return null;
|
||||
const d = new Date(raw);
|
||||
return Number.isNaN(d.getTime()) ? null : d;
|
||||
})();
|
||||
|
||||
try {
|
||||
await this.people.create(actor, {
|
||||
firstName: names.firstName,
|
||||
@@ -400,11 +447,15 @@ export class ContactsExcelService {
|
||||
phone: row.phone || row.phone2 || undefined,
|
||||
mobile: row.mobile || undefined,
|
||||
position: row.position || undefined,
|
||||
website: row.website || undefined,
|
||||
instagram: row.instagram || undefined,
|
||||
addresses,
|
||||
notes: row.notes || undefined,
|
||||
mood: parseMood(row.mood) ?? parseMood(row.group),
|
||||
companyId,
|
||||
ownerId: resolveOwnerId(actor, ownerId ?? null),
|
||||
customFields,
|
||||
registeredAt: registeredAt?.toISOString() ?? null,
|
||||
});
|
||||
result.created += 1;
|
||||
if (ownerMissing) {
|
||||
|
||||
Reference in New Issue
Block a user