|
1 | | -import type { ICreateDenuncia, IFilterListDenuncia, IDenuncia } from "../interfaces/denuncia" |
| 1 | +import type { ICreateDenuncia, IFilterListDenuncia, IDenuncia, IDenunciaExcel } from "../interfaces/denuncia" |
2 | 2 | import { Op } from "sequelize" |
3 | | -import { CategoriaModel, ImagemDenunciaModel, DenunciaModel, GrupoCategoriaModel } from "../models" |
| 3 | +import { CategoriaModel, ImagemDenunciaModel, DenunciaModel, GrupoCategoriaModel, UserModel } from "../models" |
4 | 4 | import { ApiError } from "../errors/ApiError.error" |
5 | 5 | import { HttpCode } from "../enums/HttpCode.enum" |
6 | 6 | import ExcelJS from "exceljs"; |
@@ -190,30 +190,93 @@ function calculatePontuacao(bodyRequest: ICreateDenuncia): number { |
190 | 190 | } |
191 | 191 | export const exportDenunciasExcel = async (): Promise<Buffer> => { |
192 | 192 | const denuncias = await DenunciaModel.findAll({ |
193 | | - include: denunciaFindIncludes |
194 | | - }); |
| 193 | + include: { |
| 194 | + model: UserModel, |
| 195 | + as: 'usuario', |
| 196 | + attributes: ['nome'] |
| 197 | + }, |
| 198 | + attributes: |
| 199 | + ['id', 'titulo', 'dataPublicacao', 'status', 'pontuacao'] |
| 200 | + }) as unknown as any[] |
| 201 | + |
| 202 | + const mapToExcel :IDenunciaExcel[] = denuncias.map(d => { |
| 203 | + return { |
| 204 | + dataPublicacao : d.dataPublicacao, |
| 205 | + id: d.id, |
| 206 | + pontuacao : d.pontuacao, |
| 207 | + status : d.status, |
| 208 | + titulo: d.titulo, |
| 209 | + author: d.usuario?.nome |
| 210 | + } |
| 211 | + }) |
195 | 212 |
|
196 | 213 | const workbook = new ExcelJS.Workbook(); |
197 | 214 | const sheet = workbook.addWorksheet("Denúncias"); |
| 215 | + console.log(mapToExcel) |
198 | 216 |
|
199 | 217 | sheet.columns = [ |
200 | | - { header: "ID", key: "id", width: 10 }, |
201 | | - { header: "Título", key: "titulo", width: 30 }, |
202 | | - { header: "Descrição", key: "descricao", width: 40 }, |
203 | | - { header: "Status", key: "status", width: 15 }, |
204 | | - { header: "Pontuação", key: "pontuacao", width: 12 }, |
205 | | - { header: "Data", key: "dataPublicacao", width: 20 }, |
| 218 | + { header: "ID", key: "id", width: 6 }, |
| 219 | + { header: "Título", key: "titulo", width: 50 }, |
| 220 | + { header: "Autor", key: "autor", width: 50 }, |
| 221 | + { header: "Status", key: "status", width: 12 }, |
| 222 | + { header: "Pontuação", key: "pontuacao", width: 15 }, |
| 223 | + { header: "Data", key: "dataPublicacao", width: 15 }, |
206 | 224 | ]; |
207 | 225 |
|
208 | | - denuncias.forEach((d) => { |
209 | | - sheet.addRow({ |
| 226 | + mapToExcel.forEach((d, idx) => { |
| 227 | + const row = sheet.addRow({ |
210 | 228 | id: d.id, |
211 | 229 | titulo: d.titulo, |
212 | | - descricao: d.descricao, |
| 230 | + autor: d.author, |
213 | 231 | status: d.status, |
214 | 232 | pontuacao: d.pontuacao, |
215 | 233 | dataPublicacao : d.dataPublicacao |
216 | 234 | }); |
| 235 | + const statusCell = sheet.getCell(`D${idx + 2}`); |
| 236 | + switch (d.status) { |
| 237 | + case 'aberto': |
| 238 | + statusCell.fill = { |
| 239 | + type: 'pattern', |
| 240 | + pattern: 'solid', |
| 241 | + fgColor: { argb: 'FFFF0000' } // vermelho |
| 242 | + }; |
| 243 | + statusCell.font = { color: { argb: 'FFFFFFFF' } }; |
| 244 | + break; |
| 245 | + case 'visualizada': |
| 246 | + statusCell.fill = { |
| 247 | + type: 'pattern', |
| 248 | + pattern: 'solid', |
| 249 | + fgColor: { argb: 'FF2196F3' } // azul |
| 250 | + }; |
| 251 | + statusCell.font = { color: { argb: 'FFFFFFFF' } }; |
| 252 | + break; |
| 253 | + case 'analise': |
| 254 | + statusCell.fill = { |
| 255 | + type: 'pattern', |
| 256 | + pattern: 'solid', |
| 257 | + fgColor: { argb: 'FFFFC107' } // amarelo |
| 258 | + }; |
| 259 | + statusCell.font = { color: { argb: 'FF000000' } }; |
| 260 | + break; |
| 261 | + case 'agendado': |
| 262 | + statusCell.fill = { |
| 263 | + type: 'pattern', |
| 264 | + pattern: 'solid', |
| 265 | + fgColor: { argb: 'FF9C27B0' } // roxo |
| 266 | + }; |
| 267 | + statusCell.font = { color: { argb: 'FFFFFFFF' } }; |
| 268 | + break; |
| 269 | + case 'resolvida': |
| 270 | + statusCell.fill = { |
| 271 | + type: 'pattern', |
| 272 | + pattern: 'solid', |
| 273 | + fgColor: { argb: 'FF4CAF50' } // verde |
| 274 | + }; |
| 275 | + statusCell.font = { color: { argb: 'FFFFFFFF' } }; |
| 276 | + break; |
| 277 | + default: |
| 278 | + break; |
| 279 | + } |
217 | 280 | }); |
218 | 281 |
|
219 | 282 | // Gera o arquivo em memória (Buffer | ArrayBuffer) |
|
0 commit comments