@mj-biz-apps/sales-core-entities-server 6.3.3 → 6.5.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 +158 -14
- package/dist/DealEntityServer.d.ts.map +1 -1
- package/dist/DealEntityServer.js +500 -102
- package/dist/DealEntityServer.js.map +1 -1
- package/package.json +4 -4
|
@@ -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
|
*
|
|
@@ -623,7 +751,8 @@ export declare class DealEntityServer extends DealEntity {
|
|
|
623
751
|
*
|
|
624
752
|
* Because the caller believed they were setting the owner. Correcting them in silence produces the
|
|
625
753
|
* same wrong outcome as before — the owner is not who they said — with no way to notice. The
|
|
626
|
-
* message names
|
|
754
|
+
* message names the Internal team panel, which is where a person actually changes the owner;
|
|
755
|
+
* `DealEntity.SetOwner` is the same operation in code, and the wording is the tester's (golive#207).
|
|
627
756
|
*
|
|
628
757
|
* ── WHY `SetOwner` IS NOT CAUGHT BY THIS ────────────────────────────────────────────────────
|
|
629
758
|
*
|
|
@@ -632,6 +761,21 @@ export declare class DealEntityServer extends DealEntity {
|
|
|
632
761
|
* conditions mirror `stampOwnerFromTeam`'s guard exactly, which is what keeps them from disagreeing.
|
|
633
762
|
*/
|
|
634
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();
|
|
635
779
|
private stampOwnerFromTeam;
|
|
636
780
|
}
|
|
637
781
|
//# 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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"}
|
package/dist/DealEntityServer.js
CHANGED
|
@@ -50,14 +50,14 @@ var DealEntityServer_1;
|
|
|
50
50
|
*
|
|
51
51
|
* @module @mj-biz-apps/sales-core-entities-server
|
|
52
52
|
*/
|
|
53
|
-
import { BaseEntity, LogError, } from '@memberjunction/core';
|
|
53
|
+
import { BaseEntity, BaseEntityResult, LogError, } from '@memberjunction/core';
|
|
54
54
|
import { createHash } from 'node:crypto';
|
|
55
55
|
import { RegisterClass } from '@memberjunction/global';
|
|
56
56
|
// ORDERS' OWN RULE, imported rather than restated. `CanTransition` is the same function
|
|
57
57
|
// `OrderEntityServer.passesStatusTransition()` consults, so a refusal here and a refusal there cannot
|
|
58
58
|
// disagree — and the reason string the warning carries is orders' wording, not this app's guess at it.
|
|
59
59
|
import { CanTransition } from '@mj-biz-apps/orders-entities';
|
|
60
|
-
import {
|
|
60
|
+
import { DealFieldsEditableWhileLocked, DealFieldLabel, DealEntity, JoinLabels, } from '@mj-biz-apps/sales-entities';
|
|
61
61
|
import { SALES_SCHEMA, getNextDealNumber } from './SequenceService.js';
|
|
62
62
|
const DEAL_ENTITY = 'MJ_BizApps_Sales: Deals';
|
|
63
63
|
const PIPELINE_ENTITY = 'MJ_BizApps_Sales: Pipelines';
|
|
@@ -104,6 +104,11 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
104
104
|
this._declaredTransition = null;
|
|
105
105
|
this._lastStageEventID = null;
|
|
106
106
|
this._lockedAtSave = false;
|
|
107
|
+
/**
|
|
108
|
+
* The status the caller asked for, held while the field is reverted to its persisted value so the
|
|
109
|
+
* close lock can do its real job. `refuseSave` puts it back; see the note there for why.
|
|
110
|
+
*/
|
|
111
|
+
this._revertedStatusTarget = null;
|
|
107
112
|
}
|
|
108
113
|
static { DealEntityServer_1 = this; }
|
|
109
114
|
/**
|
|
@@ -182,6 +187,7 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
182
187
|
}
|
|
183
188
|
finally {
|
|
184
189
|
this._declaredTransition = null;
|
|
190
|
+
this._revertedStatusTarget = null;
|
|
185
191
|
}
|
|
186
192
|
}
|
|
187
193
|
async saveDeclared(options) {
|
|
@@ -191,6 +197,79 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
191
197
|
this._orderJustProvisioned = false;
|
|
192
198
|
this._lockedAtSave = false;
|
|
193
199
|
this._lastStageEventID = null;
|
|
200
|
+
/**
|
|
201
|
+
* THE STATUS FIELD DRIVES THE CLOSE AND THE REOPEN (bc-aidp-next-golive#205).
|
|
202
|
+
*
|
|
203
|
+
* "The deal entity server should run the existing close and reopen flows when a save moves the
|
|
204
|
+
* status into or out of a locking status."
|
|
205
|
+
*
|
|
206
|
+
* ── IT RUNS BEFORE THE CLOSE LOCK, AND THAT ORDERING IS THE WHOLE THING ─────────────────
|
|
207
|
+
*
|
|
208
|
+
* `close-deal.CD27` measured what happens otherwise. A reopen is a status write on a deal that
|
|
209
|
+
* IS locked, so the lock below sees `DealStatusTypeID` dirty, finds it outside the
|
|
210
|
+
* editable-while-locked set, and refuses — before anything has had the chance to notice the
|
|
211
|
+
* write was a reopen. The close half worked and the reopen half could not, which is precisely
|
|
212
|
+
* the defect golive#205 reported, reintroduced one layer up.
|
|
213
|
+
*
|
|
214
|
+
* ── WHY THE STATUS IS PUT BACK ─────────────────────────────────────────────────────────
|
|
215
|
+
*
|
|
216
|
+
* `Sales.CloseDeal` loads its OWN copy of this deal and saves it. If this save also wrote the
|
|
217
|
+
* status, the two would race over one row and whichever landed second would win. So the field is
|
|
218
|
+
* reverted to what is on disk, the ordinary save below persists every OTHER edit the caller
|
|
219
|
+
* made, and the flow then runs against the committed row. A caller who set the status and three
|
|
220
|
+
* other fields gets all four, in an order that cannot lose any of them.
|
|
221
|
+
*
|
|
222
|
+
* Reverting is also what leaves the close lock doing its real job instead of being bypassed: by
|
|
223
|
+
* the time it runs the status is clean, so a locked deal still refuses every frozen field.
|
|
224
|
+
* DealStatusTypeID stays OUT of `DEAL_FIELDS_EDITABLE_WHILE_LOCKED` for the same reason — the
|
|
225
|
+
* field is reachable through the flow, never by writing it.
|
|
226
|
+
*/
|
|
227
|
+
const transition = await this.planStatusTransition();
|
|
228
|
+
/**
|
|
229
|
+
* REFUSED BEFORE THE REVERT, and the order is the whole of why the retry works.
|
|
230
|
+
*
|
|
231
|
+
* The revert below exists so the close lock and `super.Save()` do not write a status the
|
|
232
|
+
* transition is about to move. On this path nothing downstream runs at all, so reverting would
|
|
233
|
+
* serve nothing — and it would cost the one thing this message asks for. A reverted field is
|
|
234
|
+
* CLEAN, so a caller who reads "try again" and re-saves the same object gets
|
|
235
|
+
* `planStatusTransition() === null` on `!field?.Dirty`: no close, the other edits commit, and
|
|
236
|
+
* `Save()` returns true. Leaving it dirty means the retry reads the status again, which is
|
|
237
|
+
* exactly what a transient failure needs.
|
|
238
|
+
*/
|
|
239
|
+
if (transition?.Kind === 'Unreadable') {
|
|
240
|
+
return this.refuseSave('The deal status could not be read, so this save cannot tell whether it closes the ' +
|
|
241
|
+
'deal. Nothing was changed. Try again, and if it persists check that the Deal ' +
|
|
242
|
+
'Status Types list is readable.');
|
|
243
|
+
}
|
|
244
|
+
if (transition) {
|
|
245
|
+
this._revertedStatusTarget = transition.TargetStatusID;
|
|
246
|
+
this.Set('DealStatusTypeID', transition.PriorStatusID);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* A CLOSE THAT CANNOT RUN IS REFUSED BEFORE ANYTHING IS WRITTEN.
|
|
250
|
+
*
|
|
251
|
+
* The transition runs AFTER `super.Save()`, against the committed row, because it loads its own
|
|
252
|
+
* copy of this deal and the two would otherwise race. That ordering has a cost: a caller who
|
|
253
|
+
* sets the status AND three other fields, and whose close then fails, has those three fields on
|
|
254
|
+
* disk and an open deal. The save reports false, so nothing is silent, but it is a partial
|
|
255
|
+
* apply.
|
|
256
|
+
*
|
|
257
|
+
* Closing as lost with no loss reason is the one case worth spending a check to avoid, because
|
|
258
|
+
* it is not an edge: `LossReasonID` is a column on this deal, a form or an importer can set the
|
|
259
|
+
* status without it, and the close then refuses every time — deterministically, for a reason
|
|
260
|
+
* known right here, before a single row moves. Catching it up front turns a partial apply into
|
|
261
|
+
* a clean refusal for the case most likely to hit one.
|
|
262
|
+
*
|
|
263
|
+
* THE PREDICATE IS THE OPERATION'S OWN, and deliberately no wider: `CloseDealOperation.validate`
|
|
264
|
+
* refuses `IsLost` with no `LossReasonID`, and this asks the same question of the same two
|
|
265
|
+
* values. It does NOT duplicate the rest of that validation — whether the chosen reason demands
|
|
266
|
+
* notes needs the loss-reason row, which is a read this path should not be making, and that one
|
|
267
|
+
* stays downstream with the others.
|
|
268
|
+
*/
|
|
269
|
+
if (transition?.Kind === 'Close' && transition.TargetIsLost && !this.LossReasonID) {
|
|
270
|
+
return this.refuseSave('A loss reason is required to close a deal as lost. Set LossReasonID alongside the ' +
|
|
271
|
+
'status, or close the deal through Sales.CloseDeal.');
|
|
272
|
+
}
|
|
194
273
|
/**
|
|
195
274
|
* THE CLOSE LOCK (L-17, master plan §7.3) — enforced HERE and nowhere else.
|
|
196
275
|
*
|
|
@@ -208,39 +287,9 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
208
287
|
if (this.IsSaved && !this._reopenInProgress) {
|
|
209
288
|
const refusal = await this.checkCloseLock();
|
|
210
289
|
if (refusal) {
|
|
211
|
-
|
|
212
|
-
return false;
|
|
290
|
+
return this.refuseSave(refusal);
|
|
213
291
|
}
|
|
214
292
|
}
|
|
215
|
-
/**
|
|
216
|
-
* A BARE STATUS WRITE MUST NOT CLOSE A DEAL (bc-aidp-next-golive#205).
|
|
217
|
-
*
|
|
218
|
-
* The close lock above reads the PERSISTED status, so it cannot see this: moving Open -> Won is
|
|
219
|
-
* a save on an unlocked deal and passed straight through. The deal came out locked, and none of
|
|
220
|
-
* the close ran — no stage event, no contract, no finance tasks, and for a Lost deal no loss
|
|
221
|
-
* reason and an order still live. Worse, the lock then refused `DealStatusTypeID` on every later
|
|
222
|
-
* save, so the deal could not be reopened either. A field edit on a form had produced a state
|
|
223
|
-
* no operation could have produced and none could undo.
|
|
224
|
-
*
|
|
225
|
-
* WHAT SEPARATES THIS FROM A REAL CLOSE is the declared transition, which `Sales.CloseDeal`
|
|
226
|
-
* already sets and a form write has no way to set. So this needs no new flag: it asks whether
|
|
227
|
-
* anybody announced a transition, which is the same question `stampClose` asks downstream.
|
|
228
|
-
*
|
|
229
|
-
* IT RUNS BEFORE THE TRANSACTION, and that placement is what makes it precise. The server
|
|
230
|
-
* derives a status from the stage later, inside the transaction (`applyStageOrderStatus`), so at
|
|
231
|
-
* THIS point a dirty status can only have come from the caller. Checking here refuses the write
|
|
232
|
-
* somebody made and never the one this class is about to make itself.
|
|
233
|
-
*
|
|
234
|
-
* Refusing rather than closing is deliberate, and is the narrower of the two readings of #205 —
|
|
235
|
-
* see the issue for the open question about whether the entity should instead RUN the close.
|
|
236
|
-
* Refusing is correct under either: a status write that reaches the database without the close
|
|
237
|
-
* having run is the defect, whoever ends up running it.
|
|
238
|
-
*/
|
|
239
|
-
const bareClose = await this.bareCloseRefusal();
|
|
240
|
-
if (bareClose) {
|
|
241
|
-
LogError(`DealEntityServer.Save refused: ${bareClose}`);
|
|
242
|
-
return false;
|
|
243
|
-
}
|
|
244
293
|
/**
|
|
245
294
|
* THE OWNER STAMP IS NOT A FIELD ANYONE MAY SET (S-US1: "cannot be edited directly").
|
|
246
295
|
*
|
|
@@ -250,16 +299,14 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
250
299
|
*/
|
|
251
300
|
const ownerRefusal = this.ownerStampEditRefusal();
|
|
252
301
|
if (ownerRefusal) {
|
|
253
|
-
|
|
254
|
-
return false;
|
|
302
|
+
return this.refuseSave(ownerRefusal);
|
|
255
303
|
}
|
|
256
304
|
try {
|
|
257
305
|
await this.stampCompanyFromPipeline();
|
|
258
306
|
await this.stampOwnerFromTeam();
|
|
259
307
|
}
|
|
260
308
|
catch (err) {
|
|
261
|
-
|
|
262
|
-
return false;
|
|
309
|
+
return this.refuseSave(`could not resolve a server-maintained stamp: ${err}`);
|
|
263
310
|
}
|
|
264
311
|
/**
|
|
265
312
|
* AFTER the company stamp, deliberately — and NOT AT ALL on a locked deal.
|
|
@@ -312,7 +359,7 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
312
359
|
*
|
|
313
360
|
* Drift caused by someone else — finance editing the order directly, which S-US5 explicitly
|
|
314
361
|
* allows — is deliberately NOT chased here. That is what `AmountSourceHash` is for: a surface
|
|
315
|
-
* holding the order can recompute the fingerprint and say
|
|
362
|
+
* holding the order can recompute the fingerprint and say so. Polling the order on
|
|
316
363
|
* every unrelated deal save would be a read per keystroke for a guarantee the hash already gives.
|
|
317
364
|
*/
|
|
318
365
|
const order = this.OrderID_Object;
|
|
@@ -371,8 +418,148 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
371
418
|
// covered only this one.
|
|
372
419
|
if (!saved) {
|
|
373
420
|
this.explainOrderProvisioningFailure();
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Everything else is ON DISK by now; the transition runs against that committed row.
|
|
425
|
+
*
|
|
426
|
+
* SO A TRANSITION THAT FAILS HERE LEAVES THE CALLER'S OTHER EDITS COMMITTED. The save returns
|
|
427
|
+
* false and the operation's own issues say why, but the fields that were not the status have
|
|
428
|
+
* already been written. That is the price of running the close against a committed row instead
|
|
429
|
+
* of racing the operation's own copy of this deal, and the close's own work is still
|
|
430
|
+
* transactional within itself — a half-done close is not among the outcomes.
|
|
431
|
+
*
|
|
432
|
+
* The one case common enough to be worth pre-empting is refused above, before anything is
|
|
433
|
+
* written. What is left here is a close that failed for a reason this path could not have known
|
|
434
|
+
* in advance: a downstream route declining, a loss reason that demands notes, a contract or
|
|
435
|
+
* order write failing.
|
|
436
|
+
*/
|
|
437
|
+
/**
|
|
438
|
+
* NO `Kind` CHECK IS NEEDED HERE, and that is the point rather than an omission.
|
|
439
|
+
*
|
|
440
|
+
* `runStatusTransition` accepts only `ActionableStatusTransition`, and the `Unreadable`
|
|
441
|
+
* refusal above is an early `return`, so the compiler has already narrowed `transition` to
|
|
442
|
+
* `Close | Reopen` by this line — adding a guard here is rejected as a comparison with no
|
|
443
|
+
* overlap. The invariant the reader used to have to carry is now held by the type.
|
|
444
|
+
*/
|
|
445
|
+
if (transition) {
|
|
446
|
+
return this.runStatusTransition(transition);
|
|
447
|
+
}
|
|
448
|
+
return true;
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Is this save a status move into or out of a locking status, and therefore a close or a reopen?
|
|
452
|
+
*
|
|
453
|
+
* Null in every ordinary case. The cheap half comes first, so a save that does not touch the status
|
|
454
|
+
* costs no status lookups at all — this runs on every save, and most saves do not touch it.
|
|
455
|
+
*
|
|
456
|
+
* A DECLARED transition returns null: `Sales.CloseDeal` and `Sales.ReopenDeal` announce themselves
|
|
457
|
+
* before saving, and that IS the flow running. Without this term, the operation's own save would
|
|
458
|
+
* re-enter the flow it is already executing.
|
|
459
|
+
*
|
|
460
|
+
* Creation returns null too. A deal born closed has no transition to have run, and the opening
|
|
461
|
+
* default (`needsStatusDefault`) would otherwise read as one.
|
|
462
|
+
*/
|
|
463
|
+
async planStatusTransition() {
|
|
464
|
+
const field = this.GetFieldByName('DealStatusTypeID');
|
|
465
|
+
const target = this.DealStatusTypeID;
|
|
466
|
+
if (!this.IsSaved || this._declaredTransition || !field?.Dirty || !target) {
|
|
467
|
+
return null;
|
|
468
|
+
}
|
|
469
|
+
const priorID = field.OldValue ?? null;
|
|
470
|
+
const targetFlags = await this.readStatusLockFlags(target);
|
|
471
|
+
/**
|
|
472
|
+
* AN UNREADABLE TARGET STATUS REFUSES THE SAVE. It does not close, and it does not proceed.
|
|
473
|
+
*
|
|
474
|
+
* `readStatusLockFlags` fails closed — `LocksDeal: true` — which is right for the lock and
|
|
475
|
+
* exactly wrong here: read as "the target closes the deal", a blip on this one row would run a
|
|
476
|
+
* full close on a save that asked for nothing of the kind. Guessing the other way is no better;
|
|
477
|
+
* a status that really does lock would then be written with no close behind it, which is the
|
|
478
|
+
* defect golive#205 was filed about.
|
|
479
|
+
*
|
|
480
|
+
* So neither guess is taken. This is the same instinct `planStageDefaults` already states for
|
|
481
|
+
* its own read — "Unreadable is treated as do not derive" — and the cost is the same shape: a
|
|
482
|
+
* rep retries one save, instead of a deal closing that nobody asked to close.
|
|
483
|
+
*/
|
|
484
|
+
if (!targetFlags.Read) {
|
|
485
|
+
return { Kind: 'Unreadable', TargetStatusID: target, PriorStatusID: priorID, TargetIsLost: false };
|
|
486
|
+
}
|
|
487
|
+
const priorLocks = priorID ? await this.statusLocksDeal(priorID) : false;
|
|
488
|
+
if (targetFlags.LocksDeal && !priorLocks) {
|
|
489
|
+
return {
|
|
490
|
+
Kind: 'Close', TargetStatusID: target, PriorStatusID: priorID,
|
|
491
|
+
TargetIsLost: targetFlags.IsLost,
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
if (priorLocks && !targetFlags.LocksDeal) {
|
|
495
|
+
return {
|
|
496
|
+
Kind: 'Reopen', TargetStatusID: target, PriorStatusID: priorID,
|
|
497
|
+
TargetIsLost: targetFlags.IsLost,
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
// Won -> Lost, or Open -> On Hold. Neither crosses the lock boundary, so neither is a close or
|
|
501
|
+
// a reopen, and the ordinary rules above already decided whether it was allowed.
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Run the close or the reopen that the caller's status write asked for.
|
|
506
|
+
*
|
|
507
|
+
* WHY THE OPERATIONS AND NOT A COPY OF THEIR WORK. A close writes a stage event, creates a contract
|
|
508
|
+
* and two finance tasks for a won B2B deal, and voids the order for a lost one; a reopen undoes the
|
|
509
|
+
* stamps and returns the order. All of it already exists, is transactional, and is pinned by the
|
|
510
|
+
* `close-deal` checks. Reimplementing any of it here would be a second copy of the most
|
|
511
|
+
* consequential code in this app.
|
|
512
|
+
*
|
|
513
|
+
* IMPORTED LAZILY because `CloseDealOperation` imports this class, so a top-level import would be a
|
|
514
|
+
* cycle. The module system caches it, so this costs nothing after the first transition in a process.
|
|
515
|
+
*
|
|
516
|
+
* A LOST CLOSE STILL NEEDS ITS LOSS REASON, and a caller who set the status without one gets the
|
|
517
|
+
* operation's own refusal rather than a second, vaguer one from here. `LossReasonID` and `LossNotes`
|
|
518
|
+
* are columns on this deal, so an importer that sets them alongside the status has supplied
|
|
519
|
+
* everything the close needs -- which is the case #205 is about.
|
|
520
|
+
*/
|
|
521
|
+
async runStatusTransition(plan) {
|
|
522
|
+
const { CloseDealOperation, ReopenDealOperation } = await import('./CloseDealOperation.js');
|
|
523
|
+
const context = {
|
|
524
|
+
provider: this.ProviderToUse,
|
|
525
|
+
user: this.ContextCurrentUser,
|
|
526
|
+
};
|
|
527
|
+
const result = plan.Kind === 'Close'
|
|
528
|
+
? await new CloseDealOperation().ExecuteServer({
|
|
529
|
+
DealID: this.ID,
|
|
530
|
+
DealStatusTypeID: plan.TargetStatusID,
|
|
531
|
+
LossReasonID: this.LossReasonID ?? null,
|
|
532
|
+
LossNotes: this.LossNotes ?? null,
|
|
533
|
+
}, context)
|
|
534
|
+
: await new ReopenDealOperation().ExecuteServer({
|
|
535
|
+
DealID: this.ID,
|
|
536
|
+
// #205: "No reopen reason is required." One is still RECORDED, because 7.3
|
|
537
|
+
// wants undoing a lock to be explainable and the operation refuses a blank.
|
|
538
|
+
Reason: 'Reopened by setting the deal status back to an open status.',
|
|
539
|
+
DealStatusTypeID: plan.TargetStatusID,
|
|
540
|
+
}, context);
|
|
541
|
+
const output = result.Output;
|
|
542
|
+
const issues = output?.Issues ?? [];
|
|
543
|
+
if (!result.Success || output?.Success === false) {
|
|
544
|
+
// The other edits ARE committed; only the transition failed. Reloading leaves this object
|
|
545
|
+
// agreeing with the row rather than holding a status the database never accepted.
|
|
546
|
+
await this.Load(this.ID);
|
|
547
|
+
const reasons = issues.length > 0
|
|
548
|
+
? issues.map((i) => i.Message)
|
|
549
|
+
: result.ErrorMessage
|
|
550
|
+
? [result.ErrorMessage]
|
|
551
|
+
: [];
|
|
552
|
+
// Names BOTH halves. "The save failed" is as wrong as "it worked": the caller's field
|
|
553
|
+
// edits are on disk and only the status did not move, and a caller who cannot tell the
|
|
554
|
+
// difference will either re-send edits that already landed or assume a close that never
|
|
555
|
+
// happened.
|
|
556
|
+
return this.reportPostSaveFailure(`Your edits to this deal were saved, but the ${plan.Kind.toLowerCase()} did not ` +
|
|
557
|
+
`complete, so its status is unchanged. Set the status again once this is resolved:`, reasons);
|
|
374
558
|
}
|
|
375
|
-
|
|
559
|
+
// The operation saved its own copy of this row. Without this, the caller keeps an object whose
|
|
560
|
+
// stamps, stage and status all predate the close it just triggered.
|
|
561
|
+
await this.Load(this.ID);
|
|
562
|
+
return true;
|
|
376
563
|
}
|
|
377
564
|
/* ── STAGE PROVENANCE ─────────────────────────────────────────────────────────────────────────
|
|
378
565
|
*
|
|
@@ -557,10 +744,12 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
557
744
|
}
|
|
558
745
|
catch (err) {
|
|
559
746
|
LogError(`DealEntityServer.saveWithinScope failed for deal ${this.ID}: ${err}`);
|
|
747
|
+
let rolledBack = true;
|
|
560
748
|
try {
|
|
561
749
|
await scope.Rollback();
|
|
562
750
|
}
|
|
563
751
|
catch (rollbackErr) {
|
|
752
|
+
rolledBack = false;
|
|
564
753
|
LogError(`Failed to roll back after a failed deal save: ${rollbackErr}`);
|
|
565
754
|
}
|
|
566
755
|
/**
|
|
@@ -587,7 +776,20 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
587
776
|
if (work.assignNumber) {
|
|
588
777
|
this.DealNumber = null;
|
|
589
778
|
}
|
|
590
|
-
|
|
779
|
+
/**
|
|
780
|
+
* `super.Save()` may already have registered a SUCCESS entry inside this scope, and the
|
|
781
|
+
* rollback does not reach the result history -- so without this the caller reads
|
|
782
|
+
* `Save() === false` beside `LatestResult.Success === true`. Reported last, after the
|
|
783
|
+
* compensation above, so the message describes the state the object is actually left in.
|
|
784
|
+
*
|
|
785
|
+
* The rollback outcome is in the sentence because the two are genuinely different
|
|
786
|
+
* situations for whoever reads it: a clean rollback means retry, a failed one means the
|
|
787
|
+
* row needs looking at before anything else is tried.
|
|
788
|
+
*/
|
|
789
|
+
return this.reportPostSaveFailure(rolledBack
|
|
790
|
+
? `This deal could not be saved, and the change was rolled back: ${err}`
|
|
791
|
+
: `This deal could not be saved AND the rollback failed, so the row may be ` +
|
|
792
|
+
`partly written. Check it before retrying: ${err}`);
|
|
591
793
|
}
|
|
592
794
|
}
|
|
593
795
|
/**
|
|
@@ -1260,8 +1462,8 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
1260
1462
|
* SD23 does not reach.
|
|
1261
1463
|
*/
|
|
1262
1464
|
/**
|
|
1263
|
-
* The fingerprint, so a surface can say
|
|
1264
|
-
* number. It covers the ORDER and the TOTAL, which is exactly what the cache was derived from —
|
|
1465
|
+
* The fingerprint, so a surface can say the amount no longer describes its order instead of
|
|
1466
|
+
* showing an untraceable number. It covers the ORDER and the TOTAL, which is exactly what the cache was derived from —
|
|
1265
1467
|
* a reader holding the order can recompute this and compare without a second table.
|
|
1266
1468
|
*/
|
|
1267
1469
|
const hash = createHash('sha256').update(`${this.OrderID}|${total}`).digest('hex');
|
|
@@ -1354,11 +1556,45 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
1354
1556
|
/**
|
|
1355
1557
|
* The fields that stay editable on a locked deal — read from the SHARED rule, not redeclared.
|
|
1356
1558
|
*
|
|
1357
|
-
* It
|
|
1358
|
-
* second copy here would drift, and the drift would only ever surface as a user typing
|
|
1359
|
-
* the server then refuses. See `close-lock.ts
|
|
1559
|
+
* It lives in `@mj-biz-apps/sales-entities` so the Explorer Deal form and the workspace apply the
|
|
1560
|
+
* same list. A second copy here would drift, and the drift would only ever surface as a user typing
|
|
1561
|
+
* into a field the server then refuses. See `close-lock.ts`; CD14 pins it to real behaviour.
|
|
1562
|
+
*
|
|
1563
|
+
* A FUNCTION, not a constant, since golive#206's "Loss Notes (Lost deals only)": the answer depends
|
|
1564
|
+
* on the deal's outcome, so the outcome has to reach it. It used to be a flat `ReadonlySet` held in
|
|
1565
|
+
* a static, which is precisely how a caller ends up with the list and without the condition.
|
|
1566
|
+
*/
|
|
1567
|
+
static lockEditableFields(isLost) {
|
|
1568
|
+
return DealFieldsEditableWhileLocked(isLost);
|
|
1569
|
+
}
|
|
1570
|
+
/**
|
|
1571
|
+
* The child collections that stay editable on a locked deal.
|
|
1572
|
+
*
|
|
1573
|
+
* Named here rather than in `sales-entities` because, unlike the field list, no other surface needs
|
|
1574
|
+
* it yet: the grids decide their own New/delete affordances. If a form ever has to render this, it
|
|
1575
|
+
* moves next to `DEAL_FIELDS_EDITABLE_WHILE_LOCKED` for the same reason that one moved.
|
|
1576
|
+
*
|
|
1577
|
+
* ── WHAT THIS DOES AND DOES NOT CATCH TODAY ─────────────────────────────────────────────────
|
|
1578
|
+
*
|
|
1579
|
+
* The Deal declares exactly TWO child collections (`metadata/entity-relationships`):
|
|
1580
|
+
* `PaymentSchedule` and `Team`. Both are named here, so `dirtyCollections` below is currently
|
|
1581
|
+
* always empty and this check refuses nothing in practice.
|
|
1582
|
+
*
|
|
1583
|
+
* That is deliberate and it is not the same as the check being pointless. It is an ALLOW-LIST, so
|
|
1584
|
+
* a collection added later is refused without anyone remembering to add it — which is the whole
|
|
1585
|
+
* property the previous "freeze every dirty companion" rule existed for. What it means is that
|
|
1586
|
+
* the freeze direction has no companion to demonstrate it on right now, and no check can prove
|
|
1587
|
+
* it until a third collection exists. Said out loud so nobody reads the guard as tested.
|
|
1588
|
+
*
|
|
1589
|
+
* ORDER LINES ARE NOT A COMPANION OF THE DEAL and never were — they belong to the ORDER, in the
|
|
1590
|
+
* Orders app. An earlier version of this comment listed `Lines` alongside these two, which made
|
|
1591
|
+
* this look like the thing freezing them. It is not: that is bizapps-orders#206, which adds a veto
|
|
1592
|
+
* seam Sales registers into.
|
|
1360
1593
|
*/
|
|
1361
|
-
static { this.
|
|
1594
|
+
static { this.LOCK_EDITABLE_COMPANIONS = new Set([
|
|
1595
|
+
'Team',
|
|
1596
|
+
'PaymentSchedule',
|
|
1597
|
+
]); }
|
|
1362
1598
|
/**
|
|
1363
1599
|
* Runs `body` with the close lock suppressed, and always restores it.
|
|
1364
1600
|
*
|
|
@@ -1383,83 +1619,207 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
1383
1619
|
* the current value instead would make a deal impossible to close.
|
|
1384
1620
|
*/
|
|
1385
1621
|
/**
|
|
1386
|
-
*
|
|
1622
|
+
* Refuse this save, and leave the reason where the CALLER reads it.
|
|
1387
1623
|
*
|
|
1388
|
-
*
|
|
1624
|
+
* ── WHY LOGGING WAS NOT ENOUGH ────────────────────────────────────────────────
|
|
1389
1625
|
*
|
|
1390
|
-
*
|
|
1391
|
-
*
|
|
1392
|
-
*
|
|
1393
|
-
*
|
|
1626
|
+
* Every refusal in `Save` used to be `LogError(...)` followed by `return false`, so a caller got a
|
|
1627
|
+
* bare `false` and the reason went to the server log. golive#207 row 18 is explicit about what that
|
|
1628
|
+
* message is for: row 17 is what the FORM shows a person, and row 18 is "what the save returns to
|
|
1629
|
+
* whoever asked — the form, an import, an agent or a raw API call". Logged, it returned to nobody.
|
|
1630
|
+
* The form looked fine only because `DealFormComponentExtended.Validate()` produces row 17 for
|
|
1631
|
+
* itself; every other caller got silence.
|
|
1394
1632
|
*
|
|
1395
|
-
*
|
|
1396
|
-
*
|
|
1633
|
+
* `RegisterResultHistoryEntry` is what core uses to record a failed write, and it is what puts the
|
|
1634
|
+
* text on `LatestResult` — registered rather than assigned, because `LatestResult` returns null
|
|
1635
|
+
* when the history is empty while TYPING itself non-null, which is how the same mistake reached
|
|
1636
|
+
* production in orders' line delete.
|
|
1397
1637
|
*/
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1638
|
+
refuseSave(message) {
|
|
1639
|
+
/**
|
|
1640
|
+
* PUT THE CALLER'S STATUS BACK BEFORE REFUSING, or the retry they were just invited to make
|
|
1641
|
+
* silently does nothing.
|
|
1642
|
+
*
|
|
1643
|
+
* The status is reverted to its persisted value above so the close lock sees a clean field.
|
|
1644
|
+
* That revert is correct for a save that PROCEEDS. On a refusal it is a trap: the field is now
|
|
1645
|
+
* clean, so a caller who reads this message, fixes what it named and saves the SAME object gets
|
|
1646
|
+
* `planStatusTransition() === null` on `!field?.Dirty`, no close runs, the other edits commit,
|
|
1647
|
+
* and `Save()` returns TRUE. An open deal carrying a loss reason, and a caller told it worked.
|
|
1648
|
+
*
|
|
1649
|
+
* Restored HERE rather than at each `return false` for the reason the `finally` above exists:
|
|
1650
|
+
* the bug is always the exit somebody adds later, and there are four of these already.
|
|
1651
|
+
*/
|
|
1652
|
+
if (this._revertedStatusTarget) {
|
|
1653
|
+
this.Set('DealStatusTypeID', this._revertedStatusTarget);
|
|
1405
1654
|
}
|
|
1406
|
-
|
|
1407
|
-
const
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
};
|
|
1414
|
-
|
|
1415
|
-
|
|
1655
|
+
LogError(`DealEntityServer.Save refused: ${message}`);
|
|
1656
|
+
const failed = new BaseEntityResult();
|
|
1657
|
+
failed.Success = false;
|
|
1658
|
+
failed.Type = this.IsSaved ? 'update' : 'create';
|
|
1659
|
+
failed.Message = message;
|
|
1660
|
+
failed.StartedAt = new Date();
|
|
1661
|
+
failed.EndedAt = new Date();
|
|
1662
|
+
failed.OriginalValues = this.Fields.map((f) => ({ FieldName: f.CodeName, Value: f.OldValue }));
|
|
1663
|
+
this.RegisterResultHistoryEntry(failed);
|
|
1664
|
+
return false;
|
|
1665
|
+
}
|
|
1666
|
+
/**
|
|
1667
|
+
* Report a failure that happened AFTER `super.Save()` already registered a SUCCESS result.
|
|
1668
|
+
*
|
|
1669
|
+
* ── WHY THIS IS NOT `refuseSave` ──────────────────────────────────────────────────────────────
|
|
1670
|
+
*
|
|
1671
|
+
* `Save()` returning false was, on these paths, the ONLY signal. `super.Save()` had already
|
|
1672
|
+
* registered a success entry and `this.Load(this.ID)` does not clear the history -- core guards
|
|
1673
|
+
* its `init()` with `if (!this.IsSaved)` and the deal is saved -- so a caller doing the obvious
|
|
1674
|
+
* thing read:
|
|
1675
|
+
*
|
|
1676
|
+
* await deal.Save() -> false
|
|
1677
|
+
* deal.LatestResult.Success -> TRUE
|
|
1678
|
+
* deal.LatestResult.CompleteMessage -> undefined -> "Unknown error"
|
|
1679
|
+
*
|
|
1680
|
+
* A caller following exactly the pattern `deal-workspace.service.ts` uses was told the save
|
|
1681
|
+
* succeeded. Worse than silent: the last thing on the history contradicted the return value.
|
|
1682
|
+
*
|
|
1683
|
+
* Two things differ from `refuseSave` and both matter:
|
|
1684
|
+
*
|
|
1685
|
+
* 1. IT DOES NOT PUT THE STATUS BACK. `refuseSave` restores the caller's target because nothing
|
|
1686
|
+
* was written and a retry must still carry it. Here the row has already moved (or been rolled
|
|
1687
|
+
* back) and `Load()` has resynced this object to it -- re-dirtying a field to a value the
|
|
1688
|
+
* database just rejected would invite the same failure on the next save.
|
|
1689
|
+
* 2. IT CARRIES THE OPERATION'S ISSUES. `CloseDealOperation` returns a structured `Issues` array
|
|
1690
|
+
* which was being joined into a `LogError` and dropped. Those sentences are the only thing
|
|
1691
|
+
* that says WHY the close refused, and they are what the user needs.
|
|
1692
|
+
*
|
|
1693
|
+
* AND WHY NOT A TRANSACTION, since "both or neither" is the obvious wish: the transition reaches
|
|
1694
|
+
* bizapps-contracts and bizapps-orders through seams, so there is no single database to be atomic
|
|
1695
|
+
* in; `CloseDealOperation` is a remote operation that owns its own scope and rollback; and it
|
|
1696
|
+
* loads its own copy of this deal, which is exactly why it must run after the commit rather than
|
|
1697
|
+
* inside it. Atomicity is not available here, so honesty about the partial apply is the fix.
|
|
1698
|
+
* Narrowing the window belongs upstream, in the pre-flight that already refuses a lost close with
|
|
1699
|
+
* no loss reason before a single row moves.
|
|
1700
|
+
*/
|
|
1701
|
+
reportPostSaveFailure(message, issues = []) {
|
|
1702
|
+
// Into the MESSAGE, not only into `Errors`: `CompleteMessage` is what the resolver reads, and
|
|
1703
|
+
// it builds from `Message`. An issue list that renders nowhere is the defect being fixed.
|
|
1704
|
+
const full = issues.length > 0 ? `${message} ${issues.join(' | ')}` : message;
|
|
1705
|
+
LogError(`DealEntityServer.Save: ${full}`);
|
|
1706
|
+
const failed = new BaseEntityResult();
|
|
1707
|
+
failed.Success = false;
|
|
1708
|
+
failed.Type = this.IsSaved ? 'update' : 'create';
|
|
1709
|
+
failed.Message = full;
|
|
1710
|
+
if (issues.length > 0) {
|
|
1711
|
+
failed.Errors = issues.map((issue) => ({ Message: issue, Source: 'DealEntityServer' }));
|
|
1416
1712
|
}
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1713
|
+
failed.StartedAt = new Date();
|
|
1714
|
+
failed.EndedAt = new Date();
|
|
1715
|
+
failed.OriginalValues = this.Fields.map((f) => ({ FieldName: f.CodeName, Value: f.OldValue }));
|
|
1716
|
+
this.RegisterResultHistoryEntry(failed);
|
|
1717
|
+
return false;
|
|
1422
1718
|
}
|
|
1423
1719
|
async checkCloseLock() {
|
|
1424
1720
|
const persistedStatusID = this.GetFieldByName('DealStatusTypeID')?.OldValue;
|
|
1425
1721
|
if (!persistedStatusID) {
|
|
1426
1722
|
return null;
|
|
1427
1723
|
}
|
|
1428
|
-
|
|
1724
|
+
const persisted = await this.readStatusLockFlags(persistedStatusID);
|
|
1725
|
+
if (!persisted.LocksDeal) {
|
|
1429
1726
|
return null;
|
|
1430
1727
|
}
|
|
1431
1728
|
// FROM HERE THE DEAL IS LOCKED, whatever this particular edit turns out to be. Recorded before
|
|
1432
1729
|
// the field-by-field verdict below, because the writers downstream care about the LOCK, not about
|
|
1433
1730
|
// whether this one edit was permitted.
|
|
1434
1731
|
this._lockedAtSave = true;
|
|
1435
|
-
|
|
1732
|
+
/**
|
|
1733
|
+
* The outcome decides one field. golive#206: Loss Notes stays editable on a LOST deal and is
|
|
1734
|
+
* frozen on a won one, and the form asks the same function with the same flag — both take it
|
|
1735
|
+
* from the status ROW, never from a name.
|
|
1736
|
+
*/
|
|
1737
|
+
const editable = DealEntityServer_1.lockEditableFields(persisted.IsLost);
|
|
1738
|
+
/**
|
|
1739
|
+
* `OwnerEmployeeID` IS FROZEN, AND IS STILL WRITTEN HERE WHEN THE ROSTER DRIVES IT.
|
|
1740
|
+
*
|
|
1741
|
+
* It stays out of the editable set on purpose — `SD26` proves a hand-set one is refused, and
|
|
1742
|
+
* golive#206 classes Owner as server-written provenance. But golive#206 item 2 also says
|
|
1743
|
+
* reassigning a rep on a closed deal is record-keeping and must be allowed, and the stamp has
|
|
1744
|
+
* to follow the roster when it does.
|
|
1745
|
+
*
|
|
1746
|
+
* The form's team panel edits `DealTeamMember` rows, leaving this field clean, so it passed.
|
|
1747
|
+
* `DealEntity.SetOwner()` assigns the stamp itself after loading the roster, so it arrived here
|
|
1748
|
+
* DIRTY and the lock refused it — which is the deal workspace's owner picker, and it did not
|
|
1749
|
+
* work on a closed deal. `CD29` is that case.
|
|
1750
|
+
*
|
|
1751
|
+
* Asking `RosterDrivesThisSave` is the same question `ownerStampEditRefusal` already asks, which
|
|
1752
|
+
* is what stops the two from disagreeing again. It grants nothing a caller could exploit:
|
|
1753
|
+
* `stampOwnerFromTeam` re-derives the value from the roster a moment later.
|
|
1754
|
+
*/
|
|
1755
|
+
const frozen = (f) => f.Dirty
|
|
1756
|
+
&& !editable.has(f.Name)
|
|
1757
|
+
&& !(f.Name === 'OwnerEmployeeID' && this.RosterDrivesThisSave);
|
|
1758
|
+
const changed = this.Fields.filter(frozen).map((f) => f.Name);
|
|
1436
1759
|
/**
|
|
1437
1760
|
* THE CHILD COLLECTIONS COUNT AS CHANGES TOO, and this half did not exist when the lock was
|
|
1438
1761
|
* written — the collections did not exist either.
|
|
1439
1762
|
*
|
|
1440
|
-
*
|
|
1441
|
-
*
|
|
1442
|
-
*
|
|
1443
|
-
*
|
|
1444
|
-
*
|
|
1763
|
+
* `PaymentSchedule` and `Team` are COMPANIONS, not fields: they never appear in `this.Fields`,
|
|
1764
|
+
* so the header check above cannot see them at all. Without this half, the lock would refuse a
|
|
1765
|
+
* renamed deal while a companion edit went straight through.
|
|
1766
|
+
*
|
|
1767
|
+
* A deal's ORDER LINES are exactly what a contract was derived from, and they are NOT reachable
|
|
1768
|
+
* from here — they belong to the order, in the Orders app, and this entity never sees them.
|
|
1769
|
+
* Freezing those is bizapps-orders#206.
|
|
1770
|
+
*
|
|
1771
|
+
* WHICH COLLECTIONS ARE FROZEN IS NOW AN ALLOW-LIST, AND THE DIRECTION MATTERS
|
|
1772
|
+
* (bc-aidp-next-golive#206 item 2). Reassigning a rep or correcting a payment schedule after a
|
|
1773
|
+
* close is record-keeping, not a change to what was agreed, so `Team` and `PaymentSchedule` are
|
|
1774
|
+
* permitted — which today is both of them.
|
|
1445
1775
|
*
|
|
1446
|
-
*
|
|
1447
|
-
*
|
|
1448
|
-
*
|
|
1776
|
+
* This was previously "freeze every dirty companion", enumerated that way deliberately so that a
|
|
1777
|
+
* collection added later would be protected without anyone remembering to add it. That property
|
|
1778
|
+
* is kept -- which is why this names what is ALLOWED rather than what is frozen. Listing the
|
|
1779
|
+
* frozen ones instead would leave the next collection silently editable on a closed deal, and
|
|
1780
|
+
* that is the failure the original comment was written against.
|
|
1449
1781
|
*
|
|
1450
1782
|
* Guarded by the same already-closed test, so the closing transition may still carry final
|
|
1451
1783
|
* collection state — a close that writes its last line is legal; editing that line tomorrow is
|
|
1452
1784
|
* not.
|
|
1453
1785
|
*/
|
|
1454
1786
|
const dirtyCollections = this.Companions
|
|
1455
|
-
.filter((c) => c.Dirty)
|
|
1787
|
+
.filter((c) => c.Dirty && !DealEntityServer_1.LOCK_EDITABLE_COMPANIONS.has(c.Name))
|
|
1456
1788
|
.map((c) => c.Name);
|
|
1457
1789
|
const all = [...changed, ...dirtyCollections];
|
|
1458
1790
|
if (all.length === 0) {
|
|
1459
1791
|
return null;
|
|
1460
1792
|
}
|
|
1461
|
-
|
|
1462
|
-
|
|
1793
|
+
/**
|
|
1794
|
+
* golive#207 row 18, verbatim: "This deal is closed. {fields} cannot be changed until the
|
|
1795
|
+
* status is set back to Open."
|
|
1796
|
+
*
|
|
1797
|
+
* The third of the three lock messages, with rows 16 and 17 on this PR. It began on the #205
|
|
1798
|
+
* branch, which is where the sentence became TRUE -- until that trigger landed, a status write
|
|
1799
|
+
* could not reopen a deal and this refusal had to send the reader to `Sales.ReopenDeal`. It is
|
|
1800
|
+
* here instead so that one PR owns one issue, and the sequencing the tester already called out
|
|
1801
|
+
* ("the three lock messages assume the close/reopen issue lands") is unchanged: this PR merges
|
|
1802
|
+
* with #205's, never before it.
|
|
1803
|
+
*
|
|
1804
|
+
* NOTHING IS APPENDED FOR INTEGRATORS. An earlier revision added a second sentence naming
|
|
1805
|
+
* `Sales.ReopenDeal` and its arguments, on the reasoning that this string reaches an API caller
|
|
1806
|
+
* as well as a person. Once setting the status back RUNS the reopen from any path, that is the
|
|
1807
|
+
* same instruction spelled longer. A caller who wants the operation directly still finds it
|
|
1808
|
+
* named, with its arguments, in the refusal a close that cannot run produces.
|
|
1809
|
+
*
|
|
1810
|
+
* {fields} IS INTERPOLATED, not spelled out, which the tester asked for in the same breath:
|
|
1811
|
+
* the notice "should match whatever #206 settles on". #206 item 3 grows that set from two fields to
|
|
1812
|
+
* six -- seven on a Lost deal -- and a hardcoded sentence would have started lying the day
|
|
1813
|
+
* it merged.
|
|
1814
|
+
*
|
|
1815
|
+
* THE SAME LABELS AND THE SAME JOIN AS ROW 16. This sentence used to print raw column names
|
|
1816
|
+
* while row 16 printed the on-screen ones, so one refusal said "DealStatusTypeID" and the other
|
|
1817
|
+
* said "Deal Status" about the same field. `DealFieldLabel` falls back to the field name, so a
|
|
1818
|
+
* frozen field nobody has labelled still reads as its column ─ slightly wrong, rather than
|
|
1819
|
+
* taking the notice down.
|
|
1820
|
+
*/
|
|
1821
|
+
const named = JoinLabels(all.map(DealFieldLabel));
|
|
1822
|
+
return `This deal is closed. ${named} cannot be changed until the status is set back to Open.`;
|
|
1463
1823
|
}
|
|
1464
1824
|
/**
|
|
1465
1825
|
* Whether a status carries `LocksDeal`.
|
|
@@ -1468,21 +1828,43 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
1468
1828
|
* working. It is also why the lock is a property of the STATUS TYPE rather than of the stage.
|
|
1469
1829
|
*/
|
|
1470
1830
|
async statusLocksDeal(statusID) {
|
|
1831
|
+
return (await this.readStatusLockFlags(statusID)).LocksDeal;
|
|
1832
|
+
}
|
|
1833
|
+
/**
|
|
1834
|
+
* The two flags the lock needs off a status row: does it lock the deal, and is it a LOSS.
|
|
1835
|
+
*
|
|
1836
|
+
* One read for both, because every caller that wants the second also wants the first, and two
|
|
1837
|
+
* round trips for two columns of one row is a cost with nothing to show for it.
|
|
1838
|
+
*
|
|
1839
|
+
* ── THE TWO FAILURE DEFAULTS POINT THE SAME WAY ─────────────────────────────────────────────
|
|
1840
|
+
*
|
|
1841
|
+
* `LocksDeal` FAILS CLOSED: if the status cannot be read we cannot prove the deal is unlocked, and
|
|
1842
|
+
* wrongly allowing an edit to a closed deal is the more expensive mistake. `IsLost` fails to
|
|
1843
|
+
* `false` for the same reason read the other way round — `false` means Loss Notes is NOT carved
|
|
1844
|
+
* out, so an unreadable status refuses more, never less.
|
|
1845
|
+
*
|
|
1846
|
+
* ── AND THAT IS WHY `Read` IS REPORTED SEPARATELY ──────────────────────────────────────
|
|
1847
|
+
*
|
|
1848
|
+
* "Refuses more, never less" holds for the LOCK and inverts for the TRIGGER. `planStatusTransition`
|
|
1849
|
+
* reads `LocksDeal` to mean "the target status closes the deal", so the same fail-closed default
|
|
1850
|
+
* turns a transient read failure into a REAL CLOSE — stage event, contract, finance tasks, a voided
|
|
1851
|
+
* order — on a save that asked for none of it. One default cannot serve both readings, so callers
|
|
1852
|
+
* are told whether the row was actually read and decide for themselves.
|
|
1853
|
+
*/
|
|
1854
|
+
async readStatusLockFlags(statusID) {
|
|
1471
1855
|
const provider = this.ProviderToUse;
|
|
1472
1856
|
const result = await provider.RunView({
|
|
1473
1857
|
EntityName: DEAL_STATUS_ENTITY,
|
|
1474
1858
|
ExtraFilter: `ID = '${statusID}'`,
|
|
1475
1859
|
ResultType: 'simple',
|
|
1476
|
-
Fields: ['LocksDeal'],
|
|
1860
|
+
Fields: ['LocksDeal', 'IsLost'],
|
|
1477
1861
|
}, this.ContextCurrentUser);
|
|
1478
1862
|
if (!result.Success) {
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
LogError(`DealEntityServer.statusLocksDeal: could not read status ${statusID}: ${result.ErrorMessage}`);
|
|
1482
|
-
return true;
|
|
1863
|
+
LogError(`DealEntityServer.readStatusLockFlags: could not read status ${statusID}: ${result.ErrorMessage}`);
|
|
1864
|
+
return { LocksDeal: true, IsLost: false, Read: false };
|
|
1483
1865
|
}
|
|
1484
1866
|
const row = (result.Results ?? [])[0];
|
|
1485
|
-
return row?.LocksDeal === true;
|
|
1867
|
+
return { LocksDeal: row?.LocksDeal === true, IsLost: row?.IsLost === true, Read: !!row };
|
|
1486
1868
|
}
|
|
1487
1869
|
/* ── Selling company ────────────────────────────────────────────────────── */
|
|
1488
1870
|
/**
|
|
@@ -1556,7 +1938,8 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
1556
1938
|
*
|
|
1557
1939
|
* Because the caller believed they were setting the owner. Correcting them in silence produces the
|
|
1558
1940
|
* same wrong outcome as before — the owner is not who they said — with no way to notice. The
|
|
1559
|
-
* message names
|
|
1941
|
+
* message names the Internal team panel, which is where a person actually changes the owner;
|
|
1942
|
+
* `DealEntity.SetOwner` is the same operation in code, and the wording is the tester's (golive#207).
|
|
1560
1943
|
*
|
|
1561
1944
|
* ── WHY `SetOwner` IS NOT CAUGHT BY THIS ────────────────────────────────────────────────────
|
|
1562
1945
|
*
|
|
@@ -1565,19 +1948,34 @@ let DealEntityServer = class DealEntityServer extends DealEntity {
|
|
|
1565
1948
|
* conditions mirror `stampOwnerFromTeam`'s guard exactly, which is what keeps them from disagreeing.
|
|
1566
1949
|
*/
|
|
1567
1950
|
ownerStampEditRefusal() {
|
|
1568
|
-
if (this.
|
|
1951
|
+
if (this.RosterDrivesThisSave) {
|
|
1569
1952
|
return null; // the roster is part of this save; the stamp is derived from it below
|
|
1570
1953
|
}
|
|
1571
1954
|
if (!this.callerSuppliedValue('OwnerEmployeeID', this.OwnerEmployeeID)) {
|
|
1572
1955
|
return null; // nobody supplied it. The common case.
|
|
1573
1956
|
}
|
|
1574
|
-
return ('
|
|
1575
|
-
'
|
|
1576
|
-
|
|
1577
|
-
|
|
1957
|
+
return ('The owner is set from the deal team. Change the Owner role on the Internal team panel ' +
|
|
1958
|
+
'instead.');
|
|
1959
|
+
}
|
|
1960
|
+
/**
|
|
1961
|
+
* Is the ROSTER driving this save, rather than a caller naming an owner out of thin air?
|
|
1962
|
+
*
|
|
1963
|
+
* Three places need this answer and they must never disagree, which is how a defect got in:
|
|
1964
|
+
* `ownerStampEditRefusal` and `stampOwnerFromTeam` each spelled the condition out, `checkCloseLock`
|
|
1965
|
+
* did not ask at all, and `DealEntity.SetOwner()` — which loads the roster and then assigns the
|
|
1966
|
+
* stamp — was refused on a locked deal for editing a frozen field. golive#206 item 2 says
|
|
1967
|
+
* reassigning a rep after close is record-keeping and must be allowed.
|
|
1968
|
+
*
|
|
1969
|
+
* `Team.Load()` is what makes it true, and `SetOwner` calls it first. A caller who hand-sets
|
|
1970
|
+
* `OwnerEmployeeID` without touching the roster gets `false` here and the refusal it deserves.
|
|
1971
|
+
* A caller who sets BOTH gets no advantage: `stampOwnerFromTeam` re-derives the stamp from the
|
|
1972
|
+
* roster afterwards and overwrites whatever was supplied.
|
|
1973
|
+
*/
|
|
1974
|
+
get RosterDrivesThisSave() {
|
|
1975
|
+
return this.Team.IsLoaded || this.Team.Count > 0;
|
|
1578
1976
|
}
|
|
1579
1977
|
async stampOwnerFromTeam() {
|
|
1580
|
-
if (!this.
|
|
1978
|
+
if (!this.RosterDrivesThisSave) {
|
|
1581
1979
|
return; // the roster is not part of this save; leave the stamp alone
|
|
1582
1980
|
}
|
|
1583
1981
|
const ownerRoleID = await this.ResolveOwnerRoleID();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DealEntityServer.js","sourceRoot":"","sources":["../src/DealEntityServer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DealEntityServer.js","sourceRoot":"","sources":["../src/DealEntityServer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mj-biz-apps/sales-core-entities-server",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.
|
|
4
|
+
"version": "6.5.0",
|
|
5
5
|
"description": "Server-side entity subclasses for BizApps Sales — the close lock (L-17), the OwnerEmployeeID denormalized stamp, and deal lifecycle hooks.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
"vitest": "^4.0.18"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@mj-biz-apps/common-activity-sync": "^5.
|
|
23
|
-
"@mj-biz-apps/common-entities": "^5.
|
|
22
|
+
"@mj-biz-apps/common-activity-sync": "^5.43.0",
|
|
23
|
+
"@mj-biz-apps/common-entities": "^5.43.0",
|
|
24
24
|
"@mj-biz-apps/orders-entities": "^5.2.1",
|
|
25
|
-
"@mj-biz-apps/sales-entities": "6.
|
|
25
|
+
"@mj-biz-apps/sales-entities": "6.5.0",
|
|
26
26
|
"@mj-biz-apps/tasks-core": "^1.4.1",
|
|
27
27
|
"@mj-biz-apps/tasks-entities": "^1.4.1"
|
|
28
28
|
},
|