@mj-biz-apps/sales-core-entities-server 6.4.0 → 6.6.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/DealEntityServer.d.ts +209 -13
- package/dist/DealEntityServer.d.ts.map +1 -1
- package/dist/DealEntityServer.js +657 -100
- package/dist/DealEntityServer.js.map +1 -1
- package/dist/DealLockOrderLineVeto.d.ts +44 -0
- package/dist/DealLockOrderLineVeto.d.ts.map +1 -0
- package/dist/DealLockOrderLineVeto.js +154 -0
- package/dist/DealLockOrderLineVeto.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
|
@@ -111,6 +111,38 @@ export declare class DealEntityServer extends DealEntity {
|
|
|
111
111
|
*/
|
|
112
112
|
Save(options?: EntitySaveOptions): Promise<boolean>;
|
|
113
113
|
private saveDeclared;
|
|
114
|
+
/**
|
|
115
|
+
* Is this save a status move into or out of a locking status, and therefore a close or a reopen?
|
|
116
|
+
*
|
|
117
|
+
* Null in every ordinary case. The cheap half comes first, so a save that does not touch the status
|
|
118
|
+
* costs no status lookups at all — this runs on every save, and most saves do not touch it.
|
|
119
|
+
*
|
|
120
|
+
* A DECLARED transition returns null: `Sales.CloseDeal` and `Sales.ReopenDeal` announce themselves
|
|
121
|
+
* before saving, and that IS the flow running. Without this term, the operation's own save would
|
|
122
|
+
* re-enter the flow it is already executing.
|
|
123
|
+
*
|
|
124
|
+
* Creation returns null too. A deal born closed has no transition to have run, and the opening
|
|
125
|
+
* default (`needsStatusDefault`) would otherwise read as one.
|
|
126
|
+
*/
|
|
127
|
+
private planStatusTransition;
|
|
128
|
+
/**
|
|
129
|
+
* Run the close or the reopen that the caller's status write asked for.
|
|
130
|
+
*
|
|
131
|
+
* WHY THE OPERATIONS AND NOT A COPY OF THEIR WORK. A close writes a stage event, creates a contract
|
|
132
|
+
* and two finance tasks for a won B2B deal, and voids the order for a lost one; a reopen undoes the
|
|
133
|
+
* stamps and returns the order. All of it already exists, is transactional, and is pinned by the
|
|
134
|
+
* `close-deal` checks. Reimplementing any of it here would be a second copy of the most
|
|
135
|
+
* consequential code in this app.
|
|
136
|
+
*
|
|
137
|
+
* IMPORTED LAZILY because `CloseDealOperation` imports this class, so a top-level import would be a
|
|
138
|
+
* cycle. The module system caches it, so this costs nothing after the first transition in a process.
|
|
139
|
+
*
|
|
140
|
+
* A LOST CLOSE STILL NEEDS ITS LOSS REASON, and a caller who set the status without one gets the
|
|
141
|
+
* operation's own refusal rather than a second, vaguer one from here. `LossReasonID` and `LossNotes`
|
|
142
|
+
* are columns on this deal, so an importer that sets them alongside the status has supplied
|
|
143
|
+
* everything the close needs -- which is the case #205 is about.
|
|
144
|
+
*/
|
|
145
|
+
private runStatusTransition;
|
|
114
146
|
/**
|
|
115
147
|
* The snapshot an ordinary stage move owes the append-only log, or null when the deal did not move.
|
|
116
148
|
*
|
|
@@ -527,14 +559,48 @@ export declare class DealEntityServer extends DealEntity {
|
|
|
527
559
|
private _declaredTransition;
|
|
528
560
|
private _lastStageEventID;
|
|
529
561
|
private _lockedAtSave;
|
|
562
|
+
/**
|
|
563
|
+
* The status the caller asked for, held while the field is reverted to its persisted value so the
|
|
564
|
+
* close lock can do its real job. `refuseSave` puts it back; see the note there for why.
|
|
565
|
+
*/
|
|
566
|
+
private _revertedStatusTarget;
|
|
530
567
|
/**
|
|
531
568
|
* The fields that stay editable on a locked deal — read from the SHARED rule, not redeclared.
|
|
532
569
|
*
|
|
533
|
-
* It
|
|
534
|
-
* second copy here would drift, and the drift would only ever surface as a user typing
|
|
535
|
-
* the server then refuses. See `close-lock.ts
|
|
570
|
+
* It lives in `@mj-biz-apps/sales-entities` so the Explorer Deal form and the workspace apply the
|
|
571
|
+
* same list. A second copy here would drift, and the drift would only ever surface as a user typing
|
|
572
|
+
* into a field the server then refuses. See `close-lock.ts`; CD14 pins it to real behaviour.
|
|
573
|
+
*
|
|
574
|
+
* A FUNCTION, not a constant, since golive#206's "Loss Notes (Lost deals only)": the answer depends
|
|
575
|
+
* on the deal's outcome, so the outcome has to reach it. It used to be a flat `ReadonlySet` held in
|
|
576
|
+
* a static, which is precisely how a caller ends up with the list and without the condition.
|
|
536
577
|
*/
|
|
537
|
-
private static
|
|
578
|
+
private static lockEditableFields;
|
|
579
|
+
/**
|
|
580
|
+
* The child collections that stay editable on a locked deal.
|
|
581
|
+
*
|
|
582
|
+
* Named here rather than in `sales-entities` because, unlike the field list, no other surface needs
|
|
583
|
+
* it yet: the grids decide their own New/delete affordances. If a form ever has to render this, it
|
|
584
|
+
* moves next to `DEAL_FIELDS_EDITABLE_WHILE_LOCKED` for the same reason that one moved.
|
|
585
|
+
*
|
|
586
|
+
* ── WHAT THIS DOES AND DOES NOT CATCH TODAY ─────────────────────────────────────────────────
|
|
587
|
+
*
|
|
588
|
+
* The Deal declares exactly TWO child collections (`metadata/entity-relationships`):
|
|
589
|
+
* `PaymentSchedule` and `Team`. Both are named here, so `dirtyCollections` below is currently
|
|
590
|
+
* always empty and this check refuses nothing in practice.
|
|
591
|
+
*
|
|
592
|
+
* That is deliberate and it is not the same as the check being pointless. It is an ALLOW-LIST, so
|
|
593
|
+
* a collection added later is refused without anyone remembering to add it — which is the whole
|
|
594
|
+
* property the previous "freeze every dirty companion" rule existed for. What it means is that
|
|
595
|
+
* the freeze direction has no companion to demonstrate it on right now, and no check can prove
|
|
596
|
+
* it until a third collection exists. Said out loud so nobody reads the guard as tested.
|
|
597
|
+
*
|
|
598
|
+
* ORDER LINES ARE NOT A COMPANION OF THE DEAL and never were — they belong to the ORDER, in the
|
|
599
|
+
* Orders app. An earlier version of this comment listed `Lines` alongside these two, which made
|
|
600
|
+
* this look like the thing freezing them. It is not: that is bizapps-orders#206, which adds a veto
|
|
601
|
+
* seam Sales registers into.
|
|
602
|
+
*/
|
|
603
|
+
private static readonly LOCK_EDITABLE_COMPANIONS;
|
|
538
604
|
/**
|
|
539
605
|
* Runs `body` with the close lock suppressed, and always restores it.
|
|
540
606
|
*
|
|
@@ -551,19 +617,59 @@ export declare class DealEntityServer extends DealEntity {
|
|
|
551
617
|
* the current value instead would make a deal impossible to close.
|
|
552
618
|
*/
|
|
553
619
|
/**
|
|
554
|
-
*
|
|
620
|
+
* Refuse this save, and leave the reason where the CALLER reads it.
|
|
555
621
|
*
|
|
556
|
-
*
|
|
622
|
+
* ── WHY LOGGING WAS NOT ENOUGH ────────────────────────────────────────────────
|
|
557
623
|
*
|
|
558
|
-
*
|
|
559
|
-
*
|
|
560
|
-
*
|
|
561
|
-
*
|
|
624
|
+
* Every refusal in `Save` used to be `LogError(...)` followed by `return false`, so a caller got a
|
|
625
|
+
* bare `false` and the reason went to the server log. golive#207 row 18 is explicit about what that
|
|
626
|
+
* message is for: row 17 is what the FORM shows a person, and row 18 is "what the save returns to
|
|
627
|
+
* whoever asked — the form, an import, an agent or a raw API call". Logged, it returned to nobody.
|
|
628
|
+
* The form looked fine only because `DealFormComponentExtended.Validate()` produces row 17 for
|
|
629
|
+
* itself; every other caller got silence.
|
|
562
630
|
*
|
|
563
|
-
*
|
|
564
|
-
*
|
|
631
|
+
* `RegisterResultHistoryEntry` is what core uses to record a failed write, and it is what puts the
|
|
632
|
+
* text on `LatestResult` — registered rather than assigned, because `LatestResult` returns null
|
|
633
|
+
* when the history is empty while TYPING itself non-null, which is how the same mistake reached
|
|
634
|
+
* production in orders' line delete.
|
|
565
635
|
*/
|
|
566
|
-
private
|
|
636
|
+
private refuseSave;
|
|
637
|
+
/**
|
|
638
|
+
* Report a failure that happened AFTER `super.Save()` already registered a SUCCESS result.
|
|
639
|
+
*
|
|
640
|
+
* ── WHY THIS IS NOT `refuseSave` ──────────────────────────────────────────────────────────────
|
|
641
|
+
*
|
|
642
|
+
* `Save()` returning false was, on these paths, the ONLY signal. `super.Save()` had already
|
|
643
|
+
* registered a success entry and `this.Load(this.ID)` does not clear the history -- core guards
|
|
644
|
+
* its `init()` with `if (!this.IsSaved)` and the deal is saved -- so a caller doing the obvious
|
|
645
|
+
* thing read:
|
|
646
|
+
*
|
|
647
|
+
* await deal.Save() -> false
|
|
648
|
+
* deal.LatestResult.Success -> TRUE
|
|
649
|
+
* deal.LatestResult.CompleteMessage -> undefined -> "Unknown error"
|
|
650
|
+
*
|
|
651
|
+
* A caller following exactly the pattern `deal-workspace.service.ts` uses was told the save
|
|
652
|
+
* succeeded. Worse than silent: the last thing on the history contradicted the return value.
|
|
653
|
+
*
|
|
654
|
+
* Two things differ from `refuseSave` and both matter:
|
|
655
|
+
*
|
|
656
|
+
* 1. IT DOES NOT PUT THE STATUS BACK. `refuseSave` restores the caller's target because nothing
|
|
657
|
+
* was written and a retry must still carry it. Here the row has already moved (or been rolled
|
|
658
|
+
* back) and `Load()` has resynced this object to it -- re-dirtying a field to a value the
|
|
659
|
+
* database just rejected would invite the same failure on the next save.
|
|
660
|
+
* 2. IT CARRIES THE OPERATION'S ISSUES. `CloseDealOperation` returns a structured `Issues` array
|
|
661
|
+
* which was being joined into a `LogError` and dropped. Those sentences are the only thing
|
|
662
|
+
* that says WHY the close refused, and they are what the user needs.
|
|
663
|
+
*
|
|
664
|
+
* AND WHY NOT A TRANSACTION, since "both or neither" is the obvious wish: the transition reaches
|
|
665
|
+
* bizapps-contracts and bizapps-orders through seams, so there is no single database to be atomic
|
|
666
|
+
* in; `CloseDealOperation` is a remote operation that owns its own scope and rollback; and it
|
|
667
|
+
* loads its own copy of this deal, which is exactly why it must run after the commit rather than
|
|
668
|
+
* inside it. Atomicity is not available here, so honesty about the partial apply is the fix.
|
|
669
|
+
* Narrowing the window belongs upstream, in the pre-flight that already refuses a lost close with
|
|
670
|
+
* no loss reason before a single row moves.
|
|
671
|
+
*/
|
|
672
|
+
private reportPostSaveFailure;
|
|
567
673
|
private checkCloseLock;
|
|
568
674
|
/**
|
|
569
675
|
* Whether a status carries `LocksDeal`.
|
|
@@ -572,6 +678,28 @@ export declare class DealEntityServer extends DealEntity {
|
|
|
572
678
|
* working. It is also why the lock is a property of the STATUS TYPE rather than of the stage.
|
|
573
679
|
*/
|
|
574
680
|
private statusLocksDeal;
|
|
681
|
+
/**
|
|
682
|
+
* The two flags the lock needs off a status row: does it lock the deal, and is it a LOSS.
|
|
683
|
+
*
|
|
684
|
+
* One read for both, because every caller that wants the second also wants the first, and two
|
|
685
|
+
* round trips for two columns of one row is a cost with nothing to show for it.
|
|
686
|
+
*
|
|
687
|
+
* ── THE TWO FAILURE DEFAULTS POINT THE SAME WAY ─────────────────────────────────────────────
|
|
688
|
+
*
|
|
689
|
+
* `LocksDeal` FAILS CLOSED: if the status cannot be read we cannot prove the deal is unlocked, and
|
|
690
|
+
* wrongly allowing an edit to a closed deal is the more expensive mistake. `IsLost` fails to
|
|
691
|
+
* `false` for the same reason read the other way round — `false` means Loss Notes is NOT carved
|
|
692
|
+
* out, so an unreadable status refuses more, never less.
|
|
693
|
+
*
|
|
694
|
+
* ── AND THAT IS WHY `Read` IS REPORTED SEPARATELY ──────────────────────────────────────
|
|
695
|
+
*
|
|
696
|
+
* "Refuses more, never less" holds for the LOCK and inverts for the TRIGGER. `planStatusTransition`
|
|
697
|
+
* reads `LocksDeal` to mean "the target status closes the deal", so the same fail-closed default
|
|
698
|
+
* turns a transient read failure into a REAL CLOSE — stage event, contract, finance tasks, a voided
|
|
699
|
+
* order — on a save that asked for none of it. One default cannot serve both readings, so callers
|
|
700
|
+
* are told whether the row was actually read and decide for themselves.
|
|
701
|
+
*/
|
|
702
|
+
private readStatusLockFlags;
|
|
575
703
|
/**
|
|
576
704
|
* Forces `Deal.CompanyID` to the pipeline's company, ignoring whatever the caller supplied.
|
|
577
705
|
*
|
|
@@ -633,6 +761,74 @@ export declare class DealEntityServer extends DealEntity {
|
|
|
633
761
|
* conditions mirror `stampOwnerFromTeam`'s guard exactly, which is what keeps them from disagreeing.
|
|
634
762
|
*/
|
|
635
763
|
private ownerStampEditRefusal;
|
|
764
|
+
/**
|
|
765
|
+
* Is the ROSTER driving this save, rather than a caller naming an owner out of thin air?
|
|
766
|
+
*
|
|
767
|
+
* Three places need this answer and they must never disagree, which is how a defect got in:
|
|
768
|
+
* `ownerStampEditRefusal` and `stampOwnerFromTeam` each spelled the condition out, `checkCloseLock`
|
|
769
|
+
* did not ask at all, and `DealEntity.SetOwner()` — which loads the roster and then assigns the
|
|
770
|
+
* stamp — was refused on a locked deal for editing a frozen field. golive#206 item 2 says
|
|
771
|
+
* reassigning a rep after close is record-keeping and must be allowed.
|
|
772
|
+
*
|
|
773
|
+
* `Team.Load()` is what makes it true, and `SetOwner` calls it first. A caller who hand-sets
|
|
774
|
+
* `OwnerEmployeeID` without touching the roster gets `false` here and the refusal it deserves.
|
|
775
|
+
* A caller who sets BOTH gets no advantage: `stampOwnerFromTeam` re-derives the stamp from the
|
|
776
|
+
* roster afterwards and overwrites whatever was supplied.
|
|
777
|
+
*/
|
|
778
|
+
private get RosterDrivesThisSave();
|
|
779
|
+
/**
|
|
780
|
+
* Gives a NEW deal an owner: the account's owner when it has one, otherwise whoever is creating it.
|
|
781
|
+
*
|
|
782
|
+
* ── WHY THIS EXISTS ─────────────────────────────────────────────────────────────────────────────
|
|
783
|
+
*
|
|
784
|
+
* Nothing populated `DealTeamMember`. Not the deal type, not the pipeline, not the account — a deal
|
|
785
|
+
* was born with an empty roster, `stampOwnerFromTeam()` had nothing to derive from, and the Overview
|
|
786
|
+
* then reported "No owner assigned." on a deal created seconds earlier. Worse, the form's team panel
|
|
787
|
+
* is gated on the deal being saved, so at the moment of creation there was no way to supply one
|
|
788
|
+
* either: every new deal was unowned and stayed that way until somebody noticed.
|
|
789
|
+
*
|
|
790
|
+
* ── WHY IT IS HERE AND NOT ON THE FORM ──────────────────────────────────────────────────────────
|
|
791
|
+
*
|
|
792
|
+
* `DealTeamMember` is the source of truth for who is on a deal and `Deal.OwnerEmployeeID` is a stamp
|
|
793
|
+
* derived from it, so a form that wrote either would be the second authority on membership. Putting
|
|
794
|
+
* it in `Save()` means an Action, an agent and the HubSpot importer all get the same default from
|
|
795
|
+
* the same code, which is the whole reason the owner rules live on the entity.
|
|
796
|
+
*
|
|
797
|
+
* ── THE ORDER OF PREFERENCE, AND WHY ────────────────────────────────────────────────────────────
|
|
798
|
+
*
|
|
799
|
+
* The ACCOUNT's owner first. A deal on an existing customer belongs to whoever runs that customer,
|
|
800
|
+
* and that is true whether a rep, an SE or an admin typed it in — so it beats the creator, who is
|
|
801
|
+
* merely the person at the keyboard. The creator is the fallback for a deal with no account yet, or
|
|
802
|
+
* an account nobody owns, where the person entering it is the best answer available.
|
|
803
|
+
*
|
|
804
|
+
* ── EVERY WAY THIS DECLINES TO ACT ──────────────────────────────────────────────────────────────
|
|
805
|
+
*
|
|
806
|
+
* It is a DEFAULT, not a rule, so each of these leaves the deal exactly as the caller left it:
|
|
807
|
+
*
|
|
808
|
+
* - not a create. An update never needs one; re-deriving on every save would silently re-own a
|
|
809
|
+
* deal whose owner had been deliberately removed.
|
|
810
|
+
* - the caller already supplied a roster. `RosterDrivesThisSave` is the same guard
|
|
811
|
+
* `stampOwnerFromTeam` uses, so an importer or an Action that sets its own team is never
|
|
812
|
+
* second-guessed — and the two cannot disagree about what "the caller is managing this" means.
|
|
813
|
+
* - nothing resolves. A context user with no linked Employee (`System` and `Anonymous` have none)
|
|
814
|
+
* and no account owner leaves the deal unowned, which is exactly what happens today. Refusing the
|
|
815
|
+
* save because we could not GUESS an owner would turn a working create into a broken one.
|
|
816
|
+
*
|
|
817
|
+
* A failure to READ the account is also not fatal, for the same reason: the deal still saves, just
|
|
818
|
+
* without a default. The one thing this must never do is cost someone a deal they were creating.
|
|
819
|
+
*/
|
|
820
|
+
private seedOwnerOnCreate;
|
|
821
|
+
/** The owner of the account this deal is for, or null when there is no account or no owner. */
|
|
822
|
+
private accountOwnerEmployeeID;
|
|
823
|
+
/**
|
|
824
|
+
* The Employee behind the user doing the creating, or null when they have none.
|
|
825
|
+
*
|
|
826
|
+
* READ AS A STRING despite `UserInfo.EmployeeID` being typed `number` in `@memberjunction/core`.
|
|
827
|
+
* The column is a `uniqueidentifier` — verified against the database, where this user's value is a
|
|
828
|
+
* GUID — so the declared type is stale. Trusting it would coerce a GUID through a numeric type and
|
|
829
|
+
* produce `NaN` or a truncated id, which would then be written into a foreign key.
|
|
830
|
+
*/
|
|
831
|
+
private creatorEmployeeID;
|
|
636
832
|
private stampOwnerFromTeam;
|
|
637
833
|
}
|
|
638
834
|
//# sourceMappingURL=DealEntityServer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DealEntityServer.d.ts","sourceRoot":"","sources":["../src/DealEntityServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"DealEntityServer.d.ts","sourceRoot":"","sources":["../src/DealEntityServer.ts"],"names":[],"mappings":"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"}
|