all the haul
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
import {
|
||||
Opportunity as CwOpportunity,
|
||||
OpportunityMember as CwOpportunityMember,
|
||||
} from "../../generated/prisma/client";
|
||||
import { OpportunityInterest } from "../../../api/generated/prisma/client";
|
||||
import { Translation, skipRow } from "./types";
|
||||
import { TranslationContext } from "./context";
|
||||
|
||||
type ApiOpportunityRecord = {
|
||||
id: number;
|
||||
name: string;
|
||||
notes?: string | null;
|
||||
oppNarrative?: string | null;
|
||||
typeId: number;
|
||||
stageCwId?: number | null;
|
||||
stageId?: number | null;
|
||||
statusId?: number | null;
|
||||
taxCodeId?: number | null;
|
||||
interest?: OpportunityInterest | null;
|
||||
probability: number;
|
||||
source?: string | null;
|
||||
primarySalesRepId?: string | null;
|
||||
secondarySalesRepId?: string | null;
|
||||
companyId?: number | null;
|
||||
contactId?: number | null;
|
||||
siteId?: number | null;
|
||||
customerPO?: string | null;
|
||||
expectedCloseDate?: Date | null;
|
||||
pipelineChangeDate?: Date | null;
|
||||
dateBecameLead?: Date | null;
|
||||
closedDate?: Date | null;
|
||||
closedFlag: boolean;
|
||||
closedById?: string | null;
|
||||
updatedBy: string;
|
||||
eneteredBy: string;
|
||||
createdAt: Date;
|
||||
updatedAt: Date;
|
||||
};
|
||||
|
||||
type CwOpportunityWithMembers = CwOpportunity & {
|
||||
members?: Pick<
|
||||
CwOpportunityMember,
|
||||
"memberRecId" | "primarySalesFlag" | "secondarySalesFlag"
|
||||
>[];
|
||||
};
|
||||
|
||||
const toInterest = (value: number | null): OpportunityInterest | null => {
|
||||
if (value == null) return null;
|
||||
if (value <= 1) return OpportunityInterest.COLD;
|
||||
if (value === 2) return OpportunityInterest.WARM;
|
||||
return OpportunityInterest.HOT;
|
||||
};
|
||||
|
||||
export const opportunityTranslation: Translation<
|
||||
CwOpportunityWithMembers,
|
||||
ApiOpportunityRecord,
|
||||
TranslationContext
|
||||
> = {
|
||||
values: [
|
||||
{ from: "opportunityRecId", to: "id" },
|
||||
{ from: "opportunityName", to: "name" },
|
||||
{ from: "notes", to: "notes" },
|
||||
{
|
||||
from: "opportunityRecId",
|
||||
to: "oppNarrative",
|
||||
process: (value, context) => {
|
||||
if (value == null) return null;
|
||||
return context.opportunityNarrativeByOpportunityId.get(value) ?? null;
|
||||
},
|
||||
},
|
||||
{
|
||||
from: "soTypeRecId",
|
||||
to: "typeId",
|
||||
process: (value, context) => {
|
||||
if (value != null) return value;
|
||||
if (context.defaultOpportunityTypeId != null)
|
||||
return context.defaultOpportunityTypeId;
|
||||
skipRow("Opportunity missing type and no default type available");
|
||||
},
|
||||
},
|
||||
{ from: "soPipelineRecId", to: "stageId" },
|
||||
{ from: "soOppStatusRecId", to: "statusId" },
|
||||
{ from: "taxCodeRecId", to: "taxCodeId" },
|
||||
{
|
||||
from: "soInterestRecId",
|
||||
to: "interest",
|
||||
process: toInterest,
|
||||
},
|
||||
{
|
||||
from: "probabilityToClose",
|
||||
to: "probability",
|
||||
process: (value) => (value == null ? 0 : value),
|
||||
},
|
||||
{ from: "source", to: "source" },
|
||||
{
|
||||
from: "opportunityRecId",
|
||||
to: "primarySalesRepId",
|
||||
process: (_value, context, row) => {
|
||||
const primary = row.members?.find((member) => member.primarySalesFlag);
|
||||
if (!primary) return null;
|
||||
return (
|
||||
context.userIdentifiersByMemberRecId.get(primary.memberRecId) ?? null
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
from: "opportunityRecId",
|
||||
to: "secondarySalesRepId",
|
||||
process: (_value, context, row) => {
|
||||
const secondary = row.members?.find(
|
||||
(member) => member.secondarySalesFlag
|
||||
);
|
||||
if (!secondary) return null;
|
||||
return (
|
||||
context.userIdentifiersByMemberRecId.get(secondary.memberRecId) ??
|
||||
null
|
||||
);
|
||||
},
|
||||
},
|
||||
{ from: "companyRecId", to: "companyId" },
|
||||
{ from: "contactRecId", to: "contactId" },
|
||||
{ from: "companyAddressRecId", to: "siteId" },
|
||||
{ from: "poNumber", to: "customerPO" },
|
||||
{ from: "dateCloseExpected", to: "expectedCloseDate" },
|
||||
{ from: "datePipelineChange", to: "pipelineChangeDate" },
|
||||
{ from: "dateBecameLead", to: "dateBecameLead" },
|
||||
{ from: "dateClosed", to: "closedDate" },
|
||||
{ from: "oldCloseFlag", to: "closedFlag" },
|
||||
{ from: "closedBy", to: "closedById" },
|
||||
{
|
||||
from: "updatedBy",
|
||||
to: "updatedBy",
|
||||
process: (value) => (value ? value : "system"),
|
||||
},
|
||||
{
|
||||
from: "enteredBy",
|
||||
to: "eneteredBy",
|
||||
process: (value) => (value ? value : "system"),
|
||||
},
|
||||
{ from: "dateBecameLeadUtc", to: "createdAt" },
|
||||
{ from: "lastUpdatedUtc", to: "updatedAt" },
|
||||
],
|
||||
};
|
||||
Reference in New Issue
Block a user