const { Card, Input, Select, Textarea, Button, Icon, Checkbox, Switch, Tag, Avatar, SearchField, ChecklistPanel, Badge, PriorityBadge, SectorTag, FileDropzone, Modal, StatusPill } = window.ACRFlowDesignSystem_ba1e9c; const RECUR_MAP = { "Não recorrente": "none", "Diária": "daily", "Semanal": "weekly", "Mensal": "monthly", "Anual": "yearly", "Personalizada": "custom" }; function NewDemandScreen({ onCancel, onCreate, onToast, user }) { const D = window.useStore(); const S = window.ACRStore; const sectors = (D.sectorsCfg || []).filter((s) => s.active !== false); const companies = (D.companies || []).filter((c) => c.active !== false); const [enviando, setEnviando] = React.useState(false); const [sector, setSector] = React.useState((sectors[0] || {}).id); const [category, setCategory] = React.useState(((sectors[0] || {}).categories || [])[0] || ""); const [title, setTitle] = React.useState(""); const [description, setDescription] = React.useState(""); const [tags, setTags] = React.useState([]); const [newTag, setNewTag] = React.useState(""); const [addingTag, setAddingTag] = React.useState(false); const [priority, setPriority] = React.useState("normal"); const [due, setDue] = React.useState(""); const [company, setCompany] = React.useState(""); const [linked, setLinked] = React.useState([]); const [owner, setOwner] = React.useState(""); const [extras, setExtras] = React.useState([]); const [personQ, setPersonQ] = React.useState(""); const [recur, setRecur] = React.useState("Não recorrente"); const [recurDay, setRecurDay] = React.useState("25"); const [autoRecur, setAutoRecur] = React.useState(true); const [anexos, setAnexos] = React.useState([]); const [confirm, setConfirm] = React.useState(false); const [items, setItems] = React.useState([]); const current = sectors.find((s) => s.id === sector) || sectors[0] || { id: "", name: "", categories: [] }; React.useEffect(() => { setCategory(current.categories[0] || ""); }, [sector]); const notRecurring = recur === "Não recorrente"; React.useEffect(() => { if (notRecurring) setAutoRecur(false); }, [recur]); const sectorExtras = { "departamento-pessoal": ["Colaborador"] }[sector] || []; const peopleOptions = personQ.trim().length === 0 ? [] : (D.team || []).filter((t) => t.active !== false && t.name !== owner && !extras.includes(t.name) && t.name.toLowerCase().includes(personQ.trim().toLowerCase())); const missing = [!title.trim() && "Título", !description.trim() && "Descrição detalhada", !due && "Prazo de entrega", !category && "Atividade", !owner && "Responsável principal"].filter(Boolean); const valid = missing.length === 0; const submit = async () => { const time = D.team || []; const idDe = (nome) => (time.find((u) => u.name === nome) || {}).id; const principal = idDe(owner); const responsaveis = [principal, ...extras.map(idDe)].filter(Boolean); if (S.online() && responsaveis.length === 0) { onToast({ tone: "danger", title: "Informe o responsável", message: "Toda demanda precisa de ao menos um responsável cadastrado." }); return; } const catId = ((D.catIds || {})[sector] || {})[category]; const empresa = company || undefined; setEnviando(true); const r = await S.criarDemanda({ title: title.trim(), description: description.trim() || undefined, sectorId: sector, categoryId: catId, companyId: empresa, priorityId: priority, requester: (user && user.name) || undefined, deadline: due || undefined, assigneeIds: responsaveis, primaryAssigneeId: principal, tags, recurrence: { type: RECUR_MAP[recur] || "none", day: Number(recurDay) || undefined, auto: !!autoRecur }, checklist: items.filter((i) => i.text && i.text.trim()).map((i) => ({ text: i.text.trim(), ownerId: idDe(i.owner), dueDate: i.due || undefined })), }); setEnviando(false); if (!r.ok) { onToast({ tone: "danger", title: "Não foi possível criar a demanda", message: r.error }); return; } setConfirm(false); const num = r.demanda && r.demanda.id ? r.demanda.id : ""; onToast({ tone: "success", title: num ? "Demanda " + num + " criada" : "Demanda criada", message: owner ? owner + " é o responsável principal." : "Registrada com sucesso." }); onCreate(); }; const dueBR = due ? due.split("-").reverse().join("/") : "—"; return (

Nova demanda

O número é gerado automaticamente ao salvar: DEM-2026-000145
Setor *
{sectors.map((s) => ( ))}
setTitle(e.target.value)} placeholder="Ex.: Emissão de boleto — Alpha" />