Add audit start and end dates to audits

ISO audits often span a window distinct from certificate validity.
Store optional audit_start_date and audit_end_date on the audit
record and expose them through GraphQL, MCP, CLI, n8n, and console.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
This commit is contained in:
Cursor Agent
2026-07-28 14:35:36 +00:00
committed by Bryan Frimin
parent dcb7ffa945
commit fe215efbd1
25 changed files with 385 additions and 28 deletions

View File

@@ -1670,7 +1670,7 @@
"messages": { "success": "Success", "error": "Error", "updated": "Audit updated successfully" },
"deleteReportConfirmation": "This will permanently delete the audit report \"{{name}}\". This action cannot be undone.",
"states": { "not_started": "Not Started", "in_progress": "In Progress", "completed": "Completed", "rejected": "Rejected", "outdated": "Outdated" },
"fields": { "name": "Name", "namePlaceholder": "Audit name", "state": "State", "validFrom": "Valid From", "validUntil": "Valid Until" },
"fields": { "name": "Name", "namePlaceholder": "Audit name", "state": "State", "validFrom": "Valid From", "validUntil": "Valid Until", "auditStartDate": "Audit Start Date", "auditEndDate": "Audit End Date" },
"actions": { "delete": "Delete", "update": "Update", "updating": "Updating...", "download": "Download" },
"report": { "title": "Audit Report", "uploaded": "Uploaded {{date}}", "uploadDescription": "Upload the final audit report document (PDF recommended)", "dropzoneDescription": "Only PDF up to 25MB are allowed" }
},
@@ -1691,7 +1691,7 @@
"errors": { "create": "Failed to create audit" },
"fileSize": "{{value}} MB",
"loading": "Loading...",
"fields": { "framework": "Framework", "frameworkPlaceholder": "Select a framework", "name": "Name", "namePlaceholder": "Audit name", "state": "State", "validFrom": "Valid From", "validUntil": "Valid Until" },
"fields": { "framework": "Framework", "frameworkPlaceholder": "Select a framework", "name": "Name", "namePlaceholder": "Audit name", "state": "State", "validFrom": "Valid From", "validUntil": "Valid Until", "auditStartDate": "Audit Start Date", "auditEndDate": "Audit End Date" },
"states": { "not_started": "Not Started", "in_progress": "In Progress", "completed": "Completed", "rejected": "Rejected", "outdated": "Outdated" },
"actions": { "create": "Create" }
},

View File

@@ -3441,7 +3441,9 @@
"namePlaceholder": "Nom de l’audit",
"state": "État",
"validFrom": "Valide à partir de",
"validUntil": "Valide jusqu’au"
"validUntil": "Valide jusqu’au",
"auditStartDate": "Date de début de l’audit",
"auditEndDate": "Date de fin de l’audit"
},
"actions": {
"delete": "Supprimer",
@@ -3519,7 +3521,9 @@
"namePlaceholder": "Nom de l’audit",
"state": "État",
"validFrom": "Valide à partir de",
"validUntil": "Valide jusqu’au"
"validUntil": "Valide jusqu’au",
"auditStartDate": "Date de début de l’audit",
"auditEndDate": "Date de fin de l’audit"
},
"states": {
"not_started": "Non commencé",

View File

@@ -47,6 +47,8 @@ export const auditNodeQuery = graphql`
name
validFrom
validUntil
auditStartDate
auditEndDate
reportFile {
id
fileName
@@ -91,6 +93,8 @@ export const createAuditMutation = graphql`
name
validFrom
validUntil
auditStartDate
auditEndDate
reportFile {
id
fileName
@@ -117,6 +121,8 @@ export const updateAuditMutation = graphql`
name
validFrom
validUntil
auditStartDate
auditEndDate
reportFile {
id
fileName
@@ -186,6 +192,8 @@ export const useCreateAudit = (connectionId: string) => {
name?: string | null;
validFrom?: string;
validUntil?: string;
auditStartDate?: string;
auditEndDate?: string;
reportKey?: string;
state?: string;
file?: File | null;
@@ -205,6 +213,8 @@ export const useCreateAudit = (connectionId: string) => {
name: input.name,
validFrom: input.validFrom,
validUntil: input.validUntil,
auditStartDate: input.auditStartDate,
auditEndDate: input.auditEndDate,
reportKey: input.reportKey,
state: input.state || "NOT_STARTED",
file: input.file ? null : undefined,
@@ -226,6 +236,8 @@ export const useUpdateAudit = () => {
name?: string | null;
validFrom?: string | null;
validUntil?: string | null;
auditStartDate?: string | null;
auditEndDate?: string | null;
state?: string;
}) => {
if (!input.id) {

View File

@@ -69,6 +69,8 @@ const updateAuditSchema = z.object({
name: z.string().nullable().optional(),
validFrom: z.string().optional(),
validUntil: z.string().optional(),
auditStartDate: z.string().optional(),
auditEndDate: z.string().optional(),
state: z.enum([
"NOT_STARTED",
"IN_PROGRESS",
@@ -104,6 +106,8 @@ export default function AuditDetailsPage(props: Props) {
name: auditEntry.name || null,
validFrom: auditEntry.validFrom?.split("T")[0] || "",
validUntil: auditEntry.validUntil?.split("T")[0] || "",
auditStartDate: auditEntry.auditStartDate?.split("T")[0] || "",
auditEndDate: auditEntry.auditEndDate?.split("T")[0] || "",
state: auditEntry.state || "NOT_STARTED",
},
});
@@ -123,6 +127,8 @@ export default function AuditDetailsPage(props: Props) {
name: formData.name || null,
validFrom: formatDatetime(formData.validFrom) ?? null,
validUntil: formatDatetime(formData.validUntil) ?? null,
auditStartDate: formatDatetime(formData.auditStartDate) ?? null,
auditEndDate: formatDatetime(formData.auditEndDate) ?? null,
state: formData.state,
});
reset(formData);
@@ -243,6 +249,14 @@ export default function AuditDetailsPage(props: Props) {
<Input {...register("validUntil")} type="date" />
</Field>
<Field label={t("auditDetailsPage.fields.auditStartDate")}>
<Input {...register("auditStartDate")} type="date" />
</Field>
<Field label={t("auditDetailsPage.fields.auditEndDate")}>
<Input {...register("auditEndDate")} type="date" />
</Field>
<div className="flex justify-end">
{formState.isDirty && auditEntry.canUpdate && (
<Button type="submit" disabled={formState.isSubmitting}>

View File

@@ -92,6 +92,8 @@ export function CreateAuditDialog({
name: z.string().optional(),
validFrom: z.string().optional(),
validUntil: z.string().optional(),
auditStartDate: z.string().optional(),
auditEndDate: z.string().optional(),
state: z.enum([
"NOT_STARTED",
"IN_PROGRESS",
@@ -107,6 +109,8 @@ export function CreateAuditDialog({
name: "",
validFrom: "",
validUntil: "",
auditStartDate: "",
auditEndDate: "",
state: "NOT_STARTED",
},
});
@@ -122,6 +126,8 @@ export function CreateAuditDialog({
name: data.name || null,
validFrom: formatDatetime(data.validFrom),
validUntil: formatDatetime(data.validUntil),
auditStartDate: formatDatetime(data.auditStartDate),
auditEndDate: formatDatetime(data.auditEndDate),
state: data.state,
file: file ?? null,
});
@@ -229,6 +235,12 @@ export function CreateAuditDialog({
<Field label={t("createAuditDialog.fields.validUntil")}>
<Input {...register("validUntil")} type="date" />
</Field>
<Field label={t("createAuditDialog.fields.auditStartDate")}>
<Input {...register("auditStartDate")} type="date" />
</Field>
<Field label={t("createAuditDialog.fields.auditEndDate")}>
<Input {...register("auditEndDate")} type="date" />
</Field>
</DialogContent>
<DialogFooter>
<Button disabled={formState.isSubmitting} type="submit">
@@ -245,6 +257,8 @@ type FormSchema = {
name?: string;
validFrom?: string;
validUntil?: string;
auditStartDate?: string;
auditEndDate?: string;
state: "NOT_STARTED" | "IN_PROGRESS" | "COMPLETED" | "REJECTED" | "OUTDATED";
};