Pull national id, address, city, and rasteh on import/refresh so person records match Tahesab, and surface them on the person form and profile. Co-authored-by: Cursor <cursoragent@cursor.com>
114 lines
3.4 KiB
TypeScript
114 lines
3.4 KiB
TypeScript
import { Prisma } from '@prisma/client';
|
|
import { parseBirthDate } from '../../common/excel';
|
|
|
|
export function pickBirthDate(row: Record<string, unknown>): Date | null {
|
|
const raw =
|
|
row.BDate ??
|
|
row.bDate ??
|
|
row.Tarikh_Tavalod ??
|
|
row.tarikh_tavalod ??
|
|
row.BirthDate;
|
|
if (raw == null) return null;
|
|
return parseBirthDate(String(raw));
|
|
}
|
|
|
|
function trimStr(raw: unknown): string | null {
|
|
if (raw == null) return null;
|
|
const s = String(raw).trim();
|
|
if (!s || s === '-1') return null;
|
|
return s;
|
|
}
|
|
|
|
/** کد ملی از پاسخ لیست مشتری تهحساب */
|
|
export function pickNationalId(row: Record<string, unknown>): string | null {
|
|
return (
|
|
trimStr(row.CodeMelli) ??
|
|
trimStr(row.CodeMeli) ??
|
|
trimStr(row.codeMeli) ??
|
|
trimStr(row.NationalId) ??
|
|
null
|
|
);
|
|
}
|
|
|
|
export function pickAddress(row: Record<string, unknown>): string | null {
|
|
return trimStr(row.Address) ?? trimStr(row.address) ?? null;
|
|
}
|
|
|
|
export function pickCity(row: Record<string, unknown>): string | null {
|
|
return trimStr(row.City) ?? trimStr(row.city) ?? trimStr(row.Shahr) ?? null;
|
|
}
|
|
|
|
/** رسته حساب در تهحساب (عدد یا رشته) */
|
|
export function pickRasteh(row: Record<string, unknown>): string | number | null {
|
|
const raw = row.Rasteh ?? row.rasteh ?? row.Raste;
|
|
if (raw == null || raw === '') return null;
|
|
if (typeof raw === 'number' && Number.isFinite(raw)) return raw;
|
|
const s = String(raw).trim();
|
|
if (!s || s === '-1') return null;
|
|
const n = Number(s);
|
|
return Number.isFinite(n) && String(n) === s ? n : s;
|
|
}
|
|
|
|
function asCustomFieldRecord(raw: unknown): Record<string, unknown> {
|
|
if (raw && typeof raw === 'object' && !Array.isArray(raw)) {
|
|
return { ...(raw as Record<string, unknown>) };
|
|
}
|
|
return {};
|
|
}
|
|
|
|
function asAddressList(raw: unknown): string[] {
|
|
if (!Array.isArray(raw)) return [];
|
|
return raw
|
|
.map((a) => (typeof a === 'string' ? a.trim() : ''))
|
|
.filter(Boolean);
|
|
}
|
|
|
|
/**
|
|
* فیلدهای پروفایل قابلدریافت از DoListMoshtari را روی شخص مینشاند.
|
|
* مقدار خالی تهحساب، دادهٔ موجود CRM را پاک نمیکند.
|
|
*/
|
|
export function tahesabProfilePatch(
|
|
row: Record<string, unknown>,
|
|
existing: {
|
|
birthDate: Date | null;
|
|
addresses: unknown;
|
|
customFields: unknown;
|
|
},
|
|
): Prisma.PersonUpdateInput {
|
|
const data: Prisma.PersonUpdateInput = {};
|
|
const birthDate = pickBirthDate(row);
|
|
if (!existing.birthDate && birthDate) data.birthDate = birthDate;
|
|
|
|
const address = pickAddress(row);
|
|
const city = pickCity(row);
|
|
if (address) {
|
|
const line = city ? `${address}، ${city}` : address;
|
|
data.addresses = [line] as Prisma.InputJsonValue;
|
|
} else if (city && asAddressList(existing.addresses).length === 0) {
|
|
data.addresses = [city] as Prisma.InputJsonValue;
|
|
}
|
|
|
|
const fields = asCustomFieldRecord(existing.customFields);
|
|
let fieldsChanged = false;
|
|
const nationalId = pickNationalId(row);
|
|
if (nationalId) {
|
|
fields.nationalId = nationalId;
|
|
fieldsChanged = true;
|
|
}
|
|
if (city) {
|
|
fields.city = city;
|
|
fieldsChanged = true;
|
|
}
|
|
if (address) {
|
|
fields.address = address;
|
|
fieldsChanged = true;
|
|
}
|
|
const rasteh = pickRasteh(row);
|
|
if (rasteh != null) {
|
|
fields.rasteh = rasteh;
|
|
fieldsChanged = true;
|
|
}
|
|
if (fieldsChanged) data.customFields = fields as Prisma.InputJsonValue;
|
|
return data;
|
|
}
|