pdf task-h

This commit is contained in:
phaichayon
2026-06-19 15:09:58 +07:00
parent a85d24235c
commit fd01ebf7c7
35 changed files with 3905 additions and 133 deletions

View File

@@ -0,0 +1,81 @@
import {
buildAuditPayload,
buildComputedSnapshotPayload,
computePayloadHash,
createSqlClient,
summarizeIssues,
writeAuditArtifact
} from './pdf-audit-utils.ts';
function pickComparablePayload(payload: Record<string, unknown>) {
return {
templateInput: payload.templateInput,
topicInputKeys:
payload.topicInputs && typeof payload.topicInputs === 'object'
? Object.keys(payload.topicInputs as Record<string, unknown>).sort()
: []
};
}
async function main() {
const sql = createSqlClient();
try {
const payload = await buildAuditPayload(sql);
const previewPayload = pickComparablePayload({
templateInput: payload.templateInput,
topicInputs: payload.topicInputs
});
const generationPayload = pickComparablePayload({
templateInput: payload.templateInput,
topicInputs: payload.topicInputs
});
const computedSnapshot = buildComputedSnapshotPayload(payload, {
generatedAt: 'audit-generated',
generatedBy: 'audit-suite'
});
const snapshotPayload = pickComparablePayload({
templateInput: computedSnapshot.templateInput,
topicInputs: payload.topicInputs
});
const previewHash = computePayloadHash(previewPayload);
const generationHash = computePayloadHash(generationPayload);
const snapshotHash = computePayloadHash(snapshotPayload);
const mismatches = [
previewHash !== generationHash ? 'preview:generation' : null,
generationHash !== snapshotHash ? 'generation:snapshot' : null,
previewHash !== snapshotHash ? 'preview:snapshot' : null
].filter(Boolean);
const signatureKeys = ['preparedBy', 'approvedBy', 'authorizedBy'];
const signatureParity = signatureKeys.every((key) => {
const signatures = payload.documentData.signatures as Record<string, unknown>;
return key in signatures;
});
const status = summarizeIssues([
mismatches.length ? 'FAIL' : 'PASS',
signatureParity ? 'PASS' : 'FAIL'
]);
const report = {
audit: 'payload-parity',
overallStatus: status,
quotationCode: payload.quotationCode,
previewHash,
generationHash,
snapshotHash,
mismatches,
comparableFieldCount: Object.keys(payload.templateInput).length,
topicInputKeyCount: Object.keys(payload.topicInputs).length,
signatureParity
};
const artifactPath = await writeAuditArtifact('payload-parity-report.json', report);
console.log(JSON.stringify({ ...report, artifactPath }, null, 2));
} finally {
await sql.end({ timeout: 5 });
}
}
main().catch((error) => {
console.error(`[audit-payload-parity] ${error.message}`);
process.exit(1);
});