{"context":{"domain":"sodexo-ocr"},"layers":{"ApplicationLayer":{"reference":"ApplicationLayer","availableInstances":[{"reference":"ComponentsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"SystemsDataSet","params":{"filter":{"domain":"data2"},"pagination":{"size":1},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSource"}}}},{"reference":"ExternalComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"SystemsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5e3b796d6228227ca637d0f4","name":"data2","domain":"data2","organization":"62292184611f480b3191c37c","visibility":"public","updatedAt":"2026-07-27T14:19:36.810Z"}]}},{"reference":"OrganizationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"DataComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"OneFileComponentInstancesDataSet","params":{"pagination":{"size":1},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"FileComponentInstancesDataSource"}}}},{"reference":"ApplicationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ServiceComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@Data2TableDataSource","reference":"FileComponentInstancesDataSource","params":{"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}}]}},{"component":"data2-core@MemoryDataSource","reference":"EmptyDataSource","params":{"initialData":[]}},{"reference":"ComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"UserComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"DataComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ServiceComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ExternalComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ApplicationsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}}],"processesParams":{}},"HostApplicationLayer":{"reference":"HostApplicationLayer","availableInstances":[{"_id":"5f15ff190528b92601890f71","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"domain"}}},"pk":"_id","fields":[{"component":"data2-core-types@FieldReference","params":{"key":"_id"}},{"component":"data2-core-types@FieldReference","params":{"key":"name"}},{"component":"data2-core-types@FieldReference","params":{"key":"domain"}},{"component":"data2-core-types@FieldReference","params":{"key":"visibility"}},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.name"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.billingStatus"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.publicTrial.active"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"settings.defaultAccessPolicy"}}},"break":true}],"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticPagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"actions":[{"params":{"components":[{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@Series"}}}]},"reference":"SystemsDataSet","updatedAt":"2026-08-07T21:51:24.037Z","createdAt":"2020-07-20T20:31:21.838Z"},{"_id":"5f1601ce0528b92601890f7c","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":1000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"sort":{"params.package":1,"params.component":1},"pk":"_id","autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"staticFilter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"filter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}},"reference":"ComponentsDataSet","updatedAt":"2025-11-05T19:37:01.935Z","createdAt":"2020-07-20T20:42:54.898Z"},{"_id":"5f9041dbc8da12be8b94aea4","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":2000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"UserComponentsDataSet","updatedAt":"2025-11-06T21:06:58.095Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"65d8c4fabc9dbb8f94de8d53","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ExternalComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:23.742Z","createdAt":"2024-02-23T16:17:01.816Z"},{"reference":"SystemsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a96e197cc271edcd35493f6","name":"ocr","domain":"sodexo-ocr","visibility":"public","updatedAt":"2026-09-01T14:30:47.988Z","createdAt":"2026-09-01T14:30:47.988Z"}]}},{"reference":"ComponentsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5f52a278a575399a45d239b4","component":"data2-core-types@Component","params":{"package":"data2-core-primitives","component":"Router","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"goBack":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.goBack","args":[]}}}},"icon":{"component":"data2-core-primitives@String","params":{"content":"arrow-left"}},"visibility":"public"}},"goTo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"component":"data2-core-types@Reference","params":{"reference":"url"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}}}]}},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"url"}},{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}]},"break":true},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Path to route"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Path to redirect user"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Preserve Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Preserve query string parameters  preserve query parameters on navigating."}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}]}},"open":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"pathname":{"component":"data2-core-types@Reference","params":{"reference":"value"}}}]}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}]}},"close":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":"close"}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Closes a window that was opened via router.open."}}}}}}}}},{"_id":"620d28658271aa4129919d89","component":"data2-core-types@Component","params":{"package":"data2-interface-services","component":"DeviceController","interactions":{"params":{"fields":{"postMessage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}]},"component":"data2-core-types@ComponentParameter"},"print":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"zoom":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"zoom"}},"visibility":"public"}}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"share":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"clipboard.copy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"clipboard.paste":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"download":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}]},"component":"data2-core-types@ComponentParameter"},"downloadUrl":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}}}}]},"component":"data2-core-types@ComponentParameter"},"promptFiles":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"multiple":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Multiple"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Whether or not to allow selecting multiple files"}},"component":"data2-core-primitives@Boolean"}},"acceptedFormats":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted Formats"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Accepted file formats"}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"timeout":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timeout"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Max milliseconds to wait for file upload"}},"component":"data2-core-primitives@Number"}}}},"component":"data2-core-types@FieldSet"}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"meetingRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","definition":{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"meeting"}},"script":{"component":"data2-core-primitives@String","params":{"content":"(function() {\n  let mediaRecorder;\n  let audioChunks = [];\n  let combinedStream;\n  let audioContext;\n  \n  window.meetingCapture = async function() {\n    try {\n      // Solicitar acesso ao áudio da guia (e vídeo, que será ignorado depois)\n      const tabStream = await navigator.mediaDevices.getDisplayMedia({ \n        video: true, // Necessário para alguns navegadores\n        audio: true\n      });\n      \n      // Remover a trilha de vídeo\n      const tabAudioTrack = tabStream.getAudioTracks()[0];\n      \n      // Solicitar acesso ao microfone\n      const micStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      const micAudioTrack = micStream.getAudioTracks()[0];\n      \n      // Criar um novo MediaStream com ambas as trilhas de áudio\n      combinedStream = new MediaStream([tabAudioTrack, micAudioTrack]);\n      \n      // Criar um contexto de áudio para misturar os streams\n      audioContext = new AudioContext();\n      const destination = audioContext.createMediaStreamDestination();\n      \n      // Conectar a trilha de áudio da guia\n      const tabSource = audioContext.createMediaStreamSource(new MediaStream([tabAudioTrack]));\n      tabSource.connect(destination);\n      \n      // Conectar a trilha de áudio do microfone\n      const micSource = audioContext.createMediaStreamSource(new MediaStream([micAudioTrack]));\n      micSource.connect(destination);\n      \n      // Iniciar gravação com o stream misturado\n      mediaRecorder = new MediaRecorder(destination.stream);\n      audioChunks = [];\n      mediaRecorder.ondataavailable = (e) => audioChunks.push(e.data);\n      mediaRecorder.start();\n      \n      console.log('Gravação iniciada. Chame meetingCaptureStop() para finalizar.');\n    } catch (error) {\n      console.error('Erro ao iniciar a captura:', error);\n    }\n  };\n  \n  window.meetingCaptureStop = function() {\n    return new Promise((resolve, reject) => {\n      if (!mediaRecorder) {\n        reject('Nenhuma gravação em andamento.');\n        return;\n      }\n      \n      mediaRecorder.onstop = () => {\n        const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });\n        combinedStream.getTracks().forEach(track => track.stop());\n        audioContext.close();\n        \n        resolve(audioBlob);\n        console.log('Gravação finalizada. O arquivo de áudio está pronto para upload.');\n      };\n      \n      mediaRecorder.stop();\n    });\n  };\n})();"}}},"component":"data2-core-web@Script"},{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCapture"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"meetingRecordStop":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}],"definition":{"params":{"actions":[{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCaptureStop"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"notify":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"title":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"title"}}},"component":"data2-core-types@ComponentParameter"},"sound":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"sound"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}}},{"_id":"6a96f6dadb111ff24b700dfc","component":"data2-core-types@Component","system":"6a96e197cc271edcd35493f6","params":{"extends":"data2-core-primitives@Block","component":"preaction-roteiro","package":"sodexo-ocr","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const IMG = 'https://sodexo-ocr.data2.media/file/';\nconst P = {\n  foto: IMG + 'KngGeGQcONz5bCH9iycxK',\n  revisao: IMG + 'J6gbwd_Rk8wrxa6NWOyxJ',\n  naoEscala: IMG + 'VPLnk6kMOzGweZ1HI9Zek',\n  alimentos: IMG + 'Q6K1RR5GLLp_HLtsDquU1',\n  painel: IMG + 'G7Tc8dNPE9UWIqLh-6r-m',\n  detalhe: IMG + 'x1YV1tAec4jZjBDiu7eNo',\n  papel: IMG + 'cNo3E2JLaVBL9JxW9H3ha'\n};\nconst BASE = 'https://preaction.sodexo-ocr.next.data2.app';\n\nconst PASSOS = [\n  {\n    n: 1, t: '00:00 – 00:40', tit: 'Abra pelo problema, não pelo produto',\n    tela: 'Painel do gestor', url: BASE + '/painel', img: P.painel,\n    fazer: [\n      'Abra o painel <strong>antes</strong> de mostrar qualquer tela de cadastro.',\n      'Deixe o número 7 e os 41% na tela por alguns segundos, em silêncio.',\n      'Aponte a barra preta no meio do gráfico e diga o nome dela: a linha.'\n    ],\n    falar: 'Esses são 17 reportes de cinco unidades. Sete deles foram registrados como indicador preventivo, mas a descrição do próprio colaborador conta um acidente. Sem ninguém perceber, eles cruzaram a linha. Quarenta e um por cento.',\n    porque: 'Se você começar pela tela de cadastro, a conversa vira \"app de formulário\" e entra na fila de TI. Começando pelo número, vira compliance.'\n  },\n  {\n    n: 2, t: '00:40 – 01:40', tit: 'O reporte, do jeito que acontece na operação',\n    tela: 'Reportar · falar e conferir', url: BASE + '/?aba=voz', img: P.revisao,\n    fazer: [\n      'Volte para a tela de reporte pela seta no topo.',\n      'Clique em <strong>Falar o reporte</strong> e autorize o microfone.',\n      'Fale devagar, em tom de operação, o texto ao lado.',\n      'Pare de gravar e clique em <strong>Analisar reporte</strong>.',\n      'Mostre a tela de conferência e clique em <strong>Enviar reporte</strong>. Leia o protocolo em voz alta.'\n    ],\n    falar: 'Ó, é o seguinte. Eu tava tirando a assadeira do forno combinado, aí encostei o antebraço na grade quente. Ardeu bastante, ficou uma marca vermelha. Peguei gelo do kit de primeiros socorros e botei uma gaze. Continuei o turno normal. Tô reportando como quase acidente.',\n    nota: 'O texto acima é para <strong>você falar</strong>, não para ler na tela. Ele diz \"quase acidente\" e descreve uma queimadura tratada — guarde isso. Este evento <strong>não existe no histórico</strong>, então depois de enviar ele aparece como registro novo no topo do painel.',\n    porque: 'A dor que ele levantou primeiro foi o analfabetismo. Ver as palavras aparecendo enquanto se fala responde isso sem precisar explicar.'\n  },\n  {\n    n: 3, t: '01:40 – 02:20', tit: 'Repare no que ele NÃO viu',\n    tela: 'Reportar · tela de conferência', url: BASE + '/?caso=forno', img: P.revisao,\n    destaque: true,\n    fazer: [\n      'Volte à tela de conferência e percorra a tela inteira com o cursor.',\n      'Diga o que <strong>não</strong> está ali: nenhuma pirâmide, nenhum nível, nenhum aviso de que cruzou a linha.',\n      'Só então fale a frase ao lado.'\n    ],\n    falar: 'Olha o que o colaborador vê antes de enviar: o que ele falou e o formulário preenchido. Só isso. Ele não vê a classificação. Se visse que o quase acidente dele está virando acidente, ele voltaria e mudaria a história — por pressão do encarregado, por medo de perder o bônus, ou só por não querer dar trabalho. A classificação roda no servidor, no momento do envio, e vai direto para vocês.',\n    porque: 'Um gerente de SST sabe melhor que ninguém que indicador que o reportante enxerga é indicador que o reportante aprende a manipular. Mostrar que a ferramenta foi desenhada contra isso vale mais do que qualquer número de acurácia.'\n  },\n  {\n    n: 4, t: '02:20 – 03:00', tit: 'A operação que não tem tablet',\n    tela: 'Reportar · aba Fotografar o papel', url: BASE + '/?aba=foto', img: P.foto,\n    fazer: [\n      'Clique em <strong>Fazer outro reporte</strong> e vá na aba <strong>Fotografar o papel</strong>.',\n      'Escolha o arquivo do formulário preenchido (o print ao lado, item 4b).',\n      'Aguarde os três passos: enviando, lendo o manuscrito, classificando.',\n      'Mostre que ele leu os checkboxes E a descrição à mão. Envie também.'\n    ],\n    falar: 'A maior parte das unidades não tem tablet e não vai ter tão cedo. Aqui a Gerente de Unidade só bate a foto do papel que já existe. É o mesmo fluxo do Rydoo que vocês usam para reembolso.',\n    porque: 'Ele mesmo deu essa analogia no áudio. Usar a palavra Rydoo mostra que você ouviu.',\n    extraImg: P.papel, extraCap: '4b · O formulário de papel usado no teste. Guarde este arquivo à mão antes de gravar.'\n  },\n  {\n    n: 5, t: '03:00 – 03:50', tit: 'O achado — este é o momento da demo',\n    tela: 'Painel · análise completa', url: BASE + '/painel?aberto=PA-04509', img: P.detalhe,\n    destaque: true,\n    fazer: [\n      'Vá ao painel, filtre por <strong>Divergências</strong> e clique numa linha.',\n      'Não fale por dois segundos. Deixe a tarja vermelha ser lida.',\n      'Aponte a pirâmide: <strong>DECLARADO</strong> abaixo da linha, <strong>APURADO</strong> acima.',\n      'Leia em voz alta o trecho em amarelo, dentro do texto do próprio colaborador.'\n    ],\n    falar: 'Ele escreveu \"quase acidente\". Mas na descrição dele mesmo está: foi ao pronto-socorro e foi afastado por dois dias. Isso é LTI — indicador reativo, investigação obrigatória. A informação sempre esteve ali. Só estava no campo errado, e ninguém tinha como ver.',\n    nota: 'Aqui está tudo que o gestor precisa para auditar num lugar só: quem reportou, em que unidade, o texto original sem edição e o trecho exato que fez a IA subir o nível.',\n    porque: 'É o exemplo que ele te deu no áudio, devolvido funcionando. Se a demo inteira falhar e só isso rodar, valeu.'\n  },\n  {\n    n: 6, t: '03:50 – 04:30', tit: 'Mostre que ela também sabe NÃO escalar',\n    tela: 'Painel · caso que ficou abaixo', url: BASE + '/painel?aberto=PA-04810', img: P.naoEscala,\n    fazer: [\n      'Abra o caso do carrinho de bandejas.',\n      'Aponte a tarja <strong>verde</strong> e a pirâmide com o marcador abaixo da linha.',\n      'Leia a justificativa: houve dor, mas nenhum atendimento.'\n    ],\n    falar: 'Aqui teve contato e teve dor. Mas não houve atendimento nenhum. Continua sendo quase acidente, e a IA não escalou. Alarme falso queima a confiança de vocês tão rápido quanto a subnotificação.',\n    porque: 'É a pergunta que um gerente de SST faz na hora: \"e se ela exagerar?\". Responder antes de ser perguntado vale mais do que responder depois.'\n  },\n  {\n    n: 7, t: '04:30 – 05:10', tit: 'A outra pirâmide, e o ciclo fechando',\n    tela: 'Painel · Segurança dos Alimentos', url: BASE + '/painel?aberto=PA-04588', img: P.alimentos,\n    fazer: [\n      'Abra o caso do amendoim.',\n      'Mostre que a pirâmide <strong>mudou</strong>: agora é a escala de Segurança dos Alimentos.',\n      'Desça até o bloco <strong>Investigação</strong>, no rodapé da mesma tela.',\n      'Clique em <strong>Abrir investigação</strong> e mostre a etiqueta mudando na lista.'\n    ],\n    falar: 'A pirâmide de vocês é dupla. A IA decide sozinha se o risco é ao trabalhador ou ao comensal antes de posicionar o nível. E o alerta não morre na tela: o gestor abre a investigação aqui, e o reporte fica marcado até alguém encerrar.',\n    porque: 'Fecha as duas pontas que faltavam: que a solução leu a pirâmide inteira, e que o achado vira tarefa. Investigação obrigatória sem lugar para registrar não convence auditoria.'\n  }\n];\n\nconst ATALHOS = [\n  ['Painel do gestor', BASE + '/painel'],\n  ['Painel só com as divergências', BASE + '/painel?filtro=diverg'],\n  ['Análise completa de um caso com divergência', BASE + '/painel?aberto=PA-04509'],\n  ['Análise completa do caso que NÃO escalou', BASE + '/painel?aberto=PA-04810'],\n  ['Análise completa · Segurança dos Alimentos', BASE + '/painel?aberto=PA-04588'],\n  ['Reportar — aba Falar', BASE + '/?aba=voz'],\n  ['Reportar — aba Fotografar', BASE + '/?aba=foto'],\n  ['Conferência · o forno', BASE + '/?caso=forno'],\n  ['Conferência · a câmara fria', BASE + '/?caso=camara'],\n  ['Conferência · a prateleira', BASE + '/?caso=prateleira'],\n  ['Conferência · o corpo estranho', BASE + '/?caso=vidro']\n];\n\nconst PERGUNTAS = [\n  { q: 'O colaborador não vai mudar a história para escapar da classificação?', a: 'Não tem como: ele nunca vê a classificação. Antes de enviar ele só vê o que falou e o formulário preenchido. A pirâmide roda no servidor, no momento do envio, e o resultado aparece apenas para vocês no painel. Foi desenhado assim de propósito — indicador que o reportante enxerga é indicador que ele aprende a manipular.' },\n  { q: 'E se ela errar a classificação?', a: 'Ela erra. Por isso a tela mostra o trecho exato que decidiu e a justificativa — o gestor confere em dois segundos e corrige antes de gravar. E o alerta é conservador: na dúvida ela escolhe o nível menor e baixa a confiança.' },\n  { q: 'Qual a acurácia?', a: '17 de 17 num gabarito de 17 casos de cozinha industrial e refeitório, medido ponta a ponta. Mas seja honesto: esse gabarito fui eu que escrevi a partir de perfis públicos de risco. Com casos reais de vocês, a medida passa a valer.' },\n  { q: 'Funciona com o barulho da cozinha?', a: 'Não testamos em campo. Na demo a transcrição roda no navegador. Num piloto real isso muda para gravação local com envio depois, e o áudio fica anexado ao registro.' },\n  { q: 'Onde ficam os dados?', a: 'Nesta demo, num ambiente de protótipo, com dados fictícios. Nada de vocês. Descrição de lesão com pessoa identificável é dado de saúde sob a LGPD — num piloto isso entra com controle de acesso desde o primeiro dia.' },\n  { q: 'Dá para integrar com o sistema que já usamos?', a: 'A classificação é um serviço que recebe texto e devolve o nível na pirâmide. Ela pode viver dentro desta tela ou atrás do formulário que vocês já têm.' }\n];\n\n// Eventos NOVOS, que nao existem no historico do painel. Assim o reporte feito ao vivo\n// aparece como registro novo no topo da lista, sem duplicar nada que ja esta la.\nconst CASOS = [\n  ['O forno', 'FAC · acima da linha', 'Diz \"quase acidente\" e descreve queimadura tratada com gelo e gaze. É o caso do passo 2.', BASE + '/?caso=forno'],\n  ['A câmara fria', 'RWC · acima da linha', 'Punho imobilizado e uma semana no administrativo. Testa função restrita contra afastamento.', BASE + '/?caso=camara'],\n  ['A prateleira', 'Quase acidente · abaixo', 'Caixa caiu no ombro, doeu, nenhum atendimento. É o caso em que a IA NÃO escala.', BASE + '/?caso=prateleira'],\n  ['O corpo estranho', 'Lesão · acima da linha', 'Plástico no arroz feriu a gengiva do comensal. Puxa a pirâmide de Segurança dos Alimentos.', BASE + '/?caso=vidro']\n];\n\nconst CUIDADOS = [\n  ['Use o Chrome', 'O ditado por voz só funciona no Chrome. No Safari e no Firefox a aba Falar não grava.'],\n  ['A URL precisa do <code>.next.</code>', 'Sem esse pedaço no meio do endereço, a página abre em branco. Confira antes de compartilhar a tela.'],\n  ['Teste o microfone antes', 'Autorize o microfone uma vez com antecedência. A caixa de permissão no meio da gravação estraga o ritmo.'],\n  ['Tenha o plano B pronto', 'Se o microfone falhar, abra um dos endereços de caso pronto da tabela acima. A tela já aparece preenchida e ninguém percebe. Deixe um deles aberto numa aba antes de começar.'],\n  ['Não prometa piloto de campo', 'Isto é protótipo. Falta segurança, teste com foto real de celular e o formulário de verdade da Sodexo.']\n];\n\nconst BASELINE = { total: 17, acima: 9, diverg: 7, taxa: 41 };\n\n// d2.rush() resolve para a origem do app e devolve 404 para quem nao e builder.\n// O slug do sistema e derivado do proprio endereco, para o componente ser portavel.\nfunction hostRush() {\n  const padrao = 'https://sodexo-ocr.data2apis.com/rush/';\n  try {\n    const p = location.hostname.split('.');\n    const i = p.indexOf('data2');\n    let sistema = null;\n    if (p.length >= 3 && p[p.length - 2] === 'data2' && p[p.length - 1] === 'qa') sistema = p[0];\n    else if (i >= 2) sistema = (p[i - 1] === 'next') ? p[i - 2] : p[i - 1];\n    if (sistema) return 'https://' + sistema + '.data2apis.com/rush/';\n  } catch (e) { /* sem location, usa o padrao */ }\n  return padrao;\n}\nconst RUSH = hostRush();\n\nasync function chamar(ep, corpo) {\n  let res;\n  try {\n    res = await fetch(RUSH + ep, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(corpo || {})\n    });\n  } catch (e) {\n    throw new Error('Sem resposta do serviço ' + ep + '.');\n  }\n  if (!res.ok) throw new Error('O serviço ' + ep + ' respondeu ' + res.status + '.');\n  const json = await res.json();\n  return json && json.data !== undefined ? json.data : json;\n}\n\nfunction esc(s) {\n  return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction barraEstado(d2) {\n  const s = d2.state;\n  if (s.restaurando) {\n    return '<div class=\"estado lendo\"><div class=\"info\"><div class=\"t\">Restaurando o estado da demo…</div>' +\n      '<div class=\"d\">Apagando os reportes atuais e recolocando os 17 do baseline. Leva alguns segundos.</div></div></div>';\n  }\n  if (!s.atual) {\n    return '<div class=\"estado lendo\"><div class=\"info\"><div class=\"t\">Conferindo o estado da demo…</div>' +\n      '<div class=\"d\">Lendo os reportes que estão na base agora.</div></div>' +\n      '<button class=\"btn-rest\" disabled>Restaurar estado</button></div>';\n  }\n  const a = s.atual;\n  const igual = a.total === BASELINE.total && a.acima === BASELINE.acima && a.diverg === BASELINE.diverg && a.fora === 0;\n  const nums = a.total + ' reportes · ' + a.acima + ' acima da linha · ' + a.diverg + ' divergências · ' + a.taxa + '% subnotificação' +\n    (a.fora ? ' · ' + a.fora + ' fora do status inicial' : '');\n  const titulo = igual\n    ? 'Estado da demo confere com o baseline'\n    : 'O estado mudou — restaure antes de apresentar';\n  const desc = igual\n    ? 'Os números citados neste roteiro (' + BASELINE.total + ' reportes, ' + BASELINE.taxa + '%) batem com o que está na tela. Pode gravar.'\n    : 'O roteiro cita ' + BASELINE.total + ' reportes e ' + BASELINE.taxa + '%. Enquanto não restaurar, o que você falar não vai bater com o que aparece.';\n  return '<div class=\"estado ' + (igual ? 'ok' : 'fora') + '\">' +\n    '<div class=\"info\"><div class=\"t\">' + esc(titulo) + '</div><div class=\"d\">' + esc(desc) + '</div>' +\n    '<div class=\"nums\" style=\"margin-top:6px\">' + esc(nums) + '</div>' +\n    (s.aviso ? '<div class=\"d\" style=\"color:#8c2a1e;margin-top:6px\">' + esc(s.aviso) + '</div>' : '') +\n    '</div><button class=\"btn-rest\">' + (igual ? 'Restaurar mesmo assim' : 'Restaurar estado da demo') + '</button></div>';\n}\n\nexport default {\n  css: `\n:host{all:initial}\n*{box-sizing:border-box}\n.wrap{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;color:#15211c;background:#f2f4f1;height:100%;overflow:auto;padding:26px 20px 70px;line-height:1.6}\n.shell{max-width:1000px;margin:0 auto;display:flex;flex-direction:column;gap:20px}\n\nheader{display:flex;flex-direction:column;gap:9px;padding-bottom:20px;border-bottom:2px solid #15211c}\n.eyebrow{font-size:10.5px;font-weight:700;letter-spacing:1.6px;text-transform:uppercase;color:#6b7873}\nh1{margin:0;font-size:clamp(25px,4vw,34px);line-height:1.1;letter-spacing:-.4px}\n.lede{font-size:15.5px;color:#3c4a44;max-width:66ch}\n.meta{display:flex;gap:10px;flex-wrap:wrap;margin-top:6px}\n.tagm{font-size:11.5px;font-weight:600;background:#e2e8e4;color:#3c4a44;padding:3px 10px;border-radius:2px}\n\n.card{background:#fff;border:1px solid #d6ddd8;border-radius:4px}\n.card>.hd{padding:12px 18px;border-bottom:1px solid #e6ebe7;font-size:10.5px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;color:#6b7873}\n.card>.bd{padding:18px}\n\n.estado{display:flex;gap:16px;align-items:center;flex-wrap:wrap;border-radius:4px;padding:15px 18px;border:1.5px solid}\n.estado.ok{background:#e7f2ec;border-color:#186a4b}\n.estado.fora{background:#fbeae7;border-color:#b33a2b}\n.estado.lendo{background:#f7f9f7;border-color:#d6ddd8}\n.estado .info{flex:1;min-width:230px}\n.estado .t{font-weight:700;font-size:14.5px}\n.estado.ok .t{color:#14563c}\n.estado.fora .t{color:#8c2a1e}\n.estado .d{font-size:13px;color:#3c4a44;margin-top:2px}\n.estado .nums{font-family:ui-monospace,Menlo,monospace;font-size:12.5px;color:#3c4a44}\n.btn-rest{padding:10px 18px;border-radius:3px;border:1px solid #15211c;background:#15211c;color:#fff;font:600 14px inherit;font-family:inherit;cursor:pointer;white-space:nowrap}\n.btn-rest:hover{background:#000}\n.btn-rest[disabled]{opacity:.45;cursor:not-allowed}\n.estado.ok .btn-rest{background:#fff;color:#15211c}\n\n.aviso{background:#fdf6e3;border:1.5px solid #e8d9a8;border-radius:4px;padding:15px 18px}\n.aviso .t{font-weight:700;font-size:14.5px;color:#8c6d1f;margin-bottom:5px}\n.aviso ul{margin:6px 0 0;padding-left:19px;font-size:13.5px;color:#3c4a44}\n.aviso li{margin-bottom:4px}\n.aviso code{font-family:ui-monospace,Menlo,monospace;font-size:12.5px;background:#fff;padding:1px 5px;border-radius:2px;border:1px solid #e8d9a8}\n\n.passo{background:#fff;border:1px solid #d6ddd8;border-radius:4px;overflow:hidden}\n.passo.destaque{border:2px solid #b33a2b}\n.passo .cab{display:flex;gap:14px;align-items:flex-start;padding:16px 18px;border-bottom:1px solid #e6ebe7}\n.passo.destaque .cab{background:#fbeae7;border-bottom-color:#e6b8b0}\n.num{width:31px;height:31px;flex:none;border-radius:50%;background:#15211c;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px}\n.passo.destaque .num{background:#b33a2b}\n.cab .txt{flex:1;min-width:0}\n.cab h2{margin:0;font-size:17.5px;line-height:1.25;letter-spacing:-.2px}\n.cab .sub{font-size:12px;color:#6b7873;margin-top:3px}\n.cab .tempo{font-size:11.5px;font-weight:700;color:#6b7873;white-space:nowrap;font-variant-numeric:tabular-nums;background:#f2f4f1;padding:4px 9px;border-radius:2px}\n.passo.destaque .cab .tempo{background:#fff;color:#8c2a1e}\n\n.corpo{display:grid;grid-template-columns:1fr 1fr;gap:0}\n.col{padding:18px}\n.col+.col{border-left:1px solid #e6ebe7}\n@media(max-width:820px){.corpo{grid-template-columns:1fr}.col+.col{border-left:none;border-top:1px solid #e6ebe7}}\n\n.rot{font-size:10px;font-weight:700;letter-spacing:1.1px;text-transform:uppercase;color:#6b7873;margin-bottom:8px}\nol.acoes{margin:0;padding-left:19px;font-size:14px}\nol.acoes li{margin-bottom:7px}\n.fala{background:#f2f4f1;border-left:3px solid #186a4b;border-radius:0 3px 3px 0;padding:12px 15px;font-size:14.5px;font-style:italic;color:#15211c}\n.nota{font-size:12.5px;color:#6b7873;margin-top:9px}\n.porque{margin-top:13px;padding-top:12px;border-top:1px dashed #d6ddd8;font-size:13px;color:#3c4a44}\n.porque b{color:#186a4b;font-style:normal}\n\nfigure{margin:0}\nimg{display:block;width:100%;height:auto;border:1px solid #d6ddd8;border-radius:3px;background:#fff}\nfigcaption{font-size:11.5px;color:#6b7873;margin-top:7px}\n.linkurl{display:inline-block;font-family:ui-monospace,Menlo,monospace;font-size:11.5px;color:#186a4b;word-break:break-all;margin-top:6px}\n\ntable{width:100%;border-collapse:collapse;font-size:13.5px}\nth{text-align:left;padding:9px 14px;font-size:10px;letter-spacing:.9px;text-transform:uppercase;color:#6b7873;border-bottom:1px solid #cfd8d2}\ntd{padding:9px 14px;border-bottom:1px solid #eef2ef;vertical-align:top}\ntd.k{font-weight:600;white-space:nowrap}\ntd.v{font-family:ui-monospace,Menlo,monospace;font-size:11.5px;color:#186a4b;word-break:break-all}\n.sub2{font-family:ui-monospace,Menlo,monospace;font-size:10.5px;font-weight:400;color:#6b7873;margin-top:2px;white-space:nowrap}\ntbody tr:last-child td{border-bottom:none}\n\n.qa{display:flex;flex-direction:column;gap:14px}\n.qa .q{font-weight:700;font-size:14.5px}\n.qa .a{font-size:13.5px;color:#3c4a44;margin-top:3px}\n\n.cuid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px}\n.cuid .i{background:#f7f9f7;border:1px solid #e2e8e4;border-radius:3px;padding:13px 15px}\n.cuid .i b{display:block;font-size:13.5px;margin-bottom:3px}\n.cuid .i span{font-size:12.5px;color:#3c4a44}\n.cuid code{font-family:ui-monospace,Menlo,monospace;font-size:11.5px;background:#fff;padding:1px 4px;border-radius:2px;border:1px solid #e2e8e4}\n\nfooter{font-size:12px;color:#6b7873;border-top:1px solid #d6ddd8;padding-top:16px;display:flex;flex-direction:column;gap:5px}\n`,\n\n  render(d2) {\n    const passos = PASSOS.map((p) => `\n      <div class=\"passo ${p.destaque ? 'destaque' : ''}\">\n        <div class=\"cab\">\n          <div class=\"num\">${p.n}</div>\n          <div class=\"txt\">\n            <h2>${esc(p.tit)}</h2>\n            <div class=\"sub\">Tela: ${esc(p.tela)}</div>\n          </div>\n          <div class=\"tempo\">${esc(p.t)}</div>\n        </div>\n        <div class=\"corpo\">\n          <div class=\"col\">\n            <div class=\"rot\">O que fazer</div>\n            <ol class=\"acoes\">${p.fazer.map((f) => '<li>' + f + '</li>').join('')}</ol>\n            <div class=\"rot\" style=\"margin-top:16px\">O que dizer</div>\n            <div class=\"fala\">\"${esc(p.falar)}\"</div>\n            ${p.nota ? '<div class=\"nota\">' + p.nota + '</div>' : ''}\n            <div class=\"porque\"><b>Por que assim:</b> ${esc(p.porque)}</div>\n          </div>\n          <div class=\"col\">\n            <figure>\n              <img src=\"${esc(p.img)}\" alt=\"Tela: ${esc(p.tela)}\" loading=\"lazy\">\n              <figcaption>${p.n} · ${esc(p.tela)}<br><span class=\"linkurl\">${esc(p.url)}</span></figcaption>\n            </figure>\n            ${p.extraImg ? '<figure style=\"margin-top:14px\"><img src=\"' + esc(p.extraImg) + '\" alt=\"Formulário de papel\" loading=\"lazy\"><figcaption>' + p.extraCap + '</figcaption></figure>' : ''}\n          </div>\n        </div>\n      </div>`).join('');\n\n    const atalhos = ATALHOS.map((a) => `<tr><td class=\"k\">${esc(a[0])}</td><td class=\"v\">${esc(a[1])}</td></tr>`).join('');\n    const casos = CASOS.map((c) => `<tr><td class=\"k\">${esc(c[0])}<div class=\"sub2\">${esc(c[1])}</div></td><td style=\"font-size:13px;color:#3c4a44\">${esc(c[2])}</td><td class=\"v\">${esc(c[3])}</td></tr>`).join('');\n    const perguntas = PERGUNTAS.map((p) => `<div><div class=\"q\">${esc(p.q)}</div><div class=\"a\">${esc(p.a)}</div></div>`).join('');\n    const cuidados = CUIDADOS.map((c) => `<div class=\"i\"><b>${c[0]}</b><span>${c[1]}</span></div>`).join('');\n\n    return `<div class=\"wrap\"><div class=\"shell\">\n\n      <header>\n        <div class=\"eyebrow\">Sodexo · Piloto PreAction · Protótipo Data2</div>\n        <h1>Roteiro da demonstração</h1>\n        <p class=\"lede\">Sete passos, cerca de cinco minutos. O arco é: mostrar o problema, fazer um reporte como um colaborador faria, provar que ele não vê a classificação, e só então revelar o achado no painel do gestor. Cada passo traz o que fazer, o que dizer e o print de como a tela deve estar.</p>\n        <div class=\"meta\"><span class=\"tagm\">~5 min</span><span class=\"tagm\">7 passos</span><span class=\"tagm\">Chrome obrigatório</span><span class=\"tagm\">Dados fictícios</span><span class=\"tagm\">Ensaie à vontade — dá para restaurar</span></div>\n      </header>\n\n      ${barraEstado(d2)}\n\n      <div class=\"aviso\">\n        <div class=\"t\">Antes de apertar o gravar</div>\n        <ul>\n          <li>Abra no <strong>Chrome</strong>. O ditado por voz não existe em Safari nem Firefox.</li>\n          <li>Confira que o endereço tem <code>.next.</code> no meio: <code>${esc(BASE)}</code></li>\n          <li>Autorize o microfone uma vez, com antecedência.</li>\n          <li>Deixe o arquivo do formulário de papel salvo na área de trabalho (imagem do passo 4b).</li>\n          <li>Abra duas abas: uma na tela de reporte, outra no painel. Trocar de aba é mais rápido que navegar.</li>\n        </ul>\n      </div>\n\n      ${passos}\n\n      <div class=\"card\">\n        <div class=\"hd\">Casos prontos — abrem a tela de conferência já preenchida</div>\n        <div class=\"bd\" style=\"padding:0\">\n          <table>\n            <thead><tr><th>Caso</th><th>O que ele prova</th><th>Endereço</th></tr></thead>\n            <tbody>${casos}</tbody>\n          </table>\n        </div>\n      </div>\n\n      <div class=\"card\">\n        <div class=\"hd\">Atalhos — leve a tela direto ao estado que você quer</div>\n        <div class=\"bd\" style=\"padding:0\">\n          <table>\n            <thead><tr><th>Estado</th><th>Endereço</th></tr></thead>\n            <tbody>${atalhos}</tbody>\n          </table>\n        </div>\n      </div>\n\n      <div class=\"card\">\n        <div class=\"hd\">O que ele vai perguntar</div>\n        <div class=\"bd\"><div class=\"qa\">${perguntas}</div></div>\n      </div>\n\n      <div class=\"card\">\n        <div class=\"hd\">Cuidados</div>\n        <div class=\"bd\"><div class=\"cuid\">${cuidados}</div></div>\n      </div>\n\n      <footer>\n        <div>Prints capturados da solução em agosto de 2026. Se a tela mudar, recapture — um roteiro com print velho confunde mais do que ajuda.</div>\n        <div>Os 17 reportes do painel são casos sintéticos, montados a partir de perfis públicos de risco em cozinha industrial e refeitório. Nenhum dado da Sodexo foi usado.</div>\n      </footer>\n\n    </div></div>`;\n  },\n\n  mounted(d2) {\n    const ler = async () => {\n      try {\n        const r = await chamar('sst-listar', {});\n        const regs = (r && r.registros) || [];\n        const acima = regs.filter((x) => x.ia_acima_da_linha).length;\n        const diverg = regs.filter((x) => x.ia_divergencia).length;\n        const fora = regs.filter((x) => x.status !== 'Novo' && x.status !== 'Alerta aberto').length;\n        d2.setState({\n          atual: {\n            total: regs.length, acima: acima, diverg: diverg, fora: fora,\n            taxa: regs.length ? Math.round((diverg / regs.length) * 100) : 0\n          },\n          aviso: ''\n        });\n      } catch (err) {\n        d2.setState({ atual: { total: 0, acima: 0, diverg: 0, fora: 0, taxa: 0 }, aviso: 'Não consegui ler a base: ' + String(err.message || err) });\n      }\n    };\n    ler();\n\n    d2.on('.btn-rest', 'click', async () => {\n      d2.setState({ restaurando: true, aviso: '' });\n      try {\n        await chamar('sst-restaurar', {});\n        await ler();\n      } catch (err) {\n        d2.setState({ aviso: 'Falhou ao restaurar: ' + String(err.message || err) });\n      } finally {\n        d2.setState({ restaurando: false });\n        ler();\n      }\n    });\n  }\n};"}}}}}}}},{"_id":"6a96f64a31ee6e52db18d43b","component":"data2-core-types@Component","system":"6a96e197cc271edcd35493f6","params":{"extends":"data2-core-primitives@Block","component":"preaction-painel","package":"sodexo-ocr","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const ORDEM_ST = ['OBSERVACAO_ST', 'QUASE_ACIDENTE', 'FAC', 'MTC', 'RWC', 'LTI', 'FAT'];\nconst ORDEM_SA = ['OBSERVACAO_SA', 'QUASE_ACIDENTE', 'NAO_EVOLUIU', 'SUSPEITA', 'LESAO', 'DTHA_ALERGIA', 'FAT'];\nconst ACIMA = ['FAC', 'MTC', 'RWC', 'LTI', 'FAT', 'NAO_EVOLUIU', 'SUSPEITA', 'LESAO', 'DTHA_ALERGIA'];\nconst ROTULO = {\n  OBSERVACAO_ST: 'Observação ST', OBSERVACAO_SA: 'Observação SA',\n  QUASE_ACIDENTE: 'Quase acidente', RECONHECIMENTO_POSITIVO: 'Reconhecimento',\n  FAC: 'FAC · primeiros socorros', MTC: 'MTC · tratamento médico',\n  RWC: 'RWC · trabalho restrito', LTI: 'LTI · afastamento', FAT: 'FAT · fatalidade',\n  NAO_EVOLUIU: 'Não evoluiu', SUSPEITA: 'Suspeita', LESAO: 'Lesão por alimento',\n  DTHA_ALERGIA: 'DTHA / Alergia'\n};\n\nfunction esc(s) {\n  return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\nfunction eAcima(n) { return ACIMA.indexOf(n) >= 0; }\nfunction dataCurta(v) {\n  if (!v) return '—';\n  const d = new Date(v);\n  if (isNaN(d)) return '—';\n  return String(d.getDate()).padStart(2, '0') + '/' + String(d.getMonth() + 1).padStart(2, '0');\n}\n\n// d2.rush() resolve para a origem do app e devolve 404 para quem nao e builder.\n// O slug do sistema e derivado do proprio endereco, para o componente ser portavel.\nfunction hostRush() {\n  const padrao = 'https://sodexo-ocr.data2apis.com/rush/';\n  try {\n    const p = location.hostname.split('.');\n    const i = p.indexOf('data2');\n    let sistema = null;\n    if (p.length >= 3 && p[p.length - 2] === 'data2' && p[p.length - 1] === 'qa') sistema = p[0];\n    else if (i >= 2) sistema = (p[i - 1] === 'next') ? p[i - 2] : p[i - 1];\n    if (sistema) return 'https://' + sistema + '.data2apis.com/rush/';\n  } catch (e) { /* sem location, usa o padrao */ }\n  return padrao;\n}\nconst RUSH = hostRush();\n\nasync function chamar(ep, corpo) {\n  let res;\n  try {\n    res = await fetch(RUSH + ep, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(corpo || {})\n    });\n  } catch (e) {\n    throw new Error('Sem resposta do serviço ' + ep + '. Verifique a conexão.');\n  }\n  if (!res.ok) throw new Error('O serviço ' + ep + ' respondeu ' + res.status + '.');\n  const json = await res.json();\n  return json && json.data !== undefined ? json.data : json;\n}\n\nconst ESCALAS = {\n  ST: {\n    nome: 'Segurança do Trabalho',\n    abaixo: [\n      { k: 'OBSERVACAO_ST', r: 'Observação de ST', d: 'condição ou comportamento inseguro' },\n      { k: 'QUASE_ACIDENTE', r: 'Quase acidente', d: 'contato com o risco, sem lesão' }\n    ],\n    acima: [\n      { k: 'FAC', r: 'FAC', d: 'primeiros socorros' },\n      { k: 'MTC', r: 'MTC', d: 'tratamento médico' },\n      { k: 'RWC', r: 'RWC', d: 'trabalho restrito' },\n      { k: 'LTI', r: 'LTI', d: 'afastamento' },\n      { k: 'FAT', r: 'FAT', d: 'fatalidade' }\n    ]\n  },\n  SA: {\n    nome: 'Segurança dos Alimentos',\n    abaixo: [\n      { k: 'OBSERVACAO_SA', r: 'Observação de SA', d: 'desvio de processo sem consumação' },\n      { k: 'QUASE_ACIDENTE', r: 'Quase acidente', d: 'barrado antes do comensal' }\n    ],\n    acima: [\n      { k: 'NAO_EVOLUIU', r: 'Não evoluiu', d: 'descartado tecnicamente' },\n      { k: 'SUSPEITA', r: 'Suspeita', d: 'suspeita de DTHA' },\n      { k: 'LESAO', r: 'Lesão', d: 'lesão causada pelo alimento' },\n      { k: 'DTHA_ALERGIA', r: 'DTHA / Alergia', d: 'confirmada ou manifestada' },\n      { k: 'FAT', r: 'FAT', d: 'fatalidade' }\n    ]\n  }\n};\n\nfunction codigoDeclarado(r) {\n  const t = String(r.ia_nivel_declarado || r.tipo_declarado || '').toUpperCase();\n  if (t.indexOf('QUASE') >= 0) return 'QUASE_ACIDENTE';\n  if (t.indexOf('RECONHEC') >= 0) return 'RECONHECIMENTO_POSITIVO';\n  if (t.indexOf('CONDI') >= 0 || t.indexOf('COMPORTAMENTO') >= 0 || t.indexOf('OBSERVA') >= 0) {\n    return r.ia_area === 'SA' ? 'OBSERVACAO_SA' : 'OBSERVACAO_ST';\n  }\n  if (t.indexOf('ACIDENTE') >= 0) return 'ACIDENTE';\n  return '';\n}\n\nfunction dataLonga(v) {\n  if (!v) return '—';\n  const d = new Date(v);\n  if (isNaN(d)) return '—';\n  const M = ['jan','fev','mar','abr','mai','jun','jul','ago','set','out','nov','dez'];\n  return String(d.getDate()).padStart(2, '0') + ' ' + M[d.getMonth()] + ' ' + d.getFullYear() +\n    ' · ' + String(d.getHours()).padStart(2, '0') + 'h' + String(d.getMinutes()).padStart(2, '0');\n}\n\nfunction realce(texto, trecho) {\n  const t = String(texto || '');\n  const alvo = String(trecho || '').trim();\n  if (!alvo) return esc(t);\n  const i = t.toLowerCase().indexOf(alvo.toLowerCase().slice(0, 60));\n  if (i < 0) return esc(t);\n  const fim = Math.min(t.length, i + alvo.length);\n  return esc(t.slice(0, i)) + '<mark>' + esc(t.slice(i, fim)) + '</mark>' + esc(t.slice(fim));\n}\n\nfunction pill(st) {\n  if (!st || st === 'Novo' || st === 'Alerta aberto') return '';\n  if (st === 'Em investigação') return '<span class=\"pill inv\">EM INVESTIGAÇÃO</span>';\n  if (st === 'Encerrado') return '<span class=\"pill fim\">ENCERRADO</span>';\n  return '<span class=\"pill\">' + esc(st) + '</span>';\n}\n\nfunction acoesDe(r, s) {\n  const ocupado = s.salvandoStatus === r._id;\n  const btn = (st, txt, ghost) =>\n    '<button class=\"st-btn' + (ghost ? ' ghost' : '') + '\" data-id=\"' + esc(r._id) + '\" data-st=\"' + esc(st) + '\"' +\n    (ocupado ? ' disabled' : '') + '>' + esc(txt) + '</button>';\n  const out = [];\n  if (r.status !== 'Em investigação' && r.status !== 'Encerrado') {\n    out.push(btn('Em investigação', eAcima(r.ia_nivel) ? 'Abrir investigação' : 'Marcar para análise', false));\n  }\n  if (r.status !== 'Encerrado') out.push(btn('Encerrado', 'Encerrar', true));\n  else out.push(btn('Alerta aberto', 'Reabrir', true));\n  if (ocupado) out.push('<span class=\"stat\">gravando…</span>');\n  return out.join('');\n}\n\nfunction telaDetalhe(r, s) {\n  const area = ESCALAS[r.ia_area] ? r.ia_area : 'ST';\n  const escala = ESCALAS[area];\n  const acima = eAcima(r.ia_nivel);\n  const decl = codigoDeclarado(r);\n\n  const nivelHTML = (n, ehAcima) => {\n    const cls = ['lvl'];\n    if (ehAcima) cls.push('acima');\n    const eApurado = n.k === r.ia_nivel;\n    const eDeclarado = !eApurado && n.k === decl;\n    if (eApurado) cls.push('apurado');\n    if (eDeclarado) cls.push('declarado');\n    let tag = '';\n    if (eApurado) tag = '<span class=\"tag\">APURADO</span>';\n    else if (eDeclarado) tag = '<span class=\"tag\">DECLARADO</span>';\n    return '<div class=\"' + cls.join(' ') + '\"><span class=\"k\">' + esc(n.r) + '</span><span class=\"dd\">' + esc(n.d) + '</span>' + tag + '</div>';\n  };\n\n  const pyr = escala.acima.slice().reverse().map((n) => nivelHTML(n, true)).join('')\n    + '<div class=\"pyr-linha\"><div class=\"r\"></div><div class=\"l\">A LINHA</div><div class=\"r\"></div></div>'\n    + escala.abaixo.slice().reverse().map((n) => nivelHTML(n, false)).join('');\n\n  const svgUp = '<svg class=\"ic\" viewBox=\"0 0 24 24\" width=\"23\" height=\"23\" aria-hidden=\"true\"><path d=\"M12 3 22.5 20.5H1.5Z\" fill=\"none\" stroke=\"#b33a2b\" stroke-width=\"2\" stroke-linejoin=\"round\"/><path d=\"M12 9.5v4.6\" stroke=\"#b33a2b\" stroke-width=\"2.3\" stroke-linecap=\"round\"/><circle cx=\"12\" cy=\"17.6\" r=\"1.25\" fill=\"#b33a2b\"/></svg>';\n  const svgDown = '<svg class=\"ic\" viewBox=\"0 0 24 24\" width=\"23\" height=\"23\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"#186a4b\" stroke-width=\"1.8\"/><path d=\"M7 12.4 10.6 16 17 8.6\" fill=\"none\" stroke=\"#186a4b\" stroke-width=\"2.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\n  const alerta = acima\n    ? '<div class=\"alert up\">' + svgUp + '<div><div class=\"t\">Este reporte cruzou a linha</div><div class=\"d\">Foi registrado como <strong>' +\n      esc(r.tipo_declarado || 'sem tipo informado') + '</strong>, mas o que está descrito é <strong>' + esc(ROTULO[r.ia_nivel] || r.ia_nivel) +\n      '</strong> — indicador reativo. Investigação obrigatória, por menor que seja.</div></div></div>'\n    : '<div class=\"alert down\">' + svgDown + '<div><div class=\"t\">Abaixo da linha — indicador preventivo</div><div class=\"d\">Classificado como <strong>' +\n      esc(ROTULO[r.ia_nivel] || r.ia_nivel) + '</strong>. Segue no fluxo preventivo, sem investigação obrigatória.</div></div></div>';\n\n  const campos = [\n    ['Unidade', r.unidade], ['Setor', r.setor], ['Turno', r.turno],\n    ['Reportado por', r.reportado_por || 'Anônimo'], ['Função', r.funcao],\n    ['Entrada por', r.origem], ['Tipo declarado', r.tipo_declarado],\n    ['Área', r.ia_area === 'SA' ? 'Segurança dos Alimentos' : 'Segurança do Trabalho'],\n    ['Agente do risco', r.agente],\n    ['Houve lesão', r.houve_lesao === true ? 'Sim' : (r.houve_lesao === false ? 'Não' : '')],\n    ['Parte do corpo', r.parte_corpo], ['Atendimento', r.atendimento],\n    ['EPI em uso', r.epi_em_uso === true ? 'Sim' : (r.epi_em_uso === false ? 'Não' : 'Não informado')],\n    ['Status', r.status]\n  ].filter((c) => c[1]).map((c) => '<div class=\"f\"><span class=\"l\">' + esc(c[0]) + '</span><span class=\"v\">' + esc(c[1]) + '</span></div>').join('');\n\n  return `<div class=\"wrap\"><div class=\"shell\">\n    <div class=\"top\">\n      <div>\n        <div class=\"prot\">${esc(r.protocolo || 'sem protocolo')} &nbsp;·&nbsp; ${esc(dataLonga(r.criado_em))}</div>\n        <div class=\"dtit\">${esc(r.titulo || '(sem título)')}</div>\n      </div>\n      <div class=\"nav\"><button class=\"voltar\">&larr; Voltar ao painel</button><div class=\"chip\">PREACTION</div></div>\n    </div>\n\n    ${alerta}\n\n    <div class=\"card\">\n      <div class=\"hd\">Identificação do reporte</div>\n      <div class=\"bd\"><div class=\"ident\">${campos}</div></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"hd\">O que o colaborador descreveu${r.descricao_editada ? '<span class=\"pill inv\" style=\"margin-left:8px\">EDITADO</span>' : ''}</div>\n      <div class=\"bd\">\n        <div class=\"desc\">${realce(r.descricao || '(sem descrição)', r.ia_trecho)}</div>\n        <div class=\"just\" style=\"color:#6b7873\">O trecho em destaque é o que determinou a classificação.${r.descricao_editada ? ' <strong>O colaborador ajustou este texto após a transcrição</strong> — compare com o original no fim da página. A classificação foi feita sobre o original, não sobre a versão editada.' : ''}</div>\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"hd\">Onde o evento cai na pirâmide · ${esc(escala.nome)}</div>\n      <div class=\"bd\">\n        <div class=\"pyr\">${pyr}</div>\n        <div class=\"quote\" style=\"margin-top:14px\">\n          <div class=\"lb\">O trecho que decidiu</div>\n          \"${esc(r.ia_trecho || '—')}\"\n        </div>\n        <div class=\"just\"><strong>Por quê:</strong> ${esc(r.ia_justificativa || '')}</div>\n        <div class=\"just\"><strong>Ação recomendada:</strong> ${esc(r.ia_acao || '')}</div>\n        <div class=\"just\" style=\"color:#6b7873\">Confiança da classificação: ${esc(r.ia_confianca)}%${r.ia_gravidade && r.ia_gravidade !== 'nenhuma' ? ' · gravidade da divergência: ' + esc(r.ia_gravidade) : ''}</div>\n      </div>\n    </div>\n\n    ${r.acao_imediata ? '<div class=\"card\"><div class=\"hd\">Ação imediata tomada na operação</div><div class=\"bd\"><div class=\"desc\">' + esc(r.acao_imediata) + '</div></div></div>' : ''}\n\n    <div class=\"card\">\n      <div class=\"hd\">O que a IA recebeu — texto original, sem edição</div>\n      <div class=\"bd\"><div class=\"desc bruto\">${esc(r.transcricao || '(não registrado)')}</div></div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"hd\">Investigação</div>\n      <div class=\"bd\">\n        <div class=\"acoes\" style=\"margin:0;padding:0;border:none\">\n          <span class=\"stat\">Status atual: <strong>${esc(r.status || '—')}</strong></span>\n          ${acoesDe(r, s)}\n        </div>\n        ${s.aviso ? '<div class=\"aviso\" style=\"margin:12px 0 0\">' + esc(s.aviso) + '</div>' : ''}\n      </div>\n    </div>\n  </div></div>`;\n}\n\nexport default {\n  css: `\n:host{all:initial}\n*{box-sizing:border-box}\n.wrap{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;color:#15211c;background:#f2f4f1;height:100%;overflow:auto;padding:22px;line-height:1.5}\n.shell{max-width:1040px;margin:0 auto;display:flex;flex-direction:column;gap:16px}\n\n.top{display:flex;justify-content:space-between;align-items:flex-end;gap:16px;flex-wrap:wrap}\n.top .n{font-size:21px;font-weight:700;letter-spacing:-.2px}\n.top .s{font-size:12.5px;color:#5b6862;margin-top:2px}\n.chip{border:1.5px solid #15211c;padding:4px 10px;font-size:11px;font-weight:700;letter-spacing:1.5px}\n\n.tese{background:#fbeae7;border:1.5px solid #b33a2b;border-radius:4px;padding:16px 19px;display:flex;gap:16px;align-items:center;flex-wrap:wrap}\n.tese .big{font-size:40px;font-weight:700;color:#8c2a1e;line-height:1;font-variant-numeric:tabular-nums}\n.tese .txt{flex:1;min-width:250px}\n.tese .t1{font-size:15.5px;font-weight:700;color:#8c2a1e}\n.tese .t2{font-size:13.5px;color:#3c4a44;margin-top:3px}\n\n.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}\n.kpi{background:#fff;border:1px solid #d6ddd8;border-radius:4px;padding:14px 16px}\n.kpi .v{font-size:26px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.1}\n.kpi .l{font-size:10.5px;letter-spacing:.8px;text-transform:uppercase;color:#6b7873;margin-top:4px}\n.kpi.up .v{color:#b33a2b}\n.kpi.down .v{color:#186a4b}\n\n.card{background:#fff;border:1px solid #d6ddd8;border-radius:4px}\n.card .hd{padding:11px 16px;border-bottom:1px solid #e6ebe7;font-size:10.5px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;color:#6b7873;display:flex;justify-content:space-between;gap:10px;align-items:center;flex-wrap:wrap}\n.card .bd{padding:16px}\n\n.dist{display:flex;flex-direction:column;gap:4px}\n.dl{display:flex;align-items:center;gap:10px;font-size:12.5px}\n.dl .nm{width:170px;flex:none;color:#3c4a44}\n.dl .bar{height:17px;border-radius:2px;background:#8dd2af;min-width:2px}\n.dl.up .bar{background:#e0918a}\n.dl .ct{font-size:12px;color:#6b7873;font-variant-numeric:tabular-nums}\n.dl.zero .nm,.dl.zero .ct{color:#aab5af}\n.divisor{display:flex;align-items:center;gap:9px;margin:7px 0}\n.divisor .r{flex:1;height:2.5px;background:#15211c}\n.divisor .l{font-size:9.5px;font-weight:700;letter-spacing:1.3px;white-space:nowrap}\n\n.fil{display:flex;gap:6px;flex-wrap:wrap}\n.fil button{padding:5px 12px;font-size:12px;border:1px solid #cfd8d2;background:#fff;border-radius:999px;cursor:pointer;font-family:inherit;color:#3c4a44}\n.fil button[data-on=\"1\"]{background:#15211c;color:#fff;border-color:#15211c}\n\ntable{width:100%;border-collapse:collapse;font-size:13.5px}\nth{text-align:left;padding:8px 12px;font-size:10px;letter-spacing:.9px;text-transform:uppercase;color:#6b7873;border-bottom:1px solid #cfd8d2;white-space:nowrap}\ntd{padding:10px 12px;border-bottom:1px solid #eef2ef;vertical-align:top}\ntr.linha{cursor:pointer}\ntr.linha:hover td{background:#f7f9f7}\ntr.alerta td{background:#fdf3f1}\ntr.alerta:hover td{background:#fbeae7}\n.tit{font-weight:600}\n.sub{font-size:11.5px;color:#6b7873;margin-top:1px}\n.badge{display:inline-block;font-size:9.5px;font-weight:700;letter-spacing:.7px;padding:2px 7px;border-radius:2px;white-space:nowrap}\n.badge.up{background:#b33a2b;color:#fff}\n.badge.down{background:#e2ebe5;color:#2c4a3c}\n.seta{color:#8b968f;padding:0 5px}\n.decl{color:#6b7873;text-decoration:line-through}\n.nav{display:flex;gap:10px;align-items:center}\n.nav button{padding:7px 14px;font-size:12.5px;border:1px solid #cfd8d2;background:#fff;border-radius:3px;cursor:pointer;font-family:inherit;color:#3c4a44;font-weight:600}\n.nav button:hover{border-color:#186a4b;color:#186a4b}\n.acoes{display:flex;gap:9px;align-items:center;flex-wrap:wrap;margin-top:11px;padding-top:11px;border-top:1px solid #e2e8e4}\n.acoes .stat{font-size:12.5px;color:#6b7873;margin-right:4px}\n.st-btn{padding:6px 13px;font-size:12.5px;border:1px solid #15211c;background:#15211c;color:#fff;border-radius:3px;cursor:pointer;font-family:inherit;font-weight:600}\n.st-btn.ghost{background:#fff;color:#15211c}\n.st-btn:hover{opacity:.85}\n.st-btn[disabled]{opacity:.4;cursor:not-allowed}\n.pill{display:inline-block;font-size:10px;font-weight:700;letter-spacing:.6px;padding:1px 6px;border-radius:2px;background:#e2e8e4;color:#3c4a44;margin-left:6px}\n.pill.inv{background:#fdf6e3;color:#8c6d1f}\n.pill.fim{background:#e7f2ec;color:#14563c}\n.aviso{margin:0 16px 12px;font-size:12.5px;color:#8c6d1f;background:#fdf6e3;border:1px solid #f0e0b0;padding:9px 12px;border-radius:3px}\n.vazio{padding:26px;text-align:center;color:#8b968f;font-size:14px}\n.carregando{padding:26px;text-align:center;color:#6b7873;font-size:14px}\n.err{margin:16px;font-size:13px;color:#8c2a1e;background:#fbeae7;border:1px solid #e6b8b0;padding:11px 13px;border-radius:3px}\n@media(max-width:700px){.dl .nm{width:120px}th.ocult,td.ocult{display:none}}\n\n.voltar{padding:7px 14px;font-size:12.5px;border:1px solid #cfd8d2;background:#fff;border-radius:3px;cursor:pointer;font-family:inherit;color:#3c4a44;font-weight:600}\n.voltar:hover{border-color:#186a4b;color:#186a4b}\n.prot{font-family:ui-monospace,Menlo,monospace;font-size:12.5px;color:#6b7873;letter-spacing:.4px}\n.dtit{font-size:22px;font-weight:700;letter-spacing:-.3px;line-height:1.2;margin-top:3px}\n.ident{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px 20px}\n.ident .f{display:flex;flex-direction:column;gap:1px}\n.ident .f .l{font-size:10px;letter-spacing:.8px;text-transform:uppercase;color:#6b7873}\n.ident .f .v{font-size:14px;font-weight:500}\n.alert{padding:15px 18px;border-radius:4px;display:flex;gap:14px;align-items:flex-start}\n.alert.up{background:#fbeae7;border:1.5px solid #b33a2b}\n.alert.down{background:#e7f2ec;border:1.5px solid #186a4b}\n.alert .ic{flex:none;margin-top:1px}\n.alert .t{font-size:15.5px;font-weight:700;margin-bottom:3px}\n.alert.up .t{color:#8c2a1e}\n.alert.down .t{color:#14563c}\n.alert .d{font-size:13.5px;color:#3c4a44}\n.pyr{display:flex;flex-direction:column;align-items:center;gap:3px;padding:4px 0}\n.lvl{width:100%;max-width:440px;display:flex;align-items:center;gap:9px;padding:7px 12px;border-radius:3px;background:#f2f4f1;font-size:13px;border:1.5px solid transparent}\n.lvl .k{font-weight:700;min-width:112px;font-size:12.5px}\n.lvl .dd{color:#6b7873;font-size:12px;flex:1}\n.lvl .tag{font-size:9.5px;font-weight:700;letter-spacing:.8px;padding:2px 6px;border-radius:2px;white-space:nowrap}\n.lvl.apurado{background:#fff;border-color:#15211c;box-shadow:0 1px 4px rgba(0,0,0,.1)}\n.lvl.apurado .tag{background:#15211c;color:#fff}\n.lvl.declarado .tag{background:#d6ddd8;color:#3c4a44}\n.lvl.acima{background:#fdf3f1}\n.lvl.acima.apurado{background:#fbeae7;border-color:#b33a2b}\n.lvl.acima.apurado .tag{background:#b33a2b}\n.pyr-linha{width:100%;max-width:440px;display:flex;align-items:center;gap:9px;margin:6px 0}\n.pyr-linha .r{flex:1;height:2.5px;background:#15211c}\n.pyr-linha .l{font-size:9.5px;font-weight:700;letter-spacing:1.3px;color:#15211c;white-space:nowrap}\n.quote{border-left:3px solid #b33a2b;padding:10px 14px;background:#fdf3f1;font-size:14.5px;border-radius:0 3px 3px 0}\n.quote .lb{font-size:10px;letter-spacing:.9px;text-transform:uppercase;color:#8c2a1e;margin-bottom:4px}\n.just{font-size:13.5px;color:#3c4a44;margin-top:11px}\n.desc{font-size:14.5px;background:#f7f9f7;padding:14px;border-radius:3px;border:1px solid #e6ebe7;line-height:1.65}\n.desc.bruto{font-size:13px;color:#3c4a44}\nmark{background:#ffe9a8;padding:1px 2px;border-radius:2px}\n`,\n\n  render(d2) {\n    const s = d2.state;\n    if (s.erro) return `<div class=\"wrap\"><div class=\"shell\"><div class=\"err\">${esc(s.erro)}</div></div></div>`;\n    if (!s.registros) return `<div class=\"wrap\"><div class=\"shell\"><div class=\"card\"><div class=\"carregando\">Carregando reportes…</div></div></div></div>`;\n\n    const regs = s.registros.slice().sort((a, b) => new Date(b.criado_em || 0) - new Date(a.criado_em || 0));\n\n    if (s.detalhe) {\n      const alvo = regs.filter((x) => x.protocolo === s.detalhe)[0];\n      if (alvo) return telaDetalhe(alvo, s);\n    }\n\n    const total = regs.length;\n    const acima = regs.filter((r) => eAcima(r.ia_nivel));\n    const diverg = regs.filter((r) => r.ia_divergencia);\n    const taxa = total ? Math.round((diverg.length / total) * 100) : 0;\n\n    const datas = regs.map((r) => new Date(r.criado_em)).filter((d) => !isNaN(d));\n    const unids = [];\n    regs.forEach((r) => { const u = (r.unidade || '').trim(); if (u && unids.indexOf(u) < 0) unids.push(u); });\n    const periodo = datas.length\n      ? dataCurta(new Date(Math.min.apply(null, datas))) + ' a ' + dataCurta(new Date(Math.max.apply(null, datas))) + ' · ' + unids.length + (unids.length === 1 ? ' unidade' : ' unidades')\n      : 'sem reportes no período';\n\n    const filtro = s.filtro || 'todos';\n    let lista = regs;\n    if (filtro === 'acima') lista = acima;\n    else if (filtro === 'diverg') lista = diverg;\n\n    const contaSA = regs.filter((r) => r.ia_area === 'SA').length;\n    const ordem = contaSA > total / 2 ? ORDEM_SA : ORDEM_ST;\n    const contagem = {};\n    regs.forEach((r) => { contagem[r.ia_nivel] = (contagem[r.ia_nivel] || 0) + 1; });\n    const maxCt = Math.max(1, ...ordem.map((k) => contagem[k] || 0));\n    const barras = ordem.slice().reverse().map((k) => {\n      const ct = contagem[k] || 0;\n      const up = eAcima(k);\n      const larg = Math.round((ct / maxCt) * 100);\n      const linha = `<div class=\"dl ${up ? 'up' : ''} ${ct ? '' : 'zero'}\"><span class=\"nm\">${esc(ROTULO[k] || k)}</span><span class=\"bar\" style=\"width:${ct ? Math.max(larg, 4) : 0}%\"></span><span class=\"ct\">${ct}</span></div>`;\n      return { k: k, up: up, html: linha };\n    });\n    let dist = '';\n    let jaCruzou = false;\n    barras.forEach((b) => {\n      if (!b.up && !jaCruzou) {\n        jaCruzou = true;\n        dist += `<div class=\"divisor\"><div class=\"r\"></div><span class=\"l\">A LINHA</span><div class=\"r\"></div></div>`;\n      }\n      dist += b.html;\n    });\n    const recon = contagem['RECONHECIMENTO_POSITIVO'] || 0;\n    if (recon) dist += `<div class=\"dl\"><span class=\"nm\">${esc(ROTULO.RECONHECIMENTO_POSITIVO)}</span><span class=\"bar\" style=\"width:${Math.max(Math.round((recon / maxCt) * 100), 4)}%\"></span><span class=\"ct\">${recon}</span></div>`;\n\n    const linhas = lista.length ? lista.map((r) => {\n      const up = eAcima(r.ia_nivel);\n      const declDif = r.ia_divergencia && r.tipo_declarado;\n\n      return `<tr class=\"linha ${up ? 'alerta' : ''}\" data-key=\"${esc(r._id)}\" data-prot=\"${esc(r.protocolo || '')}\">\n          <td style=\"white-space:nowrap;font-variant-numeric:tabular-nums\">${dataCurta(r.criado_em)}</td>\n          <td><div class=\"tit\">${esc(r.titulo || '(sem título)')}${pill(r.status)}</div><div class=\"sub\">${esc(r.protocolo || '')} · ${esc(r.reportado_por || 'anônimo')}</div></td>\n          <td class=\"ocult\"><div class=\"sub\" style=\"margin:0\">${esc((r.unidade || '').split('—')[0].trim())}</div></td>\n          <td>${declDif ? '<span class=\"decl\">' + esc(r.tipo_declarado) + '</span><span class=\"seta\">&rarr;</span>' : ''}<strong>${esc(ROTULO[r.ia_nivel] || r.ia_nivel || '—')}</strong></td>\n          <td><span class=\"badge ${up ? 'up' : 'down'}\">${up ? 'ACIMA' : 'abaixo'}</span></td>\n        </tr>`;\n    }).join('') : '<tr><td colspan=\"5\"><div class=\"vazio\">Nenhum reporte neste filtro.</div></td></tr>';\n\n    const fb = (k, t) => `<button data-f=\"${k}\" data-on=\"${filtro === k ? '1' : '0'}\">${t}</button>`;\n\n    return `<div class=\"wrap\"><div class=\"shell\">\n      <div class=\"top\">\n        <div><div class=\"n\">Painel de Reportes PreAction</div><div class=\"s\">${esc(periodo)}</div></div>\n        <div class=\"nav\"><button class=\"ir-reporte\">&larr; Novo reporte</button><div class=\"chip\">PREACTION</div></div>\n      </div>\n\n      <div class=\"tese\">\n        <div class=\"big\">${diverg.length}</div>\n        <div class=\"txt\">\n          <div class=\"t1\">${diverg.length === 1 ? 'reporte cruzou a linha sem ninguém perceber' : 'reportes cruzaram a linha sem ninguém perceber'}</div>\n          <div class=\"t2\">Foram registrados como indicador preventivo, mas a descrição do próprio colaborador conta um evento reativo. Sem a IA, ${diverg.length === 1 ? 'este caso ficaria' : 'estes casos ficariam'} fora da estatística e sem investigação.</div>\n        </div>\n      </div>\n\n      <div class=\"kpis\">\n        <div class=\"kpi\"><div class=\"v\">${total}</div><div class=\"l\">Reportes no período</div></div>\n        <div class=\"kpi up\"><div class=\"v\">${acima.length}</div><div class=\"l\">Acima da linha</div></div>\n        <div class=\"kpi up\"><div class=\"v\">${taxa}%</div><div class=\"l\">Taxa de subnotificação</div></div>\n        <div class=\"kpi down\"><div class=\"v\">${total - acima.length}</div><div class=\"l\">Preventivos</div></div>\n      </div>\n\n      <div class=\"card\">\n        <div class=\"hd\">Distribuição na pirâmide</div>\n        <div class=\"bd\"><div class=\"dist\">${dist}</div></div>\n      </div>\n\n      ${s.aviso ? '<div class=\"aviso\">' + esc(s.aviso) + '</div>' : ''}\n\n      <div class=\"card\">\n        <div class=\"hd\"><span>Reportes</span><span class=\"fil\">${fb('todos', 'Todos (' + total + ')')}${fb('acima', 'Acima da linha (' + acima.length + ')')}${fb('diverg', 'Divergências (' + diverg.length + ')')}</span></div>\n        <table>\n          <thead><tr><th>Data</th><th>Reporte</th><th class=\"ocult\">Unidade</th><th>Declarado → apurado</th><th>Linha</th></tr></thead>\n          <tbody>${linhas}</tbody>\n        </table>\n      </div>\n    </div></div>`;\n  },\n\n  mounted(d2) {\n    const carregar = async () => {\n      try {\n        const r = await chamar('sst-listar', {});\n        const regs = (r && r.registros) || [];\n        // deep links: ?filtro=acima|diverg  ·  ?aberto=<protocolo>\n        let aberto = null;\n        let filtro = d2.state.filtro;\n        try {\n          const q = new URLSearchParams(location.search);\n          const f = q.get('filtro');\n          if (f === 'acima' || f === 'diverg' || f === 'todos') filtro = f;\n          const prot = q.get('aberto');\n          if (prot && regs.filter((x) => x.protocolo === prot).length) aberto = prot;\n        } catch (e) { /* sem query string */ }\n        d2.setState({ registros: regs, erro: '', detalhe: d2.state.detalhe || aberto, filtro: filtro });\n      } catch (err) {\n        d2.setState({ erro: 'Não consegui carregar os reportes: ' + String(err.message || err) });\n      }\n    };\n    carregar();\n\n    d2.on('.fil button', 'click', (e) => {\n      d2.setState({ filtro: e.target.getAttribute('data-f'), detalhe: null });\n    });\n\n    d2.on('tr.linha', 'click', (e) => {\n      const tr = e.target.closest('tr.linha');\n      if (!tr || e.target.closest('.st-btn')) return;\n      d2.setState({ detalhe: tr.getAttribute('data-prot') });\n    });\n\n    d2.on('.voltar', 'click', () => { d2.setState({ detalhe: null }); });\n\n    d2.on('.ir-reporte', 'click', () => { d2.router('preaction-router').goTo('/'); });\n\n    d2.on('.st-btn', 'click', async (e) => {\n      const b = e.target.closest('.st-btn');\n      if (!b) return;\n      const id = b.getAttribute('data-id');\n      const st = b.getAttribute('data-st');\n      d2.setState({ salvandoStatus: id, aviso: '' });\n      try {\n        await chamar('sst-status', {\n          id: id,\n          status: st,\n          investigacao_por: 'Gerência de SST',\n          investigacao_em: new Date().toISOString()\n        });\n        const regs = (d2.state.registros || []).map((r) => (r._id === id ? Object.assign({}, r, { status: st }) : r));\n        d2.setState({ registros: regs, salvandoStatus: null });\n      } catch (err) {\n        d2.setState({ salvandoStatus: null, aviso: 'Não consegui atualizar o status: ' + String(err.message || err) });\n      }\n    });\n  }\n};"}}}}}}}},{"_id":"6a96f5c4db111ff24b700bd7","component":"data2-core-types@Component","system":"6a96e197cc271edcd35493f6","params":{"extends":"data2-core-primitives@Block","component":"preaction-reporte","package":"sodexo-ocr","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const ESCALAS = {\n  ST: {\n    nome: 'Segurança do Trabalho',\n    abaixo: [\n      { k: 'OBSERVACAO_ST', r: 'Observação de ST', d: 'condição ou comportamento inseguro' },\n      { k: 'QUASE_ACIDENTE', r: 'Quase acidente', d: 'contato com o risco, sem lesão' }\n    ],\n    acima: [\n      { k: 'FAC', r: 'FAC', d: 'primeiros socorros' },\n      { k: 'MTC', r: 'MTC', d: 'tratamento médico' },\n      { k: 'RWC', r: 'RWC', d: 'trabalho restrito' },\n      { k: 'LTI', r: 'LTI', d: 'afastamento' },\n      { k: 'FAT', r: 'FAT', d: 'fatalidade' }\n    ]\n  },\n  SA: {\n    nome: 'Segurança dos Alimentos',\n    abaixo: [\n      { k: 'OBSERVACAO_SA', r: 'Observação de SA', d: 'desvio de processo sem consumação' },\n      { k: 'QUASE_ACIDENTE', r: 'Quase acidente', d: 'barrado antes do comensal' }\n    ],\n    acima: [\n      { k: 'NAO_EVOLUIU', r: 'Não evoluiu', d: 'descartado tecnicamente' },\n      { k: 'SUSPEITA', r: 'Suspeita', d: 'suspeita de DTHA' },\n      { k: 'LESAO', r: 'Lesão', d: 'lesão causada pelo alimento' },\n      { k: 'DTHA_ALERGIA', r: 'DTHA / Alergia', d: 'confirmada ou manifestada' },\n      { k: 'FAT', r: 'FAT', d: 'fatalidade' }\n    ]\n  }\n};\n\n// Casos de demonstração, acessíveis só por ?caso=<chave>. Não aparecem como botão na tela.\n// São eventos NOVOS de propósito: nenhum deles existe no histórico do painel, para que\n// o reporte feito ao vivo apareça como registro novo no topo da lista, sem duplicar nada.\nconst EXEMPLOS = [\n  { t: 'O forno', v: 'Ó, é o seguinte. Eu tava tirando a assadeira do forno combinado, aí encostei o antebraço na grade quente. Ardeu bastante, ficou uma marca vermelha. Peguei gelo do kit de primeiros socorros e botei uma gaze. Continuei o turno normal. Tô reportando como quase acidente.' },\n  { t: 'A câmara fria', v: 'Escorreguei dentro da câmara fria carregando uma caixa de carne e torci o punho. Fui no pronto-socorro, imobilizaram o punho e o médico falou pra eu não pegar peso por uma semana. Me botaram no administrativo nesse período. Estou reportando como acidente.' },\n  { t: 'A prateleira', v: 'Tava organizando o estoque seco e uma caixa de arroz caiu da prateleira de cima e bateu no meu ombro. Doeu na hora e o ombro ficou dolorido, mas não procurei ninguém e terminei o turno. Não tem roxo nem marca nenhuma. Tô reportando como quase acidente.' },\n  { t: 'O corpo estranho', v: 'Um comensal achou um pedaço duro de plástico dentro do arroz e machucou a gengiva mordendo. Ele sangrou um pouco e foi levado ao ambulatório. Estou reportando como quase acidente de segurança dos alimentos.' }\n];\n\n// d2.rush() resolve para a origem do app e devolve 404 para quem nao e builder.\n// O host de API responde publicamente e tem CORS liberado para esta origem.\n// O slug do sistema e derivado do proprio endereco, para o componente ser portavel\n// entre ambientes sem edicao. Se a derivacao falhar, cai no host padrao.\nfunction hostRush() {\n  const padrao = 'https://sodexo-ocr.data2apis.com/rush/';\n  try {\n    const p = location.hostname.split('.');\n    const i = p.indexOf('data2');\n    let sistema = null;\n    if (p.length >= 3 && p[p.length - 2] === 'data2' && p[p.length - 1] === 'qa') sistema = p[0];\n    else if (i >= 2) sistema = (p[i - 1] === 'next') ? p[i - 2] : p[i - 1];\n    if (sistema) return 'https://' + sistema + '.data2apis.com/rush/';\n  } catch (e) { /* sem location, usa o padrao */ }\n  return padrao;\n}\nconst RUSH = hostRush();\n\nasync function chamar(ep, corpo) {\n  let res;\n  try {\n    res = await fetch(RUSH + ep, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(corpo || {})\n    });\n  } catch (e) {\n    throw new Error('Sem resposta do serviço ' + ep + '. Verifique a conexão.');\n  }\n  if (!res.ok) throw new Error('O serviço ' + ep + ' respondeu ' + res.status + '.');\n  const json = await res.json();\n  return json && json.data !== undefined ? json.data : json;\n}\n\nconst DECL_ROTULO = {\n  QUASE_ACIDENTE: 'quase acidente',\n  OBSERVACAO_ST: 'observação de ST',\n  OBSERVACAO_SA: 'observação de SA',\n  RECONHECIMENTO_POSITIVO: 'reconhecimento positivo',\n  ACIDENTE: 'acidente',\n  NAO_INFORMADO: 'sem tipo informado'\n};\n\nfunction rotuloDeclarado(c) {\n  if (!c) return 'sem tipo informado';\n  return DECL_ROTULO[String(c).toUpperCase()] || String(c).toLowerCase().replace(/_/g, ' ');\n}\n\nfunction esc(s) {\n  return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction realce(texto, trecho) {\n  const t = String(texto || '');\n  const alvo = String(trecho || '').trim();\n  if (!alvo) return esc(t);\n  const i = t.toLowerCase().indexOf(alvo.toLowerCase().slice(0, 60));\n  if (i < 0) return esc(t);\n  const fim = Math.min(t.length, i + alvo.length);\n  return esc(t.slice(0, i)) + '<mark>' + esc(t.slice(i, fim)) + '</mark>' + esc(t.slice(fim));\n}\n\nexport default {\n  css: `\n:host{all:initial}\n*{box-sizing:border-box}\n.wrap{font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;color:#15211c;background:#f2f4f1;height:100%;overflow:auto;padding:20px;line-height:1.5}\n.shell{max-width:860px;margin:0 auto;display:flex;flex-direction:column;gap:14px}\n\n.top{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap}\n.brand{display:flex;flex-direction:column;gap:3px}\n.brand .n{font-size:20px;font-weight:700;letter-spacing:-.2px}\n.brand .s{font-size:12.5px;color:#5b6862}\n.chip{border:1.5px solid #15211c;padding:4px 10px;font-size:11px;font-weight:700;letter-spacing:1.5px}\n\n.card{background:#fff;border:1px solid #d6ddd8;border-radius:4px}\n.card .hd{padding:11px 16px;border-bottom:1px solid #e6ebe7;font-size:10.5px;font-weight:700;letter-spacing:1.4px;text-transform:uppercase;color:#6b7873}\n.card .bd{padding:16px}\n\n.tabs{display:flex;gap:0;border-bottom:1px solid #d6ddd8}\n.tab{flex:1;padding:12px 8px;font-size:14px;font-weight:600;background:none;border:none;border-bottom:3px solid transparent;cursor:pointer;color:#6b7873;font-family:inherit}\n.tab[data-on=\"1\"]{color:#15211c;border-bottom-color:#186a4b}\n.tab:hover{background:#f7f9f7}\n\ntextarea{width:100%;min-height:130px;padding:12px;border:1px solid #cfd8d2;border-radius:3px;font:400 14.5px/1.55 inherit;resize:vertical;color:#15211c;background:#fff}\ntextarea:focus{outline:2px solid #186a4b;outline-offset:-1px}\n\n.btn{padding:10px 18px;border-radius:3px;border:1px solid #15211c;background:#15211c;color:#fff;font:600 14px inherit;cursor:pointer;font-family:inherit}\n.btn:hover{background:#000}\n.btn[disabled]{opacity:.4;cursor:not-allowed}\n.btn.ghost{background:#fff;color:#15211c}\n.btn.ghost:hover{background:#f2f4f1}\n.btn.rec{background:#b33a2b;border-color:#b33a2b}\n.btn.rec.on{background:#8c2a1e;border-color:#8c2a1e}\n.row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:12px}\n.nav{display:flex;gap:10px;align-items:center}\n.nav button{padding:7px 14px;font-size:12.5px;border:1px solid #cfd8d2;background:#fff;border-radius:3px;cursor:pointer;font-family:inherit;color:#3c4a44;font-weight:600}\n.nav button:hover{border-color:#186a4b;color:#186a4b}\n.hint{font-size:12.5px;color:#6b7873}\n\n.mic{display:flex;align-items:center;gap:12px}\n.dot{width:11px;height:11px;border-radius:50%;background:#c8d0cb;flex:none}\n.dot.on{background:#b33a2b;animation:pulse 1.1s infinite}\n@keyframes pulse{0%,100%{opacity:1}50%{opacity:.25}}\n@media (prefers-reduced-motion:reduce){.dot.on{animation:none}}\n\n.live{margin-top:12px;padding:12px;background:#f7f9f7;border:1px dashed #cfd8d2;border-radius:3px;min-height:70px;font-size:14.5px}\n.live .p{color:#8b968f}\n\n.steps{display:flex;flex-direction:column;gap:9px}\n.step{display:flex;gap:11px;align-items:center;font-size:14px;color:#8b968f}\n.step .b{width:19px;height:19px;border-radius:50%;border:2px solid #d6ddd8;flex:none;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}\n.step[data-s=\"doing\"]{color:#15211c;font-weight:600}\n.step[data-s=\"doing\"] .b{border-color:#186a4b;border-top-color:transparent;animation:spin .8s linear infinite}\n.step[data-s=\"done\"]{color:#3c4a44}\n.step[data-s=\"done\"] .b{border-color:#186a4b;background:#186a4b;color:#fff}\n@keyframes spin{to{transform:rotate(360deg)}}\n\n.alert{padding:15px 18px;border-radius:4px;display:flex;gap:14px;align-items:flex-start}\n.alert.up{background:#fbeae7;border:1.5px solid #b33a2b}\n.alert.down{background:#e7f2ec;border:1.5px solid #186a4b}\n.alert .ic{flex:none;margin-top:1px}\n.alert .t{font-size:15.5px;font-weight:700;margin-bottom:3px}\n.alert.up .t{color:#8c2a1e}\n.alert.down .t{color:#14563c}\n.alert .d{font-size:13.5px;color:#3c4a44}\n\nmark{background:#ffe9a8;padding:1px 2px;border-radius:2px}\n.desc{font-size:14px;background:#f7f9f7;padding:12px;border-radius:3px;border:1px solid #e6ebe7}\n\n.grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:10px 18px}\n.fld{display:flex;flex-direction:column;gap:2px}\n.fld .l{font-size:10px;letter-spacing:.7px;text-transform:uppercase;color:#6b7873}\n.fld .v{font-size:13.5px;font-weight:500}\n.warn{font-size:12px;color:#8c6d1f;background:#fdf6e3;border:1px solid #f0e0b0;padding:8px 11px;border-radius:3px;margin-top:11px}\n.err{font-size:13px;color:#8c2a1e;background:#fbeae7;border:1px solid #e6b8b0;padding:11px 13px;border-radius:3px}\n.ok{font-size:13.5px;color:#14563c;background:#e7f2ec;border:1px solid #a9d3bf;padding:11px 13px;border-radius:3px}\nimg.prev{max-width:100%;border:1px solid #d6ddd8;border-radius:3px;margin-top:11px;display:block}\ninput[type=file]{font-size:13px;font-family:inherit}\ntextarea.desc-edit{width:100%;min-height:104px;padding:13px;border:1px solid #cfd8d2;border-radius:3px;font:400 14.5px/1.6 inherit;resize:vertical;color:#15211c;background:#f7f9f7}\ntextarea.desc-edit:focus{outline:2px solid #186a4b;outline-offset:-1px;background:#fff}\n.dica{font-size:12.5px;color:#6b7873;margin-top:7px}\n`,\n\n  render(d2) {\n    const s = d2.state;\n    const etapa = s.etapa || 'entrada';\n    let corpo = '';\n\n    if (etapa === 'entrada') corpo = telaEntrada(d2, s);\n    else if (etapa === 'processando') corpo = telaProcessando(s);\n    else if (etapa === 'enviado') corpo = telaEnviado(s);\n    else corpo = telaRevisao(s);\n\n    return `<div class=\"wrap\"><div class=\"shell\">\n      <div class=\"top\">\n        <div class=\"brand\">\n          <div class=\"n\">Reporte PreAction</div>\n          <div class=\"s\">Quase acidente · condição de risco · comportamento de risco</div>\n        </div>\n        <div class=\"nav\"><button class=\"ir-painel\">Painel do gestor &rarr;</button><div class=\"chip\">PREACTION</div></div>\n      </div>\n      ${corpo}\n    </div></div>`;\n  },\n\n  mounted(d2) {\n    if (!d2.state.etapa) d2.setState({ etapa: 'entrada', tab: 'voz', texto: '' });\n\n    d2.on('.tab', 'click', (e) => {\n      d2.state.tab = e.target.closest('.tab').getAttribute('data-tab');\n    });\n\n    d2.on('.ta', 'input', (e) => { d2.state.texto = e.target.value; });\n\n    let rec = null;\n    const SR = window.SpeechRecognition || window.webkitSpeechRecognition;\n\n    d2.on('.mic-btn', 'click', () => {\n      if (d2.state.gravando) { if (rec) rec.stop(); return; }\n      if (!SR) { d2.state.erro = 'Este navegador não tem reconhecimento de fala. Use o Chrome, ou digite na aba Digitar.'; return; }\n      let base = d2.state.texto || '';\n      rec = new SR();\n      rec.lang = 'pt-BR';\n      rec.continuous = true;\n      rec.interimResults = true;\n      rec.onresult = (ev) => {\n        let firme = '', parcial = '';\n        for (let i = ev.resultIndex; i < ev.results.length; i++) {\n          const t = ev.results[i][0].transcript;\n          if (ev.results[i].isFinal) firme += t; else parcial += t;\n        }\n        if (firme) { base = (base + ' ' + firme).trim(); d2.state.texto = base; }\n        d2.state.parcial = parcial;\n      };\n      rec.onerror = (ev) => {\n        d2.setState({ gravando: false, parcial: '', erro: 'Microfone: ' + ev.error + '. Verifique a permissão do navegador.' });\n      };\n      rec.onend = () => { d2.setState({ gravando: false, parcial: '' }); };\n      try { rec.start(); d2.setState({ gravando: true, erro: '', parcial: '' }); }\n      catch (err) { d2.state.erro = 'Não consegui iniciar o microfone: ' + err.message; }\n    });\n\n    d2.on('.file', 'change', async (e) => {\n      const f = e.target.files && e.target.files[0];\n      if (!f) return;\n      d2.setState({ etapa: 'processando', passo: 'upload', erro: '' });\n      try {\n        const up = await d2.drive('sst-anexos').upload([f]);\n        const url = up && up[0] && up[0].fileUrl;\n        if (!url) throw new Error('O upload não devolveu URL do arquivo.');\n        d2.setState({ fotoUrl: url, passo: 'lendo' });\n\n        const r1 = await chamar('sst-ler-foto', { fotoUrl: url });\n        const texto = r1 && r1.texto;\n        if (!texto) throw new Error('Não consegui ler o formulário na foto.');\n        d2.setState({ texto: texto, passo: 'classificando' });\n\n        await analisar(d2, texto);\n      } catch (err) {\n        d2.setState({ etapa: 'entrada', erro: String(err.message || err) });\n      }\n    });\n\n    d2.on('.go', 'click', async () => {\n      const texto = (d2.state.texto || '').trim();\n      if (texto.length < 15) { d2.state.erro = 'Descreva o que aconteceu antes de analisar.'; return; }\n      d2.setState({ etapa: 'processando', passo: 'classificando', erro: '' });\n      try { await analisar(d2, texto); }\n      catch (err) { d2.setState({ etapa: 'entrada', erro: String(err.message || err) }); }\n    });\n\n    d2.on('.enviar', 'click', async () => {\n      const s = d2.state;\n      if (!s.ex) return;\n      d2.setState({ enviando: true, erro: '' });\n      try {\n        const protocolo = 'PA-' + String(Date.now()).slice(-5);\n        const campo = d2.$('.desc-edit');\n        const descricaoFinal = campo ? campo.value.trim() : (s.ex.descricao || '');\n        const corpo = Object.assign({}, s.ex, {\n          descricao: descricaoFinal,\n          descricao_editada: descricaoFinal !== (s.ex.descricao || '').trim(),\n          protocolo: protocolo,\n          criado_em: new Date().toISOString(),\n          origem: s.origem || 'texto',\n          unidade: 'Un. 4472 — Refeitório Central',\n          texto: s.texto,\n          anexo_url: s.fotoUrl || '',\n          anexo_tipo: s.fotoUrl ? 'foto' : ''\n        });\n        const r = await chamar('sst-registrar', corpo);\n        d2.setState({ enviando: false, etapa: 'enviado', protocolo: (r && r.protocolo) || protocolo });\n      } catch (err) {\n        d2.setState({ enviando: false, erro: 'Não consegui enviar: ' + String(err.message || err) });\n      }\n    });\n\n    d2.on('.ir-painel', 'click', () => { d2.router('preaction-router').goTo('/painel'); });\n\n    d2.on('.ver-painel', 'click', () => { d2.router('preaction-router').goTo('/painel'); });\n\n    d2.on('.novo', 'click', () => {\n      d2.setState({ etapa: 'entrada', tab: 'voz', texto: '', ex: null, cl: null, salvo: null, protocolo: null, fotoUrl: null, erro: '', parcial: '' });\n    });\n\n    // deep links para roteiro de demo e captura de tela:\n    //   ?aba=voz|foto|texto   abre direto na aba\n    //   ?caso=forno|camara|prateleira|vidro   carrega o caso e leva a conferencia\n    try {\n      const q = new URLSearchParams(location.search);\n      const aba = q.get('aba');\n      if (aba === 'voz' || aba === 'foto' || aba === 'texto') d2.state.tab = aba;\n      const mapa = { forno: 0, camara: 1, prateleira: 2, vidro: 3 };\n      const caso = q.get('caso');\n      if (caso && mapa[caso] !== undefined) {\n        const v = EXEMPLOS[mapa[caso]].v;\n        d2.setState({ texto: v, tab: 'texto', etapa: 'processando', passo: 'classificando', erro: '' });\n        analisar(d2, v).catch((err) => d2.setState({ etapa: 'entrada', erro: String(err.message || err) }));\n      }\n    } catch (e) { /* sem query string, segue normal */ }\n  }\n};\n\n// Extrai APENAS os campos do formulário. A classificação na pirâmide NAO acontece aqui\n// e nao volta para o navegador de quem reporta: ela roda no servidor, no envio.\n// Mostrar o veredito antes do envio ensinaria a pessoa a reescrever o relato para\n// escapar da linha, que e exatamente a subnotificacao que a solucao existe para combater.\nasync function analisar(d2, texto) {\n  const out = await chamar('sst-extrair', { texto: texto });\n  const ex = out && out.extraido;\n  if (!ex || !ex.descricao) throw new Error('Não consegui organizar o reporte. Tente de novo.');\n  d2.setState({\n    etapa: 'revisao',\n    ex: ex,\n    origem: d2.state.fotoUrl ? 'foto' : (d2.state.tab === 'voz' ? 'voz' : 'texto')\n  });\n}\n\nfunction telaEntrada(d2, s) {\n  const tab = s.tab || 'voz';\n  const on = (t) => (tab === t ? '1' : '0');\n  let painel = '';\n\n  if (tab === 'voz') {\n    painel = `\n      <div class=\"mic\">\n        <span class=\"dot ${s.gravando ? 'on' : ''}\"></span>\n        <button class=\"btn rec mic-btn ${s.gravando ? 'on' : ''}\">${s.gravando ? 'Parar de gravar' : 'Falar o reporte'}</button>\n        <span class=\"hint\">${s.gravando ? 'Ouvindo… fale naturalmente, como você falaria com o encarregado.' : 'Aperte e conte o que aconteceu. Não precisa saber escrever.'}</span>\n      </div>\n      <div class=\"live\">${s.texto ? esc(s.texto) : ''}${s.parcial ? ' <span class=\"p\">' + esc(s.parcial) + '</span>' : ''}${!s.texto && !s.parcial ? '<span class=\"p\">A transcrição aparece aqui enquanto você fala.</span>' : ''}</div>`;\n  } else if (tab === 'foto') {\n    painel = `\n      <div class=\"hint\">Fotografe o formulário de papel já preenchido. A IA lê os campos marcados e a descrição manuscrita.</div>\n      <div class=\"row\"><input class=\"file\" type=\"file\" accept=\"image/*\" capture=\"environment\"></div>\n      ${s.fotoUrl ? '<img class=\"prev\" src=\"' + esc(s.fotoUrl) + '\" alt=\"Formulário enviado\">' : ''}`;\n  } else {\n    painel = `<textarea class=\"ta\" placeholder=\"Descreva o que aconteceu, com suas palavras.\">${esc(s.texto || '')}</textarea>`;\n  }\n\n  return `\n    <div class=\"card\">\n      <div class=\"tabs\">\n        <button class=\"tab\" data-tab=\"voz\"   data-on=\"${on('voz')}\">Falar</button>\n        <button class=\"tab\" data-tab=\"foto\"  data-on=\"${on('foto')}\">Fotografar o papel</button>\n        <button class=\"tab\" data-tab=\"texto\" data-on=\"${on('texto')}\">Digitar</button>\n      </div>\n      <div class=\"bd\">\n        ${painel}\n        ${s.erro ? '<div class=\"err\" style=\"margin-top:12px\">' + esc(s.erro) + '</div>' : ''}\n        ${tab !== 'foto' ? '<div class=\"row\"><button class=\"btn go\">Analisar reporte</button><span class=\"hint\">A IA organiza o que você disse no formulário.</span></div>' : ''}\n      </div>\n    </div>`;\n}\n\nfunction telaProcessando(s) {\n  const ordem = ['upload', 'lendo', 'classificando'];\n  const atual = ordem.indexOf(s.passo || 'classificando');\n  const rotulos = {\n    upload: 'Enviando a foto',\n    lendo: 'Lendo o formulário manuscrito',\n    classificando: 'Organizando o formulário'\n  };\n  const passos = ordem.map((k, i) => {\n    const st = i < atual ? 'done' : (i === atual ? 'doing' : 'todo');\n    return `<div class=\"step\" data-s=\"${st}\"><span class=\"b\">${st === 'done' ? '<svg viewBox=\"0 0 24 24\" width=\"11\" height=\"11\" aria-hidden=\"true\"><path d=\"M4 12.5 9.5 18 20 6.5\" fill=\"none\" stroke=\"#fff\" stroke-width=\"3.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>' : ''}</span>${esc(rotulos[k])}</div>`;\n  }).join('');\n  return `<div class=\"card\"><div class=\"hd\">Analisando</div><div class=\"bd\"><div class=\"steps\">${passos}</div></div></div>`;\n}\n\n// Tela de conferência do colaborador. Mostra o que ELE mandou e como ficou o formulário.\n// Nao mostra nivel, nao mostra pirâmide, nao mostra se cruzou a linha.\nfunction telaRevisao(s) {\n  const ex = s.ex || {};\n\n  const incertos = (ex.campos_incertos || []).length\n    ? '<div class=\"warn\">A IA não teve certeza destes campos, confira: ' + esc((ex.campos_incertos || []).join(', ')) + '</div>' : '';\n\n  const campos = [\n    ['Setor', ex.setor], ['Turno', ex.turno], ['Tipo de reporte', ex.tipo_declarado],\n    ['Área', ex.area_declarada === 'SA' ? 'Segurança dos Alimentos' : (ex.area_declarada ? 'Segurança do Trabalho' : '')],\n    ['Agente do risco', ex.agente],\n    ['Houve lesão', ex.houve_lesao === true ? 'Sim' : (ex.houve_lesao === false ? 'Não' : '')],\n    ['Parte do corpo', ex.parte_corpo], ['Atendimento recebido', ex.atendimento],\n    ['EPI em uso', ex.epi_em_uso === true ? 'Sim' : (ex.epi_em_uso === false ? 'Não' : 'Não informado')],\n    ['Ação imediata', ex.acao_imediata],\n    ['Reportado por', ex.reportado_por], ['Função', ex.funcao]\n  ].filter((c) => c[1]).map((c) => `<div class=\"fld\"><span class=\"l\">${esc(c[0])}</span><span class=\"v\">${esc(c[1])}</span></div>`).join('');\n\n  return `\n    <div class=\"card\">\n      <div class=\"hd\">Confira antes de enviar</div>\n      <div class=\"bd\">\n        <div class=\"fld\" style=\"margin-bottom:12px\"><span class=\"l\">Título</span><span class=\"v\" style=\"font-size:16px\">${esc(ex.titulo || '')}</span></div>\n        <div style=\"font-size:10px;letter-spacing:.7px;text-transform:uppercase;color:#6b7873;margin-bottom:6px\">Descrição do fato</div>\n        <textarea class=\"desc-edit\">${esc(ex.descricao || '')}</textarea>\n        <div class=\"dica\">Se a transcrição trocou alguma palavra, corrija aqui. O que você falou fica guardado do jeito que saiu.</div>\n        <div class=\"grid2\" style=\"margin-top:16px\">${campos}</div>\n        ${incertos}\n        <div class=\"row\">\n          <button class=\"btn enviar\"${s.enviando ? ' disabled' : ''}>${s.enviando ? 'Enviando…' : 'Enviar reporte'}</button>\n          <button class=\"btn ghost novo\">Corrigir e começar de novo</button>\n        </div>\n        ${s.erro ? '<div class=\"err\" style=\"margin-top:11px\">' + esc(s.erro) + '</div>' : ''}\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"hd\">${s.origem === 'foto' ? 'A foto que você enviou' : 'O que você relatou, na íntegra'}</div>\n      <div class=\"bd\">\n        ${s.fotoUrl ? '<img class=\"prev\" style=\"margin:0 0 12px\" src=\"' + esc(s.fotoUrl) + '\" alt=\"Formulário enviado\">' : ''}\n        <div class=\"desc\" style=\"font-size:13.5px;color:#3c4a44\">${esc(s.texto || '')}</div>\n      </div>\n    </div>`;\n}\n\nfunction telaEnviado(s) {\n  return `\n    <div class=\"alert down\">\n      <svg class=\"ic\" viewBox=\"0 0 24 24\" width=\"23\" height=\"23\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"#186a4b\" stroke-width=\"1.8\"/><path d=\"M7 12.4 10.6 16 17 8.6\" fill=\"none\" stroke=\"#186a4b\" stroke-width=\"2.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n      <div>\n        <div class=\"t\">Reporte enviado</div>\n        <div class=\"d\">Protocolo <strong>${esc(s.protocolo || '')}</strong>. A Gerência de Unidade já recebeu. Obrigado por reportar.</div>\n      </div>\n    </div>\n\n    <div class=\"card\">\n      <div class=\"bd\">\n        <div class=\"hint\" style=\"font-size:13.5px\">Se a descrição indicar que o caso precisa de apuração, o SESMT abre a investigação. Você não precisa fazer mais nada.</div>\n        <div class=\"row\">\n          <button class=\"btn novo\">Fazer outro reporte</button>\n          <button class=\"btn ghost ver-painel\">Abrir o painel do gestor</button>\n        </div>\n      </div>\n    </div>`;\n}"}}}}}}}}]}},{"reference":"ExternalComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"5f060d9b1ca96def42f3c40a","displayName":"Builder AuthStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"credentials":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"verifier":{"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"sessionShared":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},"email":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"nR6Q9d7qdaPtZhJ28Q8Dy"},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"yPCJBTKo8q1Mw0B_3Kpwl"},"component":"data2-core-types@ArtboardReference"}}},"session":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"name"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"sessionMetadata":{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"}]},"component":"data2-core-logical-operators@And","displayName":"is active and has _id"}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $user"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-primitives@String","params":{"content":"@data2.app"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.email"}}}}},"component":"data2-core-functions@Includes","displayName":"isData2User"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}},"component":"data2-core-flow@Step"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.d2_app"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"management"}}]},"component":"data2-core-functions@Includes","displayName":"isData2App Exception"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}},"component":"data2-core-flow@Step"},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"has_access"}},"action":{"params":{"compare":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"actions":[{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $metadata.system"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":"filter","args":[{"_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"systems not found"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check system found"},{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.organization._id"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"}]},"component":"data2-core-flow@Parallel"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"system"}}],"body":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.visibility"}}}},"defaultCase":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"public"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"billing-owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}},{"component":"data2-core-primitives@String","params":{"content":"member"}}]},"component":"data2-core-functions@Includes","displayName":"has role with access"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"collaborator"}}},"component":"data2-core-comparison-operators@Equal","displayName":"is collaborator"}]},"component":"data2-core-logical-operators@And","displayName":"is org member and collaborator"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is collaborator"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is collaborator and has system access"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"private"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}}]},"component":"data2-core-functions@Includes","displayName":"is owner/admin"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is owner/admin"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is member and has system access"}]},"component":"data2-core-logical-operators@Or","displayName":"is owner/admin or has system access"}}}]},"component":"data2-core-flow@Switch"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@And","displayName":"has org member for all systems in request"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}},"component":"data2-core-flow@Step"},{"params":{"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"has_access"}}}}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"sessionExpiresIn":{"component":"data2-core-primitives@Number","params":{"content":604800}},"sessionRenewal":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"identityProviders":[{"provider":{"component":"data2-core-primitives@String","params":{"content":"GOOGLE"}},"clientId":{"component":"data2-core-primitives@String","params":{"content":"55470861603-22pvfc1t49lp8cjnbfk71s5ct9hp1q1v.apps.googleusercontent.com"}}}]},"reference":"Data2BuilderAuthentication","updatedAt":"2026-08-06T19:31:23.557Z"},{"_id":"5f060ee51ca96def42f3fbd1","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"reference":"UsersDataSet","updatedAt":"2026-03-04T21:16:40.291Z"},{"_id":"68f938cf5fb002e33752a43d","displayName":"InternalApplicationsAuthenticationStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"InternalApplicationsVerifierDataSet"}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"secret"}},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}],"session":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}]},"reference":"InternalApplicationsAuthenticationStrategy","updatedAt":"2025-10-22T20:08:54.442Z","createdAt":"2025-10-22T20:04:31.198Z"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"_id":"5f1600b70528b92601890f75","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ServiceComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:20.208Z","createdAt":"2020-07-20T20:38:15.436Z"},{"_id":"5f1602190528b92601890f7d","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":40000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"sort":{"_id":1},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:07.089Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"5f16017f0528b92601890f7a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"FileComponentInstancesDataSet","updatedAt":"2023-08-03T16:08:18.193Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"5f1601990528b92601890f7b","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"pk":"_id","autoEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"ApplicationsDataSet","updatedAt":"2022-12-13T21:51:13.995Z","createdAt":"2020-07-20T20:42:01.657Z"},{"_id":"5f16172a0528b92601890f85","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DataComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:12.831Z","createdAt":"2020-07-20T22:14:02.097Z"},{"_id":"60ddc1bbda3861ca65407c5a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"pagination":{"size":1},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2022-02-09T19:44:38.036Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"63ee3d38b8c9838c62fb05fb","displayName":"DriveFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2025-12-04T21:58:32.367Z","createdAt":"2023-02-16T14:27:07.797Z"},{"reference":"ServiceComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a96f6fbd5fc55642b95a2b1","component":"data2-core-primitives@Router","system":"6a96e197cc271edcd35493f6","displayName":"PreAction — Router","params":{"routerType":{"component":"data2-core-primitives@String","params":{"content":"browser"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":"","name":"Reportar · PreAction","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"ZQ2vWxHZWRWvsYQFlXNpF"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/painel","name":"Painel do Gestor · PreAction","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"xnjl_PSDLCet3Wt7Wpqqz"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/roteiro","name":"Roteiro da Demo · PreAction","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"qmj0HPtvFQRna_SroLNXC"}}}}]},"reference":"preaction-router","deleteMetadata":{}},{"_id":"6a96f6e84803a5a2174f327a","component":"data2-core-primitives@Artboard","system":"6a96e197cc271edcd35493f6","displayName":"PreAction — Roteiro da Demo","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"PreAction — Roteiro da Demo"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":1600}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"qmj0HPtvFQRna_SroLNXC","deleteMetadata":{}},{"_id":"6a96f6e7e63caef1bf0d1272","component":"data2-core-primitives@Artboard","system":"6a96e197cc271edcd35493f6","displayName":"PreAction — Painel","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"PreAction — Painel"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1200,"height":1500}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"xnjl_PSDLCet3Wt7Wpqqz","deleteMetadata":{}},{"_id":"6a96f6e7db111ff24b700e29","component":"data2-core-primitives@Artboard","system":"6a96e197cc271edcd35493f6","displayName":"PreAction — Reporte","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"PreAction — Reporte"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1080,"height":1400}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"ZQ2vWxHZWRWvsYQFlXNpF","deleteMetadata":{}},{"_id":"d4786bb7483cc34adfadcaa8","parent":"6a96f6e84803a5a2174f327a","component":"sodexo-ocr@preaction-roteiro","system":"6a96e197cc271edcd35493f6","displayName":"Roteiro da Demo","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1100,"height":1600}}}},"reference":"EDEnvohrDHer5an0Tr4kX","deleteMetadata":{}},{"_id":"48a081608a72d8e3af0ce132","parent":"6a96f6e7e63caef1bf0d1272","component":"sodexo-ocr@preaction-painel","system":"6a96e197cc271edcd35493f6","displayName":"Painel PreAction","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1200,"height":1500}}}},"reference":"TvHEVNI8tFuvPCSUTihPF","deleteMetadata":{}},{"_id":"772e15abfd16b52a701fe8bd","parent":"6a96f6e7db111ff24b700e29","component":"sodexo-ocr@preaction-reporte","system":"6a96e197cc271edcd35493f6","displayName":"Reporte PreAction","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1080,"height":1400}}}},"reference":"joJuM5ClTEdJIPZilY5T4","deleteMetadata":{}}]}},{"_id":"5fc4faeec8da12be8bf3d08a","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileId"}},"title":"File ID","component":"data2-core-primitives@ObjectId"},"break":true}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[{"hook":"fileUrl","options":{"downloadField":"params.fileUrl","uploadField":"params.uploadFileUrl","enhanceSchema":false}}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"FileComponentInstancesTableDataSource","updatedAt":"2022-12-19T20:42:51.837Z","createdAt":"2020-11-30T13:59:52.294Z"},{"reference":"ApplicationsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a96f7002e79b418f4521579","displayName":"PreAction — Reporte e Painel","reference":"3oWG8tx4TJtnd_HyHOaIq","params":{"domain":{"component":"data2-core-primitives@String","params":{"content":"preaction"}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Router","reference":"preaction-router"}}},"system":"6a96e197cc271edcd35493f6","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}