{"context":{"domain":"pinati"},"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":"2022-03-09T02:01:26.213Z"}]}},{"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}],"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":"2025-11-05T19:23:47.135Z","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":"6a46ecf96b7022d96dbcc514","name":"App","domain":"pinati","visibility":"public","updatedAt":"2026-07-02T22:58:05.844Z","createdAt":"2026-07-02T22:58:01.527Z"}]}},{"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":"6a4704fdfb4b5485eb75d560","component":"data2-core-types@Component","system":"6a46ecf96b7022d96dbcc514","params":{"extends":"data2-core-primitives@Block","component":"kpinati","package":"pinati","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 esc = (s) => String(s ?? '').replace(/[<>&\"]/g, (c) => ({'<':'&lt;','>':'&gt;','&':'&amp;','\"':'&quot;'}[c]))\nconst nf = (v) => Number(v ?? 0).toLocaleString('pt-BR')\n\nconst NAV = [\n  ['visao', 'Visão Geral', '/'],\n  ['explorar', 'Explorar', '/explorar'],\n  ['lucro', 'Lucratividade', '/lucratividade'],\n  ['combos', 'Combinações', '/combinacoes'],\n  ['plano', 'Plano de Ação', '/plano-de-acao'],\n  ['fech', 'Fechamento do Dia', '/fechamento'],\n]\n\nconst header = (page) => `<header>\n  <div class=\"brand\"><div class=\"logo\">PINATI</div><div class=\"sub\">cozinha israelense &amp; deli · Higienópolis</div></div>\n  <nav>${NAV.map(([k, l, p]) => `<button class=\"nav-btn ${k === page ? 'on' : ''}\" data-path=\"${p}\">${l}</button>`).join('')}</nav>\n</header>`\n\nconst bars = (rows, nameK, valK, colorFn, meta) => {\n  if (!rows || !rows.length) return '<div class=\"note\">Sem dados ainda.</div>'\n  const max = Math.max(...rows.map(r => Number(r[valK]) || 0), meta || 0) * 1.12\n  const px = (v) => Math.max(2, Math.round((v / max) * 170))\n  const metaLine = meta ? `<div class=\"meta-line\" style=\"bottom:${px(meta) + 26}px\"><span>meta: ${meta}</span></div>` : ''\n  return `<div class=\"bars\">${metaLine}${rows.map(r => {\n    const v = Number(r[valK]) || 0\n    return `<div class=\"bcol\"><div class=\"bval\">${nf(v)}</div><div class=\"bar\" style=\"height:${px(v)}px;background:${colorFn(r)}\"></div><div class=\"bname\" title=\"${esc(r[nameK])}\">${esc(r[nameK])}</div></div>`\n  }).join('')}</div>`\n}\n\nconst PALETTE = ['#A6192E', '#B9822F', '#8A5A2B', '#4A5FA5', '#1F7A4D', '#8A7C72', '#D98E32', '#9C3F2E']\n\nconst groupedBars = (groups, fmtShort) => {\n  // groups: [{label, items:[{label, v}]}] — shared scale\n  let max = 0\n  groups.forEach(g => g.items.forEach(it => { if (it.v > max) max = it.v }))\n  max = (max || 1) * 1.12\n  const px = (v) => Math.max(2, Math.round((v / max) * 165))\n  return `<div class=\"bars gb\">${groups.map(g => `\n    <div class=\"ggroup\"><div class=\"gset\">${g.items.map((it, i) =>\n      `<div class=\"gbar\" title=\"${esc(g.label)} · ${esc(it.label)}: ${fmtShort(it.v)}\" style=\"height:${px(it.v)}px;background:${PALETTE[i % PALETTE.length]}\"></div>`).join('')}</div>\n    <div class=\"bname\" title=\"${esc(g.label)}\">${esc(g.label)}</div></div>`).join('')}</div>`\n}\n\nconst legend = (labels) => `<div class=\"leg-h\">${labels.map((l, i) => `<span class=\"leg-chip\"><span class=\"dot\" style=\"background:${PALETTE[i % PALETTE.length]}\"></span>${esc(l)}</span>`).join('')}</div>`\n\nconst heatmap = (rowDefs, colDefs, get, fmtShort) => {\n  let max = 0\n  rowDefs.forEach(r => colDefs.forEach(c => { const v = get(r.k, c.k); if (v > max) max = v }))\n  if (!max) return '<div class=\"note\">Sem dados ainda.</div>'\n  return `<div class=\"tablewrap\"><table class=\"heat\" style=\"min-width:${Math.max(420, 90 + colDefs.length * 74)}px\">\n    <thead><tr><th></th>${colDefs.map(c => `<th>${esc(c.label)}</th>`).join('')}</tr></thead>\n    <tbody>${rowDefs.map(r => `<tr><th>${esc(r.label)}</th>${colDefs.map(c => {\n      const v = get(r.k, c.k)\n      if (!v) return '<td class=\"hz\">—</td>'\n      const a = v / max\n      return `<td style=\"background:rgba(166,25,46,${(0.05 + a * 0.9).toFixed(2)});color:${a > 0.55 ? '#fff' : '#2B2320'}\" title=\"${esc(r.label)} × ${esc(c.label)}: ${fmtShort(v)}\">${fmtShort(v)}</td>`\n    }).join('')}</tr>`).join('')}</tbody></table></div>`\n}\n\nconst MES_PT = { '01': 'Jan', '02': 'Fev', '03': 'Mar', '04': 'Abr', '05': 'Mai', '06': 'Jun', '07': 'Jul', '08': 'Ago', '09': 'Set', '10': 'Out', '11': 'Nov', '12': 'Dez' }\nconst mesLbl = (m) => (MES_PT[String(m).slice(5, 7)] || m)\nconst DIAS = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta']\nconst DIA_SHORT = { Domingo: 'Dom', Segunda: 'Seg', 'Terça': 'Ter', Quarta: 'Qua', Quinta: 'Qui', Sexta: 'Sex' }\nconst LINHA_LBL = { 'rua-israelense': 'Rua Israelense', 'delicatessen-judaica': 'Deli Judaica', 'neutro': 'Neutro' }\nconst CATS = ['Entradas & Saladas', 'Hummus', 'No Prato', 'Sanduíches Israelenses', 'Da Nossa Esquina', 'Schnitzel & Burger', 'Hot Dog', 'Sobremesas', 'Bebidas', 'Cervejas', 'Vinho', 'Café']\n\n// ---------- dynamic explorer model ----------\nconst MET = {\n  f:  { l: 'Faturamento', src: 'both',    mil: true },\n  t:  { l: 'Ticket médio', src: 'servico', mil: false },\n  c:  { l: 'Couverts', src: 'servico', mil: false },\n  pe: { l: 'Pedidos', src: 'servico', mil: false },\n  q:  { l: 'Quantidade vendida', src: 'vendas', mil: false },\n  g:  { l: 'Margem', src: 'vendas', mil: true },\n}\nconst DIMS = {\n  m:  { l: 'Mês', src: 'both' },\n  d:  { l: 'Dia da semana', src: 'servico' },\n  p:  { l: 'Período', src: 'servico' },\n  cn: { l: 'Canal', src: 'servico' },\n  c:  { l: 'Categoria', src: 'vendas' },\n  l:  { l: 'Linha', src: 'vendas' },\n  i:  { l: 'Item (top 12)', src: 'vendas' },\n}\n\nconst sanitizeEx = (ex0) => {\n  const ex = { met: 'f', dim: 'm', dim2: null, viz: 'bars', ...(ex0 || {}) }\n  if (!DIMS[ex.dim]) ex.dim = 'm'\n  if (ex.dim2 === ex.dim) ex.dim2 = null\n  const srcs = [DIMS[ex.dim].src, ex.dim2 ? DIMS[ex.dim2].src : 'both']\n  let src = 'both'\n  if (srcs.includes('servico')) src = 'servico'\n  if (srcs.includes('vendas')) src = srcs.includes('servico') ? 'CONFLICT' : 'vendas'\n  if (src === 'CONFLICT') { ex.dim2 = null; src = DIMS[ex.dim].src }\n  if (src === 'both') src = (MET[ex.met] && MET[ex.met].src === 'vendas') ? 'vendas' : 'servico'\n  const canal = ex.dim === 'cn' || ex.dim2 === 'cn'\n  const okMet = (k) => (MET[k].src === 'both' || MET[k].src === src) && !(canal && k !== 'f')\n  if (!okMet(ex.met)) ex.met = 'f'\n  if (!ex.dim2 && ex.viz === 'heat') ex.viz = 'bars'\n  ex.src = src\n  ex.canal = canal\n  ex.okMet = okMet\n  ex.okDim2 = (k) => k !== ex.dim && (DIMS[k].src === 'both' || DIMS[ex.dim].src === 'both' || DIMS[k].src === DIMS[ex.dim].src)\n  return ex\n}\n\nconst dimValues = (rows, dimK, ex, met) => {\n  if (dimK === 'm') { const s = [...new Set(rows.map(r => r.m))].sort(); return s.map(k => ({ k, label: mesLbl(k) })) }\n  if (dimK === 'd') return DIAS.map(k => ({ k, label: DIA_SHORT[k] }))\n  if (dimK === 'p') return [{ k: 'almoco', label: 'Almoço' }, { k: 'jantar', label: 'Jantar' }]\n  if (dimK === 'cn') return [{ k: 'sa', label: 'Salão' }, { k: 'dl', label: 'Delivery' }, { k: 'rt', label: 'Retirada' }]\n  if (dimK === 'c') return CATS.filter(c => rows.some(r => r.c === c)).map(k => ({ k, label: k }))\n  if (dimK === 'l') return ['rua-israelense', 'delicatessen-judaica', 'neutro'].map(k => ({ k, label: LINHA_LBL[k] }))\n  if (dimK === 'i') {\n    const tot = {}\n    rows.forEach(r => { tot[r.i] = (tot[r.i] || 0) + (Number(r[met === 'q' ? 'q' : met === 'g' ? 'g' : 'f']) || 0) })\n    return Object.entries(tot).sort((a, b) => b[1] - a[1]).slice(0, 12).map(([k]) => ({ k, label: k }))\n  }\n  return []\n}\n\nconst rowDimKey = (r, dimK, canalK) => {\n  if (dimK === 'm') return r.m\n  if (dimK === 'd') return r.d\n  if (dimK === 'p') return r.p\n  if (dimK === 'cn') return canalK\n  if (dimK === 'c') return r.c\n  if (dimK === 'l') return r.l\n  if (dimK === 'i') return r.i\n  return '_'\n}\n\nconst aggregate = (raw, ex) => {\n  const rows = ex.src === 'vendas' ? (raw.vendas || []) : (raw.servico || [])\n  const acc = {}\n  const add = (k1, k2, f, c) => {\n    const key = k1 + '\u0001' + k2\n    const a = acc[key] || (acc[key] = { f: 0, c: 0 })\n    a.f += f; a.c += c\n  }\n  rows.forEach(r => {\n    const canals = ex.canal ? ['sa', 'dl', 'rt'] : ['_']\n    canals.forEach(cn => {\n      const base = ex.canal ? (Number(r[cn]) || 0) : null\n      let f, c\n      if (ex.src === 'vendas') { f = ex.met === 'q' ? (Number(r.q) || 0) : ex.met === 'g' ? (Number(r.g) || 0) : (Number(r.f) || 0); c = 1 }\n      else if (ex.canal) { f = base; c = 1 }\n      else if (ex.met === 'c') { f = Number(r.c) || 0; c = 1 }\n      else if (ex.met === 'pe') { f = Number(r.pe) || 0; c = 1 }\n      else { f = Number(r.f) || 0; c = Number(r.c) || 0 }\n      add(rowDimKey(r, ex.dim, cn), ex.dim2 ? rowDimKey(r, ex.dim2, cn) : '_', f, c)\n    })\n  })\n  const val = (k1, k2) => {\n    const a = acc[k1 + '\u0001' + (k2 || '_')]\n    if (!a) return 0\n    if (ex.met === 't') return a.c ? a.f / a.c : 0\n    return a.f\n  }\n  return val\n}\n\nconst vExplorar = (d2) => {\n  const raw = d2.state.raw\n  if (!raw) return `<div class=\"card\" style=\"text-align:center;color:#8A7C72\">Carregando a base completa (6 meses de serviço e vendas)…</div>`\n  const ex = sanitizeEx(d2.state.ex)\n  const met = MET[ex.met]\n  const fmtShort = (v) => met.mil ? nf(Math.round(v / 1000)) : nf(Math.round(v))\n  const unit = met.mil ? 'em R$ mil' : (ex.met === 't' ? 'em R$ por pessoa' : '')\n  const pills = (cls, defs, active, okFn) => Object.entries(defs).map(([k, o]) =>\n    `<button class=\"cpill ${cls} ${active === k ? 'on' : ''}\" data-k=\"${k}\" ${okFn && !okFn(k) ? 'disabled' : ''}>${o.l}</button>`).join('')\n  const rowsSrc = ex.src === 'vendas' ? raw.vendas : raw.servico\n  const d1 = dimValues(rowsSrc, ex.dim, ex, ex.met)\n  const d2vals = ex.dim2 ? dimValues(rowsSrc, ex.dim2, ex, ex.met) : null\n  const val = aggregate(raw, ex)\n  let chart, leg = ''\n  if (!ex.dim2) {\n    const data = d1.map(x => ({ label: x.label, v: met.mil ? Math.round(val(x.k) / 1000) : Math.round(val(x.k)) }))\n    chart = bars(data, 'label', 'v', () => '#A6192E')\n  } else if (ex.viz === 'heat') {\n    chart = heatmap(d1.map(x => ({ k: x.k, label: x.label })), d2vals, (a, b) => val(a, b), fmtShort)\n  } else {\n    const groups = d1.map(x => ({ label: x.label, items: d2vals.map(y => ({ label: y.label, v: val(x.k, y.k) })) }))\n    chart = groupedBars(groups, fmtShort)\n    leg = legend(d2vals.map(y => y.label))\n  }\n  let total = 0, top = null\n  d1.forEach(x => { const v = ex.met === 't' ? val(x.k) : d2vals ? d2vals.reduce((a, y) => a + val(x.k, y.k), 0) : val(x.k); total += v; if (!top || v > top.v) top = { label: x.label, v } })\n  const insight = ex.met === 't' ? `Maior ${met.l.toLowerCase()}: <b>${top ? esc(top.label) : '—'}</b> (${fmtShort(top ? top.v : 0)})`\n    : `Total: <b>${fmtShort(total)}</b> ${unit} · maior: <b>${top ? esc(top.label) : '—'}</b> (${fmtShort(top ? top.v : 0)})`\n  return `\n  <div class=\"card\">\n    <div class=\"ctrl\"><span class=\"clbl\">O que medir</span><div class=\"cpills\">${pills('ex-met', MET, ex.met, ex.okMet)}</div></div>\n    <div class=\"ctrl\"><span class=\"clbl\">Quebrar por</span><div class=\"cpills\">${pills('ex-dim', DIMS, ex.dim)}</div></div>\n    <div class=\"ctrl\"><span class=\"clbl\">Comparar por</span><div class=\"cpills\"><button class=\"cpill ex-dim2 ${!ex.dim2 ? 'on' : ''}\" data-k=\"\">Nada</button>${pills('ex-dim2', DIMS, ex.dim2, ex.okDim2)}</div></div>\n    ${ex.dim2 ? `<div class=\"ctrl\"><span class=\"clbl\">Visualização</span><div class=\"cpills\">\n      <button class=\"cpill ex-viz ${ex.viz === 'bars' ? 'on' : ''}\" data-k=\"bars\">Barras agrupadas</button>\n      <button class=\"cpill ex-viz ${ex.viz === 'heat' ? 'on' : ''}\" data-k=\"heat\">Mapa de calor</button></div></div>` : ''}\n  </div>\n  <div class=\"card\">\n    <div class=\"cardhead\"><span class=\"h2\">${met.l} por ${DIMS[ex.dim].l.toLowerCase()}${ex.dim2 ? ' × ' + DIMS[ex.dim2].l.toLowerCase() : ''}</span><span class=\"note\">${unit}</span></div>\n    ${leg}${chart}\n    <div class=\"body\" style=\"margin-top:14px\">${insight}</div>\n  </div>\n  <div class=\"card\"><div class=\"h2\">Como usar</div>\n    <p class=\"body\">Escolha <b>o que medir</b> e <b>como quebrar</b>. “Comparar por” abre uma segunda dimensão — em barras agrupadas ou mapa de calor. Faturamento e margem aparecem em R$ mil; ticket médio é por pessoa. Medidas de salão (couverts, pedidos, ticket) vêm dos fechamentos diários; quantidade e margem vêm das vendas por item.</p></div>`\n}\n\nconst pill = (label, color) => `<span class=\"pill\" style=\"background:${esc(color) || '#8A7C72'}\">${esc(label)}</span>`\nconst loading = `<div class=\"card\" style=\"text-align:center;color:#8A7C72\">Carregando os números da casa…</div>`\n\nconst vVisao = (d, d2) => {\n  if (!d) return loading\n  const kpi = (lbl, val, note, color) => `<div class=\"card\"><div class=\"lbl\">${lbl}</div><div class=\"val\" style=\"color:${color}\">${esc(val)}</div><div class=\"note\">${note}</div></div>`\n  // heatmap mês × dia (client-side from raw servico rows)\n  const raw = d2.state.raw\n  const hmMet = d2.state.hm || 'f'\n  let hmCard = `<div class=\"note\">Carregando o mapa de calor…</div>`\n  if (raw && raw.servico) {\n    const meses = [...new Set(raw.servico.map(r => r.m))].sort()\n    const acc = {}\n    raw.servico.forEach(r => { const k = r.d + '\u0001' + r.m; const a = acc[k] || (acc[k] = { f: 0, c: 0 }); a.f += r.f; a.c += r.c })\n    const get = (dk, mk) => { const a = acc[dk + '\u0001' + mk]; if (!a) return 0; return hmMet === 'c' ? a.c : hmMet === 't' ? (a.c ? a.f / a.c : 0) : a.f / 1000 }\n    const fmt = (v) => nf(Math.round(v))\n    hmCard = heatmap(DIAS.map(x => ({ k: x, label: DIA_SHORT[x] })), meses.map(m => ({ k: m, label: mesLbl(m) })), get, fmt)\n  }\n  const hmPill = (k, l) => `<button class=\"cpill hm-met ${hmMet === k ? 'on' : ''}\" data-k=\"${k}\">${l}</button>`\n  const fi = d2.state.ifood\n  const ifoodCard = !fi ? `<div class=\"card\"><div class=\"h2\">iFood — loja em tempo real</div><div class=\"note\" style=\"margin-top:8px\">Conectando à API oficial do iFood…</div></div>`\n    : fi.erro ? `<div class=\"card\"><div class=\"h2\">iFood — loja em tempo real</div><div class=\"note\" style=\"margin-top:8px\">Não foi possível falar com o iFood agora — tente recarregar a página.</div></div>`\n    : `<div class=\"card\">\n      <div class=\"cardhead\"><span class=\"h2\">iFood — loja em tempo real</span><span class=\"note\">API oficial · ${fi.teste === 'TEST' ? 'loja de TESTE vinculada — aguardando vínculo da loja real' : 'loja de produção'}</span></div>\n      <div class=\"ifood-row\">\n        <span class=\"pill\" style=\"background:${fi.aberta ? '#1F7A4D' : '#9C3F2E'};font-size:12px;padding:6px 14px\">${fi.aberta ? 'LOJA ABERTA' : 'LOJA FECHADA'}</span>\n        <b style=\"font-size:14px\">${esc(fi.loja)}</b>\n        <span class=\"note\">${esc(fi.statusTitulo)}${fi.statusDetalhe ? ' · ' + esc(fi.statusDetalhe) : ''}</span>\n      </div>\n      <div class=\"pb-meta\" style=\"margin-top:12px\">${(fi.validacoes || []).map(v => `<div><span class=\"clbl2\" style=\"color:${v.ok === 'OK' ? '#1F7A4D' : '#9C3F2E'}\">${v.ok === 'OK' ? '✓' : '✕'} ${esc(v.titulo)}</span>${esc(v.subtitulo || '')}</div>`).join('')}</div>\n      <div class=\"note\" style=\"margin-top:10px\">Avaliações no iFood: ${fi.reviewsTotal > 0 ? `<b>${nf(fi.reviewsTotal)}</b> no total` : 'ainda sem avaliações nesta loja'}.</div>\n    </div>`\n  return `\n  <div class=\"cards\">\n    ${kpi('Faturamento do mês', d.kpiFaturamento, `mês de referência: ${esc(d.kpiMes)} · meta R$ 280 mil`, '#A6192E')}\n    ${kpi('Ticket médio', d.kpiTicket, 'por pessoa, no mês', '#2B2320')}\n    ${kpi('Couverts no mês', nf(d.kpiCouverts), 'pessoas atendidas (55 lugares na casa)', '#2B2320')}\n    ${kpi('Rumo aos R$ 280 mil', d.kpiMeta, 'meta: +40% até dezembro de 2026', '#B9822F')}\n  </div>\n  <div class=\"card\"><div class=\"cardhead\"><span class=\"h2\">Faturamento mensal</span><span class=\"note\">em R$ mil</span></div>\n    ${bars(d.meses, 'mes', 'valor', () => '#A6192E', 280)}</div>\n  <div class=\"grid3\">\n    <div class=\"card\"><div class=\"h2\">Almoço × Jantar</div><div class=\"note\" style=\"margin-bottom:10px\">6 meses, em R$ mil</div>${donut(d.periodos, ['#A6192E', '#D98E32'])}</div>\n    <div class=\"card\"><div class=\"h2\">Vendas por canal</div><div class=\"note\" style=\"margin-bottom:10px\">6 meses, em R$ mil</div>${donut(d.canais, ['#A6192E', '#8A5A2B', '#8A7C72'])}</div>\n    <div class=\"card\"><div class=\"h2\">Onde estamos vs. a meta</div>\n      <div class=\"bigline\">R$ 200 mil → R$ 280 mil</div>\n      <p class=\"body\">Média dos últimos 6 meses: R$ 200 mil/mês. Meta para dezembro de 2026: R$ 280 mil/mês (+40%).</p>\n      <p class=\"body\">O plano de ação soma <b>+R$ 95 mil/mês</b> em impacto esperado — folga de R$ 15 mil sobre a meta. Acompanhe na aba <b>Plano de Ação</b>.</p></div>\n  </div>\n  <div class=\"card\"><div class=\"cardhead\"><span class=\"h2\">Mapa de calor — dia da semana × mês</span>\n    <div class=\"cpills\">${hmPill('f', 'Faturamento (R$ mil)')}${hmPill('c', 'Couverts')}${hmPill('t', 'Ticket médio')}</div></div>\n    ${hmCard}\n    <div class=\"note\" style=\"margin-top:8px\">Quanto mais escuro, mais forte. Domingo é o motor da semana; repare no salto de abril (Pessach). Quer cruzar outras medidas? Vá em <b>Explorar</b>.</div></div>\n  ${ifoodCard}\n  <div class=\"card\"><div class=\"cardhead\"><span class=\"h2\">Faturamento por dia da semana</span><span class=\"note\">em R$ mil · sábado fechado (Shabat) · sexta só almoço</span></div>\n    ${bars(d.dias, 'dia', 'valor', () => '#B9822F')}</div>`\n}\n\nconst donut = (items, palette) => {\n  if (!items || !items.length) return '<div class=\"note\">Sem dados ainda.</div>'\n  const total = items.reduce((a, x) => a + (Number(x.valor) || 0), 0) || 1\n  let off = 25\n  const segs = items.map((x, i) => {\n    const p = (Number(x.valor) || 0) / total * 100\n    const s = `<circle r=\"15.915\" cx=\"21\" cy=\"21\" fill=\"none\" stroke=\"${palette[i % palette.length]}\" stroke-width=\"7.5\" stroke-dasharray=\"${p.toFixed(2)} ${(100 - p).toFixed(2)}\" stroke-dashoffset=\"${off.toFixed(2)}\"></circle>`\n    off -= p\n    return s\n  }).join('')\n  return `<div class=\"donut-wrap\"><svg class=\"donut\" viewBox=\"0 0 42 42\">${segs}</svg>\n    <div class=\"leg\">${items.map((x, i) => `<div class=\"leg-row\"><span class=\"dot\" style=\"background:${palette[i % palette.length]}\"></span><span>${esc(x.label)}</span><b>R$ ${nf(x.valor)} mil · ${Math.round((Number(x.valor) || 0) / total * 100)}%</b></div>`).join('')}</div></div>`\n}\n\nconst scatter = (pratos) => {\n  const pts = (pratos || []).filter(p => p.qtd > 0)\n  if (!pts.length) return ''\n  const maxQ = Math.max(...pts.map(p => p.qtd))\n  const maxM = Math.max(...pts.map(p => p.margem_unit))\n  const qs = pts.map(p => p.qtd).sort((a, b) => a - b)\n  const medQ = qs[Math.floor(qs.length / 2)]\n  const avgM = pts.reduce((a, p) => a + p.margem_unit, 0) / pts.length\n  const dots = pts.map(p => {\n    const x = Math.sqrt(p.qtd / maxQ) * 94 + 2\n    const y = 94 - (p.margem_unit / maxM) * 88\n    return `<div class=\"dotpt\" style=\"left:${x.toFixed(1)}%;top:${y.toFixed(1)}%;background:${p.quadrante_color}\" title=\"${esc(p.nome)} — ${nf(p.qtd)} un · R$ ${nf(p.margem_unit)} de margem por unidade (${esc(p.quadrante)})\"></div>`\n  }).join('')\n  const gx = Math.sqrt(medQ / maxQ) * 94 + 2\n  const gy = 94 - (avgM / maxM) * 88\n  return `<div class=\"card\"><div class=\"cardhead\"><span class=\"h2\">Matriz popularidade × margem (cada ponto é um item)</span>\n    <span class=\"note\">passe o mouse para ver o item</span></div>\n    <div class=\"plot\">\n      <div class=\"gline v\" style=\"left:${gx.toFixed(1)}%\"></div>\n      <div class=\"gline h\" style=\"top:${gy.toFixed(1)}%\"></div>\n      <span class=\"pquad\" style=\"left:8px;top:6px;color:#4A5FA5\">Quebra-cabeças</span>\n      <span class=\"pquad\" style=\"right:8px;top:6px;color:#1F7A4D\">Estrelas</span>\n      <span class=\"pquad\" style=\"left:8px;bottom:6px;color:#9C3F2E\">Abacaxis</span>\n      <span class=\"pquad\" style=\"right:8px;bottom:6px;color:#B9822F\">Burros de Carga</span>\n      ${dots}</div>\n    <div class=\"axes\"><span>← vende pouco · vende muito →</span><span>margem por unidade: baixa ↓ · alta ↑</span></div></div>`\n}\n\nconst vLucro = (d) => {\n  if (!d) return loading\n  const linha = (lbl, color, val, note) => `<div class=\"card\"><div class=\"lbl\" style=\"color:${color}\">${lbl}</div><div class=\"val\" style=\"font-size:20px\">${val}</div><div class=\"note\">${note}</div></div>`\n  const quad = (lbl, color, body, note) => `<div class=\"card\"><div class=\"h2\" style=\"color:${color}\">${lbl}</div><p class=\"body\" style=\"font-size:12px\">${body}</p><div class=\"note\" style=\"font-style:italic\">${note}</div></div>`\n  const rows = (d.pratos || []).map(r => `<tr data-key=\"${r._id}\">\n    <td class=\"num muted\">${r.rank}</td>\n    <td><b>${esc(r.nome)}</b></td>\n    <td class=\"muted\">${esc(r.categoria)}</td>\n    <td>${pill(r.linha_label, r.linha_color)}</td>\n    <td class=\"num\">${nf(r.qtd)}</td>\n    <td class=\"num\"><b>${esc(r.faturamento_fmt)}</b></td>\n    <td class=\"num\" style=\"color:#1F7A4D\">${esc(r.margem_fmt)}</td>\n    <td class=\"num\">${esc(r.margem_pct_fmt)}</td>\n    <td>${pill(r.quadrante, r.quadrante_color)}</td></tr>`).join('')\n  return `\n  <div class=\"cards\">\n    ${linha('Rua Israelense', '#A6192E', 'R$ 637 mil · margem R$ 452 mil', 'falafel, shawarma, hummus — o motor da casa (58% da comida)')}\n    ${linha('Delicatessen Judaica', '#8A5A2B', 'R$ 259 mil · margem R$ 164 mil', 'pastrami, vursht, lox — já é 25% da comida: cresceu de 21% (jan) para 28% (jun)')}\n    ${linha('Neutro', '#8A7C72', 'R$ 305 mil · margem R$ 201 mil', 'chips, burgers, bebidas — o apoio do cardápio')}\n  </div>\n  <div class=\"cards\">\n    ${quad('Estrelas · 18 itens', '#1F7A4D', 'Populares e rentáveis: Shawarma Frango Lafa, Shawarma Carne Lafa, Pastrami Pita, Falafel Pita.', 'Proteja e destaque no cardápio.')}\n    ${quad('Burros de Carga · 13 itens', '#B9822F', 'Vendem muito, margem menor: Rugelach, Refrigerante, Chips, Água.', 'Reveja preço ou custo do insumo.')}\n    ${quad('Quebra-cabeças · 17 itens', '#4A5FA5', 'Rentáveis, mas vendem pouco: Schnitzel no Prato, Falafel no Prato, Tzibale, Lox&#39;N&#39;Pnt.', 'Dê visibilidade e sugestão na mesa.')}\n    ${quad('Abacaxis · 13 itens', '#9C3F2E', 'Pouca saída e pouca margem: Clássico Burger, Babaganush, Vinho da Casa (taça).', 'Repense a receita, o preço — ou remova.')}\n  </div>\n  ${scatter(d.pratos)}\n  <div class=\"card\" style=\"padding:0\"><div class=\"cardhead\" style=\"padding:16px 18px 8px\"><span class=\"h2\">Ranking completo — 61 itens do cardápio</span><span class=\"note\">deslize para o lado para ver todas as colunas</span></div>\n  <div class=\"tablewrap\"><table>\n    <thead><tr><th class=\"num\">#</th><th>Item</th><th>Categoria</th><th>Linha</th><th class=\"num\">Qtd</th><th class=\"num\">Faturamento</th><th class=\"num\">Margem</th><th class=\"num\">Margem %</th><th>Quadrante</th></tr></thead>\n    <tbody>${rows}</tbody></table></div></div>`\n}\n\nconst vCombos = (d) => {\n  if (!d) return loading\n  const rows = (d.afinidade || []).map(r => `<tr data-key=\"${r._id}\">\n    <td><b>${esc(r.item_a)}</b></td><td class=\"muted\" style=\"text-align:center\">→</td><td>${esc(r.item_b)}</td>\n    <td class=\"num muted\">${esc(r.pct_fmt)}</td><td class=\"num\">${pill(r.lift_fmt, '#A6192E')}</td></tr>`).join('')\n  const combo = (n, t, b) => `<div class=\"combo\"><div class=\"combo-t\">${n} · ${t}</div><p class=\"body\" style=\"font-size:12px;margin:4px 0 0\">${b}</p></div>`\n  return `\n  <div class=\"split\">\n    <div class=\"card\" style=\"padding:0\"><div class=\"cardhead\" style=\"padding:16px 18px 8px\"><span class=\"h2\">As duplas com maior força</span></div>\n      <div class=\"tablewrap\"><table style=\"min-width:640px\">\n      <thead><tr><th>Quem puxa</th><th></th><th>Item puxado</th><th class=\"num\">Juntos em</th><th class=\"num\">Força</th></tr></thead>\n      <tbody>${rows}</tbody></table></div></div>\n    <div>\n      <div class=\"card\" style=\"margin-bottom:14px\"><div class=\"h2\">Combos sugeridos pelos dados</div>\n        ${combo(1, 'Executivo da Esquina — sanduíche israelense + refri', 'A dupla já acontece em 4 de cada 10 pedidos do almoço. Formalize com preço fechado e agilize a decisão.')}\n        ${combo(2, 'Mesa Israelense — Hummus Bassar + Goldstar', 'A dupla com maior força da casa (3,2×). Cerveja israelense de margem alta puxada por um prato-assinatura.')}\n        ${combo(3, 'Clássico Completo — schnitzel ou burger + chips + pilsen', 'Chips aparece em 4 de cada 10 pedidos de schnitzel. Combo de jantar com tíquete ~R$ 90.')}\n        ${combo(4, 'Fecho Doce — rugelach + espresso', 'Força 3,1× nas duas direções. Ofereça no fim da refeição — sobe o tíquete em ~R$ 29 com margem de 75%.')}\n        <div class=\"note\" style=\"color:#B9822F;font-style:italic;margin-top:12px\">Dica: monte o combo sempre com um item Estrela + um item de bebida/entrada com margem alta.</div></div>\n      <div class=\"card\"><div class=\"h2\">Como ler este painel</div>\n        <p class=\"body\">“Juntos em” mostra em quantos pedidos os dois itens aparecem juntos.</p>\n        <p class=\"body\">“Força” compara com o acaso: 2,0× significa que a dupla aparece duas vezes mais do que o esperado.</p>\n        <p class=\"body\">Um bom combo nasce de força ≥ 2,0 com itens de margem alta — confira a margem na aba <b>Lucratividade</b>.</p></div>\n    </div>\n  </div>`\n}\n\nconst BRIDGE = [\n  { mes: 'Jun (hoje)', valor: 206 }, { mes: 'Jul', valor: 218 }, { mes: 'Ago', valor: 235 },\n  { mes: 'Set', valor: 250 }, { mes: 'Out', valor: 263 }, { mes: 'Nov', valor: 272 }, { mes: 'Dez', valor: 282 },\n]\n\nconst vPlano = (d, d2) => {\n  if (!d) return loading\n  const all = d.iniciativas || []\n  const estrategicas = all.filter(r => r.tipo !== 'tatica')\n  const taticas = all.filter(r => r.tipo === 'tatica').sort((a, b) => (a.ordem || 0) - (b.ordem || 0))\n  const sumTat = taticas.reduce((a, r) => a + (r.impacto_esperado_mensal || 0), 0)\n  const kpi = (lbl, val, color, note) => `<div class=\"card\"><div class=\"lbl\">${lbl}</div><div class=\"val\" style=\"color:${color};font-size:22px\">${val}</div>${note ? `<div class=\"note\">${note}</div>` : ''}</div>`\n  const rows = estrategicas.map(r => `<div class=\"ini\" data-key=\"${r._id}\">\n    <div class=\"ini-n\">${r.ordem}</div>\n    <div class=\"ini-main\"><b>${esc(r.nome)}</b><div class=\"note\" style=\"margin-top:3px\">${esc(r.descricao)}</div></div>\n    <div class=\"ini-side\"><span class=\"note\">${esc(r.periodo_label)}</span>${pill(r.status_label, r.status_color)}<b class=\"ini-val\">${esc(r.impacto_fmt)}</b></div>\n  </div>`).join('')\n  // ---- playbook das 50 ações ----\n  const cats = [...new Set(taticas.map(r => r.categoria_acao))]\n  const fcat = d2.state.fcat || ''\n  const fdif = d2.state.fdif || ''\n  const list = taticas.filter(r => (!fcat || r.categoria_acao === fcat) && (!fdif || r.dificuldade === fdif))\n  const sumList = list.reduce((a, r) => a + (r.impacto_esperado_mensal || 0), 0)\n  const catPill = (k, l) => `<button class=\"cpill f-cat ${fcat === k ? 'on' : ''}\" data-k=\"${esc(k)}\">${esc(l)}</button>`\n  const difPill = (k, l) => `<button class=\"cpill f-dif ${fdif === k ? 'on' : ''}\" data-k=\"${esc(k)}\">${esc(l)}</button>`\n  const open = d2.state.open\n  const items = list.map(r => {\n    const n = (r.ordem || 9) - 8\n    const isOpen = open === r._id\n    const passos = Array.isArray(r.passos) ? r.passos : []\n    return `<div class=\"pb ${isOpen ? 'open' : ''}\" data-key=\"${r._id}\">\n      <div class=\"pb-h ini-toggle\" data-id=\"${r._id}\">\n        <span class=\"pb-n\">${n}</span>\n        <span class=\"pb-t\"><b>${esc(r.nome)}</b><span class=\"pb-tags\">${pill(r.categoria_acao, '#8A5A2B')}${pill(r.dificuldade, r.dificuldade_color)}${pill(r.custo_label, '#8A7C72')}</span></span>\n        <span class=\"pb-side\"><span class=\"note\">${esc(r.responsavel)}</span><b class=\"ini-val\">${esc(r.impacto_fmt)}</b><span class=\"chev\">${isOpen ? '▲' : '▼'}</span></span>\n      </div>\n      ${isOpen ? `<div class=\"pb-b\">\n        <p class=\"body\" style=\"margin-top:10px\">${esc(r.descricao)}</p>\n        <div class=\"pb-meta\">\n          <div><span class=\"clbl2\">Potencial — como calculamos</span>${esc(r.potencial_detalhe)}</div>\n          <div><span class=\"clbl2\">Responsável</span>${esc(r.responsavel)}</div>\n          <div><span class=\"clbl2\">Custo estimado</span>${esc(r.custo_label)}</div>\n          <div><span class=\"clbl2\">Prazo</span>${esc(r.prazo_label)}</div>\n          <div><span class=\"clbl2\">Como medir o sucesso</span>${esc(r.kpi_alvo)}</div>\n        </div>\n        <div class=\"clbl2\" style=\"margin-top:14px\">Manual de implementação — entregue ao responsável</div>\n        <ol class=\"pb-steps\">${passos.map(pp => `<li>${esc(pp)}</li>`).join('')}</ol>\n      </div>` : ''}\n    </div>`\n  }).join('')\n  const bcolor = (r) => r.mes === 'Jun (hoje)' ? '#8A7C72' : (r.mes === 'Dez' ? '#1F7A4D' : '#A6192E')\n  return `\n  <div class=\"cards\">\n    ${kpi('Frentes estratégicas', '+R$ 95 mil/mês', '#A6192E', '8 iniciativas em ondas, jul → dez')}\n    ${kpi('Playbook tático', `+R$ ${nf(Math.round(sumTat / 1000))} mil/mês`, '#8A5A2B', '50 ações delegáveis · teto bruto, com sobreposição')}\n    ${kpi('Meta', '+R$ 80 mil/mês (+40%)', '#2B2320', 'R$ 280 mil/mês até dezembro')}\n    ${kpi('Onde estamos', '2 em andamento · 56 na fila', '#B9822F', '6 estratégicas planejadas + 50 táticas prontas')}\n  </div>\n  <div class=\"grid3\" style=\"grid-template-columns:repeat(auto-fit,minmax(300px,1fr))\">\n    <div class=\"card\"><div class=\"cardhead\"><span class=\"h2\">Ponte para a meta — projeção mensal</span><span class=\"note\">em R$ mil/mês</span></div>\n      ${bars(BRIDGE, 'mes', 'valor', bcolor, 280)}</div>\n    <div class=\"card\"><div class=\"h2\">Como o plano chega lá</div>\n      <p class=\"body\"><b>jul</b> — Turbinar o Jantar + Delivery Ampliado (+R$ 33 mil no potencial)<br/><b>ago</b> — Combos &amp; Sugestão + Linha Deli Judaica (+R$ 22 mil)<br/><b>set/out</b> — Calendário Judaico + Catering B2B (+R$ 26 mil)<br/><b>nov</b> — Cartão Pita + Brunch de Domingo (+R$ 14 mil)</p>\n      <p class=\"body\">Com adesão parcial no primeiro mês de cada onda, dezembro projeta <b>~R$ 282 mil</b> — acima da meta de R$ 280 mil.</p></div>\n  </div>\n  <div class=\"card\"><div class=\"cardhead\"><span class=\"h2\">As 8 frentes estratégicas — impacto esperado vs. observado</span><span class=\"note\">o “resultado observado” será preenchido conforme os fechamentos entrarem</span></div>\n    ${rows}</div>\n  <div class=\"card\">\n    <div class=\"cardhead\"><span class=\"h2\">Playbook — 50 ações prontas para delegar</span><span class=\"note\">toque numa ação para abrir o manual de implementação</span></div>\n    <div class=\"ctrl\"><span class=\"clbl\">Frente</span><div class=\"cpills\">${catPill('', 'Todas')}${cats.map(c => catPill(c, c)).join('')}</div></div>\n    <div class=\"ctrl\"><span class=\"clbl\">Dificuldade</span><div class=\"cpills\">${difPill('', 'Todas')}${['Baixa', 'Média', 'Alta'].map(x => difPill(x, x)).join('')}</div></div>\n    <div class=\"body\" style=\"margin:8px 0 4px\">${list.length} ${list.length === 1 ? 'ação' : 'ações'} · potencial somado <b>+R$ ${nf(Math.round(sumList / 1000))} mil/mês</b> <span class=\"note\">(bruto — há sobreposição entre ações e com as 8 frentes; trate como teto, não como soma garantida)</span></div>\n    ${items || '<div class=\"note\" style=\"margin-top:10px\">Nenhuma ação neste filtro.</div>'}\n  </div>`\n}\n\nconst vFech = (d2) => {\n  const per = d2.state.periodo || 'almoco'\n  const field = (lbl, cls, ph) => `<label class=\"flbl\">${lbl}<input class=\"f ${cls}\" placeholder=\"${ph}\" autocomplete=\"off\"/></label>`\n  return `\n  <div class=\"split fechsplit\">\n    <div class=\"card\">\n      <div class=\"h2\" style=\"margin-bottom:12px\">Registrar um serviço</div>\n      ${field('Data do serviço (AAAA-MM-DD)', 'f-data', '2026-07-03')}\n      <div class=\"flbl\">Período<div class=\"pills\">\n        <button class=\"ppill ${per === 'almoco' ? 'on' : ''}\" data-p=\"almoco\">Almoço</button>\n        <button class=\"ppill ${per === 'jantar' ? 'on' : ''}\" data-p=\"jantar\">Jantar</button></div></div>\n      <div class=\"frow\">${field('Couverts (pessoas)', 'f-couverts', '95')}${field('Pedidos (comandas)', 'f-pedidos', '50')}</div>\n      <div class=\"flbl\" style=\"margin-top:6px\">Faturamento por canal (R$)</div>\n      <div class=\"frow3\">${field('Salão', 'f-salao', '5600')}${field('Delivery', 'f-delivery', '1700')}${field('Retirada', 'f-retirada', '600')}</div>\n      <button class=\"submit\">Registrar fechamento</button>\n      <div class=\"msg\">${esc(d2.state.msg || '')}</div>\n      <div class=\"note\">O total do dia, o mês e o dia da semana são calculados automaticamente a partir da data e dos três canais.</div>\n    </div>\n    <div>\n      <div class=\"card\" style=\"margin-bottom:14px\"><div class=\"h2\">Como preencher</div>\n        <p class=\"body\">· Um registro por período: um para o almoço, outro para o jantar.</p>\n        <p class=\"body\">· Sexta-feira só tem almoço (12h–15h). Sábado a casa está fechada (Shabat) — não registre.</p>\n        <p class=\"body\">· O faturamento total é a soma dos três canais; o painel calcula o total e o dia da semana sozinho.</p>\n        <p class=\"body\">· Couverts = pessoas atendidas; pedidos = comandas fechadas.</p>\n        <p class=\"body\">· Depois de registrar, volte à <b>Visão Geral</b> — os números do mês são recalculados na hora.</p></div>\n      <div class=\"card dark\"><div class=\"lbl\" style=\"color:#D9CDB8\">A meta do semestre</div>\n        <div class=\"val\" style=\"color:#fff\">R$ 280 mil / mês</div>\n        <p class=\"body\" style=\"color:#D9CDB8\">Cada serviço conta. Um jantar médio hoje vale ~R$ 3,7 mil — a meta pede ~R$ 5,2 mil. O caminho: mais couverts à noite, delivery mais longe e a linha deli crescendo.</p></div>\n    </div>\n  </div>`\n}\n\nconst TITLES = {\n  visao: ['Visão Geral', 'Janeiro a junho de 2026 · dados simulados para calibrar o painel'],\n  explorar: ['Explorar os Dados', 'Monte o gráfico que quiser: escolha a medida, a quebra e a comparação'],\n  lucro: ['Lucratividade dos Pratos', 'Ranking por faturamento · janeiro a junho · margem = preço − insumos'],\n  combos: ['Combinações', 'O que puxa o quê — use a força das duplas para desenhar combos e sugestão na mesa'],\n  plano: ['Plano de Ação', 'Do R$ 200 mil ao R$ 280 mil por mês — 8 iniciativas entre julho e dezembro de 2026'],\n  fech: ['Fechamento do Dia', 'Registre o resultado de cada serviço — a partir de amanhã, o painel reflete os dados reais da casa'],\n}\n\nexport default {\n  css: `\n  .page{height:100%;overflow-y:auto;-webkit-overflow-scrolling:touch;background:#FAF6EF;color:#2B2320;font-family:Inter,system-ui,-apple-system,sans-serif}\n  *{box-sizing:border-box}\n  .inner{max-width:1400px;margin:0 auto;padding:0 clamp(14px,3vw,40px) 72px}\n  header{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;padding:16px 0 14px;border-bottom:1px solid #E9E0D2}\n  .logo{font-family:Fraunces,Georgia,serif;font-weight:700;font-size:24px;letter-spacing:5px;color:#A6192E}\n  .sub{font-size:11px;color:#8A7C72;letter-spacing:1px;margin-top:2px}\n  nav{display:flex;flex-wrap:wrap;gap:8px;margin-left:auto}\n  @media(max-width:960px){nav{margin-left:0}}\n  .nav-btn{border:1px solid #E9E0D2;background:#fff;color:#2B2320;font:600 13px Inter,sans-serif;padding:8px 14px;border-radius:999px;cursor:pointer;white-space:nowrap}\n  .nav-btn.on{background:#A6192E;border-color:#A6192E;color:#fff}\n  h1{font-family:Fraunces,Georgia,serif;font-weight:600;font-size:clamp(24px,4vw,30px);margin:20px 0 4px}\n  .lead{color:#8A7C72;font-size:13px;margin:0 0 18px;line-height:1.5}\n  .cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;margin:0 0 14px}\n  .grid3{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px;margin:14px 0}\n  .split{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(280px,1fr);gap:14px;align-items:start}\n  @media(max-width:900px){.split{grid-template-columns:1fr}}\n  .card{background:#fff;border:1px solid #E9E0D2;border-radius:14px;padding:16px 18px;min-width:0}\n  .card+.card{margin-top:14px}\n  .card.dark{background:#2B2320;border-color:#2B2320}\n  .cardhead{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:6px 12px;margin-bottom:8px}\n  .lbl{font-size:11px;font-weight:700;letter-spacing:1.2px;color:#8A7C72;text-transform:uppercase}\n  .val{font-family:Fraunces,Georgia,serif;font-size:clamp(22px,2.6vw,29px);font-weight:600;margin:6px 0 4px;line-height:1.15}\n  .note{font-size:11px;color:#8A7C72;line-height:1.5}\n  .muted{color:#8A7C72}\n  .h2{font-size:14px;font-weight:700}\n  .body{font-size:13px;color:#5C5248;line-height:1.65;margin:8px 0 0}\n  .bigline{font-family:Fraunces,Georgia,serif;font-size:clamp(18px,2vw,23px);color:#A6192E;font-weight:600;margin:10px 0 2px}\n  .bars{display:flex;align-items:flex-end;gap:clamp(6px,1.6vw,20px);padding-top:14px;position:relative;min-height:230px}\n  .bcol{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;min-width:0}\n  .bval{font-size:11px;color:#5C5248;font-weight:600;margin-bottom:4px}\n  .bar{width:100%;max-width:64px;border-radius:6px 6px 0 0}\n  .bname{font-size:11px;color:#8A7C72;margin-top:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}\n  .gb{overflow-x:auto;padding-bottom:4px}\n  .ggroup{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;min-width:56px}\n  .gset{display:flex;align-items:flex-end;gap:3px;width:100%;justify-content:center}\n  .gbar{width:100%;max-width:26px;min-width:7px;border-radius:4px 4px 0 0}\n  .leg-h{display:flex;flex-wrap:wrap;gap:8px 14px;margin:4px 0 6px}\n  .leg-chip{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:#5C5248}\n  .meta-line{position:absolute;left:0;right:0;border-top:2px dashed #B9822F;z-index:1}\n  .meta-line span{position:absolute;right:0;top:-18px;font-size:10px;color:#B9822F;font-weight:700}\n  .donut-wrap{display:flex;align-items:center;gap:18px;flex-wrap:wrap}\n  .donut{width:min(160px,42vw);height:auto;transform:rotate(-90deg) scale(1,-1)}\n  .leg{display:flex;flex-direction:column;gap:8px;min-width:0}\n  .leg-row{display:flex;align-items:center;gap:8px;font-size:12px;color:#5C5248;flex-wrap:wrap}\n  .leg-row b{color:#2B2320}\n  .dot{width:10px;height:10px;border-radius:99px;flex:none}\n  .tablewrap{overflow-x:auto;-webkit-overflow-scrolling:touch}\n  table{border-collapse:collapse;width:100%;min-width:1020px;font-size:13px}\n  th{font-size:10px;letter-spacing:1px;color:#8A7C72;text-transform:uppercase;text-align:left;padding:10px 14px;border-bottom:1px solid #E9E0D2;white-space:nowrap}\n  td{padding:9px 14px;border-bottom:1px solid #F2EBDE;vertical-align:middle}\n  tbody tr:last-child td{border-bottom:0}\n  th.num,td.num{text-align:right}\n  table.heat{min-width:420px}\n  table.heat td{text-align:center;font-size:12px;font-weight:600;border:2px solid #fff;border-radius:6px;padding:10px 8px}\n  table.heat td.hz{color:#C9BFB0;background:#FBF9F4}\n  table.heat th{border-bottom:0}\n  .pill{display:inline-block;padding:3px 10px;border-radius:999px;color:#fff;font-size:10px;font-weight:700;white-space:nowrap}\n  .combo{margin-top:12px}\n  .combo-t{font-size:13px;font-weight:700;color:#A6192E}\n  .ini{display:flex;gap:14px;align-items:flex-start;padding:14px 0;border-bottom:1px solid #F2EBDE;flex-wrap:wrap}\n  .ini:last-child{border-bottom:0}\n  .ini-n{font-family:Fraunces,Georgia,serif;font-size:18px;font-weight:700;color:#A6192E;flex:none;width:24px}\n  .ini-main{flex:1 1 320px;min-width:240px;font-size:13px}\n  .ini-side{display:flex;align-items:center;gap:12px;flex-wrap:wrap;flex:none}\n  .ini-val{color:#1F7A4D;font-size:13px;white-space:nowrap}\n  .pb{border:1px solid #F2EBDE;border-radius:12px;margin-top:10px;overflow:hidden;background:#fff}\n  .pb.open{border-color:#E0D5C2;box-shadow:0 2px 10px rgba(43,35,32,.06)}\n  .pb-h{display:flex;align-items:center;gap:12px;padding:12px 14px;cursor:pointer;flex-wrap:wrap}\n  .pb-h:hover{background:#FBF9F4}\n  .pb-n{font-family:Fraunces,Georgia,serif;font-weight:700;color:#A6192E;width:26px;flex:none;font-size:15px}\n  .pb-t{flex:1 1 280px;min-width:220px;font-size:13px;display:flex;flex-direction:column;gap:6px}\n  .pb-tags{display:flex;gap:6px;flex-wrap:wrap}\n  .pb-side{display:flex;align-items:center;gap:12px;flex-wrap:wrap}\n  .chev{color:#8A7C72;font-size:11px}\n  .ifood-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap}\n  .pb-b{padding:2px 16px 16px 52px;border-top:1px dashed #F2EBDE}\n  @media(max-width:640px){.pb-b{padding-left:16px}}\n  .pb-meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px 18px;margin-top:12px;font-size:12px;color:#5C5248;line-height:1.55}\n  .clbl2{display:block;font-size:10px;font-weight:700;letter-spacing:1px;color:#8A7C72;text-transform:uppercase;margin-bottom:3px}\n  .pb-steps{margin:8px 0 0;padding-left:20px;font-size:13px;color:#2B2320;line-height:1.7}\n  .pb-steps li{margin-bottom:6px}\n  .plot{position:relative;height:340px;border:1px solid #E9E0D2;border-radius:10px;background:linear-gradient(#FDFBF7,#FAF6EF);margin-top:8px;overflow:hidden}\n  .dotpt{position:absolute;width:12px;height:12px;border-radius:99px;border:2px solid #fff;box-shadow:0 1px 3px rgba(0,0,0,.25);transform:translate(-50%,-50%);cursor:pointer}\n  .dotpt:hover{width:16px;height:16px;z-index:3}\n  .gline{position:absolute;background:transparent;border:0 dashed #D8CDBB;z-index:0}\n  .gline.v{top:0;bottom:0;border-left:2px dashed #D8CDBB}\n  .gline.h{left:0;right:0;border-top:2px dashed #D8CDBB}\n  .pquad{position:absolute;font-size:10px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;opacity:.75;z-index:1}\n  .axes{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-top:8px;font-size:11px;color:#8A7C72}\n  .ctrl{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;padding:7px 0}\n  .ctrl+.ctrl{border-top:1px dashed #F2EBDE}\n  .clbl{font-size:10px;font-weight:700;letter-spacing:1px;color:#8A7C72;text-transform:uppercase;flex:none;width:110px}\n  @media(max-width:560px){.clbl{width:100%}}\n  .cpills{display:flex;flex-wrap:wrap;gap:6px}\n  .cpill{border:1px solid #E9E0D2;background:#FBF9F4;color:#2B2320;font:600 12px Inter,sans-serif;padding:6px 12px;border-radius:999px;cursor:pointer;white-space:nowrap}\n  .cpill.on{background:#A6192E;border-color:#A6192E;color:#fff}\n  .cpill[disabled]{opacity:.35;cursor:default}\n  .fechsplit{grid-template-columns:minmax(300px,560px) minmax(280px,1fr)}\n  @media(max-width:900px){.fechsplit{grid-template-columns:1fr}}\n  .flbl{display:block;font-size:10px;font-weight:700;letter-spacing:1px;color:#8A7C72;text-transform:uppercase;margin:14px 0 0}\n  .f{display:block;width:100%;margin-top:6px;padding:11px 14px;border:1px solid #E9E0D2;border-radius:10px;background:#FBF9F4;font:400 14px Inter,sans-serif;color:#2B2320;outline:none}\n  .f:focus{border-color:#A6192E}\n  .frow{display:grid;grid-template-columns:1fr 1fr;gap:12px}\n  .frow3{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:12px}\n  @media(max-width:480px){.frow{grid-template-columns:1fr}}\n  .pills{display:flex;gap:10px;margin-top:6px}\n  .ppill{padding:9px 22px;border-radius:999px;border:1px solid #E9E0D2;background:#FBF9F4;color:#2B2320;font:600 13px Inter,sans-serif;cursor:pointer;text-transform:none;letter-spacing:0}\n  .ppill.on{background:#A6192E;border-color:#A6192E;color:#fff}\n  .submit{display:block;width:100%;margin-top:20px;padding:13px;border:0;border-radius:10px;background:#A6192E;color:#fff;font:700 14px Inter,sans-serif;cursor:pointer}\n  .msg{font-size:13px;font-weight:600;color:#1F7A4D;margin:12px 0;min-height:18px;line-height:1.5}\n  `,\n  render(d2) {\n    const page = d2.param('page', 'visao')\n    const d = d2.state.dados\n    const [title, lead] = TITLES[page] || TITLES.visao\n    let body\n    if (page === 'lucro') body = vLucro(d)\n    else if (page === 'explorar') body = vExplorar(d2)\n    else if (page === 'combos') body = vCombos(d)\n    else if (page === 'plano') body = vPlano(d, d2)\n    else if (page === 'fech') body = vFech(d2)\n    else body = vVisao(d, d2)\n    const err = d2.state.erro ? `<div class=\"card\" style=\"border-color:#9C3F2E;color:#9C3F2E\">Não foi possível carregar os dados: ${esc(d2.state.erro)}</div>` : ''\n    return `<div class=\"page\"><div class=\"inner\">${header(page)}<h1>${title}</h1><p class=\"lead\">${lead}</p>${err}${body}</div></div>`\n  },\n  mounted(d2) {\n    if (!document.getElementById('pinati-fonts')) {\n      const l = document.createElement('link')\n      l.id = 'pinati-fonts'; l.rel = 'stylesheet'\n      l.href = 'https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,600;9..144,700&family=Inter:wght@400;600;700&display=swap'\n      document.head.appendChild(l)\n    }\n    const page = d2.param('page', 'visao')\n    const load = async () => {\n      try {\n        const r = await d2.rush('painel').invoke({})\n        d2.state.dados = (r && r.kpiFaturamento) ? r : (r && r.data) ? r.data : r\n        d2.state.erro = null\n      } catch (e) { d2.state.erro = e && e.message ? e.message : String(e) }\n    }\n    const loadRaw = async () => {\n      try {\n        const r = await d2.rush('explorar').invoke({})\n        d2.state.raw = (r && r.servico) ? r : (r && r.data) ? r.data : r\n      } catch (e) { d2.state.erro = e && e.message ? e.message : String(e) }\n    }\n    if (page !== 'explorar') load()\n    if (page === 'explorar' || page === 'visao') loadRaw()\n    if (page === 'visao') {\n      ;(async () => {\n        try {\n          const r = await d2.rush('ifood').invoke({})\n          d2.state.ifood = (r && r.loja) ? r : (r && r.data) ? r.data : r\n        } catch (e) { d2.state.ifood = { erro: true } }\n      })()\n    }\n    d2.on('.nav-btn', 'click', (e, el) => {\n      const path = el.dataset.path\n      try { d2.router('nav').goTo(path) } catch (err) {}\n      setTimeout(() => { if (window.location.pathname !== path) window.location.href = path }, 350)\n    })\n    d2.on('.hm-met', 'click', (e, el) => { d2.state.hm = el.dataset.k })\n    d2.on('.ini-toggle', 'click', (e, el) => { d2.state.open = d2.state.open === el.dataset.id ? null : el.dataset.id })\n    d2.on('.f-cat', 'click', (e, el) => { d2.state.fcat = el.dataset.k })\n    d2.on('.f-dif', 'click', (e, el) => { d2.state.fdif = el.dataset.k })\n    d2.on('.ex-met', 'click', (e, el) => { d2.state.ex = { ...sanitizeEx(d2.state.ex), met: el.dataset.k } })\n    d2.on('.ex-dim', 'click', (e, el) => { const ex = sanitizeEx(d2.state.ex); d2.state.ex = { met: ex.met, dim: el.dataset.k, dim2: ex.dim2 === el.dataset.k ? null : ex.dim2, viz: ex.viz } })\n    d2.on('.ex-dim2', 'click', (e, el) => { const ex = sanitizeEx(d2.state.ex); d2.state.ex = { met: ex.met, dim: ex.dim, dim2: el.dataset.k || null, viz: ex.viz } })\n    d2.on('.ex-viz', 'click', (e, el) => { const ex = sanitizeEx(d2.state.ex); d2.state.ex = { met: ex.met, dim: ex.dim, dim2: ex.dim2, viz: el.dataset.k } })\n    d2.on('.ppill', 'click', (e, el) => { d2.state.periodo = el.dataset.p })\n    d2.on('.submit', 'click', async () => {\n      const val = (s) => { const el = d2.$(s); return el ? el.value.trim() : '' }\n      const body = {\n        data: val('.f-data'), periodo: d2.state.periodo || 'almoco',\n        couverts: val('.f-couverts'), pedidos: val('.f-pedidos'),\n        salao: val('.f-salao'), delivery: val('.f-delivery'), retirada: val('.f-retirada'),\n      }\n      if (!body.data) { d2.state.msg = 'Informe a data no formato AAAA-MM-DD.'; return }\n      d2.state.msg = 'Enviando…'\n      try {\n        const r = await d2.rush('fechamento').invoke(body)\n        const res = (r && r.ok !== undefined) ? r : (r && r.data) ? r.data : r\n        if (res && res.ok) {\n          d2.state.msg = `Fechamento de ${res.data} (${res.dia_semana}) registrado com sucesso — R$ ${Number(res.faturamento).toLocaleString('pt-BR')} no total.`\n          d2.$$('.f').forEach((el) => { el.value = '' })\n          load()\n        } else {\n          d2.state.msg = (res && res.error) || 'Não foi possível registrar. Confira a data e os valores.'\n        }\n      } catch (e) { d2.state.msg = 'Erro ao registrar: ' + (e && e.message ? e.message : e) }\n    })\n  },\n}"}},"page":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"page"}}}}}}}}}}]}},{"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}}},"reference":"Data2BuilderAuthentication","updatedAt":"2025-10-28T02:48:49.233Z"},{"_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":"6a46fa728c5c69fa78f0f016","component":"data2-core-primitives@Router","system":"6a46ecf96b7022d96dbcc514","displayName":"Navegação do Painel","params":{"routerType":{"component":"data2-core-primitives@String","params":{"content":"browser"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":"/","name":"Pinati · Visão Geral","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"YCCWzKCUyWhaXzumdXtUB"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/explorar","name":"Pinati · Explorar os Dados","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"bvvvMtcsUZcIiG1Gft6GY"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/lucratividade","name":"Pinati · Lucratividade dos Pratos","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"OJrHoyn75UFCKoXPsPZyQ"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/combinacoes","name":"Pinati · Combinações","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"lO0j_pTTOzxSd03VWVAAr"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/plano-de-acao","name":"Pinati · Plano de Ação","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"Z-l12K0chCWBfHF1R1EFZ"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/fechamento","name":"Pinati · Fechamento do Dia","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"K34XrvKqrl_qDflznJg35"}}}}],"notFound":{"component":"data2-core-types@ArtboardReference","params":{"reference":"YCCWzKCUyWhaXzumdXtUB"}}},"reference":"nav"},{"_id":"6a46fa588c5c69fa78f0eecc","component":"data2-core-primitives@Artboard","system":"6a46ecf96b7022d96dbcc514","displayName":"Visão Geral","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Visão Geral"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"YCCWzKCUyWhaXzumdXtUB"},{"_id":"6a46fa5f7068a227f974a569","component":"data2-core-primitives@Artboard","system":"6a46ecf96b7022d96dbcc514","displayName":"Fechamento do Dia","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Fechamento do Dia"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":-836,"y":1109,"exactX":-836.2900000000001,"exactY":1109.15}}},"reference":"K34XrvKqrl_qDflznJg35"},{"_id":"6a46fa5dbf38d3828152a204","component":"data2-core-primitives@Artboard","system":"6a46ecf96b7022d96dbcc514","displayName":"Plano de Ação","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Plano de Ação"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":2889,"y":1242,"exactX":2888.5,"exactY":1241.6}}},"reference":"Z-l12K0chCWBfHF1R1EFZ"},{"_id":"6a46fa5c8c5c69fa78f0eeff","component":"data2-core-primitives@Artboard","system":"6a46ecf96b7022d96dbcc514","displayName":"Combinações","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Combinações"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":3181,"y":-540,"exactX":3181.12,"exactY":-539.74}}},"reference":"lO0j_pTTOzxSd03VWVAAr"},{"_id":"6a46fa59d17c9b3315af2067","component":"data2-core-primitives@Artboard","system":"6a46ecf96b7022d96dbcc514","displayName":"Lucratividade dos Pratos","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Lucratividade dos Pratos"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":1752,"y":-1208,"exactX":1751.68,"exactY":-1208}}},"reference":"OJrHoyn75UFCKoXPsPZyQ"},{"_id":"6a4706a66f5b004378bc02e9","component":"data2-core-primitives@Artboard","system":"6a46ecf96b7022d96dbcc514","displayName":"Explorar os Dados","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Explorar os Dados"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"bvvvMtcsUZcIiG1Gft6GY"},{"_id":"b6fe46e0e2fee371409dcc9d","parent":"6a46fa588c5c69fa78f0eecc","component":"pinati@kpinati","system":"6a46ecf96b7022d96dbcc514","displayName":"PinatiVisao","params":{"page":"visao","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":1440,"height":900}}}},"reference":"tCcRNDBfuzaLBO58Vm_Vm"},{"_id":"9f400cecf5e341240e5114db","parent":"6a46fa5f7068a227f974a569","component":"pinati@kpinati","system":"6a46ecf96b7022d96dbcc514","displayName":"PinatiFech","params":{"page":"fech","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":1440,"height":900}}}},"reference":"-ra8M--yWwRwsOSoH69R9"},{"_id":"156f60e1494327295258bc6e","parent":"6a46fa5dbf38d3828152a204","component":"pinati@kpinati","system":"6a46ecf96b7022d96dbcc514","displayName":"PinatiPlano","params":{"page":"plano","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":1440,"height":900}}}},"reference":"KcJojnZZjK0XeCOs8fUV0"},{"_id":"3d1b31b9d82dd19193839d33","parent":"6a46fa5c8c5c69fa78f0eeff","component":"pinati@kpinati","system":"6a46ecf96b7022d96dbcc514","displayName":"PinatiCombos","params":{"page":"combos","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":1440,"height":900}}}},"reference":"PscesXJdwPm5NGN_c5CpX"},{"_id":"2e6ae3028d4e55af3d57a3ea","parent":"6a46fa59d17c9b3315af2067","component":"pinati@kpinati","system":"6a46ecf96b7022d96dbcc514","displayName":"PinatiLucro","params":{"page":"lucro","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":1440,"height":900}}}},"reference":"Lbn0t9roI75t6agAHl13b"},{"_id":"0e42e6e4ed04b19335264665","parent":"6a4706a66f5b004378bc02e9","component":"pinati@kpinati","system":"6a46ecf96b7022d96dbcc514","displayName":"PinatiExplorar","params":{"page":"explorar","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":1440,"height":900}}}},"reference":"bX7FIJkekD8LNWXphFdfX"}]}},{"_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":"6a46fa7e8c5c69fa78f0f0a6","displayName":"Pinati — Painel de Gestão","reference":"OkerV12ebGN-dgtZT5McI","params":{"name":{"component":"data2-core-primitives@String","params":{"content":"Pinati · Painel de Gestão"}},"shortName":{"component":"data2-core-primitives@String","params":{"content":"Pinati"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"pinati"}},"serverSideRendering":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Router","reference":"nav"}},"responseHeaders":{"X-Frame-Options":{"component":"data2-core-primitives@String","params":{"content":""}},"Content-Security-Policy":{"component":"data2-core-primitives@String","params":{"content":""}},"X-XSS-Protection":{"component":"data2-core-primitives@String","params":{"content":""}}}},"system":"6a46ecf96b7022d96dbcc514","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}