diff --git a/src/Components/Reportes/ArchivoElectronico/DialogAE.tsx b/src/Components/Reportes/ArchivoElectronico/DialogAE.tsx new file mode 100644 index 0000000..ed1cf83 --- /dev/null +++ b/src/Components/Reportes/ArchivoElectronico/DialogAE.tsx @@ -0,0 +1,195 @@ +import React, { FC, useEffect, useState } from 'react' +// Bootstrap +import { Button, Col, Container, Modal, Row } from 'react-bootstrap' +import { BsCloudDownload } from 'react-icons/bs' +// Interfaces +import IArchivoElectronico from '../../../Interfaces/IArchivoElectronico' +// DTOs +import DTOgetArchivosPorReferencia from '../../../DTO/DTOgetArchivosPorReferencia' +// Redux +import { RootState } from '../../../store/store' +import { useSelector } from 'react-redux' +// Servicios +import AEOServices from '../../../Services/Catalogos/ArchivoElectronico.Services' +import ArchivoElectronicoDataServices from '../../../Services/Catalogos/ArchivoElectronico.Services' +// Otros +import { AgGridReact } from 'ag-grid-react' +import { MsgInformativo } from '../../Utils/Toast/msgInformativo' +import { TargetURL } from '../../../Constants/TargetURL' +import IFileManager from '../../../Interfaces/Utils/IFileManager' +import FileManagerServices from '../../../Services/Utils/FileManager.Services' +import { IconContext } from 'react-icons' +import { FaDownload } from 'react-icons/fa' + +interface IProps { + showDialog: boolean + header: string + closeDialog: (arg: boolean) => void + archivos: IFileManager[] +} + +interface ListaArchivos { + archivo: string +} + +const URL = new TargetURL() + +export const DialogAE: FC = (props) => { + const [curURL, setCurURL] = useState(URL.get()) + const Referencia = useSelector((state: RootState) => state.ArchivoElectronico.Referencia) + const Pedimento = useSelector((state: RootState) => state.ArchivoElectronico.Pedimento) + const NoCliente = useSelector((state: RootState) => state.ArchivoElectronico.NoCliente) + const [filteredData, setFilteredData] = useState([]) + const [columnDefs] = useState([ + { + field: 'nombreArchivo', + cellRender: (params:any) => {return params.data.nombreArchivo}, + width: 430, + headerCheckboxSelection: false, + headerCheckboxSelectionFilteredOnly: false, + checkboxSelection: false, + sortable: true, + filter: true, + },{ + field: 'Descargar', + width: 100, + cellRenderer: (params:any) => { + return ( +
+ + + +
+ ) + //return + }, + } + ]) + const gridRef = React.useRef(null) + const [msgColor, setMsgColor] = React.useState('primary') + const [show, setShowMsg] = useState(false) + const [header, setHeader] = useState('') + const [msg, setMsg] = useState('') + + const viewFileContent = (fileName: string) => { + window.open( + `${curURL}/ArchivoElectronico/getFileContent?Referencia=${Referencia}&PedimentoLargo=dummy&NoCliente=${NoCliente}&IdUsuario=0&Archivo=${fileName}` + ) + } + + useEffect(() => { + setFilteredData(props.archivos) + }, [props.archivos]) + + const getFile = (file: IFileManager) => { + FileManagerServices.getFileContent(parseInt(file.tags), file.proceso).then((resp: any) => { + const url = window.URL.createObjectURL(new Blob([resp.data])) + const link = document.createElement('a') + link.href = url + link.setAttribute('download', file.nombreArchivo) + document.body.appendChild(link) + link.click() + }).catch(() => { + setHeader('Error') + setMsg('Ocurrio un error durante la descarga, favor de intentar nuevamente') + setShowMsg(true) + return + }) + } + + const getFilesByReference = () => { + let selectedNodes = gridRef.current.api.getSelectedNodes() + let selectedData = selectedNodes.map((node: any) => node.data) + const Archivos = selectedData.map((item: ListaArchivos) => item.archivo) + const data: DTOgetArchivosPorReferencia = { + Referencia: Referencia, + PedimentoLargo: Pedimento, + NoCliente: NoCliente, + IdUsuario: 0, + Archivo: 'dummy', + Archivos: Archivos, + } + /* AEOServices.getTheseFilesByReferences(data) + .then((response: any) => { + const url = window.URL.createObjectURL(new Blob([response.data])) + const link = document.createElement('a') + link.href = url + link.setAttribute('download', Referencia + '.zip') + document.body.appendChild(link) + link.click() + }) + .catch((e: Error) => { + setHeader('Error') + setMsg('Ocurrio un error: ' + e) + setShowMsg(true) + return + }) */ + props.closeDialog(false) + } + + return ( +
+ {' '} + { + props.closeDialog(false) + }} + centered + > + + Referencia: {Referencia} + + + {filteredData ? ( +
+ +
+ ) : ( + 'Sin archivos que mostrar' + )} +
+ {/* + + + + + + + + + + + + + */} +
+ setShowMsg(false)} /> +
+ ) +} diff --git a/src/Components/Reportes/customCells/verDocumentos.tsx b/src/Components/Reportes/customCells/verDocumentos.tsx new file mode 100644 index 0000000..6c6d50f --- /dev/null +++ b/src/Components/Reportes/customCells/verDocumentos.tsx @@ -0,0 +1,41 @@ +import React, { FC, useState } from 'react' +import { Button } from 'react-bootstrap' +import { DialogAE } from '../ArchivoElectronico/DialogAE' +import ArchivoElectronicoDataServices from '../../../Services/Catalogos/ArchivoElectronico.Services' +import IFileManager from '../../../Interfaces/Utils/IFileManager'; +import FileManagerServices from '../../../Services/Utils/FileManager.Services'; +interface IProps { + referencia: string; +} + +export const VerDocumentos: FC = (props) => { + const [showDialog, setShowDialog] = useState(false) + const [Archivos, setArchivos] = useState([]); + const showDocumentos = () => { + FileManagerServices.getFileListByreferencia(props.referencia) + .then((response) => { + const filteredFileList = response.data.filter(x=> [2,10,11,12,13,14,15,19,17,18,37,38,39,41].includes(x.proceso)) + setArchivos(filteredFileList) + }) + .catch((e: Error) => { + console.log(e) + return + }) + setShowDialog(true) + } + + const closeDialog = () => { + setShowDialog(false) + } + + return ( +
+ + + + +
+ ) +} diff --git a/src/Components/ReportesClientes/ReporteArchivoElectronico.tsx b/src/Components/ReportesClientes/ReporteArchivoElectronico.tsx new file mode 100644 index 0000000..be97578 --- /dev/null +++ b/src/Components/ReportesClientes/ReporteArchivoElectronico.tsx @@ -0,0 +1,372 @@ +import React, { useEffect, useState } from "react" +import { Button, Card, Col, Form, Modal, Row } from "react-bootstrap" +import IClientes from "../../Interfaces/Catalogos/IClientes" +import IRpArchivoElectronicoOficial from "../../Interfaces/Reportes/IRptArchivoElectronicoOficial" +import { VerDocumentos } from "../Reportes/customCells/verDocumentos" +import { MsgInformativo } from "../Utils/Toast/msgInformativo" +import { AgGridReact } from "ag-grid-react" +import { BsSearch, BsFileEarmarkExcel, BsCloudDownload } from "react-icons/bs" +import { RowClickedEvent } from "ag-grid-community" +import IArchivoElectronico from "../../Interfaces/IArchivoElectronico" +import * as XLSX from 'xlsx' +import DTOAEPeriodo from "../../DTO/DTOAEPeriodo" +import ClientesServices from "../../Services/Catalogos/Clientes.Services" +import reportesServices from "../../Services/Reportes/reportes.services" +import loadingImg from '../../images/ajaxloader.gif' +import ArchivoElectronicoServices from "../../Services/Catalogos/ArchivoElectronico.Services" + +export const ReporteArchivoElectronico:React.FC = () => { + //const dispatch = useDispatch() + const [UserId, setUserId] = useState(() => { + const stickyValue = window.localStorage.getItem('UserId') + return stickyValue !== null ? JSON.parse(stickyValue) : 0 + }) + const [Years, setYears] = useState(generateArrayOfYears()) + const [Months, setMonths] = useState([ + 'Enero', + 'Febrero', + 'Marzo', + 'Abril', + 'Mayo', + 'Junio', + 'Julio', + 'Agosto', + 'Septiembre', + 'Octubre', + 'Noviembre', + 'Diciembre', + ]) + const [Anio, setAnio] = useState(currentDate(1)) + const [Mes, setMes] = useState(currentDate(2)) + const [Clientes, setClientes] = useState>() + const [Data, setData] = useState>([]) + const [filteredData, setFilteredData] = useState>([]) + const [TipoOperacion, setTipoOperacion] = useState(0) + const [Cliente, setCliente] = useState(0) + const [msgColor, setMsgColor] = React.useState('primary') + const [show, setShowMsg] = useState(false) + const [header, setHeader] = useState('') + const [msg, setMsg] = useState('') + const [filtro, setFiltro] = useState('') + const [showDialog, setShowDialog] = useState(false) + const gridRef = React.useRef(null) + const [columnDefs] = useState([ + { + field: 'referencia', + headerCheckboxSelection: true, + headerCheckboxSelectionFilteredOnly: true, + checkboxSelection: true, + sortable: true, + filter: true, + }, + { field: 'ver documentos', sortable: true, cellRenderer: (params: any) => {return } }, + { field: 'aduana', sortable: true, filter: true }, + { field: 'patente', sortable: true, filter: true }, + { field: 'pedimento', sortable: true, filter: true }, + { field: 'fechaPago', sortable: true, filter: true }, + ]) + + const handleClose = () => setShowDialog(false) + + function generateArrayOfYears() { + var max = new Date().getFullYear() + var min = 2020 + var years = [] + for (var i = max; i >= min; i--) { + years.push(i) + } + return years + } + + function currentDate(mode: number): number { + var today = new Date() + var mm = String(today.getMonth() + 1).padStart(2, '0') //January is 0! + var yyyy = today.getFullYear() + return mode === 1 ? yyyy : parseInt(mm) + } + + const generaReporte = () => { + if(Anio === 0){ + setHeader('Error') + setMsg('Especifique el año de búsqueda.') + setShowMsg(true) + return; + } + if(Mes === 0){ + setHeader('Error') + setMsg('Especifique el mes de búsqueda.') + setShowMsg(true) + return; + } + if(Cliente===0 && Clientes!.length > 1){ + setHeader('Error') + setMsg('Seleccione una razón social') + setShowMsg(true) + return; + } + const data: DTOAEPeriodo = { + Anio: Anio, + Mes: Mes, + TipoOperacion: TipoOperacion, + NoCliente: Cliente, + } + console.log(JSON.stringify(data)) + reportesServices + .getRptArchivoElectronicoOficial(data) + .then((response) => { + setData(response.data) + setFilteredData(response.data) + console.log(response.data) + setHeader('Informativo') + setMsg('Se encontro la siguiente informacion...') + setShowMsg(true) + }) + .catch((e: Error) => { + setHeader('Error') + setMsg('Ocurrio un error: ' + e) + setShowMsg(true) + return + }) + } + + const downloadExcel = () => { + exportExcel(Data, 'Reporte archivo electronico oficial') + } + + function exportExcel(jsonData: any[], fileName: string): void { + let Heading = [['Referencia', 'Aduana', 'Patente', 'Pedimento', 'Fecha pago']] + const wb = XLSX.utils.book_new() + const ws: XLSX.WorkSheet = XLSX.utils.json_to_sheet([]) + XLSX.utils.sheet_add_aoa(ws, Heading) + XLSX.utils.sheet_add_json(ws, jsonData, { origin: 'A2', skipHeader: true }) + XLSX.utils.book_append_sheet(wb, ws, 'Sheet1') + XLSX.writeFile(wb, fileName + '.xlsx') + var range = XLSX.utils.decode_range(ws['!ref?']) + for (var C = range.s.c; C <= range.e.c; ++C) { + var address = XLSX.utils.encode_col(C) + '1' // <-- first row, column number C + if (!ws[address]) continue + ws[address].v = ws[address].v.toUpperCase() + } + } + + const filtraReporte = (e: any) => { + setFiltro(e.target.value) + gridRef.current.api.setQuickFilter(e.target.value) + } + + useEffect(() => { + ClientesServices.getAllClientes(parseInt(UserId)) + .then((response) => { + setClientes(response.data) + if(response.data.length === 1) + setCliente(response.data[0].sClave) + }) + .catch((e: Error) => { + console.log(e) + setHeader('Error') + setMsg('Ocurrio un error: ' + e) + setShowMsg(true) + return + }) + }, []) + + /* function getParams(e: RowClickedEvent) { + const data: IArchivoElectronico = { + Referencia: e.data.referencia, + PedimentoLargo: + Anio.toString().substring(2, 2) + + ' ' + + e.data.aduana.toString().substring(0, 2) + + ' ' + + e.data.patente.toString() + + ' ' + + e.data.pedimento.toString(), + NoCliente: Cliente, + IdUsuario: 0, + Archivo: '', + } + console.log('.......................................................' + data) + //dispatch(setArchivoElectronico(data)) + } */ + + const downloadReferences = () => { + setShowDialog(true) + if (Cliente === 0) { + setMsg('Seleccione el cliente') + setHeader('Para poder continuar, favor de: ') + setShowMsg(true) + } + let selectedNodes = gridRef.current.api.getSelectedNodes() + let selectedData = selectedNodes.map((node: any) => node.data) + const Referencias = selectedData.map((item: IRpArchivoElectronicoOficial) => item.referencia) + const data = { + Anio: Anio, + Mes: Mes, + NoCliente: Cliente, + TipoOperacion: TipoOperacion, + Referencias: Referencias, + } + console.log(data) + ArchivoElectronicoServices.getZippedReferences(data) + .then((response: any) => { + const url = window.URL.createObjectURL(response.data) + const link = document.createElement('a') + link.href = url + link.setAttribute('download', 'Archivo Electronico Oficial.zip') + document.body.appendChild(link) + link.click() + setShowDialog(false) + }) + .catch((e: Error) => { + console.log(e) + setHeader('Error') + setMsg('Ocurrio un error: ' + e) + setShowMsg(true) + return + }) + } + + return ( +
+ + +
+
+
+ setAnio(parseInt(e.target.value))} + size='sm' + defaultValue={Anio} + > + {Years.map((x, i) => ( + + ))} + +
+
+ setMes(parseInt(e.target.value))} + size='sm' + defaultValue={Mes} + > + + {Months.map((x, i) => ( + + ))} + +
+
+ Tipo oper +
+
+ setTipoOperacion(parseInt(e.target.value))} + className='form-select form-select-sm' + > + + + + +
+
+ Cliente +
+
+ { + setCliente(parseInt(e.target.value)) + }} + className='form-select form-select-sm' + value={Cliente} + > + + {Clientes + ? Clientes.map((c) => { + return c.agrupado === 1 ? : '' + }) + : null} + +
+ +
+ +
+
+
+
 
+
+ { + filtraReporte(e) + }} + /> +
+
+ +     + +
+
+
+
+
+
+ {/* getParams(e) */}} + > +
+ setShowMsg(false)} /> + + + + + + proccessing + Espere, por favor... + + + +
+ ) +} \ No newline at end of file diff --git a/src/Services/Catalogos/ArchivoElectronico.Services.ts b/src/Services/Catalogos/ArchivoElectronico.Services.ts index b24b781..200a5e3 100644 --- a/src/Services/Catalogos/ArchivoElectronico.Services.ts +++ b/src/Services/Catalogos/ArchivoElectronico.Services.ts @@ -8,7 +8,7 @@ import http from "../common/http-common"; class ArchivoElectronicoDataService { - getFile(data: IArchivoElectronico) { + /* getFile(data: IArchivoElectronico) { return http.get(`/ArchivoElectronico/getFile`, { params: data }) } getFileList(data: IArchivoElectronico) { @@ -55,6 +55,16 @@ class ArchivoElectronicoDataService { .catch(function (error) { console.log(error) }) - } + } */ + getZippedReferences(data : DTOAEPeriodo) { + return http.post("/ArchivoElectronico/DownloadZippedArchivosOficiales", data, {responseType: 'blob'}) + .then(function (response) { + return response + }) + .catch(function (error) { + console.log(error) + }) + } + } export default new ArchivoElectronicoDataService(); \ No newline at end of file diff --git a/src/Services/Utils/FileManager.Services.ts b/src/Services/Utils/FileManager.Services.ts index 3d1061a..d21736a 100644 --- a/src/Services/Utils/FileManager.Services.ts +++ b/src/Services/Utils/FileManager.Services.ts @@ -5,7 +5,7 @@ import IFileManager from "../../Interfaces/Utils/IFileManager"; class FileManagerDataService { getFileContent(id: number, Proceso: number) { - return http.get(`/FileManager/getFile?id=${id}&proceso=${Proceso}`, {responseType: 'arraybuffer'}) + return http.get(`/FileManager/getFile?id=${id}&proceso=${Proceso}`, {responseType: 'arraybuffer'}) .then(function (response) { return response }) @@ -40,6 +40,8 @@ class FileManagerDataService { console.log(error) }) } - + getFileListByreferencia(referencia: string) { + return http.get(`/FileManager/FileListByReferencia?Referencia=${referencia}`) + } } export default new FileManagerDataService(); \ No newline at end of file diff --git a/src/index.tsx b/src/index.tsx index 54a6d0e..a0757a5 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -30,6 +30,7 @@ import RptClientesTraficos from './Components/Clientes/Traficos/RptClientesTrafi import { RelacionFacturas } from './Components/ReportesClientes/Alen/RelacionFacturas' import { ReporteFacturasConsolidados } from './Components/ReportesClientes/Alen/ReporteFacturasConsolidados' import { CuentasCerradas } from './Components/ReportesClientes/CuentasCerradas.tsx/CuentasCerradas' +import { ReporteArchivoElectronico } from './Components/ReportesClientes/ReporteArchivoElectronico' require (`./css/${process.env.REACT_APP_ENVIRONMENT}-home.css`) function PageNotFound() { @@ -92,6 +93,7 @@ root.render( }/> }/> + }/> }>{/*Aqui van todas las rutas relacionadas a los clientes */} }>{/*Aqui van todas las rutas relacionadas a los reportes de los clientes*/}