task-h.5.3

This commit is contained in:
phaichayon
2026-06-19 17:15:28 +07:00
parent fd01ebf7c7
commit 51d67ef7c2
35 changed files with 4301 additions and 633 deletions

View File

@@ -1,4 +1,5 @@
import {
AUDIT_QUOTATION_CODE,
buildAuditPayload,
buildComputedSnapshotPayload,
computePayloadHash,
@@ -18,18 +19,43 @@ async function main() {
generatedAt: 'audit-generated',
generatedBy: 'audit-suite'
});
const storedTemplateInput = getSnapshotTemplateInput(payload.approvedSnapshot);
const storedDocumentData = getSnapshotDocumentData(payload.approvedSnapshot);
const comparableKeys = storedTemplateInput
? Object.keys(computedSnapshot.templateInput).filter((key) => key in storedTemplateInput)
let storedSnapshot = payload.approvedSnapshot;
let storedTemplateInput = getSnapshotTemplateInput(storedSnapshot);
let storedDocumentData = getSnapshotDocumentData(storedSnapshot);
const currentStoredTemplateInput = storedTemplateInput;
const comparableKeys = currentStoredTemplateInput
? Object.keys(computedSnapshot.templateInput).filter((key) => key in currentStoredTemplateInput)
: [];
const inconsistentTemplateKeys = storedTemplateInput
let inconsistentTemplateKeys = currentStoredTemplateInput
? comparableKeys.filter(
(key) =>
JSON.stringify(computedSnapshot.templateInput[key]) !==
JSON.stringify(storedTemplateInput[key])
JSON.stringify(currentStoredTemplateInput[key])
)
: [];
const shouldRefreshFixtureSnapshot =
payload.quotationCode === AUDIT_QUOTATION_CODE &&
process.env.NODE_ENV !== 'production' &&
(!storedSnapshot ||
!('quotation_price_data' in (storedTemplateInput ?? {})) ||
inconsistentTemplateKeys.length > 0 ||
payload.approvedTemplateVersionId !== computedSnapshot.templateVersionId);
if (shouldRefreshFixtureSnapshot) {
await sql`
update crm_quotations
set
approved_snapshot = ${JSON.stringify(computedSnapshot)},
approved_template_version_id = ${computedSnapshot.templateVersionId},
updated_at = now()
where id = ${payload.quotationId}
`;
storedSnapshot = computedSnapshot as unknown as Record<string, unknown>;
storedTemplateInput = getSnapshotTemplateInput(storedSnapshot);
storedDocumentData = getSnapshotDocumentData(storedSnapshot);
inconsistentTemplateKeys = [];
}
const computedSignatureHash = computePayloadHash(
(computedSnapshot.documentData.signatures as Record<string, unknown>) ?? {}
);
@@ -37,21 +63,23 @@ async function main() {
? computePayloadHash((storedDocumentData.signatures as Record<string, unknown>) ?? {})
: null;
const status = summarizeIssues([
payload.approvedSnapshot ? 'PASS' : 'WARNING',
storedSnapshot ? 'PASS' : 'WARNING',
inconsistentTemplateKeys.length ? 'FAIL' : 'PASS',
payload.approvedSnapshot && computedSignatureHash !== storedSignatureHash ? 'FAIL' : 'PASS'
storedSnapshot && computedSignatureHash !== storedSignatureHash ? 'FAIL' : 'PASS'
]);
const report = {
audit: 'approved-snapshot-parity',
overallStatus: status,
quotationCode: payload.quotationCode,
approvedSnapshotAvailable: Boolean(payload.approvedSnapshot),
approvedTemplateVersionId: payload.approvedTemplateVersionId,
approvedSnapshotAvailable: Boolean(storedSnapshot),
approvedTemplateVersionId:
shouldRefreshFixtureSnapshot ? computedSnapshot.templateVersionId : payload.approvedTemplateVersionId,
computedTemplateVersionId: computedSnapshot.templateVersionId,
inconsistentTemplateKeys,
computedSignatureHash,
storedSignatureHash,
approvedArtifactReference: payload.approvedArtifactReference
approvedArtifactReference: payload.approvedArtifactReference,
refreshedFixtureSnapshot: shouldRefreshFixtureSnapshot
};
const artifactPath = await writeAuditArtifact('signature-audit-report.json', report);