From 142d97374627e443597c05e518f894546c9dbd2b Mon Sep 17 00:00:00 2001 From: Raphael Rivas Date: Wed, 28 Feb 2024 09:58:46 -0300 Subject: [PATCH 1/8] repo --- .../cliente-favorecido.repository.service.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/cnab/{repository/ClienteFavorecidoRepository.ts => repositories/cliente-favorecido.repository.service.ts} (100%) diff --git a/src/cnab/repository/ClienteFavorecidoRepository.ts b/src/cnab/repositories/cliente-favorecido.repository.service.ts similarity index 100% rename from src/cnab/repository/ClienteFavorecidoRepository.ts rename to src/cnab/repositories/cliente-favorecido.repository.service.ts From 06955124489d7b493668f7fbf30fa7d118287a26 Mon Sep 17 00:00:00 2001 From: Raphael Rivas Date: Wed, 28 Feb 2024 09:59:28 -0300 Subject: [PATCH 2/8] fix: rename --- ...ido.repository.service.ts => cliente-favorecido.repository.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/cnab/repositories/{cliente-favorecido.repository.service.ts => cliente-favorecido.repository.ts} (100%) diff --git a/src/cnab/repositories/cliente-favorecido.repository.service.ts b/src/cnab/repositories/cliente-favorecido.repository.ts similarity index 100% rename from src/cnab/repositories/cliente-favorecido.repository.service.ts rename to src/cnab/repositories/cliente-favorecido.repository.ts From c3812b1bf19e8109cf412727dd889a8b0ecb7391 Mon Sep 17 00:00:00 2001 From: Raphael Rivas Date: Wed, 28 Feb 2024 11:21:52 -0300 Subject: [PATCH 3/8] feat:bq-transacao repository --- package-lock.json | 29 ++++-- package.json | 1 + .../bq-transacao.repository.service.spec.ts | 89 +++++++++++++++++++ .../bq-transacao.repository.service.ts | 20 ++--- yarn.lock | 7 +- 5 files changed, 129 insertions(+), 17 deletions(-) create mode 100644 src/bigquery/repositories/bq-transacao.repository.service.spec.ts diff --git a/package-lock.json b/package-lock.json index 2061f437..ad366f3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "class-transformer": "0.5.1", "class-validator": "0.14.0", "date-fns": "^2.30.0", + "dotenv": "^16.4.5", "fb": "2.0.0", "gerador-validador-cpf": "^5.0.2", "google-auth-library": "8.8.0", @@ -3431,6 +3432,14 @@ "rxjs": "^6.0.0 || ^7.2.0" } }, + "node_modules/@nestjs/config/node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, "node_modules/@nestjs/config/node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -6470,11 +6479,14 @@ } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/dotenv-expand": { @@ -18463,6 +18475,11 @@ "uuid": "9.0.0" }, "dependencies": { + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, "uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -20839,9 +20856,9 @@ } }, "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" }, "dotenv-expand": { "version": "10.0.0", diff --git a/package.json b/package.json index 4803c63b..c6af548b 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "class-transformer": "0.5.1", "class-validator": "0.14.0", "date-fns": "^2.30.0", + "dotenv": "^16.4.5", "fb": "2.0.0", "gerador-validador-cpf": "^5.0.2", "google-auth-library": "8.8.0", diff --git a/src/bigquery/repositories/bq-transacao.repository.service.spec.ts b/src/bigquery/repositories/bq-transacao.repository.service.spec.ts new file mode 100644 index 00000000..f68d0a76 --- /dev/null +++ b/src/bigquery/repositories/bq-transacao.repository.service.spec.ts @@ -0,0 +1,89 @@ +import { Provider } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import { BigqueryService } from 'src/bigquery/bigquery.service'; +import { SettingsService } from 'src/settings/settings.service'; +import { BqTransacaoRepositoryService } from './bq-transacao.repository.service'; +import { ConfigService } from '@nestjs/config'; +import { resolve } from 'path'; +import { config } from 'dotenv'; +import { BigqueryEnvironment } from 'src/settings/enums/bigquery-env.enum'; +import { SettingEntity } from 'src/settings/entities/setting.entity'; + +describe('BqTransacaoRepositoryService', () => { + let settingsService: SettingsService; + let bqTransacaoRepository: BqTransacaoRepositoryService; + const mockBqGoogleCredentials = () => ({ + 'google.clientApiType': process.env.GOOGLE_CLIENT_API_TYPE, + 'google.clientApiProjectId': process.env.GOOGLE_CLIENT_API_PROJECT_ID, + 'google.clientApiPrivateKeyId': + process.env.GOOGLE_CLIENT_API_PRIVATE_KEY_ID, + 'google.clientApiPrivateKey': process.env.GOOGLE_CLIENT_API_PRIVATE_KEY, + 'google.clientApiClientEmail': process.env.GOOGLE_CLIENT_API_CLIENT_EMAIL, + 'google.clientApiClientId': process.env.GOOGLE_CLIENT_API_CLIENT_ID, + 'google.clientApiAuthUri': process.env.GOOGLE_CLIENT_API_AUTH_URI, + 'google.clientApiTokenUri': process.env.GOOGLE_CLIENT_API_TOKEN_URI, + 'google.clientApiAuthProviderX509CertUrl': + process.env.GOOGLE_CLIENT_API_AUTH_PROVIDER_X509_CERT_URL, + 'google.clientApiClientX509CertUrl': + process.env.GOOGLE_CLIENT_API_CLIENT_X509_CERT_URL, + 'google.clientApiUniverseDomain': + process.env.GOOGLE_CLIENT_API_UNIVERSE_DOMAIN, + }); + + beforeAll(() => { + const envPath = resolve(__dirname, '../../../.env'); + config({ path: envPath }); + }); + + beforeEach(async () => { + const settingsServiceMock = { + provide: SettingsService, + useValue: { + getOneBySettingData: jest.fn(), + }, + } as Provider; + const configServiceMock = { + provide: ConfigService, + useValue: { + getOrThrow: jest.fn((key: string) => mockBqGoogleCredentials()[key]), + }, + } as Provider; + const module: TestingModule = await Test.createTestingModule({ + providers: [ + BigqueryService, + BqTransacaoRepositoryService, + settingsServiceMock, + configServiceMock, + ], + }).compile(); + + settingsService = module.get(SettingsService); + bqTransacaoRepository = module.get(BqTransacaoRepositoryService); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(settingsService).toBeDefined(); + }); + + describe('findTransacaoBy', () => { + it('should return some data', async () => { + // Arrange + jest.spyOn(settingsService, 'getOneBySettingData').mockResolvedValueOnce({ + getValueAsString: () => BigqueryEnvironment.Development, + } as SettingEntity); + + // Act + const result = await bqTransacaoRepository.findTransacaoBy({ + startDate: new Date('2023-06-01'), + endDate: new Date('2024-06-01'), + }); + + // Assert + expect(result.length).toBeGreaterThan(0); + }); + }); +}); diff --git a/src/bigquery/repositories/bq-transacao.repository.service.ts b/src/bigquery/repositories/bq-transacao.repository.service.ts index 14da7edd..d705c768 100644 --- a/src/bigquery/repositories/bq-transacao.repository.service.ts +++ b/src/bigquery/repositories/bq-transacao.repository.service.ts @@ -1,16 +1,16 @@ import { Injectable, Logger } from '@nestjs/common'; -import { BQSInstances, BigqueryService } from '../bigquery.service'; -import { BqTransacao } from '../entities/transacao.bq-entity'; -import { IBqFetchTransacao } from '../interfaces/bq-find-transacao-by.interface'; -import { SettingsService } from 'src/settings/settings.service'; import { appSettings } from 'src/settings/app.settings'; import { BigqueryEnvironment } from 'src/settings/enums/bigquery-env.enum'; -import { QueryBuilder } from 'src/utils/query-builder/query-builder'; -import { isCpfOrCnpj } from 'src/utils/cpf-cnpj'; +import { SettingsService } from 'src/settings/settings.service'; import { TRIntegrationTypeMap } from 'src/ticket-revenues/maps/ticket-revenues.map'; +import { isCpfOrCnpj } from 'src/utils/cpf-cnpj'; +import { QueryBuilder } from 'src/utils/query-builder/query-builder'; +import { BQSInstances, BigqueryService } from '../bigquery.service'; +import { BqTransacao } from '../entities/transacao.bq-entity'; +import { IBqFetchTransacao } from '../interfaces/bq-find-transacao-by.interface'; import { BqTsansacaoTipoIntegracaoMap } from '../maps/bq-transacao-tipo-integracao.map'; -import { BqTransacaoTipoTransacaoMap } from '../maps/bq-transacao-tipo-transacao.map'; import { BqTransacaoTipoPagamentoMap } from '../maps/bq-transacao-tipo-pagamento.map'; +import { BqTransacaoTipoTransacaoMap } from '../maps/bq-transacao-tipo-transacao.map'; @Injectable() export class BqTransacaoRepositoryService { @@ -37,8 +37,8 @@ export class BqTransacaoRepositoryService { const query = ` SELECT - CAST(t.data AS STRING) AS partitionDate, - t.hora AS processingHour, + CAST(t.data AS STRING) AS \`data\`, + t.hora AS hora, CAST(t.datetime_transacao AS STRING) AS datetime_transacao, CAST(t.datetime_processamento AS STRING) AS datetime_processamento, t.datetime_captura AS captureDateTime, @@ -70,7 +70,7 @@ export class BqTransacaoRepositoryService { `UNION ALL SELECT ${'null, '.repeat(22)} (${qArgs.countQuery}) AS count, 'empty' AS status` + - `\nORDER BY t.data DESC, t.hora DESC` + + `\nORDER BY \`data\` DESC, hora DESC` + (qArgs?.limit !== undefined ? `\nLIMIT ${qArgs.limit + 1}` : '') + (qArgs?.offset !== undefined ? `\nOFFSET ${qArgs.offset}` : ''); const queryResult = await this.bigqueryService.query( diff --git a/yarn.lock b/yarn.lock index 7445cb19..80d45ad6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4080,7 +4080,12 @@ "resolved" "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz" "version" "10.0.0" -"dotenv@^16.0.3", "dotenv@16.0.3": +"dotenv@^16.0.3", "dotenv@^16.4.5": + "integrity" "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" + "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz" + "version" "16.4.5" + +"dotenv@16.0.3": "integrity" "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" "version" "16.0.3" From 5298c80836b4ad12ee9fef5fae1ad12c5f7e40c9 Mon Sep 17 00:00:00 2001 From: Raphael Rivas Date: Wed, 28 Feb 2024 19:07:01 -0300 Subject: [PATCH 4/8] wip: transacao --- ...entity.ts => transacao.bigquery-entity.ts} | 4 +- .../bq-find-transacao-by.interface.ts | 2 +- .../bq-get-week-transacao-by.interface.ts | 3 + ... => bigquery-transacao.repository.spec.ts} | 10 +- ...ce.ts => bigquery-transacao.repository.ts} | 21 ++-- .../services/bigquery-transacao.service.ts | 27 +++++ src/cnab/dto/save-cliente-favorecido.dto.ts | 69 +++++++++++ src/cnab/entities/detalhe-a.entity.ts | 26 ---- src/cnab/entities/detalhe-b.entiy.ts | 13 -- src/cnab/entities/header-arquivo.entity.ts | 26 ---- src/cnab/entities/header-lote.entity.ts | 18 --- src/cnab/entities/item-transacao.entity.ts | 21 ---- .../entities/transacao-cliente-item.entity.ts | 6 - src/cnab/entity/cliente-favorecido.entity.ts | 8 ++ src/cnab/entity/detalhe-a.entity.ts | 51 ++++---- src/cnab/entity/detalhe-b.entiy.ts | 26 ++-- src/cnab/entity/header-arquivo.entity.ts | 51 ++++---- src/cnab/entity/header-lote.entity.ts | 36 +++--- src/cnab/entity/item-transacao.entity.ts | 41 +++---- src/cnab/entity/pagador.entity.ts | 6 + .../entity/transacao-cliente-item.entity.ts | 31 +++-- src/cnab/entity/transacao.entity.ts | 5 + src/cnab/enums/pagador/pagador.enum.ts | 4 + .../create-cliente-favorecido.dto.ts | 18 +++ .../update-cliente-favorecido.dto.ts | 18 +++ .../cnab-field-map-detalhe.interface.ts | 0 ...nab-field-map-trailer-arquivo.interface.ts | 0 .../cnab-field-map-trailer-lote.interface.ts | 0 .../cnab-field-map.interface.ts | 0 .../interfaces/pagador/create-pagador.dto.ts | 16 +++ .../interfaces/pagador/update-pagador.dto.ts | 16 +++ .../create-transacao-cliente-item.dto.ts | 5 + .../update-transacao-cliente-item.dto.ts | 5 + .../transacao/create-transacao.dto.ts | 22 ++++ .../transacao/update-transacao.dto.ts | 21 ++++ src/cnab/listener/transacao.listener.ts | 20 ++-- .../repository/Item-transacao.repository.ts | 0 .../cliente-favorecido.repository.ts | 94 ++++++++++++++- src/cnab/repository/pagador.repository.ts | 62 ++++++++-- .../transacao-clienite-item.repository.ts | 61 ++++++++++ src/cnab/repository/transacao.repository.ts | 57 +++++++++ src/cnab/service/Item-transacao.service.ts | 0 .../service/cliente-favorecido.service.ts | 89 +++++++++----- src/cnab/service/pagador.service.ts | 32 +++++ .../transacao-cliente-item.service.ts} | 0 src/cnab/service/transacao.service.ts | 113 ++++++++++-------- ...nab-all-104-registro-field-map-template.ts | 8 +- ...0-generic-field-map-template-test.const.ts | 2 +- src/cnab/types/cnab-registro.type.ts | 2 +- src/cnab/utils/cnab-utils.spec.ts | 2 +- src/cnab/utils/cnab-utils.ts | 2 +- src/config/database.config.ts | 6 +- src/users/entities/user.entity.ts | 109 +++++++++++++++++ .../http-exception/common-http-exception.ts | 6 +- src/utils/payment-date-utils.ts | 3 + 55 files changed, 938 insertions(+), 356 deletions(-) rename src/bigquery/entities/{transacao.bq-entity.ts => transacao.bigquery-entity.ts} (87%) create mode 100644 src/bigquery/interfaces/bq-get-week-transacao-by.interface.ts rename src/bigquery/repositories/{bq-transacao.repository.service.spec.ts => bigquery-transacao.repository.spec.ts} (90%) rename src/bigquery/repositories/{bq-transacao.repository.service.ts => bigquery-transacao.repository.ts} (92%) create mode 100644 src/bigquery/services/bigquery-transacao.service.ts create mode 100644 src/cnab/dto/save-cliente-favorecido.dto.ts delete mode 100644 src/cnab/entities/detalhe-a.entity.ts delete mode 100644 src/cnab/entities/detalhe-b.entiy.ts delete mode 100644 src/cnab/entities/header-arquivo.entity.ts delete mode 100644 src/cnab/entities/header-lote.entity.ts delete mode 100644 src/cnab/entities/item-transacao.entity.ts delete mode 100644 src/cnab/entities/transacao-cliente-item.entity.ts create mode 100644 src/cnab/enums/pagador/pagador.enum.ts create mode 100644 src/cnab/interfaces/cliente-favorecido/create-cliente-favorecido.dto.ts create mode 100644 src/cnab/interfaces/cliente-favorecido/update-cliente-favorecido.dto.ts rename src/cnab/interfaces/{ => cnab-all}/cnab-field-map-detalhe.interface.ts (100%) rename src/cnab/interfaces/{ => cnab-all}/cnab-field-map-trailer-arquivo.interface.ts (100%) rename src/cnab/interfaces/{ => cnab-all}/cnab-field-map-trailer-lote.interface.ts (100%) rename src/cnab/interfaces/{ => cnab-all}/cnab-field-map.interface.ts (100%) create mode 100644 src/cnab/interfaces/pagador/create-pagador.dto.ts create mode 100644 src/cnab/interfaces/pagador/update-pagador.dto.ts create mode 100644 src/cnab/interfaces/transacao-cliente-item/create-transacao-cliente-item.dto.ts create mode 100644 src/cnab/interfaces/transacao-cliente-item/update-transacao-cliente-item.dto.ts create mode 100644 src/cnab/interfaces/transacao/create-transacao.dto.ts create mode 100644 src/cnab/interfaces/transacao/update-transacao.dto.ts delete mode 100644 src/cnab/repository/Item-transacao.repository.ts create mode 100644 src/cnab/repository/transacao-clienite-item.repository.ts delete mode 100644 src/cnab/service/Item-transacao.service.ts rename src/cnab/{repositories/cliente-favorecido.repository.ts => service/transacao-cliente-item.service.ts} (100%) diff --git a/src/bigquery/entities/transacao.bq-entity.ts b/src/bigquery/entities/transacao.bigquery-entity.ts similarity index 87% rename from src/bigquery/entities/transacao.bq-entity.ts rename to src/bigquery/entities/transacao.bigquery-entity.ts index d04e7ba4..d788f704 100644 --- a/src/bigquery/entities/transacao.bq-entity.ts +++ b/src/bigquery/entities/transacao.bigquery-entity.ts @@ -1,4 +1,4 @@ -export class BqTransacao { +export class BigqueryTransacao { id: number; data: Date; hora: number; @@ -7,8 +7,10 @@ export class BqTransacao { datetime_captura: Date; modo: string; id_consorcio: string; + /** Nome do consórcio */ consorcio: string; id_operadora: string; + /** Nome da operadora */ operadora: string; servico: string; sentido: string; diff --git a/src/bigquery/interfaces/bq-find-transacao-by.interface.ts b/src/bigquery/interfaces/bq-find-transacao-by.interface.ts index d217e4da..581588a3 100644 --- a/src/bigquery/interfaces/bq-find-transacao-by.interface.ts +++ b/src/bigquery/interfaces/bq-find-transacao-by.interface.ts @@ -5,5 +5,5 @@ export interface IBqFetchTransacao { limit?: number; offset?: number; getToday?: boolean; - previousDays?: boolean; + previousDaysOnly?: boolean; } diff --git a/src/bigquery/interfaces/bq-get-week-transacao-by.interface.ts b/src/bigquery/interfaces/bq-get-week-transacao-by.interface.ts new file mode 100644 index 00000000..da50929e --- /dev/null +++ b/src/bigquery/interfaces/bq-get-week-transacao-by.interface.ts @@ -0,0 +1,3 @@ +export interface IBqGetWeekTransacao { + cpfCnpj: string; +} diff --git a/src/bigquery/repositories/bq-transacao.repository.service.spec.ts b/src/bigquery/repositories/bigquery-transacao.repository.spec.ts similarity index 90% rename from src/bigquery/repositories/bq-transacao.repository.service.spec.ts rename to src/bigquery/repositories/bigquery-transacao.repository.spec.ts index f68d0a76..4532f547 100644 --- a/src/bigquery/repositories/bq-transacao.repository.service.spec.ts +++ b/src/bigquery/repositories/bigquery-transacao.repository.spec.ts @@ -2,16 +2,16 @@ import { Provider } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { BigqueryService } from 'src/bigquery/bigquery.service'; import { SettingsService } from 'src/settings/settings.service'; -import { BqTransacaoRepositoryService } from './bq-transacao.repository.service'; +import { BigqueryTransacaoRepository } from './bigquery-transacao.repository'; import { ConfigService } from '@nestjs/config'; import { resolve } from 'path'; import { config } from 'dotenv'; import { BigqueryEnvironment } from 'src/settings/enums/bigquery-env.enum'; import { SettingEntity } from 'src/settings/entities/setting.entity'; -describe('BqTransacaoRepositoryService', () => { +describe('BigqueryTransacaoRepositoryService', () => { let settingsService: SettingsService; - let bqTransacaoRepository: BqTransacaoRepositoryService; + let bqTransacaoRepository: BigqueryTransacaoRepository; const mockBqGoogleCredentials = () => ({ 'google.clientApiType': process.env.GOOGLE_CLIENT_API_TYPE, 'google.clientApiProjectId': process.env.GOOGLE_CLIENT_API_PROJECT_ID, @@ -51,14 +51,14 @@ describe('BqTransacaoRepositoryService', () => { const module: TestingModule = await Test.createTestingModule({ providers: [ BigqueryService, - BqTransacaoRepositoryService, + BigqueryTransacaoRepository, settingsServiceMock, configServiceMock, ], }).compile(); settingsService = module.get(SettingsService); - bqTransacaoRepository = module.get(BqTransacaoRepositoryService); + bqTransacaoRepository = module.get(BigqueryTransacaoRepository); }); afterEach(() => { diff --git a/src/bigquery/repositories/bq-transacao.repository.service.ts b/src/bigquery/repositories/bigquery-transacao.repository.ts similarity index 92% rename from src/bigquery/repositories/bq-transacao.repository.service.ts rename to src/bigquery/repositories/bigquery-transacao.repository.ts index d705c768..227f7d20 100644 --- a/src/bigquery/repositories/bq-transacao.repository.service.ts +++ b/src/bigquery/repositories/bigquery-transacao.repository.ts @@ -6,15 +6,15 @@ import { TRIntegrationTypeMap } from 'src/ticket-revenues/maps/ticket-revenues.m import { isCpfOrCnpj } from 'src/utils/cpf-cnpj'; import { QueryBuilder } from 'src/utils/query-builder/query-builder'; import { BQSInstances, BigqueryService } from '../bigquery.service'; -import { BqTransacao } from '../entities/transacao.bq-entity'; +import { BigqueryTransacao } from '../entities/transacao.bigquery-entity'; import { IBqFetchTransacao } from '../interfaces/bq-find-transacao-by.interface'; import { BqTsansacaoTipoIntegracaoMap } from '../maps/bq-transacao-tipo-integracao.map'; import { BqTransacaoTipoPagamentoMap } from '../maps/bq-transacao-tipo-pagamento.map'; import { BqTransacaoTipoTransacaoMap } from '../maps/bq-transacao-tipo-transacao.map'; @Injectable() -export class BqTransacaoRepositoryService { - private logger: Logger = new Logger('BqTransacaoRepositoryService', { +export class BigqueryTransacaoRepository { + private logger: Logger = new Logger('BigqueryTransacaoRepository', { timestamp: true, }); @@ -25,14 +25,15 @@ export class BqTransacaoRepositoryService { public async findTransacaoBy( filter?: IBqFetchTransacao, - ): Promise { - const transacoes: BqTransacao[] = (await this.fetchTransacao(filter)).data; + ): Promise { + const transacoes: BigqueryTransacao[] = (await this.fetchTransacao(filter)) + .data; return transacoes; } private async fetchTransacao( args?: IBqFetchTransacao, - ): Promise<{ data: BqTransacao[]; countAll: number }> { + ): Promise<{ data: BigqueryTransacao[]; countAll: number }> { const qArgs = await this.getQueryArgs(args); const query = ` @@ -80,7 +81,7 @@ export class BqTransacaoRepositoryService { const count: number = queryResult[0].count; // Remove unwanted keys and remove last item (all null if empty) - let transacoes: BqTransacao[] = queryResult.map((i) => { + let transacoes: BigqueryTransacao[] = queryResult.map((i) => { delete i.status; delete i.count; return i; @@ -147,7 +148,7 @@ export class BqTransacaoRepositoryService { `DATE(t.datetime_processamento) <= DATE('${endDate}')`, ); } - if (args?.previousDays === true) { + if (args?.previousDaysOnly === true) { queryBuilder.pushAND( 'DATE(t.datetime_processamento) > DATE(t.datetime_transacao)', ); @@ -202,8 +203,8 @@ export class BqTransacaoRepositoryService { /** * Convert id or some values into desired string values */ - private mapBqTransacao(transacoes: BqTransacao[]): BqTransacao[] { - return transacoes.map((item: BqTransacao) => { + private mapBqTransacao(transacoes: BigqueryTransacao[]): BigqueryTransacao[] { + return transacoes.map((item: BigqueryTransacao) => { const tipo_transacao = item.tipo_transacao; const tipo_pagamento = item.tipo_pagamento; const tipo_integracao = item.tipo_integracao; diff --git a/src/bigquery/services/bigquery-transacao.service.ts b/src/bigquery/services/bigquery-transacao.service.ts new file mode 100644 index 00000000..cd80bbd6 --- /dev/null +++ b/src/bigquery/services/bigquery-transacao.service.ts @@ -0,0 +1,27 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { nextFriday } from 'date-fns'; +import { getPaymentWeek } from 'src/utils/payment-date-utils'; +import { BigqueryTransacao } from '../entities/transacao.bigquery-entity'; +import { BigqueryTransacaoRepository } from '../repositories/bigquery-transacao.repository'; + +@Injectable() +export class BigqueryTransacaoService { + private logger: Logger = new Logger('BigqueryTransacaoService', { + timestamp: true, + }); + + constructor( + private readonly bigqueryTransacaoRepository: BigqueryTransacaoRepository, + ) {} + + /** + * Get data from current payment week (from thu to wed) + */ + public async getTransacaoOfCurrentWeek(): Promise { + const paymentWeek = getPaymentWeek(nextFriday(new Date())); + return this.bigqueryTransacaoRepository.findTransacaoBy({ + startDate: paymentWeek.startDate, + endDate: paymentWeek.endDate, + }); + } +} diff --git a/src/cnab/dto/save-cliente-favorecido.dto.ts b/src/cnab/dto/save-cliente-favorecido.dto.ts new file mode 100644 index 00000000..bd16f721 --- /dev/null +++ b/src/cnab/dto/save-cliente-favorecido.dto.ts @@ -0,0 +1,69 @@ +import { IsNotEmpty, ValidateIf } from 'class-validator'; + +function isCreate(object: SaveClienteFavorecidoDto): boolean { + return object.id_cliente_favorecido === undefined; +} + +export class SaveClienteFavorecidoDto { + id_cliente_favorecido?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + nome?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + cpf_cnpj?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + cod_banco?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + agencia?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + dv_agencia?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + conta_corrente?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + dv_conta_corrente?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + logradouro?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + numero?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + complemento?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + bairro?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + cidade?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + cep?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + complemento_cep?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + uf?: string; +} diff --git a/src/cnab/entities/detalhe-a.entity.ts b/src/cnab/entities/detalhe-a.entity.ts deleted file mode 100644 index fef0479e..00000000 --- a/src/cnab/entities/detalhe-a.entity.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { EntityHelper } from '../../utils/entity-helper'; - -@Entity() -export class DetalheA extends EntityHelper { - id_detalhe_a: number; - id_header_lote: number; - lote_servico: string; - id_cliente_favorecido: number; - tipo_finalidade_conta: string; - dt_vencimento: Date; - tipo_moeda: string; - qtde_moeda: number; - valor_lancamento: number; - num_doc_lancamento: string; - qtde_parcelas: number; - indicador_bloqueio: string; - indicador_forma_parcelamento: string; - periodo_vencimento: Date; - num_parcela: number; - data_efetivacao: Date; - valor_real_efetivado: number; -} - -function Entity(): (target: typeof DetalheA) => void | typeof DetalheA { - throw new Error('Function not implemented.'); -} diff --git a/src/cnab/entities/detalhe-b.entiy.ts b/src/cnab/entities/detalhe-b.entiy.ts deleted file mode 100644 index 4aa8370c..00000000 --- a/src/cnab/entities/detalhe-b.entiy.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { EntityHelper } from 'src/utils/entity-helper'; - -@Entity() -export class DetalheB extends EntityHelper { - id_detalhe_b: number; - id_detalhe_a: number; - nsr: string; - data_vencimento: Date; -} - -function Entity(): (target: typeof DetalheB) => void | typeof DetalheB { - throw new Error('Function not implemented.'); -} diff --git a/src/cnab/entities/header-arquivo.entity.ts b/src/cnab/entities/header-arquivo.entity.ts deleted file mode 100644 index 12ac4760..00000000 --- a/src/cnab/entities/header-arquivo.entity.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { EntityHelper } from 'src/utils/entity-helper'; - -@Entity() -export class HeaderArquivo extends EntityHelper { - id_header_arquivo: number; - tipo_arquivo: string; - cod_banco: string; - tipo_inscricao: string; - num_inscricao: string; - cod_convenio: string; - param_transmissao: string; - agencia: string; - dv_agencia: string; - num_conta: string; - dv_conta: string; - nome_empresa: string; - dt_geracao: Date; - hr_geracao: Date; - id_transacao: number; -} - -function Entity(): ( - target: typeof HeaderArquivo, -) => void | typeof HeaderArquivo { - throw new Error('Function not implemented.'); -} diff --git a/src/cnab/entities/header-lote.entity.ts b/src/cnab/entities/header-lote.entity.ts deleted file mode 100644 index d49e4d42..00000000 --- a/src/cnab/entities/header-lote.entity.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { EntityHelper } from 'src/utils/entity-helper'; - -@Entity() -export class HeaderLote extends EntityHelper { - id_header_lote: number; - id_header_arquivo: number; - lote_servico: string; - tipo_inscricao: string; - num_inscricao: string; - cod_convenio_banco: string; - tipo_compromisso: string; - param_transmissao: string; - id_pagadora: number; -} - -function Entity(): (target: typeof HeaderLote) => void | typeof HeaderLote { - throw new Error('Function not implemented.'); -} diff --git a/src/cnab/entities/item-transacao.entity.ts b/src/cnab/entities/item-transacao.entity.ts deleted file mode 100644 index a2679f86..00000000 --- a/src/cnab/entities/item-transacao.entity.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { EntityHelper } from 'src/utils/entity-helper'; - -@Entity() -export class ItemTransacao extends EntityHelper { - id_item_transacao: number; - dt_transacao: Date; - dt_processamentoDate; - dt_capturaDate; - modo: string; - nome_consorcio: string; - id_tipo_pagamento: number; - tipo_transacao: string; - valor_item_transacao: number; - id_transacao: number; -} - -function Entity(): ( - target: typeof ItemTransacao, -) => void | typeof ItemTransacao { - throw new Error('Function not implemented.'); -} diff --git a/src/cnab/entities/transacao-cliente-item.entity.ts b/src/cnab/entities/transacao-cliente-item.entity.ts deleted file mode 100644 index f7b736e3..00000000 --- a/src/cnab/entities/transacao-cliente-item.entity.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { EntityHelper } from 'src/utils/entity-helper'; - -export class TransacaoClienteItem extends EntityHelper { - id_item_transacao: number; - id_cliente_favorecido: number; -} diff --git a/src/cnab/entity/cliente-favorecido.entity.ts b/src/cnab/entity/cliente-favorecido.entity.ts index 2a19d9d8..8dc2b7ce 100644 --- a/src/cnab/entity/cliente-favorecido.entity.ts +++ b/src/cnab/entity/cliente-favorecido.entity.ts @@ -59,4 +59,12 @@ export class ClienteFavorecido extends EntityHelper { @Column({ type: String, unique: false, nullable: true, length: 2 }) uf: string; + + public getLogInfo(showName?: boolean): string { + if (showName === undefined) { + showName = false; + } + const response = `#${this.cpf_cnpj}` + showName ? ` '${this.nome}'` : ''; + return response; + } } diff --git a/src/cnab/entity/detalhe-a.entity.ts b/src/cnab/entity/detalhe-a.entity.ts index ca8d716e..82809b69 100644 --- a/src/cnab/entity/detalhe-a.entity.ts +++ b/src/cnab/entity/detalhe-a.entity.ts @@ -1,26 +1,25 @@ - -import { EntityHelper } from './../../utils/entity-helper'; -@Entity() -class DetalheA extends EntityHelper{ - id_detalhe_a:number; - id_header_lote :number; - lote_servico :string; - id_cliente_favorecido :number; - tipo_finalidade_conta :string; - dt_vencimento: Date; - tipo_moeda :string; - qtde_moeda :number; - valor_lancamento: number; - num_doc_lancamento :string; - qtde_parcelas :number; - indicador_bloqueio :string; - indicador_forma_parcelamento :string; - periodo_vencimento:Date; - num_parcela :number; - data_efetivacao: Date; - valor_real_efetivado:number -} - -function Entity(): (target: typeof DetalheA) => void | typeof DetalheA { - throw new Error("Function not implemented."); -} +import { EntityHelper } from './../../utils/entity-helper'; +@Entity() +class DetalheA extends EntityHelper { + id_detalhe_a: number; + id_header_lote: number; + lote_servico: string; + id_cliente_favorecido: number; + tipo_finalidade_conta: string; + dt_vencimento: Date; + tipo_moeda: string; + qtde_moeda: number; + valor_lancamento: number; + num_doc_lancamento: string; + qtde_parcelas: number; + indicador_bloqueio: string; + indicador_forma_parcelamento: string; + periodo_vencimento: Date; + num_parcela: number; + data_efetivacao: Date; + valor_real_efetivado: number; +} + +function Entity(): (target: typeof DetalheA) => void | typeof DetalheA { + throw new Error('Function not implemented.'); +} diff --git a/src/cnab/entity/detalhe-b.entiy.ts b/src/cnab/entity/detalhe-b.entiy.ts index d4cce995..f2610c7b 100644 --- a/src/cnab/entity/detalhe-b.entiy.ts +++ b/src/cnab/entity/detalhe-b.entiy.ts @@ -1,13 +1,13 @@ -import { EntityHelper } from "src/utils/entity-helper"; - -@Entity() -class DetalheB extends EntityHelper{ - id_detalhe_b:number; - id_detalhe_a :number; - nsr:string; - data_vencimento: Date; -} - -function Entity(): (target: typeof DetalheB) => void | typeof DetalheB { - throw new Error("Function not implemented."); -} +import { EntityHelper } from 'src/utils/entity-helper'; + +@Entity() +class DetalheB extends EntityHelper { + id_detalhe_b: number; + id_detalhe_a: number; + nsr: string; + data_vencimento: Date; +} + +function Entity(): (target: typeof DetalheB) => void | typeof DetalheB { + throw new Error('Function not implemented.'); +} diff --git a/src/cnab/entity/header-arquivo.entity.ts b/src/cnab/entity/header-arquivo.entity.ts index 749d2081..e9d15e81 100644 --- a/src/cnab/entity/header-arquivo.entity.ts +++ b/src/cnab/entity/header-arquivo.entity.ts @@ -1,31 +1,20 @@ -import { EntityHelper } from "src/utils/entity-helper"; - -@Entity() -class HeaderArquivo extends EntityHelper{ - id_header_arquivo:number; - tipo_arquivo :string; - cod_banco :string; - tipo_inscricao:string; - num_inscricao :string; - cod_convenio :string; - param_transmissao :string; - agencia :string; - dv_agencia:string; - num_conta :string; - dv_conta:string; - nome_empresa:string; - dt_geracao: Date; - @Column({ arg0: { type: 'timestamp' } }) - hr_geracao: Date; - id_transacao:number; -} - - -function Entity(): (target: typeof HeaderArquivo) => void | typeof HeaderArquivo { - throw new Error("Function not implemented."); -} - -function Column(arg0: { arg0: { type: string; }; }): (target: HeaderArquivo, propertyKey: "hr_geracao") => void { - throw new Error("Function not implemented."); -} - +import { EntityHelper } from 'src/utils/entity-helper'; +import { Entity } from 'typeorm'; +@Entity() +export class HeaderArquivo extends EntityHelper { + id_header_arquivo: number; + tipo_arquivo: string; + cod_banco: string; + tipo_inscricao: string; + num_inscricao: string; + cod_convenio: string; + param_transmissao: string; + agencia: string; + dv_agencia: string; + num_conta: string; + dv_conta: string; + nome_empresa: string; + dt_geracao: Date; + hr_geracao: Date; + id_transacao: number; +} diff --git a/src/cnab/entity/header-lote.entity.ts b/src/cnab/entity/header-lote.entity.ts index c6502ccf..3f8efc96 100644 --- a/src/cnab/entity/header-lote.entity.ts +++ b/src/cnab/entity/header-lote.entity.ts @@ -1,18 +1,18 @@ -import { EntityHelper } from "src/utils/entity-helper"; - -@Entity() -class HeaderLote extends EntityHelper{ - id_header_lote:number; - id_header_arquivo:number; - lote_servico:string; - tipo_inscricao:string; - num_inscricao:string; - cod_convenio_banco:string; - tipo_compromisso:string; - param_transmissao:string; - id_pagadora:number; -} - -function Entity(): (target: typeof HeaderLote) => void | typeof HeaderLote { - throw new Error("Function not implemented."); -} +import { EntityHelper } from 'src/utils/entity-helper'; + +@Entity() +class HeaderLote extends EntityHelper { + id_header_lote: number; + id_header_arquivo: number; + lote_servico: string; + tipo_inscricao: string; + num_inscricao: string; + cod_convenio_banco: string; + tipo_compromisso: string; + param_transmissao: string; + id_pagadora: number; +} + +function Entity(): (target: typeof HeaderLote) => void | typeof HeaderLote { + throw new Error('Function not implemented.'); +} diff --git a/src/cnab/entity/item-transacao.entity.ts b/src/cnab/entity/item-transacao.entity.ts index a3049c23..cccf88ce 100644 --- a/src/cnab/entity/item-transacao.entity.ts +++ b/src/cnab/entity/item-transacao.entity.ts @@ -1,20 +1,21 @@ -import { EntityHelper } from "src/utils/entity-helper"; - - -@Entity() -class ItemTransacao extends EntityHelper{ - id_item_transacao:number; - dt_transacao: Date; - dt_processamentoDate; - dt_capturaDate; - modo:string; - nome_consorcio:string; - id_tipo_pagamento:number; - tipo_transacao:string; - valor_item_transacao:number; - id_transacao:number; -} - -function Entity(): (target: typeof ItemTransacao) => void | typeof ItemTransacao { - throw new Error("Function not implemented."); -} +import { EntityHelper } from 'src/utils/entity-helper'; + +@Entity() +class ItemTransacao extends EntityHelper { + id_item_transacao: number; + dt_transacao: Date; + dt_processamentoDate; + dt_capturaDate; + modo: string; + nome_consorcio: string; + id_tipo_pagamento: number; + tipo_transacao: string; + valor_item_transacao: number; + id_transacao: number; +} + +function Entity(): ( + target: typeof ItemTransacao, +) => void | typeof ItemTransacao { + throw new Error('Function not implemented.'); +} diff --git a/src/cnab/entity/pagador.entity.ts b/src/cnab/entity/pagador.entity.ts index bdb8d4ed..3d6b7e20 100644 --- a/src/cnab/entity/pagador.entity.ts +++ b/src/cnab/entity/pagador.entity.ts @@ -51,4 +51,10 @@ export class Pagador extends EntityHelper { @Column({ type: String, unique: false, nullable: true, length: 2 }) uf: string; + + public getLogInfo(): string { + const response = + `#${this.id_pagador}` + ` '${this.nome_empresa.substring(0, 15)}...'`; + return response; + } } diff --git a/src/cnab/entity/transacao-cliente-item.entity.ts b/src/cnab/entity/transacao-cliente-item.entity.ts index f3ff2f8e..1815813c 100644 --- a/src/cnab/entity/transacao-cliente-item.entity.ts +++ b/src/cnab/entity/transacao-cliente-item.entity.ts @@ -1,10 +1,21 @@ -import { EntityHelper } from '../../utils/entity-helper'; -@Entity() -class TransacaoClienteItem extends EntityHelper{ - id_item_transacao:number; - id_cliente_favorecido:number; -} - -function Entity(): (target: typeof TransacaoClienteItem) => void | typeof TransacaoClienteItem { - throw new Error('Function not implemented.'); -} \ No newline at end of file +import { EntityHelper } from 'src/utils/entity-helper'; +import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity() +export class TransacaoClienteItem extends EntityHelper { + @PrimaryGeneratedColumn() + id?: number; + + @Column({ type: Number, unique: false, nullable: true, length: 150 }) + id_item_transacao: number; + + @Column({ type: Number, unique: false, nullable: true, length: 150 }) + id_cliente_favorecido: number; + + public getLogInfo(): string { + const response = + `#${this.id}` + `, itemTransacao: '${this.id_item_transacao}'`; + +`, clienteFavorecido: '${this.id_cliente_favorecido}'`; + return response; + } +} diff --git a/src/cnab/entity/transacao.entity.ts b/src/cnab/entity/transacao.entity.ts index 9382cb10..a706052f 100644 --- a/src/cnab/entity/transacao.entity.ts +++ b/src/cnab/entity/transacao.entity.ts @@ -102,4 +102,9 @@ export class Transacao extends EntityHelper { @Column({ type: Number, unique: false, nullable: true }) id_pagador: number; + + public getLogInfo(): string { + const response = `#${this.id_transacao}`; + return response; + } } diff --git a/src/cnab/enums/pagador/pagador.enum.ts b/src/cnab/enums/pagador/pagador.enum.ts new file mode 100644 index 00000000..c12b645d --- /dev/null +++ b/src/cnab/enums/pagador/pagador.enum.ts @@ -0,0 +1,4 @@ +export enum PagadorContaEnum { + JAE = '1', + FASE_4 = '2', +} diff --git a/src/cnab/interfaces/cliente-favorecido/create-cliente-favorecido.dto.ts b/src/cnab/interfaces/cliente-favorecido/create-cliente-favorecido.dto.ts new file mode 100644 index 00000000..7ceade55 --- /dev/null +++ b/src/cnab/interfaces/cliente-favorecido/create-cliente-favorecido.dto.ts @@ -0,0 +1,18 @@ +export class CreateClienteFavorecidoDto { + id_cliente_favorecido?: number; + nome: string; + cpf_cnpj: string; + cod_banco: string; + agencia: string; + dv_agencia: string; + conta_corrente: string; + dv_conta_corrente: string; + logradouro: string; + numero: string; + complemento: string; + bairro: string; + cidade: string; + cep: string; + complemento_cep: string; + uf: string; +} diff --git a/src/cnab/interfaces/cliente-favorecido/update-cliente-favorecido.dto.ts b/src/cnab/interfaces/cliente-favorecido/update-cliente-favorecido.dto.ts new file mode 100644 index 00000000..5c3656df --- /dev/null +++ b/src/cnab/interfaces/cliente-favorecido/update-cliente-favorecido.dto.ts @@ -0,0 +1,18 @@ +export class UpdateCreateClienteFavorecidoDto { + id_cliente_favorecido?: number; + nome?: string; + cpf_cnpj?: string; + cod_banco?: string; + agencia?: string; + dv_agencia?: string; + conta_corrente?: string; + dv_conta_corrente?: string; + logradouro?: string; + numero?: string; + complemento?: string; + bairro?: string; + cidade?: string; + cep?: string; + complemento_cep?: string; + uf?: string; +} diff --git a/src/cnab/interfaces/cnab-field-map-detalhe.interface.ts b/src/cnab/interfaces/cnab-all/cnab-field-map-detalhe.interface.ts similarity index 100% rename from src/cnab/interfaces/cnab-field-map-detalhe.interface.ts rename to src/cnab/interfaces/cnab-all/cnab-field-map-detalhe.interface.ts diff --git a/src/cnab/interfaces/cnab-field-map-trailer-arquivo.interface.ts b/src/cnab/interfaces/cnab-all/cnab-field-map-trailer-arquivo.interface.ts similarity index 100% rename from src/cnab/interfaces/cnab-field-map-trailer-arquivo.interface.ts rename to src/cnab/interfaces/cnab-all/cnab-field-map-trailer-arquivo.interface.ts diff --git a/src/cnab/interfaces/cnab-field-map-trailer-lote.interface.ts b/src/cnab/interfaces/cnab-all/cnab-field-map-trailer-lote.interface.ts similarity index 100% rename from src/cnab/interfaces/cnab-field-map-trailer-lote.interface.ts rename to src/cnab/interfaces/cnab-all/cnab-field-map-trailer-lote.interface.ts diff --git a/src/cnab/interfaces/cnab-field-map.interface.ts b/src/cnab/interfaces/cnab-all/cnab-field-map.interface.ts similarity index 100% rename from src/cnab/interfaces/cnab-field-map.interface.ts rename to src/cnab/interfaces/cnab-all/cnab-field-map.interface.ts diff --git a/src/cnab/interfaces/pagador/create-pagador.dto.ts b/src/cnab/interfaces/pagador/create-pagador.dto.ts new file mode 100644 index 00000000..a8b92607 --- /dev/null +++ b/src/cnab/interfaces/pagador/create-pagador.dto.ts @@ -0,0 +1,16 @@ +export class CreatePagadorDto { + id_pagador?: number; + nome_empresa: string; + agencia: string; + dv_agencia: string; + conta: string; + dv_conta: string; + logradouro: string; + numero: string; + complemento: string; + bairro: string; + cidade: string; + cep: string; + complemento_cep: string; + uf: string; +} diff --git a/src/cnab/interfaces/pagador/update-pagador.dto.ts b/src/cnab/interfaces/pagador/update-pagador.dto.ts new file mode 100644 index 00000000..5e523b0f --- /dev/null +++ b/src/cnab/interfaces/pagador/update-pagador.dto.ts @@ -0,0 +1,16 @@ +export class UpdatePagadorDto { + id_pagador?: number; + nome_empresa?: string; + agencia?: string; + dv_agencia?: string; + conta?: string; + dv_conta?: string; + logradouro?: string; + numero?: string; + complemento?: string; + bairro?: string; + cidade?: string; + cep?: string; + complemento_cep?: string; + uf?: string; +} diff --git a/src/cnab/interfaces/transacao-cliente-item/create-transacao-cliente-item.dto.ts b/src/cnab/interfaces/transacao-cliente-item/create-transacao-cliente-item.dto.ts new file mode 100644 index 00000000..a9d63f7b --- /dev/null +++ b/src/cnab/interfaces/transacao-cliente-item/create-transacao-cliente-item.dto.ts @@ -0,0 +1,5 @@ +export class CreateTransacaoClienteItemDto { + id?: number; + id_item_transacao: number; + id_cliente_favorecido: number; +} diff --git a/src/cnab/interfaces/transacao-cliente-item/update-transacao-cliente-item.dto.ts b/src/cnab/interfaces/transacao-cliente-item/update-transacao-cliente-item.dto.ts new file mode 100644 index 00000000..1d043ecb --- /dev/null +++ b/src/cnab/interfaces/transacao-cliente-item/update-transacao-cliente-item.dto.ts @@ -0,0 +1,5 @@ +export class UpdateTransacaoClienteItemDto { + id?: number; + id_item_transacao?: number; + id_cliente_favorecido?: number; +} diff --git a/src/cnab/interfaces/transacao/create-transacao.dto.ts b/src/cnab/interfaces/transacao/create-transacao.dto.ts new file mode 100644 index 00000000..c8ca5e47 --- /dev/null +++ b/src/cnab/interfaces/transacao/create-transacao.dto.ts @@ -0,0 +1,22 @@ +export class CreateTransacaoDto { + id?: number; + id_transacao?: string; + dt_ordem: string; + dt_pagamento: string; + nome_consorcio: string; + nome_operadora: string; + servico: string; + id_ordem_ressarcimento: number; + qtde_transacao_rateio_credito: number; + vlr_rateio_credito: number; + qtde_transacao_rateio_debito: number; + vlr_rateio_debito: number; + quantidade_total_transacao: number; + vlr_total_transacao_bruto: number; + vlr_desconto_taxa: number; + vlr_total_transacao_liquido: number; + qtde_total_transacao_captura: number; + vlr_total_transacao_captura: number; + indicador_ordem_valida: string; + id_pagador: number; +} diff --git a/src/cnab/interfaces/transacao/update-transacao.dto.ts b/src/cnab/interfaces/transacao/update-transacao.dto.ts new file mode 100644 index 00000000..4f65066e --- /dev/null +++ b/src/cnab/interfaces/transacao/update-transacao.dto.ts @@ -0,0 +1,21 @@ +export class UpdateTransacaoDto { + id_transacao?: number; + dt_ordem?: string; + dt_pagamento?: string; + nome_consorcio?: string; + nome_operadora?: string; + servico?: string; + id_ordem_ressarcimento?: number; + qtde_transacao_rateio_credito?: number; + vlr_rateio_credito?: number; + qtde_transacao_rateio_debito?: number; + vlr_rateio_debito?: number; + quantidade_total_transacao?: number; + vlr_total_transacao_bruto?: number; + vlr_desconto_taxa?: number; + vlr_total_transacao_liquido?: number; + qtde_total_transacao_captura?: number; + vlr_total_transacao_captura?: number; + indicador_ordem_valida?: string; + id_pagador?: number; +} diff --git a/src/cnab/listener/transacao.listener.ts b/src/cnab/listener/transacao.listener.ts index fb2d6fab..56d6261a 100644 --- a/src/cnab/listener/transacao.listener.ts +++ b/src/cnab/listener/transacao.listener.ts @@ -1,10 +1,10 @@ -class TransacaoListener{ - - private transacaoService:TransacaoService; - - //rodar as 09:00 e as 14:00 - function JobTransaction(){ - transacaoService.insereTransacoes(); - } - -} \ No newline at end of file +// class TransacaoListener{ + +// private transacaoService:TransacaoService; + +// //rodar as 09:00 e as 14:00 +// function JobTransaction(){ +// transacaoService.insereTransacoes(); +// } + +// } diff --git a/src/cnab/repository/Item-transacao.repository.ts b/src/cnab/repository/Item-transacao.repository.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/src/cnab/repository/cliente-favorecido.repository.ts b/src/cnab/repository/cliente-favorecido.repository.ts index c6902bd7..892c9bf2 100644 --- a/src/cnab/repository/cliente-favorecido.repository.ts +++ b/src/cnab/repository/cliente-favorecido.repository.ts @@ -1 +1,93 @@ -//metodo de insert cliente favorecido +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { formatLog } from 'src/utils/logging'; +import { EntityCondition } from 'src/utils/types/entity-condition.type'; +import { NullableType } from 'src/utils/types/nullable.type'; +import { Repository, UpdateResult } from 'typeorm'; +import { SaveClienteFavorecidoDto } from '../dto/save-cliente-favorecido.dto'; +import { ClienteFavorecido } from '../entity/cliente-favorecido.entity'; +import { UpdateCreateClienteFavorecidoDto } from '../interfaces/cliente-favorecido/update-cliente-favorecido.dto'; + +@Injectable() +export class ClienteFavorecidoRepository { + private logger: Logger = new Logger('ClienteFavorecidoRepository', { + timestamp: true, + }); + private ENTITY_NAME = ClienteFavorecido.name; + + constructor( + @InjectRepository(ClienteFavorecido) + private clienteFavorecidoRepository: Repository, + ) {} + + async save(dto: SaveClienteFavorecidoDto): Promise { + if (dto.id_cliente_favorecido === undefined) { + this.clienteFavorecidoRepository.create(dto); + } else { + await this.update(dto.id_cliente_favorecido, dto); + } + const createdUser = await this.clienteFavorecidoRepository.save( + this.clienteFavorecidoRepository.create(dto), + ); + this.logger.log(`${this.ENTITY_NAME} criado: ${createdUser.getLogInfo()}`); + return createdUser; + } + + async create( + createProfileDto: SaveClienteFavorecidoDto, + ): Promise { + const createdUser = await this.clienteFavorecidoRepository.save( + this.clienteFavorecidoRepository.create(createProfileDto), + ); + this.logger.log(`Usuário criado: ${createdUser.getLogInfo()}`); + return createdUser; + } + + async update( + id: number, + updateDto: SaveClienteFavorecidoDto, + logContext?: string, + logOldFavorecido?: ClienteFavorecido, + ): Promise { + const updatePayload = await this.clienteFavorecidoRepository.update( + { id_cliente_favorecido: id }, + updateDto, + ); + if (logOldFavorecido) { + this.logUpdateFavorecido(logOldFavorecido, updateDto, logContext); + } + + return updatePayload; + } + + private logUpdateFavorecido( + old: ClienteFavorecido, + updateDto: UpdateCreateClienteFavorecidoDto, + outerContext?: string, + ) { + const logMsg = + `Favorecido ${old.getLogInfo(false)} teve seus campos atualizados: ` + + `[${Object.keys(updateDto)} ]`; + this.logger.log(formatLog(logMsg, 'update()', outerContext)); + } + + public async findOne( + fields: + | EntityCondition + | EntityCondition[], + ): Promise> { + return await this.clienteFavorecidoRepository.findOne({ + where: fields, + }); + } + + public async findMany( + fields: + | EntityCondition + | EntityCondition[], + ): Promise { + return await this.clienteFavorecidoRepository.find({ + where: fields, + }); + } +} diff --git a/src/cnab/repository/pagador.repository.ts b/src/cnab/repository/pagador.repository.ts index bb361d46..3bf28023 100644 --- a/src/cnab/repository/pagador.repository.ts +++ b/src/cnab/repository/pagador.repository.ts @@ -1,9 +1,53 @@ -class Pagador { - - - function getPagador(tipo:string):Pagador{//Saber se é fase 4 ou CCT pra pegar o pagador - //Se o tipo for CCT pagador 2 - //Senao 1 - - } -} \ No newline at end of file +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { EntityCondition } from 'src/utils/types/entity-condition.type'; +import { NullableType } from 'src/utils/types/nullable.type'; +import { Repository, UpdateResult } from 'typeorm'; +import { Pagador } from '../entity/pagador.entity'; +import { CreatePagadorDto } from '../interfaces/pagador/create-pagador.dto'; +import { UpdatePagadorDto } from '../interfaces/pagador/update-pagador.dto'; + +@Injectable() +export class PagadorRepository { + private logger: Logger = new Logger('PagadorRepository', { timestamp: true }); + + constructor( + @InjectRepository(Pagador) + private PagadorRepository: Repository, + ) {} + + public async create(createProfileDto: CreatePagadorDto): Promise { + const createdItem = await this.PagadorRepository.save( + this.PagadorRepository.create(createProfileDto), + ); + this.logger.log(`Pagador criado: ${createdItem[0].getLogInfo()}`); + return createdItem[0]; + } + + public async update( + id: number, + updateDto: UpdatePagadorDto, + ): Promise { + const updatePayload = await this.PagadorRepository.update( + { id_pagador: id }, + updateDto, + ); + return updatePayload; + } + + public async findOne( + fields: EntityCondition | EntityCondition[], + ): Promise> { + return await this.PagadorRepository.findOne({ + where: fields, + }); + } + + public async findMany( + fields: EntityCondition | EntityCondition[], + ): Promise { + return await this.PagadorRepository.find({ + where: fields, + }); + } +} diff --git a/src/cnab/repository/transacao-clienite-item.repository.ts b/src/cnab/repository/transacao-clienite-item.repository.ts new file mode 100644 index 00000000..5630fec7 --- /dev/null +++ b/src/cnab/repository/transacao-clienite-item.repository.ts @@ -0,0 +1,61 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { EntityCondition } from 'src/utils/types/entity-condition.type'; +import { NullableType } from 'src/utils/types/nullable.type'; +import { Repository, UpdateResult } from 'typeorm'; +import { TransacaoClienteItem } from '../entity/transacao-cliente-item.entity'; +import { CreateTransacaoClienteItemDto } from '../interfaces/transacao-cliente-item/create-transacao-cliente-item.dto'; +import { UpdateTransacaoClienteItemDto } from '../interfaces/transacao-cliente-item/update-transacao-cliente-item.dto'; + +@Injectable() +export class TransacaoClienteItemRepository { + private logger: Logger = new Logger('TransacaoClienteItemRepository', { + timestamp: true, + }); + + constructor( + @InjectRepository(TransacaoClienteItem) + private TransacaoClienteItemRepository: Repository, + ) {} + + public async create( + createProfileDto: CreateTransacaoClienteItemDto, + ): Promise { + const createdItem = await this.TransacaoClienteItemRepository.save( + this.TransacaoClienteItemRepository.create(createProfileDto), + ); + this.logger.log(`TransacaoClienteItem criado: ${createdItem.getLogInfo()}`); + return createdItem; + } + + public async update( + id: number, + updateDto: UpdateTransacaoClienteItemDto, + ): Promise { + const updatePayload = await this.TransacaoClienteItemRepository.update( + { id_cliente_favorecido: id }, + updateDto, + ); + return updatePayload; + } + + public async findOne( + fields: + | EntityCondition + | EntityCondition[], + ): Promise> { + return await this.TransacaoClienteItemRepository.findOne({ + where: fields, + }); + } + + public async findMany( + fields: + | EntityCondition + | EntityCondition[], + ): Promise { + return await this.TransacaoClienteItemRepository.find({ + where: fields, + }); + } +} diff --git a/src/cnab/repository/transacao.repository.ts b/src/cnab/repository/transacao.repository.ts index e69de29b..71e54fbf 100644 --- a/src/cnab/repository/transacao.repository.ts +++ b/src/cnab/repository/transacao.repository.ts @@ -0,0 +1,57 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { EntityCondition } from 'src/utils/types/entity-condition.type'; +import { NullableType } from 'src/utils/types/nullable.type'; +import { Repository, UpdateResult } from 'typeorm'; +import { Transacao } from '../entity/transacao.entity'; +import { CreateTransacaoDto } from '../interfaces/transacao/create-transacao.dto'; +import { UpdateTransacaoDto } from '../interfaces/transacao/update-transacao.dto'; + +@Injectable() +export class TransacaoRepository { + private logger: Logger = new Logger('TransacaoRepository', { + timestamp: true, + }); + + constructor( + @InjectRepository(Transacao) + private TransacaoRepository: Repository, + ) {} + + public async create( + createProfileDto: CreateTransacaoDto, + ): Promise { + const createdItem = await this.TransacaoRepository.save( + this.TransacaoRepository.create(createProfileDto), + ); + this.logger.log(`Transacao criado: ${createdItem.getLogInfo()}`); + return createdItem; + } + + public async update( + id: number, + updateDto: UpdateTransacaoDto, + ): Promise { + const updatePayload = await this.TransacaoRepository.update( + { id_transacao: id }, + updateDto, + ); + return updatePayload; + } + + public async findOne( + fields: EntityCondition | EntityCondition[], + ): Promise> { + return await this.TransacaoRepository.findOne({ + where: fields, + }); + } + + public async findMany( + fields: EntityCondition | EntityCondition[], + ): Promise { + return await this.TransacaoRepository.find({ + where: fields, + }); + } +} diff --git a/src/cnab/service/Item-transacao.service.ts b/src/cnab/service/Item-transacao.service.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/src/cnab/service/cliente-favorecido.service.ts b/src/cnab/service/cliente-favorecido.service.ts index 439f891a..ffa58f04 100644 --- a/src/cnab/service/cliente-favorecido.service.ts +++ b/src/cnab/service/cliente-favorecido.service.ts @@ -1,30 +1,59 @@ -import { UsersService } from 'src/users/users.service'; -import { ClienteFavorecido } from './../entitys/cliente-favorecido.entity'; - -class ClienteFavorecidoService{ - - private clienteFavorecido: ClienteFavorecidoRepository; - - private userService: UsersService; - - function insertClienteFavorecido(){ - - // userService.get - - for{ - //veirificar se o usuario já existe na base - ClienteFavorecido.findByCpfCnj(cpf_cnpj); - - - // de/para -> user / Cliente - - //se não existir - - clienteFavorecido.insere(); - - //Se exitir - ClienteFavorecido.atualiza(); - } - } - -} \ No newline at end of file +import { Injectable, Logger } from '@nestjs/common'; +import { User } from 'src/users/entities/user.entity'; +import { UsersService } from 'src/users/users.service'; +import { ClienteFavorecido } from '../entity/cliente-favorecido.entity'; +import { ClienteFavorecidoRepository } from '../repository/cliente-favorecido.repository'; + +@Injectable() +export class ClienteFavorecidoService { + private logger: Logger = new Logger('ClienteFavorecidoService', { + timestamp: true, + }); + + constructor( + private usersService: UsersService, + private clienteFavorecidoRepository: ClienteFavorecidoRepository, + ) {} + + /** + * All ClienteFavoecidos will be created or updated from users based of cpfCnpj. + * @returns All favorecidos after update + */ + public async updateAllFromUsers(): Promise { + const allUsers = await this.usersService.findMany({}); + for (const user of allUsers) { + const favorecido = await this.clienteFavorecidoRepository.findOne({ + cpf_cnpj: user.getCpfCnpj(), + }); + await this.saveFavorecidoFromUser( + user, + favorecido?.id_cliente_favorecido, + ); + } + return await this.clienteFavorecidoRepository.findMany({}); + } + + private async saveFavorecidoFromUser( + user: User, + existingId_facorecido?: number, + ): Promise { + return await this.clienteFavorecidoRepository.create({ + id_cliente_favorecido: existingId_facorecido, + nome: user.getFullName(), + cpf_cnpj: user.getCpfCnpj(), + cod_banco: String(user.getBankCode()), + agencia: user.getBankAgencyWithoutDigit(), + dv_agencia: user.getBankAgencyDigit(), + conta_corrente: user.getBankAccount(), + dv_conta_corrente: user.getBankAccountDigit(), + logradouro: '', + numero: '', + complemento: '', + bairro: '', + cidade: '', + cep: '', + complemento_cep: '', + uf: '', + }); + } +} diff --git a/src/cnab/service/pagador.service.ts b/src/cnab/service/pagador.service.ts index e69de29b..67bb1e09 100644 --- a/src/cnab/service/pagador.service.ts +++ b/src/cnab/service/pagador.service.ts @@ -0,0 +1,32 @@ +import { HttpStatus, Injectable, Logger } from '@nestjs/common'; +import { UsersService } from 'src/users/users.service'; +import { CommonHttpException } from 'src/utils/http-exception/common-http-exception'; +import { Pagador } from '../entity/pagador.entity'; +import { PagadorContaEnum } from '../enums/pagador/pagador.enum'; +import { PagadorRepository } from '../repository/pagador.repository'; + +@Injectable() +export class PagadorService { + private logger: Logger = new Logger('PagadorService', { timestamp: true }); + + constructor( + private usersService: UsersService, + private pagadorRepository: PagadorRepository, + ) {} + + public async findById(id: PagadorContaEnum | number) { + return await this.pagadorRepository.findOne({ id_pagador: id }); + } + + public async getOneById(id: PagadorContaEnum | number): Promise { + const pagador = await this.pagadorRepository.findOne({ id_pagador: id }); + if (!pagador) { + throw CommonHttpException.notFound( + 'Pagador.pagador_id', + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } else { + return pagador; + } + } +} diff --git a/src/cnab/repositories/cliente-favorecido.repository.ts b/src/cnab/service/transacao-cliente-item.service.ts similarity index 100% rename from src/cnab/repositories/cliente-favorecido.repository.ts rename to src/cnab/service/transacao-cliente-item.service.ts diff --git a/src/cnab/service/transacao.service.ts b/src/cnab/service/transacao.service.ts index 78673f54..49abc052 100644 --- a/src/cnab/service/transacao.service.ts +++ b/src/cnab/service/transacao.service.ts @@ -1,47 +1,66 @@ - -class TransacaoService{ - - - private transacoesRepository: TransacoesRepository; - - private itemTransacaoRepository: ItemTransacoesRepository; - - private clienteFavorecidoService: ClienteFavorecidoService; - - private pagadorService: PagadorService; - - function insereTransacoes(){ - //metodo de inserir cliente Favorecido - var listaCliente = clienteFavorecidoService.insere(); - //TransacoesFernanda buscar - var transacoesFernanda = buscar; - - //percorrer todas a transações e inserir na tabela transacao - for(transacaoFernada : transacoesFernanda) { - - //metodo de consultar o pagador - var pagador = pagadorService.getPagador(2):Pagador; - transacao.idPagador = idPagador; - transacao.nome = transacaoFernanda.nome; - //preencher o objeto transacao e inserir na base (id_pagador parte desse obj) - - var id_transacao = transacoesRepository.insert(transacao) - - //buscar todas as ordens de pagamento por idTransacaoFernanda - var ordensPgto = buscarOrder(transacaoFernada.idTransacaoFernanda); - for(ordemPgto:ordensPgto){ - - var id_cliente_favorecido = listaCliente.findByCPFCNPJ(ordemPgto.cpf_enpj); - itemTransacao.id_cliente_favorecido = id_cliente_favorecido; - //insere o item detalhamento - itemTransacao.id_transacao = id_transacao; - itemTransacao.idClientFavorecido = idClienteFavorecido; - itemTransacao.dt_transacao = ordemPgto.dt_transacao; - - itemTransacaoRepository.insere(itemTransacao); - } - - } - - } -} +// import { BigqueryTransacaoService } from 'src/bigquery/services/bigquery-transacao.service'; +// import { ClienteFavorecidoService } from './cliente-favorecido.service'; +// import { Injectable } from '@nestjs/common'; +// import { TransacaoRepository } from '../repository/transacao.repository'; +// import { CreateTransacaoDto } from '../interfaces/transacao/create-transacao.dto'; +// import { Transacao } from '../entity/transacao.entity'; +// import { BigqueryTransacao } from 'src/bigquery/entities/transacao.bigquery-entity'; +// import { Pagador } from '../entity/pagador.entity'; +// import { PagadorService } from './pagador.service'; +// import { PagadorContaEnum as PagadorContaEnum } from '../enums/pagador/pagador.enum'; +// import { nextFriday, parse } from 'date-fns'; + +// @Injectable() +export class TransacaoService { + // constructor( + // private transacaoRepository: TransacaoRepository, + // private transacaoClienteItemService: TransacaoClienteItemService, + // private clienteFavorecidoService: ClienteFavorecidoService, + // private pagadorService: PagadorService, + // private bigqueryTransacaoService: BigqueryTransacaoService, + // ) { } + // public async insereTransacoes() { + // const favorecidos = await this.clienteFavorecidoService.updateAllFromUsers(); + // const transacoesJae = await this.bigqueryTransacaoService.getTransacaoOfCurrentWeek(); + // for (const bigqueryTransacao of transacoesJae) { + // //metodo de consultar o pagador + // const pagador = await this.pagadorService.getOneById(PagadorContaEnum.JAE); + // var id_transacao = await this.insertTransacao(bigqueryTransacao, pagador); + // //buscar todas as ordens de pagamento por idTransacaoFernanda + // var ordensPgto = buscarOrder(bigqueryTransacao.id_transacao); + // for (const ordemPgto of ordensPgto) { + // var id_cliente_favorecido = listaCliente.findByCPFCNPJ(ordemPgto.cpf_enpj); + // itemTransacao.id_cliente_favorecido = id_cliente_favorecido; + // //insere o item detalhamento + // itemTransacao.id_transacao = id_transacao; + // itemTransacao.idClientFavorecido = idClienteFavorecido; + // itemTransacao.dt_transacao = ordemPgto.dt_transacao; + // itemTransacaoRepository.insere(itemTransacao); + // } + // } + // } + // public async insertTransacao( + // bigqueryTransacao: BigqueryTransacao, + // id_pagador: number, + // ): Promise { + // return await this.transacaoRepository.create({ + // dt_ordem: nextFriday(new Date(bigqueryTransacao.datetime_processamento)), + // dt_pagamento: '', + // nome_consorcio: bigqueryTransacao.consorcio, + // nome_operadora: bigqueryTransacao.operadora, + // servico: bigqueryTransacao.servico, + // id_ordem_ressarcimento: -1, + // qtde_transacao_rateio_credito: number + // vlr_rateio_credito: number + // qtde_transacao_rateio_debito: number + // vlr_rateio_debito: number + // quantidade_total_transacao: number + // vlr_total_transacao_bruto: number + // vlr_desconto_taxa: number + // vlr_total_transacao_liquido: number + // qtde_total_transacao_captura: number + // vlr_total_transacao_captura: number + // indicador_ordem_valida: string + // }); + // } +} diff --git a/src/cnab/templates/cnab-all/cnab-all-104-registro-field-map-template.ts b/src/cnab/templates/cnab-all/cnab-all-104-registro-field-map-template.ts index fbbd9671..0f0df2ce 100644 --- a/src/cnab/templates/cnab-all/cnab-all-104-registro-field-map-template.ts +++ b/src/cnab/templates/cnab-all/cnab-all-104-registro-field-map-template.ts @@ -1,7 +1,7 @@ -import { ICnabFieldMapDetalhe } from 'src/cnab/interfaces/cnab-field-map-detalhe.interface'; -import { ICnabFieldMapTrailerArquivo } from 'src/cnab/interfaces/cnab-field-map-trailer-arquivo.interface'; -import { ICnabFieldMapTrailerLote } from 'src/cnab/interfaces/cnab-field-map-trailer-lote.interface'; -import { ICnabFieldMap } from 'src/cnab/interfaces/cnab-field-map.interface'; +import { ICnabFieldMapDetalhe } from 'src/cnab/interfaces/cnab-all/cnab-field-map-detalhe.interface'; +import { ICnabFieldMapTrailerArquivo } from 'src/cnab/interfaces/cnab-all/cnab-field-map-trailer-arquivo.interface'; +import { ICnabFieldMapTrailerLote } from 'src/cnab/interfaces/cnab-all/cnab-field-map-trailer-lote.interface'; +import { ICnabFieldMap } from 'src/cnab/interfaces/cnab-all/cnab-field-map.interface'; const registro: ICnabFieldMap = { registroIdField: 'codigoRegistro', diff --git a/src/cnab/test/templates/240/generic/cnab-240-generic-field-map-template-test.const.ts b/src/cnab/test/templates/240/generic/cnab-240-generic-field-map-template-test.const.ts index 535e2b6e..bbf69421 100644 --- a/src/cnab/test/templates/240/generic/cnab-240-generic-field-map-template-test.const.ts +++ b/src/cnab/test/templates/240/generic/cnab-240-generic-field-map-template-test.const.ts @@ -1,4 +1,4 @@ -import { ICnabFieldMap } from 'src/cnab/interfaces/cnab-field-map.interface'; +import { ICnabFieldMap } from 'src/cnab/interfaces/cnab-all/cnab-field-map.interface'; const base: ICnabFieldMap = { registroIdField: 'codigoRegistro', diff --git a/src/cnab/types/cnab-registro.type.ts b/src/cnab/types/cnab-registro.type.ts index a7c1572a..4a0ed678 100644 --- a/src/cnab/types/cnab-registro.type.ts +++ b/src/cnab/types/cnab-registro.type.ts @@ -1,5 +1,5 @@ import { isArrayContainEqual } from 'src/utils/array-utils'; -import { ICnabFieldMap } from '../interfaces/cnab-field-map.interface'; +import { ICnabFieldMap } from '../interfaces/cnab-all/cnab-field-map.interface'; import { CnabFields } from './cnab-field.type'; export type CnabRegistro = { diff --git a/src/cnab/utils/cnab-utils.spec.ts b/src/cnab/utils/cnab-utils.spec.ts index 5fba460c..9329c8cb 100644 --- a/src/cnab/utils/cnab-utils.spec.ts +++ b/src/cnab/utils/cnab-utils.spec.ts @@ -9,7 +9,7 @@ import { CnabFields } from '../types/cnab-field.type'; import { CnabFile } from '../types/cnab-file.type'; import { CnabLote } from '../types/cnab-lote.type'; import { CnabRegistro } from '../types/cnab-registro.type'; -import { ICnabFieldMap } from '../interfaces/cnab-field-map.interface'; +import { ICnabFieldMap } from '../interfaces/cnab-all/cnab-field-map.interface'; import * as path from 'path'; import * as fs from 'fs'; import { cnab240GenericFieldMapTemplateTest } from '../test/templates/240/generic/cnab-240-generic-field-map-template-test.const'; diff --git a/src/cnab/utils/cnab-utils.ts b/src/cnab/utils/cnab-utils.ts index 615573b6..d83614b3 100644 --- a/src/cnab/utils/cnab-utils.ts +++ b/src/cnab/utils/cnab-utils.ts @@ -1,7 +1,7 @@ import { Exception } from 'handlebars'; import { CNAB_EOL, CNAB_SUPPORTED_FORMATS } from '../cnab-consts'; import { CnabAllCodigoRegistro } from '../enums/all/cnab-all-codigo-registro.enum'; -import { ICnabFieldMap } from '../interfaces/cnab-field-map.interface'; +import { ICnabFieldMap } from '../interfaces/cnab-all/cnab-field-map.interface'; import { CnabField } from '../types/cnab-field.type'; import { CnabFile, isCnabFile } from '../types/cnab-file.type'; import { CnabLote, isCnabLote } from '../types/cnab-lote.type'; diff --git a/src/config/database.config.ts b/src/config/database.config.ts index ff779e1c..e34dd54e 100644 --- a/src/config/database.config.ts +++ b/src/config/database.config.ts @@ -16,15 +16,15 @@ class EnvironmentVariablesValidator { @IsString() DATABASE_URL: string; - @ValidateIf((envValues) => !envValues.DATABASE_URL) + @ValidateIf((envValues) => !envValues.DATABASE_TYPE) @IsString() DATABASE_TYPE: string; - @ValidateIf((envValues) => !envValues.DATABASE_URL) + @ValidateIf((envValues) => !envValues.DATABASE_HOST) @IsString() DATABASE_HOST: string; - @ValidateIf((envValues) => !envValues.DATABASE_URL) + @ValidateIf((envValues) => !envValues.DATABASE_PORT) @IsInt() @Min(0) @Max(65535) diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index b49b8f4f..efb20931 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -234,6 +234,115 @@ export class User extends EntityHelper { return response; } + /** + * Get field validated + * @throws `HttpException` + */ + getBankAgency(args?: { + errorMessage?: string; + httpStatusCode?: HttpStatus; + }): string { + if (!this.bankAgency) { + throw UserHttpException.invalidField('bankAgency', { + errorMessage: args?.errorMessage, + httpStatusCode: args?.httpStatusCode, + }); + } + return this.bankAgency; + } + + /** + * Get field validated + * @throws `HttpException` + */ + getBankAgencyWithoutDigit(args?: { + errorMessage?: string; + httpStatusCode?: HttpStatus; + }): string { + const agency = this.getBankAgency(args); + return agency.substring(0, agency.length - 1); + } + + /** + * Get field validated + * @throws `HttpException` + */ + getBankAgencyDigit(args?: { + errorMessage?: string; + httpStatusCode?: HttpStatus; + }): string { + const agency = this.getBankAgency(args); + return agency.substring(agency.length - 1); + } + + /** + * Get field validated + * @throws `HttpException` + */ + getBankAccount(args?: { + errorMessage?: string; + httpStatusCode?: HttpStatus; + }): string { + if (!this.bankAccount) { + throw UserHttpException.invalidField('bankAgency', { + errorMessage: args?.errorMessage, + httpStatusCode: args?.httpStatusCode, + }); + } + return this.bankAccount; + } + + /** + * Get field validated + * @throws `HttpException` + */ + getBankAccountDigit(args?: { + errorMessage?: string; + httpStatusCode?: HttpStatus; + }): string { + if (!this.bankAccountDigit) { + throw UserHttpException.invalidField('bankAgency', { + errorMessage: args?.errorMessage, + httpStatusCode: args?.httpStatusCode, + }); + } + return this.bankAccountDigit; + } + + /** + * Get field validated + * @throws `HttpException` + */ + getBankCode(args?: { + errorMessage?: string; + httpStatusCode?: HttpStatus; + }): number { + if (!this.bankCode) { + throw UserHttpException.invalidField('bankAgency', { + errorMessage: args?.errorMessage, + httpStatusCode: args?.httpStatusCode, + }); + } + return this.bankCode; + } + + /** + * Get field validated + * @throws `HttpException` + */ + getFullName(args?: { + errorMessage?: string; + httpStatusCode?: HttpStatus; + }): string { + if (!this.fullName) { + throw UserHttpException.invalidField('bankAgency', { + errorMessage: args?.errorMessage, + httpStatusCode: args?.httpStatusCode, + }); + } + return this.fullName; + } + /** * Get field validated * @throws `HttpException` diff --git a/src/utils/http-exception/common-http-exception.ts b/src/utils/http-exception/common-http-exception.ts index eb86af59..8ffdd637 100644 --- a/src/utils/http-exception/common-http-exception.ts +++ b/src/utils/http-exception/common-http-exception.ts @@ -25,17 +25,17 @@ export const CommonHttpException = { httpStatusCode, ), notFound: ( - notFoundField: string, + notFoundItem: string, httpStatusCode: HttpStatus = HttpStatus.NOT_FOUND, error?: string, ) => new HttpException( { error: error || getHttpStatusMessage(httpStatusCode), - ...(notFoundField + ...(notFoundItem ? { details: { - [notFoundField]: 'not found', + [notFoundItem]: 'not found', }, } : {}), diff --git a/src/utils/payment-date-utils.ts b/src/utils/payment-date-utils.ts index c81bd722..dca77a0a 100644 --- a/src/utils/payment-date-utils.ts +++ b/src/utils/payment-date-utils.ts @@ -18,6 +18,9 @@ export const PAYMENT_START_WEEKDAY = WeekdayEnum._4_THURSDAY; export const PAYMENT_END_WEEKDAY = WeekdayEnum._3_WEDNESDAY; export type PaymentEndpointType = 'bank-statements' | 'ticket-revenues'; +/** + * From friday get starting thursday and ending wednesday + */ export function getPaymentWeek( fridayDate: Date, endpoint: PaymentEndpointType = 'ticket-revenues', From 1edda6cc7dc4fe0732f4d81914b8b536b7c5aa70 Mon Sep 17 00:00:00 2001 From: Raphael Rivas Date: Thu, 29 Feb 2024 16:06:22 -0300 Subject: [PATCH 5/8] wip: dto --- .../ordem-pagamento.bigquery-entity.ts | 90 +++++++ .../entities/transacao.bigquery-entity.ts | 10 +- .../bigquery-ordem-pagamento.repository.ts | 233 ++++++++++++++++++ .../bigquery-transacao.repository.ts | 3 +- src/cnab/dto/save-cliente-favorecido.dto.ts | 4 +- src/cnab/dto/save-detalhe-a.dto.ts | 73 ++++++ src/cnab/dto/save-detalhe-b.dto.ts | 21 ++ src/cnab/dto/save-pagador.dto.ts | 61 +++++ .../dto/save-transacao-cliente-item.dto.ts | 17 ++ src/cnab/dto/save-transacao.dto.ts | 80 ++++++ src/cnab/entity/detalhe-a.entity.ts | 18 +- src/cnab/entity/detalhe-b.entiy.ts | 17 +- src/cnab/entity/header-arquivo.entity.ts | 1 + src/cnab/entity/header-lote.entity.ts | 2 +- src/cnab/entity/item-transacao.entity.ts | 6 +- .../entity/transacao-cliente-item.entity.ts | 11 +- .../create-cliente-favorecido.dto.ts | 18 -- .../update-cliente-favorecido.dto.ts | 18 -- .../interfaces/pagador/create-pagador.dto.ts | 16 -- .../interfaces/pagador/update-pagador.dto.ts | 16 -- .../create-transacao-cliente-item.dto.ts | 5 - .../update-transacao-cliente-item.dto.ts | 5 - .../transacao/create-transacao.dto.ts | 22 -- .../transacao/update-transacao.dto.ts | 21 -- .../cliente-favorecido.repository.ts | 44 +--- src/cnab/repository/detalhe-a.repository.ts | 64 +++++ src/cnab/repository/detalhe-b.repository.ts | 61 +++++ src/cnab/repository/pagador.repository.ts | 19 +- .../transacao-clienite-item.repository.ts | 31 ++- src/cnab/repository/transacao.repository.ts | 33 ++- .../service/cliente-favorecido.service.ts | 10 +- src/cnab/service/pagador.service.ts | 21 +- src/cnab/service/transacao.service.ts | 103 ++++---- src/users/users.service.ts | 8 +- .../http-exception/common-http-exception.ts | 14 +- src/utils/types/invalid-rows.type.ts | 2 +- src/utils/validation-utils.ts | 44 ++++ 37 files changed, 953 insertions(+), 269 deletions(-) create mode 100644 src/bigquery/entities/ordem-pagamento.bigquery-entity.ts create mode 100644 src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts create mode 100644 src/cnab/dto/save-detalhe-a.dto.ts create mode 100644 src/cnab/dto/save-detalhe-b.dto.ts create mode 100644 src/cnab/dto/save-pagador.dto.ts create mode 100644 src/cnab/dto/save-transacao-cliente-item.dto.ts create mode 100644 src/cnab/dto/save-transacao.dto.ts delete mode 100644 src/cnab/interfaces/cliente-favorecido/create-cliente-favorecido.dto.ts delete mode 100644 src/cnab/interfaces/cliente-favorecido/update-cliente-favorecido.dto.ts delete mode 100644 src/cnab/interfaces/pagador/create-pagador.dto.ts delete mode 100644 src/cnab/interfaces/pagador/update-pagador.dto.ts delete mode 100644 src/cnab/interfaces/transacao-cliente-item/create-transacao-cliente-item.dto.ts delete mode 100644 src/cnab/interfaces/transacao-cliente-item/update-transacao-cliente-item.dto.ts delete mode 100644 src/cnab/interfaces/transacao/create-transacao.dto.ts delete mode 100644 src/cnab/interfaces/transacao/update-transacao.dto.ts create mode 100644 src/utils/validation-utils.ts diff --git a/src/bigquery/entities/ordem-pagamento.bigquery-entity.ts b/src/bigquery/entities/ordem-pagamento.bigquery-entity.ts new file mode 100644 index 00000000..ad2ab81d --- /dev/null +++ b/src/bigquery/entities/ordem-pagamento.bigquery-entity.ts @@ -0,0 +1,90 @@ +export class BigqueryOrdemPagamento { + /** Data da ordem de pagamento (partição) */ + data_ordem: Date; + + /** Data de pagamento da ordem */ + data_pagamento: Date; + + /** Nome cadastro.consorcios */ + id_consorcio: string; + + /** Nome do consórcio */ + consorcio: string; + + /** Identificador da operadora na tabela cadastro.operadoras */ + id_operadora: string; + + /** Nome da operadora */ + operadora: string; + + /** Nome curto da linha operada com variação de serviço (ex: 010, 011SN, ...) */ + servico: string; + + /** Identificador da ordem pagamento no banco de dados da Jaé */ + id_ordem_pagamento: string; + + /** Identificador da ordem ressarcimento no banco de dados da Jaé */ + id_ordem_ressarcimento: string; + + /** Quantidade de transações feitas na modalidade débito */ + quantidade_transacao_debito: number; + + /** Valor total das transações feitas na modalidade débito (R$) */ + valor_debito: number; + + /** Quantidade de transações feitas em espécie */ + quantidade_transacao_especie: number; + + /** Valor total das transações feitas em espécie (R$) */ + valor_especie: number; + + /** Quantidade de transações feitas com gratuidade */ + quantidade_transacao_gratuidade: number; + + /** Valor total das transações feitas com gratuidade (R$) */ + valor_gratuidade: number; + + /** Quantidade de transações feitas com integração */ + quantidade_transacao_integracao: number; + + /** Valor total das transações feitas com integração (R$) */ + valor_integracao: number; + + /** Número de transações com rateio de crédito */ + quantidade_transacao_rateio_credito: number; + + /** Valor total das transações com rateio de crédito (R$) */ + valor_rateio_credito: number; + + /** Número de transações com rateio de débito */ + quantidade_transacao_rateio_debito: number; + + /** Valor total das transações com rateio de débito (R$) */ + valor_rateio_debito: number; + + /** Quantidade total de transações realizadas */ + quantidade_total_transacao: number; + + /** Valor total das transações realizadas (R$) */ + valor_total_transacao_bruto: number; + + /** Valor da taxa descontado do valor total (R$) */ + valor_desconto_taxa: number; + + /** Valor total das transações menos o valor_desconto_taxa (R$) */ + valor_total_transacao_liquido: number; + + /** Quantidade total de transações calculada pela captura de transações */ + quantidade_total_transacao_captura: number; + + /** Valor total das transações realizadas calculada pela captura de transações (R$) */ + valor_total_transacao_captura: number; + + /** Indicador de validação da ordem de pagamento */ + indicador_ordem_valida: boolean; + + /** Código de controle de versão do dado (SHA Github) */ + versao: string; + + aux_nextFriday: Date; +} diff --git a/src/bigquery/entities/transacao.bigquery-entity.ts b/src/bigquery/entities/transacao.bigquery-entity.ts index d788f704..6c605902 100644 --- a/src/bigquery/entities/transacao.bigquery-entity.ts +++ b/src/bigquery/entities/transacao.bigquery-entity.ts @@ -1,10 +1,10 @@ export class BigqueryTransacao { id: number; - data: Date; + data: string; hora: number; - datetime_transacao: Date; - datetime_processamento: Date; - datetime_captura: Date; + datetime_transacao: string; + datetime_processamento: string; + datetime_captura: string; modo: string; id_consorcio: string; /** Nome do consórcio */ @@ -29,4 +29,6 @@ export class BigqueryTransacao { stop_lon: number; valor_transacao: number; versao: string; + + aux_nextFriday: string; } diff --git a/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts b/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts new file mode 100644 index 00000000..7b57c570 --- /dev/null +++ b/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts @@ -0,0 +1,233 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { appSettings } from 'src/settings/app.settings'; +import { BigqueryEnvironment } from 'src/settings/enums/bigquery-env.enum'; +import { SettingsService } from 'src/settings/settings.service'; +import { TRIntegrationTypeMap } from 'src/ticket-revenues/maps/ticket-revenues.map'; +import { isCpfOrCnpj } from 'src/utils/cpf-cnpj'; +import { QueryBuilder } from 'src/utils/query-builder/query-builder'; +import { BQSInstances, BigqueryService } from '../bigquery.service'; +import { IBqFetchTransacao } from '../interfaces/bq-find-transacao-by.interface'; +import { BqTsansacaoTipoIntegracaoMap } from '../maps/bq-transacao-tipo-integracao.map'; +import { BqTransacaoTipoPagamentoMap } from '../maps/bq-transacao-tipo-pagamento.map'; +import { BqTransacaoTipoTransacaoMap } from '../maps/bq-transacao-tipo-transacao.map'; +import { BigqueryOrdemPagamento } from '../entities/ordem-pagamento.bigquery-entity'; + +@Injectable() +export class BigqueryOrdemPagamentoRepository { + private logger: Logger = new Logger('BigqueryOrdemPagamentoRepository', { + timestamp: true, + }); + + constructor( + private readonly bigqueryService: BigqueryService, + private readonly settingsService: SettingsService, + ) {} + + public async findTransacaoBy( + filter?: IBqFetchTransacao, + ): Promise { + const transacoes: BigqueryOrdemPagamento[] = ( + await this.fetchTransacao(filter) + ).data; + return transacoes; + } + + private async fetchTransacao( + args?: IBqFetchTransacao, + ): Promise<{ data: BigqueryOrdemPagamento[]; countAll: number }> { + const qArgs = await this.getQueryArgs(args); + const query = + ` + SELECT + CAST(t.data AS STRING) AS \`data\`, + t.hora AS hora, + CAST(t.datetime_transacao AS STRING) AS datetime_transacao, + CAST(t.datetime_processamento AS STRING) AS datetime_processamento, + t.datetime_captura AS captureDateTime, + t.modo AS modo, + t.servico AS servico, + t.sentido AS sentido, + t.id_veiculo AS id_veiculo, + t.id_cliente AS id_cliente, + t.id_transacao AS id_transacao, + t.${qArgs.tTipoPgto} AS tipo_pagamento, + t.tipo_transacao AS tipo_transacao, + t.id_tipo_integracao AS id_tipo_integracao, + t.id_integracao AS id_integracao, + t.latitude AS latitude, + t.longitude AS longitude, + t.stop_id AS stop_id, + t.stop_lat AS stop_lat, + t.stop_lon AS stop_lon, + CASE WHEN t.tipo_transacao = 'Integração' THEN i.valor_transacao_total ELSE t.valor_transacao END AS valor_transacao, + t.versao AS bqDataVersion, + DATE_ADD(t.data, INTERVAL MOD(6 - EXTRACT(DAYOFWEEK FROM t.data) + 7, 7) DAY) AS aux_nextFriday, + (${qArgs.countQuery}) AS count, + 'ok' AS status + FROM \`${qArgs.transacao}\` t\n` + + qArgs.joinCpfCnpj + + '\n' + + qArgs.joinIntegracao + + '\n' + + (qArgs.qWhere.length ? `WHERE ${qArgs.qWhere}\n` : '') + + `UNION ALL + SELECT ${'null, '.repeat(23)} + (${qArgs.countQuery}) AS count, 'empty' AS status` + + `\nORDER BY \`data\` DESC, hora DESC` + + (qArgs?.limit !== undefined ? `\nLIMIT ${qArgs.limit + 1}` : '') + + (qArgs?.offset !== undefined ? `\nOFFSET ${qArgs.offset}` : ''); + const queryResult = await this.bigqueryService.query( + BQSInstances.smtr, + query, + ); + + const count: number = queryResult[0].count; + // Remove unwanted keys and remove last item (all null if empty) + let transacoes: BigqueryOrdemPagamento[] = queryResult.map((i) => { + delete i.status; + delete i.count; + return i; + }); + transacoes.pop(); + transacoes = this.mapBqTransacao(transacoes); + + return { + data: transacoes, + countAll: count, + }; + } + + private async getQueryArgs(args?: IBqFetchTransacao): Promise<{ + qWhere: string; + bucket: string; + transacao: string; + integracao: string; + tTipoPgto: string; + joinCpfCnpj: string; + joinIntegracao: string; + countQuery: string; + offset?: number; + limit?: number; + }> { + const IS_BQ_PROD = + ( + await this.settingsService.getOneBySettingData( + appSettings.any__bigquery_env, + true, + ) + ).getValueAsString() === BigqueryEnvironment.Production; + const Q_CONSTS = { + bucket: IS_BQ_PROD ? 'rj-smtr' : 'rj-smtr-dev', + transacao: IS_BQ_PROD + ? 'rj-smtr.br_rj_riodejaneiro_bilhetagem.transacao' + : 'rj-smtr-dev.br_rj_riodejaneiro_bilhetagem_cct.transacao', + integracao: IS_BQ_PROD + ? 'rj-smtr.br_rj_riodejaneiro_bilhetagem.integracao' + : 'rj-smtr-dev.br_rj_riodejaneiro_bilhetagem_cct.integracao', + tTipoPgto: IS_BQ_PROD ? 'tipo_pagamento' : 'id_tipo_pagamento', + }; + // Args + let offset = args?.offset; + const queryBuilder = new QueryBuilder(); + queryBuilder.pushOR([]); + if (args?.offset !== undefined && args.limit === undefined) { + this.logger.warn( + "fetchTicketRevenues(): 'offset' is defined but 'limit' is not." + + " 'offset' will be ignored to prevent query fail", + ); + offset = undefined; + } + + if (args?.startDate) { + const startDate = args.startDate.toISOString().slice(0, 10); + queryBuilder.pushAND( + `DATE(t.datetime_processamento) >= DATE('${startDate}')`, + ); + } + if (args?.endDate) { + const endDate = args.endDate.toISOString().slice(0, 10); + queryBuilder.pushAND( + `DATE(t.datetime_processamento) <= DATE('${endDate}')`, + ); + } + if (args?.previousDaysOnly === true) { + queryBuilder.pushAND( + 'DATE(t.datetime_processamento) > DATE(t.datetime_transacao)', + ); + } + + queryBuilder.pushOR([]); + if (args?.getToday) { + const nowStr = new Date(Date.now()).toISOString().slice(0, 10); + queryBuilder.pushAND( + `DATE(t.datetime_processamento) = DATE('${nowStr}')`, + ); + } + + let qWhere = queryBuilder.toSQL(); + if (args?.cpfCnpj !== undefined) { + const cpfCnpj = args.cpfCnpj; + qWhere = + isCpfOrCnpj(args?.cpfCnpj) === 'cpf' + ? `b.documento = '${cpfCnpj}' AND (${qWhere})` + : `b.cnpj = '${cpfCnpj}' AND (${qWhere})`; + } + + // Query + const joinCpfCnpj = + isCpfOrCnpj(args?.cpfCnpj) === 'cpf' + ? `LEFT JOIN \`${Q_CONSTS.bucket}.cadastro.operadoras\` b ON b.id_operadora = t.id_operadora ` + : `LEFT JOIN \`${Q_CONSTS.bucket}.cadastro.consorcios\` b ON b.id_consorcio = t.id_consorcio `; + const joinIntegracao = `INNER JOIN ${Q_CONSTS.integracao} i ON i.id_transacao = t.id_transacao`; + + const countQuery = + 'SELECT COUNT(*) AS count ' + + `FROM \`${Q_CONSTS.transacao}\` t\n` + + joinCpfCnpj + + '\n' + + joinIntegracao + + '\n' + + (qWhere.length ? ` WHERE ${qWhere}\n` : ''); + return { + qWhere, + bucket: Q_CONSTS.bucket, + transacao: Q_CONSTS.transacao, + integracao: Q_CONSTS.integracao, + tTipoPgto: Q_CONSTS.tTipoPgto, + joinCpfCnpj, + joinIntegracao, + countQuery, + offset, + limit: args?.limit, + }; + } + + /** + * Convert id or some values into desired string values + */ + private mapBqTransacao( + transacoes: BigqueryOrdemPagamento[], + ): BigqueryOrdemPagamento[] { + return transacoes.map((item: BigqueryOrdemPagamento) => { + const tipo_transacao = item.tipo_transacao; + const tipo_pagamento = item.tipo_pagamento; + const tipo_integracao = item.tipo_integracao; + Object.values(TRIntegrationTypeMap[0]); + return { + ...item, + paymentMediaType: + tipo_pagamento !== null + ? BqTransacaoTipoPagamentoMap?.[tipo_pagamento] || tipo_pagamento + : tipo_pagamento, + transportIntegrationType: + tipo_integracao !== null + ? BqTsansacaoTipoIntegracaoMap?.[tipo_integracao] || tipo_integracao + : tipo_integracao, + transactionType: + tipo_transacao !== null + ? BqTransacaoTipoTransacaoMap?.[tipo_transacao] || tipo_transacao + : tipo_transacao, + }; + }); + } +} diff --git a/src/bigquery/repositories/bigquery-transacao.repository.ts b/src/bigquery/repositories/bigquery-transacao.repository.ts index 227f7d20..040ad49f 100644 --- a/src/bigquery/repositories/bigquery-transacao.repository.ts +++ b/src/bigquery/repositories/bigquery-transacao.repository.ts @@ -60,6 +60,7 @@ export class BigqueryTransacaoRepository { t.stop_lon AS stop_lon, CASE WHEN t.tipo_transacao = 'Integração' THEN i.valor_transacao_total ELSE t.valor_transacao END AS valor_transacao, t.versao AS bqDataVersion, + CAST(DATE_ADD(t.data, INTERVAL MOD(6 - EXTRACT(DAYOFWEEK FROM t.data) + 7, 7) DAY) AS STRING) AS aux_nextFriday, (${qArgs.countQuery}) AS count, 'ok' AS status FROM \`${qArgs.transacao}\` t\n` + @@ -69,7 +70,7 @@ export class BigqueryTransacaoRepository { '\n' + (qArgs.qWhere.length ? `WHERE ${qArgs.qWhere}\n` : '') + `UNION ALL - SELECT ${'null, '.repeat(22)} + SELECT ${'null, '.repeat(23)} (${qArgs.countQuery}) AS count, 'empty' AS status` + `\nORDER BY \`data\` DESC, hora DESC` + (qArgs?.limit !== undefined ? `\nLIMIT ${qArgs.limit + 1}` : '') + diff --git a/src/cnab/dto/save-cliente-favorecido.dto.ts b/src/cnab/dto/save-cliente-favorecido.dto.ts index bd16f721..2ec7c2c1 100644 --- a/src/cnab/dto/save-cliente-favorecido.dto.ts +++ b/src/cnab/dto/save-cliente-favorecido.dto.ts @@ -1,10 +1,10 @@ import { IsNotEmpty, ValidateIf } from 'class-validator'; -function isCreate(object: SaveClienteFavorecidoDto): boolean { +function isCreate(object: SaveClienteFavorecidoDTO): boolean { return object.id_cliente_favorecido === undefined; } -export class SaveClienteFavorecidoDto { +export class SaveClienteFavorecidoDTO { id_cliente_favorecido?: number; @ValidateIf(isCreate) diff --git a/src/cnab/dto/save-detalhe-a.dto.ts b/src/cnab/dto/save-detalhe-a.dto.ts new file mode 100644 index 00000000..6303e298 --- /dev/null +++ b/src/cnab/dto/save-detalhe-a.dto.ts @@ -0,0 +1,73 @@ +import { IsNotEmpty, ValidateIf } from 'class-validator'; + +function isCreate(object: SaveDetalheADTO): boolean { + return object.id_detalhe_a === undefined; +} + +export class SaveDetalheADTO { + id_detalhe_a?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + id_header_lote?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + lote_servico?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + id_cliente_favorecido?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + tipo_finalidade_conta?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + dt_vencimento?: Date; + + @ValidateIf(isCreate) + @IsNotEmpty() + tipo_moeda?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + qtde_moeda?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + valor_lancamento?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + num_doc_lancamento?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + qtde_parcelas?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + indicador_bloqueio?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + indicador_forma_parcelamento?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + periodo_vencimento?: Date; + + @ValidateIf(isCreate) + @IsNotEmpty() + num_parcela?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + data_efetivacao?: Date; + + @ValidateIf(isCreate) + @IsNotEmpty() + valor_real_efetivado?: number; +} diff --git a/src/cnab/dto/save-detalhe-b.dto.ts b/src/cnab/dto/save-detalhe-b.dto.ts new file mode 100644 index 00000000..55c97c6b --- /dev/null +++ b/src/cnab/dto/save-detalhe-b.dto.ts @@ -0,0 +1,21 @@ +import { IsNotEmpty, ValidateIf } from 'class-validator'; + +function isCreate(object: SaveDetalheBDTO): boolean { + return object.id_detalhe_a === undefined; +} + +export class SaveDetalheBDTO { + id_detalhe_b?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + id_detalhe_a?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + nsr?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + data_vencimento?: Date; +} diff --git a/src/cnab/dto/save-pagador.dto.ts b/src/cnab/dto/save-pagador.dto.ts new file mode 100644 index 00000000..bda1a8dc --- /dev/null +++ b/src/cnab/dto/save-pagador.dto.ts @@ -0,0 +1,61 @@ +import { IsNotEmpty, ValidateIf } from 'class-validator'; + +function isCreate(object: SavePagadorDTO): boolean { + return object.id_pagador === undefined; +} + +export class SavePagadorDTO { + id_pagador?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + nome_empresa: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + agencia: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + dv_agencia: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + conta: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + dv_conta: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + logradouro: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + numero: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + complemento: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + bairro: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + cidade: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + cep: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + complemento_cep: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + uf: string; +} diff --git a/src/cnab/dto/save-transacao-cliente-item.dto.ts b/src/cnab/dto/save-transacao-cliente-item.dto.ts new file mode 100644 index 00000000..e5c940d9 --- /dev/null +++ b/src/cnab/dto/save-transacao-cliente-item.dto.ts @@ -0,0 +1,17 @@ +import { IsNotEmpty, ValidateIf } from 'class-validator'; + +function isCreate(object: SaveTransacaoClienteItemDTO): boolean { + return object.id === undefined; +} + +export class SaveTransacaoClienteItemDTO { + id?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + id_item_transacao?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + id_cliente_favorecido?: number; +} diff --git a/src/cnab/dto/save-transacao.dto.ts b/src/cnab/dto/save-transacao.dto.ts new file mode 100644 index 00000000..9c03213a --- /dev/null +++ b/src/cnab/dto/save-transacao.dto.ts @@ -0,0 +1,80 @@ +import { IsNotEmpty, ValidateIf } from 'class-validator'; + +function isCreate(object: SaveTransacaoDTO): boolean { + return object.id_transacao === undefined; +} + +export class SaveTransacaoDTO { + id_transacao?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + dt_ordem?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + dt_pagamento?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + nome_consorcio?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + nome_operadora?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + servico?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + id_ordem_ressarcimento?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + qtde_transacao_rateio_credito?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + vlr_rateio_credito?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + qtde_transacao_rateio_debito?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + vlr_rateio_debito?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + quantidade_total_transacao?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + vlr_total_transacao_bruto?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + vlr_desconto_taxa?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + vlr_total_transacao_liquido?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + qtde_total_transacao_captura?: number; + + @ValidateIf(isCreate) + @IsNotEmpty() + vlr_total_transacao_captura?: number; + + @ValidateIf(isCreate) + indicador_ordem_valida?: string; + + @ValidateIf(isCreate) + @IsNotEmpty() + id_pagador?: number; +} diff --git a/src/cnab/entity/detalhe-a.entity.ts b/src/cnab/entity/detalhe-a.entity.ts index 82809b69..2bb0bf7d 100644 --- a/src/cnab/entity/detalhe-a.entity.ts +++ b/src/cnab/entity/detalhe-a.entity.ts @@ -1,6 +1,15 @@ +import { DeepPartial, Entity } from 'typeorm'; import { EntityHelper } from './../../utils/entity-helper'; + @Entity() -class DetalheA extends EntityHelper { +export class DetalheA extends EntityHelper { + constructor(detalheA?: DetalheA | DeepPartial) { + super(); + if (detalheA !== undefined) { + Object.assign(this, detalheA); + } + } + id_detalhe_a: number; id_header_lote: number; lote_servico: string; @@ -18,8 +27,9 @@ class DetalheA extends EntityHelper { num_parcela: number; data_efetivacao: Date; valor_real_efetivado: number; -} -function Entity(): (target: typeof DetalheA) => void | typeof DetalheA { - throw new Error('Function not implemented.'); + public getLogInfo(): string { + const response = `#${this.id_detalhe_a}`; + return response; + } } diff --git a/src/cnab/entity/detalhe-b.entiy.ts b/src/cnab/entity/detalhe-b.entiy.ts index f2610c7b..3f542796 100644 --- a/src/cnab/entity/detalhe-b.entiy.ts +++ b/src/cnab/entity/detalhe-b.entiy.ts @@ -1,13 +1,22 @@ import { EntityHelper } from 'src/utils/entity-helper'; +import { DeepPartial, Entity } from 'typeorm'; @Entity() -class DetalheB extends EntityHelper { +export class DetalheB extends EntityHelper { + constructor(detalheB?: DetalheB | DeepPartial) { + super(); + if (detalheB !== undefined) { + Object.assign(this, detalheB); + } + } + id_detalhe_b: number; id_detalhe_a: number; nsr: string; data_vencimento: Date; -} -function Entity(): (target: typeof DetalheB) => void | typeof DetalheB { - throw new Error('Function not implemented.'); + public getLogInfo(): string { + const response = `#${this.id_detalhe_b}`; + return response; + } } diff --git a/src/cnab/entity/header-arquivo.entity.ts b/src/cnab/entity/header-arquivo.entity.ts index e9d15e81..aa9ad46d 100644 --- a/src/cnab/entity/header-arquivo.entity.ts +++ b/src/cnab/entity/header-arquivo.entity.ts @@ -1,5 +1,6 @@ import { EntityHelper } from 'src/utils/entity-helper'; import { Entity } from 'typeorm'; + @Entity() export class HeaderArquivo extends EntityHelper { id_header_arquivo: number; diff --git a/src/cnab/entity/header-lote.entity.ts b/src/cnab/entity/header-lote.entity.ts index 3f8efc96..d49e4d42 100644 --- a/src/cnab/entity/header-lote.entity.ts +++ b/src/cnab/entity/header-lote.entity.ts @@ -1,7 +1,7 @@ import { EntityHelper } from 'src/utils/entity-helper'; @Entity() -class HeaderLote extends EntityHelper { +export class HeaderLote extends EntityHelper { id_header_lote: number; id_header_arquivo: number; lote_servico: string; diff --git a/src/cnab/entity/item-transacao.entity.ts b/src/cnab/entity/item-transacao.entity.ts index cccf88ce..51a8c754 100644 --- a/src/cnab/entity/item-transacao.entity.ts +++ b/src/cnab/entity/item-transacao.entity.ts @@ -1,11 +1,11 @@ import { EntityHelper } from 'src/utils/entity-helper'; @Entity() -class ItemTransacao extends EntityHelper { +export class ItemTransacao extends EntityHelper { id_item_transacao: number; dt_transacao: Date; - dt_processamentoDate; - dt_capturaDate; + dt_processamento; + dt_captura; modo: string; nome_consorcio: string; id_tipo_pagamento: number; diff --git a/src/cnab/entity/transacao-cliente-item.entity.ts b/src/cnab/entity/transacao-cliente-item.entity.ts index 1815813c..e349187b 100644 --- a/src/cnab/entity/transacao-cliente-item.entity.ts +++ b/src/cnab/entity/transacao-cliente-item.entity.ts @@ -1,8 +1,17 @@ import { EntityHelper } from 'src/utils/entity-helper'; -import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; +import { Column, DeepPartial, Entity, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class TransacaoClienteItem extends EntityHelper { + constructor( + entity?: TransacaoClienteItem | DeepPartial, + ) { + super(); + if (entity !== undefined) { + Object.assign(this, entity); + } + } + @PrimaryGeneratedColumn() id?: number; diff --git a/src/cnab/interfaces/cliente-favorecido/create-cliente-favorecido.dto.ts b/src/cnab/interfaces/cliente-favorecido/create-cliente-favorecido.dto.ts deleted file mode 100644 index 7ceade55..00000000 --- a/src/cnab/interfaces/cliente-favorecido/create-cliente-favorecido.dto.ts +++ /dev/null @@ -1,18 +0,0 @@ -export class CreateClienteFavorecidoDto { - id_cliente_favorecido?: number; - nome: string; - cpf_cnpj: string; - cod_banco: string; - agencia: string; - dv_agencia: string; - conta_corrente: string; - dv_conta_corrente: string; - logradouro: string; - numero: string; - complemento: string; - bairro: string; - cidade: string; - cep: string; - complemento_cep: string; - uf: string; -} diff --git a/src/cnab/interfaces/cliente-favorecido/update-cliente-favorecido.dto.ts b/src/cnab/interfaces/cliente-favorecido/update-cliente-favorecido.dto.ts deleted file mode 100644 index 5c3656df..00000000 --- a/src/cnab/interfaces/cliente-favorecido/update-cliente-favorecido.dto.ts +++ /dev/null @@ -1,18 +0,0 @@ -export class UpdateCreateClienteFavorecidoDto { - id_cliente_favorecido?: number; - nome?: string; - cpf_cnpj?: string; - cod_banco?: string; - agencia?: string; - dv_agencia?: string; - conta_corrente?: string; - dv_conta_corrente?: string; - logradouro?: string; - numero?: string; - complemento?: string; - bairro?: string; - cidade?: string; - cep?: string; - complemento_cep?: string; - uf?: string; -} diff --git a/src/cnab/interfaces/pagador/create-pagador.dto.ts b/src/cnab/interfaces/pagador/create-pagador.dto.ts deleted file mode 100644 index a8b92607..00000000 --- a/src/cnab/interfaces/pagador/create-pagador.dto.ts +++ /dev/null @@ -1,16 +0,0 @@ -export class CreatePagadorDto { - id_pagador?: number; - nome_empresa: string; - agencia: string; - dv_agencia: string; - conta: string; - dv_conta: string; - logradouro: string; - numero: string; - complemento: string; - bairro: string; - cidade: string; - cep: string; - complemento_cep: string; - uf: string; -} diff --git a/src/cnab/interfaces/pagador/update-pagador.dto.ts b/src/cnab/interfaces/pagador/update-pagador.dto.ts deleted file mode 100644 index 5e523b0f..00000000 --- a/src/cnab/interfaces/pagador/update-pagador.dto.ts +++ /dev/null @@ -1,16 +0,0 @@ -export class UpdatePagadorDto { - id_pagador?: number; - nome_empresa?: string; - agencia?: string; - dv_agencia?: string; - conta?: string; - dv_conta?: string; - logradouro?: string; - numero?: string; - complemento?: string; - bairro?: string; - cidade?: string; - cep?: string; - complemento_cep?: string; - uf?: string; -} diff --git a/src/cnab/interfaces/transacao-cliente-item/create-transacao-cliente-item.dto.ts b/src/cnab/interfaces/transacao-cliente-item/create-transacao-cliente-item.dto.ts deleted file mode 100644 index a9d63f7b..00000000 --- a/src/cnab/interfaces/transacao-cliente-item/create-transacao-cliente-item.dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class CreateTransacaoClienteItemDto { - id?: number; - id_item_transacao: number; - id_cliente_favorecido: number; -} diff --git a/src/cnab/interfaces/transacao-cliente-item/update-transacao-cliente-item.dto.ts b/src/cnab/interfaces/transacao-cliente-item/update-transacao-cliente-item.dto.ts deleted file mode 100644 index 1d043ecb..00000000 --- a/src/cnab/interfaces/transacao-cliente-item/update-transacao-cliente-item.dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class UpdateTransacaoClienteItemDto { - id?: number; - id_item_transacao?: number; - id_cliente_favorecido?: number; -} diff --git a/src/cnab/interfaces/transacao/create-transacao.dto.ts b/src/cnab/interfaces/transacao/create-transacao.dto.ts deleted file mode 100644 index c8ca5e47..00000000 --- a/src/cnab/interfaces/transacao/create-transacao.dto.ts +++ /dev/null @@ -1,22 +0,0 @@ -export class CreateTransacaoDto { - id?: number; - id_transacao?: string; - dt_ordem: string; - dt_pagamento: string; - nome_consorcio: string; - nome_operadora: string; - servico: string; - id_ordem_ressarcimento: number; - qtde_transacao_rateio_credito: number; - vlr_rateio_credito: number; - qtde_transacao_rateio_debito: number; - vlr_rateio_debito: number; - quantidade_total_transacao: number; - vlr_total_transacao_bruto: number; - vlr_desconto_taxa: number; - vlr_total_transacao_liquido: number; - qtde_total_transacao_captura: number; - vlr_total_transacao_captura: number; - indicador_ordem_valida: string; - id_pagador: number; -} diff --git a/src/cnab/interfaces/transacao/update-transacao.dto.ts b/src/cnab/interfaces/transacao/update-transacao.dto.ts deleted file mode 100644 index 4f65066e..00000000 --- a/src/cnab/interfaces/transacao/update-transacao.dto.ts +++ /dev/null @@ -1,21 +0,0 @@ -export class UpdateTransacaoDto { - id_transacao?: number; - dt_ordem?: string; - dt_pagamento?: string; - nome_consorcio?: string; - nome_operadora?: string; - servico?: string; - id_ordem_ressarcimento?: number; - qtde_transacao_rateio_credito?: number; - vlr_rateio_credito?: number; - qtde_transacao_rateio_debito?: number; - vlr_rateio_debito?: number; - quantidade_total_transacao?: number; - vlr_total_transacao_bruto?: number; - vlr_desconto_taxa?: number; - vlr_total_transacao_liquido?: number; - qtde_total_transacao_captura?: number; - vlr_total_transacao_captura?: number; - indicador_ordem_valida?: string; - id_pagador?: number; -} diff --git a/src/cnab/repository/cliente-favorecido.repository.ts b/src/cnab/repository/cliente-favorecido.repository.ts index 892c9bf2..1850473b 100644 --- a/src/cnab/repository/cliente-favorecido.repository.ts +++ b/src/cnab/repository/cliente-favorecido.repository.ts @@ -1,76 +1,58 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { formatLog } from 'src/utils/logging'; import { EntityCondition } from 'src/utils/types/entity-condition.type'; import { NullableType } from 'src/utils/types/nullable.type'; import { Repository, UpdateResult } from 'typeorm'; -import { SaveClienteFavorecidoDto } from '../dto/save-cliente-favorecido.dto'; +import { SaveClienteFavorecidoDTO } from '../dto/save-cliente-favorecido.dto'; import { ClienteFavorecido } from '../entity/cliente-favorecido.entity'; -import { UpdateCreateClienteFavorecidoDto } from '../interfaces/cliente-favorecido/update-cliente-favorecido.dto'; @Injectable() export class ClienteFavorecidoRepository { private logger: Logger = new Logger('ClienteFavorecidoRepository', { timestamp: true, }); - private ENTITY_NAME = ClienteFavorecido.name; constructor( @InjectRepository(ClienteFavorecido) private clienteFavorecidoRepository: Repository, ) {} - async save(dto: SaveClienteFavorecidoDto): Promise { + async save(dto: SaveClienteFavorecidoDTO): Promise { if (dto.id_cliente_favorecido === undefined) { - this.clienteFavorecidoRepository.create(dto); + await this.create(dto); } else { await this.update(dto.id_cliente_favorecido, dto); } - const createdUser = await this.clienteFavorecidoRepository.save( - this.clienteFavorecidoRepository.create(dto), - ); - this.logger.log(`${this.ENTITY_NAME} criado: ${createdUser.getLogInfo()}`); - return createdUser; } async create( - createProfileDto: SaveClienteFavorecidoDto, + createProfileDto: SaveClienteFavorecidoDTO, ): Promise { const createdUser = await this.clienteFavorecidoRepository.save( this.clienteFavorecidoRepository.create(createProfileDto), ); - this.logger.log(`Usuário criado: ${createdUser.getLogInfo()}`); + this.logger.log(`ClienteFavorecido criado: ${createdUser.getLogInfo()}`); return createdUser; } async update( id: number, - updateDto: SaveClienteFavorecidoDto, - logContext?: string, - logOldFavorecido?: ClienteFavorecido, + updateDto: SaveClienteFavorecidoDTO, ): Promise { const updatePayload = await this.clienteFavorecidoRepository.update( { id_cliente_favorecido: id }, updateDto, ); - if (logOldFavorecido) { - this.logUpdateFavorecido(logOldFavorecido, updateDto, logContext); - } - + const updatedItem = new ClienteFavorecido({ + id_cliente_favorecido: id, + ...updateDto, + }); + this.logger.log( + `ClienteFavorecido atualizado: ${updatedItem.getLogInfo()}`, + ); return updatePayload; } - private logUpdateFavorecido( - old: ClienteFavorecido, - updateDto: UpdateCreateClienteFavorecidoDto, - outerContext?: string, - ) { - const logMsg = - `Favorecido ${old.getLogInfo(false)} teve seus campos atualizados: ` + - `[${Object.keys(updateDto)} ]`; - this.logger.log(formatLog(logMsg, 'update()', outerContext)); - } - public async findOne( fields: | EntityCondition diff --git a/src/cnab/repository/detalhe-a.repository.ts b/src/cnab/repository/detalhe-a.repository.ts index e69de29b..be3a92f4 100644 --- a/src/cnab/repository/detalhe-a.repository.ts +++ b/src/cnab/repository/detalhe-a.repository.ts @@ -0,0 +1,64 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { EntityCondition } from 'src/utils/types/entity-condition.type'; +import { NullableType } from 'src/utils/types/nullable.type'; +import { Repository, UpdateResult } from 'typeorm'; +import { SaveDetalheADTO } from '../dto/save-detalhe-a.dto'; +import { DetalheA } from '../entity/detalhe-a.entity'; + +@Injectable() +export class DetalheARepository { + private logger: Logger = new Logger('DetalheARepository', { + timestamp: true, + }); + + constructor( + @InjectRepository(DetalheA) + private DetalheARepository: Repository, + ) {} + + async save(dto: SaveDetalheADTO): Promise { + if (dto.id_detalhe_a === undefined) { + await this.create(dto); + } else { + await this.update(dto.id_detalhe_a, dto); + } + } + + async create(createProfileDto: SaveDetalheADTO): Promise { + const createdUser = await this.DetalheARepository.save( + this.DetalheARepository.create(createProfileDto), + ); + this.logger.log(`DetalheA criado: ${createdUser.getLogInfo()}`); + return createdUser; + } + + async update(id: number, updateDto: SaveDetalheADTO): Promise { + const updatePayload = await this.DetalheARepository.update( + { id_cliente_favorecido: id }, + updateDto, + ); + const updatedItem = new DetalheA({ + id_cliente_favorecido: id, + ...updateDto, + }); + this.logger.log(`DetalheA atualizado: ${updatedItem.getLogInfo()}`); + return updatePayload; + } + + public async findOne( + fields: EntityCondition | EntityCondition[], + ): Promise> { + return await this.DetalheARepository.findOne({ + where: fields, + }); + } + + public async findMany( + fields: EntityCondition | EntityCondition[], + ): Promise { + return await this.DetalheARepository.find({ + where: fields, + }); + } +} diff --git a/src/cnab/repository/detalhe-b.repository.ts b/src/cnab/repository/detalhe-b.repository.ts index e69de29b..446a0658 100644 --- a/src/cnab/repository/detalhe-b.repository.ts +++ b/src/cnab/repository/detalhe-b.repository.ts @@ -0,0 +1,61 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { EntityCondition } from 'src/utils/types/entity-condition.type'; +import { NullableType } from 'src/utils/types/nullable.type'; +import { Repository, UpdateResult } from 'typeorm'; +import { DetalheB } from '../entity/detalhe-b.entiy'; +import { SaveDetalheBDTO } from '../dto/save-detalhe-b.dto'; + +@Injectable() +export class DetalheBRepository { + private logger: Logger = new Logger('DetalheBRepository', { + timestamp: true, + }); + + constructor( + @InjectRepository(DetalheB) + private DetalheBRepository: Repository, + ) {} + + async save(dto: SaveDetalheBDTO): Promise { + if (dto.id_detalhe_a === undefined) { + await this.create(dto); + } else { + await this.update(dto.id_detalhe_a, dto); + } + } + + async create(createProfileDto: SaveDetalheBDTO): Promise { + const createdUser = await this.DetalheBRepository.save( + this.DetalheBRepository.create(createProfileDto), + ); + this.logger.log(`DetalheB criado: ${createdUser.getLogInfo()}`); + return createdUser; + } + + async update(id: number, updateDto: SaveDetalheBDTO): Promise { + const updatePayload = await this.DetalheBRepository.update( + { id_detalhe_b: id }, + updateDto, + ); + const updatedItem = new DetalheB({ id_detalhe_b: id, ...updateDto }); + this.logger.log(`DetalheB atualizado: ${updatedItem.getLogInfo()}`); + return updatePayload; + } + + public async findOne( + fields: EntityCondition | EntityCondition[], + ): Promise> { + return await this.DetalheBRepository.findOne({ + where: fields, + }); + } + + public async findMany( + fields: EntityCondition | EntityCondition[], + ): Promise { + return await this.DetalheBRepository.find({ + where: fields, + }); + } +} diff --git a/src/cnab/repository/pagador.repository.ts b/src/cnab/repository/pagador.repository.ts index 3bf28023..00f73e80 100644 --- a/src/cnab/repository/pagador.repository.ts +++ b/src/cnab/repository/pagador.repository.ts @@ -4,8 +4,7 @@ import { EntityCondition } from 'src/utils/types/entity-condition.type'; import { NullableType } from 'src/utils/types/nullable.type'; import { Repository, UpdateResult } from 'typeorm'; import { Pagador } from '../entity/pagador.entity'; -import { CreatePagadorDto } from '../interfaces/pagador/create-pagador.dto'; -import { UpdatePagadorDto } from '../interfaces/pagador/update-pagador.dto'; +import { SavePagadorDTO } from '../dto/save-pagador.dto'; @Injectable() export class PagadorRepository { @@ -16,22 +15,32 @@ export class PagadorRepository { private PagadorRepository: Repository, ) {} - public async create(createProfileDto: CreatePagadorDto): Promise { + public async save(dto: SavePagadorDTO): Promise { + if (dto.id_pagador === undefined) { + await this.create(dto); + } else { + await this.update(dto.id_pagador, dto); + } + } + + public async create(createProfileDto: SavePagadorDTO): Promise { const createdItem = await this.PagadorRepository.save( this.PagadorRepository.create(createProfileDto), ); this.logger.log(`Pagador criado: ${createdItem[0].getLogInfo()}`); - return createdItem[0]; + return createdItem; } public async update( id: number, - updateDto: UpdatePagadorDto, + updateDto: SavePagadorDTO, ): Promise { const updatePayload = await this.PagadorRepository.update( { id_pagador: id }, updateDto, ); + const updatedItem = new Pagador({ id_pagador: id, ...updateDto }); + this.logger.log(`Pagador atualizado: ${updatedItem.getLogInfo()}`); return updatePayload; } diff --git a/src/cnab/repository/transacao-clienite-item.repository.ts b/src/cnab/repository/transacao-clienite-item.repository.ts index 5630fec7..7dca4d3d 100644 --- a/src/cnab/repository/transacao-clienite-item.repository.ts +++ b/src/cnab/repository/transacao-clienite-item.repository.ts @@ -4,8 +4,7 @@ import { EntityCondition } from 'src/utils/types/entity-condition.type'; import { NullableType } from 'src/utils/types/nullable.type'; import { Repository, UpdateResult } from 'typeorm'; import { TransacaoClienteItem } from '../entity/transacao-cliente-item.entity'; -import { CreateTransacaoClienteItemDto } from '../interfaces/transacao-cliente-item/create-transacao-cliente-item.dto'; -import { UpdateTransacaoClienteItemDto } from '../interfaces/transacao-cliente-item/update-transacao-cliente-item.dto'; +import { SaveTransacaoClienteItemDTO } from '../dto/save-transacao-cliente-item.dto'; @Injectable() export class TransacaoClienteItemRepository { @@ -15,14 +14,22 @@ export class TransacaoClienteItemRepository { constructor( @InjectRepository(TransacaoClienteItem) - private TransacaoClienteItemRepository: Repository, + private transacaoClienteItemRepository: Repository, ) {} + public async save(dto: SaveTransacaoClienteItemDTO): Promise { + if (dto.id === undefined) { + await this.create(dto); + } else { + await this.update(dto.id, dto); + } + } + public async create( - createProfileDto: CreateTransacaoClienteItemDto, + createProfileDto: SaveTransacaoClienteItemDTO, ): Promise { - const createdItem = await this.TransacaoClienteItemRepository.save( - this.TransacaoClienteItemRepository.create(createProfileDto), + const createdItem = await this.transacaoClienteItemRepository.save( + this.transacaoClienteItemRepository.create(createProfileDto), ); this.logger.log(`TransacaoClienteItem criado: ${createdItem.getLogInfo()}`); return createdItem; @@ -30,12 +37,16 @@ export class TransacaoClienteItemRepository { public async update( id: number, - updateDto: UpdateTransacaoClienteItemDto, + updateDto: SaveTransacaoClienteItemDTO, ): Promise { - const updatePayload = await this.TransacaoClienteItemRepository.update( + const updatePayload = await this.transacaoClienteItemRepository.update( { id_cliente_favorecido: id }, updateDto, ); + const updatedItem = new TransacaoClienteItem({ id: id, ...updateDto }); + this.logger.log( + `TransacaoClienteItem atualizado: ${updatedItem.getLogInfo()}`, + ); return updatePayload; } @@ -44,7 +55,7 @@ export class TransacaoClienteItemRepository { | EntityCondition | EntityCondition[], ): Promise> { - return await this.TransacaoClienteItemRepository.findOne({ + return await this.transacaoClienteItemRepository.findOne({ where: fields, }); } @@ -54,7 +65,7 @@ export class TransacaoClienteItemRepository { | EntityCondition | EntityCondition[], ): Promise { - return await this.TransacaoClienteItemRepository.find({ + return await this.transacaoClienteItemRepository.find({ where: fields, }); } diff --git a/src/cnab/repository/transacao.repository.ts b/src/cnab/repository/transacao.repository.ts index 71e54fbf..ba88f9f0 100644 --- a/src/cnab/repository/transacao.repository.ts +++ b/src/cnab/repository/transacao.repository.ts @@ -4,8 +4,7 @@ import { EntityCondition } from 'src/utils/types/entity-condition.type'; import { NullableType } from 'src/utils/types/nullable.type'; import { Repository, UpdateResult } from 'typeorm'; import { Transacao } from '../entity/transacao.entity'; -import { CreateTransacaoDto } from '../interfaces/transacao/create-transacao.dto'; -import { UpdateTransacaoDto } from '../interfaces/transacao/update-transacao.dto'; +import { SaveTransacaoDTO } from '../dto/save-transacao.dto'; @Injectable() export class TransacaoRepository { @@ -15,34 +14,42 @@ export class TransacaoRepository { constructor( @InjectRepository(Transacao) - private TransacaoRepository: Repository, + private transacaoRepository: Repository, ) {} - public async create( - createProfileDto: CreateTransacaoDto, - ): Promise { - const createdItem = await this.TransacaoRepository.save( - this.TransacaoRepository.create(createProfileDto), + public async save(dto: SaveTransacaoDTO): Promise { + if (dto.id_transacao === undefined) { + await this.create(dto); + } else { + await this.update(dto.id_transacao, dto); + } + } + + private async create(createProfileDto: SaveTransacaoDTO): Promise { + const createdItem = await this.transacaoRepository.save( + this.transacaoRepository.create(createProfileDto), ); this.logger.log(`Transacao criado: ${createdItem.getLogInfo()}`); return createdItem; } - public async update( + private async update( id: number, - updateDto: UpdateTransacaoDto, + updateDto: SaveTransacaoDTO, ): Promise { - const updatePayload = await this.TransacaoRepository.update( + const updatePayload = await this.transacaoRepository.update( { id_transacao: id }, updateDto, ); + const updatedItem = new Transacao({ id_transacao: id, ...updateDto }); + this.logger.log(`Transacao atualizado: ${updatedItem.getLogInfo()}`); return updatePayload; } public async findOne( fields: EntityCondition | EntityCondition[], ): Promise> { - return await this.TransacaoRepository.findOne({ + return await this.transacaoRepository.findOne({ where: fields, }); } @@ -50,7 +57,7 @@ export class TransacaoRepository { public async findMany( fields: EntityCondition | EntityCondition[], ): Promise { - return await this.TransacaoRepository.find({ + return await this.transacaoRepository.find({ where: fields, }); } diff --git a/src/cnab/service/cliente-favorecido.service.ts b/src/cnab/service/cliente-favorecido.service.ts index ffa58f04..9ea87bf1 100644 --- a/src/cnab/service/cliente-favorecido.service.ts +++ b/src/cnab/service/cliente-favorecido.service.ts @@ -3,6 +3,8 @@ import { User } from 'src/users/entities/user.entity'; import { UsersService } from 'src/users/users.service'; import { ClienteFavorecido } from '../entity/cliente-favorecido.entity'; import { ClienteFavorecidoRepository } from '../repository/cliente-favorecido.repository'; +import { SaveClienteFavorecidoDTO } from '../dto/save-cliente-favorecido.dto'; +import { validateDTO } from 'src/utils/validation-utils'; @Injectable() export class ClienteFavorecidoService { @@ -36,8 +38,8 @@ export class ClienteFavorecidoService { private async saveFavorecidoFromUser( user: User, existingId_facorecido?: number, - ): Promise { - return await this.clienteFavorecidoRepository.create({ + ): Promise { + const saveObject: SaveClienteFavorecidoDTO = { id_cliente_favorecido: existingId_facorecido, nome: user.getFullName(), cpf_cnpj: user.getCpfCnpj(), @@ -54,6 +56,8 @@ export class ClienteFavorecidoService { cep: '', complemento_cep: '', uf: '', - }); + }; + await validateDTO(SaveClienteFavorecidoDTO, saveObject); + await this.clienteFavorecidoRepository.save(saveObject); } } diff --git a/src/cnab/service/pagador.service.ts b/src/cnab/service/pagador.service.ts index 67bb1e09..98e34f0f 100644 --- a/src/cnab/service/pagador.service.ts +++ b/src/cnab/service/pagador.service.ts @@ -1,5 +1,4 @@ import { HttpStatus, Injectable, Logger } from '@nestjs/common'; -import { UsersService } from 'src/users/users.service'; import { CommonHttpException } from 'src/utils/http-exception/common-http-exception'; import { Pagador } from '../entity/pagador.entity'; import { PagadorContaEnum } from '../enums/pagador/pagador.enum'; @@ -9,21 +8,19 @@ import { PagadorRepository } from '../repository/pagador.repository'; export class PagadorService { private logger: Logger = new Logger('PagadorService', { timestamp: true }); - constructor( - private usersService: UsersService, - private pagadorRepository: PagadorRepository, - ) {} + constructor(private pagadorRepository: PagadorRepository) {} - public async findById(id: PagadorContaEnum | number) { - return await this.pagadorRepository.findOne({ id_pagador: id }); + public async findByConta(conta: PagadorContaEnum | string) { + return await this.pagadorRepository.findOne({ conta: conta }); } - public async getOneById(id: PagadorContaEnum | number): Promise { - const pagador = await this.pagadorRepository.findOne({ id_pagador: id }); + public async getOneById(conta: PagadorContaEnum | string): Promise { + const pagador = await this.pagadorRepository.findOne({ conta: conta }); if (!pagador) { - throw CommonHttpException.notFound( - 'Pagador.pagador_id', - HttpStatus.INTERNAL_SERVER_ERROR, + throw CommonHttpException.errorDetails( + 'Pagador.conta not found', + { pagadorConta: conta }, + HttpStatus.NOT_FOUND, ); } else { return pagador; diff --git a/src/cnab/service/transacao.service.ts b/src/cnab/service/transacao.service.ts index 49abc052..b34b7a1f 100644 --- a/src/cnab/service/transacao.service.ts +++ b/src/cnab/service/transacao.service.ts @@ -1,47 +1,54 @@ -// import { BigqueryTransacaoService } from 'src/bigquery/services/bigquery-transacao.service'; -// import { ClienteFavorecidoService } from './cliente-favorecido.service'; -// import { Injectable } from '@nestjs/common'; -// import { TransacaoRepository } from '../repository/transacao.repository'; -// import { CreateTransacaoDto } from '../interfaces/transacao/create-transacao.dto'; -// import { Transacao } from '../entity/transacao.entity'; +// WIP + +import { Injectable } from '@nestjs/common'; +// import { nextFriday } from 'date-fns'; // import { BigqueryTransacao } from 'src/bigquery/entities/transacao.bigquery-entity'; -// import { Pagador } from '../entity/pagador.entity'; +import { BigqueryTransacaoService } from 'src/bigquery/services/bigquery-transacao.service'; +// import { PagadorContaEnum } from '../enums/pagador/pagador.enum'; +// import { TransacaoRepository } from '../repository/transacao.repository'; +import { ClienteFavorecidoService } from './cliente-favorecido.service'; // import { PagadorService } from './pagador.service'; -// import { PagadorContaEnum as PagadorContaEnum } from '../enums/pagador/pagador.enum'; -// import { nextFriday, parse } from 'date-fns'; -// @Injectable() +@Injectable() export class TransacaoService { - // constructor( - // private transacaoRepository: TransacaoRepository, - // private transacaoClienteItemService: TransacaoClienteItemService, - // private clienteFavorecidoService: ClienteFavorecidoService, - // private pagadorService: PagadorService, - // private bigqueryTransacaoService: BigqueryTransacaoService, - // ) { } - // public async insereTransacoes() { - // const favorecidos = await this.clienteFavorecidoService.updateAllFromUsers(); - // const transacoesJae = await this.bigqueryTransacaoService.getTransacaoOfCurrentWeek(); - // for (const bigqueryTransacao of transacoesJae) { - // //metodo de consultar o pagador - // const pagador = await this.pagadorService.getOneById(PagadorContaEnum.JAE); - // var id_transacao = await this.insertTransacao(bigqueryTransacao, pagador); - // //buscar todas as ordens de pagamento por idTransacaoFernanda - // var ordensPgto = buscarOrder(bigqueryTransacao.id_transacao); - // for (const ordemPgto of ordensPgto) { - // var id_cliente_favorecido = listaCliente.findByCPFCNPJ(ordemPgto.cpf_enpj); - // itemTransacao.id_cliente_favorecido = id_cliente_favorecido; - // //insere o item detalhamento - // itemTransacao.id_transacao = id_transacao; - // itemTransacao.idClientFavorecido = idClienteFavorecido; - // itemTransacao.dt_transacao = ordemPgto.dt_transacao; - // itemTransacaoRepository.insere(itemTransacao); - // } - // } - // } + constructor( + // private transacaoRepository: TransacaoRepository, + // private transacaoClienteItemService: TransacaoClienteItemService, + private clienteFavorecidoService: ClienteFavorecidoService, + // private pagadorService: PagadorService, + private bigqueryTransacaoService: BigqueryTransacaoService, + ) {} + public async insereTransacoes() { + const favorecidos = + await this.clienteFavorecidoService.updateAllFromUsers(); + const transacoesJae = + await this.bigqueryTransacaoService.getTransacaoOfCurrentWeek(); + for (const bigqueryTransacao of transacoesJae) { + // WIP + console.log(bigqueryTransacao, favorecidos); // tslint ignore + // const pagador = await this.pagadorService.getOneById(PagadorContaEnum.JAE); + // var id_transacao = await this.insertTransacao(bigqueryTransacao, pagador.id_pagador); + // //buscar todas as ordens de pagamento por idTransacaoFernanda + // var ordensPgto = buscarOrder(bigqueryTransacao.id_transacao); + // for (const ordemPgto of ordensPgto) { + // var id_cliente_favorecido = listaCliente.findByCPFCNPJ(ordemPgto.cpf_enpj); + // itemTransacao.id_cliente_favorecido = id_cliente_favorecido; + // //insere o item detalhamento + // itemTransacao.id_transacao = id_transacao; + // itemTransacao.idClientFavorecido = idClienteFavorecido; + // itemTransacao.dt_transacao = ordemPgto.dt_transacao; + // itemTransacaoRepository.insere(itemTransacao); + // } + } + } + + /** + * Para cada BigqueryOrdemPagamento insere em Transacao + */ // public async insertTransacao( // bigqueryTransacao: BigqueryTransacao, - // id_pagador: number, + // bigqueryOrdemPagamento: BigqueryOrdemPagamento + // id_pagador: number, // ): Promise { // return await this.transacaoRepository.create({ // dt_ordem: nextFriday(new Date(bigqueryTransacao.datetime_processamento)), @@ -51,16 +58,16 @@ export class TransacaoService { // servico: bigqueryTransacao.servico, // id_ordem_ressarcimento: -1, // qtde_transacao_rateio_credito: number - // vlr_rateio_credito: number - // qtde_transacao_rateio_debito: number - // vlr_rateio_debito: number - // quantidade_total_transacao: number - // vlr_total_transacao_bruto: number - // vlr_desconto_taxa: number - // vlr_total_transacao_liquido: number - // qtde_total_transacao_captura: number - // vlr_total_transacao_captura: number - // indicador_ordem_valida: string + // vlr_rateio_credito: number + // qtde_transacao_rateio_debito: number + // vlr_rateio_debito: number + // quantidade_total_transacao: number + // vlr_total_transacao_bruto: number + // vlr_desconto_taxa: number + // vlr_total_transacao_liquido: number + // qtde_total_transacao_captura: number + // vlr_total_transacao_captura: number + // indicador_ordem_valida: string // }); // } } diff --git a/src/users/users.service.ts b/src/users/users.service.ts index a0de1c97..b60d69f3 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -19,7 +19,7 @@ import { HttpStatusMessage } from 'src/utils/enums/http-error-message.enum'; import { formatLog } from 'src/utils/logging'; import { getStringUpperUnaccent } from 'src/utils/string-utils'; import { EntityCondition } from 'src/utils/types/entity-condition.type'; -import { InvalidRowsType } from 'src/utils/types/invalid-rows.type'; +import { InvalidRows } from 'src/utils/types/invalid-rows.type'; import { PaginationOptions } from 'src/utils/types/pagination-options'; import { Brackets, @@ -401,14 +401,14 @@ export class UsersService { async validateFileValues( userFile: IFileUser, fileUsers: IFileUser[], - validatorDto, - ): Promise { + validatorDto: any, + ): Promise { const schema = plainToClass(validatorDto, userFile.user); const errors = await validate(schema as Record, { stopAtFirstError: true, }); const SEPARATOR = '; '; - const errorDictionary: InvalidRowsType = errors.reduce((result, error) => { + const errorDictionary: InvalidRows = errors.reduce((result, error) => { const { property, constraints } = error; if (property && constraints) { result[property] = Object.values(constraints).join(SEPARATOR); diff --git a/src/utils/http-exception/common-http-exception.ts b/src/utils/http-exception/common-http-exception.ts index 8ffdd637..71211f02 100644 --- a/src/utils/http-exception/common-http-exception.ts +++ b/src/utils/http-exception/common-http-exception.ts @@ -16,7 +16,19 @@ export const CommonHttpException = { }, httpStatusCode, ), - simpleDetail: (details: any, httpStatusCode: HttpStatus = 500) => + errorDetails: ( + error: string, + details: object, + httpStatusCode: HttpStatus = 500, + ) => + new HttpException( + { + error: getHttpStatusMessage(httpStatusCode), + details, + }, + httpStatusCode, + ), + simpleDetails: (details: any, httpStatusCode: HttpStatus = 500) => new HttpException( { error: getHttpStatusMessage(httpStatusCode), diff --git a/src/utils/types/invalid-rows.type.ts b/src/utils/types/invalid-rows.type.ts index af988b4d..900042b3 100644 --- a/src/utils/types/invalid-rows.type.ts +++ b/src/utils/types/invalid-rows.type.ts @@ -11,4 +11,4 @@ * } * ``` */ -export type InvalidRowsType = { [field: string]: string }; +export type InvalidRows = { [field: string]: string }; diff --git a/src/utils/validation-utils.ts b/src/utils/validation-utils.ts new file mode 100644 index 00000000..174d2b9e --- /dev/null +++ b/src/utils/validation-utils.ts @@ -0,0 +1,44 @@ +import { HttpException, HttpStatus, ValidationError } from '@nestjs/common'; +import { plainToInstance } from 'class-transformer'; +import { validate } from 'class-validator'; +import { getHttpStatusMessage } from './http-exception/http-exception-utils'; +import { InvalidRows } from './types/invalid-rows.type'; + +const SEPARATOR = '; '; + +export async function validateDTO( + dto: any, + object: any, + throwOnError = true, +): Promise { + const schema = plainToInstance(dto, object); + const errors = await validate(schema as Record, { + stopAtFirstError: true, + }); + const invalidRows = getInvalidRows(errors); + if (errors.length > 0 && throwOnError) { + const code = HttpStatus.UNPROCESSABLE_ENTITY; + throw new HttpException( + { + error: getHttpStatusMessage(code), + details: { + message: 'Object failed passing through DTO', + errors: invalidRows, + }, + }, + code, + ); + } else { + return invalidRows; + } +} + +export function getInvalidRows(errors: ValidationError[]): InvalidRows { + return errors.reduce((result, error) => { + const { property, constraints } = error; + if (property && constraints) { + result[property] = Object.values(constraints).join(SEPARATOR); + } + return result; + }, {}); +} From 028a517cad400262aff5fcec1f4d81402373a0fd Mon Sep 17 00:00:00 2001 From: Raphael Rivas Date: Thu, 29 Feb 2024 16:08:52 -0300 Subject: [PATCH 6/8] wip: bqOrdemPgto --- .../bigquery-ordem-pagamento.repository.ts | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts b/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts index 7b57c570..de269799 100644 --- a/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts +++ b/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts @@ -83,13 +83,13 @@ export class BigqueryOrdemPagamentoRepository { const count: number = queryResult[0].count; // Remove unwanted keys and remove last item (all null if empty) - let transacoes: BigqueryOrdemPagamento[] = queryResult.map((i) => { + const transacoes: BigqueryOrdemPagamento[] = queryResult.map((i) => { delete i.status; delete i.count; return i; }); transacoes.pop(); - transacoes = this.mapBqTransacao(transacoes); + // transacoes = this.mapBqTransacao(transacoes); return { data: transacoes, @@ -205,29 +205,29 @@ export class BigqueryOrdemPagamentoRepository { /** * Convert id or some values into desired string values */ - private mapBqTransacao( - transacoes: BigqueryOrdemPagamento[], - ): BigqueryOrdemPagamento[] { - return transacoes.map((item: BigqueryOrdemPagamento) => { - const tipo_transacao = item.tipo_transacao; - const tipo_pagamento = item.tipo_pagamento; - const tipo_integracao = item.tipo_integracao; - Object.values(TRIntegrationTypeMap[0]); - return { - ...item, - paymentMediaType: - tipo_pagamento !== null - ? BqTransacaoTipoPagamentoMap?.[tipo_pagamento] || tipo_pagamento - : tipo_pagamento, - transportIntegrationType: - tipo_integracao !== null - ? BqTsansacaoTipoIntegracaoMap?.[tipo_integracao] || tipo_integracao - : tipo_integracao, - transactionType: - tipo_transacao !== null - ? BqTransacaoTipoTransacaoMap?.[tipo_transacao] || tipo_transacao - : tipo_transacao, - }; - }); - } + // private mapBqTransacao( + // transacoes: BigqueryOrdemPagamento[], + // ): BigqueryOrdemPagamento[] { + // return transacoes.map((item: BigqueryOrdemPagamento) => { + // const tipo_transacao = item.tipo_transacao; + // const tipo_pagamento = item.tipo_pagamento; + // const tipo_integracao = item.tipo_integracao; + // Object.values(TRIntegrationTypeMap[0]); + // return { + // ...item, + // paymentMediaType: + // tipo_pagamento !== null + // ? BqTransacaoTipoPagamentoMap?.[tipo_pagamento] || tipo_pagamento + // : tipo_pagamento, + // transportIntegrationType: + // tipo_integracao !== null + // ? BqTsansacaoTipoIntegracaoMap?.[tipo_integracao] || tipo_integracao + // : tipo_integracao, + // transactionType: + // tipo_transacao !== null + // ? BqTransacaoTipoTransacaoMap?.[tipo_transacao] || tipo_transacao + // : tipo_transacao, + // }; + // }); + // } } From d2ce3322361a510af2bf35833f6e870c3b644b75 Mon Sep 17 00:00:00 2001 From: Raphael Rivas Date: Thu, 29 Feb 2024 16:09:33 -0300 Subject: [PATCH 7/8] ok --- .../repositories/bigquery-ordem-pagamento.repository.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts b/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts index de269799..f76e0534 100644 --- a/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts +++ b/src/bigquery/repositories/bigquery-ordem-pagamento.repository.ts @@ -2,15 +2,11 @@ import { Injectable, Logger } from '@nestjs/common'; import { appSettings } from 'src/settings/app.settings'; import { BigqueryEnvironment } from 'src/settings/enums/bigquery-env.enum'; import { SettingsService } from 'src/settings/settings.service'; -import { TRIntegrationTypeMap } from 'src/ticket-revenues/maps/ticket-revenues.map'; import { isCpfOrCnpj } from 'src/utils/cpf-cnpj'; import { QueryBuilder } from 'src/utils/query-builder/query-builder'; import { BQSInstances, BigqueryService } from '../bigquery.service'; -import { IBqFetchTransacao } from '../interfaces/bq-find-transacao-by.interface'; -import { BqTsansacaoTipoIntegracaoMap } from '../maps/bq-transacao-tipo-integracao.map'; -import { BqTransacaoTipoPagamentoMap } from '../maps/bq-transacao-tipo-pagamento.map'; -import { BqTransacaoTipoTransacaoMap } from '../maps/bq-transacao-tipo-transacao.map'; import { BigqueryOrdemPagamento } from '../entities/ordem-pagamento.bigquery-entity'; +import { IBqFetchTransacao } from '../interfaces/bq-find-transacao-by.interface'; @Injectable() export class BigqueryOrdemPagamentoRepository { From 8f7edfa13140ec506a61495552b4849f5a6f3c4f Mon Sep 17 00:00:00 2001 From: Raphael Rivas Date: Thu, 29 Feb 2024 16:13:30 -0300 Subject: [PATCH 8/8] chore: rename --- ...te-item.repository.ts => transacao-cliente-item.repository.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/cnab/repository/{transacao-clienite-item.repository.ts => transacao-cliente-item.repository.ts} (100%) diff --git a/src/cnab/repository/transacao-clienite-item.repository.ts b/src/cnab/repository/transacao-cliente-item.repository.ts similarity index 100% rename from src/cnab/repository/transacao-clienite-item.repository.ts rename to src/cnab/repository/transacao-cliente-item.repository.ts