🍴 Meu Garfo é uma visualização em grafo dos CNPJs cuducos.tngl.io/meu-garfo
1

Configure Feed

Select the types of activity you want to include in your feed.

Deploy a0e352b

+370 -114
+51 -11
index.html
··· 169 169 } 170 170 171 171 .node-company { 172 - fill: #784c87; 173 172 stroke: #fff; 174 173 stroke-width: 1.5; 174 + } 175 + 176 + .company-active { 177 + fill: #784c87; 178 + } 179 + 180 + .company-inactive { 181 + fill: #b0a0b8; 182 + } 183 + 184 + .company-unknown { 185 + fill: #ff4136; 175 186 } 176 187 177 188 .node-person { ··· 215 226 } 216 227 217 228 circle.root { 218 - fill: #784c87 !important; 219 - stroke: #784c87; 220 229 stroke-width: 3; 221 230 } 222 231 ··· 236 245 margin-left: 5px; 237 246 } 238 247 239 - .methodology { 248 + .info-panel { 240 249 position: absolute; 241 - bottom: 1rem; 242 - left: 1rem; 250 + top: 1rem; 251 + right: 1rem; 243 252 max-width: 360px; 244 253 background: rgba(255, 255, 255, 0.92); 245 254 border: 1px solid var(--pico-muted-border-color); ··· 250 259 line-height: 1.35; 251 260 } 252 261 253 - .methodology summary { 262 + .info-panel summary { 254 263 cursor: pointer; 255 264 color: var(--pico-primary); 256 265 font-weight: 600; ··· 258 267 margin-bottom: 0; 259 268 } 260 269 261 - .methodology summary::-webkit-details-marker { display: none; } 262 - .methodology summary::marker { content: ""; } 270 + .info-panel summary::-webkit-details-marker { display: none; } 271 + .info-panel summary::marker { content: ""; } 263 272 264 - .methodology[open] summary { margin-bottom: 0.35rem; } 273 + .info-panel[open] summary { margin-bottom: 0.5rem; } 265 274 266 - .methodology small { 275 + .info-panel small { 267 276 font-size: 0.78rem; 268 277 color: var(--pico-muted-color); 269 278 } 279 + 280 + .legend { 281 + display: flex; 282 + flex-wrap: wrap; 283 + gap: 0.5rem 0.75rem; 284 + margin-bottom: 0.5rem; 285 + } 286 + 287 + .legend-item { 288 + display: inline-flex; 289 + align-items: center; 290 + gap: 0.3rem; 291 + } 292 + 293 + .info-panel-divider { 294 + border-top: 1px solid var(--pico-muted-border-color); 295 + margin: 0 0 0.5rem 0; 296 + } 297 + 298 + .legend-dot { 299 + display: inline-block; 300 + width: 10px; 301 + height: 10px; 302 + border-radius: 50%; 303 + border: 1.5px solid #fff; 304 + } 305 + 306 + .legend-company-active { background: #784c87; } 307 + .legend-company-inactive { background: #b0a0b8; } 308 + .legend-company-unknown { background: #ff4136; } 309 + .legend-person { background: #89a1c9; } 270 310 </style> 271 311 <script src="main.js"></script> 272 312 </head>
+319 -103
main.js
··· 7452 7452 interaction, 7453 7453 _Utils_ap(animation, always))); 7454 7454 }; 7455 - var $author$project$Types$Company = F2( 7456 - function (a, b) { 7457 - return {$: 'Company', a: a, b: b}; 7455 + var $author$project$Types$Company = F3( 7456 + function (a, b, c) { 7457 + return {$: 'Company', a: a, b: b, c: c}; 7458 7458 }); 7459 7459 var $author$project$Types$NodeClicked = function (a) { 7460 7460 return {$: 'NodeClicked', a: a}; 7461 7461 }; 7462 + var $author$project$Types$StatusUnknown = {$: 'StatusUnknown'}; 7462 7463 var $elm$core$Basics$clamp = F3( 7463 7464 function (low, high, number) { 7464 7465 return (_Utils_cmp(number, low) < 0) ? low : ((_Utils_cmp(number, high) > 0) ? high : number); 7465 7466 }); 7467 + var $author$project$Types$StatusActive = {$: 'StatusActive'}; 7468 + var $author$project$Types$StatusInactive = {$: 'StatusInactive'}; 7469 + var $author$project$Main$codeToStatus = function (code) { 7470 + if (code.$ === 'Just') { 7471 + if (code.a === 2) { 7472 + return $author$project$Types$StatusActive; 7473 + } else { 7474 + return $author$project$Types$StatusInactive; 7475 + } 7476 + } else { 7477 + return $author$project$Types$StatusInactive; 7478 + } 7479 + }; 7466 7480 var $author$project$Main$httpErrorToString = F2( 7467 7481 function (url, err) { 7468 7482 switch (err.$) { ··· 7649 7663 function (a, b) { 7650 7664 return {$: 'Person', a: a, b: b}; 7651 7665 }); 7666 + var $author$project$Types$StatusLoading = {$: 'StatusLoading'}; 7652 7667 var $elm$core$Dict$filter = F2( 7653 7668 function (isGood, dict) { 7654 7669 return A3( ··· 7738 7753 childIds); 7739 7754 } 7740 7755 }); 7756 + var $author$project$Types$GotCompanyName = F3( 7757 + function (a, b, c) { 7758 + return {$: 'GotCompanyName', a: a, b: b, c: c}; 7759 + }); 7760 + var $author$project$Types$CompanyInfo = F2( 7761 + function (name, situacaoCadastral) { 7762 + return {name: name, situacaoCadastral: situacaoCadastral}; 7763 + }); 7764 + var $author$project$Api$companyInfoDecoder = A3( 7765 + $elm$json$Json$Decode$map2, 7766 + $author$project$Types$CompanyInfo, 7767 + A2($elm$json$Json$Decode$field, 'razao_social', $elm$json$Json$Decode$string), 7768 + $elm$json$Json$Decode$maybe( 7769 + A2($elm$json$Json$Decode$field, 'situacao_cadastral', $elm$json$Json$Decode$int))); 7770 + var $author$project$Api$fetchCompanyName = F2( 7771 + function (jsonApi, cnpj) { 7772 + var url = (A2($elm$core$String$right, 1, jsonApi) === '/') ? _Utils_ap(jsonApi, cnpj) : (jsonApi + ('/' + cnpj)); 7773 + return $elm$http$Http$get( 7774 + { 7775 + expect: A2( 7776 + $elm$http$Http$expectStringResponse, 7777 + A2($author$project$Types$GotCompanyName, cnpj, url), 7778 + function (response) { 7779 + switch (response.$) { 7780 + case 'BadStatus_': 7781 + var meta = response.a; 7782 + return $elm$core$Result$Err( 7783 + $elm$http$Http$BadStatus(meta.statusCode)); 7784 + case 'GoodStatus_': 7785 + var body = response.b; 7786 + var _v1 = A2($elm$json$Json$Decode$decodeString, $author$project$Api$companyInfoDecoder, body); 7787 + if (_v1.$ === 'Ok') { 7788 + var info = _v1.a; 7789 + return $elm$core$Result$Ok(info); 7790 + } else { 7791 + return $elm$core$Result$Err( 7792 + $elm$http$Http$BadBody('Could not parse company info')); 7793 + } 7794 + case 'BadUrl_': 7795 + var url_ = response.a; 7796 + return $elm$core$Result$Err( 7797 + $elm$http$Http$BadUrl(url_)); 7798 + case 'Timeout_': 7799 + return $elm$core$Result$Err($elm$http$Http$Timeout); 7800 + default: 7801 + return $elm$core$Result$Err($elm$http$Http$NetworkError); 7802 + } 7803 + }), 7804 + url: url 7805 + }); 7806 + }); 7741 7807 var $author$project$Main$isCnpj = function (s) { 7742 7808 return $elm$core$String$length( 7743 7809 A2($elm$core$String$filter, $elm$core$Char$isAlphaNum, s)) === 14; ··· 7801 7867 var accModel = _v6.a; 7802 7868 var accCmds = _v6.b; 7803 7869 var partnerName = A2($elm$core$Maybe$withDefault, rel.partnerId, rel.partnerName); 7870 + var partnerCmd = ($author$project$Main$isCnpj(rel.partnerId) && (!A2($elm$core$Dict$member, rel.partnerId, accModel.nodes))) ? A2($author$project$Api$fetchCompanyName, accModel.jsonApi, rel.partnerId) : $elm$core$Platform$Cmd$none; 7804 7871 var edge = _Utils_Tuple2(rel.cnpj, rel.partnerId); 7805 7872 var updatedEdges = A2($elm$core$Set$insert, edge, accModel.edges); 7873 + var companyCmd = ($author$project$Main$isCnpj(rel.cnpj) && (!A2($elm$core$Dict$member, rel.cnpj, accModel.nodes))) ? A2($author$project$Api$fetchCompanyName, accModel.jsonApi, rel.cnpj) : $elm$core$Platform$Cmd$none; 7806 7874 var _v1 = A2($elm$core$Dict$member, rel.partnerId, accModel.nodes) ? _Utils_Tuple2(0, 0) : A3($author$project$Main$spawnNear, rel.cnpj, rel.partnerId, accModel); 7807 7875 var p_nx = _v1.a; 7808 7876 var p_ny = _v1.b; ··· 7821 7889 return existing; 7822 7890 } 7823 7891 } else { 7824 - var entity = $author$project$Main$isCnpj(rel.partnerId) ? A2($author$project$Types$Company, partnerName, rel.partnerId) : A2($author$project$Types$Person, partnerName, rel.partnerCpf); 7892 + var entity = $author$project$Main$isCnpj(rel.partnerId) ? A3($author$project$Types$Company, partnerName, rel.partnerId, $author$project$Types$StatusLoading) : A2($author$project$Types$Person, partnerName, rel.partnerCpf); 7825 7893 return {depth: depth + 1, entity: entity, error: $elm$core$Maybe$Nothing, id: rel.partnerId, vx: 0, vy: 0, x: p_nx, y: p_ny}; 7826 7894 } 7827 7895 }(); ··· 7835 7903 return _Utils_update( 7836 7904 existing, 7837 7905 { 7838 - entity: A2($author$project$Types$Company, rel.razaoSocial, rel.cnpj) 7906 + entity: A3($author$project$Types$Company, rel.razaoSocial, rel.cnpj, $author$project$Types$StatusLoading) 7839 7907 }); 7840 7908 } else { 7841 7909 return { 7842 7910 depth: depth + 1, 7843 - entity: A2($author$project$Types$Company, rel.razaoSocial, rel.cnpj), 7911 + entity: A3($author$project$Types$Company, rel.razaoSocial, rel.cnpj, $author$project$Types$StatusLoading), 7844 7912 error: $elm$core$Maybe$Nothing, 7845 7913 id: rel.cnpj, 7846 7914 vx: 0, ··· 7859 7927 _Utils_update( 7860 7928 accModel, 7861 7929 {edges: updatedEdges, nodes: updatedNodes}), 7862 - accCmds); 7930 + $elm$core$Platform$Cmd$batch( 7931 + _List_fromArray( 7932 + [accCmds, companyCmd, partnerCmd]))); 7863 7933 }); 7864 7934 var _v0 = A3( 7865 7935 $elm$core$List$foldl, ··· 9721 9791 } 9722 9792 case 'GotCompanyName': 9723 9793 var cnpj = msg.a; 9724 - var url = msg.b; 9725 9794 var result = msg.c; 9726 9795 if (result.$ === 'Ok') { 9727 - var name = result.a; 9796 + var info = result.a; 9797 + var status = $author$project$Main$codeToStatus(info.situacaoCadastral); 9728 9798 var updatedNodes = A3( 9729 9799 $elm$core$Dict$update, 9730 9800 cnpj, ··· 9737 9807 var _v7 = node.entity; 9738 9808 if (_v7.$ === 'Company') { 9739 9809 var id = _v7.b; 9740 - return A2($author$project$Types$Company, name, id); 9810 + return A3($author$project$Types$Company, info.name, id, status); 9741 9811 } else { 9742 - return A2($author$project$Types$Company, name, cnpj); 9812 + return A3($author$project$Types$Company, info.name, cnpj, status); 9743 9813 } 9744 9814 }() 9745 9815 }); ··· 9751 9821 {nodes: updatedNodes}), 9752 9822 $elm$core$Platform$Cmd$none); 9753 9823 } else { 9754 - return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); 9824 + var updatedNodes = A3( 9825 + $elm$core$Dict$update, 9826 + cnpj, 9827 + $elm$core$Maybe$map( 9828 + function (node) { 9829 + return _Utils_update( 9830 + node, 9831 + { 9832 + entity: function () { 9833 + var _v8 = node.entity; 9834 + if (_v8.$ === 'Company') { 9835 + var name = _v8.a; 9836 + var id = _v8.b; 9837 + return A3($author$project$Types$Company, name, id, $author$project$Types$StatusUnknown); 9838 + } else { 9839 + return A3($author$project$Types$Company, cnpj, cnpj, $author$project$Types$StatusUnknown); 9840 + } 9841 + }() 9842 + }); 9843 + }), 9844 + model.nodes); 9845 + return _Utils_Tuple2( 9846 + _Utils_update( 9847 + model, 9848 + {nodes: updatedNodes}), 9849 + $elm$core$Platform$Cmd$none); 9755 9850 } 9756 9851 case 'Tick': 9757 9852 return _Utils_Tuple2( ··· 9787 9882 case 'InteractionMove': 9788 9883 var dx = msg.a; 9789 9884 var dy = msg.b; 9790 - var _v8 = model.dragNode; 9791 - if (_v8.$ === 'Just') { 9792 - var id = _v8.a; 9885 + var _v9 = model.dragNode; 9886 + if (_v9.$ === 'Just') { 9887 + var id = _v9.a; 9793 9888 var updatedNodes = A3( 9794 9889 $elm$core$Dict$update, 9795 9890 id, ··· 9821 9916 model, 9822 9917 {dragNode: $elm$core$Maybe$Nothing, isPanning: false, startPos: $elm$core$Maybe$Nothing}); 9823 9918 var isClick = function () { 9824 - var _v10 = model.startPos; 9825 - if (_v10.$ === 'Just') { 9826 - var start = _v10.a; 9919 + var _v11 = model.startPos; 9920 + if (_v11.$ === 'Just') { 9921 + var start = _v11.a; 9827 9922 var dy = y - start.y; 9828 9923 var dx = x - start.x; 9829 9924 var dist = $elm$core$Basics$sqrt((dx * dx) + (dy * dy)); ··· 9832 9927 return false; 9833 9928 } 9834 9929 }(); 9835 - var _v9 = _Utils_Tuple2(isClick, model.dragNode); 9836 - if (_v9.a && (_v9.b.$ === 'Just')) { 9837 - var id = _v9.b.a; 9930 + var _v10 = _Utils_Tuple2(isClick, model.dragNode); 9931 + if (_v10.a && (_v10.b.$ === 'Just')) { 9932 + var id = _v10.b.a; 9838 9933 var $temp$msg = $author$project$Types$NodeClicked(id), 9839 9934 $temp$model = newModel; 9840 9935 msg = $temp$msg; ··· 9869 9964 } 9870 9965 default: 9871 9966 var url = msg.a; 9872 - var _v12 = $author$project$Main$parseUrl(url); 9873 - switch (_v12.$) { 9967 + var _v13 = $author$project$Main$parseUrl(url); 9968 + switch (_v13.$) { 9874 9969 case 'CnpjRoute': 9875 - var cnpj = _v12.a; 9970 + var cnpj = _v13.a; 9876 9971 var cleanCnpj = function (s) { 9877 9972 return A2( 9878 9973 $elm$core$String$filter, ··· 9916 10011 reset)); 9917 10012 } 9918 10013 case 'ConnectionRoute': 9919 - var id1 = _v12.a; 9920 - var id2 = _v12.b; 10014 + var id1 = _v13.a; 10015 + var id2 = _v13.b; 9921 10016 var isSame = _Utils_eq( 9922 10017 id1, 9923 10018 A2($elm$core$String$filter, $elm$core$Char$isAlphaNum, model.connectionInput1)) && _Utils_eq( ··· 10110 10205 _VirtualDom_noJavaScriptUri(url)); 10111 10206 }; 10112 10207 var $elm$html$Html$Attributes$id = $elm$html$Html$Attributes$stringProperty('id'); 10113 - var $elm$html$Html$input = _VirtualDom_node('input'); 10114 - var $elm$html$Html$label = _VirtualDom_node('label'); 10115 - var $elm$html$Html$main_ = _VirtualDom_node('main'); 10208 + var $elm$html$Html$details = _VirtualDom_node('details'); 10209 + var $elm$html$Html$span = _VirtualDom_node('span'); 10210 + var $author$project$View$legend = A2( 10211 + $elm$html$Html$div, 10212 + _List_fromArray( 10213 + [ 10214 + $elm$html$Html$Attributes$class('legend') 10215 + ]), 10216 + _List_fromArray( 10217 + [ 10218 + A2( 10219 + $elm$html$Html$span, 10220 + _List_fromArray( 10221 + [ 10222 + $elm$html$Html$Attributes$class('legend-item') 10223 + ]), 10224 + _List_fromArray( 10225 + [ 10226 + A2( 10227 + $elm$html$Html$span, 10228 + _List_fromArray( 10229 + [ 10230 + $elm$html$Html$Attributes$class('legend-dot legend-company-active') 10231 + ]), 10232 + _List_Nil), 10233 + $elm$html$Html$text('Empresa ativa') 10234 + ])), 10235 + A2( 10236 + $elm$html$Html$span, 10237 + _List_fromArray( 10238 + [ 10239 + $elm$html$Html$Attributes$class('legend-item') 10240 + ]), 10241 + _List_fromArray( 10242 + [ 10243 + A2( 10244 + $elm$html$Html$span, 10245 + _List_fromArray( 10246 + [ 10247 + $elm$html$Html$Attributes$class('legend-dot legend-company-inactive') 10248 + ]), 10249 + _List_Nil), 10250 + $elm$html$Html$text('Empresa inativa') 10251 + ])), 10252 + A2( 10253 + $elm$html$Html$span, 10254 + _List_fromArray( 10255 + [ 10256 + $elm$html$Html$Attributes$class('legend-item') 10257 + ]), 10258 + _List_fromArray( 10259 + [ 10260 + A2( 10261 + $elm$html$Html$span, 10262 + _List_fromArray( 10263 + [ 10264 + $elm$html$Html$Attributes$class('legend-dot legend-company-unknown') 10265 + ]), 10266 + _List_Nil), 10267 + $elm$html$Html$text('Empresa não encontrada') 10268 + ])), 10269 + A2( 10270 + $elm$html$Html$span, 10271 + _List_fromArray( 10272 + [ 10273 + $elm$html$Html$Attributes$class('legend-item') 10274 + ]), 10275 + _List_fromArray( 10276 + [ 10277 + A2( 10278 + $elm$html$Html$span, 10279 + _List_fromArray( 10280 + [ 10281 + $elm$html$Html$Attributes$class('legend-dot legend-person') 10282 + ]), 10283 + _List_Nil), 10284 + $elm$html$Html$text('Pessoa física') 10285 + ])) 10286 + ])); 10116 10287 var $elm$html$Html$abbr = _VirtualDom_node('abbr'); 10117 - var $elm$html$Html$details = _VirtualDom_node('details'); 10118 10288 var $elm$html$Html$em = _VirtualDom_node('em'); 10119 10289 var $elm$html$Html$small = _VirtualDom_node('small'); 10120 - var $elm$html$Html$summary = _VirtualDom_node('summary'); 10121 10290 var $elm$html$Html$Attributes$title = $elm$html$Html$Attributes$stringProperty('title'); 10122 - var $author$project$View$methodology = function (tab) { 10291 + var $author$project$View$methodologyText = function (tab) { 10123 10292 return A2( 10124 - $elm$html$Html$details, 10293 + $elm$html$Html$small, 10294 + _List_Nil, 10125 10295 _List_fromArray( 10126 10296 [ 10127 - $elm$html$Html$Attributes$class('methodology') 10128 - ]), 10129 - _List_fromArray( 10130 - [ 10131 - A2( 10132 - $elm$html$Html$summary, 10133 - _List_Nil, 10134 - _List_fromArray( 10135 - [ 10136 - A2( 10137 - $elm$html$Html$small, 10297 + function () { 10298 + if (tab.$ === 'CnpjTab') { 10299 + return A2( 10300 + $elm$html$Html$div, 10138 10301 _List_Nil, 10139 10302 _List_fromArray( 10140 10303 [ 10141 - $elm$html$Html$text('Como funciona esta busca?') 10142 - ])) 10143 - ])), 10144 - A2( 10145 - $elm$html$Html$small, 10146 - _List_Nil, 10147 - _List_fromArray( 10148 - [ 10149 - function () { 10150 - if (tab.$ === 'CnpjTab') { 10151 - return A2( 10152 - $elm$html$Html$div, 10153 - _List_Nil, 10304 + $elm$html$Html$text('A partir do CNPJ informado, o grafo é construído em largura ('), 10305 + A2( 10306 + $elm$html$Html$abbr, 10307 + _List_fromArray( 10308 + [ 10309 + $elm$html$Html$Attributes$title('Busca em largura'), 10310 + A2($elm$html$Html$Attributes$attribute, 'aria-label', 'Busca em largura') 10311 + ]), 10154 10312 _List_fromArray( 10155 10313 [ 10156 - $elm$html$Html$text('A partir do CNPJ informado, o grafo é construído em largura ('), 10157 10314 A2( 10158 - $elm$html$Html$abbr, 10315 + $elm$html$Html$a, 10159 10316 _List_fromArray( 10160 10317 [ 10161 - $elm$html$Html$Attributes$title('Busca em largura'), 10162 - A2($elm$html$Html$Attributes$attribute, 'aria-label', 'Busca em largura') 10318 + $elm$html$Html$Attributes$href('https://pt.wikipedia.org/wiki/Busca_em_largura'), 10319 + A2($elm$html$Html$Attributes$attribute, 'target', '_blank'), 10320 + A2($elm$html$Html$Attributes$attribute, 'rel', 'noopener noreferrer') 10163 10321 ]), 10164 10322 _List_fromArray( 10165 10323 [ 10166 - A2( 10167 - $elm$html$Html$a, 10168 - _List_fromArray( 10169 - [ 10170 - $elm$html$Html$Attributes$href('https://pt.wikipedia.org/wiki/Busca_em_largura'), 10171 - A2($elm$html$Html$Attributes$attribute, 'target', '_blank'), 10172 - A2($elm$html$Html$Attributes$attribute, 'rel', 'noopener noreferrer') 10173 - ]), 10174 - _List_fromArray( 10175 - [ 10176 - $elm$html$Html$text('BFS') 10177 - ])) 10178 - ])), 10179 - $elm$html$Html$text('): cada empresa traz seus sócios, e cada sócio traz as empresas em que participa. A expansão automática para em '), 10180 - A2( 10181 - $elm$html$Html$em, 10182 - _List_Nil, 10183 - _List_fromArray( 10184 - [ 10185 - $elm$html$Html$text('profundidade 8') 10186 - ])), 10187 - $elm$html$Html$text(' ou '), 10188 - A2( 10189 - $elm$html$Html$em, 10190 - _List_Nil, 10191 - _List_fromArray( 10192 - [ 10193 - $elm$html$Html$text('32 nós') 10194 - ])), 10195 - $elm$html$Html$text(' — o que vier primeiro. A partir daí, clique em qualquer nó com borda destacada para expandi-lo manualmente, um nível por vez, sem novos limites.') 10196 - ])); 10197 - } else { 10198 - return A2( 10199 - $elm$html$Html$div, 10324 + $elm$html$Html$text('BFS') 10325 + ])) 10326 + ])), 10327 + $elm$html$Html$text('): cada empresa traz seus sócios, e cada sócio traz as empresas em que participa. A expansão automática para em '), 10328 + A2( 10329 + $elm$html$Html$em, 10330 + _List_Nil, 10331 + _List_fromArray( 10332 + [ 10333 + $elm$html$Html$text('profundidade 8') 10334 + ])), 10335 + $elm$html$Html$text(' ou '), 10336 + A2( 10337 + $elm$html$Html$em, 10200 10338 _List_Nil, 10201 10339 _List_fromArray( 10202 10340 [ 10203 - $elm$html$Html$text('A API busca o menor caminho de relação entre as duas entidades (sócio-empresa) via busca bidirecional em largura, com limite de 90 segundos. O grafo exibe apenas os nós desse caminho, sem expansão automática. Clique nos nós para explorá-los individualmente. Se não houver caminho, a busca retorna vazia; se ultrapassar 90s, retorna erro de tempo esgotado — o que não significa ausência de conexão, apenas que o cálculo demorou demais.') 10204 - ])); 10205 - } 10206 - }() 10207 - ])) 10341 + $elm$html$Html$text('32 nós') 10342 + ])), 10343 + $elm$html$Html$text(' — o que vier primeiro. A partir daí, clique em qualquer nó com borda destacada para expandi-lo manualmente, um nível por vez, sem novos limites.') 10344 + ])); 10345 + } else { 10346 + return A2( 10347 + $elm$html$Html$div, 10348 + _List_Nil, 10349 + _List_fromArray( 10350 + [ 10351 + $elm$html$Html$text('A API busca o menor caminho de relação entre as duas entidades (sócio-empresa) via busca bidirecional em largura, com limite de 90 segundos. O grafo exibe apenas os nós desse caminho, sem expansão automática. Clique nos nós para explorá-los individualmente. Se não houver caminho, a busca retorna vazia; se ultrapassar 90s, retorna erro de tempo esgotado — o que não significa ausência de conexão, apenas que o cálculo demorou demais.'), 10352 + A2( 10353 + $elm$html$Html$div, 10354 + _List_fromArray( 10355 + [ 10356 + $elm$html$Html$Attributes$class('info-panel-divider') 10357 + ]), 10358 + _List_Nil), 10359 + $elm$html$Html$text('Para pessoas jurídicas, o identificador é o CNPJ. Para pessoas físicas, o identificador é um hash MD5 determinístico do CPF (com os dígitos redactos, tal como divulgados na fonte oficial) e do nome. Para encontrar o ID de uma pessoa, busque primeiro uma empresa da qual ela é sócia (aba CNPJ), clique no nó da pessoa para expandi-lo e copie o ID exibido no rótulo.') 10360 + ])); 10361 + } 10362 + }() 10208 10363 ])); 10209 10364 }; 10365 + var $elm$html$Html$summary = _VirtualDom_node('summary'); 10366 + var $author$project$View$infoPanel = F2( 10367 + function (tab, isEmpty) { 10368 + return A2( 10369 + $elm$html$Html$details, 10370 + _List_fromArray( 10371 + [ 10372 + $elm$html$Html$Attributes$class('info-panel') 10373 + ]), 10374 + _List_fromArray( 10375 + [ 10376 + A2( 10377 + $elm$html$Html$summary, 10378 + _List_Nil, 10379 + _List_fromArray( 10380 + [ 10381 + A2( 10382 + $elm$html$Html$small, 10383 + _List_Nil, 10384 + _List_fromArray( 10385 + [ 10386 + $elm$html$Html$text('Como funciona esta busca?') 10387 + ])) 10388 + ])), 10389 + isEmpty ? $author$project$View$methodologyText(tab) : A2( 10390 + $elm$html$Html$div, 10391 + _List_Nil, 10392 + _List_fromArray( 10393 + [ 10394 + $author$project$View$legend, 10395 + A2( 10396 + $elm$html$Html$div, 10397 + _List_fromArray( 10398 + [ 10399 + $elm$html$Html$Attributes$class('info-panel-divider') 10400 + ]), 10401 + _List_Nil), 10402 + $author$project$View$methodologyText(tab) 10403 + ])) 10404 + ])); 10405 + }); 10406 + var $elm$html$Html$input = _VirtualDom_node('input'); 10407 + var $elm$html$Html$label = _VirtualDom_node('label'); 10408 + var $elm$html$Html$main_ = _VirtualDom_node('main'); 10210 10409 var $elm$html$Html$nav = _VirtualDom_node('nav'); 10211 10410 var $elm$json$Json$Decode$fail = _Json_fail; 10212 10411 var $author$project$View$onEnter = function (msg) { ··· 10303 10502 var dict = _v0.a; 10304 10503 return $elm$core$Dict$size(dict); 10305 10504 }; 10306 - var $elm$html$Html$span = _VirtualDom_node('span'); 10307 10505 var $elm$svg$Svg$svg = $elm$svg$Svg$trustedNode('svg'); 10308 10506 var $elm$svg$Svg$Attributes$transform = _VirtualDom_attribute('transform'); 10309 10507 var $elm$html$Html$ul = _VirtualDom_node('ul'); ··· 10356 10554 }); 10357 10555 var $elm$svg$Svg$a = $elm$svg$Svg$trustedNode('a'); 10358 10556 var $elm$svg$Svg$circle = $elm$svg$Svg$trustedNode('circle'); 10557 + var $author$project$View$companyStatusClass = function (status) { 10558 + switch (status.$) { 10559 + case 'StatusLoading': 10560 + return 'company-active'; 10561 + case 'StatusActive': 10562 + return 'company-active'; 10563 + case 'StatusInactive': 10564 + return 'company-inactive'; 10565 + default: 10566 + return 'company-unknown'; 10567 + } 10568 + }; 10359 10569 var $elm$svg$Svg$Attributes$dy = _VirtualDom_attribute('dy'); 10360 10570 var $author$project$Types$InteractionStart = F3( 10361 10571 function (a, b, c) { ··· 10486 10696 var _v0 = function () { 10487 10697 var _v1 = node.entity; 10488 10698 if (_v1.$ === 'Company') { 10489 - return _Utils_Tuple2('node-company', 8); 10699 + var situacao = _v1.c; 10700 + return _Utils_Tuple2( 10701 + 'node-company ' + $author$project$View$companyStatusClass(situacao), 10702 + 8); 10490 10703 } else { 10491 10704 return _Utils_Tuple2('node-person', 5); 10492 10705 } ··· 10894 11107 ])) : $elm$html$Html$text('') 10895 11108 ])) 10896 11109 ])), 10897 - $author$project$View$methodology(model.activeTab) 11110 + A2( 11111 + $author$project$View$infoPanel, 11112 + model.activeTab, 11113 + $elm$core$Dict$isEmpty(model.nodes)) 10898 11114 ])), 10899 11115 A2( 10900 11116 $elm$html$Html$footer,