Source: directives/graficos/chartBar.js

  1. /**
  2. * @ngdoc directives
  3. * @name Chartbar
  4. * @module s4c.directives.graficos.chartBar
  5. *
  6. * @description Componente para demonstração de gráficos no formato de barras
  7. *
  8. *
  9. */
  10. (function () {
  11. 'use strict';
  12. chartBarController.$inject = [
  13. '$scope',
  14. '$timeout',
  15. 'Preset',
  16. 'DashboardService',
  17. '$http',
  18. '$q',
  19. 'API_ENDPOINT'
  20. ];
  21. function chartBarController(
  22. $scope,
  23. $timeout,
  24. Preset,
  25. DashboardService,
  26. $http,
  27. $q,
  28. API_ENDPOINT) {
  29. $scope.res = $scope.$root.res;
  30. $scope.canvas = {};
  31. $scope.canvas.id = guidGenerator() + '_chart';
  32. $scope.externo = guidGenerator();
  33. $scope.menu_back = guidGenerator();
  34. $scope.div_menu_back = guidGenerator();
  35. $scope.menu_back_1 = guidGenerator();
  36. $scope.div_menu_back_1 = guidGenerator();
  37. $scope.chart_container = guidGenerator();
  38. $scope.menu_principal = guidGenerator();
  39. $scope.idChartTree = guidGenerator();
  40. /**
  41. * Gera Ids dinamicamente que são usados no html
  42. *
  43. * @method guidGenerator
  44. *
  45. *
  46. */
  47. function guidGenerator() {
  48. var S4 = function() {
  49. return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
  50. };
  51. return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
  52. }
  53. /**
  54. * Destroy o gráfico atual para que possa ser criado um novo
  55. *
  56. * @method limpar
  57. *
  58. *
  59. */
  60. $scope.limpar = function () {
  61. chartDataDestroy()
  62. }
  63. /**
  64. * Obtem a lista de orgãos que foram selecionados para serem exibidos no gráfico
  65. *
  66. * @method getOrgaosFace
  67. *
  68. *
  69. */
  70. function getOrgaosFace(){
  71. var modulos = _.filter(Preset.config.preset.PresetModulos, function (mod) {
  72. return mod.Face != null && mod.Face.id == $scope.faceId;
  73. });
  74. let orgaos = modulos[0].Face.extras[0].orgaos;
  75. var orgaos_ = [];
  76. for(var index in orgaos){
  77. if(typeof orgaos[index] == 'number'){
  78. var orgaolocal = orgaos[index];
  79. orgaos_.push(orgaolocal.toString());
  80. }else{
  81. var orgaolocal = orgaos[index];
  82. orgaos_.push(orgaolocal);
  83. }
  84. }
  85. return orgaos_;
  86. }
  87. /**
  88. * Faz a busca dos dados do relatório baseado nos dados passados
  89. *
  90. * @method buscar
  91. *
  92. * @param tipo {String} Tipo de relatorio
  93. * @param orgaos {Array} Lista de orgãos que serão exibidos no gráfico
  94. *
  95. */
  96. $scope.buscar = function (tipo, orgaos) {
  97. var orgaos_;
  98. if(orgaos != null){
  99. orgaos_ = orgaos;
  100. }else if($scope.orgao.length == 1){
  101. orgaos_ = $scope.orgao;
  102. }else {
  103. orgaos_ = getOrgaosFace();
  104. }
  105. let relatorioPeriodo = {
  106. "relatorio": "mensal",
  107. "dataInicio": moment($scope.dataInicio, 'MM/YYYY').format('YYYYMM'),
  108. "dataFim": moment($scope.dataFim, 'MM/YYYY').format('YYYYMM'),
  109. "orgaos" : orgaos_
  110. };
  111. //console.log(relatorioPeriodo)
  112. let relatorioAnual = {
  113. "relatorio": "anual",
  114. "anoInicio": moment($scope.anoInicio, 'YYYY').format('YYYY'),
  115. "anoFim": moment($scope.anoFim, 'YYYY').format('YYYY'),
  116. "orgaos" : orgaos_
  117. }
  118. //console.log(relatorioAnual)
  119. let parametrosDaConsulta
  120. switch (tipo) {
  121. case "periodo":
  122. parametrosDaConsulta = relatorioPeriodo;
  123. break;
  124. case "ano":
  125. parametrosDaConsulta = relatorioAnual;
  126. break;
  127. default:
  128. let data = new Date()
  129. var time = new Date();
  130. var outraData = new Date();
  131. outraData.setDate(time.getDate() - 365); // diminui 365 dias
  132. //console.log("Ano =" + outraData.getFullYear() + "Mes =" + (outraData.getMonth() + 1))
  133. //$scope.dataInicio = "01/"+(data.getFullYear()).toString();
  134. $scope.dataInicio = (outraData.getMonth() + 1)+"/"+outraData.getFullYear()
  135. $scope.dataFim = ("0" + (data.getMonth() + 1)).slice(-2)+"/"+(data.getFullYear()).toString();
  136. $scope.anoInicio = outraData.getFullYear().toString()
  137. $scope.anoFim = data.getFullYear().toString()
  138. let relatorioAtual = {
  139. "relatorio": "mensal",
  140. "dataInicio": moment($scope.dataInicio, 'MM/YYYY').format('YYYYMM'),
  141. "dataFim": moment($scope.dataFim, 'MM/YYYY').format('YYYYMM'),
  142. "orgaos" : orgaos_
  143. };
  144. //console.log(relatorioAtual)
  145. parametrosDaConsulta = relatorioAtual
  146. break;
  147. }
  148. filterData(parametrosDaConsulta).then(function (response) {
  149. if (response != null) {
  150. var dataAno = response;
  151. chartDataDestroy();
  152. chartBar(dataAno, $scope.tituloModulo);
  153. if(orgaos_.length > 1){
  154. $('#'+$scope.div_menu_back_1).hide();
  155. }
  156. } else {
  157. console.log("Objeto nulo");
  158. }
  159. }, function (err) {
  160. console.log("Erro na consulta");
  161. });
  162. }
  163. /*
  164. function filterData(parametrosDaConsulta){
  165. var deferred = $q.defer();
  166. $http.post(API_ENDPOINT + 'relatorio/sp/filter', parametrosDaConsulta)
  167. .then(function (response) {
  168. if (typeof response.data === 'object') {
  169. deferred.resolve();
  170. } else {
  171. return deferred.reject(response.data);
  172. }
  173. }, function (err) {
  174. deferred.reject("Error! filterData");
  175. });
  176. return deferred.promise;
  177. }*/
  178. /**
  179. * Faz o acesso ao backend que retornará com os dados da busca
  180. *
  181. * @method filterData
  182. *
  183. * @param filter {Object} Dados para filtrar a busca
  184. *
  185. * @returns {Promise} Promise que resolve com as informações sobre o
  186. * relatório
  187. */
  188. function filterData(filter) {
  189. var deferred = $q.defer();
  190. $http.post(API_ENDPOINT + 'relatorio/sp/filter', filter)
  191. .then(function (res) {
  192. if (typeof res.data === 'object') {
  193. deferred.resolve(res.data);
  194. } else {
  195. deferred.reject();
  196. }
  197. }, function (err) {
  198. deferred.reject(err);
  199. });
  200. return deferred.promise;
  201. }
  202. /**
  203. * Método responsável pela montagem do gráfico
  204. *
  205. * @method chartBar
  206. *
  207. * @param dados {Object} Dados para montagem do gráfico
  208. * @param titulo {String} Título que será exibido no gráfico
  209. *
  210. */
  211. function chartBar(dados, titulo) {
  212. var dataLabels = []
  213. var labelChart = []
  214. for (let i = 0; i < dados.length; i++) {
  215. switch (dados[i].text) {
  216. case "JANUARY":
  217. labelChart[i] = "Janeiro"
  218. break;
  219. case "FEBRUARY":
  220. labelChart[i] = "Fevereiro"
  221. break;
  222. case "MARCH":
  223. labelChart[i] = "Março"
  224. break;
  225. case "APRIL":
  226. labelChart[i] = "Abril"
  227. break;
  228. case "MAY":
  229. labelChart[i] = "Maio"
  230. break;
  231. case "JUNE":
  232. labelChart[i] = "Junho"
  233. break;
  234. case "JULY":
  235. labelChart[i] = "Julho"
  236. break;
  237. case "AUGUST":
  238. labelChart[i] = "Agosto"
  239. break;
  240. case "SEPTEMBER":
  241. labelChart[i] = "Setembro"
  242. break;
  243. case "OCTOBER":
  244. labelChart[i] = "Outubro"
  245. break;
  246. case "NOVEMBER":
  247. labelChart[i] = "Novembro"
  248. break;
  249. case "DECEMBER":
  250. labelChart[i] = "Dezembro"
  251. break;
  252. default:
  253. labelChart[i] = dados[i].text;
  254. break;
  255. }
  256. dataLabels.push(labelChart[i])
  257. }
  258. var liquidado = []
  259. for (let i = 0; i < dados.length; i++) {
  260. liquidado.push(dados[i].valorLiquidado)
  261. }
  262. var empenhoLiquidado = []
  263. for (let i = 0; i < dados.length; i++) {
  264. empenhoLiquidado.push(dados[i].valorEmpenhadoLiquido)
  265. }
  266. var disponivel = []
  267. for (let i = 0; i < dados.length; i++) {
  268. disponivel.push(dados[i].valorDisponivel)
  269. }
  270. carregarCanvasOnclinck();
  271. /**
  272. * Faz o gerenciamento do click nas barras do gráfico
  273. *
  274. * @method carregarCanvasOnclinck
  275. *
  276. *
  277. */
  278. function carregarCanvasOnclinck(){
  279. var canvas = document.getElementById($scope.canvas.id);
  280. if(canvas != null){
  281. canvas.onclick = function(evt) {
  282. var activePoints = $scope.chartData.getElementsAtEvent(evt);
  283. if(activePoints.length > 0){
  284. var chartData = activePoints[0]['_chart'].config.data;
  285. $scope.periodo = activePoints[0]['_view'].label;
  286. var res = $scope.periodo.split("/");
  287. $scope.periodo = res[0]+"/"+res[1];
  288. if($scope.orgao.length == 1){
  289. treemap("funcao", $scope.periodo)
  290. $('[data-tab='+$scope.canvas.id+'orgao]').hide();
  291. $('[data-tab='+$scope.canvas.id+'funcao]').addClass('active');
  292. $('[data-tab='+$scope.canvas.id+'orgao]').removeClass('active');
  293. }else{
  294. $('[data-tab='+$scope.canvas.id+'orgao]').show();
  295. $('[data-tab='+$scope.canvas.id+'funcao]').removeClass('active');
  296. $('[data-tab='+$scope.canvas.id+'orgao]').addClass('active');
  297. treemap("orgao", $scope.periodo)
  298. }
  299. $("#tab"+$scope.canvas.id+"anual").click(function () {
  300. $("#tab"+$scope.canvas.id+"anual").addClass('active');
  301. $("#tab"+$scope.canvas.id+"mensal").removeClass('active');
  302. });
  303. $("#tab"+$scope.canvas.id+"mensal").click(function () {
  304. $("#tab"+$scope.canvas.id+"mensal").addClass('active');
  305. $("#tab"+$scope.canvas.id+"anual").removeClass('active');
  306. });
  307. $('[data-tab='+$scope.canvas.id+'buscar]').on('click', function () {
  308. let hasOrgao = $('[data-tab='+$scope.canvas.id+'orgao]').hasClass( "active" );
  309. if(hasOrgao){
  310. treemap("orgao", $scope.periodo)
  311. }else{
  312. treemap("funcao", $scope.periodo)
  313. }
  314. });
  315. $('[data-tab='+$scope.canvas.id+'funcao]').on('click', function () {
  316. $("#"+$scope.menu_principal).hide();
  317. //treemap("funcao", $scope.periodo)
  318. $('[data-tab='+$scope.canvas.id+'funcao]').addClass('active');
  319. $('[data-tab='+$scope.canvas.id+'orgao]').removeClass('active');
  320. });
  321. $('[data-tab='+$scope.canvas.id+'orgao]').on('click', function () {
  322. $("#"+$scope.menu_principal).hide();
  323. // treemap("orgao", $scope.periodo)
  324. $('[data-tab='+$scope.canvas.id+'funcao]').removeClass('active');
  325. $('[data-tab='+$scope.canvas.id+'orgao]').addClass('active');
  326. });
  327. }
  328. };
  329. }else{
  330. $timeout(function () { carregarCanvasOnclinck(); }, 3000);
  331. }
  332. }
  333. /**
  334. * Inicializa o gráfico de barras
  335. *
  336. * @constructs Chart
  337. *
  338. *
  339. */
  340. $scope.chartData = new Chart(document.getElementById($scope.canvas.id).getElementsByTagName("canvas"), {
  341. type: 'bar',
  342. data: {
  343. labels: dataLabels,
  344. datasets: [
  345. {
  346. label: "Valor Liquidado",
  347. backgroundColor: ["#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd", "#3e95cd"],
  348. data: liquidado
  349. },
  350. {
  351. label: "Valor Empenhado",
  352. backgroundColor: ["#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2", "#8e5ea2"],
  353. data: empenhoLiquidado
  354. },
  355. {
  356. label: "Valor Disponivel",
  357. backgroundColor: ["#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f", "#3cba9f"],
  358. data: disponivel
  359. }
  360. ]
  361. },
  362. options: {
  363. responsive: true,
  364. maintainAspectRatio: false,
  365. tooltips: {
  366. fontSize: 16,
  367. callbacks: {
  368. label: function (tooltipItems, data) {
  369. let value = tooltipItems.yLabel
  370. return 'R$ ' + value.toLocaleString('pt-BR');
  371. }
  372. }
  373. },
  374. legend: {
  375. display: true,
  376. labels: {
  377. fontColor: "white",
  378. fontSize: 14
  379. }
  380. },
  381. title: {
  382. display: true,
  383. fontColor: "white",
  384. fontSize: 14,
  385. text: titulo,
  386. },
  387. scales: {
  388. yAxes: [{
  389. ticks: {
  390. fontColor: "white",
  391. beginAtZero: true,
  392. fontSize: 14,
  393. callback: function (value, index, values) {
  394. var suffixes = ["", " mil", " Mi", " Bi", " T"];
  395. var suffixNum = Math.floor(("" + value).length / 3);
  396. var shortValue = parseFloat((suffixNum != 0 ? (value / Math.pow(1000, suffixNum)) : value).toPrecision(2));
  397. if (shortValue % 1 != 0) {
  398. var shortNum = shortValue.toFixed(1);
  399. }
  400. return 'R$ ' + shortValue + suffixes[suffixNum];
  401. }
  402. }
  403. }],
  404. xAxes: [{
  405. ticks: {
  406. fontColor: "white",
  407. fontSize: 16,
  408. }
  409. }]
  410. }
  411. }
  412. });
  413. }
  414. /**
  415. * Método responsável pela montagem do gráfico TreeMap
  416. *
  417. * @method dadosTreeMap
  418. *
  419. * @param filter {Object} Dados para filtrar a consulta
  420. *
  421. *
  422. * @returns {Promise} Promise que resolve com as informações sobre o
  423. * relatório
  424. */
  425. function dadosTreeMap(filter) {
  426. var deferred = $q.defer();
  427. $http.post(API_ENDPOINT + 'relatorio/sp/filter', filter)
  428. .then(function (res) {
  429. if (typeof res.data === 'object') {
  430. deferred.resolve(res.data);
  431. } else {
  432. deferred.reject();
  433. }
  434. }, function (err) {
  435. deferred.reject(err);
  436. });
  437. return deferred.promise;
  438. }
  439. /**
  440. * Destroy o gráfico de barras atual para que possa ser criado um novo
  441. *
  442. * @method chartDataDestroy
  443. *
  444. *
  445. */
  446. function chartDataDestroy(){
  447. if ($scope.chartData != null) {
  448. try{
  449. $scope.chartData.destroy();
  450. }
  451. catch(e){
  452. console.log("");
  453. }
  454. }
  455. }
  456. /**
  457. * Responsável pela montagem dos dados do gráfico TreeMap
  458. *
  459. * @method treemap
  460. *
  461. * @param tipo {String} Tipo de relatório
  462. * @param periodo {Date} Datas de início e fim para apuração dos dados
  463. *
  464. */
  465. function treemap(tipo, periodo) {
  466. chartDataDestroy()
  467. var anoPeriodo = (moment(periodo, 'MM/YYYY').format('YYYY'))
  468. var mesPeriodo = (moment(periodo, 'MM/YYYY').format('MM'))
  469. var orgaos_ = [];
  470. for(var index in $scope.orgao){
  471. if(typeof $scope.orgao[index] == 'number'){
  472. var orgaolocal = $scope.orgao[index];
  473. orgaos_.push(orgaolocal.toString());
  474. }else{
  475. var orgaolocal = $scope.orgao[index];
  476. orgaos_.push(orgaolocal);
  477. }
  478. }
  479. $scope.orgao = orgaos_;
  480. if(orgaos_.length == 1){
  481. $('#'+$scope.div_menu_back_1).hide();
  482. }
  483. let filtro = {
  484. "filtro": {
  485. "anoDotacao": anoPeriodo,
  486. "mesDotacao": mesPeriodo,
  487. "orgaos": orgaos_
  488. },
  489. "agrupar": tipo.substr(0, 3)
  490. }
  491. dadosTreeMap(filtro).then(function (data) {
  492. var dataOrgao = data.map(
  493. obj => {
  494. return {
  495. "text": obj.text,
  496. "value": obj.valorDisponivel,
  497. "color": ((obj.valorLiquidado * 12) / (obj.valorDisponivel * mesPeriodo))
  498. }
  499. }
  500. );
  501. treemapRender(dataOrgao);
  502. });
  503. }
  504. /**
  505. * Responsável pela montagem do gráfico TreeMap
  506. *
  507. * @method treemapRender
  508. *
  509. * @param dados {String} Dados para ser usado no gráfico
  510. *
  511. */
  512. function treemapRender(dados) {
  513. exibirTreeMap();
  514. var divId = $scope.idChartTree;
  515. $('#'+$scope.externo).html('').append(`<div id='${divId}' class="chartTreemap" style="height:100%" ></div>`)
  516. var paletteColor = []
  517. for (let i = 0; i < dados.length; i++) {
  518. if (dados[i].color > 0.9) {
  519. paletteColor.push((dados[i].color = "#008c48"));
  520. } else if (dados[i].color > 0.75) {
  521. paletteColor.push((dados[i].color = "#FFdd00"));
  522. } else if (dados[i].color < 0.75) {
  523. paletteColor.push((dados[i].color = "#FF1e00"));
  524. } else {
  525. paletteColor.push((dados[i].color = "#FF1e00"));
  526. }
  527. }
  528. let myConfig = {
  529. "graphset": [{
  530. "type": "treemap",
  531. options: {
  532. box: {
  533. fontSize: 13,
  534. padding: "5px",
  535. 'font-color': "black",
  536. "shadow": 1,
  537. borderWidth: 1
  538. },
  539. 'thousands-separator': ".",
  540. 'decimals-separator': ",",
  541. decimals: "2",
  542. 'aspect-type': "palette",
  543. text: "%v widgets",
  544. palette: paletteColor,
  545. 'tooltip-box': {
  546. 'font-color': "black",
  547. 'font-size': 13,
  548. 'font-style': "normal",
  549. padding: "20%",
  550. 'border-radius': "5%",
  551. },
  552. },
  553. "series":dados
  554. }
  555. ]
  556. };
  557. zingchart.render({
  558. id: divId,
  559. data: myConfig,
  560. height: "100%",
  561. width: "100%"
  562. });
  563. if($scope.orgao != null && $scope.orgao.length > 1){
  564. zingchart.bind(divId, 'node_click', function(e) {
  565. var subpref = _.find($scope.orgaos, function (orgao) {
  566. return orgao.descricao.includes(e.path[0].text );
  567. });
  568. var orgaos_ = [];
  569. orgaos_.push(subpref.codigo);
  570. $scope.chartDataSubPref(orgaos_, e.path[0].text);
  571. $scope.tituloModulo = e.path[0].text;
  572. });
  573. }
  574. $('#'+divId).css('overflow','visible');
  575. Preset.salvar();
  576. setInterval( () => $('[title="JavaScript Charts by ZingChart"]').hide() , 3000);
  577. /*
  578. $('#'+$scope.menu_back).on('click', function () {
  579. executeOnBack();
  580. });*/
  581. }
  582. /**
  583. * Volta as informações do gráfico para o momento inicial
  584. *
  585. * @method executeOnBack
  586. *
  587. *
  588. *
  589. */
  590. $scope.executeOnBack = function (){
  591. chartDataDestroy();
  592. ocultarTreeMap();
  593. for (var index in modulos) {
  594. if ((modulos[index].template == 'app/components/modulos/modulo-chartBar.html' || (modulos[index].Face && modulos[index].Face.template == 'app/components/modulos/modulo-chartBar.html'))) {
  595. let orgaos = modulos[index].Face.extras[0].orgaos;
  596. var orgaos_ = [];
  597. for(var index_ in orgaos){
  598. if(typeof orgaos[index_] == 'number'){
  599. var orgaolocal = orgaos[index_];
  600. orgaos_.push(orgaolocal.toString());
  601. }else{
  602. var orgaolocal = orgaos[index_];
  603. orgaos_.push(orgaolocal);
  604. }
  605. }
  606. $scope.orgao = orgaos_;
  607. $scope.tituloModulo = modulos[index].Face.name;
  608. $scope.buscar('mensal', orgaos_);
  609. break;
  610. }
  611. }
  612. }
  613. /**
  614. * Busca os Orgãos disponíveis para serem exibidos no gráfico
  615. *
  616. * @method orgaos
  617. *
  618. *
  619. * @returns {Promise} Promise que resolve com as informações sobre o
  620. * Orgãos
  621. */
  622. function orgaos() {
  623. var deferred = $q.defer();
  624. $http.get(API_ENDPOINT + 'relatorio/orgaos')
  625. .then(function (res) {
  626. if (typeof res.data === 'object') {
  627. deferred.resolve(res.data);
  628. $scope.orgaos=res.data;
  629. } else {
  630. deferred.reject();
  631. }
  632. }, function (err) {
  633. deferred.reject(err);
  634. });
  635. return deferred.promise;
  636. }
  637. orgaos();
  638. /**
  639. * Controle de exibição ou ocultação de divs e botões dos gráficos
  640. *
  641. * @method exibirTreeMap
  642. *
  643. *
  644. */
  645. function exibirTreeMap(){
  646. $("#"+$scope.div_menu_back).show();
  647. $('.titleValorBar').show()
  648. $("#"+$scope.externo).show();
  649. $("#"+$scope.idChartTree).show();
  650. $("#"+$scope.menu_principal).hide();
  651. $("#"+$scope.chart_container).hide();
  652. }
  653. /**
  654. * Controle de exibição ou ocultação de divs e botões dos gráficos
  655. *
  656. * @method ocultarTreeMap
  657. *
  658. *
  659. */
  660. function ocultarTreeMap(){
  661. zingchart.exec($scope.idChartTree, 'destroy');
  662. $("#"+$scope.div_menu_back).hide();
  663. $('.titleValorBar').hide()
  664. $("#"+$scope.externo).hide();
  665. $("#"+$scope.menu_principal).show();
  666. $("#"+$scope.chart_container).show();
  667. }
  668. /**
  669. * Faz a busca dos dados referente aos últimos 12 meses
  670. *
  671. * @method chartDataSubPref
  672. *
  673. * @param orgaos {Array} Orgãos que serão exibidos no gráfico
  674. * @param subpref {String} Nome do Orgão que será exibido no gráfico
  675. *
  676. */
  677. $scope.chartDataSubPref = function (orgaos, subpref) {
  678. ocultarTreeMap()
  679. var orgaos_ = [];
  680. for(var index in orgaos){
  681. if(typeof orgaos[index] == 'number'){
  682. var orgaolocal = orgaos[index];
  683. orgaos_.push(orgaolocal.toString());
  684. }else{
  685. var orgaolocal = orgaos[index];
  686. orgaos_.push(orgaolocal);
  687. }
  688. }
  689. $scope.orgao = orgaos_;
  690. if(orgaos_.length == 1){
  691. $('#'+$scope.div_menu_back_1).show();
  692. /*
  693. $('#'+$scope.menu_back_1).on('click', function () {
  694. $scope.executeOnBack();
  695. });*/
  696. }
  697. let data = new Date();
  698. var time = new Date();
  699. var outraData = new Date();
  700. outraData.setDate(time.getDate() - 365); // diminui 365 dias
  701. $scope.dataInicio = (outraData.getMonth() + 1)+"/"+outraData.getFullYear()
  702. $scope.dataFim = ("0" + (data.getMonth() + 1)).slice(-2)+"/"+(data.getFullYear()).toString();
  703. $scope.anoInicio = outraData.getFullYear().toString()
  704. $scope.anoFim = data.getFullYear().toString()
  705. let relatorioAtual = {
  706. "relatorio": "mensal",
  707. "dataInicio": moment($scope.dataInicio, 'MM/YYYY').format('YYYYMM'),
  708. "dataFim": moment($scope.dataFim, 'MM/YYYY').format('YYYYMM'),
  709. "orgaos" : orgaos_
  710. };
  711. let parametrosDaConsulta = relatorioAtual
  712. $http.post(API_ENDPOINT + 'relatorio/sp/filter', parametrosDaConsulta)
  713. .then(function (res) {
  714. if (typeof res.data === 'object') {
  715. var dataAno = res.data;
  716. //console.log(JSON.stringify(dataAno));
  717. chartDataDestroy()
  718. chartBar(dataAno, subpref);
  719. } else {
  720. console.log("Erro na consulta");
  721. }
  722. }, function (err) {
  723. console.log(err);
  724. });
  725. }
  726. var modulos = Preset.obter().PresetModulos;
  727. $scope.presetId = Preset.obter().id;
  728. $timeout(function () {
  729. for (var index in modulos) {
  730. if ((modulos[index].template == 'app/components/modulos/modulo-chartBar.html' || (modulos[index].Face && modulos[index].Face.template == 'app/components/modulos/modulo-chartBar.html')) && !modulos[index].usado) {
  731. modulos[index].usado = true;
  732. modulos[index].index = 1;
  733. $scope.modulo = modulos[index];
  734. $scope.tituloModulo = modulos[index].Face.name;
  735. $scope.endereco = modulos[index].Face;
  736. $scope.faceId = modulos[index].Face.id;
  737. $scope.orgao = modulos[index].Face.extras[0].orgaos
  738. $scope.buscar('');
  739. }
  740. }
  741. }, 300);
  742. angular.extend($scope, {});
  743. }
  744. function s4cChartBar() {
  745. return {
  746. restrict: 'E',
  747. templateUrl: 'app/directives/graficos/chartBar.html',
  748. scope: {},
  749. controller: chartBarController
  750. };
  751. }
  752. angular.module('s4c.components.chartBar', [])
  753. .directive('s4cChartbar', s4cChartBar);
  754. })();