Skip to content

Commit

Permalink
Merge branch 'feature/22-geracao-periodica-relatorio' of github.com:f…
Browse files Browse the repository at this point in the history
…ga-eps-mds/2024.1-PrintGo-PrinterService into feature/28-gerar-relatorio-contrato
  • Loading branch information
DanielViniciusAlves committed Aug 5, 2024
2 parents 086f0dd + 29505c3 commit 93240c5
Show file tree
Hide file tree
Showing 20 changed files with 1,828 additions and 57 deletions.
1,012 changes: 1,001 additions & 11 deletions package-lock.json

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,11 @@
"@prisma/client": "^5.17.0",
"bcryptjs": "^2.4.3",
"cors": "^2.8.5",
"cron": "^3.1.7",
"date-fns": "^3.6.0",
"dotenv": "^16.3.1",
"express": "^4.18.2",
"html-pdf": "^3.0.1",
"i": "^0.3.7",
"joi": "^17.13.3",
"jsonwebtoken": "^9.0.2",
Expand Down
24 changes: 24 additions & 0 deletions prisma/migrations/20240729045818_teste/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
-- CreateTable
CREATE TABLE "Impressora" (
"id" SERIAL NOT NULL,
"numContrato" TEXT NOT NULL,
"numSerie" TEXT NOT NULL,
"enderecoIp" TEXT NOT NULL,
"estaNaRede" BOOLEAN NOT NULL,
"dataInstalacao" TIMESTAMP(3) NOT NULL,
"dataRetirada" TIMESTAMP(3),
"ativo" BOOLEAN NOT NULL,
"contadorInstalacaoPB" INTEGER NOT NULL,
"contadorInstalacaoCor" INTEGER NOT NULL,
"contadorAtualPB" INTEGER NOT NULL,
"contadorAtualCor" INTEGER NOT NULL,
"contadorRetiradaPB" INTEGER NOT NULL,
"contadorRetiradaCor" INTEGER NOT NULL,
"localizacao" TEXT NOT NULL,
"modeloId" TEXT NOT NULL,

CONSTRAINT "Impressora_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE UNIQUE INDEX "Impressora_numSerie_key" ON "Impressora"("numSerie");
64 changes: 64 additions & 0 deletions prisma/migrations/20240731203208_relatorio/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
-- CreateTable
CREATE TABLE "padroes" (
"id" SERIAL NOT NULL,
"marca" TEXT NOT NULL,
"modelo" TEXT NOT NULL,
"tipo" TEXT NOT NULL,
"colorido" BOOLEAN NOT NULL,
"oidModelo" TEXT,
"oidNumeroSerie" TEXT,
"oidFirmware" TEXT,
"oidTempoAtivo" TEXT,
"oidDigitalizacoes" TEXT,
"oidCopiasPB" TEXT,
"oidCopiasCor" TEXT,
"oidTotalGeral" TEXT,
"ativo" BOOLEAN NOT NULL DEFAULT true,

CONSTRAINT "padroes_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Impressora" (
"id" SERIAL NOT NULL,
"numContrato" TEXT NOT NULL,
"numSerie" TEXT NOT NULL,
"enderecoIp" TEXT NOT NULL,
"estaNaRede" BOOLEAN NOT NULL,
"dataInstalacao" TIMESTAMP(3) NOT NULL,
"dataRetirada" TIMESTAMP(3),
"ativo" BOOLEAN NOT NULL,
"contadorInstalacaoPB" INTEGER NOT NULL,
"contadorInstalacaoCor" INTEGER NOT NULL,
"contadorAtualPB" INTEGER NOT NULL,
"contadorAtualCor" INTEGER NOT NULL,
"contadorRetiradaPB" INTEGER NOT NULL,
"contadorRetiradaCor" INTEGER NOT NULL,
"localizacao" TEXT NOT NULL,
"modeloId" TEXT NOT NULL,

CONSTRAINT "Impressora_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Relatorio" (
"id" SERIAL NOT NULL,
"impressoraId" INTEGER NOT NULL,
"contadorMes" INTEGER NOT NULL,
"ultimoResultado" INTEGER NOT NULL,
"ultimaAtualizacao" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Relatorio_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE UNIQUE INDEX "padroes_marca_modelo_key" ON "padroes"("marca", "modelo");

-- CreateIndex
CREATE UNIQUE INDEX "Impressora_numSerie_key" ON "Impressora"("numSerie");

-- CreateIndex
CREATE UNIQUE INDEX "Relatorio_impressoraId_key" ON "Relatorio"("impressoraId");

-- AddForeignKey
ALTER TABLE "Relatorio" ADD CONSTRAINT "Relatorio_impressoraId_fkey" FOREIGN KEY ("impressoraId") REFERENCES "Impressora"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
64 changes: 64 additions & 0 deletions prisma/migrations/20240802012536_/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
-- CreateTable
CREATE TABLE "padroes" (
"id" SERIAL NOT NULL,
"marca" TEXT NOT NULL,
"modelo" TEXT NOT NULL,
"tipo" TEXT NOT NULL,
"colorido" BOOLEAN NOT NULL,
"oidModelo" TEXT,
"oidNumeroSerie" TEXT,
"oidFirmware" TEXT,
"oidTempoAtivo" TEXT,
"oidDigitalizacoes" TEXT,
"oidCopiasPB" TEXT,
"oidCopiasCor" TEXT,
"oidTotalGeral" TEXT,
"ativo" BOOLEAN NOT NULL DEFAULT true,

CONSTRAINT "padroes_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Impressora" (
"id" SERIAL NOT NULL,
"numContrato" TEXT NOT NULL,
"numSerie" TEXT NOT NULL,
"enderecoIp" TEXT NOT NULL,
"estaNaRede" BOOLEAN NOT NULL,
"dataInstalacao" TIMESTAMP(3) NOT NULL,
"dataRetirada" TIMESTAMP(3),
"ativo" BOOLEAN NOT NULL,
"contadorInstalacaoPB" INTEGER NOT NULL,
"contadorInstalacaoCor" INTEGER NOT NULL,
"contadorAtualPB" INTEGER NOT NULL,
"contadorAtualCor" INTEGER NOT NULL,
"contadorRetiradaPB" INTEGER NOT NULL,
"contadorRetiradaCor" INTEGER NOT NULL,
"localizacao" TEXT NOT NULL,
"modeloId" TEXT NOT NULL,

CONSTRAINT "Impressora_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Relatorio" (
"id" SERIAL NOT NULL,
"impressoraId" INTEGER NOT NULL,
"contadorMes" INTEGER NOT NULL,
"ultimoResultado" INTEGER NOT NULL,
"ultimaAtualizacao" TIMESTAMP(3) NOT NULL,

CONSTRAINT "Relatorio_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE UNIQUE INDEX "padroes_marca_modelo_key" ON "padroes"("marca", "modelo");

-- CreateIndex
CREATE UNIQUE INDEX "Impressora_numSerie_key" ON "Impressora"("numSerie");

-- CreateIndex
CREATE UNIQUE INDEX "Relatorio_impressoraId_key" ON "Relatorio"("impressoraId");

-- AddForeignKey
ALTER TABLE "Relatorio" ADD CONSTRAINT "Relatorio_impressoraId_fkey" FOREIGN KEY ("impressoraId") REFERENCES "Impressora"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
46 changes: 30 additions & 16 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,34 @@ model Padrao {
}

model Impressora {
id Int @id @default(autoincrement())
numContrato String
numSerie String @unique
enderecoIp String
estaNaRede Boolean
dataInstalacao DateTime
dataRetirada DateTime?
ativo Boolean
contadorInstalacaoPB Int
contadorInstalacaoCor Int
contadorAtualPB Int
contadorAtualCor Int
contadorRetiradaPB Int
contadorRetiradaCor Int
localizacao String
modeloId String
id Int @id @default(autoincrement())
numContrato String
numSerie String @unique
enderecoIp String
estaNaRede Boolean
dataInstalacao DateTime
dataRetirada DateTime?
ativo Boolean
contadorInstalacaoPB Int
contadorInstalacaoCor Int
contadorAtualPB Int
contadorAtualCor Int
contadorRetiradaPB Int
contadorRetiradaCor Int
localizacao String
modeloId String
relatorio Relatorio?
}

model Relatorio {
id Int @id @default(autoincrement())
impressora Impressora @relation(fields: [impressoraId], references: [id])
impressoraId Int @unique
contadorPB Int
contadorPBDiff Int
contadorCor Int
contadorCorDiff Int
ultimoResultado Int
resultadoAtual Int
ultimaAtualizacao DateTime
}
32 changes: 27 additions & 5 deletions src/controllers/Impressora.controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { Request, Response } from 'express';
import { Impressora } from '../types/Impressora.type'
import { createImpressora, findImpressora, findImpressoraByNumSerie,listImpressoras, deleteImpressora, updateImpressora } from '../repository/Impressora.repository'
import { createImpressora, findImpressora, findImpressoraByNumSerie, listImpressoras, deleteImpressora, updateImpressora, listImpressorasRelatorio } from '../repository/Impressora.repository'
import { createImpressoraValidator as createValidator, updateImpressoraValidator as updateValidator } from './validator/Impressora.validator';

export default {
Expand Down Expand Up @@ -58,15 +57,38 @@ export default {
});
}
},


async listImpressorasReports(request: Request, response: Response) {
try {
let result = await listImpressorasRelatorio();
if (!result) {
return response.status(500).json({
message: 'Erro: Não foi possível listar impressoras.',
});
}

return response.status(200).json({
message: 'Sucesso: Impressoras listadas com sucesso!',
data: result
});

} catch (error) {
return response.status(500).json({
error: true,
message: 'Erro: Ocorreu um erro ao listar as impressoras.'
});
}
},


async updateImpressora(request: Request, response: Response) {
const { error, value } = updateValidator.validate(request.body);
if (error) {
return response.status(400).json({ error: error.details });
}

const { id } = request.params;

try {
const idNumber = parseInt(id, 10);
if (isNaN(idNumber)) {
Expand Down
96 changes: 96 additions & 0 deletions src/controllers/Report.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import { Request, Response } from 'express';
import { listImpressorasRelatorio, findImpressoraWithReport } from '../repository/Impressora.repository'
import { generateReport, generateMonthReport, createPdf } from '../usecases/report/generate.report'
import { Impressora } from '../types/Impressora.type'
import fs from 'fs';
import { updateReport } from '../usecases/report/update.report';

export default {

async listImpressorasReports(request: Request, response: Response) {
try {
let result = await listImpressorasRelatorio();
if (!result) {
return response.status(500).json({
message: 'Erro: Não foi possível listar impressoras.',
});
}

return response.status(200).json({
message: 'Sucesso: Impressoras listadas com sucesso!',
data: result
});

} catch (error) {
return response.status(500).json({
error: true,
message: 'Erro: Ocorreu um erro ao listar as impressoras.'
});
}
},

async retrieveReport(request: Request, response: Response) {
try {
const numberID = parseInt(request.params.id as string)
const result: Impressora | false = await findImpressoraWithReport(numberID);
if (!result) {
return response.status(404).json({ error: "Relatório não encontrado" });
}

const filePath: string | false = await createPdf(generateReport(result));
if (!filePath) {
return response.status(500).json({ error: "Erro ao gerar o relatório" });
}

return sendFile(response, filePath, result.numSerie);
}
catch (error) {
return response.status(500).send();
}
},

async retrieveMonthReport(request: Request, response: Response): Promise<Response> {
try {
const numberID = parseInt(request.params.id as string)
const result: Impressora | false = await findImpressoraWithReport(numberID);
if (!result) {
return response.status(404).json({ error: "Relatório não encontrado" });
}

const filePath: string | false = await createPdf(generateMonthReport(result));
if (!filePath) {
return response.status(500).json({ error: "Erro ao gerar o relatório" });
}

return sendFile(response, filePath, result.numSerie);
}
catch (error) {
console.error('Erro ao processar a requisição:', error);
return response.status(500).send();
}
},



};

const sendFile = (response: Response, filePath: string, numSerie: string): Promise<Response> => {
return new Promise<Response>((resolve, reject) => {
response.download(filePath, `relatorio_${numSerie}.pdf`, (err) => {
if (err) {
console.error('Erro ao enviar o arquivo:', err);
reject(response.status(500).json({ error: "Erro ao enviar o relatório" }));
} else {
fs.unlink(filePath, (unlinkErr: any) => {
if (unlinkErr) {
console.error('Erro ao deletar o arquivo:', unlinkErr);
} else {
console.log('Arquivo deletado com sucesso:', filePath);
}
});
resolve(response);
}
});
});
}

Loading

0 comments on commit 93240c5

Please sign in to comment.