@campfire-interactive/master-data-client 5.29.0 → 5.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/types.d.ts CHANGED
@@ -239,10 +239,15 @@ export interface Quote {
239
239
  customerCompanyId: string;
240
240
  programId: string | null;
241
241
  /**
242
- * The OEM request this quote is one competing answer to — see {@link QuoteAsk}.
242
+ * The RFQ this quote is one competing answer to — see {@link Rfq}.
243
243
  * Null means it competes with nothing and is awardable on its own, which is a
244
244
  * legitimate state, not missing data.
245
245
  */
246
+ rfqId: string | null;
247
+ /**
248
+ * @deprecated The old spelling of {@link Quote.rfqId}, carrying the SAME
249
+ * value. Both are returned during the deprecation window; read `rfqId`.
250
+ */
246
251
  askId: string | null;
247
252
  /**
248
253
  * @deprecated A DERIVED MIRROR of the quote's lines — read `quoteLines.list()`
@@ -530,7 +535,156 @@ export interface SetEffectivePriceInput {
530
535
  /** Which app is writing — gated to 'omsf' | 'cpq' | 'admin' server-side. */
531
536
  callerRole: 'omsf' | 'cpq' | 'admin';
532
537
  }
538
+ /**
539
+ * Five states, where the old `QuoteAskStatus` had three.
540
+ *
541
+ * `won` and `lost` split the old `resolved`, which could not say whether
542
+ * anybody had actually won — a resolved ask with no `resolvedByQuoteId` was a
543
+ * legal row and both consumer UIs papered over it. On this table the split is
544
+ * enforced by a CHECK: `won` implies a winner and nothing else may carry one.
545
+ *
546
+ * `merged` is new. It names the absorbed half of a duplicate and implies
547
+ * `mergedIntoRfqId`, also by CHECK.
548
+ */
549
+ export type RfqStatus = 'open' | 'won' | 'lost' | 'cancelled' | 'merged';
550
+ /**
551
+ * What made this RFQ. Never null and with no `unknown` member, deliberately:
552
+ * "did a machine mint this?" has to stay answerable, and a nullable column
553
+ * would answer it with a shrug.
554
+ */
555
+ export type RfqSource = 'email' | 'manual' | 'cpq_fallback' | 'import';
556
+ export interface Rfq {
557
+ id: string;
558
+ tenantId: string;
559
+ /** `RFQ-YYYY-NNN`, minted server-side from an atomic per-(tenant, year)
560
+ * counter. Three digits is a MINIMUM width, not a maximum. */
561
+ rfqNumber: string;
562
+ customerCompanyId: string;
563
+ name: string | null;
564
+ /** The OEM's OWN number for this request — `GM-2026-4471`. Theirs, not ours,
565
+ * so it is free text and not unique. */
566
+ customerReference: string | null;
567
+ /** When the REQUEST arrived — not when it was recorded. A separate fact from
568
+ * `createdAt`, which is a job's timestamp once RFQs are minted
569
+ * automatically. This is the denominator of every response-time question. */
570
+ receivedAt: string | null;
571
+ dueDate: string | null;
572
+ /**
573
+ * WHAT THE CUSTOMER ASKED FOR — not what we offered.
574
+ *
575
+ * {@link Quote.sopDate} is our answer and may legitimately differ, because we
576
+ * cannot always hit their date. This holds what the request said, unchanged.
577
+ * Two answers to two different questions, which is why both exist; the
578
+ * `requested` prefix says whose claim this one is.
579
+ *
580
+ * `YYYY-MM-DD`, or null when the request never stated it.
581
+ */
582
+ requestedSopDate: string | null;
583
+ /**
584
+ * How much of {@link Rfq.requestedSopDate} to believe. An extraction that
585
+ * read "SOP mid-2027" says `year`; one that read `2027-04` says `month`.
586
+ * Rendering the bare date without consulting this invents a precision the
587
+ * customer never gave.
588
+ */
589
+ requestedSopPrecision: SopEopPrecision | null;
590
+ requestedEopDate: string | null;
591
+ /** See {@link Rfq.requestedSopPrecision}. */
592
+ requestedEopPrecision: SopEopPrecision | null;
593
+ source: RfqSource;
594
+ /** Opaque provenance for whatever minted this — an OMSF inbound-RFQ id, an
595
+ * import batch. Untyped and unvalidated on purpose: it crosses a service
596
+ * boundary. */
597
+ sourceRef: string | null;
598
+ status: RfqStatus;
599
+ /** Which quote won. Present exactly when `status` is `won`. A recorded fact
600
+ * — closing the siblings is a later phase. */
601
+ wonByQuoteId: string | null;
602
+ /** What absorbed this RFQ. Present exactly when `status` is `merged`. */
603
+ mergedIntoRfqId: string | null;
604
+ /** When the RFQ stopped being open. Set for every non-open status,
605
+ * `cancelled` and `merged` included; null while open. */
606
+ closedAt: string | null;
607
+ /** Reporting only — NEVER used to decide competition. An opportunity spans
608
+ * rounds; an RFQ is one round. */
609
+ opportunityId: string | null;
610
+ createdBy: string;
611
+ updatedBy: string;
612
+ createdAt: string;
613
+ updatedAt: string;
614
+ }
615
+ export interface RfqSummary extends Rfq {
616
+ /** How many quotes compete in this RFQ. Deliberately not a value aggregate. */
617
+ quoteCount: number;
618
+ }
619
+ /**
620
+ * A RANGE across the RFQ's quotes — deliberately not a total.
621
+ *
622
+ * The quotes are ALTERNATIVES: three of four lose on every multi-scenario RFQ
623
+ * by construction, so adding them multiply-counts the same business.
624
+ */
625
+ export interface RfqRange {
626
+ quoteCount: number;
627
+ minValue: number | null;
628
+ maxValue: number | null;
629
+ minBlendedMarginPct: number | null;
630
+ maxBlendedMarginPct: number | null;
631
+ }
632
+ export interface RfqCompetingQuote {
633
+ id: string;
634
+ quoteNumber: string;
635
+ name: string | null;
636
+ status: QuoteStatus;
637
+ lines: QuoteLine[];
638
+ rollUp: QuoteLineRollUp;
639
+ }
640
+ export interface RfqDetail extends Rfq {
641
+ quotes: RfqCompetingQuote[];
642
+ range: RfqRange;
643
+ }
644
+ export interface CreateRfqInput {
645
+ customerCompanyId: string;
646
+ name?: string | null;
647
+ customerReference?: string | null;
648
+ /** When the request arrived. Send it when you know it — see {@link Rfq}. */
649
+ receivedAt?: string | null;
650
+ dueDate?: string | null;
651
+ /** What the customer asked for, not what you will offer — see {@link Rfq}. */
652
+ requestedSopDate?: string | null;
653
+ /** Send this whenever the source was coarser than a day. */
654
+ requestedSopPrecision?: SopEopPrecision | null;
655
+ requestedEopDate?: string | null;
656
+ requestedEopPrecision?: SopEopPrecision | null;
657
+ /** Defaults to `manual`. */
658
+ source?: RfqSource;
659
+ sourceRef?: string | null;
660
+ opportunityId?: string | null;
661
+ }
662
+ export interface UpdateRfqInput {
663
+ name?: string | null;
664
+ customerReference?: string | null;
665
+ receivedAt?: string | null;
666
+ dueDate?: string | null;
667
+ requestedSopDate?: string | null;
668
+ requestedSopPrecision?: SopEopPrecision | null;
669
+ requestedEopDate?: string | null;
670
+ requestedEopPrecision?: SopEopPrecision | null;
671
+ sourceRef?: string | null;
672
+ opportunityId?: string | null;
673
+ status?: RfqStatus;
674
+ /** Required when `status` is `won`; must be one of this RFQ's own quotes. */
675
+ wonByQuoteId?: string | null;
676
+ /** Required when `status` is `merged`. Prefer `rfqs.merge(id, target)`. */
677
+ mergedIntoRfqId?: string | null;
678
+ }
679
+ export interface ListRfqsOptions {
680
+ status?: RfqStatus;
681
+ source?: RfqSource;
682
+ customerCompanyId?: string;
683
+ opportunityId?: string;
684
+ }
685
+ /** @deprecated Use {@link RfqStatus}. `resolved` splits into `won` / `lost`. */
533
686
  export type QuoteAskStatus = 'open' | 'resolved' | 'cancelled';
687
+ /** @deprecated Use {@link Rfq}. Same row, same id. */
534
688
  export interface QuoteAsk {
535
689
  id: string;
536
690
  tenantId: string;
@@ -551,6 +705,7 @@ export interface QuoteAsk {
551
705
  createdAt: string;
552
706
  updatedAt: string;
553
707
  }
708
+ /** @deprecated Use {@link RfqSummary}. */
554
709
  export interface QuoteAskSummary extends QuoteAsk {
555
710
  /** How many quotes compete in this ask. Deliberately not a value aggregate. */
556
711
  quoteCount: number;
@@ -561,6 +716,7 @@ export interface QuoteAskSummary extends QuoteAsk {
561
716
  * The quotes are ALTERNATIVES: three of four lose on every multi-scenario RFQ by
562
717
  * construction, so adding them multiply-counts the same business.
563
718
  */
719
+ /** @deprecated Use {@link RfqRange}. Identical shape. */
564
720
  export interface QuoteAskRange {
565
721
  quoteCount: number;
566
722
  minValue: number | null;
@@ -568,6 +724,7 @@ export interface QuoteAskRange {
568
724
  minBlendedMarginPct: number | null;
569
725
  maxBlendedMarginPct: number | null;
570
726
  }
727
+ /** @deprecated Use {@link RfqCompetingQuote}. */
571
728
  export interface QuoteAskCompetingQuote {
572
729
  id: string;
573
730
  quoteNumber: string;
@@ -576,16 +733,19 @@ export interface QuoteAskCompetingQuote {
576
733
  lines: QuoteLine[];
577
734
  rollUp: QuoteLineRollUp;
578
735
  }
736
+ /** @deprecated Use {@link RfqDetail}. */
579
737
  export interface QuoteAskDetail extends QuoteAsk {
580
738
  quotes: QuoteAskCompetingQuote[];
581
739
  range: QuoteAskRange;
582
740
  }
741
+ /** @deprecated Use {@link CreateRfqInput}. Creates with `source: 'manual'`. */
583
742
  export interface CreateQuoteAskInput {
584
743
  customerCompanyId: string;
585
744
  name?: string | null;
586
745
  opportunityId?: string | null;
587
746
  dueDate?: string | null;
588
747
  }
748
+ /** @deprecated Use {@link UpdateRfqInput}. */
589
749
  export interface UpdateQuoteAskInput {
590
750
  name?: string | null;
591
751
  dueDate?: string | null;
@@ -594,6 +754,7 @@ export interface UpdateQuoteAskInput {
594
754
  /** Required when resolving; must be one of this ask's own quotes. */
595
755
  resolvedByQuoteId?: string | null;
596
756
  }
757
+ /** @deprecated Use {@link ListRfqsOptions}. */
597
758
  export interface ListQuoteAsksOptions {
598
759
  status?: QuoteAskStatus;
599
760
  customerCompanyId?: string;
@@ -865,9 +1026,12 @@ export interface CreateQuoteInput {
865
1026
  name?: string;
866
1027
  customerCompanyId: string;
867
1028
  programId?: string;
868
- /** Join the quote to an OEM request ({@link QuoteAsk}). Optional — a quote with
869
- * no ask competes with nothing and is awardable on its own. Validated to exist
1029
+ /** Join the quote to an RFQ ({@link Rfq}). Optional — a quote with no RFQ
1030
+ * competes with nothing and is awardable on its own. Validated to exist
870
1031
  * in-tenant AND to belong to the same customer as the quote. */
1032
+ rfqId?: string | null;
1033
+ /** @deprecated The old spelling of `rfqId`. Still accepted; when both are
1034
+ * sent, `rfqId` wins. */
871
1035
  askId?: string | null;
872
1036
  partId?: string;
873
1037
  /** Historical/parent quote this one was copied from. Validated to exist
@@ -933,8 +1097,11 @@ export interface UpdateQuoteInput {
933
1097
  quoteNumber?: string;
934
1098
  name?: string | null;
935
1099
  programId?: string | null;
936
- /** Join the quote to an OEM request ({@link QuoteAsk}), or `null` to detach it
937
- * (it then competes with nothing). Validated to match the quote's customer. */
1100
+ /** Join the quote to an RFQ ({@link Rfq}), or `null` to detach it (it then
1101
+ * competes with nothing). Validated to match the quote's customer. */
1102
+ rfqId?: string | null;
1103
+ /** @deprecated The old spelling of `rfqId`. Still accepted; when both are
1104
+ * sent, `rfqId` wins. Detaching through either clears both. */
938
1105
  askId?: string | null;
939
1106
  partId?: string | null;
940
1107
  /** Set to a quote id to record provenance, or `null` to clear it. */