Add customer contract clearance console
This commit is contained in:
@@ -15,6 +15,8 @@ const lastFramePath = `${sourceRoot}/actual-last-frame.jpg`;
|
||||
const manifestPath = `${sourceRoot}/manifest.json`;
|
||||
const batchId = `delivery-clearance-batch-${runId}`;
|
||||
const voiceId = `voice-clearance-${runId}`;
|
||||
const customerId = `cust-clearance-${runId}`;
|
||||
const contractId = `contract-clearance-${runId}`;
|
||||
|
||||
const createdAssetIds = [];
|
||||
let deliveryId = "";
|
||||
@@ -85,6 +87,11 @@ async function bind(headers, assetId, shotId, usageRole) {
|
||||
|
||||
function cleanup() {
|
||||
withTransaction(() => {
|
||||
dbRun("DELETE FROM contract_license_events WHERE contract_id = ? OR customer_id = ? OR project_id = ?", [contractId, customerId, projectId]);
|
||||
dbRun("DELETE FROM contract_project_bindings WHERE contract_id = ? OR project_id = ?", [contractId, projectId]);
|
||||
dbRun("DELETE FROM production_contracts WHERE id = ?", [contractId]);
|
||||
dbRun("DELETE FROM customer_contacts WHERE customer_id = ?", [customerId]);
|
||||
dbRun("DELETE FROM customers WHERE id = ?", [customerId]);
|
||||
dbRun("DELETE FROM delivery_clearance_reports WHERE project_id = ?", [projectId]);
|
||||
dbRun("DELETE FROM delivery_releases WHERE project_id = ?", [projectId]);
|
||||
dbRun("DELETE FROM delivery_batch_items WHERE batch_id = ?", [batchId]);
|
||||
@@ -115,6 +122,44 @@ function cleanup() {
|
||||
});
|
||||
}
|
||||
|
||||
function seedContractClearance() {
|
||||
const timestamp = new Date().toISOString();
|
||||
dbRun(
|
||||
"INSERT OR IGNORE INTO customers(id, organization_id, name, legal_name, code, customer_type, status, industry, region, billing_email, tax_id, notes, tags_json, metadata_json, created_by, created_at, updated_at) VALUES (?, ?, ?, ?, ?, 'internal', 'active', 'AI 短剧', 'CN', 'clearance@example.local', '', 'delivery clearance smoke customer', '[\"smoke\",\"clearance\"]', '{}', ?, ?, ?)",
|
||||
[customerId, organizationId, `清算烟测客户 ${runId}`, `清算烟测客户 ${runId} 有限公司`, `CLR-${runId}`, producerUserId(), timestamp, timestamp]
|
||||
);
|
||||
dbRun(
|
||||
"INSERT OR IGNORE INTO production_contracts(id, organization_id, customer_id, contract_number, title, contract_type, status, approval_status, effective_at, expires_at, signed_at, currency, amount, license_scope_json, rights_json, delivery_terms_json, evidence_json, risk_json, approval_note, created_by, updated_by, created_at, updated_at) VALUES (?, ?, ?, ?, ?, 'production_license', 'active', 'approved', ?, ?, ?, 'CNY', 0, ?, ?, ?, ?, ?, 'smoke clearance contract', ?, ?, ?, ?)",
|
||||
[
|
||||
contractId,
|
||||
organizationId,
|
||||
customerId,
|
||||
`CLR-CTR-${runId}`,
|
||||
`清算烟测授权 ${runId}`,
|
||||
new Date(Date.now() - 86400000).toISOString(),
|
||||
new Date(Date.now() + 365 * 86400000).toISOString(),
|
||||
timestamp,
|
||||
JSON.stringify({ channels: ["local-file", "private-delivery-portal"], territories: ["CN"], deliverables: ["vertical-video", "delivery-manifest"], platforms: ["internal-review"], exclusive: false, commercialUse: true, language: ["zh-CN"] }),
|
||||
JSON.stringify({ originalStory: true, derivativeProduction: true, aiGeneratedAssetsAllowed: true, voiceCloneAllowed: false, fixedVoiceRequired: true, singleFramePolicyRequired: true }),
|
||||
JSON.stringify({ customerPortalAllowed: true, requireClearanceCertificate: true }),
|
||||
JSON.stringify({ contractRef: `smoke://contract/${runId}`, rightsEvidenceRef: `smoke://rights/${runId}`, signedCopyPath: `storage/contracts/smoke/${runId}.json` }),
|
||||
JSON.stringify({ paidCloudAllowed: false, publicModelAllowed: false, rightsReview: "passed" }),
|
||||
producerUserId(),
|
||||
producerUserId(),
|
||||
timestamp,
|
||||
timestamp
|
||||
]
|
||||
);
|
||||
dbRun(
|
||||
"INSERT OR IGNORE INTO contract_project_bindings(id, organization_id, workspace_id, project_id, contract_id, customer_id, usage_mode, status, notes, created_by, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, 'primary-license', 'active', 'delivery clearance smoke binding', ?, ?, ?)",
|
||||
[`contract-binding-clearance-${runId}`, organizationId, workspaceId, projectId, contractId, customerId, producerUserId(), timestamp, timestamp]
|
||||
);
|
||||
}
|
||||
|
||||
function producerUserId() {
|
||||
return dbGet("SELECT id FROM users WHERE email = ?", ["producer@local.test"])?.id || "u-owner";
|
||||
}
|
||||
|
||||
try {
|
||||
cleanup();
|
||||
const ownerBase = await login("producer@local.test");
|
||||
@@ -236,6 +281,7 @@ try {
|
||||
notes: "清算烟测批准"
|
||||
})
|
||||
}), "approve knowledge source");
|
||||
seedContractClearance();
|
||||
|
||||
const passedClearance = expectStatus(await request(`/api/production/deliveries/${encodeURIComponent(deliveryId)}/clearance`, { method: "POST", headers: scopedHeaders, body: "{}" }), 201, "run passed clearance");
|
||||
assert.equal(passedClearance.clearance.status, "pass", "all commercial gates should pass after evidence is fixed");
|
||||
|
||||
Reference in New Issue
Block a user