auditing
This commit is contained in:
@@ -2,6 +2,7 @@ import { Prisma } from "@prisma/client";
|
||||
import type { PurchaseLineInput, PurchaseOrderDetailDto, PurchaseOrderInput, PurchaseOrderStatus, PurchaseOrderSummaryDto, PurchaseVendorOptionDto } from "@mrp/shared";
|
||||
import type { PurchaseReceiptDto, PurchaseReceiptInput } from "@mrp/shared/dist/purchasing/types.js";
|
||||
|
||||
import { logAuditEvent } from "../../lib/audit.js";
|
||||
import { prisma } from "../../lib/prisma.js";
|
||||
|
||||
const purchaseOrderModel = prisma.purchaseOrder;
|
||||
@@ -530,7 +531,7 @@ export async function getPurchaseOrderById(documentId: string) {
|
||||
return record ? mapPurchaseOrder(record as unknown as PurchaseOrderRecord) : null;
|
||||
}
|
||||
|
||||
export async function createPurchaseOrder(payload: PurchaseOrderInput) {
|
||||
export async function createPurchaseOrder(payload: PurchaseOrderInput, actorId?: string | null) {
|
||||
const validatedLines = await validateLines(payload.lines);
|
||||
if (!validatedLines.ok) {
|
||||
return { ok: false as const, reason: validatedLines.reason };
|
||||
@@ -564,10 +565,25 @@ export async function createPurchaseOrder(payload: PurchaseOrderInput) {
|
||||
});
|
||||
|
||||
const detail = await getPurchaseOrderById(created.id);
|
||||
if (detail) {
|
||||
await logAuditEvent({
|
||||
actorId,
|
||||
entityType: "purchase-order",
|
||||
entityId: created.id,
|
||||
action: "created",
|
||||
summary: `Created purchase order ${detail.documentNumber}.`,
|
||||
metadata: {
|
||||
documentNumber: detail.documentNumber,
|
||||
vendorId: detail.vendorId,
|
||||
status: detail.status,
|
||||
total: detail.total,
|
||||
},
|
||||
});
|
||||
}
|
||||
return detail ? { ok: true as const, document: detail } : { ok: false as const, reason: "Unable to load saved purchase order." };
|
||||
}
|
||||
|
||||
export async function updatePurchaseOrder(documentId: string, payload: PurchaseOrderInput) {
|
||||
export async function updatePurchaseOrder(documentId: string, payload: PurchaseOrderInput, actorId?: string | null) {
|
||||
const existing = await purchaseOrderModel.findUnique({
|
||||
where: { id: documentId },
|
||||
select: { id: true },
|
||||
@@ -609,10 +625,25 @@ export async function updatePurchaseOrder(documentId: string, payload: PurchaseO
|
||||
});
|
||||
|
||||
const detail = await getPurchaseOrderById(documentId);
|
||||
if (detail) {
|
||||
await logAuditEvent({
|
||||
actorId,
|
||||
entityType: "purchase-order",
|
||||
entityId: documentId,
|
||||
action: "updated",
|
||||
summary: `Updated purchase order ${detail.documentNumber}.`,
|
||||
metadata: {
|
||||
documentNumber: detail.documentNumber,
|
||||
vendorId: detail.vendorId,
|
||||
status: detail.status,
|
||||
total: detail.total,
|
||||
},
|
||||
});
|
||||
}
|
||||
return detail ? { ok: true as const, document: detail } : { ok: false as const, reason: "Unable to load saved purchase order." };
|
||||
}
|
||||
|
||||
export async function updatePurchaseOrderStatus(documentId: string, status: PurchaseOrderStatus) {
|
||||
export async function updatePurchaseOrderStatus(documentId: string, status: PurchaseOrderStatus, actorId?: string | null) {
|
||||
const existing = await purchaseOrderModel.findUnique({
|
||||
where: { id: documentId },
|
||||
select: { id: true },
|
||||
@@ -629,6 +660,19 @@ export async function updatePurchaseOrderStatus(documentId: string, status: Purc
|
||||
});
|
||||
|
||||
const detail = await getPurchaseOrderById(documentId);
|
||||
if (detail) {
|
||||
await logAuditEvent({
|
||||
actorId,
|
||||
entityType: "purchase-order",
|
||||
entityId: documentId,
|
||||
action: "status.updated",
|
||||
summary: `Updated purchase order ${detail.documentNumber} to ${status}.`,
|
||||
metadata: {
|
||||
documentNumber: detail.documentNumber,
|
||||
status,
|
||||
},
|
||||
});
|
||||
}
|
||||
return detail ? { ok: true as const, document: detail } : { ok: false as const, reason: "Unable to load updated purchase order." };
|
||||
}
|
||||
|
||||
@@ -677,6 +721,22 @@ export async function createPurchaseReceipt(orderId: string, payload: PurchaseRe
|
||||
});
|
||||
|
||||
const detail = await getPurchaseOrderById(orderId);
|
||||
if (detail) {
|
||||
await logAuditEvent({
|
||||
actorId: createdById,
|
||||
entityType: "purchase-order",
|
||||
entityId: orderId,
|
||||
action: "receipt.created",
|
||||
summary: `Received material against purchase order ${detail.documentNumber}.`,
|
||||
metadata: {
|
||||
documentNumber: detail.documentNumber,
|
||||
warehouseId: payload.warehouseId,
|
||||
locationId: payload.locationId,
|
||||
receivedAt: payload.receivedAt,
|
||||
lineCount: payload.lines.length,
|
||||
},
|
||||
});
|
||||
}
|
||||
return detail ? { ok: true as const, document: detail } : { ok: false as const, reason: "Unable to load updated purchase order." };
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user