crear funcionamiento para actualizar referencias al cargar el layout de casa cuervo

feature/ConsolidarPedimentos_20231229
Felix Morales 1 year ago
parent 52e7ef13de
commit a23b633092
  1. 283
      src/Components/Reportes/RptCorresponsalesTraficos.tsx

@ -1,4 +1,4 @@
import React, { FC, useEffect, useState } from 'react' import React, { FC, useEffect, useRef, useState } from 'react'
import { useParams } from 'react-router-dom' import { useParams } from 'react-router-dom'
import { useDispatch } from 'react-redux' import { useDispatch } from 'react-redux'
import { IconContext } from 'react-icons' import { IconContext } from 'react-icons'
@ -30,10 +30,18 @@ import ICatCorresponsales from '../../Interfaces/Catalogos/ICatCorresponsales'
import ClientesDataService from '../../Services/Catalogos/Clientes.Services' import ClientesDataService from '../../Services/Catalogos/Clientes.Services'
import CorresponsalesDataService from '../../Services/Catalogos/Corresponsales.Services' import CorresponsalesDataService from '../../Services/Catalogos/Corresponsales.Services'
import reportesServices from '../../Services/Reportes/reportes.services' import reportesServices from '../../Services/Reportes/reportes.services'
import CContDataService from '../../Services/Corresponsalias/Corresponsales.Contenedores.Services'
import CTrafDataService from '../../Services/Corresponsalias/Corresponsales.Trafico.Services'
import ProvDataService from '../../Services/Catalogos/Proveedores.Services'
import CFacDataService from '../../Services/Corresponsalias/Corresponsales.Facturas.Services'
import { InitCorresponsalesFacturas } from '../../store/features/Corresponsales/CorresponsalesFacturasSlice' import { InitCorresponsalesFacturas } from '../../store/features/Corresponsales/CorresponsalesFacturasSlice'
import { InitCorresponsalesFacturasTerceros } from '../../store/features/Corresponsales/CorresponsalesFacturasTercerosSlice' import { InitCorresponsalesFacturasTerceros } from '../../store/features/Corresponsales/CorresponsalesFacturasTercerosSlice'
import { InitCorresponsalesContenedores } from '../../store/features/Corresponsales/CorresponsalesContenedoresSlice' import { InitCorresponsalesContenedores, addCorresponsalesContenedores } from '../../store/features/Corresponsales/CorresponsalesContenedoresSlice'
import ICorresponsalContenedores from '../../Interfaces/Corresponsales/ICorresponsalContenedores'
import ICorresponsalFacturas from '../../Interfaces/Corresponsales/ICorresponsalFacturas'
import ICatProveedores from '../../Interfaces/Catalogos/ICatProveedores'
import { FaCrow } from 'react-icons/fa'
/* import '../../css/generic01.css' */ /* import '../../css/generic01.css' */
interface IProps {} interface IProps {}
@ -72,6 +80,7 @@ export default function RptCorresponsalesTraficos(props: IProps) {
const [DataCorresponsales, setDataCorresponsales] = useState< const [DataCorresponsales, setDataCorresponsales] = useState<
ICatCorresponsales[] ICatCorresponsales[]
>([]) >([])
const hiddenFileInputRef = useRef<HTMLInputElement>(null);
const [columnDefs] = useState([ const [columnDefs] = useState([
{ field: 'id', headerName: 'id', width: 70, sortable: true, filter: true }, { field: 'id', headerName: 'id', width: 70, sortable: true, filter: true },
{ {
@ -84,13 +93,13 @@ export default function RptCorresponsalesTraficos(props: IProps) {
cellRenderer: ProgressBar, cellRenderer: ProgressBar,
}, },
{ {
field: 'folio', field: 'folioGemco',
headerName: 'Trafico', headerName: 'Trafico',
width: 140, width: 140,
sortable: true, sortable: true,
filter: true, filter: true,
cellRenderer: (params: any) => { cellRenderer: (params: any) => {
return params.data.folio return params.data.folioGemco
}, },
}, },
{ {
@ -344,12 +353,175 @@ export default function RptCorresponsalesTraficos(props: IProps) {
} }
} }
const readFile = (event: any) => {
const fileUploaded = event.target.files[0];
if(!fileUploaded) return;
const fileReader = new FileReader();
fileReader.readAsText(fileUploaded);
fileReader.onload = async () => {
const validDataArry = await cleanUpFileData(fileReader.result?.toString()!);
let proveedores:ICatProveedores[] = [];
await ProvDataService.getAll(0).then(async (response) => {proveedores = response.data});
validDataArry.forEach(async element => {
const model = filteredData.find(x => x.folioGemco === element[0]);
if(model?.proceso === 1){
model.pedimento = +element[6];
model.clave = element[8];
if(element[7] !== '') model.fechaPago = moment(new Date(element[7])).format("MM/DD/YYYY hh:mm:ss")
model.tipoCambio = +element[15];
model.noCuenta = element[9];
model.semaforoFiscal = +element[23] === 1 ? 1 : 0;
model.descripcionMercancia = element[14];
if(element[22] !== '') model.fechaPago = moment(new Date(element[22])).format("MM/DD/YYYY hh:mm:ss")
await CTrafDataService.Append(model)
.then(async (response) => {
if (response.data.estatusCode === 0) {
}
}).catch((error) => {
setHeader('Error')
setMsg('Ocurrio un error al actualizar la referencia: ' + model.folioGemco)
setShowMsg(true)
return
})
await CContDataService.getAll(model.id)
.then(async (response) => {
if(response.data.length > 0){
let contenedor = response.data.filter(x => x.contenedor === element[32])[0]
if(contenedor){
contenedor.fSemaforo = element[22]
contenedor.semaforo = +element[23] === 1 ? 2 : 1
await saveTxtContenedores(contenedor);
}else{
await saveTxtContenedores({id: 0, contenedor: element[32], idTrafico: model.id , fSemaforo: element[22], semaforo: +element[23] === 1 ? 2 : 1});
}
}else{
await saveTxtContenedores({id: 0, contenedor: element[32], idTrafico: model.id , fSemaforo: element[22], semaforo: +element[23] === 1 ? 2 : 1});
}
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error al guardar el contenedor: ' + element[32])
setShowMsg(true)
return
});
let proveedor = proveedores.filter(x => x.nombre.includes(element[10]))[0]
if(proveedor){
await CFacDataService.getAll(model.id)
.then(async (response) => {
let factura = response.data.filter(f => f.factura === element[13])[0]
if(factura){
factura.valorFacturaDls = +element[16]
factura.pedido = element[29]
factura.proveedor = proveedor.id
await saveFacturasTxt(factura).catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error al actualizar la factura: ' + factura.factura)
setShowMsg(true)
return
})
}else{
await CFacDataService.Append({
id: 0,
factura: element[13],
idTrafico: model.id,
valorFacturaDls: +element[16],
proveedor: proveedor.id,
corresponsal: model.idCorresponsal,
pedido: element[29],
code: 0,
folioGEMCO: ''
}).catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error al guardar la factura: ' + element[13])
setShowMsg(true)
return
})
}
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error: ' + e)
setShowMsg(true)
return
})
}else{
setHeader('Error')
setMsg('No se encontraron uno o más proveedores, favor de verificar los nombres');
setShowMsg(true)
return
}
}
});
if(hiddenFileInputRef.current !== null ) hiddenFileInputRef.current.value = "";
};
fileReader.onerror = () => {}
};
const cleanUpFileData = async (fileData: string) => {
//Se separa el contenido del txt en renglones separandolo cada que encuentra un salto de linea
let dataArray = fileData.split("\r\n")!;
//Se filtran los renglones para dejar solamente los que tienen informacion de referencias
let dataArrayWithoutJunkRows = dataArray.filter(x => x.startsWith("23-"));
//La informacion de cada renglon se separa para poder manejar los datos invidualmente.
let splitedDataArray: string[][] = [];
dataArrayWithoutJunkRows.forEach(row => {
splitedDataArray.push(row.split("\t"));
});
//Se vuelven a filtrar los renglones para quitar los que contengan pedimentos o referencas invalidas que hayan pasado los primeros filtros
let validFormatDataArray = splitedDataArray.filter(x => +x[6] > 2000000 && !x[0].includes(",") && !x[0].includes("|"));
let uniqueReferences: string[][] = [];
let validDataArray = validFormatDataArray.filter( element => {
let isDuplicate = uniqueReferences.filter(x => x[0] === element[0]);
if(isDuplicate.length === 0){
uniqueReferences.push(element);
return true;
}
return false;
});
return validDataArray;
}
const saveTxtContenedores = async (contenedor: ICorresponsalContenedores) => {
await CContDataService.Append(contenedor)
.catch((e: Error) => {
return
})
}
const saveFacturasTxt = async(factura: ICorresponsalFacturas) => {
await CFacDataService.Append(factura)
.catch((e: Error) => {
return
})
}
return ( return (
<div> <div>
<Card> <Card>
<Card.Body> <Card.Body>
<Row> <Row>
<Col xs={2}> <Col xs={8}>
<Row>
<Col xs={6}>
<Form.Control
type='text'
size='sm'
placeholder='Search...'
onChange={(e) => {
filtraReporte(e)
}}
/>
</Col>
<Col xs={3}>
<Form.Control <Form.Control
defaultValue={Inicio} defaultValue={Inicio}
type='date' type='date'
@ -362,7 +534,7 @@ export default function RptCorresponsalesTraficos(props: IProps) {
size='sm' size='sm'
/> />
</Col> </Col>
<Col xs={2}> <Col xs={3}>
<Form.Control <Form.Control
defaultValue={Fin} defaultValue={Fin}
type='date' type='date'
@ -374,10 +546,13 @@ export default function RptCorresponsalesTraficos(props: IProps) {
size='sm' size='sm'
/> />
</Col> </Col>
<Col className='right-label'> </Row>
<Form.Label>Tipo oper</Form.Label>
</Col> </Col>
<Col> </Row>
<Row style={{paddingTop:'10px'}}>
<Col lg={2}>
<Form.Label style={{width:'100%', fontSize:'smaller'}}>
Tipo operacion
<Form.Control <Form.Control
as='select' as='select'
onChange={(e) => setTipoOperacion(parseInt(e.target.value))} onChange={(e) => setTipoOperacion(parseInt(e.target.value))}
@ -387,11 +562,11 @@ export default function RptCorresponsalesTraficos(props: IProps) {
<option value='1'>Importacion</option> <option value='1'>Importacion</option>
<option value='2'>Exportacion</option> <option value='2'>Exportacion</option>
</Form.Control> </Form.Control>
</Form.Label>
</Col> </Col>
<Col className='right-label'> <Col lg={4}>
<Form.Label>Cliente</Form.Label> <Form.Label style={{width:'100%', fontSize:'smaller'}}>
</Col> Cliente
<Col xs={4}>
<Form.Control <Form.Control
as='select' as='select'
onChange={(e) => { onChange={(e) => {
@ -410,22 +585,45 @@ export default function RptCorresponsalesTraficos(props: IProps) {
}) })
: null} : null}
</Form.Control> </Form.Control>
</Form.Label>
</Col> </Col>
<Col className='right-label'> <Col lg={4}>
<Form.Label style={{width:'100%', fontSize:'smaller'}}>
Corresponsal
<Form.Control
as='select'
onChange={(e) => {
setCorresponsal(parseInt(e.target.value))
}}
className='form-select form-select-sm'
>
<option value='0'>-SELECCIONE-</option>
{DataCorresponsales
? DataCorresponsales.map((c) => {
return (
<option value={c.id} key={c.id}>
{c.nombre}
</option>
)
})
: null}
</Form.Control>
</Form.Label>
</Col>
</Row>
<Row style={{paddingTop:'10px'}}>
<Col lg={12} style={{textAlign:'end'}}>
<Button <Button
variant='primary' variant='primary'
size='sm' size='sm'
onClick={() => { onClick={() => {
generaReporte() generaReporte()
}} }}
style={{marginRight:'5px'}}
> >
<BsSearch /> <BsSearch />
Buscar &nbsp; Buscar
</Button> </Button>
</Col>
</Row>
<Row style={{ paddingTop: 5 }}>
<Col>
{(Depto === 'Corresponsalias' || Depto === 'Sistemas') ? ( {(Depto === 'Corresponsalias' || Depto === 'Sistemas') ? (
<Button <Button
size='sm' size='sm'
@ -433,6 +631,7 @@ export default function RptCorresponsalesTraficos(props: IProps) {
onClick={() => { onClick={() => {
AbreTrafico(0) AbreTrafico(0)
}} }}
style={{marginRight:'5px'}}
> >
<BsPlusLg /> <BsPlusLg />
&nbsp; Nuevo &nbsp; Nuevo
@ -440,51 +639,31 @@ export default function RptCorresponsalesTraficos(props: IProps) {
) : ( ) : (
'' ''
)} )}
</Col>
<Col xs={4}>
<Form.Control
type='text'
size='sm'
placeholder='Search...'
onChange={(e) => {
filtraReporte(e)
}}
/>
</Col>
<Col>
<Button <Button
size='sm' size='sm'
variant='success' variant='success'
onClick={() => { onClick={() => {
downloadExcel() downloadExcel()
}} }}
style={{marginRight:'5px'}}
> >
<BsFileEarmarkExcel /> <BsFileEarmarkExcel />
&nbsp; Excel &nbsp; Excel
</Button> </Button>
</Col> { parseInt(proc!.replace('proc=', '')) === 1 && parseInt(modo!.replace('modo=', '')) === 1? <>
<Col>Corresponsal</Col> <Form.Control type="file" style={{display:'none'}} onChange={readFile} ref={hiddenFileInputRef}/>
<Col xs={4}> <Button
<Form.Control id="BtnLoadTxt"
as='select' variant="success"
onChange={(e) => { size="sm"
setCorresponsal(parseInt(e.target.value)) onClick={() => hiddenFileInputRef.current?.click()}
}}
className='form-select form-select-sm'
> >
<option value='0'>-SELECCIONE-</option>
{DataCorresponsales <FaCrow />
? DataCorresponsales.map((c) => { &nbsp; Layout Casa Cuervo
return ( </Button>
<option value={c.id} key={c.id}> </> : ""}
{c.nombre}
</option>
)
})
: null}
</Form.Control>
</Col> </Col>
<Col></Col>
</Row> </Row>
</Card.Body> </Card.Body>
</Card> </Card>

Loading…
Cancel
Save