[{"data":1,"prerenderedAt":1715},["ShallowReactive",2],{"navigation_docs":3,"-projetos-integradores-pi-04-emprestimos-dispositivos":252,"-projetos-integradores-pi-04-emprestimos-dispositivos-surround":1710},[4,96,189],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"⚙️ Engenharia de Software","i-lucide-book-open","\u002Fengenharia-software","1.engenharia-software",[10,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92],{"title":5,"path":7,"stem":11},"1.engenharia-software\u002Findex",{"title":13,"path":14,"stem":15},"📋 Plano de Ensino e Aplicações","\u002Fengenharia-software\u002Fengenharia-software-aplicacoes","1.engenharia-software\u002F01.engenharia-software-aplicacoes",{"title":17,"path":18,"stem":19},"Cap 01: Introdução e Natureza do Software","\u002Fengenharia-software\u002Fcap-01","1.engenharia-software\u002F02.cap-01",{"title":21,"path":22,"stem":23},"Cap 02: Modelos de Processo de Software","\u002Fengenharia-software\u002Fcap-02","1.engenharia-software\u002F03.cap-02",{"title":25,"path":26,"stem":27},"Cap 03: As Atividades do Processo","\u002Fengenharia-software\u002Fcap-03","1.engenharia-software\u002F04.cap-03",{"title":29,"path":30,"stem":31},"Cap 04: Metodologias Ágeis","\u002Fengenharia-software\u002Fcap-04","1.engenharia-software\u002F05.cap-04",{"title":33,"path":34,"stem":35},"Cap 05: Fundamentos de Requisitos","\u002Fengenharia-software\u002Fcap-05","1.engenharia-software\u002F06.cap-05",{"title":37,"path":38,"stem":39},"Cap 06: Elicitação e Levantamento","\u002Fengenharia-software\u002Fcap-06","1.engenharia-software\u002F07.cap-06",{"title":41,"path":42,"stem":43},"Cap 07: Especificação de Requisitos (ERS)","\u002Fengenharia-software\u002Fcap-07","1.engenharia-software\u002F08.cap-07",{"title":45,"path":46,"stem":47},"Cap 08: Validação e Gestão","\u002Fengenharia-software\u002Fcap-08","1.engenharia-software\u002F09.cap-08",{"title":49,"path":50,"stem":51},"Cap 09: Fundamentos da Modelagem","\u002Fengenharia-software\u002Fcap-09","1.engenharia-software\u002F10.cap-09",{"title":53,"path":54,"stem":55},"Cap 10: Diagrama de Casos de Uso (Conceitos)","\u002Fengenharia-software\u002Fcap-10","1.engenharia-software\u002F11.cap-10",{"title":57,"path":58,"stem":59},"Cap 11: Casos de Uso (Prática e Relações)","\u002Fengenharia-software\u002Fcap-11","1.engenharia-software\u002F12.cap-11",{"title":61,"path":62,"stem":63},"Cap 12: Diagrama de Classes (Conceitos)","\u002Fengenharia-software\u002Fcap-12","1.engenharia-software\u002F13.cap-12",{"title":65,"path":66,"stem":67},"Cap 13: Herança e Polimorfismo","\u002Fengenharia-software\u002Fcap-13","1.engenharia-software\u002F14.cap-13",{"title":69,"path":70,"stem":71},"Cap 14: Diagrama de Sequência","\u002Fengenharia-software\u002Fcap-14","1.engenharia-software\u002F15.cap-14",{"title":73,"path":74,"stem":75},"Cap 15: Diagramas Dinâmicos (Estados e Atividades)","\u002Fengenharia-software\u002Fcap-15","1.engenharia-software\u002F16.cap-15",{"title":77,"path":78,"stem":79},"Cap 16: Qualidade de Software (SQA)","\u002Fengenharia-software\u002Fcap-16","1.engenharia-software\u002F17.cap-16",{"title":81,"path":82,"stem":83},"Cap 17: Estratégias de Teste","\u002Fengenharia-software\u002Fcap-17","1.engenharia-software\u002F18.cap-17",{"title":85,"path":86,"stem":87},"Cap 18: Manutenção e Evolução","\u002Fengenharia-software\u002Fcap-18","1.engenharia-software\u002F19.cap-18",{"title":89,"path":90,"stem":91},"Cap 19: Gerência de Configuração (SCM)","\u002Fengenharia-software\u002Fcap-19","1.engenharia-software\u002F20.cap-19",{"title":93,"path":94,"stem":95},"Cap 20: Conclusão e Próximos Passos","\u002Fengenharia-software\u002Fcap-20","1.engenharia-software\u002F21.cap-20",{"title":97,"icon":98,"path":99,"stem":100,"children":101},"🛠️ Atividades","i-lucide-wrench","\u002Fatividades","2.atividades",[102,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,181,185],{"title":103,"path":99,"stem":104},"📋 Orientações Gerais","2.atividades\u002Findex",{"title":106,"path":107,"stem":108},"📅 Cronograma","\u002Fatividades\u002Fcronograma","2.atividades\u002F01.cronograma",{"title":110,"path":111,"stem":112},"✏️ Atividade 01: Escopo e Personas","\u002Fatividades\u002Fatv-01-escopo","2.atividades\u002F02.atv-01-escopo",{"title":114,"path":115,"stem":116},"⚙️ Atividade 02: Processos de Software","\u002Fatividades\u002Fatv-02-processos","2.atividades\u002F03.atv-02-processos",{"title":118,"path":119,"stem":120},"📋 Atividade 03: Engenharia de Requisitos","\u002Fatividades\u002Fatv-03-requisitos","2.atividades\u002F04.atv-03-requisitos",{"title":122,"path":123,"stem":124},"📝 Atividade 04: User Stories e Backlog","\u002Fatividades\u002Fatv-04-backlog","2.atividades\u002F05.atv-04-backlog",{"title":126,"path":127,"stem":128},"🎭 Atividade 05: Casos de Uso (UML)","\u002Fatividades\u002Fatv-05-casos-uso","2.atividades\u002F06.atv-05-casos-uso",{"title":130,"path":131,"stem":132},"🖼️ Atividade 06: Prototipagem e Wireframes","\u002Fatividades\u002Fatv-06-prototipagem","2.atividades\u002F07.atv-06-prototipagem",{"title":134,"path":135,"stem":136},"🏛️ Atividade 07: Diagrama de Classes (UML)","\u002Fatividades\u002Fatv-07-classes","2.atividades\u002F08.atv-07-classes",{"title":138,"path":139,"stem":140},"🔀 Atividade 08: Diagrama de Sequência (UML)","\u002Fatividades\u002Fatv-08-sequencia","2.atividades\u002F09.atv-08-sequencia",{"title":142,"path":143,"stem":144},"🧪 Atividade 09: Qualidade e Testes","\u002Fatividades\u002Fatv-09-testes","2.atividades\u002F10.atv-09-testes",{"title":146,"path":147,"stem":148},"🏁 Atividade 10: Projeto Integrador Final","\u002Fatividades\u002Fatv-10-projeto-final","2.atividades\u002F11.atv-10-projeto-final",{"title":150,"path":151,"stem":152},"📊 Atividade 11: Diagrama de Atividades (UML)","\u002Fatividades\u002Fatv-11-atividades","2.atividades\u002F12.atv-11-atividades",{"title":154,"path":155,"stem":156},"🔄 Atividade 12: Diagrama de Transição de Estados (UML)","\u002Fatividades\u002Fatv-12-estados","2.atividades\u002F13.atv-12-estados",{"title":158,"path":159,"stem":160},"🏗️ Atividade 13: Arquitetura de Software e Padrões","\u002Fatividades\u002Fatv-13-arquitetura","2.atividades\u002F14.atv-13-arquitetura",{"title":162,"path":163,"stem":164},"🌐 Atividade 14: Modelagem de APIs REST e Swagger","\u002Fatividades\u002Fatv-14-apis-swagger","2.atividades\u002F15.atv-14-apis-swagger",{"title":166,"path":167,"stem":168},"🌿 Atividade 15: GitFlow e Trabalho Colaborativo","\u002Fatividades\u002Fatv-15-gitflow-colaboracao","2.atividades\u002F16.atv-15-gitflow-colaboracao",{"title":170,"path":171,"stem":172},"🚀 Atividade 16: Pipelines de CI\u002FCD com GitHub Actions","\u002Fatividades\u002Fatv-16-pipelines-cicd","2.atividades\u002F17.atv-16-pipelines-cicd",{"title":174,"path":175,"stem":176},"🐳 Atividade 17: Containerização de Ambientes com Docker","\u002Fatividades\u002Fatv-17-conteineres-docker","2.atividades\u002F18.atv-17-conteineres-docker",{"title":178,"path":179,"stem":180},"🔒 Atividade 18: Segurança no Desenvolvimento e OWASP","\u002Fatividades\u002Fatv-18-seguranca-devsecops","2.atividades\u002F19.atv-18-seguranca-devsecops",{"title":182,"path":183,"stem":184},"📈 Atividade 19: Métricas de Software, Estimativas e DORA","\u002Fatividades\u002Fatv-19-metricas-estimativas","2.atividades\u002F20.atv-19-metricas-estimativas",{"title":186,"path":187,"stem":188},"🏆 Atividade 20: Projeto Final Avançado (Fase 2)","\u002Fatividades\u002Fatv-20-projeto-final-avancado","2.atividades\u002F21.atv-20-projeto-final-avancado",{"title":190,"icon":191,"path":192,"stem":193,"children":194},"🖼️ Galeria de Projetos Integradores","i-lucide-image","\u002Fprojetos-integradores","3.projetos-integradores",[195,197,207,216,225,234,243],{"title":190,"path":192,"stem":196},"3.projetos-integradores\u002Findex",{"title":198,"path":199,"stem":200,"children":201},"🅿️ Projeto 01: Gestão de Estacionamentos","\u002Fprojetos-integradores\u002Fpi-01-gestao-estacionamentos","3.projetos-integradores\u002F01.pi-01-gestao-estacionamentos\u002Findex",[202,203],{"title":198,"path":199,"stem":200},{"title":204,"path":205,"stem":206},"README","\u002Fprojetos-integradores\u002Fpi-01-gestao-estacionamentos\u002Freadme","3.projetos-integradores\u002F01.pi-01-gestao-estacionamentos\u002F2.readme",{"title":208,"path":209,"stem":210,"children":211},"🔐 Projeto 02: Gerador de Senhas","\u002Fprojetos-integradores\u002Fpi-02-gerador-senhas","3.projetos-integradores\u002F02.pi-02-gerador-senhas\u002Findex",[212,213],{"title":208,"path":209,"stem":210},{"title":204,"path":214,"stem":215},"\u002Fprojetos-integradores\u002Fpi-02-gerador-senhas\u002Freadme","3.projetos-integradores\u002F02.pi-02-gerador-senhas\u002F2.readme",{"title":217,"path":218,"stem":219,"children":220},"🍣 Projeto 03: Pedidos Restaurante","\u002Fprojetos-integradores\u002Fpi-03-pedidos-restaurante","3.projetos-integradores\u002F03.pi-03-pedidos-restaurante\u002Findex",[221,222],{"title":217,"path":218,"stem":219},{"title":204,"path":223,"stem":224},"\u002Fprojetos-integradores\u002Fpi-03-pedidos-restaurante\u002Freadme","3.projetos-integradores\u002F03.pi-03-pedidos-restaurante\u002F2.readme",{"title":226,"path":227,"stem":228,"children":229},"📱 Projeto 04: Empréstimos Dispositivos","\u002Fprojetos-integradores\u002Fpi-04-emprestimos-dispositivos","3.projetos-integradores\u002F04.pi-04-emprestimos-dispositivos\u002Findex",[230,231],{"title":226,"path":227,"stem":228},{"title":204,"path":232,"stem":233},"\u002Fprojetos-integradores\u002Fpi-04-emprestimos-dispositivos\u002Freadme","3.projetos-integradores\u002F04.pi-04-emprestimos-dispositivos\u002F2.readme",{"title":235,"path":236,"stem":237,"children":238},"📦 Projeto 05: Gestão de Estoque","\u002Fprojetos-integradores\u002Fpi-05-gestao-estoque","3.projetos-integradores\u002F05.pi-05-gestao-estoque\u002Findex",[239,240],{"title":235,"path":236,"stem":237},{"title":204,"path":241,"stem":242},"\u002Fprojetos-integradores\u002Fpi-05-gestao-estoque\u002Freadme","3.projetos-integradores\u002F05.pi-05-gestao-estoque\u002F2.readme",{"title":244,"path":245,"stem":246,"children":247},"🛵 Projeto 06: Aplicativo de Delivery","\u002Fprojetos-integradores\u002Fpi-06-delivery","3.projetos-integradores\u002F06.pi-06-delivery\u002Findex",[248,249],{"title":244,"path":245,"stem":246},{"title":204,"path":250,"stem":251},"\u002Fprojetos-integradores\u002Fpi-06-delivery\u002Freadme","3.projetos-integradores\u002F06.pi-06-delivery\u002F2.readme",{"id":253,"title":226,"body":254,"description":953,"extension":1705,"links":1706,"meta":1707,"navigation":981,"path":227,"seo":1708,"stem":228,"__hash__":1709},"docs\u002F3.projetos-integradores\u002F04.pi-04-emprestimos-dispositivos\u002Findex.md",{"type":255,"value":256,"toc":1667},"minimark",[257,311,314,344,355,358,374,379,381,385,549,551,555,568,575,579,583,594,598,609,634,638,641,665,669,680,682,686,690,729,733,757,761,768,837,841,868,873,913,919,921,925,932,936,947,1176,1180,1199,1362,1371,1373,1377,1381,1384,1389,1416,1421,1447,1451,1454,1480,1484,1487,1606,1608,1612,1615,1619,1622,1626,1635,1639,1642,1645,1649,1652,1655,1658,1663],[258,259,261,262,261,267,270,272,274,276,278,280,261,282,261,287,261,292,294,296,298,300,302,304,261,306],"div",{"align":260},"center","\n  ",[263,264,266],"h3",{"id":265},"projeto-integrador","PROJETO INTEGRADOR",[268,269],"br",{},[268,271],{},[268,273],{},[268,275],{},[268,277],{},[268,279],{},[268,281],{},[283,284,286],"h1",{"id":285},"projeto-integrador-controle-de-fluxo-de-dispositivos-eletrônicos","PROJETO INTEGRADOR: CONTROLE DE FLUXO DE DISPOSITIVOS ELETRÔNICOS",[288,289,291],"h2",{"id":290},"sistema-híbrido-de-rastreamento-de-ativos-de-ti","Sistema Híbrido de Rastreamento de Ativos de TI",[268,293],{},[268,295],{},[268,297],{},[268,299],{},[268,301],{},[268,303],{},[268,305],{},[307,308,310],"h4",{"id":309},"_2026","2026",[258,312],{"style":313},"page-break-after: always;",[258,315,261,316,261,320,322,324,326,328,330,332,261,334,261,337,261,340,342],{"align":260},[263,317,319],{"id":318},"autores-do-projeto","AUTORES DO PROJETO",[268,321],{},[268,323],{},[268,325],{},[268,327],{},[268,329],{},[268,331],{},[268,333],{},[283,335,286],{"id":336},"projeto-integrador-controle-de-fluxo-de-dispositivos-eletrônicos-1",[288,338,291],{"id":339},"sistema-híbrido-de-rastreamento-de-ativos-de-ti-1",[268,341],{},[268,343],{},[258,345,261,347],{"align":346},"right",[258,348,350,351,261],{"style":349},"width: 50%; float: right; text-align: justify; font-size: 14px;","\n    ",[352,353,354],"p",{},"Documentação técnica do Projeto Integrador, desenvolvida como parte dos requisitos de avaliação nas disciplinas de Engenharia de Software e Banco de Dados.",[258,356],{"style":357},"clear: both;",[352,359,360,362,364,366,368,370,372],{},[268,361],{},[268,363],{},[268,365],{},[268,367],{},[268,369],{},[268,371],{},[268,373],{},[258,375,261,376],{"align":260},[307,377,310],{"id":378},"_2026-1",[258,380],{"style":313},[288,382,384],{"id":383},"sumário","Sumário",[386,387,388,396,433,469,491,520],"ol",{},[389,390,391],"li",{},[392,393,395],"a",{"href":394},"#1-introdu%C3%A7%C3%A3o","Introdução",[389,397,398,402],{},[392,399,401],{"href":400},"#2-fundamenta%C3%A7%C3%A3o-te%C3%B3rica","Fundamentação Teórica",[403,404,405,412,419,426],"ul",{},[389,406,407,408],{},"2.1. ",[392,409,411],{"href":410},"#21-o-desafio-na-gest%C3%A3o-de-ativos-de-ti","O Desafio na Gestão de Ativos de TI",[389,413,414,415],{},"2.2. ",[392,416,418],{"href":417},"#22-persist%C3%AAncia-local-web-storage-api-vs-centralizada-sgbd","Persistência Local (Web Storage API) vs. Centralizada (SGBD)",[389,420,421,422],{},"2.3. ",[392,423,425],{"href":424},"#23-rastreabilidade-e-preven%C3%A7%C3%A3o-de-perdas","Rastreabilidade e Prevenção de Perdas",[389,427,428,429],{},"2.4. ",[392,430,432],{"href":431},"#24-seguran%C3%A7a-no-armazenamento-de-hist%C3%B3ricos","Segurança no Armazenamento de Históricos",[389,434,435,439],{},[392,436,438],{"href":437},"#3-engenharia-de-software","Engenharia de Software",[403,440,441,448,455,462],{},[389,442,443,444],{},"3.1. ",[392,445,447],{"href":446},"#31-requisitos-funcionais-rf","Requisitos Funcionais (RF)",[389,449,450,451],{},"3.2. ",[392,452,454],{"href":453},"#32-requisitos-n%C3%A3o-funcionais-rnf","Requisitos Não Funcionais (RNF)",[389,456,457,458],{},"3.3. ",[392,459,461],{"href":460},"#33-orienta%C3%A7%C3%A3o-a-objetos-na-arquitetura-do-sistema","Orientação a Objetos na Arquitetura do Sistema",[389,463,464,465],{},"3.4. ",[392,466,468],{"href":467},"#34-caso-de-uso-principal-uc-01","Caso de Uso Principal (UC-01)",[389,470,471,475],{},[392,472,474],{"href":473},"#4-banco-de-dados-mysql","Banco de Dados (MySQL)",[403,476,477,484],{},[389,478,479,480],{},"4.1. ",[392,481,483],{"href":482},"#41-modelagem-relacional-e-script-ddl","Modelagem Relacional e Script DDL",[389,485,486,487],{},"4.2. ",[392,488,490],{"href":489},"#42-consultas-complexas-e-relat%C3%B3rios-de-fluxo-dml","Consultas Complexas e Relatórios de Fluxo (DML)",[389,492,493,497],{},[392,494,496],{"href":495},"#5-gest%C3%A3o-seguran%C3%A7a-e-lgpd","Gestão, Segurança e LGPD",[403,498,499,506,513],{},[389,500,501,502],{},"5.1. ",[392,503,505],{"href":504},"#51-backlog-e-hist%C3%B3rias-de-usu%C3%A1rio-padr%C3%A3o-invest","Backlog e Histórias de Usuário (Padrão INVEST)",[389,507,508,509],{},"5.2. ",[392,510,512],{"href":511},"#52-conformidade-com-a-lgpd-e-privacy-by-design","Conformidade com a LGPD e Privacy by Design",[389,514,515,516],{},"5.3. ",[392,517,519],{"href":518},"#53-cronograma-do-projeto","Cronograma do Projeto",[389,521,522,526],{},[392,523,525],{"href":524},"#6-diagramas-de-visualiza%C3%A7%C3%A3o","Diagramas de Visualização",[403,527,528,535,542],{},[389,529,530,531],{},"6.1. ",[392,532,534],{"href":533},"#61-diagrama-de-casos-de-uso","Diagrama de Casos de Uso",[389,536,537,538],{},"6.2. ",[392,539,541],{"href":540},"#62-diagrama-de-classes","Diagrama de Classes",[389,543,544,545],{},"6.3. ",[392,546,548],{"href":547},"#63-diagrama-de-entidade-relacionamento-der","Diagrama de Entidade-Relacionamento (DER)",[258,550],{"style":313},[288,552,554],{"id":553},"_1-introdução","1. Introdução",[352,556,557,558,562,563,567],{},"No ambiente corporativo e acadêmico moderno, a rotatividade de equipamentos tecnológicos (notebooks, tablets, projetores e periféricos) atinge volumes substanciais. A gestão inadequada desses ativos frequentemente resulta em equipamentos perdidos, subutilizados ou danificados sem que haja rastreabilidade do responsável. Para mitigar esse problema, o Projeto Integrador ",[559,560,561],"strong",{},"Controle de Fluxo de Dispositivos Eletrônicos",", desenvolvido como projeto acadêmico (2026), propõe uma arquitetura de software focada na agilidade do ",[564,565,566],"em",{},"front-end"," e na consistência dos registros em banco de dados.",[352,569,570,571,574],{},"O projeto foi delineado inicialmente utilizando tecnologias de persistência local (",[564,572,573],{},"localStorage",") para garantir operação off-line e extrema responsividade em dispositivos móveis da equipe técnica. Contudo, para atender às políticas de auditoria institucional, a arquitetura evoluiu para contemplar um sincronismo com um Banco de Dados Relacional (MySQL). Este documento descreve minuciosamente os padrões arquiteturais, modelagem de dados, diagramação orientada a objetos e conformidade legal que alicerçam a solução de inventário.",[288,576,578],{"id":577},"_2-fundamentação-teórica","2. Fundamentação Teórica",[263,580,582],{"id":581},"_21-o-desafio-na-gestão-de-ativos-de-ti","2.1. O Desafio na Gestão de Ativos de TI",[352,584,585,586,589,590,593],{},"Controlar equipamentos eletrônicos de uso compartilhado requer um equilíbrio delicado entre segurança (evitar furtos e extravios) e disponibilidade (garantir que o colaborador acesse a ferramenta quando precisar). Planilhas não padronizadas ou controles baseados em assinaturas de papel dificultam a visão global do inventário (o ",[564,587,588],{},"Dashboard","), impedindo que os gestores saibam, em tempo real, quantos equipamentos estão disponíveis no estoque ",[564,591,592],{},"versus"," quantos estão em posse de terceiros.",[263,595,597],{"id":596},"_22-persistência-local-web-storage-api-vs-centralizada-sgbd","2.2. Persistência Local (Web Storage API) vs. Centralizada (SGBD)",[352,599,600,601,604,605,608],{},"O projeto inova ao propor uma arquitetura híbrida. A camada de apresentação faz uso massivo da API ",[602,603,573],"code",{}," do HTML5. Esta tecnologia permite armazenar pares de chave-valor diretamente no navegador do operador de TI. A grande vantagem acadêmica e prática dessa abordagem é o ",[559,606,607],{},"Tempo de Resposta (Zero Latência)",": registrar a saída de um dispositivo ocorre instantaneamente, sem bloqueios de rede.",[352,610,611,612,615,616,619,620,623,624,626,627,629,630,633],{},"No entanto, sistemas de auditoria exigem que os dados não fiquem restritos ao disco rígido de um único terminal. Portanto, a teoria de sistemas distribuídos aplicada a este projeto compreende um serviço ",[564,613,614],{},"Worker"," em ",[564,617,618],{},"background"," que lê as ",[564,621,622],{},"strings"," JSON armazenadas no ",[602,625,573],{}," e realiza a sincronização transacional para um servidor centralizado hospedado em MySQL, unindo o melhor da portabilidade ",[564,628,566],{}," com a integridade relacional do ",[564,631,632],{},"back-end",".",[263,635,637],{"id":636},"_23-rastreabilidade-e-prevenção-de-perdas","2.3. Rastreabilidade e Prevenção de Perdas",[352,639,640],{},"Para a rastreabilidade efetiva, o sistema exige três fatores fundamentais para registrar uma movimentação (Fluxo de Saída):",[386,642,643,649,655],{},[389,644,645,648],{},[559,646,647],{},"O quê:"," O Ativo (identificado por MAC Address, Patrimônio ou Número de Série).",[389,650,651,654],{},[559,652,653],{},"Para quem:"," O Colaborador\u002FAluno responsável pela custódia temporária.",[389,656,657,660,661,664],{},[559,658,659],{},"Quando:"," O ",[564,662,663],{},"Timestamp"," exato (carimbo de data\u002Fhora) do evento.\nEssa tríade gera um log imutável de responsabilidade, dissuadindo o mau uso e acelerando a recuperação do dispositivo em caso de não devolução.",[263,666,668],{"id":667},"_24-segurança-no-armazenamento-de-históricos","2.4. Segurança no Armazenamento de Históricos",[352,670,671,672,675,676,679],{},"Assim como a manipulação de credenciais exige cuidados (conforme teorias de criptografia e Hashing), a manipulação do inventário exige garantias contra falsificação de dados. Um operador não pode ser capaz de excluir um log de empréstimo para encobrir a perda de um equipamento. Para isso, o banco de dados implementa restrições (Constraints) onde históricos de transação (",[564,673,674],{},"Logs",") são inseridos de modo ",[564,677,678],{},"Append-Only"," (apenas inserção), e exclusões lógicas são feitas apenas através de estornos autorizados, mantendo a trilha de auditoria intacta.",[258,681],{"style":313},[288,683,685],{"id":684},"_3-engenharia-de-software","3. Engenharia de Software",[263,687,689],{"id":688},"_31-requisitos-funcionais-rf","3.1. Requisitos Funcionais (RF)",[386,691,692,698,704,714,723],{},[389,693,694,697],{},[559,695,696],{},"RF-001 | Dashboard Analítico:"," O sistema deve exibir um painel principal que consolide o total de dispositivos registrados, entradas do dia, saídas pendentes de devolução e o saldo atualizado de equipamentos no almoxarifado.",[389,699,700,703],{},[559,701,702],{},"RF-002 | Registro de Movimentação:"," O sistema deve permitir o registro de Entrada (recebimento\u002Fdevolução) e Saída (empréstimo\u002Fdespacho) atrelando um responsável, equipamento e quantidade.",[389,705,706,709,710,713],{},[559,707,708],{},"RF-003 | Histórico Cronológico:"," O sistema deve listar todas as movimentações ocorridas em formato de ",[564,711,712],{},"Timeline",", permitindo filtros por data ou responsável.",[389,715,716,722],{},[559,717,718,719,721],{},"RF-004 | Persistência Off-line (",[602,720,573],{},"):"," O sistema deve gravar o registro imediatamente no navegador para garantir operação caso haja instabilidade de rede.",[389,724,725,728],{},[559,726,727],{},"RF-005 | Sincronização em Nuvem (MySQL):"," O sistema deve sincronizar os dados do armazenamento local com o banco de dados central assim que uma conexão segura for detectada.",[263,730,732],{"id":731},"_32-requisitos-não-funcionais-rnf","3.2. Requisitos Não Funcionais (RNF)",[386,734,735,745,751],{},[389,736,737,740,741,744],{},[559,738,739],{},"RNF-001 (Usabilidade):"," A interface deve ser desenvolvida em padrão ",[564,742,743],{},"Mobile-First",", permitindo que técnicos pelo galpão utilizem tablets para ler códigos de barras e registrar o fluxo.",[389,746,747,750],{},[559,748,749],{},"RNF-002 (Confiabilidade e Integridade):"," O saldo (estoque) não pode sofrer inconsistências, como resultar em valor negativo. Operações de saída de equipamentos não disponíveis no saldo devem ser bloqueadas.",[389,752,753,756],{},[559,754,755],{},"RNF-003 (Portabilidade):"," Por não depender de instalação de executáveis, o sistema deve rodar em navegadores Chrome, Edge e Safari de forma idêntica.",[263,758,760],{"id":759},"_33-orientação-a-objetos-na-arquitetura-do-sistema","3.3. Orientação a Objetos na Arquitetura do Sistema",[352,762,763,764,767],{},"Os princípios de Orientação a Objetos (OO) foram aplicados tanto no mapeamento das estruturas JavaScript (",[564,765,766],{},"ES6 Classes",") quanto na camada lógica de integração:",[403,769,770,801,823],{},[389,771,772,775,776,779,780,783,784,783,787,790,791,794,795,798,799,633],{},[559,773,774],{},"Abstração:"," O conceito de \"Dispositivo\" foi abstraído em uma classe abstrata ",[602,777,778],{},"Ativo",". As características complexas (especificações de hardware) foram ocultadas, destacando-se apenas atributos de controle (",[602,781,782],{},"numeroPatrimonio",", ",[602,785,786],{},"categoria",[602,788,789],{},"status","). Classes derivadas como ",[602,792,793],{},"Laptop"," ou ",[602,796,797],{},"Projetor"," estendem o ",[602,800,778],{},[389,802,803,806,807,810,811,814,815,818,819,822],{},[559,804,805],{},"Encapsulamento:"," No módulo responsável pela manipulação do ",[564,808,809],{},"Storage",", os métodos de escrita direta (como ",[602,812,813],{},"localStorage.setItem()",") são isolados (privados) dentro de uma classe ",[602,816,817],{},"StorageRepository",". O resto da aplicação invoca métodos seguros como ",[602,820,821],{},"repository.salvarMovimentacao()",". Essa classe garante que o objeto seja validado e serializado (JSON.stringify) antes da gravação.",[389,824,825,828,829,832,833,836],{},[559,826,827],{},"Polimorfismo:"," Na geração de comprovantes de empréstimo, a interface ",[602,830,831],{},"IComprovante"," permite que métodos polimórficos gerem diferentes saídas: a função ",[602,834,835],{},"exportar()"," pode agir de forma polimórfica para gerar um PDF ou enviar um E-mail dependendo da classe concreta instanciada, sem que o controlador precise saber a lógica de exportação.",[263,838,840],{"id":839},"_34-caso-de-uso-principal-uc-01","3.4. Caso de Uso Principal (UC-01)",[352,842,843,846,847,849,852,853,855,858,859,861,864,865,867],{},[559,844,845],{},"Identificador:"," UC-01",[268,848],{},[559,850,851],{},"Nome:"," Registrar Saída (Empréstimo) de Dispositivo",[268,854],{},[559,856,857],{},"Ator Principal:"," Técnico de Suporte (Almoxarifado)",[268,860],{},[559,862,863],{},"Pré-condição:"," O equipamento deve estar com ",[602,866,789],{}," \"DISPONIVEL\" no estoque.",[352,869,870],{},[559,871,872],{},"Fluxo Principal:",[386,874,875,878,885,888,891,894,897,903,910],{},[389,876,877],{},"O Técnico seleciona a ação \"Nova Saída\" no Dashboard.",[389,879,880,881,884],{},"O Técnico digita (ou lê com scanner) a ",[564,882,883],{},"Tag"," Patrimonial do Equipamento.",[389,886,887],{},"O sistema valida se o equipamento encontra-se disponível.",[389,889,890],{},"O Técnico informa a Matrícula\u002FNome do Responsável que receberá o dispositivo.",[389,892,893],{},"O Técnico confirma a operação.",[389,895,896],{},"O sistema deduz 1 unidade do Saldo Geral de Ativos.",[389,898,899,900,902],{},"O sistema cria um registro JSON na API ",[602,901,573],{}," contendo Timestamp e dados do fluxo.",[389,904,905,906,909],{},"O sistema (em background) realiza um ",[602,907,908],{},"POST"," para a API central (Sincronização BD).",[389,911,912],{},"O Dashboard é atualizado em tempo real exibindo a nova métrica.",[352,914,915,918],{},[559,916,917],{},"Fluxo de Exceção 1 (Ativo não Disponível):","\nSe no Passo 3 o dispositivo constar como \"EMPRESTADO\" ou \"MANUTENÇÃO\", o sistema aborta o registro e exibe a mensagem de erro na interface: \"Ativo não se encontra no estoque para liberação\". O evento é cancelado.",[258,920],{"style":313},[288,922,924],{"id":923},"_4-banco-de-dados-mysql","4. Banco de Dados (MySQL)",[352,926,927,928,931],{},"Embora a camada de interface utilize armazenamento local, o rigor de um projeto corporativo exige uma fonte central de verdade (",[564,929,930],{},"Single Source of Truth","). O banco relacional MySQL gerencia as restrições e históricos oficiais.",[263,933,935],{"id":934},"_41-modelagem-relacional-e-script-ddl","4.1. Modelagem Relacional e Script DDL",[352,937,938,939,942,943,946],{},"O script DDL (",[564,940,941],{},"Data Definition Language",") cria as tabelas de controle, aplicando Chaves Estrangeiras (FK) para relacionar os ativos aos responsáveis. Utilizou-se ",[602,944,945],{},"VARBINARY"," ou encriptação em campos sensíveis quando aplicável (por exemplo, informações confidenciais associadas a diretoria).",[948,949,954],"pre",{"className":950,"code":951,"language":952,"meta":953,"style":953},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- Criação do Schema Central\nCREATE DATABASE IF NOT EXISTS db_fluxo_dispositivos\nCHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n\nUSE db_fluxo_dispositivos;\n\n-- Tabela de Responsáveis (Colaboradores\u002FAlunos)\nCREATE TABLE IF NOT EXISTS tbl_responsaveis (\n    id_responsavel INT AUTO_INCREMENT PRIMARY KEY,\n    matricula VARCHAR(20) NOT NULL UNIQUE,\n    nome_completo VARCHAR(100) NOT NULL,\n    departamento VARCHAR(50),\n    data_cadastro DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Tabela de Dispositivos (Inventário)\nCREATE TABLE IF NOT EXISTS tbl_dispositivos (\n    id_dispositivo INT AUTO_INCREMENT PRIMARY KEY,\n    numero_patrimonio VARCHAR(50) NOT NULL UNIQUE,\n    modelo VARCHAR(100) NOT NULL,\n    categoria ENUM('NOTEBOOK', 'TABLET', 'PROJETOR', 'PERIFERICO') NOT NULL,\n    status_atual ENUM('DISPONIVEL', 'EMPRESTADO', 'MANUTENCAO', 'BAIXA') DEFAULT 'DISPONIVEL',\n    detalhes_sensiveis VARBINARY(500) COMMENT 'Armazena notas fiscais ou chaves de licença cifradas'\n);\n\n-- Tabela Transacional de Fluxo (Log de Empréstimos)\nCREATE TABLE IF NOT EXISTS tbl_fluxo_movimentacao (\n    id_movimentacao INT AUTO_INCREMENT PRIMARY KEY,\n    id_dispositivo INT NOT NULL,\n    id_responsavel INT NOT NULL,\n    tipo_movimentacao ENUM('SAIDA', 'ENTRADA') NOT NULL,\n    data_evento DATETIME DEFAULT CURRENT_TIMESTAMP,\n    observacao VARCHAR(255),\n    id_usuario_operador INT NOT NULL COMMENT 'O técnico que liberou o ativo',\n    FOREIGN KEY (id_dispositivo) REFERENCES tbl_dispositivos(id_dispositivo) ON DELETE RESTRICT,\n    FOREIGN KEY (id_responsavel) REFERENCES tbl_responsaveis(id_responsavel) ON DELETE RESTRICT\n);\n","sql","",[602,955,956,964,970,976,983,989,994,1000,1006,1012,1018,1024,1030,1036,1042,1047,1053,1059,1065,1071,1077,1083,1089,1095,1100,1105,1111,1117,1123,1129,1135,1141,1147,1153,1159,1165,1171],{"__ignoreMap":953},[957,958,961],"span",{"class":959,"line":960},"line",1,[957,962,963],{},"-- Criação do Schema Central\n",[957,965,967],{"class":959,"line":966},2,[957,968,969],{},"CREATE DATABASE IF NOT EXISTS db_fluxo_dispositivos\n",[957,971,973],{"class":959,"line":972},3,[957,974,975],{},"CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n",[957,977,979],{"class":959,"line":978},4,[957,980,982],{"emptyLinePlaceholder":981},true,"\n",[957,984,986],{"class":959,"line":985},5,[957,987,988],{},"USE db_fluxo_dispositivos;\n",[957,990,992],{"class":959,"line":991},6,[957,993,982],{"emptyLinePlaceholder":981},[957,995,997],{"class":959,"line":996},7,[957,998,999],{},"-- Tabela de Responsáveis (Colaboradores\u002FAlunos)\n",[957,1001,1003],{"class":959,"line":1002},8,[957,1004,1005],{},"CREATE TABLE IF NOT EXISTS tbl_responsaveis (\n",[957,1007,1009],{"class":959,"line":1008},9,[957,1010,1011],{},"    id_responsavel INT AUTO_INCREMENT PRIMARY KEY,\n",[957,1013,1015],{"class":959,"line":1014},10,[957,1016,1017],{},"    matricula VARCHAR(20) NOT NULL UNIQUE,\n",[957,1019,1021],{"class":959,"line":1020},11,[957,1022,1023],{},"    nome_completo VARCHAR(100) NOT NULL,\n",[957,1025,1027],{"class":959,"line":1026},12,[957,1028,1029],{},"    departamento VARCHAR(50),\n",[957,1031,1033],{"class":959,"line":1032},13,[957,1034,1035],{},"    data_cadastro DATETIME DEFAULT CURRENT_TIMESTAMP\n",[957,1037,1039],{"class":959,"line":1038},14,[957,1040,1041],{},");\n",[957,1043,1045],{"class":959,"line":1044},15,[957,1046,982],{"emptyLinePlaceholder":981},[957,1048,1050],{"class":959,"line":1049},16,[957,1051,1052],{},"-- Tabela de Dispositivos (Inventário)\n",[957,1054,1056],{"class":959,"line":1055},17,[957,1057,1058],{},"CREATE TABLE IF NOT EXISTS tbl_dispositivos (\n",[957,1060,1062],{"class":959,"line":1061},18,[957,1063,1064],{},"    id_dispositivo INT AUTO_INCREMENT PRIMARY KEY,\n",[957,1066,1068],{"class":959,"line":1067},19,[957,1069,1070],{},"    numero_patrimonio VARCHAR(50) NOT NULL UNIQUE,\n",[957,1072,1074],{"class":959,"line":1073},20,[957,1075,1076],{},"    modelo VARCHAR(100) NOT NULL,\n",[957,1078,1080],{"class":959,"line":1079},21,[957,1081,1082],{},"    categoria ENUM('NOTEBOOK', 'TABLET', 'PROJETOR', 'PERIFERICO') NOT NULL,\n",[957,1084,1086],{"class":959,"line":1085},22,[957,1087,1088],{},"    status_atual ENUM('DISPONIVEL', 'EMPRESTADO', 'MANUTENCAO', 'BAIXA') DEFAULT 'DISPONIVEL',\n",[957,1090,1092],{"class":959,"line":1091},23,[957,1093,1094],{},"    detalhes_sensiveis VARBINARY(500) COMMENT 'Armazena notas fiscais ou chaves de licença cifradas'\n",[957,1096,1098],{"class":959,"line":1097},24,[957,1099,1041],{},[957,1101,1103],{"class":959,"line":1102},25,[957,1104,982],{"emptyLinePlaceholder":981},[957,1106,1108],{"class":959,"line":1107},26,[957,1109,1110],{},"-- Tabela Transacional de Fluxo (Log de Empréstimos)\n",[957,1112,1114],{"class":959,"line":1113},27,[957,1115,1116],{},"CREATE TABLE IF NOT EXISTS tbl_fluxo_movimentacao (\n",[957,1118,1120],{"class":959,"line":1119},28,[957,1121,1122],{},"    id_movimentacao INT AUTO_INCREMENT PRIMARY KEY,\n",[957,1124,1126],{"class":959,"line":1125},29,[957,1127,1128],{},"    id_dispositivo INT NOT NULL,\n",[957,1130,1132],{"class":959,"line":1131},30,[957,1133,1134],{},"    id_responsavel INT NOT NULL,\n",[957,1136,1138],{"class":959,"line":1137},31,[957,1139,1140],{},"    tipo_movimentacao ENUM('SAIDA', 'ENTRADA') NOT NULL,\n",[957,1142,1144],{"class":959,"line":1143},32,[957,1145,1146],{},"    data_evento DATETIME DEFAULT CURRENT_TIMESTAMP,\n",[957,1148,1150],{"class":959,"line":1149},33,[957,1151,1152],{},"    observacao VARCHAR(255),\n",[957,1154,1156],{"class":959,"line":1155},34,[957,1157,1158],{},"    id_usuario_operador INT NOT NULL COMMENT 'O técnico que liberou o ativo',\n",[957,1160,1162],{"class":959,"line":1161},35,[957,1163,1164],{},"    FOREIGN KEY (id_dispositivo) REFERENCES tbl_dispositivos(id_dispositivo) ON DELETE RESTRICT,\n",[957,1166,1168],{"class":959,"line":1167},36,[957,1169,1170],{},"    FOREIGN KEY (id_responsavel) REFERENCES tbl_responsaveis(id_responsavel) ON DELETE RESTRICT\n",[957,1172,1174],{"class":959,"line":1173},37,[957,1175,1041],{},[263,1177,1179],{"id":1178},"_42-consultas-complexas-e-relatórios-de-fluxo-dml","4.2. Consultas Complexas e Relatórios de Fluxo (DML)",[352,1181,1182,1183,1186,1187,1190,1191,1194,1195,1198],{},"A query avançada abaixo demonstra a capacidade de gerar relatórios de auditoria, cruzando tabelas (",[602,1184,1185],{},"INNER JOIN","), agrupando resultados (",[602,1188,1189],{},"GROUP BY","), e filtrando registros (",[602,1192,1193],{},"HAVING"," e ",[602,1196,1197],{},"DATE_SUB","). Este relatório levanta os colaboradores que mais requisitaram notebooks nos últimos 6 meses e ainda possuem equipamentos pendentes de devolução, indicando potencial desvio ou retenção indevida.",[948,1200,1202],{"className":950,"code":1201,"language":952,"meta":953,"style":953},"-- Relatório de Auditoria: Retenção de Dispositivos nos últimos 6 Meses\nSELECT \n    R.nome_completo AS 'Responsável',\n    R.departamento AS 'Departamento',\n    D.categoria AS 'Tipo_Equipamento',\n    COUNT(M.id_movimentacao) AS 'Total_Emprestimos_Realizados',\n    MAX(M.data_evento) AS 'Última_Retirada',\n    (SELECT COUNT(*) \n     FROM tbl_fluxo_movimentacao M2 \n     WHERE M2.id_responsavel = R.id_responsavel \n       AND M2.tipo_movimentacao = 'SAIDA') - \n    (SELECT COUNT(*) \n     FROM tbl_fluxo_movimentacao M3 \n     WHERE M3.id_responsavel = R.id_responsavel \n       AND M3.tipo_movimentacao = 'ENTRADA') AS 'Saldo_Retido_Pendente'\nFROM \n    tbl_responsaveis R\nINNER JOIN \n    tbl_fluxo_movimentacao M ON R.id_responsavel = M.id_responsavel\nINNER JOIN \n    tbl_dispositivos D ON M.id_dispositivo = D.id_dispositivo\nWHERE \n    M.tipo_movimentacao = 'SAIDA'\n    AND M.data_evento >= DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH)\n    AND D.categoria IN ('NOTEBOOK', 'TABLET')\nGROUP BY \n    R.id_responsavel, R.nome_completo, R.departamento, D.categoria\nHAVING \n    'Saldo_Retido_Pendente' > 0\nORDER BY \n    'Saldo_Retido_Pendente' DESC, \n    'Total_Emprestimos_Realizados' DESC;\n",[602,1203,1204,1209,1214,1219,1224,1229,1234,1239,1244,1249,1254,1259,1263,1268,1273,1278,1283,1288,1293,1298,1302,1307,1312,1317,1322,1327,1332,1337,1342,1347,1352,1357],{"__ignoreMap":953},[957,1205,1206],{"class":959,"line":960},[957,1207,1208],{},"-- Relatório de Auditoria: Retenção de Dispositivos nos últimos 6 Meses\n",[957,1210,1211],{"class":959,"line":966},[957,1212,1213],{},"SELECT \n",[957,1215,1216],{"class":959,"line":972},[957,1217,1218],{},"    R.nome_completo AS 'Responsável',\n",[957,1220,1221],{"class":959,"line":978},[957,1222,1223],{},"    R.departamento AS 'Departamento',\n",[957,1225,1226],{"class":959,"line":985},[957,1227,1228],{},"    D.categoria AS 'Tipo_Equipamento',\n",[957,1230,1231],{"class":959,"line":991},[957,1232,1233],{},"    COUNT(M.id_movimentacao) AS 'Total_Emprestimos_Realizados',\n",[957,1235,1236],{"class":959,"line":996},[957,1237,1238],{},"    MAX(M.data_evento) AS 'Última_Retirada',\n",[957,1240,1241],{"class":959,"line":1002},[957,1242,1243],{},"    (SELECT COUNT(*) \n",[957,1245,1246],{"class":959,"line":1008},[957,1247,1248],{},"     FROM tbl_fluxo_movimentacao M2 \n",[957,1250,1251],{"class":959,"line":1014},[957,1252,1253],{},"     WHERE M2.id_responsavel = R.id_responsavel \n",[957,1255,1256],{"class":959,"line":1020},[957,1257,1258],{},"       AND M2.tipo_movimentacao = 'SAIDA') - \n",[957,1260,1261],{"class":959,"line":1026},[957,1262,1243],{},[957,1264,1265],{"class":959,"line":1032},[957,1266,1267],{},"     FROM tbl_fluxo_movimentacao M3 \n",[957,1269,1270],{"class":959,"line":1038},[957,1271,1272],{},"     WHERE M3.id_responsavel = R.id_responsavel \n",[957,1274,1275],{"class":959,"line":1044},[957,1276,1277],{},"       AND M3.tipo_movimentacao = 'ENTRADA') AS 'Saldo_Retido_Pendente'\n",[957,1279,1280],{"class":959,"line":1049},[957,1281,1282],{},"FROM \n",[957,1284,1285],{"class":959,"line":1055},[957,1286,1287],{},"    tbl_responsaveis R\n",[957,1289,1290],{"class":959,"line":1061},[957,1291,1292],{},"INNER JOIN \n",[957,1294,1295],{"class":959,"line":1067},[957,1296,1297],{},"    tbl_fluxo_movimentacao M ON R.id_responsavel = M.id_responsavel\n",[957,1299,1300],{"class":959,"line":1073},[957,1301,1292],{},[957,1303,1304],{"class":959,"line":1079},[957,1305,1306],{},"    tbl_dispositivos D ON M.id_dispositivo = D.id_dispositivo\n",[957,1308,1309],{"class":959,"line":1085},[957,1310,1311],{},"WHERE \n",[957,1313,1314],{"class":959,"line":1091},[957,1315,1316],{},"    M.tipo_movimentacao = 'SAIDA'\n",[957,1318,1319],{"class":959,"line":1097},[957,1320,1321],{},"    AND M.data_evento >= DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH)\n",[957,1323,1324],{"class":959,"line":1102},[957,1325,1326],{},"    AND D.categoria IN ('NOTEBOOK', 'TABLET')\n",[957,1328,1329],{"class":959,"line":1107},[957,1330,1331],{},"GROUP BY \n",[957,1333,1334],{"class":959,"line":1113},[957,1335,1336],{},"    R.id_responsavel, R.nome_completo, R.departamento, D.categoria\n",[957,1338,1339],{"class":959,"line":1119},[957,1340,1341],{},"HAVING \n",[957,1343,1344],{"class":959,"line":1125},[957,1345,1346],{},"    'Saldo_Retido_Pendente' > 0\n",[957,1348,1349],{"class":959,"line":1131},[957,1350,1351],{},"ORDER BY \n",[957,1353,1354],{"class":959,"line":1137},[957,1355,1356],{},"    'Saldo_Retido_Pendente' DESC, \n",[957,1358,1359],{"class":959,"line":1143},[957,1360,1361],{},"    'Total_Emprestimos_Realizados' DESC;\n",[352,1363,1364],{},[564,1365,1366,1367,1370],{},"Justificativa Técnica: O uso de subqueries no ",[602,1368,1369],{},"SELECT"," permite calcular o saldo dinâmico de equipamentos não devolvidos subtraindo entradas de saídas por usuário. O filtro retroage meio ano para foco em auditorias de inventário semestral exigidas em governança de TI.",[258,1372],{"style":313},[288,1374,1376],{"id":1375},"_5-gestão-segurança-e-lgpd","5. Gestão, Segurança e LGPD",[263,1378,1380],{"id":1379},"_51-backlog-e-histórias-de-usuário-padrão-invest","5.1. Backlog e Histórias de Usuário (Padrão INVEST)",[352,1382,1383],{},"O controle do projeto seguiu diretrizes ágeis, mapeando o produto através de Histórias de Usuário mensuráveis.",[352,1385,1386],{},[559,1387,1388],{},"História de Usuário 01 - Sincronização em Background",[1390,1391,1392],"blockquote",{},[352,1393,1394,1397,1398,1400,1403,1404,1406,1409,1410,1412,1415],{},[559,1395,1396],{},"Como"," um Operador de TI que trabalha em áreas sem Wi-Fi (como garagens\u002Fgalpões),",[268,1399],{},[559,1401,1402],{},"Eu quero"," poder registrar a saída de equipamentos off-line (via localStorage),",[268,1405],{},[559,1407,1408],{},"Para que"," o sistema sincronize os dados com o banco MySQL automaticamente quando a internet voltar.",[268,1411],{},[564,1413,1414],{},"Critérios de Aceite:"," O sistema não deve travar se a requisição AJAX falhar; os registros off-line devem exibir um ícone \"Aguardando Sincronismo\"; após o retorno do Wi-Fi, o Service Worker deve enviar os dados em lote e limpar o localStorage.",[352,1417,1418],{},[559,1419,1420],{},"História de Usuário 02 - Dashboard Analítico",[1390,1422,1423],{},[352,1424,1425,1427,1428,1430,1432,1433,1435,1437,1438,1440,1442,1443,1446],{},[559,1426,1396],{}," um Gestor de TI,",[268,1429],{},[559,1431,1402],{}," um painel que resuma o total de ativos e quantos estão fora da base,",[268,1434],{},[559,1436,1408],{}," eu possa tomar decisões de compras de novos equipamentos baseadas em métricas reais.",[268,1439],{},[564,1441,1414],{}," O saldo total deve ser calculado ",[602,1444,1445],{},"(Total - Emprestados + Devolvidos) = Saldo Atual","; gráficos visuais devem carregar em menos de 500ms na renderização da tela principal.",[263,1448,1450],{"id":1449},"_52-conformidade-com-a-lgpd-e-privacy-by-design","5.2. Conformidade com a LGPD e Privacy by Design",[352,1452,1453],{},"A plataforma gerencia nomes completos, matrículas e alocações departamentais, enquadrando-se nas obrigações da Lei Geral de Proteção de Dados (Lei nº 13.709\u002F2018):",[403,1455,1456,1466],{},[389,1457,1458,1461,1462,1465],{},[559,1459,1460],{},"Finalidade Específica (Art. 6º, I):"," Os dados dos colaboradores na ",[602,1463,1464],{},"tbl_responsaveis"," são utilizados apenas para o registro de acautelamento de bens corporativos.",[389,1467,1468,1471,1472,1475,1476,1479],{},[559,1469,1470],{},"Auditoria vs. Direito ao Esquecimento:"," Caso o funcionário seja desligado, seus dados transacionais não podem ser apagados se houverem dispositivos vinculados não devolvidos. Como estratégia de ",[564,1473,1474],{},"Privacy by Design",", os registros são bloqueados logicamente (",[602,1477,1478],{},"RESTRICT"," na Foreign Key), assegurando que o interesse legítimo de proteção ao patrimônio prevaleça.",[263,1481,1483],{"id":1482},"_53-cronograma-do-projeto","5.3. Cronograma do Projeto",[352,1485,1486],{},"A estimativa para a condução do Projeto Integrador foi projetada em 6 semanas de execução tática:",[1488,1489,1490,1510],"table",{},[1491,1492,1493],"thead",{},[1494,1495,1496,1500,1504,1507],"tr",{},[1497,1498,1499],"th",{"align":260},"Semana",[1497,1501,1503],{"align":1502},"left","Fase de Desenvolvimento",[1497,1505,1506],{"align":1502},"Responsabilidade",[1497,1508,1509],{"align":1502},"Status",[1511,1512,1513,1530,1545,1560,1575,1591],"tbody",{},[1494,1514,1515,1521,1524,1527],{},[1516,1517,1518],"td",{"align":260},[559,1519,1520],{},"01",[1516,1522,1523],{"align":1502},"Planejamento de Requisitos e Design da Interface (Figma)",[1516,1525,1526],{"align":1502},"Analista \u002F UI\u002FUX",[1516,1528,1529],{"align":1502},"Concluído",[1494,1531,1532,1537,1540,1543],{},[1516,1533,1534],{"align":260},[559,1535,1536],{},"02",[1516,1538,1539],{"align":1502},"Implementação Front-end (HTML\u002FJS) e lógica do localStorage",[1516,1541,1542],{"align":1502},"Desenvolvedor Front-End",[1516,1544,1529],{"align":1502},[1494,1546,1547,1552,1555,1558],{},[1516,1548,1549],{"align":260},[559,1550,1551],{},"03",[1516,1553,1554],{"align":1502},"Modelagem de Dados (MySQL) e criação das APIs REST",[1516,1556,1557],{"align":1502},"Arquiteto e DBA",[1516,1559,1529],{"align":1502},[1494,1561,1562,1567,1570,1573],{},[1516,1563,1564],{"align":260},[559,1565,1566],{},"04",[1516,1568,1569],{"align":1502},"Mecanismo de Sincronização (Worker) e Testes Off-line",[1516,1571,1572],{"align":1502},"Desenvolvedor Full-Stack",[1516,1574,1529],{"align":1502},[1494,1576,1577,1582,1585,1588],{},[1516,1578,1579],{"align":260},[559,1580,1581],{},"05",[1516,1583,1584],{"align":1502},"Validação de Segurança, Transações SQL e Revisão de Logs",[1516,1586,1587],{"align":1502},"Analista de Qualidade (QA)",[1516,1589,1590],{"align":1502},"Em Andamento",[1494,1592,1593,1598,1601,1604],{},[1516,1594,1595],{"align":260},[559,1596,1597],{},"06",[1516,1599,1600],{"align":1502},"Fechamento da Documentação, Apresentação Final",[1516,1602,1603],{"align":1502},"Toda a Equipe",[1516,1605,1590],{"align":1502},[258,1607],{"style":313},[288,1609,1611],{"id":1610},"_6-diagramas-de-visualização","6. Diagramas de Visualização",[352,1613,1614],{},"A representação arquitetural foi padronizada através da linguagem Mermaid, convertendo modelos de Engenharia de Software em código compreensível.",[263,1616,1618],{"id":1617},"_61-diagrama-de-casos-de-uso","6.1. Diagrama de Casos de Uso",[352,1620,1621],{},"Ilustra as ações centrais permitidas no escopo da aplicação de gestão de ativos.",[1623,1624],"mermaid",{"code":1625},"flowchart LR\n    TS((\"Técnico de Suporte\"))\n    GE((\"Gestor de TI\"))\n    SYS((\"Sistema Sincronizador\"))\n    \n    subgraph Sistema [\"Controle de Fluxo de Dispositivos\"]\n        direction TB\n        UC1([\"Consultar Dashboard e Saldo\"])\n        UC2([\"Registrar Saída\u002FEntrada (Off-line)\"])\n        UC3([\"Sincronizar LocalStorage -> BD\"])\n        UC4([\"Gerar Relatório de Retenção\"])\n    end\n    \n    TS --> UC1\n    TS --> UC2\n    \n    SYS --> UC3\n    UC2 -.->|\"&lt;&lt;include&gt;&gt;\"| UC3\n    \n    GE --> UC1\n    GE --> UC4\n",[352,1627,1628,1631],{},[559,1629,1630],{},"Versão em SVG (Diagrama de Casos de Uso):",[1632,1633],"img",{"alt":534,"src":1634},"\u002Fimg\u002Fprojetos-integradores\u002Fpi-04-emprestimos-dispositivos\u002Fusecase_dispositivos.svg",[263,1636,1638],{"id":1637},"_62-diagrama-de-classes-integração-híbrida","6.2. Diagrama de Classes (Integração Híbrida)",[352,1640,1641],{},"Aborda a disposição de classes, com destaque para a camada de serviço responsável pelo fluxo dual (Local e Nuvem).",[1623,1643],{"code":1644},"classDiagram\n    class Ativo {\n        \u003C\u003Cabstract>>\n        #String patrimonio\n        #String status\n        +getPatrimonio(): String\n        +alterarStatus(novo: String): void\n    }\n\n    class Notebook {\n        -String macAddress\n    }\n    class Projetor {\n        -int lumens\n    }\n\n    class FluxoMovimentacao {\n        -String dataHora\n        -String tipoFluxo\n        -String responsavel\n        +toJson(): String\n    }\n\n    class LocalStorageRepo {\n        +salvarOffLine(mov: FluxoMovimentacao): boolean\n        +lerPendentes(): List~FluxoMovimentacao~\n        +limparSincronizados(): void\n    }\n\n    class ApiSyncService {\n        +enviarParaMySQL(dados: List): boolean\n    }\n\n    Ativo \u003C|-- Notebook\n    Ativo \u003C|-- Projetor\n    FluxoMovimentacao \"1\" --> \"1\" Ativo : vincula\n    LocalStorageRepo ..> FluxoMovimentacao : armazena local\n    ApiSyncService ..> LocalStorageRepo : consome\n",[263,1646,1648],{"id":1647},"_63-diagrama-de-entidade-relacionamento-der","6.3. Diagrama de Entidade-Relacionamento (DER)",[352,1650,1651],{},"A visualização lógica das entidades que garantem o histórico do banco de dados relacional.",[1623,1653],{"code":1654},"erDiagram\n    TBL_RESPONSAVEIS {\n        int id_responsavel PK\n        string matricula UK\n        string nome_completo\n        string departamento\n    }\n\n    TBL_DISPOSITIVOS {\n        int id_dispositivo PK\n        string numero_patrimonio UK\n        string modelo\n        enum categoria\n        enum status_atual\n        varbinary detalhes_sensiveis\n    }\n\n    TBL_FLUXO_MOVIMENTACAO {\n        int id_movimentacao PK\n        int id_dispositivo FK\n        int id_responsavel FK\n        enum tipo_movimentacao\n        datetime data_evento\n        int id_usuario_operador\n    }\n\n    TBL_RESPONSAVEIS ||--o{ TBL_FLUXO_MOVIMENTACAO : \"retira (1:N)\"\n    TBL_DISPOSITIVOS ||--o{ TBL_FLUXO_MOVIMENTACAO : \"registra (1:N)\"\n",[1656,1657],"hr",{},[352,1659,1660],{},[564,1661,1662],{},"Fim da Documentação do Projeto Integrador (2026). O modelo arquitetural híbrido implementado prova a maturidade do sistema ao conciliar a resiliência em falhas de rede (Front-end Web Storage) com a rastreabilidade segura e escalável exigida pela governança corporativa (Back-end Relacional MySQL).",[1664,1665,1666],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":953,"searchDepth":966,"depth":972,"links":1668},[1669,1670,1674,1677,1678,1679,1685,1691,1695,1700],{"id":265,"depth":972,"text":266},{"id":290,"depth":966,"text":291,"children":1671},[1672,1673],{"id":309,"depth":978,"text":310},{"id":318,"depth":972,"text":319},{"id":339,"depth":966,"text":291,"children":1675},[1676],{"id":378,"depth":978,"text":310},{"id":383,"depth":966,"text":384},{"id":553,"depth":966,"text":554},{"id":577,"depth":966,"text":578,"children":1680},[1681,1682,1683,1684],{"id":581,"depth":972,"text":582},{"id":596,"depth":972,"text":597},{"id":636,"depth":972,"text":637},{"id":667,"depth":972,"text":668},{"id":684,"depth":966,"text":685,"children":1686},[1687,1688,1689,1690],{"id":688,"depth":972,"text":689},{"id":731,"depth":972,"text":732},{"id":759,"depth":972,"text":760},{"id":839,"depth":972,"text":840},{"id":923,"depth":966,"text":924,"children":1692},[1693,1694],{"id":934,"depth":972,"text":935},{"id":1178,"depth":972,"text":1179},{"id":1375,"depth":966,"text":1376,"children":1696},[1697,1698,1699],{"id":1379,"depth":972,"text":1380},{"id":1449,"depth":972,"text":1450},{"id":1482,"depth":972,"text":1483},{"id":1610,"depth":966,"text":1611,"children":1701},[1702,1703,1704],{"id":1617,"depth":972,"text":1618},{"id":1637,"depth":972,"text":1638},{"id":1647,"depth":972,"text":1648},"md",null,{},{"title":226,"description":953},"J7qg6VXM4O5T9umn_Z9xM6kJpBN_MBWp9XuT9JNvSc0",[1711,1713],{"title":204,"path":223,"stem":224,"description":1712,"children":-1},"Este novo projeto, intitulado Pedidos DoThi Sushi, alinha-se perfeitamente com sua experiência acadêmica e técnica, utilizando uma stack robusta baseada em Java e MySQL.",{"title":204,"path":232,"stem":233,"description":1714,"children":-1},"Este novo projeto, intitulado Controle de Fluxo de Dispositivos Eletrônicos, complementa seu portfólio de soluções de gestão e automação, focando na agilidade do front-end e na persistência de dados local.",1788375147617]