[CLAUDE] PurchaseEvaluation: D1 stability fixes — Block B multi-winner financials + CEO-notify persist + HoSoLink preserve + #70 guard + setter relocate
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m4s
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m4s
PE stability audit (frozen CEO-approved spec) — D1 behavior-preserving fixes plus one approved joint-winner financial correction: - Block B "Gia tri ky nay" + cross-PE peer rollup re-keyed SelectedSupplierId -> IsWinner (reported 0 / excluded peers for >=2 joint winners; now matches winnerQuoteTotal). - CEO-notify-on-urgent: +SaveChanges after NotifyManyAsync (Director notify was added after the only flush -> never persisted; now persists + SignalR push fires). - HoSoLink: UpdatePeDraft null-safe + clear-via-empty (header edit no longer wipes a set link; HoSoLinkRow sends "" to clear; header forms omit = preserve). - #70 stale-echo guard added to PRO budget row3/row8 (|| peFetching). - Relocate SetPeCcmBudgetPeriodCommand -> PeWorkItemBudgetFeatures (was misplaced in PeSuggestedPriceFeatures). DTO/comment cleanups. Tests 402 -> 413 (+11: HoSoLink preserve/clear/set, Block B >=2-winner, CEO-notify persist x6). Full suite GREEN. FE 2-app SHA-identical. test-specialist + reviewer returns truncated (#53, over-budget MEMORY) -> em-main self-gate from disk + suite run. D2 deferred (create-contract 1-HD-per-winner + list-card winner names) — needs focused care + anh Kiet UAT on per-winner contract value. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -1545,7 +1545,7 @@ function PeBudgetSummaryTable({ ev, readOnly }: { ev: PeDetailBundle; readOnly:
|
||||
{drafterEditable ? (
|
||||
<VndInlineEdit
|
||||
initial={ev.budgetPeriodAmount ?? bs.proInitialAmount}
|
||||
saving={adjustMut.isPending}
|
||||
saving={adjustMut.isPending || peFetching}
|
||||
label="Ngân sách kỳ này (PRO)"
|
||||
onLiveChange={setDraftRow3}
|
||||
onSave={v => adjustMut.mutate({ budgetPeriodAmount: v, expectedRemainingAmount: ev.expectedRemainingAmount })}
|
||||
@ -1646,7 +1646,7 @@ function PeBudgetSummaryTable({ ev, readOnly }: { ev: PeDetailBundle; readOnly:
|
||||
<VndInlineEdit
|
||||
initial={ev.expectedRemainingAmount ?? pro.r7}
|
||||
allowNegative
|
||||
saving={adjustMut.isPending}
|
||||
saving={adjustMut.isPending || peFetching}
|
||||
label="Giá trị thực hiện dự kiến còn lại"
|
||||
onLiveChange={setDraftRow8}
|
||||
onSave={v => adjustMut.mutate({ budgetPeriodAmount: ev.budgetPeriodAmount, expectedRemainingAmount: v })}
|
||||
@ -2017,7 +2017,10 @@ function HoSoLinkRow({ ev, readOnly = false }: { ev: PeDetailBundle; readOnly?:
|
||||
paymentTerms: ev.paymentTerms,
|
||||
budgetPeriodAmount: ev.budgetPeriodAmount,
|
||||
expectedRemainingAmount: ev.expectedRemainingAmount,
|
||||
hoSoLink: hoSoLink || null,
|
||||
// BE UpdatePeDraftHandler null-safe: "" = clear, non-empty = set,
|
||||
// omit/null = preserve. Gửi raw trimmed (="" khi xóa) để CLEAR đúng,
|
||||
// KHÔNG gửi null (null = giữ nguyên → không xóa được link cũ).
|
||||
hoSoLink: hoSoLink.trim(),
|
||||
})
|
||||
},
|
||||
onSuccess: () => {
|
||||
@ -2504,7 +2507,7 @@ function ItemsTab({ ev, readOnly = false }: { ev: PeDetailBundle; readOnly?: boo
|
||||
</p>
|
||||
{/* S59 vòng 6 (anh chốt "bỏ luôn cái nút thêm hạng mục"): 1 phiếu = 1 hạng mục
|
||||
chọn từ header (S57bis/S58) — hạng mục đầu auto-seed khi tạo phiếu, nút thêm
|
||||
hạng mục thứ 2+ sai mô hình. AddItemDialog giữ (dead) để flip lại dễ nếu cần. */}
|
||||
hạng mục thứ 2+ sai mô hình → nút đã bỏ (dialog thêm/sửa hạng mục là DetailDialog). */}
|
||||
</div>
|
||||
|
||||
{ev.details.length === 0 ? (
|
||||
|
||||
@ -314,9 +314,9 @@ export type PeBudgetSummary = {
|
||||
// Lũy kế các phiếu cùng (ProjectId, WorkItemId), Id != this, CreatedAt < this:
|
||||
previousSubmittedTotal: number // SUM BudgetPeriodAmount WHERE Phase IN (ChoDuyet, DaDuyet)
|
||||
previousSubmittedCount: number
|
||||
previousSelectedTotal: number // SUM quote ThanhTien của SelectedSupplier WHERE Phase=DaDuyet
|
||||
previousSelectedTotal: number // SUM quote ThanhTien NCC trúng (IsWinner) WHERE Phase=DaDuyet
|
||||
previousSelectedCount: number
|
||||
currentProposalTotal: number // SUM ThanhTien quotes của SelectedSupplier phiếu NÀY (0 khi chưa chọn)
|
||||
currentProposalTotal: number // SUM ThanhTien quotes NCC trúng (IsWinner) phiếu NÀY (0 khi chưa chọn)
|
||||
}
|
||||
|
||||
// Mirror BE PeDepartmentKind enum
|
||||
|
||||
Reference in New Issue
Block a user