diff --git a/convex/schema.ts b/convex/schema.ts index 2126fb6..a6beda2 100644 --- a/convex/schema.ts +++ b/convex/schema.ts @@ -82,6 +82,7 @@ export default defineSchema({ contacts: v.optional(v.any()), locations: v.optional(v.any()), sla: v.optional(v.any()), + reopenWindowDays: v.optional(v.number()), tags: v.optional(v.array(v.string())), customFields: v.optional(v.any()), notes: v.optional(v.string()), diff --git a/convex/tickets.ts b/convex/tickets.ts index fa79353..5fb123d 100644 --- a/convex/tickets.ts +++ b/convex/tickets.ts @@ -3175,7 +3175,18 @@ export async function resolveTicketHandler( throw new ConvexError("Chamado vinculado não encontrado") } - const reopenDays = resolveReopenWindowDays(reopenWindowDays) + // Buscar prazo de reabertura da empresa do ticket (se existir) + let companyReopenDays: number | null = null + if (ticketDoc.companyId) { + const company = await ctx.db.get(ticketDoc.companyId) + if (company && typeof company.reopenWindowDays === "number") { + companyReopenDays = company.reopenWindowDays + } + } + + // Prioridade: 1) valor passado explicitamente, 2) valor da empresa, 3) padrão + const effectiveReopenDays = reopenWindowDays ?? companyReopenDays + const reopenDays = resolveReopenWindowDays(effectiveReopenDays) const reopenDeadline = computeReopenDeadline(now, reopenDays) const normalizedStatus = "RESOLVED" const relatedIdList = Array.from( diff --git a/src/components/admin/companies/admin-companies-manager.tsx b/src/components/admin/companies/admin-companies-manager.tsx index 53de367..b1daf38 100644 --- a/src/components/admin/companies/admin-companies-manager.tsx +++ b/src/components/admin/companies/admin-companies-manager.tsx @@ -238,6 +238,7 @@ function emptyCompany(tenantId: string): CompanyFormValues { customFields: [], notes: null, isAvulso: false, + reopenWindowDays: 7, } } @@ -1232,18 +1233,37 @@ export function CompanySheet({ tenantId, editor, onClose, onCreated, onUpdated } /> -
- - - +
+
+ + + +
+
+ + +

+ Dias que o cliente pode reabrir tickets resolvidos. +

+ +
form.setValue("isAvulso", Boolean(checked))} /> diff --git a/src/components/tickets/close-ticket-dialog.tsx b/src/components/tickets/close-ticket-dialog.tsx index e6a7c9a..1403492 100644 --- a/src/components/tickets/close-ticket-dialog.tsx +++ b/src/components/tickets/close-ticket-dialog.tsx @@ -545,8 +545,7 @@ export function CloseTicketDialog({ Boolean(selectedTemplateId) || shouldAdjustTime || adjustReason.trim().length > 0 || - linkedReference.trim().length > 0 || - reopenWindowDays !== "14" + linkedReference.trim().length > 0 const canSaveDraft = hasFormChanges && !isSubmitting @@ -651,12 +650,10 @@ export function CloseTicketDialog({ onWorkSummaryAdjusted?.(result) } - const reopenDaysNumber = Number(reopenWindowDays) await resolveTicketMutation({ ticketId: ticketId as unknown as Id<"tickets">, actorId, resolvedWithTicketId: linkedTicketCandidate ? (linkedTicketCandidate.id as Id<"tickets">) : undefined, - reopenWindowDays: Number.isFinite(reopenDaysNumber) ? reopenDaysNumber : undefined, }) await addComment({ ticketId: ticketId as unknown as Id<"tickets">, @@ -886,21 +883,6 @@ export function CloseTicketDialog({

) : null}
-
- - -

Após esse período o ticket não poderá ser reaberto automaticamente.

-
diff --git a/src/lib/schemas/company.ts b/src/lib/schemas/company.ts index 678f577..0510d8d 100644 --- a/src/lib/schemas/company.ts +++ b/src/lib/schemas/company.ts @@ -384,6 +384,7 @@ export const companyFormSchema = z.object({ customFields: z.array(customFieldSchema).default([]), notes: z.string().trim().nullable().optional(), isAvulso: z.boolean().default(false), + reopenWindowDays: z.number().int().min(1).max(90).nullable().optional(), }) export type CompanyFormValues = z.infer