2026-03-19 12:08:00 +00:00
|
|
|
import { Dispute, DisputeEvent } from './dispute-flow.model';
|
|
|
|
|
import { db } from '../db';
|
2026-03-19 07:08:09 +00:00
|
|
|
|
|
|
|
|
export class DisputeFlowService {
|
2026-03-19 12:08:00 +00:00
|
|
|
async createDispute(disputeData: Partial<Dispute>): Promise<Dispute> {
|
|
|
|
|
const query = `
|
|
|
|
|
INSERT INTO disputes
|
|
|
|
|
(deal_id, opened_by_user_id, status, reason_code, summary, requested_outcome)
|
|
|
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
|
|
|
RETURNING *
|
|
|
|
|
`;
|
2026-03-19 07:08:09 +00:00
|
|
|
|
2026-03-19 12:08:00 +00:00
|
|
|
const values = [
|
|
|
|
|
disputeData.dealId,
|
|
|
|
|
disputeData.openedByUserId,
|
|
|
|
|
disputeData.status || 'open',
|
|
|
|
|
disputeData.reasonCode,
|
|
|
|
|
disputeData.summary,
|
|
|
|
|
disputeData.requestedOutcome
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const result = await db.query(query, values);
|
|
|
|
|
return result.rows[0];
|
2026-03-19 07:08:09 +00:00
|
|
|
}
|
|
|
|
|
|
2026-03-19 12:08:00 +00:00
|
|
|
async addEvidence(disputeId: number, evidenceData: any, actorUserId: number): Promise<void> {
|
|
|
|
|
// Insert evidence as a new event
|
|
|
|
|
const query = `
|
|
|
|
|
INSERT INTO dispute_events
|
|
|
|
|
(dispute_id, event_type, actor_user_id, payload_json)
|
|
|
|
|
VALUES (?, ?, ?, ?)
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const values = [
|
|
|
|
|
disputeId,
|
|
|
|
|
'evidence',
|
|
|
|
|
actorUserId,
|
|
|
|
|
JSON.stringify(evidenceData)
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
await db.query(query, values);
|
2026-03-19 07:08:09 +00:00
|
|
|
}
|
|
|
|
|
|
2026-03-19 12:08:00 +00:00
|
|
|
async updateDisputeStatus(disputeId: number, newStatus: string, actorUserId: number): Promise<void> {
|
|
|
|
|
// Update the dispute status
|
|
|
|
|
const query = `
|
|
|
|
|
UPDATE disputes
|
|
|
|
|
SET status = ?
|
|
|
|
|
WHERE id = ?
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
await db.query(query, [newStatus, disputeId]);
|
|
|
|
|
|
|
|
|
|
// Log the status change as an event
|
|
|
|
|
const eventQuery = `
|
|
|
|
|
INSERT INTO dispute_events
|
|
|
|
|
(dispute_id, event_type, actor_user_id, payload_json)
|
|
|
|
|
VALUES (?, ?, ?, ?)
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const values = [
|
|
|
|
|
disputeId,
|
|
|
|
|
'status_change',
|
|
|
|
|
actorUserId,
|
|
|
|
|
JSON.stringify({ newStatus })
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
await db.query(eventQuery, values);
|
2026-03-19 07:08:09 +00:00
|
|
|
}
|
|
|
|
|
|
2026-03-19 12:08:00 +00:00
|
|
|
async resolveDispute(disputeId: number, decisionData: any, actorUserId: number): Promise<void> {
|
|
|
|
|
// Update the dispute with final decision
|
|
|
|
|
const query = `
|
|
|
|
|
UPDATE disputes
|
|
|
|
|
SET status = 'resolved',
|
|
|
|
|
final_decision = ?,
|
|
|
|
|
final_reason = ?,
|
|
|
|
|
decided_by_user_id = ?,
|
|
|
|
|
decided_at = NOW()
|
|
|
|
|
WHERE id = ?
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
await db.query(query, [
|
|
|
|
|
decisionData.decision,
|
|
|
|
|
decisionData.decisionReason,
|
|
|
|
|
actorUserId,
|
2026-03-19 07:08:09 +00:00
|
|
|
disputeId
|
2026-03-19 12:08:00 +00:00
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// Log the resolution as an event
|
|
|
|
|
const eventQuery = `
|
|
|
|
|
INSERT INTO dispute_events
|
|
|
|
|
(dispute_id, event_type, actor_user_id, payload_json)
|
|
|
|
|
VALUES (?, ?, ?, ?)
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const values = [
|
|
|
|
|
disputeId,
|
|
|
|
|
'resolved',
|
|
|
|
|
actorUserId,
|
|
|
|
|
JSON.stringify(decisionData)
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
await db.query(eventQuery, values);
|
2026-03-19 07:08:09 +00:00
|
|
|
}
|
|
|
|
|
|
2026-03-19 12:08:00 +00:00
|
|
|
async getDisputeById(disputeId: number): Promise<Dispute | null> {
|
|
|
|
|
const query = 'SELECT * FROM disputes WHERE id = ?';
|
|
|
|
|
const result = await db.query(query, [disputeId]);
|
|
|
|
|
return result.rows[0] || null;
|
2026-03-19 07:08:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async getDisputeEvents(disputeId: number): Promise<DisputeEvent[]> {
|
2026-03-19 12:08:00 +00:00
|
|
|
const query = 'SELECT * FROM dispute_events WHERE dispute_id = ? ORDER BY created_at ASC';
|
|
|
|
|
const result = await db.query(query, [disputeId]);
|
|
|
|
|
return result.rows;
|
2026-03-19 07:08:09 +00:00
|
|
|
}
|
|
|
|
|
}
|