From 7679b1b024d8ab362cd4442337cc1b698a27e3c8 Mon Sep 17 00:00:00 2001 From: samarasss Date: Thu, 6 Aug 2020 11:48:02 -0300 Subject: [PATCH 01/23] merge com a dev --- .../lista-contratos/lista-contratos.component.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/municipios/lista-contratos/lista-contratos.component.html b/src/app/municipios/lista-contratos/lista-contratos.component.html index b264539..54a64bf 100644 --- a/src/app/municipios/lista-contratos/lista-contratos.component.html +++ b/src/app/municipios/lista-contratos/lista-contratos.component.html @@ -19,12 +19,12 @@ - -
-
Não há contratos neste momento.
+
+
+
Não há contratos neste momento.
+
-
From c51e432e29cb617e2352e05914f0485656bcf13a Mon Sep 17 00:00:00 2001 From: diegooalmeida Date: Thu, 6 Aug 2020 12:06:53 -0300 Subject: [PATCH 02/23] Corrige quebra de linha no valor do card da listagem de maiores riscos --- .../risco-contratos/risco-contratos.component.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.scss b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.scss index 776c5db..4fdb7cd 100644 --- a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.scss +++ b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.scss @@ -18,4 +18,8 @@ p { @media (min-width: 576px) { left: -19px; } -} \ No newline at end of file +} + +.custom-value { + white-space: nowrap; +} From a8ce1d2a81e3eee8bdc064b9b0eac57d8c9b3931 Mon Sep 17 00:00:00 2001 From: samarasss Date: Fri, 7 Aug 2020 08:39:22 -0300 Subject: [PATCH 03/23] =?UTF-8?q?Corrigi=20centraliza=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../municipios/lista-contratos/lista-contratos.component.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/municipios/lista-contratos/lista-contratos.component.html b/src/app/municipios/lista-contratos/lista-contratos.component.html index 54a64bf..ce6bf9a 100644 --- a/src/app/municipios/lista-contratos/lista-contratos.component.html +++ b/src/app/municipios/lista-contratos/lista-contratos.component.html @@ -20,9 +20,11 @@
-
+
+
Não há contratos neste momento.
+
From 27c25f102cc0e8ae1a21ed5f80bd404595908502 Mon Sep 17 00:00:00 2001 From: diegooalmeida Date: Fri, 7 Aug 2020 11:13:34 -0300 Subject: [PATCH 04/23] =?UTF-8?q?Adiciona=20tela=20com=20descri=C3=A7?= =?UTF-8?q?=C3=A3o=20do=20risco=20e=20=C3=ADcone=20ao=20lado=20de=20cada?= =?UTF-8?q?=20risco?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../info-contrato.component.html | 3 ++ .../lista-contratos.component.html | 3 ++ .../risco-contratos.component.html | 3 ++ .../descricao-risco.component.html | 39 +++++++++++++++++++ .../descricao-risco.component.scss | 21 ++++++++++ .../descricao-risco.component.spec.ts | 25 ++++++++++++ .../descricao-risco.component.ts | 15 +++++++ src/app/main/main-routing.module.ts | 5 +++ src/app/main/main.module.ts | 4 +- .../card-contrato.component.html | 7 +++- .../components/rodape/rodape.component.html | 2 +- 11 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 src/app/main/descricao-risco/descricao-risco.component.html create mode 100644 src/app/main/descricao-risco/descricao-risco.component.scss create mode 100644 src/app/main/descricao-risco/descricao-risco.component.spec.ts create mode 100644 src/app/main/descricao-risco/descricao-risco.component.ts diff --git a/src/app/contratos/info-contrato/info-contrato.component.html b/src/app/contratos/info-contrato/info-contrato.component.html index 3892f56..e872f0f 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.html +++ b/src/app/contratos/info-contrato/info-contrato.component.html @@ -100,6 +100,9 @@
Risco + + +
Risco + + +
diff --git a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html index c48fe23..879f982 100644 --- a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html +++ b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html @@ -57,6 +57,9 @@
Risco + + + diff --git a/src/app/main/descricao-risco/descricao-risco.component.html b/src/app/main/descricao-risco/descricao-risco.component.html new file mode 100644 index 0000000..3ca53fb --- /dev/null +++ b/src/app/main/descricao-risco/descricao-risco.component.html @@ -0,0 +1,39 @@ +
+
+
+
+
+

+ + + + O que é o Risco Contratual? +

+
+
+
+
+
+ +
+
+
+
+
+

+ Medir o risco associado a algo ou alguém pode ser definido como estimar o grau de incerteza de que um determinado evento ocorra ou não. Por exemplo, quando alguém solicita um empréstimo a uma instituição bancária, esta realiza uma avaliação que resultará se o solicitante receberá ou não o valor a ser emprestado. Esta avaliação pode ser chamada de análise de risco ou análise de crédito, e pode conter informações como: o histórico do quão bom ou mau pagador o solicitante é, informações sobre seus bens, recebimentos e outras peculiaridades. +

+

+ No exemplo acima é intuitivo entender o porquê das características usadas auxiliarem na associação entre alguém cujo histórico seja de mau pagador a um futuro problema ou prejuízo ao banco. Dessa maneira, a existência do risco, tal como sua intensidade, estão condicionadas a fatores específicos do domínio em questão. Isto é, caso desejemos aplicar a técnica em outros cenários, é necessário observar e investigar quais características deste cenário influenciam para o aumento ou diminuição do risco. +

+

+ No Monitor Cidadão, enfrentamos o desafio de estimar o risco associado a contratos públicos. Para nós, o conceito de risco está associado a chance que um contrato possui de ser rescindido, paralisado, sustado ou impedido. E as características dos contratos, assim como do mau ou bom pagador acima, são construídas a partir do comportamento passado e dados cadastrais das empresas responsáveis pelos contratos. +

+

+ Os dados utilizados no Monitor Cidadão são provenientes do SAGRES, Tramita e Receita Federal. +

+
+
+
+
+
\ No newline at end of file diff --git a/src/app/main/descricao-risco/descricao-risco.component.scss b/src/app/main/descricao-risco/descricao-risco.component.scss new file mode 100644 index 0000000..4371553 --- /dev/null +++ b/src/app/main/descricao-risco/descricao-risco.component.scss @@ -0,0 +1,21 @@ +.secao-inicial{ + background: #edf0f4; +} + +a, +p { + padding: 0px; + margin: 0px; +} + +.arrow { + max-width: 0.75em; +} + +.custom-position-title { + position: relative; + + @media (min-width: 576px) { + left: -19px; + } +} \ No newline at end of file diff --git a/src/app/main/descricao-risco/descricao-risco.component.spec.ts b/src/app/main/descricao-risco/descricao-risco.component.spec.ts new file mode 100644 index 0000000..be0a77d --- /dev/null +++ b/src/app/main/descricao-risco/descricao-risco.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DescricaoRiscoComponent } from './descricao-risco.component'; + +describe('DescricaoRiscoComponent', () => { + let component: DescricaoRiscoComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DescricaoRiscoComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DescricaoRiscoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/main/descricao-risco/descricao-risco.component.ts b/src/app/main/descricao-risco/descricao-risco.component.ts new file mode 100644 index 0000000..3e08f74 --- /dev/null +++ b/src/app/main/descricao-risco/descricao-risco.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-descricao-risco', + templateUrl: './descricao-risco.component.html', + styleUrls: ['./descricao-risco.component.scss'] +}) +export class DescricaoRiscoComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/main/main-routing.module.ts b/src/app/main/main-routing.module.ts index 8bdcf46..af2aee7 100644 --- a/src/app/main/main-routing.module.ts +++ b/src/app/main/main-routing.module.ts @@ -3,6 +3,7 @@ import { Routes, RouterModule } from '@angular/router'; import { HomeComponent } from './home/home.component'; import { SobreComponent } from './sobre/sobre.component'; +import { DescricaoRiscoComponent } from './descricao-risco/descricao-risco.component'; const routes: Routes = [ { @@ -13,6 +14,10 @@ const routes: Routes = [ path: 'sobre', component: SobreComponent }, + { + path: 'risco', + component: DescricaoRiscoComponent + }, { path: '', redirectTo: 'home' diff --git a/src/app/main/main.module.ts b/src/app/main/main.module.ts index 761ba63..f989374 100644 --- a/src/app/main/main.module.ts +++ b/src/app/main/main.module.ts @@ -6,11 +6,13 @@ import { MainRoutingModule } from './main-routing.module'; import { HomeComponent } from './home/home.component'; import { SobreComponent } from './sobre/sobre.component'; +import { DescricaoRiscoComponent } from './descricao-risco/descricao-risco.component'; @NgModule({ declarations: [ HomeComponent, - SobreComponent + SobreComponent, + DescricaoRiscoComponent ], imports: [ CommonModule, diff --git a/src/app/shared/components/card-contrato/card-contrato.component.html b/src/app/shared/components/card-contrato/card-contrato.component.html index 9d36258..1faebd8 100644 --- a/src/app/shared/components/card-contrato/card-contrato.component.html +++ b/src/app/shared/components/card-contrato/card-contrato.component.html @@ -48,7 +48,12 @@
Exemplo Maior - Risco +
+ Risco + + + +
diff --git a/src/app/shared/components/rodape/rodape.component.html b/src/app/shared/components/rodape/rodape.component.html index 423e3b3..fa0fa82 100644 --- a/src/app/shared/components/rodape/rodape.component.html +++ b/src/app/shared/components/rodape/rodape.component.html @@ -20,7 +20,7 @@
MONITOR CIDADÃO
Análises descritivas From 7cf2acb0282a058722cda6a1b92be623d654db48 Mon Sep 17 00:00:00 2001 From: diegooalmeida Date: Mon, 10 Aug 2020 11:48:45 -0300 Subject: [PATCH 05/23] Melhora pagina de detalhamento de riscos e modifica icone e rotas --- .../info-contrato.component.html | 5 +-- .../lista-contratos.component.html | 10 ++++-- .../lista-contratos.component.ts | 4 +-- .../risco-contratos.component.html | 8 +++-- .../risco-contratos.component.ts | 4 +-- .../descricao-risco.component.html | 33 ++++++++++++++---- src/app/main/sobre/sobre.component.html | 2 +- .../card-contrato.component.html | 8 +++-- .../card-contrato/card-contrato.component.ts | 2 +- src/assets/imgs/exemplo-risco.png | Bin 0 -> 78679 bytes 10 files changed, 51 insertions(+), 25 deletions(-) create mode 100644 src/assets/imgs/exemplo-risco.png diff --git a/src/app/contratos/info-contrato/info-contrato.component.html b/src/app/contratos/info-contrato/info-contrato.component.html index e872f0f..08c4220 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.html +++ b/src/app/contratos/info-contrato/info-contrato.component.html @@ -100,9 +100,6 @@
Risco - - -
aria-valuemax="100">
- {{getRisco (contrato)}}% de chances de rescisão. + {{getRisco (contrato)}}% de chances de rompimento Nenhum risco associado.
diff --git a/src/app/contratos/lista-contratos/lista-contratos.component.html b/src/app/contratos/lista-contratos/lista-contratos.component.html index b0e4b00..950d709 100644 --- a/src/app/contratos/lista-contratos/lista-contratos.component.html +++ b/src/app/contratos/lista-contratos/lista-contratos.component.html @@ -77,9 +77,13 @@
Risco - - - + + + + + + + diff --git a/src/app/contratos/lista-contratos/lista-contratos.component.ts b/src/app/contratos/lista-contratos/lista-contratos.component.ts index fc1b6e2..a67e21e 100644 --- a/src/app/contratos/lista-contratos/lista-contratos.component.ts +++ b/src/app/contratos/lista-contratos/lista-contratos.component.ts @@ -81,8 +81,8 @@ export class ListaContratosComponent implements OnInit { } getRisco (risco) { - if (!risco) return 0; - return risco * 100; + if (!risco) return -1; + return (risco * 100).toFixed(0); } } diff --git a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html index 879f982..93844e2 100644 --- a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html +++ b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html @@ -57,9 +57,11 @@
Risco - - - + + + + + diff --git a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts index b25fcc7..f99df7b 100644 --- a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts +++ b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts @@ -34,8 +34,8 @@ export class RiscoContratosComponent implements OnInit { } getRisco (risco) { - if (!risco.previsaoContrato) return 0; - return risco.previsaoContrato.vig_prob_1 * 100; + if (!risco.previsaoContrato) return -1; + return (risco.previsaoContrato.vig_prob_1 * 100).toFixed(0); } onPageChange(pag: number) { diff --git a/src/app/main/descricao-risco/descricao-risco.component.html b/src/app/main/descricao-risco/descricao-risco.component.html index 3ca53fb..25a3c70 100644 --- a/src/app/main/descricao-risco/descricao-risco.component.html +++ b/src/app/main/descricao-risco/descricao-risco.component.html @@ -17,21 +17,42 @@

-
+
-

+

Medir o risco associado a algo ou alguém pode ser definido como estimar o grau de incerteza de que um determinado evento ocorra ou não. Por exemplo, quando alguém solicita um empréstimo a uma instituição bancária, esta realiza uma avaliação que resultará se o solicitante receberá ou não o valor a ser emprestado. Esta avaliação pode ser chamada de análise de risco ou análise de crédito, e pode conter informações como: o histórico do quão bom ou mau pagador o solicitante é, informações sobre seus bens, recebimentos e outras peculiaridades.

-

+
+

No exemplo acima é intuitivo entender o porquê das características usadas auxiliarem na associação entre alguém cujo histórico seja de mau pagador a um futuro problema ou prejuízo ao banco. Dessa maneira, a existência do risco, tal como sua intensidade, estão condicionadas a fatores específicos do domínio em questão. Isto é, caso desejemos aplicar a técnica em outros cenários, é necessário observar e investigar quais características deste cenário influenciam para o aumento ou diminuição do risco.

-

- No Monitor Cidadão, enfrentamos o desafio de estimar o risco associado a contratos públicos. Para nós, o conceito de risco está associado a chance que um contrato possui de ser rescindido, paralisado, sustado ou impedido. E as características dos contratos, assim como do mau ou bom pagador acima, são construídas a partir do comportamento passado e dados cadastrais das empresas responsáveis pelos contratos. +
+

+ No Monitor Cidadão, enfrentamos o desafio de estimar o risco associado a contratos públicos. Para nós, o conceito de risco está associado a chance que um contrato possui de ser rescindido, paralisado, sustado ou impedido. E as características dos contratos, assim como do mau ou bom pagador acima, são construídas a partir do comportamento passado e dados cadastrais das empresas responsáveis pelos contratos.

-

+
+ +

+
+
+ Risco +
+
+
+ +

+ Tomando como exemplo o cenário fictício acima, temos que Secretaria de Saúde de São Joãozinho contratou a empresa Seu José Empreendimentos para o fornecimento de equipamentos de saúde. +

+
+

+ Diante disso, dado o comportamento de Seu José Empreendimentos em sua atuação na administração pública, calculamos para as características desse contrato da saúde uma chance de 34% de rompimento. +

+
+

Os dados utilizados no Monitor Cidadão são provenientes do SAGRES, Tramita e Receita Federal.

+
diff --git a/src/app/main/sobre/sobre.component.html b/src/app/main/sobre/sobre.component.html index 728fd0d..b0fedd5 100644 --- a/src/app/main/sobre/sobre.component.html +++ b/src/app/main/sobre/sobre.component.html @@ -5,7 +5,7 @@

Monitor Cidadão

- O Monitor Cidadão é um sistema desenvolvido através da parceria entre a CampinaTec e o laboratório Analytics da Universidade Federal de Campina Grande-PB com finalidade possibilitar aos cidadãos o acompanhamento dos contratos realizados pelos municípios do estado da Paraíba. + O Monitor Cidadão é um sistema desenvolvido pelo Laboratório Analytics da Universidade Federal de Campina Grande em parceria com a CampinaTec, e tem finalidade possibilitar aos cidadãos o acompanhamento dos contratos realizados pelos municípios do estado da Paraíba.

diff --git a/src/app/shared/components/card-contrato/card-contrato.component.html b/src/app/shared/components/card-contrato/card-contrato.component.html index 1faebd8..4d47201 100644 --- a/src/app/shared/components/card-contrato/card-contrato.component.html +++ b/src/app/shared/components/card-contrato/card-contrato.component.html @@ -50,9 +50,11 @@
Exemplo Maior
Risco - - - + + + + +
diff --git a/src/app/shared/components/card-contrato/card-contrato.component.ts b/src/app/shared/components/card-contrato/card-contrato.component.ts index 9e3a88d..cccb04a 100644 --- a/src/app/shared/components/card-contrato/card-contrato.component.ts +++ b/src/app/shared/components/card-contrato/card-contrato.component.ts @@ -23,7 +23,7 @@ export class CardContratoComponent implements OnInit { } getRisco (risco) { - if (!risco.previsaoContrato) return 0; + if (!risco.previsaoContrato) return -1; return risco.previsaoContrato.vig_prob_1 * 100; } diff --git a/src/assets/imgs/exemplo-risco.png b/src/assets/imgs/exemplo-risco.png new file mode 100644 index 0000000000000000000000000000000000000000..81b7eab4598efb342101307c7fedd50efe6e7fe7 GIT binary patch literal 78679 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 literal 0 HcmV?d00001 From a9aff336b3919bfa32c0526f70dedcc6cba69cd6 Mon Sep 17 00:00:00 2001 From: diegooalmeida Date: Wed, 12 Aug 2020 10:24:32 -0300 Subject: [PATCH 06/23] =?UTF-8?q?Adiciona=20link=20com=20descri=C3=A7?= =?UTF-8?q?=C3=A3o=20detalhada=20das=20m=C3=A9tricas=20e=20modelos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/main/descricao-risco/descricao-risco.component.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/main/descricao-risco/descricao-risco.component.html b/src/app/main/descricao-risco/descricao-risco.component.html index 25a3c70..fc2f45e 100644 --- a/src/app/main/descricao-risco/descricao-risco.component.html +++ b/src/app/main/descricao-risco/descricao-risco.component.html @@ -53,6 +53,10 @@

Os dados utilizados no Monitor Cidadão são provenientes do SAGRES, Tramita e Receita Federal.


+

+ Quer saber mais sobre quais modelos e métricas são utilizados? Veja aqui. +

+

From 810a4446bf17c3306ad30f28ad7edb9de3e4f717 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaquim=20Hon=C3=B3rio?= Date: Tue, 25 Aug 2020 15:45:34 -0300 Subject: [PATCH 07/23] =?UTF-8?q?Remove=20munic=C3=ADpio=20salvo=20no=20na?= =?UTF-8?q?vegador?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../info-contrato/info-contrato.component.ts | 76 +++++++------------ .../info-licitacao.component.ts | 36 +++------ src/app/licitacoes/licitacao.component.html | 2 +- src/app/licitacoes/licitacao.component.ts | 20 ++++- .../lista-contratos.component.ts | 68 ++++++++--------- .../lista-licitacoes.component.ts | 33 ++++---- src/app/municipios/municipios.component.ts | 28 ++----- .../components/busca/busca.component.ts | 4 - .../card-contrato.component.html | 2 +- .../card-contrato/card-contrato.component.ts | 15 ++-- src/app/shared/services/user.service.ts | 38 ---------- 11 files changed, 118 insertions(+), 204 deletions(-) delete mode 100644 src/app/shared/services/user.service.ts diff --git a/src/app/contratos/info-contrato/info-contrato.component.ts b/src/app/contratos/info-contrato/info-contrato.component.ts index 2b13bd6..616d626 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.ts +++ b/src/app/contratos/info-contrato/info-contrato.component.ts @@ -1,13 +1,11 @@ import { ContratoService } from './../../shared/services/contrato.service'; import { RegiaoService } from './../../shared/services/regiao.service'; -import { UserService } from './../../shared/services/user.service'; import { ActivatedRoute } from '@angular/router'; -import { Contrato } from './../../shared/models/contrato.model'; import { Evento } from './../../shared/models/evento.model'; import { debounceTime, takeUntil, map } from 'rxjs/operators'; -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; import { Municipio } from './../../shared/models/municipio.model'; import { Location } from '@angular/common'; @@ -17,22 +15,20 @@ import { Location } from '@angular/common'; templateUrl: './info-contrato.component.html', styleUrls: ['./info-contrato.component.scss'] }) -export class InfoContratoComponent implements OnInit { +export class InfoContratoComponent implements OnInit, OnDestroy { public contrato: any; private unsubscribe = new Subject(); public municipioEscolhido: Municipio; - constructor(private userService: UserService, + constructor( private regiaoService: RegiaoService, private contratoService: ContratoService, private activatedroute: ActivatedRoute, private location: Location) { } ngOnInit(): void { - this.getMunicipio(); - const id = this.activatedroute.snapshot.paramMap.get('id'); this.getContratoByID(id); } @@ -42,68 +38,50 @@ export class InfoContratoComponent implements OnInit { .pipe(takeUntil(this.unsubscribe)) .subscribe(contrato => { this.contrato = contrato; + this.getMunicipioById(contrato.cd_municipio); }); } - getMunicipio() { - this.userService - .getMunicipioEscolhido() - .pipe( - debounceTime(300), - takeUntil(this.unsubscribe)) - .subscribe(municipio => { - this.municipioEscolhido = municipio; - this.getMunicipioIfUnfined () + getMunicipioById( cdMunicipio: string) { + this.regiaoService.getMunicipiosbyId(cdMunicipio) + .subscribe(municipio => { + municipio.map (result => { + this.municipioEscolhido = result; }); + }); } - /** - * Verifica se o municipio já está salvo no userservice, - * caso contrário é realizada a busca pelo código. - */ - getMunicipioIfUnfined () { - if (!this.municipioEscolhido?.cd_municipio || - this.municipioEscolhido?.cd_municipio != this.contrato?.cd_municipio){ - this.regiaoService.getMunicipiosbyId(this.contrato?.cd_municipio) - .subscribe(municipio => { - municipio.map (result => { - this.userService.setMunicipioEscolhido (result); - this.municipioEscolhido = result; - }) - }) - } - } - getPorcentagemContrato (start, end) { + getPorcentagemContrato(start, end) { let percentage; if (start && end) { - let startDate = new Date(start).getTime(); - let endDate = new Date(end).getTime(); - let todayDate = new Date().getTime(); + const startDate = new Date(start).getTime(); + const endDate = new Date(end).getTime(); + const todayDate = new Date().getTime(); - let total = endDate - startDate; - let current = todayDate - startDate; + const total = endDate - startDate; + const current = todayDate - startDate; percentage = (current / total) * 100; - return Math.min(Math.max(parseInt((percentage).toFixed(2)), 0), 100); + return Math.min(Math.max(parseInt((percentage).toFixed(2), 10), 0), 100); } - - return -1 + return -1; } - getEventosTimeline () { + getEventosTimeline() { if (this.contrato) { - let eventosTimeline: Array = [] - eventosTimeline.push (new Evento("Assinatura", this.contrato.dt_assinatura)) - eventosTimeline.push (new Evento("Fim da vigência", this.contrato.pr_vigencia)) - + const eventosTimeline: Array = []; + eventosTimeline.push (new Evento('Assinatura', this.contrato.dt_assinatura)); + eventosTimeline.push (new Evento('Fim da vigência', this.contrato.pr_vigencia)); return eventosTimeline; } } - getRisco (risco) { - if (!risco?.previsaoContrato) return 0; + getRisco(risco) { + if (!risco?.previsaoContrato) { + return 0; + } return (risco?.previsaoContrato?.vig_prob_1 * 100).toFixed(0); } @@ -113,7 +91,7 @@ export class InfoContratoComponent implements OnInit { } lastPage() { - this.location.back(); + this.location.back(); } } diff --git a/src/app/licitacoes/info-licitacao/info-licitacao.component.ts b/src/app/licitacoes/info-licitacao/info-licitacao.component.ts index 1e16dfa..9d2e60e 100644 --- a/src/app/licitacoes/info-licitacao/info-licitacao.component.ts +++ b/src/app/licitacoes/info-licitacao/info-licitacao.component.ts @@ -2,7 +2,6 @@ import { Evento } from './../../shared/models/evento.model'; import { debounceTime, takeUntil } from 'rxjs/operators'; import { Municipio } from './../../shared/models/municipio.model'; import { Subject } from 'rxjs'; -import { UserService } from './../../shared/services/user.service'; import { Component, OnInit, Input } from '@angular/core'; import { Location } from '@angular/common'; @@ -14,40 +13,27 @@ import { Location } from '@angular/common'; export class InfoLicitacaoComponent implements OnInit { private unsubscribe = new Subject(); - public municipioEscolhido: Municipio; @Input() licitacao; + @Input() municipioEscolhido; - constructor(private userService: UserService, + constructor( private location: Location) { } - ngOnInit(): void { - this.getMunicipio(); - } - - getMunicipio() { - this.userService - .getMunicipioEscolhido() - .pipe( - debounceTime(300), - takeUntil(this.unsubscribe)) - .subscribe(municipio => { - this.municipioEscolhido = municipio; - }); - } + ngOnInit(): void {} - getEventosTimeline () { + getEventosTimeline() { if (this.licitacao) { - let eventosTimeline: Array = [] - eventosTimeline.push (new Evento("Homologação", this.licitacao?.dt_homologacao)) + const eventosTimeline: Array = []; + eventosTimeline.push (new Evento('Homologação', this.licitacao?.dt_homologacao)); this.licitacao.contratosLicitacao?.forEach(function (contrato) { - eventosTimeline.push (new Evento("Contrato", contrato?.dt_assinatura, contrato?.id_contrato)) - }); + eventosTimeline.push (new Evento('Contrato', contrato?.dt_assinatura, contrato?.id_contrato)) + }); return eventosTimeline; } } - getGanhador (cpfcnpj, contratos){ + getGanhador(cpfcnpj, contratos){ let contemNaLista = false; for(let contrato of contratos) { @@ -55,12 +41,12 @@ export class InfoLicitacaoComponent implements OnInit { contemNaLista = true; break; } - }; + } return contemNaLista; } lastPage() { - this.location.back(); + this.location.back(); } } diff --git a/src/app/licitacoes/licitacao.component.html b/src/app/licitacoes/licitacao.component.html index 34a2156..7b706aa 100644 --- a/src/app/licitacoes/licitacao.component.html +++ b/src/app/licitacoes/licitacao.component.html @@ -1,3 +1,3 @@
- +
\ No newline at end of file diff --git a/src/app/licitacoes/licitacao.component.ts b/src/app/licitacoes/licitacao.component.ts index 252221b..6a4d45d 100644 --- a/src/app/licitacoes/licitacao.component.ts +++ b/src/app/licitacoes/licitacao.component.ts @@ -1,4 +1,5 @@ -import { Component, OnInit } from '@angular/core'; +import { RegiaoService } from './../shared/services/regiao.service'; +import { Component, OnInit, OnDestroy } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { takeUntil } from 'rxjs/operators'; @@ -12,12 +13,14 @@ import { LicitacaoService } from 'src/app/shared/services/licitacao.service'; templateUrl: './licitacao.component.html', styleUrls: ['./licitacao.component.scss'] }) -export class LicitacaoComponent implements OnInit { +export class LicitacaoComponent implements OnInit, OnDestroy { private unsubscribe = new Subject(); - public licitacao = new Licitacao; + public licitacao = new Licitacao(); + public municipioEscolhido; constructor( + private regiaoService: RegiaoService, private activatedroute: ActivatedRoute, private licitacaoService: LicitacaoService) { } @@ -31,13 +34,22 @@ export class LicitacaoComponent implements OnInit { .pipe(takeUntil(this.unsubscribe)) .subscribe(licitacao => { this.licitacao = licitacao; + this.getMunicipioByID(this.licitacao?.cd_municipio); }); } + getMunicipioByID(cdMunicipio){ + this.regiaoService.getMunicipiosbyId(cdMunicipio) + .subscribe(municipio => { + municipio.map (result => { + this.municipioEscolhido = result; + }); + }); + } ngOnDestroy() { this.unsubscribe.next(); this.unsubscribe.complete(); } -} \ No newline at end of file +} diff --git a/src/app/municipios/lista-contratos/lista-contratos.component.ts b/src/app/municipios/lista-contratos/lista-contratos.component.ts index c3e172e..c5e927f 100644 --- a/src/app/municipios/lista-contratos/lista-contratos.component.ts +++ b/src/app/municipios/lista-contratos/lista-contratos.component.ts @@ -1,7 +1,8 @@ +import { MunicipioService } from './../../shared/services/municipio.service'; +import { ActivatedRoute, Params, Router } from '@angular/router'; import { Municipio } from './../../shared/models/municipio.model'; import { Contrato } from '../../shared/models/contrato.model'; -import { UserService } from './../../shared/services/user.service'; import { ContratoService } from './../../shared/services/contrato.service'; import { Component, OnInit } from '@angular/core'; @@ -14,12 +15,12 @@ import { takeUntil, debounceTime } from 'rxjs/operators'; styleUrls: ['./lista-contratos.component.scss'] }) export class ListaContratosComponent implements OnInit { - pag: number = 1; - contador: number = 10; + pag = 1; + contador = 10; public contrato: Contrato; public isLoading = true; private unsubscribe = new Subject(); - + isCheckedVigentes = false; public municipioEscolhido: Municipio; // todos os contratos @@ -29,50 +30,47 @@ export class ListaContratosComponent implements OnInit { isPortrait = false; - constructor(private userService: UserService, - private contratosService: ContratoService) { } + constructor( + private router: Router, + private contratosService: ContratoService, + private municipioService: MunicipioService) { } ngOnInit(): void { - this.getMunicipio(); + // recupera o ID do municipio da rota root + // o ActivatedRoute não funciona neste caso + const cdMunicipio = this.router.url.split('/')[2]; + this.getMunicipioByID(cdMunicipio); - if (window.screen.width === 360) { // 768px portrait - this.isPortrait = true; - } + if (window.screen.width === 360) { // 768px portrait + this.isPortrait = true; + } } - getMunicipio() { - this.userService - .getMunicipioEscolhido() - .pipe( - debounceTime(300), - takeUntil(this.unsubscribe)) - .subscribe(municipio => { - // evita fazer a requisição duplicada de um municipio - if (municipio.cd_municipio != this.municipioEscolhido?.cd_municipio) { - this.isLoading = true; - this.contratosFiltrados = []; - - this.getContratos(municipio); - } - }); + getMunicipioByID(cdMunicipio) { + this.municipioService.getById(cdMunicipio) + .pipe(takeUntil(this.unsubscribe)) + .subscribe(municipio => { + this.municipioEscolhido = municipio; + this.getContratos(municipio); + }); } getContratos(municipio: Municipio) { this.contratosService.getContratosPorMunicipio(municipio.cd_municipio) .pipe(takeUntil(this.unsubscribe)).subscribe(contratos => { - this.contratos = contratos.sort((a, b) => (b.dt_ano - a.dt_ano)); - this.contratosFiltrados = this.contratos; - this.isCheckedVigentes = false; - this.isLoading = false; - this.municipioEscolhido = municipio; + this.contratos = contratos.sort((a, b) => (b.dt_ano - a.dt_ano)); + this.contratosFiltrados = this.contratos; + this.isCheckedVigentes = false; + this.isLoading = false; + this.municipioEscolhido = municipio; }); } - clickSwitchVigentes (event) { + clickSwitchVigentes(event) { let today = new Date(); - - if (event.target.checked){ - this.contratosFiltrados = this.contratos.filter(m => + + if (event.target.checked) { + this.contratosFiltrados = this.contratos.filter(m => new Date(today) <= new Date(m.pr_vigencia) ); } else { @@ -83,6 +81,6 @@ export class ListaContratosComponent implements OnInit { onPageChange(pag: number) { this.pag = pag; window.scrollTo(0, 0); - } + } } diff --git a/src/app/municipios/lista-licitacoes/lista-licitacoes.component.ts b/src/app/municipios/lista-licitacoes/lista-licitacoes.component.ts index 4999f65..0c2ec8f 100644 --- a/src/app/municipios/lista-licitacoes/lista-licitacoes.component.ts +++ b/src/app/municipios/lista-licitacoes/lista-licitacoes.component.ts @@ -1,12 +1,13 @@ +import { MunicipioService } from './../../shared/services/municipio.service'; import { Municipio } from './../../shared/models/municipio.model'; import { Licitacao } from './../../shared/models/licitacao.model'; -import { UserService } from './../../shared/services/user.service'; import { LicitacaoService } from 'src/app/shared/services/licitacao.service'; import { Component, OnInit } from '@angular/core'; import { takeUntil, debounceTime } from 'rxjs/operators'; import { Subject } from 'rxjs'; +import { Router } from '@angular/router'; @Component({ selector: 'app-lista-licitacoes', @@ -14,8 +15,8 @@ import { Subject } from 'rxjs'; styleUrls: ['./lista-licitacoes.component.scss'] }) export class ListaLicitacoesComponent implements OnInit { - pag: number = 1; - contador: number = 15; + pag = 1; + contador = 15; public isLoading = true; @@ -24,23 +25,23 @@ export class ListaLicitacoesComponent implements OnInit { public municipioEscolhido: Municipio; - constructor(private userService: UserService, - private licitacoesService: LicitacaoService) { } + constructor( + private router: Router, + private licitacoesService: LicitacaoService, + private municipioService: MunicipioService) { } ngOnInit(): void { - this.getMunicipio(); + const cdMunicipio = this.router.url.split('/')[2]; + this.getMunicipioByID(cdMunicipio); } - getMunicipio() { - this.userService - .getMunicipioEscolhido() - .pipe( - debounceTime(300), - takeUntil(this.unsubscribe)) - .subscribe(municipio => { - this.municipioEscolhido = municipio; - this.getLicitacoes(this.municipioEscolhido); - }); + getMunicipioByID(cdMunicipio) { + this.municipioService.getById(cdMunicipio) + .pipe(takeUntil(this.unsubscribe)) + .subscribe(municipio => { + this.municipioEscolhido = municipio; + this.getLicitacoes(municipio); + }); } getLicitacoes(municipio: Municipio) { diff --git a/src/app/municipios/municipios.component.ts b/src/app/municipios/municipios.component.ts index 282672a..3da1e20 100644 --- a/src/app/municipios/municipios.component.ts +++ b/src/app/municipios/municipios.component.ts @@ -1,52 +1,38 @@ import { MunicipioService } from './../shared/services/municipio.service'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import { Municipio } from './../shared/models/municipio.model'; -import { debounceTime, takeUntil } from 'rxjs/operators'; -import { Component, OnInit } from '@angular/core'; +import { takeUntil } from 'rxjs/operators'; +import { Component, OnInit, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; -import { UserService } from './../shared/services/user.service'; - @Component({ selector: 'app-municipios', templateUrl: './municipios.component.html', styleUrls: ['./municipios.component.scss'] }) -export class MunicipiosComponent implements OnInit { +export class MunicipiosComponent implements OnInit, OnDestroy { private unsubscribe = new Subject(); public municipioEscolhido: Municipio; constructor( + private router: Router, private activatedroute: ActivatedRoute, - private userService: UserService, private municipioService: MunicipioService) { } ngOnInit() { + // force route reload whenever params change; + this.router.routeReuseStrategy.shouldReuseRoute = () => false; const id = this.activatedroute.snapshot.paramMap.get('id'); // usado para buscar um município pelo id na URL this.getMunicipioById(id); - // usado para alterar o município quando a busca é realizada - this.getMunicipioObservable() } getMunicipioById(id: string) { this.municipioService.getById(id) .pipe(takeUntil(this.unsubscribe)) - .subscribe(municipio => { - this.municipioEscolhido = municipio; - this.userService.setMunicipioEscolhido(municipio); - }); - } - - getMunicipioObservable() { - this.userService - .getMunicipioEscolhido() - .pipe( - debounceTime(300), - takeUntil(this.unsubscribe)) .subscribe(municipio => { this.municipioEscolhido = municipio; }); diff --git a/src/app/shared/components/busca/busca.component.ts b/src/app/shared/components/busca/busca.component.ts index 0ab3517..8519dfc 100644 --- a/src/app/shared/components/busca/busca.component.ts +++ b/src/app/shared/components/busca/busca.component.ts @@ -1,10 +1,8 @@ import { Buscavel } from './../../models/buscavel.model'; import { BuscaService } from './../../services/busca.service'; -import { UserService } from '../../services/user.service'; import { RegiaoService } from '../../services/regiao.service'; import { TipoBusca } from './../../enum/tipo-busca.enum'; -import { Contrato } from './../../models/contrato.model'; import { Municipio } from '../../models/municipio.model'; import { Component, OnInit } from '@angular/core'; @@ -32,7 +30,6 @@ export class BuscaComponent implements OnInit { constructor(private router: Router, private regiaoService: RegiaoService, - private userService: UserService, private buscaService: BuscaService) { } ngOnInit() { @@ -63,7 +60,6 @@ export class BuscaComponent implements OnInit { if (this.buscaService.isContrato(buscavel)){ this.router.navigate(['contrato/search'], { queryParams: { termo: buscavel.descricao }}); } else if (this.buscaService.isMunicipio(buscavel)) { - this.userService.setMunicipioEscolhido(new Municipio(buscavel.id, buscavel.descricao)); this.router.navigateByUrl('/municipios/' + buscavel.id, { queryParams: {id: buscavel.id } }); } diff --git a/src/app/shared/components/card-contrato/card-contrato.component.html b/src/app/shared/components/card-contrato/card-contrato.component.html index 4d47201..9cb3394 100644 --- a/src/app/shared/components/card-contrato/card-contrato.component.html +++ b/src/app/shared/components/card-contrato/card-contrato.component.html @@ -24,7 +24,7 @@
-
até {{ contrato.pr_vigencia | date: 'dd/MM/yyyy'}}
+
até {{ contrato.pr_vigencia | date: 'dd/MM/yyyy'}}
de {{ contrato.dt_assinatura | date: 'dd/MM/yyyy'}} diff --git a/src/app/shared/components/card-contrato/card-contrato.component.ts b/src/app/shared/components/card-contrato/card-contrato.component.ts index cccb04a..7374631 100644 --- a/src/app/shared/components/card-contrato/card-contrato.component.ts +++ b/src/app/shared/components/card-contrato/card-contrato.component.ts @@ -1,5 +1,4 @@ import { Component, OnInit, Input } from '@angular/core'; -import { UserService } from '../../services/user.service'; import { ContratoService } from '../../services/contrato.service'; @Component({ @@ -7,25 +6,21 @@ import { ContratoService } from '../../services/contrato.service'; templateUrl: './card-contrato.component.html', styleUrls: ['./card-contrato.component.scss'] }) -export class CardContratoComponent implements OnInit { - - isPortrait = false; +export class CardContratoComponent implements OnInit { + isPortrait = false; @Input() contrato; - constructor(private userService: UserService, + constructor( private contratosService: ContratoService) { } ngOnInit(): void { - if (window.screen.width === 360) { // 768px portrait this.isPortrait = true; } } - getRisco (risco) { - if (!risco.previsaoContrato) return -1; + getRisco(risco) { + if (!risco.previsaoContrato) { return -1; } return risco.previsaoContrato.vig_prob_1 * 100; } - - } diff --git a/src/app/shared/services/user.service.ts b/src/app/shared/services/user.service.ts deleted file mode 100644 index 567dfc4..0000000 --- a/src/app/shared/services/user.service.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Municipio } from './../models/municipio.model'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root' -}) -export class UserService { - - private municipio = new BehaviorSubject(new Municipio()); - - constructor() { } - - getMunicipioEscolhido(): Observable { - const municipioSalvo = this.getMunicipioLocalStorage(); - - if (municipioSalvo && municipioSalvo !== null) { - this.municipio.next(municipioSalvo); - } - - return this.municipio.asObservable(); - } - - setMunicipioEscolhido(novosMunicipios: Municipio) { - const municipioSalvo = this.setMunicipioLocalStorage(novosMunicipios); - this.municipio.next(municipioSalvo); - } - - private getMunicipioLocalStorage(): Municipio { - return JSON.parse(localStorage.getItem('municipio')); - } - - private setMunicipioLocalStorage(novoMunicipio): Municipio { - localStorage.setItem('municipio', JSON.stringify(novoMunicipio)); - return(novoMunicipio); - } - -} From 2720c430de41e0ea4021bd3aa617a61a2a1ca0ff Mon Sep 17 00:00:00 2001 From: samarasss Date: Mon, 14 Sep 2020 13:37:37 -0300 Subject: [PATCH 08/23] Adiciona previsoes no model e service --- src/app/shared/models/previsao.model.ts | 16 +++++++++++++++ src/app/shared/services/contrato.service.ts | 2 ++ src/app/shared/services/previsao.service.ts | 22 +++++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 src/app/shared/models/previsao.model.ts create mode 100644 src/app/shared/services/previsao.service.ts diff --git a/src/app/shared/models/previsao.model.ts b/src/app/shared/models/previsao.model.ts new file mode 100644 index 0000000..8fa367b --- /dev/null +++ b/src/app/shared/models/previsao.model.ts @@ -0,0 +1,16 @@ +export class Previsao { + id_previsao_prod: string; + id_contrato: string; + id_experimento: string; + risco: number; + timestamp: Date + + constructor (id_previsao_prod, id_contrato, id_experimento, risco, timestamp) { + this.id_previsao_prod = id_previsao_prod; + this.id_contrato = id_contrato; + this.id_experimento = id_experimento; + this.risco = risco; + this.timestamp = timestamp + } +} + diff --git a/src/app/shared/services/contrato.service.ts b/src/app/shared/services/contrato.service.ts index 82f9145..9d29583 100644 --- a/src/app/shared/services/contrato.service.ts +++ b/src/app/shared/services/contrato.service.ts @@ -29,4 +29,6 @@ export class ContratoService { getContratosPorRisco(): Observable { return this.http.get(this.url + '/riscos/paraiba'); } + + } diff --git a/src/app/shared/services/previsao.service.ts b/src/app/shared/services/previsao.service.ts new file mode 100644 index 0000000..cfee106 --- /dev/null +++ b/src/app/shared/services/previsao.service.ts @@ -0,0 +1,22 @@ +import { Previsao } from './../models/previsao.model'; +import { Injectable } from '@angular/core'; + +import { Observable } from 'rxjs'; +import { HttpClient, HttpParams } from '@angular/common/http'; + +import { environment } from '../../../environments/environment'; + +@Injectable({ + providedIn: 'root' +}) +export class PrevisaoService { + + private url = environment.apiUrl + 'previsoes'; + + constructor(private http: HttpClient) { } + + getPrevisoes(): Observable { + return this.http.get(this.url); + } + +} From 8173227c5c7ab93e255f396642d4276f12104b9d Mon Sep 17 00:00:00 2001 From: samarasss Date: Tue, 15 Sep 2020 08:44:14 -0300 Subject: [PATCH 09/23] Adiciona o risco nos contratos por id e municipio --- .../info-contrato.component.html | 4 +- .../info-contrato/info-contrato.component.ts | 7 ++-- .../lista-contratos.component.html | 10 ++--- .../lista-contratos.component.ts | 6 +-- .../card-contrato/card-contrato.component.ts | 7 ++-- src/app/shared/models/contrato.model.ts | 2 + src/app/shared/services/contrato.service.ts | 40 ++++++++++++++++--- src/app/shared/services/previsao.service.ts | 15 +++++-- 8 files changed, 66 insertions(+), 25 deletions(-) diff --git a/src/app/contratos/info-contrato/info-contrato.component.html b/src/app/contratos/info-contrato/info-contrato.component.html index 08c4220..3940345 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.html +++ b/src/app/contratos/info-contrato/info-contrato.component.html @@ -115,8 +115,8 @@
aria-valuemax="100"> - {{getRisco (contrato)}}% de chances de rompimento - Nenhum risco associado. + {{getRisco (contrato)}}% de chances de rompimento + Nenhum risco associado. diff --git a/src/app/contratos/info-contrato/info-contrato.component.ts b/src/app/contratos/info-contrato/info-contrato.component.ts index 616d626..1db7cf8 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.ts +++ b/src/app/contratos/info-contrato/info-contrato.component.ts @@ -1,3 +1,4 @@ +import { Contrato } from './../../shared/models/contrato.model'; import { ContratoService } from './../../shared/services/contrato.service'; import { RegiaoService } from './../../shared/services/regiao.service'; @@ -78,11 +79,11 @@ export class InfoContratoComponent implements OnInit, OnDestroy { } } - getRisco(risco) { - if (!risco?.previsaoContrato) { + getRisco(contrato: Contrato) { + if (!contrato?.previsao) { return 0; } - return (risco?.previsaoContrato?.vig_prob_1 * 100).toFixed(0); + return (contrato?.previsao.risco * 100).toFixed(0); } ngOnDestroy() { diff --git a/src/app/contratos/lista-contratos/lista-contratos.component.html b/src/app/contratos/lista-contratos/lista-contratos.component.html index 950d709..46fa94a 100644 --- a/src/app/contratos/lista-contratos/lista-contratos.component.html +++ b/src/app/contratos/lista-contratos/lista-contratos.component.html @@ -66,11 +66,11 @@
Risco - + diff --git a/src/app/contratos/lista-contratos/lista-contratos.component.ts b/src/app/contratos/lista-contratos/lista-contratos.component.ts index a67e21e..6ef1a5e 100644 --- a/src/app/contratos/lista-contratos/lista-contratos.component.ts +++ b/src/app/contratos/lista-contratos/lista-contratos.component.ts @@ -80,9 +80,9 @@ export class ListaContratosComponent implements OnInit { } } - getRisco (risco) { - if (!risco) return -1; - return (risco * 100).toFixed(0); + getRisco (contrato: Contrato) { + if (!contrato?.previsao) return -1; + return (contrato?.previsao.risco * 100).toFixed(0); } } diff --git a/src/app/shared/components/card-contrato/card-contrato.component.ts b/src/app/shared/components/card-contrato/card-contrato.component.ts index 7374631..191fec9 100644 --- a/src/app/shared/components/card-contrato/card-contrato.component.ts +++ b/src/app/shared/components/card-contrato/card-contrato.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit, Input } from '@angular/core'; +import { Contrato } from '../../models/contrato.model'; import { ContratoService } from '../../services/contrato.service'; @Component({ @@ -19,8 +20,8 @@ export class CardContratoComponent implements OnInit { } } - getRisco(risco) { - if (!risco.previsaoContrato) { return -1; } - return risco.previsaoContrato.vig_prob_1 * 100; + getRisco(contrato: Contrato) { + if (!contrato.previsao) { return -1; } + return contrato.previsao.risco * 100; } } diff --git a/src/app/shared/models/contrato.model.ts b/src/app/shared/models/contrato.model.ts index 8060fcd..f95382a 100644 --- a/src/app/shared/models/contrato.model.ts +++ b/src/app/shared/models/contrato.model.ts @@ -1,5 +1,6 @@ import { TipoBusca } from './../enum/tipo-busca.enum'; import { Buscavel } from './buscavel.model'; +import { Previsao } from './previsao.model'; export class Contrato{ id_contrato: string id_licitacao: string @@ -23,5 +24,6 @@ export class Contrato{ ordem_servico : string no_fornecedor : string de_ugestora : string + previsao: Previsao } diff --git a/src/app/shared/services/contrato.service.ts b/src/app/shared/services/contrato.service.ts index 9d29583..12251ed 100644 --- a/src/app/shared/services/contrato.service.ts +++ b/src/app/shared/services/contrato.service.ts @@ -1,4 +1,7 @@ +import { map } from 'rxjs/operators'; +import { PrevisaoService } from './previsao.service'; import { Contrato } from './../models/contrato.model'; +import { Previsao } from './../models/previsao.model'; import { Observable } from 'rxjs'; import { Injectable } from '@angular/core'; import { HttpParams, HttpClient } from '@angular/common/http'; @@ -12,23 +15,48 @@ export class ContratoService { private url = environment.apiUrl + 'contratos'; - constructor(private http: HttpClient) { } - // Recupera contratos de um municipio - getContratosPorMunicipio(municipio: string): Observable { + + constructor(private http: HttpClient, private previsaoService: PrevisaoService) { + + } + + // Recupera contratos de um municipio + getContratosPorMunicipio(municipio: string): Observable { const params = new HttpParams().set('cd_municipio', municipio); - return this.http.get(this.url + '/municipio', { params }); + return this.http.get(this.url + '/municipio', { params }).pipe(map(res => { + this.previsaoService.previsoes.map(previsao => { + res.map(contrato => { + if (previsao.id_contrato == contrato.id_contrato) { + contrato.previsao = previsao; + } + }) + + }) + return res; + } + )) } // Recupera contrato pelo ID getById(id: string): Observable { - return this.http.get(this.url + '/' + id); + return this.http.get(this.url + '/' + id).pipe(map(res => { + this.previsaoService.previsoes.map(previsao => { + if (previsao.id_contrato == res.id_contrato) { + res.previsao = previsao; + } + }) + console.log(res); + return res + })); } + // Recupera contrato pelo Risco getContratosPorRisco(): Observable { return this.http.get(this.url + '/riscos/paraiba'); } - + + } diff --git a/src/app/shared/services/previsao.service.ts b/src/app/shared/services/previsao.service.ts index cfee106..6585f04 100644 --- a/src/app/shared/services/previsao.service.ts +++ b/src/app/shared/services/previsao.service.ts @@ -10,13 +10,22 @@ import { environment } from '../../../environments/environment'; providedIn: 'root' }) export class PrevisaoService { + static getPrevisoes() { + throw new Error('Method not implemented.'); + } private url = environment.apiUrl + 'previsoes'; - - constructor(private http: HttpClient) { } + previsoes; + constructor(private http: HttpClient) { + this.getPrevisoes().subscribe(previsao => { + this.previsoes = previsao; + + }); + console.log(this.previsoes); + } getPrevisoes(): Observable { return this.http.get(this.url); } - + } From fe65a40d8392450f54e772ce1c4fa252af36f84c Mon Sep 17 00:00:00 2001 From: samarasss Date: Tue, 15 Sep 2020 12:24:31 -0300 Subject: [PATCH 10/23] =?UTF-8?q?Adiciona=20o=20risco=20nas=20informa?= =?UTF-8?q?=C3=A7=C3=B5es=20da=20licita=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../risco-contratos.component.ts | 1 + .../card-contrato/card-contrato.component.ts | 4 ++++ src/app/shared/models/licitacao.model.ts | 2 ++ src/app/shared/services/contrato.service.ts | 13 ++++++++++--- src/app/shared/services/licitacao.service.ts | 18 ++++++++++++++++-- 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts index f99df7b..852537d 100644 --- a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts +++ b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts @@ -30,6 +30,7 @@ export class RiscoContratosComponent implements OnInit { .subscribe(contratos => { this.isLoading = false; this.contratos = contratos; + console.log(contratos) }); } diff --git a/src/app/shared/components/card-contrato/card-contrato.component.ts b/src/app/shared/components/card-contrato/card-contrato.component.ts index 191fec9..67d5ac2 100644 --- a/src/app/shared/components/card-contrato/card-contrato.component.ts +++ b/src/app/shared/components/card-contrato/card-contrato.component.ts @@ -21,7 +21,11 @@ export class CardContratoComponent implements OnInit { } getRisco(contrato: Contrato) { + console.log("aquii") if (!contrato.previsao) { return -1; } + console.log(this.contrato) + console.log(this.contrato.previsao) return contrato.previsao.risco * 100; + } } diff --git a/src/app/shared/models/licitacao.model.ts b/src/app/shared/models/licitacao.model.ts index 3c2357d..f2876cc 100644 --- a/src/app/shared/models/licitacao.model.ts +++ b/src/app/shared/models/licitacao.model.ts @@ -1,9 +1,11 @@ +import { Contrato } from './contrato.model'; export class Licitacao { id_licitacao: string cd_municipio: string cd_u_gestora: number dt_ano: number nu_licitacao: string + contratosLicitacao: Contrato[] tp_licitacao: string dt_homologacao: Date nu_propostas: string diff --git a/src/app/shared/services/contrato.service.ts b/src/app/shared/services/contrato.service.ts index 12251ed..9f1cf11 100644 --- a/src/app/shared/services/contrato.service.ts +++ b/src/app/shared/services/contrato.service.ts @@ -50,11 +50,18 @@ export class ContratoService { return res })); } - - + // Recupera contrato pelo Risco getContratosPorRisco(): Observable { - return this.http.get(this.url + '/riscos/paraiba'); + return this.http.get(this.url + '/vigentes').pipe(map(res => { + this.previsaoService.previsoes.map(previsao => { + res.map(contrato => { + contrato.previsao = previsao + }) + }) + console.log(res); + return res + })); } diff --git a/src/app/shared/services/licitacao.service.ts b/src/app/shared/services/licitacao.service.ts index c57499e..53397cf 100644 --- a/src/app/shared/services/licitacao.service.ts +++ b/src/app/shared/services/licitacao.service.ts @@ -1,3 +1,4 @@ +import { Contrato } from './../models/contrato.model'; import { Licitacao } from './../models/licitacao.model'; import { Injectable } from '@angular/core'; @@ -5,6 +6,8 @@ import { Observable } from 'rxjs'; import { HttpClient, HttpParams } from '@angular/common/http'; import { environment } from '../../../environments/environment'; +import { PrevisaoService } from './previsao.service'; +import { map } from 'rxjs/internal/operators/map'; @Injectable({ providedIn: 'root' @@ -13,11 +16,22 @@ export class LicitacaoService { private url = environment.apiUrl + 'licitacoes'; - constructor(private http: HttpClient) { } + constructor(private http: HttpClient, private previsaoService: PrevisaoService) { } get(id: string): Observable { - return this.http.get(this.url + '/' + id); + return this.http.get(this.url + '/' + id).pipe(map(res => { + this.previsaoService.previsoes.map(previsao => { + res.contratosLicitacao.map(contrato => { + if (previsao.id_contrato == contrato.id_contrato) { + contrato.previsao = previsao; + } + }) + + }) + return res; + } + )) } // Recupera licitacoes de um municipio From 915a55ce36025eba3169dcd6f4623b52b075826f Mon Sep 17 00:00:00 2001 From: diegooalmeida Date: Tue, 15 Sep 2020 16:53:54 -0300 Subject: [PATCH 11/23] Corrige rota e listagem dos contratos por risco --- .../risco-contratos/risco-contratos.component.html | 8 ++++---- .../risco-contratos/risco-contratos.component.ts | 7 +++---- .../components/card-contrato/card-contrato.component.ts | 8 ++------ src/app/shared/services/contrato.service.ts | 8 ++++---- src/app/shared/services/previsao.service.ts | 1 - 5 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html index 93844e2..20107d6 100644 --- a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html +++ b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.html @@ -23,8 +23,8 @@

Descrição: - Nenhuma descrição foi cadastrada para este contrato. - + Nenhuma descrição foi cadastrada para este contrato. +
@@ -57,9 +57,9 @@

Risco - + - + diff --git a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts index 852537d..bde9c0e 100644 --- a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts +++ b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts @@ -30,13 +30,12 @@ export class RiscoContratosComponent implements OnInit { .subscribe(contratos => { this.isLoading = false; this.contratos = contratos; - console.log(contratos) }); } - getRisco (risco) { - if (!risco.previsaoContrato) return -1; - return (risco.previsaoContrato.vig_prob_1 * 100).toFixed(0); + getRisco (contrato: Contrato) { + if (!contrato?.previsao) return -1; + return (contrato?.previsao.risco * 100).toFixed(0); } onPageChange(pag: number) { diff --git a/src/app/shared/components/card-contrato/card-contrato.component.ts b/src/app/shared/components/card-contrato/card-contrato.component.ts index 67d5ac2..0c616e1 100644 --- a/src/app/shared/components/card-contrato/card-contrato.component.ts +++ b/src/app/shared/components/card-contrato/card-contrato.component.ts @@ -21,11 +21,7 @@ export class CardContratoComponent implements OnInit { } getRisco(contrato: Contrato) { - console.log("aquii") - if (!contrato.previsao) { return -1; } - console.log(this.contrato) - console.log(this.contrato.previsao) - return contrato.previsao.risco * 100; - + if (!contrato.previsao) return -1; + return (contrato.previsao.risco * 100).toFixed(0); } } diff --git a/src/app/shared/services/contrato.service.ts b/src/app/shared/services/contrato.service.ts index 9f1cf11..3ec56d9 100644 --- a/src/app/shared/services/contrato.service.ts +++ b/src/app/shared/services/contrato.service.ts @@ -46,20 +46,20 @@ export class ContratoService { res.previsao = previsao; } }) - console.log(res); return res })); } // Recupera contrato pelo Risco getContratosPorRisco(): Observable { - return this.http.get(this.url + '/vigentes').pipe(map(res => { + return this.http.get(this.url + '/vigentes/riscos').pipe(map(res => { this.previsaoService.previsoes.map(previsao => { res.map(contrato => { - contrato.previsao = previsao + if (previsao.id_contrato == contrato.id_contrato) { + contrato.previsao = previsao; + } }) }) - console.log(res); return res })); } diff --git a/src/app/shared/services/previsao.service.ts b/src/app/shared/services/previsao.service.ts index 6585f04..cf59fe8 100644 --- a/src/app/shared/services/previsao.service.ts +++ b/src/app/shared/services/previsao.service.ts @@ -21,7 +21,6 @@ export class PrevisaoService { this.previsoes = previsao; }); - console.log(this.previsoes); } getPrevisoes(): Observable { From e2208eba4fa6dc275287cd863f35c4f711b8c28f Mon Sep 17 00:00:00 2001 From: samarasss Date: Wed, 16 Sep 2020 12:15:45 -0300 Subject: [PATCH 12/23] ordena por valor do contrato --- .../risco-contratos/risco-contratos.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts index bde9c0e..bec7d38 100644 --- a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts +++ b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts @@ -29,7 +29,9 @@ export class RiscoContratosComponent implements OnInit { this.contratosService.getContratosPorRisco() .subscribe(contratos => { this.isLoading = false; - this.contratos = contratos; + this.contratos = contratos + this.contratos = contratos.sort((a:Contrato, b:Contrato) => b.vl_total_contrato - a.vl_total_contrato); + console.log(contratos) }); } From c14d7112406183fea0e6429fde7c6fcc7b251be0 Mon Sep 17 00:00:00 2001 From: diegooalmeida Date: Wed, 16 Sep 2020 15:44:16 -0300 Subject: [PATCH 13/23] =?UTF-8?q?Adiciona=20ordena=C3=A7=C3=A3o=20pelo=20r?= =?UTF-8?q?isco=20na=20tela=20de=20Riscos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../risco-contratos.component.ts | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts index bec7d38..b10e01a 100644 --- a/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts +++ b/src/app/contratos/risco-contratos/risco-contratos/risco-contratos.component.ts @@ -29,12 +29,38 @@ export class RiscoContratosComponent implements OnInit { this.contratosService.getContratosPorRisco() .subscribe(contratos => { this.isLoading = false; - this.contratos = contratos - this.contratos = contratos.sort((a:Contrato, b:Contrato) => b.vl_total_contrato - a.vl_total_contrato); - console.log(contratos) + this.contratos = this.ordenaPorRisco(contratos); }); } + ordenaPorRisco(contratos: Contrato[]) { + let comRiscos: Contrato[] + comRiscos = [] + let semRiscos: Contrato[] + semRiscos = [] + let contratosOrdenados: Contrato[] + contratosOrdenados = [] + + for(let contrato of contratos) { + if (contrato?.previsao != null) { + comRiscos.push(contrato) + } else { + semRiscos.push(contrato) + } + } + + comRiscos = comRiscos.sort((a:Contrato, b:Contrato) => b.previsao.risco - a.previsao.risco); + + for(let contrato of comRiscos) { + contratosOrdenados.push(contrato) + } + for(let contrato of semRiscos) { + contratosOrdenados.push(contrato) + } + + return contratosOrdenados + } + getRisco (contrato: Contrato) { if (!contrato?.previsao) return -1; return (contrato?.previsao.risco * 100).toFixed(0); From 0fb2859d5c42dd205675690f55d1d3c45662841e Mon Sep 17 00:00:00 2001 From: diegooalmeida Date: Wed, 16 Sep 2020 16:57:33 -0300 Subject: [PATCH 14/23] =?UTF-8?q?Corrige=20ordena=C3=A7=C3=A3o=20por=20ris?= =?UTF-8?q?co=20na=20listagem=20da=20busca?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lista-contratos.component.ts | 31 ++++++++++++++++++- src/app/shared/services/busca.service.ts | 15 +++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/app/contratos/lista-contratos/lista-contratos.component.ts b/src/app/contratos/lista-contratos/lista-contratos.component.ts index 6ef1a5e..3119eb7 100644 --- a/src/app/contratos/lista-contratos/lista-contratos.component.ts +++ b/src/app/contratos/lista-contratos/lista-contratos.component.ts @@ -64,7 +64,36 @@ export class ListaContratosComponent implements OnInit { ordenaPorRisco() { this.ordenacaoSelecionada = this.dropDownOptions [3] - this.contratos.sort((a, b) => (b.vig_prob_1 != null ? b.vig_prob_1 : -Infinity) - (a.vig_prob_1 != null ? a.vig_prob_1 : -Infinity)); + + let comRiscos: any[] + comRiscos = [] + let semRiscos: any[] + semRiscos = [] + let contratosOrdenados: any[] + contratosOrdenados = [] + + for(let contrato of this.contratos) { + if (contrato?.previsao != null) { + comRiscos.push(contrato) + } else { + semRiscos.push(contrato) + } + } + + comRiscos = comRiscos.sort((a, b) => (b.previsao.risco != null ? b.previsao.risco : -Infinity) - (a.previsao.risco != null ? a.previsao.risco : -Infinity)); + + console.log(comRiscos) + console.log(semRiscos) + + for(let contrato of comRiscos) { + contratosOrdenados.push(contrato) + } + for(let contrato of semRiscos) { + contratosOrdenados.push(contrato) + } + + this.contratos = contratosOrdenados + } diff --git a/src/app/shared/services/busca.service.ts b/src/app/shared/services/busca.service.ts index 3d1206e..5aa1bc5 100644 --- a/src/app/shared/services/busca.service.ts +++ b/src/app/shared/services/busca.service.ts @@ -2,6 +2,7 @@ import { TipoBusca } from './../enum/tipo-busca.enum'; import { Municipio } from './../models/municipio.model'; import { takeUntil, map } from 'rxjs/operators'; import { RegiaoService } from './regiao.service'; +import { PrevisaoService } from './previsao.service'; import { Observable, of, Subject } from 'rxjs'; import { Contrato } from './../models/contrato.model'; import { HttpClient, HttpParams } from '@angular/common/http'; @@ -17,7 +18,8 @@ export class BuscaService { private unsubscribe = new Subject(); constructor(private regiaoService: RegiaoService, - private http: HttpClient) { + private http: HttpClient, + private previsaoService: PrevisaoService) { } /** @@ -31,7 +33,16 @@ export class BuscaService { } const params = new HttpParams().set('termo', term?.trim()); - return this.http.get(this.url, { params }); + return this.http.get(this.url, { params }).pipe(map(res => { + this.previsaoService.previsoes.map(previsao => { + res.map(contrato => { + if (previsao.id_contrato == contrato.id_contrato) { + contrato.previsao = previsao; + } + }) + }) + return res + })); } From 29f166a93978426dadebaac2268f7b5a021489c6 Mon Sep 17 00:00:00 2001 From: diegooalmeida Date: Tue, 22 Sep 2020 16:58:45 -0300 Subject: [PATCH 15/23] =?UTF-8?q?Adiciona=20conex=C3=A3o=20ao=20google=20a?= =?UTF-8?q?nalytics?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/app.component.ts | 17 +++++++++++++++++ src/index.html | 8 ++++++++ 2 files changed, 25 insertions(+) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index f9828e5..853e7e5 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,5 +1,10 @@ +import { Router, NavigationEnd } from '@angular/router'; import { Component } from '@angular/core'; +import { filter } from 'rxjs/operators'; + +declare var gtag; + @Component({ selector: 'app-root', templateUrl: './app.component.html', @@ -8,4 +13,16 @@ import { Component } from '@angular/core'; export class AppComponent { title = 'client'; + constructor(private router: Router){ + const navEndEvents$ = this.router.events + .pipe( + filter(event => event instanceof NavigationEnd) + ); + + navEndEvents$.subscribe((event: NavigationEnd) => { + gtag('config', 'UA-178653936-1', { + 'page_path': event.urlAfterRedirects + }); + }); + } } diff --git a/src/index.html b/src/index.html index 4c6d3b6..b52d6eb 100644 --- a/src/index.html +++ b/src/index.html @@ -6,6 +6,14 @@ + + + + From 2fd141a6e2e2f8bc3d6b262828bfd68db3814223 Mon Sep 17 00:00:00 2001 From: samarasss Date: Thu, 24 Sep 2020 13:21:04 -0300 Subject: [PATCH 16/23] =?UTF-8?q?Adiciona=20a=20busca=20pelo=20n=C3=BAmero?= =?UTF-8?q?=20da=20licita=C3=A7=C3=A3o=20ou=20n=C3=BAmero=20do=20contrato?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lista-contratos.component.html | 35 ++++++++++++++++++- .../lista-contratos.component.ts | 3 -- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/app/contratos/lista-contratos/lista-contratos.component.html b/src/app/contratos/lista-contratos/lista-contratos.component.html index 46fa94a..982e231 100644 --- a/src/app/contratos/lista-contratos/lista-contratos.component.html +++ b/src/app/contratos/lista-contratos/lista-contratos.component.html @@ -43,8 +43,41 @@
+ +
+ +
+
+ Nº Licitação: +

{{contrato.nu_licitacao}}

+ Nº Contrato: +

{{contrato.nu_contrato}}

+
+
+ +
+
+ Nº Contrato: +

{{contrato.nu_contrato}}

+
+
+ +
+
+ Nº Licitação: +

{{contrato.nu_licitacao}}

+
+
+ + +
+ + + -
+ + +
Descrição:
diff --git a/src/app/contratos/lista-contratos/lista-contratos.component.ts b/src/app/contratos/lista-contratos/lista-contratos.component.ts index 3119eb7..968cecf 100644 --- a/src/app/contratos/lista-contratos/lista-contratos.component.ts +++ b/src/app/contratos/lista-contratos/lista-contratos.component.ts @@ -81,9 +81,6 @@ export class ListaContratosComponent implements OnInit { } comRiscos = comRiscos.sort((a, b) => (b.previsao.risco != null ? b.previsao.risco : -Infinity) - (a.previsao.risco != null ? a.previsao.risco : -Infinity)); - - console.log(comRiscos) - console.log(semRiscos) for(let contrato of comRiscos) { contratosOrdenados.push(contrato) From 1cf4b44599087b6871d95ce172a8b157db0742fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaquim=20Hon=C3=B3rio?= Date: Mon, 28 Sep 2020 09:15:24 -0300 Subject: [PATCH 17/23] Adiciona valor pago nos contratos --- .../info-contrato.component.html | 2 +- .../info-contrato/info-contrato.component.ts | 11 ++++++++++ .../info-licitacao.component.html | 2 +- .../info-licitacao.component.ts | 22 ++++++++++++++++++- .../card-contrato.component.html | 8 +------ .../card-contrato/card-contrato.component.ts | 11 +++++++++- src/app/shared/models/contrato.model.ts | 3 +++ src/app/shared/models/pagamento.model.ts | 5 +++++ 8 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 src/app/shared/models/pagamento.model.ts diff --git a/src/app/contratos/info-contrato/info-contrato.component.html b/src/app/contratos/info-contrato/info-contrato.component.html index 3940345..e6e9ed5 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.html +++ b/src/app/contratos/info-contrato/info-contrato.component.html @@ -54,7 +54,7 @@
Valor do Contrato
-
+

{{ contrato?.vl_total_contrato | currency: "R$" }}

diff --git a/src/app/contratos/info-contrato/info-contrato.component.ts b/src/app/contratos/info-contrato/info-contrato.component.ts index 1db7cf8..5dba287 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.ts +++ b/src/app/contratos/info-contrato/info-contrato.component.ts @@ -86,6 +86,17 @@ export class InfoContratoComponent implements OnInit, OnDestroy { return (contrato?.previsao.risco * 100).toFixed(0); } + getPorcentagemPago(contrato: Contrato) { + if (!contrato || !contrato.pagamentosContrato) { + return -1; + } + let totalPago = 0; + for (let pagamento of contrato.pagamentosContrato){ + totalPago += +pagamento.vl_pagamento; + } + return (totalPago / contrato.vl_total_contrato * 100).toFixed(0); + } + ngOnDestroy() { this.unsubscribe.next(); this.unsubscribe.complete(); diff --git a/src/app/licitacoes/info-licitacao/info-licitacao.component.html b/src/app/licitacoes/info-licitacao/info-licitacao.component.html index 62b824a..0f94353 100644 --- a/src/app/licitacoes/info-licitacao/info-licitacao.component.html +++ b/src/app/licitacoes/info-licitacao/info-licitacao.component.html @@ -120,7 +120,7 @@
Contratos Originados
-
+
diff --git a/src/app/licitacoes/info-licitacao/info-licitacao.component.ts b/src/app/licitacoes/info-licitacao/info-licitacao.component.ts index 9d2e60e..23fc83d 100644 --- a/src/app/licitacoes/info-licitacao/info-licitacao.component.ts +++ b/src/app/licitacoes/info-licitacao/info-licitacao.component.ts @@ -20,7 +20,8 @@ export class InfoLicitacaoComponent implements OnInit { constructor( private location: Location) { } - ngOnInit(): void {} + ngOnInit(): void { + } getEventosTimeline() { if (this.licitacao) { @@ -45,6 +46,25 @@ export class InfoLicitacaoComponent implements OnInit { return contemNaLista; } + getContratosLicitacao(){ + let contratos = this.licitacao.contratosLicitacao; + + if (!contratos) { + return []; + } + + for (let contrato of contratos) { + if (contrato.pagamentosContrato){ + let totalPago = 0; + for (let pagamento of contrato.pagamentosContrato) { + totalPago += parseFloat(pagamento.vl_pagamento); + } + contrato.totalPago = totalPago; + } + } + return this.licitacao.contratosLicitacao; + } + lastPage() { this.location.back(); } diff --git a/src/app/shared/components/card-contrato/card-contrato.component.html b/src/app/shared/components/card-contrato/card-contrato.component.html index 9cb3394..f145d9c 100644 --- a/src/app/shared/components/card-contrato/card-contrato.component.html +++ b/src/app/shared/components/card-contrato/card-contrato.component.html @@ -17,7 +17,7 @@
Pago
-
+
@@ -28,12 +28,6 @@
até {{ contrato.pr_vigencia | dat de {{ contrato.dt_assinatura | date: 'dd/MM/yyyy'}}
- -
Date: Mon, 28 Sep 2020 11:55:58 -0300 Subject: [PATCH 18/23] =?UTF-8?q?Adiciona=20a=20porcentagem=20da=20difen?= =?UTF-8?q?=C3=A7a=20do=20que=20foi=20pago=20em=20rela=C3=A7=C3=A3o=20ao?= =?UTF-8?q?=20estimado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../info-contrato.component.html | 23 +++++++++++++++---- .../info-contrato/info-contrato.component.ts | 19 ++++++++++++++- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/app/contratos/info-contrato/info-contrato.component.html b/src/app/contratos/info-contrato/info-contrato.component.html index e6e9ed5..5c2bd12 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.html +++ b/src/app/contratos/info-contrato/info-contrato.component.html @@ -51,14 +51,27 @@
- Valor do Contrato -
+ Custo + +
+ valor contratado de {{ contrato?.vl_total_contrato | currency: "R$" }} +

foi pago {{getTotalPago(contrato) | currency: "R$"}} + + ({{getPorcentagemDiff(contrato) > 0 ? '+' : ''}}{{getPorcentagemDiff(contrato)}}%) + + +

+

+ nenhum pagamento foi registrado. +

Vigência diff --git a/src/app/contratos/info-contrato/info-contrato.component.ts b/src/app/contratos/info-contrato/info-contrato.component.ts index 5dba287..c48850c 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.ts +++ b/src/app/contratos/info-contrato/info-contrato.component.ts @@ -87,6 +87,13 @@ export class InfoContratoComponent implements OnInit, OnDestroy { } getPorcentagemPago(contrato: Contrato) { + if (!contrato || !contrato.pagamentosContrato) { + return -1; + } + return (this. getTotalPago(contrato) / contrato.vl_total_contrato * 100).toFixed(0); + } + + getTotalPago(contrato: Contrato) { if (!contrato || !contrato.pagamentosContrato) { return -1; } @@ -94,7 +101,17 @@ export class InfoContratoComponent implements OnInit, OnDestroy { for (let pagamento of contrato.pagamentosContrato){ totalPago += +pagamento.vl_pagamento; } - return (totalPago / contrato.vl_total_contrato * 100).toFixed(0); + return totalPago; + } + + getPorcentagemDiff(contrato: Contrato){ + if (!contrato || !contrato.pagamentosContrato) { + return -1; + } + const diferenca = this.getTotalPago(contrato) - contrato.vl_total_contrato; + return ( diferenca / contrato.vl_total_contrato * 100).toFixed(0); + + } ngOnDestroy() { From 7841087f57c31ffe54e72f34d2af06e0a0039cfc Mon Sep 17 00:00:00 2001 From: samarasss Date: Mon, 28 Sep 2020 14:55:19 -0300 Subject: [PATCH 19/23] =?UTF-8?q?Adiciona=20o=20carregando=20na=20p=C3=A1g?= =?UTF-8?q?ina=20de=20contratos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contratos/info-contrato/info-contrato.component.html | 6 ++++++ src/app/contratos/info-contrato/info-contrato.component.ts | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/app/contratos/info-contrato/info-contrato.component.html b/src/app/contratos/info-contrato/info-contrato.component.html index 5c2bd12..ef59d85 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.html +++ b/src/app/contratos/info-contrato/info-contrato.component.html @@ -1,3 +1,8 @@ +
+ +
+ +
+
\ No newline at end of file diff --git a/src/app/contratos/info-contrato/info-contrato.component.ts b/src/app/contratos/info-contrato/info-contrato.component.ts index c48850c..a51ef20 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.ts +++ b/src/app/contratos/info-contrato/info-contrato.component.ts @@ -19,7 +19,7 @@ import { Location } from '@angular/common'; export class InfoContratoComponent implements OnInit, OnDestroy { public contrato: any; - + public isLoading = true; private unsubscribe = new Subject(); public municipioEscolhido: Municipio; @@ -39,6 +39,7 @@ export class InfoContratoComponent implements OnInit, OnDestroy { .pipe(takeUntil(this.unsubscribe)) .subscribe(contrato => { this.contrato = contrato; + this.isLoading = false; this.getMunicipioById(contrato.cd_municipio); }); } From 7db42ba6b2d87df55fff0b5a18f2945272c0d127 Mon Sep 17 00:00:00 2001 From: diegooalmeida Date: Mon, 28 Sep 2020 16:45:33 -0300 Subject: [PATCH 20/23] Adiciona pagamentos e empenhos na timeline do contrato --- .../info-contrato.component.html | 8 +++++--- .../info-contrato.component.scss | 20 +++++++++++++++++++ .../info-contrato/info-contrato.component.ts | 13 +++++++++++- .../info-licitacao.component.ts | 2 +- .../timeline/timeline.component.html | 5 ++++- .../timeline/timeline.component.scss | 3 ++- src/app/shared/models/evento.model.ts | 4 +++- 7 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/app/contratos/info-contrato/info-contrato.component.html b/src/app/contratos/info-contrato/info-contrato.component.html index e6e9ed5..198feb2 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.html +++ b/src/app/contratos/info-contrato/info-contrato.component.html @@ -124,10 +124,12 @@
-
Eventos
+
Eventos
-
- +
+
+ +
diff --git a/src/app/contratos/info-contrato/info-contrato.component.scss b/src/app/contratos/info-contrato/info-contrato.component.scss index 367d86d..4e2471c 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.scss +++ b/src/app/contratos/info-contrato/info-contrato.component.scss @@ -37,6 +37,26 @@ background-color: #ffffff00; border-radius: 0; } +// SCROLLBAR TIMELINE +.container-timeline { + width: 100%; + overflow-x: auto; + white-space: nowrap; +} + +::-webkit-scrollbar { + height: 6px; +} + +::-webkit-scrollbar-track { + background: #edf0f4; + border-radius: 10px; +} + +::-webkit-scrollbar-thumb { + border-radius: 10px; + background: #4c4c6a; +} .progress { border-radius: 13px; diff --git a/src/app/contratos/info-contrato/info-contrato.component.ts b/src/app/contratos/info-contrato/info-contrato.component.ts index 5dba287..3ea82be 100644 --- a/src/app/contratos/info-contrato/info-contrato.component.ts +++ b/src/app/contratos/info-contrato/info-contrato.component.ts @@ -74,8 +74,19 @@ export class InfoContratoComponent implements OnInit, OnDestroy { if (this.contrato) { const eventosTimeline: Array = []; eventosTimeline.push (new Evento('Assinatura', this.contrato.dt_assinatura)); + if (this.contrato.empenhosContrato){ + for (let empenho of this.contrato.empenhosContrato){ + eventosTimeline.push(new Evento('Empenho', empenho.dt_empenho, empenho.vl_empenho)); + } + } + if (this.contrato.pagamentosContrato) { + for (let pagamento of this.contrato.pagamentosContrato){ + eventosTimeline.push(new Evento('Pagamento', pagamento.dt_pagamento, pagamento.vl_pagamento)); + } + } eventosTimeline.push (new Evento('Fim da vigência', this.contrato.pr_vigencia)); - return eventosTimeline; + + return eventosTimeline.sort((b, a) => new Date(b.data).getTime() - new Date(a.data).getTime()); } } diff --git a/src/app/licitacoes/info-licitacao/info-licitacao.component.ts b/src/app/licitacoes/info-licitacao/info-licitacao.component.ts index 23fc83d..fd4fe93 100644 --- a/src/app/licitacoes/info-licitacao/info-licitacao.component.ts +++ b/src/app/licitacoes/info-licitacao/info-licitacao.component.ts @@ -28,7 +28,7 @@ export class InfoLicitacaoComponent implements OnInit { const eventosTimeline: Array = []; eventosTimeline.push (new Evento('Homologação', this.licitacao?.dt_homologacao)); this.licitacao.contratosLicitacao?.forEach(function (contrato) { - eventosTimeline.push (new Evento('Contrato', contrato?.dt_assinatura, contrato?.id_contrato)) + eventosTimeline.push (new Evento('Contrato', contrato?.dt_assinatura, 0, contrato?.id_contrato)) }); return eventosTimeline; } diff --git a/src/app/shared/components/timeline/timeline.component.html b/src/app/shared/components/timeline/timeline.component.html index bef2a07..bbf20cf 100644 --- a/src/app/shared/components/timeline/timeline.component.html +++ b/src/app/shared/components/timeline/timeline.component.html @@ -2,9 +2,12 @@
  • + {{evento?.data | date: 'dd-MM-yyyy'}} {{evento?.descricao}} {{evento?.descricao}} - {{evento?.data | date: 'dd-MM-yyyy'}} + + {{ evento?.valor | currency: "R$"}} +
  • diff --git a/src/app/shared/components/timeline/timeline.component.scss b/src/app/shared/components/timeline/timeline.component.scss index 65336e9..9410379 100644 --- a/src/app/shared/components/timeline/timeline.component.scss +++ b/src/app/shared/components/timeline/timeline.component.scss @@ -5,11 +5,12 @@ $color-success-node: #cc8e36; .horizontal-timeline { list-style-type: none; display: flex; - align-items: center; + align-items: normal; } .info { display: flex; + width: 100px; flex-direction: column; align-items: center; font-weight: 100; diff --git a/src/app/shared/models/evento.model.ts b/src/app/shared/models/evento.model.ts index 05d623e..66e39f0 100644 --- a/src/app/shared/models/evento.model.ts +++ b/src/app/shared/models/evento.model.ts @@ -2,12 +2,14 @@ export class Evento { descricao: string data: Date completo: boolean + valor: number id: string - constructor (descricao, data, id?){ + constructor (descricao, data, valor?, id?){ this.descricao = descricao; this.data = data; this.completo = new Date (data) < new Date (); + this.valor = valor; this.id = id; } } From 393233132beac2cce18bc34f4041eccc274ba187 Mon Sep 17 00:00:00 2001 From: samarasss Date: Mon, 28 Sep 2020 16:56:45 -0300 Subject: [PATCH 21/23] =?UTF-8?q?Adiciona=20o=20carregando=20nas=20informa?= =?UTF-8?q?=C3=A7=C3=B5es=20da=20licita=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/licitacoes/licitacao.component.html | 8 ++++++-- src/app/licitacoes/licitacao.component.ts | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/app/licitacoes/licitacao.component.html b/src/app/licitacoes/licitacao.component.html index 7b706aa..9b226c6 100644 --- a/src/app/licitacoes/licitacao.component.html +++ b/src/app/licitacoes/licitacao.component.html @@ -1,3 +1,7 @@ -
    +
    + +
    + +
    -
    \ No newline at end of file +
    diff --git a/src/app/licitacoes/licitacao.component.ts b/src/app/licitacoes/licitacao.component.ts index 6a4d45d..d7760db 100644 --- a/src/app/licitacoes/licitacao.component.ts +++ b/src/app/licitacoes/licitacao.component.ts @@ -18,6 +18,7 @@ export class LicitacaoComponent implements OnInit, OnDestroy { private unsubscribe = new Subject(); public licitacao = new Licitacao(); public municipioEscolhido; + public isLoading = true; constructor( private regiaoService: RegiaoService, @@ -34,6 +35,7 @@ export class LicitacaoComponent implements OnInit, OnDestroy { .pipe(takeUntil(this.unsubscribe)) .subscribe(licitacao => { this.licitacao = licitacao; + this.isLoading = false; this.getMunicipioByID(this.licitacao?.cd_municipio); }); } From ce13ac10138eef0c53ae15c5a3a4f978ab503020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaquim=20Hon=C3=B3rio?= Date: Tue, 29 Sep 2020 08:53:48 -0300 Subject: [PATCH 22/23] Altera layout da timeline --- .../timeline/timeline.component.html | 17 ++++++---- .../timeline/timeline.component.scss | 31 +++++++++++++++++-- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/app/shared/components/timeline/timeline.component.html b/src/app/shared/components/timeline/timeline.component.html index bbf20cf..6a93cf2 100644 --- a/src/app/shared/components/timeline/timeline.component.html +++ b/src/app/shared/components/timeline/timeline.component.html @@ -1,11 +1,16 @@
    • -
      -
      - {{evento?.data | date: 'dd-MM-yyyy'}} - {{evento?.descricao}} - {{evento?.descricao}} - + + {{evento?.data | date: 'dd/MM/yyyy'}} +
      +
      + {{evento?.descricao}} + {{evento?.descricao}} + {{ evento?.valor | currency: "R$"}}
      diff --git a/src/app/shared/components/timeline/timeline.component.scss b/src/app/shared/components/timeline/timeline.component.scss index 9410379..39d4a47 100644 --- a/src/app/shared/components/timeline/timeline.component.scss +++ b/src/app/shared/components/timeline/timeline.component.scss @@ -10,11 +10,17 @@ $color-success-node: #cc8e36; .info { display: flex; - width: 100px; flex-direction: column; align-items: center; font-weight: 100; - margin-top: 20px; + font-family: 'Dosis', sans-serif; +} + +.data-timeline { + padding: 0px 40px; + bottom: 14px; + position: relative; + justify-content: center; font-family: 'Dosis', sans-serif; } @@ -47,6 +53,18 @@ $color-success-node: #cc8e36; } } + .edge.secondary { + padding: 0px 20px; + border-top: 2px solid $color-success-node; + &:before { + background-color: white; + width: 19px; + height: 19px; + top: -10px; + border: 2px solid $color-success-node; + } + } + ul { display: block; list-style-type: disc; @@ -57,6 +75,15 @@ ul { padding-inline-start: 0px; } +.description { + font-weight: 800; +} + +.valor { + position: relative; + bottom: 4px; +} + .description-clickable:hover { cursor: pointer; text-decoration: underline; From b862069f6386ee8c8102237d8acb2b9b8ed27aaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaquim=20Hon=C3=B3rio?= Date: Tue, 29 Sep 2020 09:24:21 -0300 Subject: [PATCH 23/23] =?UTF-8?q?Corrige=20layout=20da=20timeline=20na=20p?= =?UTF-8?q?ag=20de=20licita=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/shared/components/timeline/timeline.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/components/timeline/timeline.component.html b/src/app/shared/components/timeline/timeline.component.html index 6a93cf2..4b57980 100644 --- a/src/app/shared/components/timeline/timeline.component.html +++ b/src/app/shared/components/timeline/timeline.component.html @@ -9,7 +9,7 @@ }">
      {{evento?.descricao}} - {{evento?.descricao}} + {{evento?.descricao}} {{ evento?.valor | currency: "R$"}}