You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sims-hq/apps/hq/src/repos-branches.ts

67 lines
2.8 KiB
TypeScript

import { uuidv7 } from '@sims/domain'
import { writeAudit } from './audit'
import type { DB } from './db'
/** Client branches (D20 — APEX ho_branch_list parity): minimal, per-client, audited. */
export interface Branch {
id: string; clientId: string; name: string; code: string | null; active: boolean
}
interface BranchRow { id: string; client_id: string; name: string; code: string | null; active: number }
const toBranch = (r: BranchRow): Branch => ({
id: r.id, clientId: r.client_id, name: r.name, code: r.code, active: r.active === 1,
})
export async function listBranches(db: DB, clientId: string): Promise<Branch[]> {
const rows = await db.all<BranchRow>(
`SELECT * FROM client_branch WHERE client_id=? ORDER BY active DESC, name`, clientId,
)
return rows.map(toBranch)
}
export async function createBranch(
db: DB, userId: string, input: { clientId: string; name: string; code?: string },
): Promise<Branch> {
return db.transaction(async () => {
if (input.name.trim() === '') throw new Error('Branch name is required')
const client = await db.get(`SELECT id FROM client WHERE id=?`, input.clientId)
if (client === undefined) throw new Error('Client not found')
const id = uuidv7()
await db.run(
`INSERT INTO client_branch (id, client_id, name, code, active) VALUES (?, ?, ?, ?, 1)`,
id, input.clientId, input.name.trim(),
input.code !== undefined && input.code.trim() !== '' ? input.code.trim() : null,
)
const branch = toBranch((await db.get<BranchRow>(`SELECT * FROM client_branch WHERE id=?`, id))!)
await writeAudit(db, userId, 'create', 'client_branch', id, undefined, branch)
return branch
})
}
export async function updateBranch(
db: DB, userId: string, id: string, patch: { name?: string; code?: string; active?: boolean },
): Promise<Branch> {
return db.transaction(async () => {
const beforeRow = await db.get<BranchRow>(`SELECT * FROM client_branch WHERE id=?`, id)
if (beforeRow === undefined) throw new Error('Branch not found')
const before = toBranch(beforeRow)
const sets: string[] = []
const args: unknown[] = []
if (patch.name !== undefined) {
if (patch.name.trim() === '') throw new Error('Branch name is required')
sets.push('name=?'); args.push(patch.name.trim())
}
if (patch.code !== undefined) { sets.push('code=?'); args.push(patch.code.trim() === '' ? null : patch.code.trim()) }
if (patch.active !== undefined) { sets.push('active=?'); args.push(patch.active ? 1 : 0) }
if (sets.length > 0) {
args.push(id)
await db.run(`UPDATE client_branch SET ${sets.join(', ')} WHERE id=?`, ...args)
}
const after = toBranch((await db.get<BranchRow>(`SELECT * FROM client_branch WHERE id=?`, id))!)
await writeAudit(db, userId, 'update', 'client_branch', id, before, after)
return after
})
}