{"context":{"domain":"granado-app"},"layers":{"ApplicationLayer":{"reference":"ApplicationLayer","availableInstances":[{"reference":"ComponentsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"SystemsDataSet","params":{"filter":{"domain":"data2"},"pagination":{"size":1},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSource"}}}},{"reference":"ExternalComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"SystemsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5e3b796d6228227ca637d0f4","name":"data2","domain":"data2","organization":"62292184611f480b3191c37c","visibility":"public","updatedAt":"2026-07-27T14:19:36.810Z"}]}},{"reference":"OrganizationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"DataComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"OneFileComponentInstancesDataSet","params":{"pagination":{"size":1},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"FileComponentInstancesDataSource"}}}},{"reference":"ApplicationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ServiceComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@Data2TableDataSource","reference":"FileComponentInstancesDataSource","params":{"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}}]}},{"component":"data2-core@MemoryDataSource","reference":"EmptyDataSource","params":{"initialData":[]}},{"reference":"ComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"UserComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"DataComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ServiceComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ExternalComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ApplicationsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}}],"processesParams":{}},"HostApplicationLayer":{"reference":"HostApplicationLayer","availableInstances":[{"_id":"5f15ff190528b92601890f71","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"domain"}}},"pk":"_id","fields":[{"component":"data2-core-types@FieldReference","params":{"key":"_id"}},{"component":"data2-core-types@FieldReference","params":{"key":"name"}},{"component":"data2-core-types@FieldReference","params":{"key":"domain"}},{"component":"data2-core-types@FieldReference","params":{"key":"visibility"}},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.name"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.billingStatus"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.publicTrial.active"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"settings.defaultAccessPolicy"}}},"break":true}],"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticPagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"actions":[{"params":{"components":[{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@Series"}}}]},"reference":"SystemsDataSet","updatedAt":"2026-08-07T21:51:24.037Z","createdAt":"2020-07-20T20:31:21.838Z"},{"_id":"5f1601ce0528b92601890f7c","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":1000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"sort":{"params.package":1,"params.component":1},"pk":"_id","autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"staticFilter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"filter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}},"reference":"ComponentsDataSet","updatedAt":"2025-11-05T19:37:01.935Z","createdAt":"2020-07-20T20:42:54.898Z"},{"_id":"5f9041dbc8da12be8b94aea4","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":2000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"UserComponentsDataSet","updatedAt":"2025-11-06T21:06:58.095Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"65d8c4fabc9dbb8f94de8d53","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ExternalComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:23.742Z","createdAt":"2024-02-23T16:17:01.816Z"},{"reference":"SystemsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a62e4640613f70fa449ff5d","name":"app","domain":"granado-app","visibility":"public","settings":{"defaultAccessPolicy":"private"},"updatedAt":"2026-10-15T19:50:34.779Z","createdAt":"2026-07-24T04:04:52.993Z"}]}},{"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":"6ab155d7bd52e9e554e3e29c","component":"data2-core-types@Component","system":"6a62e4640613f70fa449ff5d","params":{"extends":"data2-core-primitives@Block","component":"granado-sim-posvenda","package":"granado-app","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// Simulador da Arquitetura de Pós-Venda — Granado\n// Eixo AS-IS / TO-BE atravessando os 4 domínios.\n\nconst PARAMS = {\n  prazoArrependimento: 7, prazoTroca: 30,\n  slaColeta: 2, slaAutorizacaoCD: 7, slaAutorizacaoIdeal: 1,\n  slaFinanceiro: 1, slaApuracaoExtravio: 5, slaAtendimento: 1,\n  automatiza: { adyen_granado:true, adyen_care:false, pagbrasil:false, pagleve:false },\n  troqueCobre: { cd:true, darkstore:true, loja_sfs:false, loja_retirada:false, box:false },\n};\n\nconst PAGS = {\n  adyen_granado:{ curto:'Adyen' }, adyen_care:{ curto:'Adyen Care' },\n  pagbrasil:{ curto:'PagBrasil' }, pagleve:{ curto:'PagLeve' },\n};\n\nconst ORIGENS = {\n  cd:'CD · entrega normal', darkstore:'Darkstore · expressa',\n  loja_sfs:'Loja · expressa (SFS)', loja_retirada:'Loja · retirada', box:'CD · assinatura Box',\n};\n\nconst PEDIDOS = [\n  { ref:'#21008439128', marca:'Granado', origem:'cd', pag:'adyen_granado', dias:3, valor:185.95,\n    status:'entregue', score:12, canhoto:true, picking:'confere',\n    data:'19/09/2026', nome:'Guilherme de Souza', rot:'Faturado',\n    linhas:[['7896512939937',1],['7896512946003',1],['7896512947376',1]] },\n  { ref:'#21008440292', marca:'Granado', origem:'cd', pag:'adyen_granado', dias:12, valor:301.00,\n    status:'entregue', score:18, canhoto:true, picking:'confere',\n    data:'10/09/2026', nome:'Guilherme de Souza', rot:'Entregue',\n    linhas:[['7896512981875',1],['7896512924148',1]] },\n  { ref:'#21008441220', marca:'Granado', origem:'cd', pag:'pagbrasil', dias:5, valor:188.50,\n    status:'entregue', score:22, canhoto:true, picking:'confere',\n    data:'17/09/2026', nome:'Guilherme de Souza', rot:'Entregue',\n    linhas:[['7896512992604',1],['7896512992697',1],['7896512946690',1]] },\n  { ref:'#21008441003', marca:'Granado', origem:'loja_sfs', pag:'adyen_granado', dias:2, valor:104.50,\n    status:'entregue', score:9, canhoto:true, picking:'confere',\n    data:'20/09/2026', nome:'Guilherme de Souza', rot:'Faturado',\n    linhas:[['7896512945976',1],['7896512914262',2]] },\n  { ref:'#21008442877', marca:'Granado', origem:'loja_retirada', pag:'adyen_granado', dias:9, valor:165.20,\n    status:'aguardando_retirada', score:15, canhoto:null, picking:null,\n    data:'13/09/2026', nome:'Guilherme de Souza', rot:'Aguardando retirada',\n    linhas:[['7896512926401',6],['7896512939944',1]] },\n  { ref:'#21008442190', marca:'Granado', origem:'cd', pag:'adyen_granado', dias:4, valor:102.20,\n    status:'entregue', score:41, canhoto:false, picking:'confere',\n    data:'18/09/2026', nome:'Guilherme de Souza', rot:'Entregue',\n    linhas:[['7896512914415',2]] },\n  { ref:'#21008443320', marca:'Granado', origem:'box', pag:'adyen_granado', dias:3, valor:174.30,\n    status:'entregue', score:7, canhoto:true, picking:'confere', assinatura:true,\n    data:'19/09/2026', nome:'Guilherme de Souza', rot:'BOX · assinatura',\n    linhas:[['7896512995254',1],['7896512968470',1],['7896512922410',1]] },\n  { ref:'#21008444501', marca:'Granado', origem:'cd', pag:'adyen_granado', dias:120, valor:257.70,\n    status:'entregue', score:14, canhoto:true, picking:'falta', pix:true,\n    data:'25/05/2026', nome:'Guilherme de Souza', rot:'Entregue',\n    linhas:[['7896512981899',1],['7896512919878',1]] },\n];\n\nconst MOTIVOS = [\n  { id:'mudei_ideia', label:'Mudei de ideia, não quero mais', conclui:'Arrependimento (CDC)', reversa:true, st:['entregue','em_rota'] },\n  { id:'defeito', label:'Chegou com defeito ou avariado', conclui:null, reversa:true, st:['entregue'], foto:true },\n  { id:'faltou', label:'Faltou item na caixa', conclui:null, reversa:false, st:['entregue'] },\n  { id:'nao_chegou', label:'Meu pedido não chegou', conclui:null, reversa:false, st:['entregue','em_rota'] },\n  { id:'trocar', label:'Quero trocar por outro produto', conclui:'Troca a pedido do cliente', reversa:true, st:['entregue'] },\n  { id:'cancelar_assinatura', label:'Cancelar a assinatura', conclui:'Cancelamento de recorrência', reversa:false, assin:true, st:['entregue','em_rota','aguardando_retirada'] },\n  { id:'desistir_retirada', label:'Desisti de retirar na loja', conclui:'Desistência antes da retirada', reversa:false, st:['aguardando_retirada'] },\n  { id:'falar', label:'Meu caso é outro — quero falar com o atendimento', conclui:'Exceção encaminhada ao SAC',\n    reversa:false, soTobe:true, saida:true, st:['entregue','em_rota','aguardando_retirada'] },\n];\n\n/* o motivo declarado pelo cliente — hoje tudo isso vira \"desistência do cliente\" num campo só */\nconst RAZOES = [\n  { id:'arrependimento', l:'Me arrependi da compra',                 d:'Direito de arrependimento, até 7 dias corridos', cdc:true },\n  { id:'nao_gostei',     l:'Não gostei do produto',                  d:'Fragrância, textura, cor ou acabamento' },\n  { id:'errado',         l:'Comprei o item errado',                  d:'Versão, tamanho ou quantidade' },\n  { id:'presente',       l:'Ganhei de presente e quero trocar',      d:'Sem defeito, troca por escolha' },\n  { id:'defeito',        l:'Veio com defeito de fabricação',         d:'Precisamos da foto e do lote', foto:true },\n  { id:'dano',           l:'Chegou danificado no transporte',        d:'Precisamos da foto da embalagem e do produto', foto:true },\n  { id:'diferente',      l:'Recebi item diferente do que pedi',      d:'Precisamos da foto do que chegou', foto:true },\n  { id:'validade',       l:'Embalagem violada ou fora da validade',  d:'Precisamos da foto do lote e da validade', foto:true },\n  { id:'outro',          l:'Outro motivo',                           d:'Descreva em uma linha e o atendimento assume', saida:true },\n];\nconst razao = (id) => RAZOES.filter(x=>x.id===id)[0];\n\n/* cada situação pergunta só o que ainda não foi respondido */\nconst RAZOES_POR_MOTIVO = {\n  trocar:  ['nao_gostei','errado','presente','arrependimento','diferente','outro'],\n  defeito: ['defeito','dano','validade','diferente','outro'],\n};\nconst razoesDe = (motivoId) => (RAZOES_POR_MOTIVO[motivoId]||[]).map(razao).filter(Boolean);\nconst RAZAO_PADRAO = { mudei_ideia:'arrependimento', desistir_retirada:'arrependimento' };\nconst TITULO_RAZAO = { trocar:'Por que você quer trocar?', defeito:'O que houve com o produto?' };\nconst TITULO_ITENS = { faltou:'Qual item faltou na caixa?', defeito:'Qual item está com problema?' };\nconst pedeItens = (m) => !!m && (m.reversa || m.id === 'faltou');\n\n/* a reparação em dois níveis: trocar, ou devolver e receber de volta */\nconst GRUPO_REP = { troca_mesmo:'troca', escolher:'troca',\n  estorno:'volta', estorno_parcial:'volta', vale:'volta', wallet:'volta',\n  repor:'reenvio', reenvio:'reenvio', nada:'unico', contato:'unico' };\nconst GRUPO_LBL = {\n  troca:  ['Quero trocar','Você escolhe o que levar no lugar, e a gente despacha assim que o produto chega.'],\n  volta:  ['Quero devolver e receber de volta','Escolha como prefere receber o valor.'],\n  reenvio:['Quero receber o que faltou','Reenviamos sem novo frete.'],\n  unico:  ['',''],\n};\n/* arrependimento dá direito a dinheiro de volta (CDC), então o residual não precisa virar crédito */\nconst daDireitoADinheiro = (motivoId, razaoId) => motivoId === 'mudei_ideia' ||\n  motivoId === 'desistir_retirada' || !!(razaoId && razao(razaoId) && razao(razaoId).cdc);\nconst itensPadrao = (p) => { const o={}; (p.linhas||[]).forEach(l=>{ o[l[0]] = l[1] }); return o };\nconst linhasDoPedido = (p) => (p.linhas||[]).map(l=>({ it: acharSku(l[0]), sku: l[0], q: l[1] })).filter(x=>x.it);\nconst valorDevolvido = (p, sel) => (p.linhas||[]).reduce((a,l)=>{\n  const it = acharSku(l[0]); if (!it) return a;\n  const q = sel ? (sel[l[0]]||0) : l[1];\n  return a + it.p * q;\n}, 0);\n\nconst VALE = 'usado como meio de pagamento num pedido novo no site · não é Loyalty';\nconst WALLET = 'o valor entra como saldo no programa de fidelidade · possibilidade nova';\nconst REPARACOES = {\n  mudei_ideia:[['estorno','Estorno total'],['vale','Vale-troca',VALE],['wallet','Crédito na wallet do Loyalty',WALLET]],\n  defeito:[['troca_mesmo','Troca pelo mesmo produto'],\n          ['escolher','Escolher outros produtos','monta o pedido novo e o desfecho sai da escolha'],\n          ['estorno','Estorno total'],['vale','Vale-troca',VALE],['wallet','Crédito na wallet do Loyalty',WALLET]],\n  faltou:[['repor','Reenvio do item faltante'],['estorno_parcial','Estorno do item faltante']],\n  nao_chegou:[['reenvio','Reenvio do pedido'],['estorno','Estorno total']],\n  trocar:[['troca_mesmo','Troca pelo mesmo produto'],\n          ['escolher','Escolher produtos','monta o pedido novo e o desfecho sai da escolha: sobra vira saldo, falta vai pro checkout'],\n          ['vale','Vale-troca',VALE],['wallet','Crédito na wallet do Loyalty',WALLET]],\n  cancelar_assinatura:[['nada','Encerrar cobranças futuras']],\n  desistir_retirada:[['estorno','Estorno total']],\n  falar:[['contato','Abrir conversa com o atendimento','o atendente recebe o caso já com origem, pagamento, prazo e histórico — não começa do zero']],\n};\n\nconst CAT_URL = 'https://granado-app.data2.media/file/uJGAb1nx0tTmL7HvBu0Oz';\nlet CATALOGO = [];\nconst acharSku = (sku) => CATALOGO.filter(x=>x.sku===sku)[0];\nconst nomeSku = (sku) => { const x = acharSku(sku); return x ? x.n : 'item ' + sku };\nconst itensDoPedido = (p) => (p.linhas||[]).map(l => nomeSku(l[0]) + (l[1] > 1 ? ' ×' + l[1] : ''));\nconst LINHAS_CAT = () => CATALOGO.map(x=>x.linha).filter((v,i,a)=>a.indexOf(v)===i);\nfunction totalCarrinho(cart){\n  let t=0; Object.keys(cart||{}).forEach(k=>{ const it=acharSku(k); if(it) t += it.p*cart[k] });\n  return t;\n}\nconst CANAIS_TOBE = [['portal','Portal de pós-venda'],['whats','Assistente no WhatsApp'],['sac','Atendente do SAC']];\n\nconst MOLDURA = {\n  asis: {\n    cliente: { t:'O cliente não sabe por onde entrar',\n      p:['A ocorrência nasce em campo aberto. O cliente escreve livre e um operador classifica na mão, um a um.',\n         'O TroqueCommerce atende CD e Darkstore. O cliente não sabe de onde o pedido saiu, então descobre tentando.',\n         'O que o Troque não atende vira e-mail, WhatsApp ou telefone, direto num operador. Não escala.',\n         'Nenhum prazo é informado na abertura.'] },\n    motor: { t:'As políticas não são claras',\n      p:['O processo não é claro, então a política também não é. Cada caso é decidido na hora.',\n         'O critério muda conforme quem atende.',\n         'O prazo do CDC não é validado por sistema — alguém confere na mão, dias depois.',\n         'Todo cancelamento entra como \"desistência do cliente\". O motivo real se perde.'] },\n    logistica: { t:'A fila decide o prazo',\n      p:['Autorização manual de 5 a 10 dias, contra 1 dia de meta.',\n         'Extraviado, cancelado antes do envio e falta não têm retorno físico, mas chegam aqui assim mesmo.',\n         'Item aberto fica no escritório e não é processado no SAP, pra não creditar estoque fantasma.'] },\n    financas: { t:'Duas planilhas e um e-mail',\n      p:['Planilha do CD e planilha do Digital, mesmo dado, sem integração.',\n         'Batch só na Adyen. Care, PagBrasil, PagLeve e cartão-presente são um a um, na mão.',\n         'O comprovante de estorno não sai do sistema — o SAC cobra à mão.',\n         'O dinheiro não anda enquanto a logística não autorizar.'] },\n  },\n  tobe: {\n    cliente: { t:'Uma entrada só, igual em qualquer canal',\n      p:['Portal, WhatsApp ou atendente: a mesma regra, o mesmo menu, o mesmo prazo.',\n         'Sem TroqueCommerce. O cliente nunca precisa saber de onde o pedido saiu.',\n         'O que a regra não permite nem aparece como opção.',\n         'O prazo vem junto de cada escolha, antes de decidir.'] },\n    motor: { t:'Motor de pós-venda alinhado com as políticas',\n      p:['As regras ficam num lugar só, escritas. A política de troca sai desses mesmos parâmetros.',\n         'Decide elegibilidade, reparação e prazo sem depender de quem está na mesa.',\n         'Consulta canhoto e vídeo do picking antes de acionar uma pessoa.',\n         'Guarda em campos separados o que o cliente declarou e o que a operação concluiu.'] },\n    logistica: { t:'Só recebe caso com retorno físico',\n      p:['Extraviado, cancelado antes do envio e falta vão direto para o financeiro.',\n         'Conferência com escala: aprovação por peso no nível 1, balança e bipper no nível 2.',\n         'A autorização deixa de ser a fila que define o prazo de todo mundo.',\n         'O destino do item sai da regra: estoque se lacrado, pré-destruição se aberto.'] },\n    financas: { t:'Sem planilha',\n      p:['O motor lança. Ninguém digita o mesmo pedido em duas planilhas.',\n         'A rota do estorno sai da matriz marca × adquirente.',\n         'O comprovante sai do sistema — o SAC não precisa pedir.',\n         'Abre junto com a logística, não depois.'] },\n  },\n};\n\nconst esc = (s) => String(s==null?'':s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;');\nconst brl = (n) => 'R$ ' + Number(n).toFixed(2).replace('.',',');\nconst acha = (arr,id) => arr.filter(x=>x.id===id)[0];\n\nfunction deriva(p){\n  return { origem:ORIGENS[p.origem], automatiza:!!PARAMS.automatiza[p.pag],\n    troqueCobre:!!PARAMS.troqueCobre[p.origem], dias:p.dias, status:p.status,\n    pix90:!!(p.pix && p.dias>90) };\n}\n\nfunction estimaSla(p, m, modo){\n  const d = deriva(p);\n  const autoriza = modo==='tobe' ? PARAMS.slaAutorizacaoIdeal : PARAMS.slaAutorizacaoCD;\n  const produto = m.reversa ? (PARAMS.slaColeta + autoriza) : 0;\n  const apura = m.id==='nao_chegou' && !p.canhoto ? PARAMS.slaApuracaoExtravio : 0;\n  if (m.id === 'falar') return PARAMS.slaAtendimento;\n  const dinheiro = PARAMS.slaFinanceiro + (d.automatiza?0:1) + (d.pix90?2:0);\n  return produto + dinheiro + apura;\n}\n\nfunction enumera(p, modo){\n  const d = deriva(p);\n  const out = []; let naoSeAplica = 0;\n  MOTIVOS.forEach(m => {\n    if (m.soTobe && modo !== 'tobe') return;\n    if (m.assin && !p.assinatura) { naoSeAplica++; return }\n    if (m.st.indexOf(p.status) < 0) { naoSeAplica++; return }\n    if (modo === 'asis'){ out.push({ m, estado:'livre' }); return }\n    if (m.id==='mudei_ideia' && d.dias > PARAMS.prazoArrependimento){\n      out.push({ m, estado:'bloqueado', razao:'Fora do prazo de arrependimento — o Código de Defesa do Consumidor dá '+PARAMS.prazoArrependimento+' dias corridos, e este pedido tem '+d.dias+'.' }); return;\n    }\n    if (m.id==='trocar' && d.dias > PARAMS.prazoTroca){\n      out.push({ m, estado:'bloqueado', razao:'Fora do prazo de troca de '+PARAMS.prazoTroca+' dias.' }); return;\n    }\n    out.push({ m, estado: m.foto ? 'precisa' : 'ok', sla: estimaSla(p, m, modo) });\n  });\n  return { opcoes: out, naoSeAplica };\n}\n\nfunction apura(p, motivoId){\n  if (motivoId === 'nao_chegou'){\n    if (p.canhoto) return { fonte:'Sistema de canhotos · 100% das entregas', conclusao:'Entregue — comprovante localizado', vira:'fecha',\n      texto:'O canhoto assinado foi localizado. A ocorrência não é extravio: o cliente recebe a prova de entrega e o caso fecha sem estorno.' };\n    return { fonte:'Sistema de canhotos · sem registro', conclusao:'Extravio em transporte', vira:'segue',\n      texto:'Não existe canhoto para este pedido. Conclui extravio e aciona o SAT junto à transportadora no mesmo minuto — hoje essa janela costuma ser perdida.' };\n  }\n  if (motivoId === 'faltou'){\n    if (p.picking === 'confere') return { fonte:'API Cubbo · vídeo do picking', conclusao:'Falta não confirmada', vira:'fecha',\n      texto:'O vídeo do picking mostra todos os itens entrando na caixa, com o código do pedido. O cliente recebe a gravação e o caso fecha.' };\n    return { fonte:'API Cubbo · vídeo do picking', conclusao:'Falta confirmada na separação', vira:'segue',\n      texto:'O vídeo confirma que o item não entrou na caixa. Segue como falta faturada — reposição sem novo frete.' };\n  }\n  if (motivoId === 'defeito') return { fonte:'Evidência do cliente + lote', conclusao:'Defeito de fabricação', vira:'segue',\n    texto:'A foto e o lote seguem para validação. Se apontar risco sanitário, a Qualidade é acionada; senão, o item vai para descarte.' };\n  return { fonte:null, conclusao:acha(MOTIVOS,motivoId).conclui, vira:'segue', texto:'Não exige apuração — a declaração do cliente já é a conclusão.' };\n}\n\nfunction decide(p, motivoId, repId, modo, carrinho, destino, base, razaoId){\n  const d = deriva(p);\n  const m = acha(MOTIVOS, motivoId);\n  const tobe = modo === 'tobe';\n  const ap = tobe ? apura(p, motivoId) : { fonte:null, conclusao:'Desistência do cliente', vira:'segue',\n    texto:'Hoje nenhuma apuração automática acontece. O motivo real se perde: tudo entra como \"desistência do cliente\" no OMS e no SAP.' };\n  const vBase = (typeof base === 'number' && base > 0) ? base : p.valor;\n  const parcial = vBase < p.valor - 0.001;\n  const dinheiroDeVolta = daDireitoADinheiro(motivoId, razaoId);\n  const liberaAntes = false;\n  const reversa = m.reversa && ap.vira === 'segue';\n  const produto = [], dinheiro = [];\n\n  if (ap.vira === 'fecha'){\n    produto.push({ st:'auto', t:'Apuração encerra o caso', d:ap.texto });\n    dinheiro.push({ st:'skip', t:'Sem movimento financeiro', d:'A apuração não confirmou a ocorrência.' });\n    return { ap, reversa:false, liberaAntes:false, produto, dinheiro, sla:0, fecha:true };\n  }\n\n  if (reversa){\n    if (tobe) produto.push({ st:'auto', t:'Etiqueta emitida pelo motor', d:'Entrada única, independente do canal e da origem do pedido.', sla:0 });\n    else if (d.troqueCobre) produto.push({ st:'manual', t:'Entrada pelo TroqueCommerce', d:'Funciona para este pedido — mas o cliente não tinha como saber antes de tentar.', sla:0 });\n    else produto.push({ st:'gap', t:'Entrada sem processo definido', d:'O TroqueCommerce não cobre '+ORIGENS[p.origem]+'. Vira e-mail e cai direto num operador do SAC.' });\n\n    produto.push({ st:'manual', t:'Coleta e transporte reverso', d:'Cliente posta ou aguarda a coleta agendada.', sla:PARAMS.slaColeta });\n    produto.push({ st:'manual', t:'Conferência e autorização no CD',\n      d: tobe ? 'Escala por peso no nível 1, balança e bipper no nível 2 — a proposta da própria logística para chegar em 1 dia. Com um motor de score, a etapa poderia ser dispensada para parte dos casos (em estudo).'\n              : 'Validação manual das evidências. A fila decide o prazo.',\n      sla: tobe ? PARAMS.slaAutorizacaoIdeal : PARAMS.slaAutorizacaoCD,\n      ideal: tobe ? null : PARAMS.slaAutorizacaoIdeal });\n    if (repId === 'troca_mesmo' || repId === 'escolher')\n      produto.push({ st: tobe?'auto':'manual', t:'Novo pedido de troca',\n        d: tobe ? 'Disparado pela regra no Magento.' : 'Hoje é digitado à mão pela logística.' });\n    produto.push({ st: tobe?'auto':'manual', t:'Destino do item',\n      d: tobe ? 'A regra decide: estoque se lacrado, baixa por pré-destruição se aberto.'\n              : 'Se aberto, fica no escritório e não é processado no SAP de propósito — evita o estoque fantasma, mas o caso nunca fecha.' });\n  } else if (ap.conclusao === 'Extravio em transporte'){\n    produto.push({ st:'auto', t:'Investigação aberta no SAT', d:'Acionada no ato, dentro da janela da transportadora.', sla:PARAMS.slaApuracaoExtravio });\n    produto.push({ st:'skip', t:'Sem logística reversa', d:'Não há item físico a recuperar.' });\n  } else if (!tobe && !m.reversa){\n    produto.push({ st:'gap', t:'Chega ao CD sem precisar', d:'Extraviado, cancelado antes do envio e falta não têm reversa — mas o SAC roteia pro CD assim mesmo.' });\n  } else {\n    produto.push({ st:'skip', t:'Sem logística reversa', d:'Esta conclusão não gera retorno físico de produto.' });\n  }\n\n  const fim = () => { const sP=produto.reduce((a,x)=>a+(x.sla||0),0), sD=dinheiro.reduce((a,x)=>a+(x.sla||0),0);\n    return { ap, reversa, liberaAntes:false, produto, dinheiro, sla:sP+sD, fecha:false }; };\n\n  if (repId === 'nada'){\n    dinheiro.push({ st:'auto', t:'Recorrência encerrada', d:'Interrompe cobranças futuras. Não gera estorno de caixas já entregues.' });\n    return { ap, reversa, liberaAntes:false, produto, dinheiro, sla:0, fecha:false };\n  }\n  if (repId === 'contato'){\n    produto.length = 0; dinheiro.length = 0;\n    produto.push({ st:'skip', t:'Logística em espera', d:'O atendente decide o destino do produto depois de entender o caso.' });\n    dinheiro.push({ st:'skip', t:'Financeiro em espera', d:'Nada é lançado até a ocorrência ser classificada.' });\n    return fim();\n  }\n  if (repId === 'troca_mesmo'){\n    dinheiro.push({ st:'skip', t:'Sem movimento financeiro', d:'Mesmo produto, mesmo valor — nada a estornar nem a cobrar.' });\n    return fim();\n  }\n  if (repId === 'escolher'){\n    const dif = (carrinho||0) - vBase;\n    if (dif > 0.001){\n      dinheiro.push({ st: tobe?'auto':'gap', t:'Cobrança da diferença · UPSELL',\n        d: tobe ? 'O cliente escolheu '+brl(carrinho)+' contra '+brl(vBase)+' devolvido'+(parcial?' (devolução parcial)':'')+'. O motor fecha a ocorrência e manda '+brl(dif)+' para o checkout.'\n                : 'Não existe no fluxo de troca. A diferença é resolvida por fora, quando é resolvida.' });\n    } else if (dif < -0.001){\n      if (destino === 'estorno_saldo'){\n        dinheiro.push({ st: tobe?'auto':'gap', t:'Reembolso do saldo remanescente · '+brl(-dif),\n          d: tobe ? 'Arrependimento dá direito a dinheiro de volta, então a sobra não fica presa em crédito. Volta na mesma forma de pagamento da compra.'\n                  : 'Não existe no fluxo. A sobra é acertada por fora, na mão, quando alguém chega nela.' });\n      } else {\n        const dest = destino === 'wallet' ? 'wallet do Loyalty' : 'vale-troca';\n        dinheiro.push({ st: tobe ? (destino==='wallet'?'manual':'auto') : 'gap', t:'Saldo de '+brl(-dif)+' em '+dest,\n          d: tobe ? (destino==='wallet'\n                ? 'O saldo entra no programa de fidelidade. Hoje o Loyalty só movimenta pontos, então isso ainda está em estudo.'\n                : 'O residual sai como vale-troca, usável num pedido novo no site.')\n                  : 'Não existe crédito residual automático. Alguém acerta na mão, e o processo é moroso.' });\n      }\n    } else {\n      dinheiro.push({ st:'skip', t:'Troca par', d:'O cliente escolheu exatamente o valor do pedido — nada a cobrar nem a devolver.' });\n    }\n    return fim();\n  }\n  if (repId === 'vale'){\n    dinheiro.push({ st: tobe?'auto':'manual', t:'Emite o vale-troca',\n      d: tobe ? 'Gerado pela regra, no valor do pedido. Vale como meio de pagamento num pedido novo no site.'\n              : 'Emitido à mão. O cliente descobre o saldo perguntando.' });\n    dinheiro.push({ st:'skip', t:'Sem estorno na adquirente', d:'O dinheiro não sai do caixa — vira crédito de compra.' });\n    return fim();\n  }\n  if (repId === 'wallet'){\n    dinheiro.push({ st: tobe?'manual':'gap', t:'Crédito na wallet do Loyalty',\n      d: tobe ? 'O valor entra como saldo no programa de fidelidade. Hoje o Loyalty só movimenta pontos, então isso ainda está em estudo.'\n              : 'Não existe. O Loyalty é um site separado e movimenta só pontos, por e-mail ao time de fidelidade.' });\n    return fim();\n  }\n\n  if (parcial && (repId === 'estorno' || repId === 'estorno_parcial'))\n    dinheiro.push({ st: tobe?'auto':'gap', t:'Reembolso do saldo remanescente · '+brl(vBase),\n      d: tobe ? 'O cliente devolveu parte do pedido. Volta o valor dos itens devolvidos, e não o total de '+brl(p.valor)+'.'\n              : 'Devolução parcial não tem cálculo no fluxo. Alguém decide o valor na planilha.' });\n  if (!tobe){\n    dinheiro.push({ st:'manual', t:'Curadoria do pedido de pagamento', d:'O SAC manda o pedido de entrega. Alguém varre o cadastro do cliente pra achar o de pagamento, que é o único com PSP.' });\n    dinheiro.push({ st:'manual', t:'Preenche a planilha', d:'Planilha do CD ou do Digital, conforme a origem. Vai por e-mail para o financeiro.' });\n  }\n  dinheiro.push({ st: tobe?'auto':'manual',\n    t: tobe ? 'Trilha do dinheiro aberta junto' : 'Aguarda a autorização da logística',\n    d: tobe ? 'As duas trilhas abrem no mesmo momento e são cobradas juntas. Só a liberação final depende do produto.'\n            : 'O dinheiro não anda enquanto a logística não autorizar.' });\n  dinheiro.push({ st:'manual', t:'Cancela no Magento e baixa a nota no SAP', d:'Cancelamento e conciliação de estoque.' });\n  if (d.pix90){\n    dinheiro.push({ st: tobe?'auto':'manual', t:'Encaminha para Contas a Pagar',\n      d: tobe ? 'A regra já nasce nesse trilho e pede os dados bancários na abertura.' : 'PIX com mais de 90 dias não volta pela adquirente — e isso só é descoberto no meio do caminho.', sla:2 });\n  } else if (d.automatiza){\n    dinheiro.push({ st:'auto', t:'Estorno em lote na '+PAGS[p.pag].curto, d:'Batch na adquirente.', sla:PARAMS.slaFinanceiro });\n  } else {\n    dinheiro.push({ st: tobe?'manual':'gap', t:'Estorno na '+PAGS[p.pag].curto,\n      d: tobe ? 'Sem automação nesta adquirente — mas o motor abre e cobra a tarefa, com prazo.' : 'Sem automação e sem dono claro. Um a um, quando alguém lembra.', sla:PARAMS.slaFinanceiro+1 });\n  }\n  dinheiro.push({ st: tobe?'auto':'gap', t:'Comprovante de estorno',\n    d: tobe ? 'Sai como documento do sistema, junto ao cliente e ao histórico da ocorrência.' : 'Não existe como saída de sistema. O SAC cobra à mão, um a um.' });\n\n  return fim();\n}\n\nconst CD_END = { n:'Granado Pharmácias — Centro de Distribuição',\n  l1:'Rua Cosme Velho, 1.200 — Galpão 3', l2:'Rio de Janeiro / RJ — CEP 22241-090' };\nconst CLI_END = { l1:'Rua Harmonia, 482 — apto 71', l2:'São Paulo / SP — CEP 05435-000' };\n\nconst dataMais = (n) => new Date(Date.now()+n*864e5).toLocaleDateString('pt-BR',{day:'2-digit',month:'2-digit'});\n\nfunction rastreio(p){\n  const n = p.ref.replace(/\\D/g,'').slice(-9);\n  return 'PH' + n.slice(0,3) + ' ' + n.slice(3,6) + ' ' + n.slice(6,9) + ' BR';\n}\nfunction barras(p){\n  const n = p.ref.replace(/\\D/g,'');\n  let out = '';\n  for (let i=0;i<58;i++){\n    const d = parseInt(n.charAt(i % n.length), 10) || 1;\n    out += '<i style=\"width:'+(1 + (d % 3))+'px;opacity:'+(d % 2 ? 1 : .18)+'\"></i>';\n  }\n  return out;\n}\n\n/* a trilha do cliente, etapa a etapa, com quem faz e quando */\nfunction trilhaCliente(p, motivoId, repId, r, sel){\n  if (!r) return [];\n  const E = (quem, t, d, st, nota) => ({ quem:quem, t:t, d:d, st:st, nota:nota });\n  const out = [E('voce','Você abriu a ocorrência','hoje','feito','Protocolo emitido e enviado para o seu e-mail.')];\n\n  if (motivoId === 'falar'){\n    out.push(E('granado','Um atendente assume o seu caso', dataMais(PARAMS.slaAtendimento), 'agora',\n      'Ele recebe o pedido, a forma de pagamento e o histórico. Você não vai repetir nada.'));\n    return out;\n  }\n  if (r.fecha){\n    out.push(E('granado','Enviamos a comprovação','hoje','feito', r.ap.conclusao + '. A ocorrência fecha sem devolução.'));\n    out.push(E('voce','Se não reconhecer, responda por aqui','quando quiser','depois','Um atendente assume o caso com todo o histórico.'));\n    return out;\n  }\n  if (r.ap.conclusao === 'Extravio em transporte'){\n    out.push(E('granado','Investigação aberta com a transportadora','hoje','agora','Acionada no mesmo minuto, dentro da janela do SAT.'));\n    out.push(E('granado','Retorno com a conclusão', dataMais(PARAMS.slaApuracaoExtravio), 'depois','Você recebe o resultado por aqui e por e-mail.'));\n    out.push(E('granado','Valor devolvido', dataMais(r.sla), 'depois','Confirmado o extravio, sai sem você precisar fazer nada.'));\n    return out;\n  }\n\n  let dia = 0;\n  if (r.reversa){\n    out.push(E('voce','Imprima a etiqueta e poste nos Correios', 'até '+dataMais(PARAMS.slaColeta), 'agora',\n      'A etiqueta já sai com o código do pedido. Você não precisa escrever nada na caixa.'));\n    dia += PARAMS.slaColeta;\n    out.push(E('granado','Chegada ao CD e identificação automática', dataMais(dia+1), 'depois',\n      'A caixa é lida pelo código da etiqueta e casa sozinha com a sua ocorrência.'));\n    dia += 1 + PARAMS.slaAutorizacaoIdeal;\n    out.push(E('granado','Conferência', dataMais(dia), 'depois','Até '+PARAMS.slaAutorizacaoIdeal+' dia útil depois da chegada.'));\n  }\n  if (repId === 'nada'){\n    out.push(E('granado','Cobranças futuras encerradas','hoje','feito','As caixas já enviadas seguem como estão.'));\n    return out;\n  }\n  if (repId === 'repor' || repId === 'reenvio')\n    out.push(E('granado','Reenvio despachado', dataMais(r.sla), 'depois','Sem custo de frete.'));\n  else if (repId === 'troca_mesmo' || repId === 'escolher')\n    out.push(E('granado','Pedido novo despachado', dataMais(r.sla), 'depois','Sai assim que a conferência fecha.'));\n  else if (repId === 'vale')\n    out.push(E('granado','Vale-troca liberado', dataMais(r.sla), 'depois','Usável como meio de pagamento num pedido novo no site.'));\n  else if (repId === 'wallet')\n    out.push(E('granado','Saldo creditado na carteira do Loyalty', dataMais(r.sla), 'depois','Aparece no seu programa de fidelidade.'));\n  else\n    out.push(E('granado','Reembolso liberado', dataMais(r.sla), 'depois','Na mesma forma de pagamento da compra.'));\n\n  out.push(E('granado','Comprovante disponível', dataMais(r.sla), 'depois','Sai como documento, junto da ocorrência. Você não precisa pedir.'));\n  return out;\n}\n\n/* a etiqueta dos Correios, com o campo que hoje vai vazio */\nfunction etiqueta(p, s, r){\n  const sel = s.devItens || itensPadrao(p);\n  const itens = linhasDoPedido(p).filter(x=>(sel[x.sku]||0) > 0);\n  const cod = 'OC-'+p.ref.replace('#','').slice(-6);\n  const rz = s.razao ? razao(s.razao) : null;\n  return '<div class=\"etq\">'+\n    '<div class=\"etqh\"><div class=\"etql\">CORREIOS <b>·</b> Logística reversa</div>'+\n    '<div class=\"etqa\">Autorização de postagem 9912494073</div></div>'+\n    '<div class=\"etqb\">'+\n      '<div class=\"etqc\"><div class=\"etqt\">Destinatário</div>'+\n        '<div class=\"etqn\">'+CD_END.n+'</div><div class=\"etqe\">'+CD_END.l1+'</div><div class=\"etqe\">'+CD_END.l2+'</div></div>'+\n      '<div class=\"etqc\"><div class=\"etqt\">Remetente</div>'+\n        '<div class=\"etqn\">'+esc(p.nome)+'</div><div class=\"etqe\">'+CLI_END.l1+'</div><div class=\"etqe\">'+CLI_END.l2+'</div></div>'+\n    '</div>'+\n    '<div class=\"etqbar\"><div class=\"bars\">'+barras(p)+'</div><div class=\"etqcod\">'+rastreio(p)+'</div></div>'+\n    '<div class=\"etqid\">'+\n      '<div class=\"etqt\">Identificação da ocorrência</div>'+\n      '<div class=\"etqid1\">Pedido <b>'+esc(p.ref)+'</b> <span>·</span> Protocolo <b>'+cod+'</b></div>'+\n      '<div class=\"etqid2\">'+(itens.length\n        ? itens.length+' '+(itens.length===1?'item':'itens')+' · '+itens.map(x=>esc(x.it.n)).join(' · ')\n        : 'itens da ocorrência')+'</div>'+\n      (rz ? '<div class=\"etqid2\">Motivo declarado: '+esc(rz.l.toLowerCase())+'</div>' : '')+\n    '</div>'+\n    '<div class=\"etqav\"><b>Este bloco hoje vai em branco.</b> É por isso que a caixa precisa ser aberta no CD para alguém descobrir de qual chamado ela é, e é aí que a fila de triagem se forma.</div>'+\n    '<div class=\"etqbt\"><button class=\"etqp\">Imprimir etiqueta</button><button class=\"etqs\">Salvar PDF</button>'+\n    '<span>ou apresente o código '+rastreio(p)+' na agência</span></div>'+\n    '</div>';\n}\n\nfunction passosCliente(p, motivoId, repId, r, modo){\n  if (modo === 'asis') return null;\n  const mais = (n) => new Date(Date.now()+n*864e5).toLocaleDateString('pt-BR',{day:'2-digit',month:'2-digit'});\n  const out = [];\n  if (motivoId === 'falar'){ out.push('Um atendente assume o seu caso e responde em até '+PARAMS.slaAtendimento+' dia útil.');\n    out.push('Ele já recebe o pedido, a forma de pagamento e o histórico — você não vai precisar repetir nada.'); return out }\n  if (r.fecha){ out.push('Enviamos agora a comprovação — '+r.ap.conclusao.toLowerCase()+'.');\n    out.push('Se ainda assim não reconhecer, responda a esta ocorrência que um atendente assume o caso.'); return out }\n  if (r.ap.conclusao === 'Extravio em transporte'){\n    out.push('Abrimos a investigação com a transportadora hoje.');\n    out.push('Retornamos com a conclusão até '+mais(PARAMS.slaApuracaoExtravio)+'.');\n    out.push('Confirmado o extravio, o valor é devolvido sem você precisar fazer nada.'); return out }\n  if (r.reversa){ out.push('Imprima a etiqueta e poste nos Correios até '+mais(PARAMS.slaColeta)+'.');\n    out.push('A conferência leva até '+PARAMS.slaAutorizacaoIdeal+' dia após a chegada.') }\n  if (repId === 'nada'){ out.push('Sua assinatura não será mais cobrada. As caixas já enviadas seguem como estão.'); return out }\n  if (repId==='repor' || repId==='reenvio') out.push('O reenvio sai sem custo de frete assim que confirmarmos.');\n  else out.push('O reembolso é liberado após a conferência.');\n  out.push('Previsão de conclusão: '+mais(r.sla)+'.');\n  return out;\n}\n\nconst VERBOS = [\n  ['deriva','Deriva','lê o pedido e preenche o que o cliente não sabe'],\n  ['enumera','Enumera','calcula o que ainda pode ser aberto'],\n  ['apura','Apura','consulta a prova que já existe'],\n  ['decide','Decide','elegibilidade, reparação e se o dinheiro espera'],\n  ['classifica','Classifica','separa o que foi declarado do que foi concluído'],\n  ['orquestra','Orquestra','dispara as duas trilhas e cobra o prazo'],\n];\n\nconst SVGI = {\n  user:'<svg viewBox=\"0 0 22 22\"><circle cx=\"11\" cy=\"7.4\" r=\"3.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M4 19a7 7 0 0 1 14 0\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n  busca:'<svg viewBox=\"0 0 22 22\"><circle cx=\"9.8\" cy=\"9.8\" r=\"6.2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M14.4 14.4 19 19\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n  sacola:'<svg viewBox=\"0 0 22 22\"><path d=\"M4.4 7h13.2l-1 11.4a1.6 1.6 0 0 1-1.6 1.4H7a1.6 1.6 0 0 1-1.6-1.4z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M8 8.4V5.8a3 3 0 0 1 6 0v2.6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>'\n};\n\nfunction picker(p, cart){\n  if (!CATALOGO.length) return '<div class=\"vazio\">Carregando o catálogo da Granado…</div>';\n  const tot = totalCarrinho(cart), dif = tot - p.valor;\n  const cls = Math.abs(dif)<0.01 ? 'par' : (dif>0 ? 'mais' : 'menos');\n  const txt = Math.abs(dif)<0.01 ? 'troca par' : (dif>0 ? 'faltam '+brl(dif)+' · vai pro checkout' : 'sobram '+brl(-dif)+' · vira saldo');\n  return '<div class=\"pick\"><div class=\"pkh\"><span>Disponível para trocar</span><b>'+brl(p.valor)+'</b></div>'+\n    '<div class=\"grid\">'+CATALOGO.slice(0,12).map(it=>{\n      const q=(cart||{})[it.sku]||0;\n      return '<div class=\"prod'+(q?' on':'')+'\" data-sku=\"'+it.sku+'\">'+\n        '<div class=\"sw\"><img src=\"'+it.img+'\" alt=\"\" loading=\"lazy\">'+\n        (q?'<span class=\"qt\">'+q+'</span><button class=\"rm\">−</button>':'')+'</div>'+\n        '<div class=\"pn\">'+esc(it.n)+'</div><div class=\"pp\">'+brl(it.p)+'</div></div>';\n    }).join('')+'</div>'+\n    '<div class=\"tot '+cls+'\"><div class=\"l\"><span>Escolhido</span><b>'+brl(tot)+'</b></div><div class=\"d\">'+txt+'</div></div></div>';\n}\n\nfunction chip(st){\n  const n = { auto:'automático', manual:'manual', gap:'sem processo', skip:'não se aplica' }[st] || st;\n  return '<span class=\"chip '+st+'\">'+n+'</span>';\n}\nfunction stepHtml(s){\n  const sla = s.sla ? '<span class=\"sla\">'+s.sla+'d'+(s.ideal?' · ideal '+s.ideal+'d':'')+'</span>' : '';\n  return '<div class=\"p '+s.st+'\"><i></i><div><div class=\"pt\">'+esc(s.t)+chip(s.st)+sla+'</div>'+\n    (s.d?'<div class=\"pd\">'+esc(s.d)+'</div>':'')+'</div></div>';\n}\nfunction moldura(modo, dom){\n  const m = MOLDURA[modo][dom];\n  return '<div class=\"mold '+modo+'\"><div class=\"mt\">'+esc(m.t)+'</div><ul>'+\n    m.p.map(x=>'<li>'+esc(x)+'</li>').join('')+'</ul></div>';\n}\n\n/* ── a área de conta da Granado, como ela é hoje ─────────────────────── */\nfunction siteGranado(inner){\n  return '<div class=\"gsite\">'+\n    '<div class=\"gtop\"><span class=\"on\">GRANADO</span><span>PHEBO</span><span>CARE</span><span>INTERNACIONAL ⌄</span></div>'+\n    '<div class=\"gnav\">'+\n      '<div class=\"glogo\">GRANADO<em>desde 1870</em></div>'+\n      '<nav class=\"gmenu\">'+['VER TUDO','PERFUMARIA','SABONETES','CASA','NOVIDADES'].map(x=>'<a>'+x+'</a>').join('')+'</nav>'+\n      '<div class=\"gtools\">'+\n        '<span class=\"gfid\"><i>clube</i><b>FIDELIDADE</b><u>GRUPO GRANADO</u></span>'+\n        '<span class=\"gic\">'+SVGI.user+'</span><span class=\"gic\">'+SVGI.busca+'</span>'+\n        '<span class=\"gic gbag\">'+SVGI.sacola+'<em>1</em></span>'+\n      '</div></div>'+\n    '<div class=\"gbody\">'+\n      '<aside class=\"gside\">'+\n        '<a>Minha conta</a><a class=\"on\">Meus pedidos</a><a>Clube Fidelidade</a><a>Favoritos</a>'+\n        '<hr><a>Endereços</a><a>Informações da conta</a><a>Cartões salvos</a><a>Sair</a>'+\n        '<hr><a>BOX - Minhas Assinaturas</a>'+\n      '</aside>'+\n      '<main class=\"gmain\">'+inner+'</main>'+\n    '</div>'+\n    '<button class=\"xclose\">Voltar ao diagrama ✕</button></div>';\n}\n\nfunction tabelaPedidos(){\n  return '<h1 class=\"gh1\">Meus pedidos</h1><div class=\"grule\"></div>'+\n    '<h2 class=\"gh2\">Pedidos recentes</h2>'+\n    '<div class=\"gtabw\"><table class=\"gtab\">'+\n    '<thead><tr><th>Ordem #</th><th>Data</th><th>Enviar para</th><th>Total do Pedido</th><th>Status</th><th>Ações</th></tr></thead><tbody>'+\n    PEDIDOS.map(x=>'<tr><td class=\"gref\">'+esc(x.ref.replace('#',''))+'</td>'+\n      '<td>'+esc(x.data)+'</td><td>'+esc(x.nome)+'</td><td class=\"gval\">'+brl(x.valor)+'</td>'+\n      '<td><span class=\"gst\">'+esc(x.rot)+'</span></td>'+\n      '<td class=\"gac\"><a>Detalhes do pedido</a><a>Comprar novamente</a>'+\n      '<button class=\"gtr\" data-ped=\"'+esc(x.ref)+'\">Trocar ou devolver</button></td></tr>').join('')+\n    '</tbody></table></div>'+\n    '<div class=\"gpg\">Mostrar <span>10 ⌄</span> por página</div>'+\n    '<div class=\"gnota\">O botão <b>Trocar ou devolver</b> é o único elemento que não existe hoje. '+\n    'Ele é a entrada única: o cliente já está aqui, com o pedido na frente.</div>';\n}\n\nfunction itensEMotivo(p, s, compacto){\n  const sel = s.devItens || itensPadrao(p);\n  const rz = s.razao ? razao(s.razao) : null;\n  const linhas = linhasDoPedido(p);\n  const nSel = Object.keys(sel).filter(k=>sel[k]>0).length;\n  const lista = razoesDe(s.motivo);\n  const tItens = TITULO_ITENS[s.motivo] || 'Quais itens você quer devolver?';\n  const tRazao = TITULO_RAZAO[s.motivo] || 'Por que você quer trocar?';\n  const itensHtml = linhas.length\n    ? linhas.map(x=>{\n        const q = sel[x.sku]||0;\n        return '<div class=\"itl'+(q?' on':'')+'\" data-item=\"'+x.sku+'\">'+\n          (compacto?'':'<div class=\"itim\"><img src=\"'+x.it.img+'\" alt=\"\" loading=\"lazy\"></div>')+\n          '<div class=\"itd\"><div class=\"itn\">'+esc(x.it.n)+'</div>'+\n          '<div class=\"itp\">'+brl(x.it.p)+(x.q>1?' · '+x.q+' un':'')+'</div></div>'+\n          '<div class=\"itk\">'+(q?'✓':'')+'</div></div>';\n      }).join('')\n    : '<div class=\"gcarr\">Carregando os itens do pedido…</div>';\n\n  return '<div class=\"bloco\">'+\n    '<div class=\"blt\">'+tItens+'</div>'+\n    '<div class=\"itg'+(compacto?' cp':'')+'\">'+itensHtml+'</div>'+\n    (lista.length\n      ? '<div class=\"blt2\">'+tRazao+'</div>'+\n        '<div class=\"rzg\">'+lista.map(x=>\n          '<button class=\"rz'+(s.razao===x.id?' on':'')+(x.saida?' sec':'')+'\" data-razao=\"'+x.id+'\">'+\n          '<div class=\"rzt\">'+esc(x.l)+(x.cdc?'<span class=\"rztag\">CDC</span>':'')+(x.foto?'<span class=\"rztag foto\">foto</span>':'')+'</div>'+\n          '<div class=\"rzd\">'+esc(x.d)+'</div></button>').join('')+'</div>'\n      : '')+\n    (rz && rz.foto ? '<div class=\"rzav\">Anexe a foto do produto e do lote. Sem ela a ocorrência não abre, e é isso que hoje trava o caso por dias.</div>' : '')+\n    (rz && rz.saida ? '<div class=\"rzav\">Motivos fora da lista vão direto para um atendente, com o pedido e o histórico já preenchidos.</div>' : '')+\n    '<button class=\"btn\" data-go2'+(((lista.length && !s.razao) || !nSel)?' disabled':'')+'>'+\n      (!nSel ? 'Selecione ao menos um item' : ((lista.length && !s.razao) ? 'Escolha o motivo' : 'Continuar'))+'</button>'+\n    '</div>';\n}\n\nfunction expRender(d2, p, passo, carrinho, difCar, r){\n  const s = d2.state;\n  if (passo === 1 || !p) return siteGranado(tabelaPedidos());\n\n  const passos = ['Pedido','Ocorrência','Resolução','Pronto'];\n  const idx = Math.min(passo,4);\n  let corpo = '';\n\n  if (passo === 2){\n    const e = enumera(p, 'tobe');\n    corpo = '<h3 class=\"gh3\">O que aconteceu com o pedido '+esc(p.ref)+'?</h3>'+\n      '<p class=\"gsub\">Só aparece o que ainda é possível para este pedido. O prazo vem junto.</p>'+\n      '<div class=\"xopts\">'+e.opcoes.map(o=>\n        o.estado==='bloqueado'\n        ? '<div class=\"xopt off\"><div class=\"xot\">'+esc(o.m.label)+'</div><div class=\"xow\">'+esc(o.razao)+'</div></div>'\n        : '<button class=\"xopt'+(o.m.saida?' sec':'')+'\" data-mot=\"'+esc(o.m.id)+'\"><div class=\"xot\">'+esc(o.m.label)+'</div>'+\n          '<div class=\"xod\">'+(o.estado==='precisa'?'precisamos de uma foto · ':'')+'resolvemos em até '+o.sla+' dia'+(o.sla===1?'':'s')+'</div>'+\n          '<span class=\"xar\">→</span></button>').join('')+'</div>';\n    const mSel = s.motivo ? acha(MOTIVOS, s.motivo) : null;\n    if (pedeItens(mSel)) corpo += itensEMotivo(p, s, false);\n  } else if (passo === 3){\n    const rep = s.reparacao;\n    const grupos = [];\n    (REPARACOES[s.motivo]||[]).forEach(rp=>{\n      const g = GRUPO_REP[rp[0]] || 'unico';\n      let bloco = grupos.filter(x=>x[0]===g)[0];\n      if (!bloco){ bloco = [g, []]; grupos.push(bloco) }\n      bloco[1].push(rp);\n    });\n    corpo = '<h3 class=\"gh3\">Como prefere resolver?</h3>'+\n      '<p class=\"gsub\">Só aparece o que a regra permite para este pedido.</p>'+\n      grupos.map(g=>\n        (g[0]==='unico' ? '' : '<div class=\"grh\"><div class=\"grt\">'+GRUPO_LBL[g[0]][0]+'</div>'+\n          '<div class=\"grd\">'+GRUPO_LBL[g[0]][1]+'</div></div>')+\n        '<div class=\"xopts\">'+g[1].map(rp=>\n          '<button class=\"xopt'+(rep===rp[0]?' sel':'')+(rp[0]==='contato'?' sec':'')+'\" data-rep=\"'+rp[0]+'\">'+\n          '<div class=\"xot\">'+esc(rp[1])+(rp[3]?'<span class=\"xup\">'+esc(rp[3])+'</span>':'')+'</div>'+\n          (rp[2]?'<div class=\"xod\">'+esc(rp[2])+'</div>':'')+'<span class=\"xar\">→</span></button>').join('')+'</div>'\n      ).join('');\n    if (rep === 'escolher'){\n      const linha = s.linha || 'todas';\n      const lista = CATALOGO.filter(it => linha==='todas' || it.linha===linha);\n      corpo += '<div class=\"xstore\"><div class=\"xsh\"><h3>Escolha o que levar</h3>'+\n        '<div class=\"xsv\">Você tem <b>'+brl(valorDevolvido(p, s.devItens) || p.valor)+'</b> para usar</div></div>'+\n        '<div class=\"xfil\">'+['todas'].concat(LINHAS_CAT()).map(l=>\n          '<button class=\"xfb'+(l===linha?' on':'')+'\" data-linha=\"'+esc(l)+'\">'+esc(l==='todas'?'Todas as linhas':l)+'</button>').join('')+'</div>'+\n        (CATALOGO.length\n          ? '<div class=\"xgrid\">'+lista.map(it=>{\n              const q=(s.cart||{})[it.sku]||0;\n              return '<div class=\"xprod'+(q?' on':'')+'\" data-sku=\"'+it.sku+'\">'+\n                '<div class=\"xsw\"><img src=\"'+it.img+'\" alt=\"\" loading=\"lazy\">'+\n                (q?'<span class=\"xqt\">'+q+'</span><button class=\"rm\">−</button>':'<span class=\"xadd\">+</span>')+'</div>'+\n                '<div class=\"xlin\">'+esc(it.linha)+'</div>'+\n                '<div class=\"xpnm\">'+esc(it.n)+'</div><div class=\"xppr\">'+brl(it.p)+'</div></div>';\n            }).join('')+'</div>'\n          : '<div class=\"gcarr\">Carregando o catálogo da Granado…</div>')+\n        '</div>';\n    }\n  } else if (passo === 4 && s.reparacao === 'escolher' && difCar < -0.01 && !s.destino){\n    const podeDinheiro = daDireitoADinheiro(s.motivo, s.razao);\n    corpo = '<h3 class=\"gh3\">Sobraram '+brl(-difCar)+'</h3>'+\n      '<p class=\"gsub\">Você escolheu menos do que devolveu. Onde prefere guardar a diferença?</p>'+\n      '<div class=\"xopts\">'+\n      (podeDinheiro\n        ? '<button class=\"xopt\" data-dest=\"estorno_saldo\"><div class=\"xot\">Reembolso do saldo remanescente<span class=\"xup\">CDC</span></div>'+\n          '<div class=\"xod\">A sobra volta em dinheiro, na mesma forma de pagamento da compra. Disponível porque o motivo é arrependimento.</div><span class=\"xar\">→</span></button>'\n        : '')+\n      '<button class=\"xopt\" data-dest=\"vale\"><div class=\"xot\">Vale-troca</div>'+\n      '<div class=\"xod\">Use como forma de pagamento em qualquer compra no site.</div><span class=\"xar\">→</span></button>'+\n      '<button class=\"xopt\" data-dest=\"wallet\"><div class=\"xot\">Carteira do Loyalty</div>'+\n      '<div class=\"xod\">O valor fica como saldo no seu programa de fidelidade.</div><span class=\"xar\">→</span></button></div>'+\n      (podeDinheiro ? '' : '<div class=\"rzav\">Reembolso em dinheiro da sobra vale para arrependimento. Neste caso o motivo declarado é outro, então a diferença fica como crédito.</div>');\n  } else {\n    const cod = 'OC-'+p.ref.replace('#','').slice(-6);\n    const tr = trilhaCliente(p, s.motivo, s.reparacao, r, s.devItens);\n    const titulo = r.fecha ? 'Resolvido agora, sem precisar devolver nada'\n      : (r.reversa ? 'Ocorrência aberta. O próximo passo é seu.' : 'Ocorrência aberta.');\n    const sub = r.fecha ? esc(r.ap.texto)\n      : (r.reversa ? 'Previsão de conclusão em '+r.sla+' dia'+(r.sla===1?'':'s')+', contando a partir da postagem.'\n                   : 'Previsão de conclusão em '+r.sla+' dia'+(r.sla===1?'':'s')+'.');\n    corpo = '<div class=\"xdone\"><div class=\"xck\">✓</div>'+\n      '<h3 class=\"gh3\">'+titulo+'</h3>'+\n      '<div class=\"xcod\">'+cod+'</div>'+\n      '<p class=\"gsub\">'+sub+'</p>'+\n      '</div>'+\n      '<div class=\"xsync\">Sua ocorrência já está no atendimento, com o pedido e o histórico. Se precisar falar com alguém, responda por aqui e ninguém vai pedir tudo de novo.</div>'+\n      (s.reparacao==='escolher' && difCar>0.01\n        ? '<div class=\"xpay\"><div><span>Falta pagar</span><b>'+brl(difCar)+'</b></div><button class=\"ckb\">Ir para o checkout</button></div>'\n        : '')+\n      (r.reversa ? '<div class=\"blt2\">Sua etiqueta de postagem</div>'+etiqueta(p, s, r) : '')+\n      '<div class=\"blt2\">O que acontece daqui pra frente</div>'+\n      '<div class=\"trl\">'+tr.map(x=>\n        '<div class=\"trli '+x.st+' '+x.quem+'\"><div class=\"trlm\"><i></i></div>'+\n        '<div class=\"trlc\"><div class=\"trlh\"><span class=\"trlq\">'+(x.quem==='voce'?'Você':'Granado')+'</span>'+\n        '<span class=\"trld\">'+esc(x.d)+'</span></div>'+\n        '<div class=\"trlt\">'+esc(x.t)+'</div>'+\n        (x.nota?'<div class=\"trln\">'+esc(x.nota)+'</div>':'')+'</div></div>').join('')+'</div>'+\n      '<button class=\"back xrest\">Simular outro caso</button>';\n  }\n\n  const barra = (passo===3 && s.reparacao)\n    ? '<div class=\"xbar\"><div class=\"xbl\">'+\n      (s.reparacao==='escolher'\n        ? '<span>Escolhido</span><b>'+brl(carrinho)+'</b><em>'+(Math.abs(carrinho-p.valor)<0.01?'troca par':(carrinho>p.valor?'faltam '+brl(carrinho-p.valor):'sobram '+brl(p.valor-carrinho)))+'</em>'\n        : '<span>Pedido</span><b>'+brl(p.valor)+'</b>')+\n      '</div><button class=\"xgo\" data-go'+(s.reparacao==='escolher'&&carrinho<=0?' disabled':'')+'>'+\n      (s.reparacao==='escolher'&&carrinho<=0?'Escolha ao menos um produto':'Continuar')+'</button></div>'\n    : '';\n\n  return siteGranado(\n    '<div class=\"gcrumb\"><a class=\"back\">Meus pedidos</a><i>/</i>Trocar ou devolver<b>'+esc(p.ref)+'</b></div>'+\n    '<h1 class=\"gh1\">Trocar ou devolver</h1><div class=\"grule\"></div>'+\n    '<div class=\"gres\"><div class=\"gresi\">'+itensDoPedido(p).map(x=>'<span>'+esc(x)+'</span>').join('')+'</div>'+\n    '<div class=\"gresv\">'+brl(p.valor)+'<em>'+esc(p.data)+'</em></div></div>'+\n    '<div class=\"gsteps\">'+passos.map((t,i)=>'<span class=\"'+(i+1<=idx?'on':'')+'\">'+t+'</span>').join('')+'</div>'+\n    corpo + barra);\n}\n\n/* ── a política, artigo por artigo ──────────────────────────────── */\nconst POLITICA = [\n ['Artigo 1 — Definições', [\n  ['1.1','<b>Canal de origem</b>: a unidade logística de onde o pedido foi expedido — Centro de Distribuição (\"CD\"), Darkstore, Loja física (retirada, entrega expressa/\"Ship from Store\", ou balcão), Assinatura recorrente (\"Box\") ou Marketplace terceirizado.'],\n  ['1.2','<b>Motivo</b>: a causa declarada da ocorrência — arrependimento, defeito de fabricação ou avaria, extravio em transporte, falta de item (faturado ou não), cancelamento anterior ao envio, recusa do pedido pela loja, não retirada dentro do prazo, ou indecisão do cliente quanto ao item de troca.'],\n  ['1.3','<b>Forma de pagamento</b>: o meio pelo qual o cliente completou a compra — cartão de crédito ou PIX à vista processado via Adyen (marcas Granado/Phebo ou Care), PIX parcelado (\"Quer\") via PagBrasil, PagLeve, cartão-presente, ou pontos do programa de fidelidade.'],\n  ['1.4','<b>Tipo de reparação</b>: o resultado entregue ao cliente — estorno total, estorno parcial, troca pelo mesmo produto, troca por produto de valor diferente, ou troca-crédito em carteira digital.']]],\n ['Artigo 2 — Elegibilidade por Motivo', [\n  ['2.1','<b>Arrependimento.</b> É elegível toda solicitação registrada em até 7 (sete) dias corridos da data da compra, nos termos do direito de arrependimento do consumidor. Enquanto não houver validação automatizada deste prazo, a checagem permanece manual e sujeita a erro. Toda ocorrência desta natureza exige logística reversa.'],\n  ['2.2','<b>Defeito de fabricação ou avaria.</b> É elegível mediante anexação de evidência fotográfica do defeito relatado, associada a lote e validade do produto quando aplicável. Exige logística reversa e validação humana da evidência.'],\n  ['2.3','<b>Extravio em transporte.</b> Não está sujeito a prazo de elegibilidade. Não exige logística reversa — segue diretamente para tratamento financeiro, uma vez que não há item físico a recuperar.'],\n  ['2.4','<b>Falta de item — faturado.</b> O item ausente é reposto ao cliente sem cobrança adicional de frete. Não exige logística reversa.'],\n  ['2.5','<b>Falta de item — não faturado.</b> Por não ter havido cobrança pelo item ausente, a reparação consiste em orientar nova compra, sujeita a novo frete, salvo política de compensação em contrário.'],\n  ['2.6','<b>Cancelamento anterior ao envio.</b> Elegível a qualquer momento anterior à expedição do pedido. Não exige logística reversa, uma vez que o item nunca deixou o centro de origem.'],\n  ['2.7','<b>Recusa do pedido pela loja.</b> A elegibilidade é automática; a forma de processamento do estorno depende da forma de pagamento, nos termos do Artigo 4. Não exige logística reversa.'],\n  ['2.8','<b>Não retirada dentro do prazo.</b> O pedido é elegível a cancelamento após 7 (sete) dias corridos sem retirada pelo cliente na loja designada.'],\n  ['2.9','<b>Indecisão quanto ao item de troca.</b> Hipótese sem regra de elegibilidade automatizada definida; permanece sujeita a decisão manual da área de atendimento.']]],\n ['Artigo 3 — Entrada por Canal', [\n  ['3.1','Pedidos originados do Centro de Distribuição e de Darkstore têm entrada automatizada por meio da plataforma TroqueCommerce.'],\n  ['3.2','Pedidos de retirada em loja e de entrega expressa originada de loja física (\"Ship from Store\") não possuem cobertura na plataforma TroqueCommerce; a solicitação deve ser aberta manualmente junto ao atendimento (SAC).'],\n  ['3.3','A devolução no balcão da loja física, embora tecnicamente disponível no sistema de ponto de venda, não constitui via de fato praticada — o encaminhamento ao atendimento (SAC) permanece o caminho efetivo.'],\n  ['3.4','Pedidos da assinatura recorrente (\"Box\") são sempre expedidos do Centro de Distribuição. O cancelamento realizado pelo cliente na própria plataforma interrompe apenas cobranças futuras e não produz, por si só, qualquer devolução ou estorno relativo a pedidos já processados.'],\n  ['3.5','Pedidos originados de plataformas de marketplace terceirizadas não se sujeitam a este documento — a responsabilidade pelo estorno e pela troca é integralmente do respectivo marketplace.']]],\n ['Artigo 4 — Automação Financeira por Forma de Pagamento', [\n  ['4.1','Nos casos de recusa do pedido pela loja, o estorno é processado automaticamente, sem faturamento do pedido, exclusivamente quando o pagamento tiver sido realizado por cartão de crédito ou PIX à vista processado via Adyen, sob as marcas Granado ou Phebo.'],\n  ['4.2','Para pagamentos processados via Adyen sob a marca Care, o mesmo cenário de recusa não é automatizado, exigindo processamento manual.'],\n  ['4.3','Pagamentos via PagBrasil (inclusive a modalidade \"Quer\") e PagLeve não possuem automação de estorno em nenhuma hipótese.'],\n  ['4.4','Estornos parciais em cartão-presente não possuem responsável sistemicamente designado e devem ser tratados como exceção, com escalonamento imediato.'],\n  ['4.5','O prazo interno para processamento financeiro, uma vez autorizado o reembolso, é de 24 (vinte e quatro) horas.']]],\n ['Artigo 5 — Regras Especiais', [\n  ['5.1','Pagamentos via PIX com mais de 90 (noventa) dias da data da transação não podem ser estornados por meio da adquirente, nos termos de regulamentação do Banco Central. Nesses casos, a devolução é processada diretamente pela área de Contas a Pagar, mediante coleta dos dados bancários do cliente.'],\n  ['5.2','Havendo política de risco baseada em score, clientes classificados como de baixo risco poderão ter o reembolso liberado anteriormente à confirmação do retorno físico do produto, correndo a logística reversa em paralelo.'],\n  ['5.3','É vedada a venda, no mesmo pedido, de mais de 10 (dez) unidades do mesmo item, ressalvada exceção fiscal expressamente aprovada, sob risco de caracterização como revenda.'],\n  ['5.4','Nas trocas por item de valor inferior ao original, inexiste, até a presente data, mecanismo automatizado de geração de crédito residual ao cliente pela diferença — tratamento manual permanece necessário até que essa lacuna seja sanada.']]],\n ['Artigo 6 — Compromisso de Prazo e Visibilidade', [\n  ['6.1','Toda ocorrência elegível nos termos deste documento deve ser acompanhada, desde o primeiro dia, por duas trilhas: (i) a trilha logística, relativa à movimentação física do produto, e (ii) a trilha financeira, relativa ao processamento do reembolso ou troca.'],\n  ['6.2','O prazo de autorização no Centro de Distribuição, hoje praticado entre 5 (cinco) e 10 (dez) dias, tem como meta de excelência 1 (um) dia útil.'],\n  ['6.3','A soma dos prazos de ambas as trilhas constitui o prazo total prometido ao cliente, devendo ser comunicado no momento da abertura da ocorrência, e não apenas ao seu final.']]],\n ['Artigo 7 — Disposições Gerais', [\n  ['7.1','Este documento é gerado a partir dos parâmetros vigentes do motor de decisão de reembolso e substitui qualquer versão anterior.'],\n  ['7.2','Alterações nos parâmetros de elegibilidade, prazo ou automação descritos neste documento produzem efeito imediato sobre novas ocorrências, devendo nova versão deste documento ser gerada a cada alteração relevante.']]]\n];\n\n/* ── avaliação de cada regra contra o caso em tela ───────────────────── */\nfunction regras(p, motivoId, repId, modo, r, carrinho, razaoId, devItens){\n  const tobe = modo === 'tobe';\n  const d = deriva(p);\n  const m = motivoId ? acha(MOTIVOS, motivoId) : null;\n  const rz = razaoId ? razao(razaoId) : null;\n  const dif = (carrinho||0) - (valorDevolvido(p, devItens) || p.valor);\n  const R = (art,n,st,v,nota) => ({ art:art, n:n, st:st, v:v, nota:nota });\n  const quem = (naoTobe) => tobe ? 'motor' : naoTobe;\n  const G = [];\n\n  const el = [];\n  el.push((m && m.id==='mudei_ideia') || (rz && rz.cdc)\n    ? R('2.1','Arrependimento em até '+PARAMS.prazoArrependimento+' dias corridos',\n        d.dias<=PARAMS.prazoArrependimento ? 'ok':'no', quem('mão'),\n        'Pedido com '+d.dias+' dias. '+(d.dias<=PARAMS.prazoArrependimento?'Dentro do prazo do CDC.':'Fora do prazo do CDC.'))\n    : R('2.1','Arrependimento em até '+PARAMS.prazoArrependimento+' dias corridos','off','—',\n        m ? 'O motivo declarado não é arrependimento.' : 'Depende do motivo, ainda não declarado.'));\n  el.push((m && m.id==='defeito') || (rz && rz.foto)\n    ? R('2.2','Evidência fotográfica e lote', tobe?'ok':'no', quem('ninguém'),\n        (rz ? 'Motivo declarado: '+rz.l.toLowerCase()+'. ' : '')+\n        (tobe ? 'Foto e lote são exigidos antes de a ocorrência abrir.'\n              : 'A foto é pedida por e-mail depois, quando alguém percebe que falta.'))\n    : R('2.2','Evidência fotográfica e lote','off','—',\n        rz ? 'O motivo declarado não exige evidência.' : 'Depende do motivo declarado.'));\n  el.push(m && m.id==='nao_chegou'\n    ? R('2.3','Extravio: sem prazo e sem reversa','ok',quem('mão'),'Não há item físico a recuperar. Segue direto para o financeiro.')\n    : R('2.3','Extravio: sem prazo e sem reversa','off','—','O motivo declarado não é extravio.'));\n  el.push(m && m.id==='faltou'\n    ? R('2.4','Falta faturada: reposição sem novo frete','ok',quem('mão'),'O item ausente é reposto sem cobrar frete de novo.')\n    : R('2.4','Falta faturada: reposição sem novo frete','off','—','O motivo declarado não é falta de item.'));\n  el.push(p.status==='aguardando_retirada'\n    ? R('2.8','Não retirada: cancelável após 7 dias', d.dias>=7?'ok':'no', quem('mão'),\n        'Pedido aguardando retirada há '+d.dias+' dias.')\n    : R('2.8','Não retirada: cancelável após 7 dias','off','—','O pedido não está aguardando retirada.'));\n  el.push(m && m.id==='trocar'\n    ? (tobe ? R('2.9','Indecisão quanto ao item de troca','ok','motor',\n               'Resolvida no desenho: o cliente monta o pedido novo e o desfecho sai da escolha.')\n            : R('2.9','Indecisão quanto ao item de troca','gap','ninguém',\n               'A própria política diz que não há regra automatizada. Fica na decisão manual do atendimento.'))\n    : R('2.9','Indecisão quanto ao item de troca','off','—','O motivo declarado não é troca.'));\n  el.push(m && m.id==='trocar'\n    ? R('—','Prazo de troca de '+PARAMS.prazoTroca+' dias', d.dias<=PARAMS.prazoTroca?'ok':'no', quem('mão'),\n        'O motor aplica '+PARAMS.prazoTroca+' dias. A política não escreve esse prazo em artigo nenhum.')\n    : R('—','Prazo de troca de '+PARAMS.prazoTroca+' dias','off','—','Só vale para troca.'));\n  G.push(['Elegibilidade', el]);\n\n  const ca = [];\n  const naLoja = p.origem==='loja_sfs' || p.origem==='loja_retirada';\n  ca.push(tobe\n    ? R('3.1','CD e Darkstore entram pelo TroqueCommerce','off','motor',\n        'Deixa de valer: no desenho proposto a entrada é a mesma para qualquer origem, e não existe TroqueCommerce.')\n    : R('3.1','CD e Darkstore entram pelo TroqueCommerce', d.troqueCobre?'ok':'off','mão',\n        d.troqueCobre ? 'Este pedido saiu de '+ORIGENS[p.origem]+', então a plataforma atenderia. O cliente não tinha como saber.'\n                      : 'Não se aplica: este pedido não saiu do CD nem da darkstore.'));\n  ca.push(tobe\n    ? R('3.2','Loja (retirada e SFS) sem cobertura','off','motor','Deixa de existir como regra: a entrada não depende mais da origem.')\n    : R('3.2','Loja (retirada e SFS) sem cobertura', naLoja?'no':'off','ninguém',\n        naLoja ? 'Este pedido saiu de '+ORIGENS[p.origem]+'. Vira e-mail e cai num operador do SAC.'\n               : 'Não se aplica a este pedido.'));\n  ca.push(R('3.3','Balcão não é via de fato', 'off', tobe?'motor':'ninguém',\n        'Nenhum dos pedidos em tela nasceu no balcão. É o quadrante que o discovery não apurou.'));\n  ca.push(p.assinatura\n    ? R('3.4','Box: cancelar interrompe só cobranças futuras','ok',quem('mão'),'Pedidos já processados não são estornados por esse cancelamento.')\n    : R('3.4','Box: cancelar interrompe só cobranças futuras','off','—','Este pedido não é da assinatura.'));\n  ca.push(R('3.5','Marketplace fora deste documento','off','—','Nenhum dos pedidos em tela veio de marketplace.'));\n  G.push(['Entrada por canal', ca]);\n\n  const fi = [];\n  fi.push(p.pag==='adyen_granado'\n    ? R('4.1','Adyen Granado/Phebo automatiza o estorno','ok',quem('mão'),'Estorno em lote na adquirente.')\n    : R('4.1','Adyen Granado/Phebo automatiza o estorno','off','—','Este pedido foi pago por '+PAGS[p.pag].curto+'.'));\n  fi.push(p.pag==='adyen_care'\n    ? R('4.2','Adyen Care não automatiza','no',quem('mão'),'Processamento manual, um a um.')\n    : R('4.2','Adyen Care não automatiza','off','—','Este pedido não passou pela Adyen Care.'));\n  fi.push((p.pag==='pagbrasil'||p.pag==='pagleve')\n    ? R('4.3','PagBrasil e PagLeve sem automação', tobe?'no':'gap', tobe?'motor':'ninguém',\n        tobe ? 'Continua sem automação, mas o motor abre a tarefa e cobra o prazo.'\n             : 'Sem automação e sem dono claro. Um a um, quando alguém lembra.')\n    : R('4.3','PagBrasil e PagLeve sem automação','off','—','Este pedido não usou PagBrasil nem PagLeve.'));\n  fi.push(R('4.4','Estorno parcial em cartão-presente sem dono', repId==='estorno_parcial'?'nv':'off', 'ninguém',\n        'Nenhum responsável designado. Escalonamento imediato, na prática por e-mail.'));\n  fi.push(R('4.5','Financeiro em 24h após a autorização', tobe?'ok':'no', quem('mão'),\n        tobe ? 'A trilha do dinheiro tem prazo próprio e é cobrada.'\n             : 'A planilha entra antes das 24h, e a planilha não tem prazo.'));\n  G.push(['Automação financeira', fi]);\n\n  const es = [];\n  es.push(d.pix90\n    ? R('5.1','PIX com mais de 90 dias vai para Contas a Pagar','ok',quem('mão'),\n        'Pedido com '+d.dias+' dias, pago em PIX. Não volta pela adquirente.')\n    : R('5.1','PIX com mais de 90 dias vai para Contas a Pagar','off','—','Não é PIX com mais de 90 dias.'));\n  es.push(R('5.2','Score libera o reembolso antes do retorno físico','nv','ninguém',\n        'Não validada com a Granado. Critérios sugeridos: ocorrências recentes do cliente e nível no Loyalty.'));\n  es.push(R('5.3','Máximo de 10 unidades do mesmo item', 'off', quem('mão'),\n        'Nada no carrinho em tela passa de 10 unidades.'));\n  es.push(daDireitoADinheiro(motivoId, razaoId)\n    ? R('2.1','Arrependimento dá direito a dinheiro de volta', tobe?'ok':'no', tobe?'motor':'ninguém',\n        tobe ? 'O saldo remanescente volta na forma de pagamento da compra, em vez de ficar preso em crédito. Vale na devolução parcial e na troca por item mais barato.'\n             : 'Hoje o residual não tem cálculo. Vira vale, vira nada, ou vira uma decisão de quem estiver atendendo.')\n    : R('2.1','Arrependimento dá direito a dinheiro de volta','off','—','O motivo declarado não é arrependimento. A sobra fica como crédito.'));\n  es.push(repId==='escolher' && dif < -0.01\n    ? (tobe ? R('5.4','Troca por item de menor valor não gera crédito','ok','motor',\n               'Superada no desenho: sobraram '+brl(-dif)+', e o residual sai como vale-troca ou saldo no Loyalty.')\n            : R('5.4','Troca por item de menor valor não gera crédito','no','ninguém',\n               'Sobraram '+brl(-dif)+'. Não há cálculo automático do residual, então o acerto vira trabalho manual e lento.'))\n    : R('5.4','Troca por item de menor valor não gera crédito','off','—','Não há residual a favor do cliente neste caso.'));\n  G.push(['Regras especiais', es]);\n\n  const pz = [];\n  pz.push(R('6.1','Duas trilhas desde o primeiro dia', tobe?'ok':'no', quem('ninguém'),\n        tobe ? 'Logística e financeiro abrem no mesmo momento.'\n             : 'O dinheiro não anda enquanto a logística não autorizar.'));\n  pz.push(r && r.reversa\n    ? R('6.2','Autorização no CD: 5 a 10 dias, meta 1', tobe?'ok':'no', quem('mão'),\n        tobe ? 'Neste caso a conta usa a meta de '+PARAMS.slaAutorizacaoIdeal+' dia.'\n             : 'Neste caso a conta usa os '+PARAMS.slaAutorizacaoCD+' dias praticados.')\n    : R('6.2','Autorização no CD: 5 a 10 dias, meta 1','off','—','Este caso não tem retorno físico de produto.'));\n  pz.push(R('6.3','Prazo total comunicado na abertura', tobe?'ok':'no', quem('ninguém'),\n        tobe ? (r ? 'Prazo de '+r.sla+' dia'+(r.sla===1?'':'s')+' informado antes de o cliente confirmar.' : 'O prazo aparece junto de cada opção.')\n             : 'Nenhum prazo é informado. O cliente descobre quando cobra, ou quando desiste.'));\n  G.push(['Prazo e visibilidade', pz]);\n\n  const cl = [];\n  cl.push(R('—','Motivo declarado em campo próprio', tobe?'ok':'no', tobe?'motor':'ninguém',\n        (rz ? '\"'+rz.l+'\" ' : 'A razão declarada ')+\n        (tobe ? 'fica guardada como declaração do cliente, separada da conclusão da operação.'\n              : 'não tem campo. Os nove motivos caem no mesmo lugar, que recebe \"desistência do cliente\" no OMS e no SAP.')));\n  cl.push(R('—','Itens da ocorrência identificados', tobe?'ok':'no', tobe?'motor':'ninguém',\n        tobe ? 'O cliente marca o que volta, e a etiqueta sai com o código do pedido.'\n             : 'A caixa chega sem dizer o que vem dentro. Alguém abre e confere item a item.'));\n  cl.push(R('—','Evidência anexada na abertura', (rz && rz.foto) ? (tobe?'ok':'no') : 'off', tobe?'motor':'ninguém',\n        (rz && rz.foto) ? (tobe ? 'Exigida antes de abrir, então a apuração começa com o que precisa.'\n                                : 'Pedida depois, por e-mail, e o caso fica parado até o cliente responder.')\n                        : 'O motivo declarado não exige evidência.'));\n  G.push(['Classificação', cl]);\n\n  return G;\n}\n\nfunction reparacoesDisponiveis(motivoId, modo, p){\n  const tobe = modo==='tobe';\n  return (REPARACOES[motivoId]||[]).map(rp=>{\n    if (rp[0]==='wallet') return [rp[1],'nv', tobe ? 'O Loyalty só movimenta pontos hoje. Possibilidade nova, em estudo.'\n                                                  : 'Não existe. O Loyalty é um site separado e movimenta só pontos.'];\n    if (rp[0]==='escolher') return [rp[1], tobe?'ok':'gap', tobe ? 'O cliente monta o pedido novo e o motor calcula a diferença.'\n                                                                 : 'Não existe no fluxo de troca. A diferença é resolvida por fora, quando é.'];\n    if (rp[0]==='contato') return [rp[1],'ok','Saída para a exceção. O atendente recebe o caso já preenchido.'];\n    return [rp[1], tobe?'ok':'no', tobe ? 'Disparada pela regra, com prazo.' : 'Depende do critério de quem estiver atendendo.'];\n  });\n}\n\nfunction motorRender(d2, p, modo, r, carrinho){\n  const s = d2.state;\n  const tobe = modo === 'tobe';\n  const GL = { ok:'✓', no:'✕', off:'·', nv:'?', gap:'!' };\n  const NM = { ok:'satisfeita', no:'não satisfeita', off:'não se aplica', nv:'não validada', gap:'sem processo' };\n\n  let corpo = '';\n  if (!p){\n    corpo = '<div class=\"mtvazio\">Escolha um pedido no diagrama para o motor avaliar as regras contra um caso real.</div>';\n  } else {\n    const G = regras(p, s.motivo, s.reparacao, modo, r, carrinho, s.razao, s.devItens);\n    let ativas=0, sat=0, semproc=0, naovalid=0;\n    G.forEach(g=>g[1].forEach(x=>{ if(x.st!=='off') ativas++; if(x.st==='ok') sat++; if(x.st==='gap') semproc++; if(x.st==='nv') naovalid++ }));\n    const d = deriva(p);\n\n    corpo =\n      '<div class=\"mtder\"><div class=\"mtdt\">Derivado do pedido</div>'+\n      [['Origem',esc(d.origem)],['Adquirente',esc(PAGS[p.pag].curto)],\n       ['Estorno automático',d.automatiza?'sim':'não'],['Dias desde a compra',String(d.dias)],\n       ['Status',esc(d.status.replace(/_/g,' '))],['Valor',brl(p.valor)]].map(x=>\n        '<span><i>'+x[0]+'</i><b>'+x[1]+'</b></span>').join('')+'</div>'+\n      '<div class=\"mtres\">'+\n       '<span class=\"ok\"><b>'+sat+'</b> satisfeitas</span>'+\n       '<span><b>'+ativas+'</b> ativas neste caso</span>'+\n       '<span class=\"gap\"><b>'+semproc+'</b> sem processo</span>'+\n       '<span class=\"nv\"><b>'+naovalid+'</b> não validadas</span>'+\n      '</div>'+\n      G.map(g=>'<div class=\"mtgr\"><div class=\"mtgt\">'+g[0]+'</div>'+\n        g[1].map(x=>'<button class=\"rl '+x.st+'\" data-art=\"'+x.art+'\">'+\n          '<i class=\"rst\" title=\"'+NM[x.st]+'\">'+GL[x.st]+'</i>'+\n          '<span class=\"rn\">'+esc(x.n)+'</span>'+\n          '<span class=\"rart\">'+(x.art==='—'?'sem artigo':'§ '+x.art)+'</span>'+\n          '<span class=\"rv v'+(x.v==='motor'?'m':(x.v==='mão'?'h':(x.v==='ninguém'?'n':'o')))+'\">'+x.v+'</span>'+\n          '<span class=\"rnota\">'+esc(x.nota)+'</span></button>').join('')+\n        '</div>').join('')+\n      (s.motivo\n        ? '<div class=\"mtgr\"><div class=\"mtgt\">Reparações disponíveis</div>'+\n          reparacoesDisponiveis(s.motivo, modo, p).map(x=>\n            '<div class=\"rl '+x[1]+' semart\"><i class=\"rst\">'+GL[x[1]]+'</i>'+\n            '<span class=\"rn\">'+esc(x[0])+'</span><span class=\"rnota\">'+esc(x[2])+'</span></div>').join('')+\n          '</div>'\n        : '')+\n      (r\n        ? '<div class=\"mtgr\"><div class=\"mtgt\">Decisão</div>'+\n          '<div class=\"mtdec\"><div class=\"mtdl\">declarado</div><div class=\"mtdv\">'+esc(acha(MOTIVOS,s.motivo).label)+\n          (s.razao?'<em>'+esc(razao(s.razao).l)+'</em>':'')+'</div>'+\n          '<div class=\"mtseta\">torna-se</div>'+\n          '<div class=\"mtdl\">concluído</div><div class=\"mtdv forte\">'+esc(r.ap.conclusao)+'</div></div>'+\n          '<div class=\"mtdesc\">'+esc(r.ap.texto)+'</div>'+\n          '<div class=\"mtsla\">'+\n            '<span><i>retorno físico</i><b>'+(r.reversa?'sim':'não')+'</b></span>'+\n            '<span><i>prazo total</i><b>'+(r.fecha?'na hora':r.sla+' dia'+(r.sla===1?'':'s'))+'</b></span>'+\n            '<span><i>trilhas abertas</i><b>'+(r.produto.length+r.dinheiro.length)+'</b></span>'+\n          '</div></div>'\n        : '');\n  }\n\n  return '<div class=\"mtw\"><header class=\"mth\">'+\n    '<div class=\"mtt\">Motor de pós-venda<span>regras · política</span></div>'+\n    '<div class=\"mtctx\">'+(p ? esc(p.ref)+' · '+esc(ORIGENS[p.origem])+' · '+brl(p.valor) : 'nenhum pedido selecionado')+'</div>'+\n    '<div class=\"tg mttg\"><button data-m=\"asis\"'+(tobe?'':' data-on')+'>AS-IS</button>'+\n    '<button data-m=\"tobe\"'+(tobe?' data-on':'')+'>TO-BE</button></div>'+\n    '<button class=\"mtclose\">Voltar ao diagrama ✕</button></header>'+\n    '<div class=\"mtb\">'+\n      '<section class=\"mtl\">'+\n        '<div class=\"mtleg\">'+[['ok','satisfeita'],['no','não satisfeita'],['off','não se aplica'],['gap','sem processo'],['nv','não validada']]\n          .map(l=>'<span class=\"'+l[0]+'\"><i>'+GL[l[0]]+'</i>'+l[1]+'</span>').join('')+\n          '<em>clique numa regra para achar o trecho da política</em></div>'+\n        corpo+'</section>'+\n      '<aside class=\"mtr\"><div class=\"mpt\">Política de Reembolso, Troca e Devolução</div>'+\n        '<div class=\"mps\">Documento operacional, gerado a partir dos parâmetros vigentes do motor.</div>'+\n        (tobe ? '' : '<div class=\"mpav\">No AS-IS este documento não existe. As regras abaixo são a leitura que o discovery montou a partir do que cada área pratica.</div>')+\n        POLITICA.map(a=>'<div class=\"mpa\"><h4>'+a[0]+'</h4>'+\n          a[1].map(it=>'<p class=\"pol\" data-pol=\"'+it[0]+'\"><b class=\"pn\">'+it[0]+'</b>'+it[1]+'</p>').join('')+\n          '</div>').join('')+\n      '</aside></div></div>';\n}\n\nexport default {\n  css: `\n@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,600;9..144,700&family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap');\n:host{display:block;position:relative;width:100%;height:100%}\n*{box-sizing:border-box;margin:0;padding:0}\n.app{position:absolute;inset:0;display:grid;grid-template-rows:auto 1fr;background:#eae5da;\n  color:#1b211c;font-family:'IBM Plex Sans',system-ui,sans-serif;overflow:hidden}\nh1{font-family:'Fraunces',Georgia,serif;font-weight:600}\nheader{padding:13px 24px;background:#f7f4ec;border-bottom:1px solid #ddd6c8;display:flex;align-items:center;gap:16px;flex-wrap:wrap}\nheader h1{font-size:17px;color:#1e4d38}\nheader .s{font-size:11px;color:#7d867c}\n.tg{margin-left:auto;display:flex;border:1px solid #c9c0ad;border-radius:3px;overflow:hidden}\n.tg button{appearance:none;border:0;background:#fff;cursor:pointer;padding:7px 18px;\n  font:700 11px 'IBM Plex Mono',monospace;letter-spacing:.09em;color:#8b9187}\n.tg button+button{border-left:1px solid #c9c0ad}\n.tg button[data-on][data-m=\"asis\"]{background:#9c3b3b;color:#fff}\n.tg button[data-on][data-m=\"tobe\"]{background:#1e4d38;color:#fff}\n.reset{appearance:none;border:1px solid #ddd6c8;background:#fff;cursor:pointer;padding:6px 11px;\n  border-radius:3px;font:600 10.5px 'IBM Plex Sans';color:#6d766f}\n.reset:hover{border-color:#1e4d38;color:#1e4d38}\n\n.cols{display:grid;grid-template-columns:320px minmax(300px,1fr) minmax(330px,1.15fr);overflow:hidden}\n.col{display:flex;flex-direction:column;overflow:hidden;border-right:1px solid #ddd6c8}\n.col:last-child{border-right:0}\n.ch{padding:8px 18px;background:#e2dccd;border-bottom:1px solid #d3cbb9;\n  font:600 9.5px 'IBM Plex Mono',monospace;letter-spacing:.1em;text-transform:uppercase;color:#6b7369}\n.cb{flex:1;overflow-y:auto;padding:14px 18px}\n.split{display:grid;grid-template-rows:1fr 1fr;overflow:hidden}\n.split > div{display:flex;flex-direction:column;overflow:hidden;border-bottom:1px solid #ddd6c8}\n.split > div:last-child{border-bottom:0}\n\n.mold{border-left:3px solid;padding:10px 12px;margin-bottom:14px;border-radius:0 2px 2px 0}\n.mold.asis{background:#f7e9e6;border-color:#9c3b3b}\n.mold.tobe{background:#e6f0e9;border-color:#1e4d38}\n.mold .mt{font-family:'Fraunces',Georgia,serif;font-size:13px;font-weight:600;margin-bottom:7px}\n.mold.asis .mt{color:#7d2b2b} .mold.tobe .mt{color:#1e4d38}\n.mold li{font-size:11.5px;line-height:1.55;margin-left:14px;margin-bottom:5px;color:#4a524a}\n.mold li:last-child{margin-bottom:0}\n\n.steps{display:flex;gap:4px;margin-bottom:12px}\n.steps span{flex:1;height:3px;background:#d3cbb9;border-radius:2px}\n.steps span.on{background:#1e4d38}\n.lbl{font:600 9.5px 'IBM Plex Mono',monospace;letter-spacing:.08em;text-transform:uppercase;color:#8b9187;margin-bottom:8px}\n.cans{display:flex;gap:5px;margin-bottom:12px;flex-wrap:wrap}\n.cans span{font:600 9.5px 'IBM Plex Mono';padding:4px 8px;border-radius:2px;background:#dcebe5;color:#1e4d38}\n.cans span.off{background:#ece8dd;color:#9aa096}\n\n.ped{background:#fbf9f4;border:1px solid #ddd6c8;padding:9px 11px;margin-bottom:6px;cursor:pointer;border-radius:2px}\n.ped:hover{border-color:#1e4d38}\n.ped[data-on]{border-color:#1e4d38;border-left-width:3px;background:#fff}\n.ped .r{font:600 11px 'IBM Plex Mono',monospace;color:#1e4d38}\n.ped .m{font-size:10.5px;color:#7d867c;margin-top:2px}\n.ped .v{font:600 11.5px 'IBM Plex Mono',monospace;margin-top:3px}\n\n.opt{background:#fbf9f4;border:1px solid #ddd6c8;padding:9px 11px;margin-bottom:6px;border-radius:2px;cursor:pointer}\n.opt:hover{border-color:#1e4d38}\n.opt[data-on]{border-color:#1e4d38;border-left-width:3px;background:#fff}\n.opt.no{cursor:not-allowed;opacity:.6;background:#f2ece1;border-style:dashed}\n.opt .t{font-size:12px;font-weight:600;line-height:1.35}\n.opt .why{font-size:10.5px;color:#9c3b3b;margin-top:4px;line-height:1.5}\n.opt .ok{font:600 9.5px 'IBM Plex Mono';color:#1e4d38;margin-top:4px}\n.opt .ask{font:600 9.5px 'IBM Plex Mono';color:#8a6714;margin-top:4px}\n.opt .livre{font:600 9.5px 'IBM Plex Mono';color:#9c3b3b;margin-top:4px}\n.naoaplica{font-size:10.5px;color:#9aa096;margin-top:9px;font-style:italic}\n.aberto{background:#fff;border:1px dashed #c9a5a5;border-radius:2px;padding:10px 12px;\n  font-size:12px;line-height:1.6;color:#4a524a;min-height:84px;margin-bottom:8px}\n.cur{display:inline-block;width:1px;height:13px;background:#9c3b3b;margin-left:2px;\n  vertical-align:-2px;animation:bl 1.1s steps(2) infinite}\n@keyframes bl{0%,50%{opacity:1}51%,100%{opacity:0}}\n.nota.asisn{background:#f7e9e6;border-color:#e0b8b8;color:#7d2b2b}\n.hip{border:1px dashed #c9b48a;background:#fdf8ee;border-radius:2px;padding:10px 12px;margin-top:10px;\n  font-size:11px;line-height:1.55;color:#6d5a33}\n.hip b{font:600 9.5px 'IBM Plex Mono',monospace;letter-spacing:.07em;text-transform:uppercase;color:#8a6714}\n.crit{margin:7px 0;padding:7px 9px;background:#fff;border:1px solid #ecdfc4;border-radius:2px}\n.crit span{display:block;font:600 8.5px 'IBM Plex Mono',monospace;letter-spacing:.08em;\n  text-transform:uppercase;color:#a08a4f;margin-bottom:4px}\n.crit li{margin-left:15px;margin-bottom:3px;line-height:1.5}\n.crit em{color:#9aa096;font-style:normal}\n.up{display:inline-block;margin-left:7px;font:700 8.5px 'IBM Plex Mono',monospace;letter-spacing:.1em;\n  background:#1e4d38;color:#eef5f0;padding:2px 6px;border-radius:2px;vertical-align:1px}\n.hint{font-size:10.5px;color:#8b9187;margin-top:4px;line-height:1.5}\n.pick{margin-top:10px;border:1px solid #ddd6c8;background:#fbf9f4;border-radius:2px;overflow:hidden}\n.pkh{display:flex;justify-content:space-between;align-items:baseline;padding:8px 10px;background:#f2ede1;\n  border-bottom:1px solid #e4ddcd;font-size:10px;color:#8b9187}\n.pkh b{font:600 12px 'IBM Plex Mono',monospace;color:#1e4d38}\n.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:5px;padding:8px}\n.prod{cursor:pointer;border:1px solid #e4ddcd;border-radius:2px;overflow:hidden;background:#fff}\n.prod.on{border-color:#1e4d38}\n.prod .sw{height:34px;position:relative;display:flex;align-items:center;justify-content:center}\n.prod .qt{font:700 13px 'IBM Plex Mono';color:#1b211c}\n.prod .xadd,.prod .rm{position:absolute;right:3px;top:3px;width:17px;height:17px;border:0;border-radius:2px;\n  background:rgba(27,33,28,.14);color:#1b211c;font:700 12px sans-serif;cursor:pointer;line-height:1}\n.prod .pn{font-size:9.5px;padding:5px 6px 0;line-height:1.3}\n.prod .pp{font:600 10px 'IBM Plex Mono';padding:2px 6px 6px;color:#6d766f}\n.tot{display:flex;justify-content:space-between;align-items:center;padding:8px 10px;border-top:1px solid #e4ddcd}\n.tot .l span{font-size:9.5px;color:#8b9187;display:block}\n.tot .l b{font:600 13px 'IBM Plex Mono'}\n.tot .d{font:600 10px 'IBM Plex Mono'}\n.tot.par .d{color:#8b9187} .tot.mais .d{color:#1e4d38} .tot.menos .d{color:#a87f1f}\n.ck{display:flex;justify-content:space-between;align-items:center;gap:10px;background:#1e4d38;color:#eef5f0;\n  padding:11px 13px;border-radius:3px;margin-bottom:11px}\n.ck span{display:block;font-size:9.5px;opacity:.7}\n.ck b{font:600 16px 'IBM Plex Mono'}\n.ckb{appearance:none;border:0;background:#eef5f0;color:#1e4d38;cursor:pointer;padding:8px 12px;\n  border-radius:2px;font:600 11px 'IBM Plex Sans'}\n.expbtn{appearance:none;width:100%;border:0;cursor:pointer;background:#1e4d38;color:#eef5f0;\n  padding:11px 12px;border-radius:3px;margin-bottom:13px;font:600 11.5px 'IBM Plex Sans';\n  display:flex;align-items:center;justify-content:center;gap:7px}\n.expbtn:hover{background:#163a2a}\n.expbtn span{font:600 9px 'IBM Plex Mono';letter-spacing:.09em;opacity:.7}\n.opt.sec{background:#f2ede1;border-style:dashed;margin-top:10px}\n.sync{font-size:10.5px;line-height:1.5;padding:9px 11px;border-radius:2px;margin-bottom:11px}\n.sync.on{background:#e6f0e9;border-left:3px solid #1e4d38;color:#2c4a3a}\n.sync.off{background:#f7e9e6;border-left:3px solid #9c3b3b;color:#7d2b2b}\n.xwrap{position:absolute;inset:0;z-index:40;background:#f7f4ec;display:grid;\n  grid-template-rows:auto 1fr auto;overflow:hidden}\n.xhd{display:flex;align-items:center;gap:22px;padding:15px 34px;background:#1e4d38;color:#dfeae3}\n.xbr{font-family:'Fraunces',Georgia,serif;font-size:15px;font-weight:700;letter-spacing:.14em}\n.xbr span{font:400 10px 'IBM Plex Sans';letter-spacing:.09em;opacity:.7;margin-left:7px;text-transform:uppercase}\n.xstep{display:flex;gap:16px;margin-left:8px}\n.xstep span{font:600 9.5px 'IBM Plex Mono';letter-spacing:.09em;text-transform:uppercase;opacity:.33}\n.xstep span.on{opacity:1}\n.xclose{margin-left:auto;appearance:none;border:1px solid rgba(223,234,227,.3);background:none;\n  color:#dfeae3;cursor:pointer;padding:6px 12px;border-radius:3px;font:500 10.5px 'IBM Plex Sans'}\n.xclose:hover{background:rgba(223,234,227,.12)}\n.xmain{overflow-y:auto;padding:38px 34px 46px}\n.xmain > *{max-width:720px;margin-left:auto;margin-right:auto}\n.xh{font-family:'Fraunces',Georgia,serif;font-size:27px;font-weight:600;line-height:1.2;color:#1b211c;letter-spacing:-.015em}\n.xs{font-size:14px;line-height:1.65;color:#65706a;margin-top:9px;max-width:56ch}\n.xpeds,.xopts{display:flex;flex-direction:column;gap:9px;margin-top:24px}\n.xped{appearance:none;text-align:left;cursor:pointer;background:#fff;border:1px solid #e2dbcb;\n  border-radius:4px;padding:15px 18px;display:flex;align-items:center;gap:16px;font-family:inherit}\n.xped:hover{border-color:#1e4d38;box-shadow:0 1px 0 #1e4d38}\n.xpl{flex:1}\n.xpr{font:600 11px 'IBM Plex Mono';color:#1e4d38}\n.xpi{font-size:13.5px;color:#1b211c;margin-top:3px;line-height:1.4}\n.xpd{font-size:11.5px;color:#939a91;margin-top:3px}\n.xpv{font:600 15px 'IBM Plex Mono';color:#1b211c}\n.xopt{appearance:none;text-align:left;cursor:pointer;background:#fff;border:1px solid #e2dbcb;border-radius:4px;\n  padding:15px 18px;display:flex;flex-direction:column;position:relative;font-family:inherit;width:100%}\n.xopt:hover{border-color:#1e4d38;box-shadow:0 1px 0 #1e4d38}\n.xopt.sel{border-color:#1e4d38;border-left-width:4px}\n.xopt.off{background:#f1ece1;border-style:dashed;cursor:not-allowed}\n.xopt.sec{background:transparent;border-style:dashed;border-color:#cdd4c8;margin-top:12px}\n.xopt.sec .xot{font-size:14px;font-weight:500;color:#5d665e}\n.xot{font-size:15px;font-weight:600;color:#1b211c;line-height:1.3}\n.xot .xup{margin-left:9px;font:700 8.5px 'IBM Plex Mono';letter-spacing:.11em;background:#1e4d38;\n  color:#eef5f0;padding:3px 7px;border-radius:2px;vertical-align:2px}\n.xod{font-size:12.5px;color:#7d867c;margin-top:5px;line-height:1.5}\n.xow{font-size:12.5px;color:#9c3b3b;margin-top:5px;line-height:1.5}\n.xar{position:absolute;right:17px;top:50%;transform:translateY(-50%);color:#c3cabe;font-size:16px}\n.xstore{margin-top:30px}\n.xsh{display:flex;justify-content:space-between;align-items:baseline;padding-bottom:10px;border-bottom:1px solid #e2dbcb}\n.xsh h3{font-family:'Fraunces',Georgia,serif;font-size:17px;font-weight:600}\n.xsv{font-size:12.5px;color:#7d867c}\n.xsv b{color:#1e4d38;font:600 13px 'IBM Plex Mono'}\n.xgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:12px;margin-top:16px}\n.xprod{cursor:pointer;background:#fff;border:1px solid #e2dbcb;border-radius:4px;overflow:hidden}\n.xprod:hover{border-color:#b9c2b4}\n.xprod.on{border-color:#1e4d38;box-shadow:0 1px 0 #1e4d38}\n.xsw{height:84px;position:relative;display:flex;align-items:center;justify-content:center}\n.xqt{font-family:'Fraunces',Georgia,serif;font-size:26px;font-weight:700;color:rgba(27,33,28,.62)}\n.xadd{position:absolute;right:7px;top:7px;width:22px;height:22px;border:0;border-radius:3px;\n  background:rgba(255,255,255,.62);color:#1b211c;font:400 15px sans-serif;line-height:20px;text-align:center}\n.xprod .rm{position:absolute;right:7px;top:7px;width:22px;height:22px;border:0;border-radius:3px;\n  background:rgba(27,33,28,.16);color:#1b211c;font:700 14px sans-serif;cursor:pointer;line-height:1}\n.xpnm{font-size:12px;padding:9px 10px 0;line-height:1.35;color:#1b211c}\n.xppr{font:600 12px 'IBM Plex Mono';padding:4px 10px 11px;color:#65706a}\n.xbar{display:flex;align-items:center;gap:20px;padding:14px 34px;background:#fff;border-top:1px solid #e2dbcb}\n.xbl{display:flex;align-items:baseline;gap:9px}\n.xbl span{font-size:10.5px;color:#939a91}\n.xbl b{font:600 19px 'IBM Plex Mono';color:#1b211c}\n.xbl em{font:600 11px 'IBM Plex Mono';font-style:normal;color:#8a6714}\n.xgo{margin-left:auto;appearance:none;border:0;background:#1e4d38;color:#eef5f0;cursor:pointer;\n  padding:12px 30px;border-radius:3px;font:600 13px 'IBM Plex Sans'}\n.xgo[disabled]{background:#c4c9c0;cursor:not-allowed}\n.xdone{text-align:center;padding:26px 0 8px}\n.xck{width:48px;height:48px;border-radius:50%;background:#1e4d38;color:#eef5f0;font-size:23px;\n  display:flex;align-items:center;justify-content:center;margin:0 auto 18px}\n.xdone .xs{margin-left:auto;margin-right:auto}\n.xcod{font:600 13px 'IBM Plex Mono';color:#1e4d38;letter-spacing:.09em;margin-top:9px}\n.xsync{margin:22px auto 0;max-width:520px;text-align:center;font-size:12.5px;line-height:1.6;\n  color:#65706a;background:#eef2ec;border:1px solid #dbe3d9;border-radius:4px;padding:12px 16px}\n.xpay{display:flex;align-items:center;gap:18px;background:#1e4d38;color:#eef5f0;padding:17px 22px;\n  border-radius:4px;margin-top:26px}\n.xpay span{display:block;font-size:11px;opacity:.72}\n.xpay b{font:600 22px 'IBM Plex Mono'}\n.xpay .ckb{margin-left:auto;padding:11px 20px;font-size:12.5px}\n.xtl{margin-top:28px;border-top:1px solid #e2dbcb;padding-top:20px}\n.xtli{display:flex;gap:13px;padding:9px 0}\n.xtli span{width:21px;height:21px;border-radius:50%;background:#e6ede8;color:#1e4d38;flex:0 0 21px;\n  font:600 10.5px 'IBM Plex Mono';display:flex;align-items:center;justify-content:center}\n.xtli p{font-size:13.5px;line-height:1.55;color:#414b43}\n.xrest{display:block;margin:30px auto 0;color:#939a91}\n\n.btn{appearance:none;border:0;background:#1e4d38;color:#f7f4ec;cursor:pointer;width:100%;\n  padding:10px;border-radius:3px;font:600 12px 'IBM Plex Sans';margin-top:11px}\n.btn.asis{background:#9c3b3b}\n.back{appearance:none;border:0;background:none;cursor:pointer;color:#7d867c;font:500 11px 'IBM Plex Sans';padding:7px 0}\n.back:hover{color:#1e4d38}\n\n.prot{padding:13px 15px;border-radius:3px;margin-bottom:11px}\n.prot.tobe{background:#1e4d38;color:#eef5f0}\n.prot.asis{background:#7d2b2b;color:#f7eceb}\n.prot .n{font:600 9.5px 'IBM Plex Mono';letter-spacing:.1em;text-transform:uppercase;opacity:.65}\n.prot .c{font:600 16px 'IBM Plex Mono';margin-top:3px}\n.prot .sla{font-size:11.5px;margin-top:7px;opacity:.92;line-height:1.5}\n.cpassos{background:#fbf9f4;border:1px solid #ddd6c8;padding:11px 13px;border-radius:2px}\n.cpassos li{font-size:11.5px;line-height:1.6;margin-left:14px;margin-bottom:5px;color:#3d463e}\n\n.der{background:#fbf9f4;border:1px solid #ddd6c8;border-radius:2px;padding:10px 12px;margin-bottom:12px}\n.der .row{display:flex;justify-content:space-between;gap:10px;padding:3px 0;font-size:11px;border-bottom:1px solid #f0ebe0}\n.der .row:last-child{border-bottom:0}\n.der .k{color:#8b9187}\n.der .v{font-weight:600;text-align:right}\n.der .v.bad{color:#9c3b3b} .der .v.good{color:#1e4d38}\n\n.verb{display:flex;gap:9px;padding:7px 0;border-bottom:1px solid #e6e0d3;opacity:.38;transition:opacity .25s}\n.verb:last-child{border-bottom:0}\n.verb.on{opacity:1}\n.verb i{width:8px;height:8px;border-radius:50%;background:#c4c9c0;margin-top:4px;flex:0 0 8px}\n.verb.on i{background:#1e4d38}\n.verb .n{font-size:11.5px;font-weight:600}\n.verb .d{font-size:10.5px;color:#7d867c;margin-top:2px;line-height:1.45}\n\n.apbox{border-left:3px solid;padding:10px 12px;margin:11px 0;border-radius:0 2px 2px 0}\n.apbox.tobe{background:#f6ead0;border-color:#a87f1f}\n.apbox.asis{background:#f7e9e6;border-color:#9c3b3b}\n.apbox .f{font:600 9.5px 'IBM Plex Mono';letter-spacing:.07em;text-transform:uppercase;color:#8a6714}\n.apbox.asis .f{color:#9c3b3b}\n.apbox .t{font-size:11.5px;line-height:1.55;margin-top:5px;color:#54471f}\n.apbox.asis .t{color:#6d2626}\n.tax{display:flex;align-items:center;gap:8px;margin-top:9px;flex-wrap:wrap}\n.tax .d1{background:#e6e0d3;padding:4px 8px;border-radius:2px;font-size:10.5px}\n.tax .ar{color:#a9ae9f;font-size:10.5px}\n.tax .d2{padding:4px 8px;border-radius:2px;font-size:10.5px;font-weight:600;background:#1e4d38;color:#eef5f0}\n.tax .d2.asis{background:#9c3b3b;color:#fff}\n\n.p{display:flex;gap:9px;padding:8px 0;border-bottom:1px solid #eae4d7}\n.p:last-child{border-bottom:0}\n.p i{width:7px;height:7px;border-radius:50%;margin-top:5px;flex:0 0 7px;background:#c4c9c0}\n.p.auto i{background:#1e4d38} .p.manual i{background:#a63a2b}\n.p.gap i{background:#9c3b3b;box-shadow:0 0 0 3px #f3dcdc} .p.skip i{background:#d3cbb9}\n.pt{font-size:11.5px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n.pd{font-size:10.5px;color:#767f75;margin-top:3px;line-height:1.5}\n.chip{font:600 8.5px 'IBM Plex Mono';letter-spacing:.06em;text-transform:uppercase;padding:2px 5px;border-radius:2px}\n.chip.auto{background:#dcebe5;color:#1e4d38} .chip.manual{background:#f3dcdc;color:#9c3b3b}\n.chip.gap{background:#9c3b3b;color:#fff} .chip.skip{background:#e6e0d3;color:#8b9187}\n.sla{font:600 9.5px 'IBM Plex Mono';color:#a63a2b}\n.vazio{color:#9aa096;font-size:11px;line-height:1.6;font-style:italic;padding:5px 0}\n.grh{margin:22px 0 10px}\n.grt{font-family:'Fraunces',Georgia,serif;font-size:15.5px;font-weight:600;color:#1b211c}\n.grd{font-size:11.5px;line-height:1.5;color:#767f75;margin-top:2px}\n.grl{font:600 9px 'IBM Plex Mono';letter-spacing:.14em;text-transform:uppercase;color:#6b7369;\n  margin:12px 0 6px;padding-bottom:4px;border-bottom:1px solid #e6e0d3}\n\n/* ── etiqueta dos Correios ──────────────────────────────────── */\n.etq{border:1px solid #cfc9b8;border-radius:4px;background:#fff;overflow:hidden;max-width:560px}\n.etqh{display:flex;align-items:baseline;gap:12px;padding:10px 14px;background:#1b211c;color:#eae5da;flex-wrap:wrap}\n.etql{font:700 12px 'IBM Plex Sans';letter-spacing:.14em;text-transform:uppercase}\n.etql b{opacity:.5;font-weight:400}\n.etqa{margin-left:auto;font:400 9.5px 'IBM Plex Mono';opacity:.7}\n.etqb{display:grid;grid-template-columns:1fr 1fr;border-bottom:1px dashed #d8d2c1}\n.etqc{padding:11px 14px}\n.etqc+.etqc{border-left:1px dashed #d8d2c1}\n.etqt{font:700 8px 'IBM Plex Mono';letter-spacing:.16em;text-transform:uppercase;color:#8b9187;margin-bottom:5px}\n.etqn{font-size:12px;font-weight:600;color:#1b211c;line-height:1.35}\n.etqe{font-size:11px;color:#65706a;line-height:1.45}\n.etqbar{padding:13px 14px 9px;border-bottom:1px dashed #d8d2c1}\n.bars{display:flex;align-items:flex-end;gap:1px;height:42px}\n.bars i{display:block;height:100%;background:#1b211c}\n.etqcod{font:600 13px 'IBM Plex Mono';letter-spacing:.14em;color:#1b211c;margin-top:7px;text-align:center}\n.etqid{padding:11px 14px;background:#fdf3d8;border-left:3px solid #a08a4f}\n.etqid1{font-size:12.5px;color:#1b211c}\n.etqid1 b{font-family:'IBM Plex Mono';font-weight:600}\n.etqid1 span{color:#a08a4f;margin:0 4px}\n.etqid2{font-size:11px;color:#6b551a;line-height:1.5;margin-top:3px}\n.etqav{padding:10px 14px;background:#f7e9e6;font-size:11px;line-height:1.55;color:#7d2b2b;border-top:1px solid #eadfd0}\n.etqav b{font-weight:600}\n.etqbt{display:flex;align-items:center;gap:9px;padding:11px 14px;flex-wrap:wrap;border-top:1px solid #eadfd0}\n.etqp,.etqs{appearance:none;cursor:pointer;border:0;border-radius:3px;padding:8px 14px;font:600 11.5px 'IBM Plex Sans'}\n.etqp{background:#1b4a35;color:#fff}\n.etqs{background:#eceae2;color:#1b211c}\n.etqbt span{font-size:10.5px;color:#8b9187}\n\n/* ── trilha de próximos passos ──────────────────────────────── */\n.trl{margin-top:4px}\n.trli{display:grid;grid-template-columns:22px 1fr;gap:11px;padding-bottom:15px;position:relative}\n.trli:last-child{padding-bottom:0}\n.trlm{position:relative;display:flex;justify-content:center;padding-top:3px}\n.trlm i{width:11px;height:11px;border-radius:50%;background:#fff;border:2px solid #ccc7b7;z-index:1}\n.trli:not(:last-child) .trlm::after{content:'';position:absolute;top:14px;bottom:-15px;width:2px;background:#e3ddcd}\n.trli.feito .trlm i{background:#2f6e5b;border-color:#2f6e5b}\n.trli.agora .trlm i{background:#a08a4f;border-color:#a08a4f;box-shadow:0 0 0 4px rgba(160,138,79,.18)}\n.trlh{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}\n.trlq{font:700 8px 'IBM Plex Mono';letter-spacing:.12em;text-transform:uppercase;padding:2px 6px;border-radius:2px;\n  background:#eceae2;color:#65706a}\n.trli.voce .trlq{background:#1b4a35;color:#fff}\n.trld{font:600 10px 'IBM Plex Mono';color:#8b9187}\n.trli.agora .trld{color:#a08a4f}\n.trlt{font-size:12.5px;font-weight:600;color:#1b211c;line-height:1.4;margin-top:3px}\n.trli.depois .trlt{font-weight:500;color:#4b544c}\n.trln{font-size:11px;line-height:1.5;color:#767f75;margin-top:2px}\n.trl.cp .trli{padding-bottom:10px;grid-template-columns:16px 1fr;gap:8px}\n.trl.cp .trli:not(:last-child) .trlm::after{bottom:-10px}\n.trl.cp .trlm i{width:9px;height:9px}\n.trl.cp .trlt{font-size:11px;margin-top:2px}\n.trl.cp .trlq{font-size:7px;padding:1px 4px}\n@media(max-width:620px){.etqb{grid-template-columns:1fr}.etqc+.etqc{border-left:0;border-top:1px dashed #d8d2c1}}\n\n/* ── itens que voltam + motivo declarado ──────────────────────────── */\n.bloco{border-top:1px solid #e2e2dc;margin-top:22px;padding-top:20px}\n.blt,.blt2{font-family:'Fraunces',Georgia,serif;font-size:15.5px;font-weight:600;color:#1b211c;margin-bottom:11px}\n.blt2{margin-top:24px}\n.itg{display:grid;grid-template-columns:repeat(auto-fill,minmax(258px,1fr));gap:9px}\n.itg.cp{grid-template-columns:1fr;gap:6px}\n.itl{display:flex;align-items:center;gap:11px;cursor:pointer;background:#fff;border:1px solid #e2dbcb;\n  border-radius:4px;padding:8px 11px 8px 8px}\n.itl:hover{border-color:#b9c2b4}\n.itl.on{border-color:#1b4a35;background:#f3f7f4}\n.itim{width:46px;height:46px;flex:0 0 46px;background:#f6f6f4;border-radius:3px;overflow:hidden}\n.itim img{width:100%;height:100%;object-fit:contain;display:block;mix-blend-mode:multiply}\n.itd{flex:1;min-width:0}\n.itn{font-size:12px;line-height:1.35;color:#1b211c}\n.itp{font:600 11px 'IBM Plex Mono';color:#65706a;margin-top:2px}\n.itk{width:19px;height:19px;flex:0 0 19px;border:1.5px solid #ccc7b7;border-radius:50%;\n  display:flex;align-items:center;justify-content:center;font:700 11px sans-serif;color:#fff}\n.itl.on .itk{background:#1b4a35;border-color:#1b4a35}\n.itg.cp .itl{padding:6px 9px}\n.itg.cp .itn{font-size:11px}\n.rzg{display:grid;grid-template-columns:repeat(auto-fill,minmax(258px,1fr));gap:8px}\n.rz{appearance:none;text-align:left;cursor:pointer;background:#fff;border:1px solid #e2dbcb;border-radius:4px;\n  padding:10px 12px;font-family:'IBM Plex Sans',sans-serif}\n.rz:hover{border-color:#b9c2b4}\n.rz.on{border-color:#1b4a35;background:#f3f7f4;box-shadow:inset 2px 0 0 #1b4a35}\n.rz.sec{border-style:dashed}\n.rzt{font-size:12.5px;font-weight:600;color:#1b211c;display:flex;align-items:center;gap:7px;flex-wrap:wrap}\n.rztag{font:700 8px 'IBM Plex Mono';letter-spacing:.09em;text-transform:uppercase;background:#eef2ec;color:#1e4d38;\n  padding:2px 5px;border-radius:2px}\n.rztag.foto{background:#f6e7cd;color:#8a6a18}\n.rzd{font-size:11px;line-height:1.45;color:#767f75;margin-top:3px}\n.rzav{background:#f6e7cd;border-left:3px solid #a08a4f;border-radius:0 3px 3px 0;padding:10px 12px;\n  font-size:11.5px;line-height:1.55;color:#6b551a;margin-top:12px}\n.mtdv em{display:block;font:400 10.5px 'IBM Plex Sans';font-style:normal;color:#65706a;margin-top:2px}\n.mtdv.forte em{color:#c3d6cb}\n\n/* ── o motor por dentro: regras × política ────────────────────────── */\n.motbtn{appearance:none;width:100%;border:0;cursor:pointer;background:#2a3b31;color:#eef5f0;\n  padding:9px 12px;border-radius:3px;margin-bottom:12px;font:600 11px 'IBM Plex Sans';\n  display:flex;align-items:center;justify-content:center;gap:7px}\n.motbtn:hover{background:#1e2c24}\n.motbtn.asis{background:#7d2b2b}.motbtn.asis:hover{background:#661f1f}\n.motbtn span{font:600 8.5px 'IBM Plex Mono';letter-spacing:.09em;opacity:.72}\n\n.mtw{position:absolute;inset:0;z-index:45;background:#f4f1e8;display:grid;grid-template-rows:auto 1fr;overflow:hidden}\n.mth{display:flex;align-items:center;gap:20px;padding:13px 26px;background:#1b211c;color:#dfe5e0;flex-wrap:wrap}\n.mtt{font-family:'Fraunces',Georgia,serif;font-size:15px;font-weight:700;letter-spacing:.1em;text-transform:uppercase}\n.mtt span{font:400 9.5px 'IBM Plex Mono';letter-spacing:.14em;opacity:.6;margin-left:10px;text-transform:none}\n.mtctx{font:500 11.5px 'IBM Plex Mono';color:#a9b2aa}\n.mttg{margin-left:auto}\n.mtclose{appearance:none;border:1px solid rgba(223,229,224,.3);background:none;color:#dfe5e0;cursor:pointer;\n  padding:6px 12px;border-radius:3px;font:500 10.5px 'IBM Plex Sans'}\n.mtclose:hover{background:rgba(223,229,224,.12)}\n.mtb{display:grid;grid-template-columns:1.18fr .95fr;overflow:hidden}\n.mtl{overflow-y:auto;padding:20px 22px 40px;border-right:1px solid #ded7c6}\n.mtr{overflow-y:auto;padding:20px 24px 60px;background:#fbf9f3}\n\n.mtleg{display:flex;gap:14px;flex-wrap:wrap;align-items:center;padding-bottom:13px;border-bottom:1px solid #e3ddcd;margin-bottom:14px}\n.mtleg span{display:flex;align-items:center;gap:5px;font:500 10.5px 'IBM Plex Sans';color:#65706a}\n.mtleg i{width:15px;height:15px;border-radius:50%;display:flex;align-items:center;justify-content:center;\n  font:700 9px 'IBM Plex Sans';color:#fff;flex:0 0 15px}\n.mtleg .ok i{background:#2f6e5b}.mtleg .no i{background:#9c3b3b}.mtleg .off i{background:#cbc6b6}\n.mtleg .gap i{background:#a63a2b}.mtleg .nv i{background:none;border:1.5px dashed #a08a4f;color:#a08a4f}\n.mtleg em{margin-left:auto;font:400 10.5px 'IBM Plex Sans';font-style:italic;color:#9aa096}\n\n.mtder{display:flex;flex-wrap:wrap;gap:6px 22px;background:#eef2ec;border-radius:3px;padding:11px 13px;margin-bottom:12px}\n.mtdt{width:100%;font:600 9px 'IBM Plex Mono';letter-spacing:.12em;text-transform:uppercase;color:#6b7369;margin-bottom:2px}\n.mtder span{display:flex;flex-direction:column;gap:1px}\n.mtder i{font:400 9.5px 'IBM Plex Sans';font-style:normal;color:#8b9187}\n.mtder b{font:600 12px 'IBM Plex Mono';color:#1b211c}\n\n.mtres{display:flex;gap:18px;flex-wrap:wrap;margin-bottom:16px}\n.mtres span{font:500 11px 'IBM Plex Sans';color:#65706a}\n.mtres b{font:700 15px 'IBM Plex Mono';color:#1b211c;margin-right:5px}\n.mtres .ok b{color:#2f6e5b}.mtres .gap b{color:#a63a2b}.mtres .nv b{color:#a08a4f}\n\n.mtgr{margin-bottom:18px}\n.mtgt{font:600 9.5px 'IBM Plex Mono';letter-spacing:.14em;text-transform:uppercase;color:#6b7369;\n  padding-bottom:6px;border-bottom:1px solid #e3ddcd;margin-bottom:4px}\n.rl{display:grid;grid-template-columns:17px 1fr auto auto;gap:4px 9px;width:100%;text-align:left;\n  appearance:none;border:0;background:none;cursor:pointer;padding:8px 6px;border-bottom:1px solid #eee8d9;\n  font-family:'IBM Plex Sans',sans-serif;align-items:center}\n.rl:last-child{border-bottom:0}\n.rl:hover{background:#eef2ec}\n.rl.semart{cursor:default;grid-template-columns:17px 1fr}\n.rl.semart:hover{background:none}\n.rl.sel{background:#e4ece6;box-shadow:inset 2px 0 0 #1e4d38}\n.rst{width:17px;height:17px;border-radius:50%;display:flex;align-items:center;justify-content:center;\n  font:700 10px 'IBM Plex Sans';color:#fff;font-style:normal}\n.rl.ok .rst{background:#2f6e5b}.rl.no .rst{background:#9c3b3b}.rl.off .rst{background:#cbc6b6}\n.rl.gap .rst{background:#a63a2b}.rl.nv .rst{background:none;border:1.5px dashed #a08a4f;color:#a08a4f}\n.rn{font-size:12px;font-weight:600;color:#1b211c;line-height:1.35}\n.rl.off .rn{color:#9aa096;font-weight:500}\n.rart{font:600 9px 'IBM Plex Mono';letter-spacing:.05em;color:#a08a4f;white-space:nowrap}\n.rv{font:600 8px 'IBM Plex Mono';letter-spacing:.07em;text-transform:uppercase;padding:2px 5px;border-radius:2px;white-space:nowrap}\n.rv.vm{background:#dcebe5;color:#1e4d38}.rv.vh{background:#f6e7cd;color:#8a6a18}\n.rv.vn{background:#f3dcdc;color:#9c3b3b}.rv.vo{background:#ece8dc;color:#9aa096}\n.rnota{grid-column:2 / -1;font-size:10.5px;line-height:1.5;color:#767f75}\n.rl.off .rnota{color:#a5aba2}\n\n.mtdec{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:11px 0 6px}\n.mtdl{font:600 8.5px 'IBM Plex Mono';letter-spacing:.11em;text-transform:uppercase;color:#8b9187}\n.mtdv{font-size:12px;font-weight:600;color:#1b211c;background:#eef2ec;padding:4px 9px;border-radius:2px}\n.mtdv.forte{background:#1e4d38;color:#eef5f0}\n.mtseta{font:400 10px 'IBM Plex Mono';color:#a9ae9f}\n.mtdesc{font-size:11px;line-height:1.55;color:#65706a;padding-bottom:10px}\n.mtsla{display:flex;gap:22px;flex-wrap:wrap;border-top:1px solid #e3ddcd;padding-top:10px}\n.mtsla span{display:flex;flex-direction:column;gap:1px}\n.mtsla i{font:400 9.5px 'IBM Plex Sans';font-style:normal;color:#8b9187}\n.mtsla b{font:600 13px 'IBM Plex Mono';color:#1b211c}\n.mtvazio{color:#9aa096;font-size:12px;line-height:1.7;font-style:italic;padding:20px 0}\n\n.mpt{font-family:'Fraunces',Georgia,serif;font-size:17px;font-weight:600;color:#1b211c}\n.mps{font-size:11px;line-height:1.5;color:#8b9187;margin-top:4px;padding-bottom:12px;border-bottom:1px solid #e3ddcd}\n.mpav{background:#f7e9e6;border-left:3px solid #9c3b3b;border-radius:0 2px 2px 0;padding:10px 12px;\n  font-size:11px;line-height:1.55;color:#7d2b2b;margin-top:13px}\n.mpa{margin-top:17px}\n.mpa h4{font-family:'Fraunces',Georgia,serif;font-size:12.5px;font-weight:600;color:#1e4d38;margin-bottom:7px}\n.pol{font-size:11px;line-height:1.62;color:#4b544c;padding:7px 9px;border-radius:2px;cursor:pointer;\n  border-left:2px solid transparent;transition:background .2s,border-color .2s}\n.pol:hover{background:#f2eee3}\n.pol.hl{background:#fdf3d8;border-left-color:#a08a4f}\n.pn{display:inline-block;min-width:26px;font:600 10px 'IBM Plex Mono';color:#a08a4f}\n.pol b{font-weight:600;color:#1b211c}\n.pol .pn{color:#a08a4f}\n@media(max-width:1000px){.mtb{grid-template-columns:1fr;grid-template-rows:1fr 1fr}.mtl{border-right:0;border-bottom:1px solid #ded7c6}}\n\n/* ── a área de conta da Granado ────────────────────────────────── */\n.gsite{position:absolute;inset:0;z-index:40;background:#fff;overflow-y:auto;\n  font-family:'IBM Plex Sans',system-ui,sans-serif;color:#1b211c}\n.gtop{background:#123726;color:#e8ece7;display:flex;align-items:center;gap:26px;padding:7px 34px;\n  font:600 10.5px 'IBM Plex Sans';letter-spacing:.09em}\n.gtop span{opacity:.62} .gtop span.on{opacity:1}\n.gnav{background:#1b4a35;color:#fff;display:flex;align-items:center;gap:34px;padding:14px 34px}\n.glogo{font-family:'Fraunces',Georgia,serif;font-size:19px;font-weight:700;letter-spacing:.16em;line-height:1}\n.glogo em{display:block;font:400 6.5px 'IBM Plex Sans';letter-spacing:.42em;font-style:normal;opacity:.85;margin-top:3px}\n.gmenu{display:flex;gap:22px;margin:0 auto}\n.gmenu a{font:600 11.5px 'IBM Plex Sans';letter-spacing:.06em;color:#fff;opacity:.94}\n.gtools{display:flex;align-items:center;gap:16px}\n.gfid{border:1px solid rgba(255,255,255,.5);border-radius:3px;padding:4px 9px;text-align:center;line-height:1.15}\n.gfid i{display:block;font:400 6.5px 'IBM Plex Sans';font-style:italic;opacity:.85}\n.gfid b{display:block;font:700 9.5px 'IBM Plex Sans';letter-spacing:.06em}\n.gfid u{display:block;font:400 5.5px 'IBM Plex Sans';letter-spacing:.16em;text-decoration:none;opacity:.8}\n.gic{width:21px;height:21px;color:#fff;position:relative;display:block}\n.gic svg{width:100%;height:100%;display:block}\n.gbag em{position:absolute;right:-5px;top:-5px;background:#fff;color:#1b4a35;border-radius:50%;\n  width:14px;height:14px;font:700 9px 'IBM Plex Sans';font-style:normal;display:flex;align-items:center;justify-content:center}\n.gbody{display:grid;grid-template-columns:clamp(190px,17vw,250px) 1fr;gap:clamp(22px,3vw,48px);\n  padding:clamp(22px,3.4vh,40px) 34px 60px;max-width:1500px;margin:0 auto;align-items:start}\n.gside{background:#f6f6f4;border-radius:4px;padding:22px 24px;display:flex;flex-direction:column;gap:13px}\n.gside a{font-size:13.5px;color:#1b211c;cursor:pointer}\n.gside a.on{color:#1b4a35;font-weight:600;text-decoration:underline;text-underline-offset:4px}\n.gside hr{border:0;border-top:1px solid #e0e0da;margin:5px 0}\n.gmain{min-width:0}\n.gh1{font-family:'Fraunces',Georgia,serif;font-size:clamp(24px,2.7vw,34px);font-weight:600;color:#1b4a35;letter-spacing:-.01em}\n.grule{width:54px;height:2px;background:#b8935a;margin:13px 0 26px}\n.gh2{font-family:'Fraunces',Georgia,serif;font-size:19px;font-weight:600;color:#1b4a35;margin-bottom:14px}\n.gh3{font-family:'Fraunces',Georgia,serif;font-size:19px;font-weight:600;color:#1b211c;margin-bottom:6px}\n.gsub{font-size:13px;line-height:1.6;color:#65706a;margin-bottom:16px;max-width:60ch}\n.gtabw{border-top:1px solid #e2e2dc;overflow-x:auto}\n.gtab{width:100%;border-collapse:collapse;font-size:12.5px;min-width:720px}\n.gtab th{text-align:left;font-weight:600;color:#1b4a35;padding:15px 14px;background:#f6f6f4;white-space:nowrap}\n.gtab td{padding:15px 14px;background:#f6f6f4;border-top:6px solid #fff;vertical-align:middle}\n.gref{font-variant-numeric:tabular-nums}\n.gval{font-weight:600;white-space:nowrap}\n.gst{font-size:12px;color:#65706a}\n.gac{display:flex;flex-direction:column;align-items:flex-start;gap:5px}\n.gac a{color:#1b4a35;text-decoration:underline;text-underline-offset:3px;font-size:12.5px;white-space:nowrap}\n.gtr{appearance:none;border:0;cursor:pointer;background:#1b4a35;color:#fff;border-radius:3px;\n  padding:7px 13px;font:600 12px 'IBM Plex Sans';margin-top:4px;white-space:nowrap}\n.gtr:hover{background:#143a29}\n.gpg{display:flex;justify-content:flex-end;align-items:center;gap:9px;font-size:12.5px;color:#65706a;margin-top:18px}\n.gpg span{border:1px solid #d7d7d0;border-radius:999px;padding:6px 15px}\n.gnota{margin-top:24px;background:#eef3ef;border-left:3px solid #1b4a35;border-radius:0 3px 3px 0;\n  padding:12px 15px;font-size:12.5px;line-height:1.6;color:#3e4a42;max-width:76ch}\n.gcrumb{display:flex;align-items:center;gap:8px;font-size:12px;color:#8b9187;margin-bottom:14px;flex-wrap:wrap}\n.gcrumb a{color:#1b4a35;text-decoration:underline;text-underline-offset:3px;cursor:pointer}\n.gcrumb i{font-style:normal;opacity:.5}\n.gcrumb b{font-variant-numeric:tabular-nums;color:#1b211c;font-weight:600}\n.gres{display:flex;align-items:center;gap:18px;background:#f6f6f4;border-radius:4px;padding:13px 16px;margin-bottom:22px;flex-wrap:wrap}\n.gresi{display:flex;flex-direction:column;gap:3px;font-size:12.5px;color:#1b211c;flex:1}\n.gresv{font:600 15px 'IBM Plex Mono';color:#1b4a35;text-align:right}\n.gresv em{display:block;font:400 11px 'IBM Plex Sans';font-style:normal;color:#8b9187;margin-top:2px}\n.gsteps{display:flex;gap:18px;padding-bottom:16px;margin-bottom:22px;border-bottom:1px solid #e2e2dc}\n.gsteps span{font:600 10px 'IBM Plex Mono';letter-spacing:.1em;text-transform:uppercase;color:#b4bab2}\n.gsteps span.on{color:#1b4a35}\n.gcarr{color:#8b9187;font-size:12.5px;font-style:italic;padding:22px 0}\n.gsite .xclose{position:fixed;right:18px;bottom:18px;z-index:50;appearance:none;border:0;cursor:pointer;\n  background:#1b211c;color:#f2efe6;padding:10px 16px;border-radius:999px;font:500 11.5px 'IBM Plex Sans';\n  box-shadow:0 6px 20px rgba(0,0,0,.24)}\n.gsite .xclose:hover{background:#000}\n.xfil{display:flex;gap:7px;flex-wrap:wrap;margin-top:15px}\n.xfb{appearance:none;cursor:pointer;border:1px solid #ddd8c9;background:#fff;border-radius:999px;\n  padding:5px 13px;font:500 11.5px 'IBM Plex Sans';color:#65706a}\n.xfb.on{background:#1b4a35;border-color:#1b4a35;color:#fff}\n.xsw img,.sw img{width:100%;height:100%;object-fit:contain;display:block;mix-blend-mode:multiply}\n.xsw{height:118px;background:#f6f6f4;padding:9px}\n.sw img{padding:6px}\n.xlin{font:600 8.5px 'IBM Plex Mono';letter-spacing:.09em;text-transform:uppercase;color:#a08a4f;padding:9px 10px 0}\n.xprod .xpnm{padding-top:3px;min-height:32px}\n\n.nota{background:#fbf9f4;border:1px solid #ddd6c8;padding:9px 11px;font-size:11px;\n  line-height:1.55;color:#6d766f;border-radius:2px;margin-bottom:11px}\n`,\n\n  render(d2){\n    const s = d2.state;\n    const modo = s.modo || 'asis';\n    const tobe = modo === 'tobe';\n    const p = s.pedidoRef ? PEDIDOS.filter(x=>x.ref===s.pedidoRef)[0] : null;\n    const passo = s.passo || 1;\n    const d = p ? deriva(p) : null;\n    const carrinho = totalCarrinho(s.cart);\n    const base = p ? (valorDevolvido(p, s.devItens) || p.valor) : 0;\n    const difCar = p ? carrinho - base : 0;\n    const r = (p && s.motivo && s.reparacao && passo >= 4) ? decide(p, s.motivo, s.reparacao, modo, carrinho, s.destino, base, s.razao) : null;\n\n    let c1 = moldura(modo,'cliente') + '<div class=\"steps\">' +\n      [1,2,3,4].map(n=>'<span class=\"'+(n<=passo?'on':'')+'\"></span>').join('') + '</div>';\n    if (tobe) c1 += '<button class=\"expbtn\">Ver a experiência do cliente <span>portal de pós-venda</span></button>';\n    if (tobe && passo === 1)\n      c1 += '<div class=\"cans\">'+CANAIS_TOBE.map(c=>'<span>'+esc(c[1])+'</span>').join('')+'</div>';\n    if (!tobe && passo === 1)\n      c1 += '<div class=\"cans\"><span class=\"off\">Troque?</span><span class=\"off\">e-mail</span><span class=\"off\">WhatsApp</span><span class=\"off\">telefone</span></div>';\n\n    if (passo === 1){\n      c1 += '<div class=\"lbl\">Seus pedidos</div>';\n      c1 += PEDIDOS.map(x =>\n        '<div class=\"ped\" data-ped=\"'+esc(x.ref)+'\"'+(s.pedidoRef===x.ref?' data-on':'')+'>'+\n        '<div class=\"r\">'+esc(x.ref)+'</div><div class=\"m\">'+esc(itensDoPedido(x)[0]||x.marca)+\n        (x.linhas.length>1?' +'+(x.linhas.length-1):'')+'</div>'+\n        '<div class=\"v\">'+brl(x.valor)+' <span style=\"color:#8b9187;font-weight:400\">· há '+x.dias+' dias</span></div></div>').join('');\n    } else if (passo === 2){\n      const e = enumera(p, modo);\n      if (!tobe) c1 += '<div class=\"nota\">'+(d.troqueCobre\n        ? 'Este pedido saiu do '+esc(ORIGENS[p.origem])+', então o TroqueCommerce até atenderia. O cliente não tinha como saber disso.'\n        : 'Este pedido saiu de '+esc(ORIGENS[p.origem])+'. O TroqueCommerce não cobre — vira e-mail e cai num operador.')+'</div>';\n      if (!tobe){\n        c1 += '<div class=\"lbl\">O que aconteceu?</div>'+\n          '<div class=\"aberto\">Comprei esse kit e chegou faltando um item. Já mandei e-mail duas vezes e ninguém respondeu. Quero meu dinheiro de volta.<span class=\"cur\"></span></div>'+\n          '<div class=\"nota asisn\"><b>Campo aberto.</b> O cliente escreve livre, por e-mail ou WhatsApp. Sem opções, sem crivo, sem prazo — e o texto pode nem dizer o que a operação precisa saber.</div>'+\n          '<div class=\"lbl\">Validação manual · operador do SAC</div>'+\n          '<div class=\"nota\">Alguém lê esse texto e classifica na mão, com o critério que tiver. É esse passo que não escala.</div>';\n      } else {\n        c1 += '<div class=\"lbl\">O que aconteceu?</div>';\n      }\n      c1 += e.opcoes.map(o =>\n        '<div class=\"opt'+(o.estado==='bloqueado'?' no':'')+(o.m.saida?' sec':'')+'\" data-mot=\"'+esc(o.m.id)+'\"'+\n        (s.motivo===o.m.id?' data-on':'')+'><div class=\"t\">'+esc(o.m.label)+'</div>'+\n        (o.estado==='bloqueado' ? '<div class=\"why\">'+esc(o.razao)+'</div>' :\n         o.estado==='livre' ? '<div class=\"livre\">classificação manual do operador</div>' :\n         o.estado==='precisa' ? '<div class=\"ask\">precisa de foto · prazo estimado '+o.sla+' dias</div>' :\n         '<div class=\"ok\">prazo estimado '+o.sla+' dias</div>')+'</div>').join('');\n      if (e.naoSeAplica) c1 += '<div class=\"naoaplica\">'+e.naoSeAplica+' outras situações não se aplicam a este pedido.</div>';\n      const mSelC = s.motivo ? acha(MOTIVOS, s.motivo) : null;\n      if (tobe && pedeItens(mSelC)) c1 += itensEMotivo(p, s, true);\n      c1 += '<button class=\"back\">← trocar de pedido</button>';\n    } else if (passo === 3){\n      c1 += '<div class=\"lbl\">O que você prefere?</div>';\n      const gr = [];\n      (REPARACOES[s.motivo]||[]).forEach(rp=>{\n        const g = GRUPO_REP[rp[0]] || 'unico';\n        let b = gr.filter(x=>x[0]===g)[0];\n        if (!b){ b = [g, []]; gr.push(b) }\n        b[1].push(rp);\n      });\n      c1 += gr.map(g =>\n        (g[0]==='unico' ? '' : '<div class=\"grl\">'+GRUPO_LBL[g[0]][0]+'</div>')+\n        g[1].map(rp =>\n          '<div class=\"opt\" data-rep=\"'+rp[0]+'\"'+(s.reparacao===rp[0]?' data-on':'')+'>'+\n          '<div class=\"t\">'+esc(rp[1])+(rp[3]?'<span class=\"up\">'+esc(rp[3])+'</span>':'')+'</div>'+\n          (rp[2]?'<div class=\"hint\">'+esc(rp[2])+'</div>':'')+\n          '</div>').join('')).join('');\n      if (s.reparacao === 'escolher') c1 += picker(p, s.cart);\n      if (acha(MOTIVOS,s.motivo).foto)\n        c1 += '<div class=\"nota\">'+(tobe ? 'O motor exige foto e lote aqui, antes de abrir a ocorrência.'\n          : 'Hoje a foto é pedida por e-mail, depois, quando alguém percebe que falta.')+'</div>';\n      const travado = s.reparacao === 'escolher' && carrinho <= 0;\n      c1 += '<button class=\"btn'+(tobe?'':' asis')+'\"'+(travado?' disabled':'')+' data-go>'+\n        (s.reparacao==='escolher' ? (travado?'Escolha ao menos um produto':'Confirmar a troca') : 'Confirmar')+\n        '</button><button class=\"back\">← voltar</button>';\n    } else {\n      if (s.reparacao === 'escolher' && difCar < -0.01 && !s.destino){\n        c1 += '<div class=\"lbl\">Sobraram '+brl(-difCar)+'. Como prefere receber?</div>'+\n          (daDireitoADinheiro(s.motivo, s.razao)\n            ? '<div class=\"opt\" data-dest=\"estorno_saldo\"><div class=\"t\">Reembolso do saldo remanescente<span class=\"up\">CDC</span></div>'+\n              '<div class=\"hint\">volta em dinheiro, na forma de pagamento da compra · arrependimento dá esse direito</div></div>'\n            : '')+\n          '<div class=\"opt\" data-dest=\"vale\"><div class=\"t\">Vale-troca</div>'+\n          '<div class=\"hint\">meio de pagamento num pedido novo no site · não é Loyalty</div></div>'+\n          '<div class=\"opt\" data-dest=\"wallet\"><div class=\"t\">Crédito na wallet do Loyalty</div>'+\n          '<div class=\"hint\">saldo no programa de fidelidade · possibilidade nova</div></div>'+\n          '<button class=\"back\">← mudar os produtos</button>';\n      } else {\n      const cod = 'OC-' + p.ref.replace('#','').slice(-6);\n      c1 += '<div class=\"prot '+modo+'\"><div class=\"n\">'+(tobe?'Ocorrência aberta':'Pedido enviado por e-mail')+'</div>'+\n        '<div class=\"c\">'+(tobe?cod:'sem protocolo')+'</div><div class=\"sla\">'+\n        (tobe ? (r.fecha ? 'Resolvida na hora' : 'Previsão de conclusão em '+r.sla+' dia'+(r.sla===1?'':'s'))\n              : 'Nenhum prazo é informado ao cliente. Ele descobre quando cobra — ou quando desiste.')+'</div></div>';\n      const ps = passosCliente(p, s.motivo, s.reparacao, r, modo);\n      c1 += tobe\n        ? '<div class=\"sync on\">↻ Ocorrência sincronizada com o Service Cloud — o SAC vê o caso, o histórico e o prazo sem o cliente precisar reabrir nada.</div>'\n        : '<div class=\"sync off\">O caso vive num e-mail. Não existe registro no Service Cloud até alguém abrir o chamado à mão.</div>';\n      if (s.reparacao === 'escolher' && difCar > 0.01)\n        c1 += '<div class=\"ck\"><div><span>Faltam</span><b>'+brl(difCar)+'</b></div><button class=\"ckb\">Ir para o checkout</button></div>';\n      if (tobe){\n        const trC = trilhaCliente(p, s.motivo, s.reparacao, r, s.devItens);\n        c1 += '<div class=\"lbl\">O que acontece daqui pra frente</div><div class=\"trl cp\">'+\n          trC.map(x=>'<div class=\"trli '+x.st+' '+x.quem+'\"><div class=\"trlm\"><i></i></div>'+\n          '<div class=\"trlc\"><div class=\"trlh\"><span class=\"trlq\">'+(x.quem==='voce'?'Você':'Granado')+'</span>'+\n          '<span class=\"trld\">'+esc(x.d)+'</span></div><div class=\"trlt\">'+esc(x.t)+'</div></div></div>').join('')+'</div>';\n        if (r.reversa) c1 += '<div class=\"nota\">A etiqueta sai com o código do pedido impresso. Veja a etiqueta na experiência do cliente.</div>';\n      } else if (ps) c1 += '<div class=\"lbl\">Próximos passos</div><div class=\"cpassos\"><ol>'+\n        ps.map(x=>'<li>'+esc(x)+'</li>').join('')+'</ol></div>';\n      if (tobe && r.reversa) c1 += '<div class=\"hip\"><b>Em estudo</b> · Um motor de score dispensaria a conferência para parte dos casos: o reembolso sairia na postagem e a conferência correria depois.'+\n        '<div class=\"crit\"><span>Critérios sugeridos</span><ol><li>Quantidade de ocorrências recentes do cliente <em>(3 como referência — a calibrar)</em></li>'+\n        '<li>Nível no programa de fidelidade</li></ol></div>Não validado com a Granado.</div>';\n      else c1 += '<div class=\"nota\">O caso agora depende de um operador ler o e-mail, descobrir de onde o pedido saiu, e decidir com o critério dele. Não existe passo seguinte que o cliente possa acompanhar.</div>';\n      c1 += '<button class=\"back\">← recomeçar</button>';\n      }\n    }\n\n    let c2 = moldura(modo,'motor');\n    c2 += '<button class=\"motbtn'+(tobe?'':' asis')+'\">Ver o motor por dentro <span>'+\n      (tobe ? 'regras e política' : 'o que hoje ninguém verifica')+'</span></button>';\n    if (!p){\n      c2 += '<div class=\"vazio\">'+(tobe\n        ? 'O motor fica em silêncio até o cliente escolher um pedido. A partir daí, tudo que ele precisa saber é derivado — o cliente não responde nada disso.'\n        : 'Não há motor. O que decide hoje é quem estiver disponível para ler o e-mail.')+'</div>';\n    } else {\n      c2 += '<div class=\"lbl\">'+(tobe?'Derivado do pedido':'O que hoje ninguém consulta')+'</div><div class=\"der\">'+\n        '<div class=\"row\"><span class=\"k\">Origem</span><span class=\"v\">'+esc(d.origem)+'</span></div>'+\n        (tobe?'':'<div class=\"row\"><span class=\"k\">TroqueCommerce</span><span class=\"v '+(d.troqueCobre?'good':'bad')+'\">'+(d.troqueCobre?'cobre':'não cobre')+'</span></div>')+\n        '<div class=\"row\"><span class=\"k\">Adquirente</span><span class=\"v\">'+esc(PAGS[p.pag].curto)+'</span></div>'+\n        '<div class=\"row\"><span class=\"k\">Estorno automático</span><span class=\"v '+(d.automatiza?'good':'bad')+'\">'+(d.automatiza?'sim':'não')+'</span></div>'+\n        '<div class=\"row\"><span class=\"k\">Dias desde a compra</span><span class=\"v\">'+d.dias+'</span></div>'+\n        '<div class=\"row\"><span class=\"k\">Status</span><span class=\"v\">'+esc(d.status.replace(/_/g,' '))+'</span></div>'+\n        (d.pix90?'<div class=\"row\"><span class=\"k\">PIX &gt; 90 dias</span><span class=\"v bad\">Contas a Pagar</span></div>':'')+\n        '</div>';\n      if (tobe){\n        const on = { deriva:1, enumera:passo>=2, apura:passo>=4, decide:passo>=4, classifica:passo>=4, orquestra:passo>=4 };\n        c2 += '<div class=\"lbl\">O motor</div>' + VERBOS.map(v =>\n          '<div class=\"verb'+(on[v[0]]?' on':'')+'\"><i></i><div><div class=\"n\">'+v[1]+'</div><div class=\"d\">'+v[2]+'</div></div></div>').join('');\n      } else {\n        c2 += '<div class=\"nota\">Nada acima é consultado antes de responder ao cliente. O prazo do CDC é conferido na mão, dias depois — e às vezes só quando o produto já voltou.</div>';\n      }\n      if (r){\n        c2 += '<div class=\"apbox '+modo+'\"><div class=\"f\">'+(r.ap.fonte?'Apuração · '+esc(r.ap.fonte):'Sem apuração')+'</div>'+\n          '<div class=\"t\">'+esc(r.ap.texto)+'</div><div class=\"tax\">'+\n          '<span class=\"d1\">'+esc(acha(MOTIVOS,s.motivo).label)+'</span><span class=\"ar\">torna-se →</span>'+\n          '<span class=\"d2'+(tobe?'':' asis')+'\">'+esc(r.ap.conclusao)+'</span></div></div>';\n        if (tobe && r.reversa) c2 += '<div class=\"nota\"><b>As duas trilhas abrem juntas.</b> O que encurta o prazo é a autorização do CD sair de '+\n          PARAMS.slaAutorizacaoCD+' dias para a meta de '+PARAMS.slaAutorizacaoIdeal+' dia — escala por peso e conferência com balança e bipper, proposta da própria logística.</div>';\n      }\n    }\n\n    const lane = (t, dom, arr, vazio) =>\n      '<div><div class=\"ch\">'+t+'</div><div class=\"cb\">'+moldura(modo,dom)+\n      (arr && arr.length ? arr.map(stepHtml).join('') : '<div class=\"vazio\">'+vazio+'</div>')+'</div></div>';\n\n    const c3 = '<div class=\"split\">'+\n      lane('Logística','logistica', r?r.produto:null, 'Nada acionado ainda.')+\n      lane('Finanças / Fiscal','financas', r?r.dinheiro:null, 'Nada acionado ainda.')+'</div>';\n\n    if (s.mot) return '<div class=\"app\">'+motorRender(d2, p, modo, r, carrinho)+'</div>';\n    if (tobe && s.exp && p) return '<div class=\"app\">'+expRender(d2, p, passo, carrinho, difCar, r)+'</div>';\n    if (tobe && s.exp) return '<div class=\"app\">'+expRender(d2, PEDIDOS[0], 1, 0, 0, null)+'</div>';\n\n    return '<div class=\"app\"><header><h1>Arquitetura de Resolução Pós-Venda</h1>'+\n      '<span class=\"s\">Granado &amp; Phebo</span>'+\n      '<div class=\"tg\"><button data-m=\"asis\"'+(tobe?'':' data-on')+'>AS-IS</button>'+\n      '<button data-m=\"tobe\"'+(tobe?' data-on':'')+'>TO-BE</button></div>'+\n      '<button class=\"reset\">recomeçar</button></header>'+\n      '<div class=\"cols\">'+\n        '<div class=\"col\"><div class=\"ch\">Cliente</div><div class=\"cb\">'+c1+'</div></div>'+\n        '<div class=\"col\"><div class=\"ch\">Motor de pós-venda</div><div class=\"cb\">'+c2+'</div></div>'+\n        '<div class=\"col\">'+c3+'</div></div></div>';\n  },\n\n  mounted(d2){\n    if(!d2.state.passo) d2.state.passo = 1;\n    if(!d2.state.modo) d2.state.modo = 'asis';\n    d2.on('.tg button','click',(e,el)=>{ d2.state.modo = el.getAttribute('data-m') });\n    d2.on('[data-ped]','click',(e,el)=>{ d2.state.pedidoRef = el.getAttribute('data-ped');\n      d2.state.motivo=null; d2.state.reparacao=null; d2.state.cart={}; d2.state.destino=null; d2.state.passo=2 });\n    d2.on('[data-mot]','click',(e,el)=>{ if(el.classList.contains('no')||el.classList.contains('off')) return;\n      const id = el.getAttribute('data-mot');\n      const mm = acha(MOTIVOS, id);\n      d2.state.motivo = id; d2.state.reparacao=null; d2.state.devItens=null;\n      d2.state.razao = RAZAO_PADRAO[id] || null;\n      d2.state.passo = (d2.state.modo === 'tobe' && pedeItens(mm)) ? 2 : 3 });\n    d2.on('[data-razao]','click',(e,el)=>{ d2.state.razao = el.getAttribute('data-razao') });\n    d2.on('[data-item]','click',(e,el)=>{\n      const p = d2.state.pedidoRef ? PEDIDOS.filter(x=>x.ref===d2.state.pedidoRef)[0] : null;\n      if (!p) return;\n      const sku = el.getAttribute('data-item');\n      const sel = Object.assign({}, d2.state.devItens || itensPadrao(p));\n      const orig = (p.linhas.filter(l=>l[0]===sku)[0]||[null,1])[1];\n      sel[sku] = sel[sku] ? 0 : orig;\n      d2.state.devItens = sel;\n    });\n    d2.on('[data-go2]','click',()=>{ if(d2.state.razao) d2.state.passo=3 });\n    d2.on('[data-rep]','click',(e,el)=>{ d2.state.reparacao = el.getAttribute('data-rep');\n      d2.state.cart={}; d2.state.destino=null });\n    d2.on('[data-sku]','click',(e,el)=>{\n      const sku = el.getAttribute('data-sku');\n      const c = Object.assign({}, d2.state.cart||{});\n      const remover = e.target && e.target.classList && e.target.classList.contains('rm');\n      if (remover){ c[sku] = (c[sku]||0) - 1; if (c[sku] <= 0) delete c[sku] }\n      else c[sku] = (c[sku]||0) + 1;\n      d2.state.cart = c;\n    });\n    d2.on('[data-dest]','click',(e,el)=>{ d2.state.destino = el.getAttribute('data-dest') });\n    try{\n      if (!CATALOGO.length && !d2.state.catLoading && typeof fetch === 'function'){\n        d2.state.catLoading = true;\n        fetch(CAT_URL).then(r=>r.json()).then(j=>{ CATALOGO = j; d2.state.cat = j.length })\n          .catch(()=>{ d2.state.cat = -1 });\n      }\n    }catch(e){ d2.state.cat = -1 }\n    d2.on('[data-linha]','click',(e,el)=>{ d2.state.linha = el.getAttribute('data-linha') });\n    d2.on('.expbtn','click',()=>{ d2.state.exp = true });\n    d2.on('.xclose','click',()=>{ d2.state.exp = false });\n    d2.on('.motbtn','click',()=>{ d2.state.mot = true });\n    d2.on('.mtclose','click',()=>{ d2.state.mot = false });\n    d2.on('.rl','click',(e,el)=>{\n      const art = el.getAttribute('data-art');\n      const raiz = el.closest ? el.closest('.mtw') : null;\n      if (!art || art === '—' || !raiz) return;\n      const anteriores = raiz.querySelectorAll('.pol.hl');\n      for (let i=0;i<anteriores.length;i++) anteriores[i].classList.remove('hl');\n      const sel = raiz.querySelectorAll('.rl.sel');\n      for (let i=0;i<sel.length;i++) sel[i].classList.remove('sel');\n      el.classList.add('sel');\n      const alvo = raiz.querySelector('[data-pol=\"'+art+'\"]');\n      if (alvo){ alvo.classList.add('hl'); alvo.scrollIntoView({block:'center',behavior:'smooth'}) }\n    });\n    d2.on('.pol','click',(e,el)=>{\n      const art = el.getAttribute('data-pol');\n      const raiz = el.closest ? el.closest('.mtw') : null;\n      if (!raiz) return;\n      const anteriores = raiz.querySelectorAll('.pol.hl');\n      for (let i=0;i<anteriores.length;i++) anteriores[i].classList.remove('hl');\n      el.classList.add('hl');\n      const sel = raiz.querySelectorAll('.rl.sel');\n      for (let i=0;i<sel.length;i++) sel[i].classList.remove('sel');\n      const regras = raiz.querySelectorAll('.rl[data-art=\"'+art+'\"]');\n      for (let i=0;i<regras.length;i++) regras[i].classList.add('sel');\n      if (regras.length) regras[0].scrollIntoView({block:'center',behavior:'smooth'});\n    });\n    d2.on('[data-go]','click',()=>{ if(d2.state.reparacao) d2.state.passo=4 });\n    d2.on('.back','click',()=>{ const p=d2.state.passo||1;\n      if(p===4){ d2.state.passo=1; d2.state.pedidoRef=null; d2.state.motivo=null; d2.state.reparacao=null }\n      else d2.state.passo = Math.max(1,p-1) });\n    d2.on('.reset','click',()=>{ d2.state.passo=1; d2.state.pedidoRef=null; d2.state.motivo=null; d2.state.reparacao=null });\n  },\n}"}}}}}}}}]}},{"reference":"ExternalComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"5f060d9b1ca96def42f3c40a","displayName":"Builder AuthStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"credentials":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"verifier":{"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"sessionShared":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},"email":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"nR6Q9d7qdaPtZhJ28Q8Dy"},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"yPCJBTKo8q1Mw0B_3Kpwl"},"component":"data2-core-types@ArtboardReference"}}},"session":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"name"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"sessionMetadata":{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"}]},"component":"data2-core-logical-operators@And","displayName":"is active and has _id"}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $user"},{"params":{"action":{"component":"data2-core-types@Getter","displayName":"isData2User","params":{"module":{"component":"data2-core-functions@Match","params":{"pattern":{"component":"data2-core-types@Regex","params":{"pattern":"@data2\\.app$","flags":"i"}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.email"}}}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"0"}}}},"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":{"component":"data2-core-flow@If","displayName":"management exception never picks the system","params":{"compare":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}}}]}},"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"d2_app":"management"}}},"else":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"has_access"}}}}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"sessionExpiresIn":{"component":"data2-core-primitives@Number","params":{"content":604800}},"sessionRenewal":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"identityProviders":[{"provider":{"component":"data2-core-primitives@String","params":{"content":"GOOGLE"}},"clientId":{"component":"data2-core-primitives@String","params":{"content":"55470861603-22pvfc1t49lp8cjnbfk71s5ct9hp1q1v.apps.googleusercontent.com"}}}]},"reference":"Data2BuilderAuthentication","updatedAt":"2026-10-29T19:05:43.007Z","updateMetadata":{"updatedBy":{"user":"5f1609be1ca96def427e1559"}}},{"_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"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_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}},"policies":[{"component":"data2-core-auth@PublicPolicy","params":{"reason":"Explicit so data2 can go private, 2026-11-05. Access is decided by the drive/file gate (applyFileTableGates, docs/drive-file-access.md), which runs after this policy; same behavior as today."}}]},"reference":"FileComponentInstancesDataSet","updatedAt":"2026-11-05T17:23:34.217Z","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"},"policies":[{"component":"data2-core-auth@PublicPolicy","params":{"reason":"Explicit so data2 can go private, 2026-11-05. Access is decided by the drive/file gate (applyFileTableGates, docs/drive-file-access.md), which runs after this policy; same behavior as today."}}]},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2026-11-05T17:23:34.254Z","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}},"policies":[{"component":"data2-core-auth@PublicPolicy","params":{"reason":"Explicit so data2 can go private, 2026-11-05. Access is decided by the drive/file gate (applyFileTableGates, docs/drive-file-access.md), which runs after this policy; same behavior as today."}}]},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2026-11-05T17:23:34.347Z","createdAt":"2023-02-16T14:27:07.797Z"},{"reference":"ServiceComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6ab155db06fa84ab71c3ed60","component":"data2-core-primitives@Artboard","system":"6a62e4640613f70fa449ff5d","displayName":"Simulador Arquitetura Pós-Venda","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Simulador Arquitetura Pós-Venda"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"7jXIghBNUuxfJV3ffyzQS"},{"_id":"f33d4a966b7eb867eef26439","parent":"6ab155db06fa84ab71c3ed60","component":"granado-app@granado-sim-posvenda","system":"6a62e4640613f70fa449ff5d","displayName":"granado-sim-posvenda","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":false,"growH":true,"growV":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}}}},"reference":"7sUQIk_iq3t5T0ZghDFZm"}]}},{"_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":"6ab155e3f0c8e472f5f567e8","displayName":"Simulador Arquitetura Pós-Venda","reference":"SlIh0MtYxm4aE9vqfqHXp","params":{"domain":{"component":"data2-core-primitives@String","params":{"content":"simulador-posvenda"}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"7jXIghBNUuxfJV3ffyzQS"}}},"system":"6a62e4640613f70fa449ff5d","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}