|
|
|
@ -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 { useDispatch } from 'react-redux' |
|
|
|
|
import { IconContext } from 'react-icons' |
|
|
|
@ -30,10 +30,18 @@ import ICatCorresponsales from '../../Interfaces/Catalogos/ICatCorresponsales' |
|
|
|
|
import ClientesDataService from '../../Services/Catalogos/Clientes.Services' |
|
|
|
|
import CorresponsalesDataService from '../../Services/Catalogos/Corresponsales.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 { 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' */ |
|
|
|
|
|
|
|
|
|
interface IProps {} |
|
|
|
@ -72,6 +80,7 @@ export default function RptCorresponsalesTraficos(props: IProps) { |
|
|
|
|
const [DataCorresponsales, setDataCorresponsales] = useState< |
|
|
|
|
ICatCorresponsales[] |
|
|
|
|
>([]) |
|
|
|
|
const hiddenFileInputRef = useRef<HTMLInputElement>(null); |
|
|
|
|
const [columnDefs] = useState([ |
|
|
|
|
{ field: 'id', headerName: 'id', width: 70, sortable: true, filter: true }, |
|
|
|
|
{ |
|
|
|
@ -84,13 +93,13 @@ export default function RptCorresponsalesTraficos(props: IProps) { |
|
|
|
|
cellRenderer: ProgressBar, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
field: 'folio', |
|
|
|
|
field: 'folioGemco', |
|
|
|
|
headerName: 'Trafico', |
|
|
|
|
width: 140, |
|
|
|
|
sortable: true, |
|
|
|
|
filter: true, |
|
|
|
|
cellRenderer: (params: any) => { |
|
|
|
|
return params.data.folio |
|
|
|
|
return params.data.folioGemco |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
@ -344,88 +353,277 @@ 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 ( |
|
|
|
|
<div> |
|
|
|
|
<Card> |
|
|
|
|
<Card.Body> |
|
|
|
|
<Row> |
|
|
|
|
<Col xs={2}> |
|
|
|
|
<Form.Control |
|
|
|
|
defaultValue={Inicio} |
|
|
|
|
type='date' |
|
|
|
|
name='Inicio' |
|
|
|
|
placeholder='Inicio' |
|
|
|
|
title='Inicio' |
|
|
|
|
alt='Inicio' |
|
|
|
|
data-date-format='YYYY-mm-dd' |
|
|
|
|
onChange={(e) => setInicio(e.target.value)} |
|
|
|
|
size='sm' |
|
|
|
|
/> |
|
|
|
|
</Col> |
|
|
|
|
<Col xs={2}> |
|
|
|
|
<Form.Control |
|
|
|
|
defaultValue={Fin} |
|
|
|
|
type='date' |
|
|
|
|
name='Fin' |
|
|
|
|
placeholder='Fin' |
|
|
|
|
title='Fin' |
|
|
|
|
alt='Fin' |
|
|
|
|
onChange={(e) => setFin(e.target.value)} |
|
|
|
|
size='sm' |
|
|
|
|
/> |
|
|
|
|
</Col> |
|
|
|
|
<Col className='right-label'> |
|
|
|
|
<Form.Label>Tipo oper</Form.Label> |
|
|
|
|
<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 |
|
|
|
|
defaultValue={Inicio} |
|
|
|
|
type='date' |
|
|
|
|
name='Inicio' |
|
|
|
|
placeholder='Inicio' |
|
|
|
|
title='Inicio' |
|
|
|
|
alt='Inicio' |
|
|
|
|
data-date-format='YYYY-mm-dd' |
|
|
|
|
onChange={(e) => setInicio(e.target.value)} |
|
|
|
|
size='sm' |
|
|
|
|
/> |
|
|
|
|
</Col> |
|
|
|
|
<Col xs={3}> |
|
|
|
|
<Form.Control |
|
|
|
|
defaultValue={Fin} |
|
|
|
|
type='date' |
|
|
|
|
name='Fin' |
|
|
|
|
placeholder='Fin' |
|
|
|
|
title='Fin' |
|
|
|
|
alt='Fin' |
|
|
|
|
onChange={(e) => setFin(e.target.value)} |
|
|
|
|
size='sm' |
|
|
|
|
/> |
|
|
|
|
</Col> |
|
|
|
|
</Row> |
|
|
|
|
</Col> |
|
|
|
|
<Col> |
|
|
|
|
<Form.Control |
|
|
|
|
as='select' |
|
|
|
|
onChange={(e) => setTipoOperacion(parseInt(e.target.value))} |
|
|
|
|
className='form-select form-select-sm' |
|
|
|
|
> |
|
|
|
|
<option value='0'>-SELECCIONE-</option> |
|
|
|
|
<option value='1'>Importacion</option> |
|
|
|
|
<option value='2'>Exportacion</option> |
|
|
|
|
</Form.Control> |
|
|
|
|
</Row> |
|
|
|
|
<Row style={{paddingTop:'10px'}}> |
|
|
|
|
<Col lg={2}> |
|
|
|
|
<Form.Label style={{width:'100%', fontSize:'smaller'}}> |
|
|
|
|
Tipo operacion |
|
|
|
|
<Form.Control |
|
|
|
|
as='select' |
|
|
|
|
onChange={(e) => setTipoOperacion(parseInt(e.target.value))} |
|
|
|
|
className='form-select form-select-sm' |
|
|
|
|
> |
|
|
|
|
<option value='0'>-SELECCIONE-</option> |
|
|
|
|
<option value='1'>Importacion</option> |
|
|
|
|
<option value='2'>Exportacion</option> |
|
|
|
|
</Form.Control> |
|
|
|
|
</Form.Label> |
|
|
|
|
</Col> |
|
|
|
|
<Col className='right-label'> |
|
|
|
|
<Form.Label>Cliente</Form.Label> |
|
|
|
|
<Col lg={4}> |
|
|
|
|
<Form.Label style={{width:'100%', fontSize:'smaller'}}> |
|
|
|
|
Cliente |
|
|
|
|
<Form.Control |
|
|
|
|
as='select' |
|
|
|
|
onChange={(e) => { |
|
|
|
|
setCliente(parseInt(e.target.value)) |
|
|
|
|
}} |
|
|
|
|
className='form-select form-select-sm' |
|
|
|
|
> |
|
|
|
|
<option value='0'>-SELECCIONE-</option> |
|
|
|
|
{Clientes |
|
|
|
|
? Clientes.map((c) => { |
|
|
|
|
return ( |
|
|
|
|
<option value={c.sClave} key={c.sClave}> |
|
|
|
|
{c.sRazonSocial} |
|
|
|
|
</option> |
|
|
|
|
) |
|
|
|
|
}) |
|
|
|
|
: null} |
|
|
|
|
</Form.Control> |
|
|
|
|
</Form.Label> |
|
|
|
|
</Col> |
|
|
|
|
<Col xs={4}> |
|
|
|
|
<Form.Control |
|
|
|
|
as='select' |
|
|
|
|
onChange={(e) => { |
|
|
|
|
setCliente(parseInt(e.target.value)) |
|
|
|
|
}} |
|
|
|
|
className='form-select form-select-sm' |
|
|
|
|
> |
|
|
|
|
<option value='0'>-SELECCIONE-</option> |
|
|
|
|
{Clientes |
|
|
|
|
? Clientes.map((c) => { |
|
|
|
|
return ( |
|
|
|
|
<option value={c.sClave} key={c.sClave}> |
|
|
|
|
{c.sRazonSocial} |
|
|
|
|
</option> |
|
|
|
|
) |
|
|
|
|
}) |
|
|
|
|
: null} |
|
|
|
|
</Form.Control> |
|
|
|
|
<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> |
|
|
|
|
<Col className='right-label'> |
|
|
|
|
</Row> |
|
|
|
|
<Row style={{paddingTop:'10px'}}> |
|
|
|
|
<Col lg={12} style={{textAlign:'end'}}> |
|
|
|
|
<Button |
|
|
|
|
variant='primary' |
|
|
|
|
size='sm' |
|
|
|
|
onClick={() => { |
|
|
|
|
generaReporte() |
|
|
|
|
}} |
|
|
|
|
style={{marginRight:'5px'}} |
|
|
|
|
> |
|
|
|
|
<BsSearch /> |
|
|
|
|
Buscar |
|
|
|
|
Buscar |
|
|
|
|
</Button> |
|
|
|
|
</Col> |
|
|
|
|
</Row> |
|
|
|
|
<Row style={{ paddingTop: 5 }}> |
|
|
|
|
<Col> |
|
|
|
|
{(Depto === 'Corresponsalias' || Depto === 'Sistemas') ? ( |
|
|
|
|
<Button |
|
|
|
|
size='sm' |
|
|
|
@ -433,6 +631,7 @@ export default function RptCorresponsalesTraficos(props: IProps) { |
|
|
|
|
onClick={() => { |
|
|
|
|
AbreTrafico(0) |
|
|
|
|
}} |
|
|
|
|
style={{marginRight:'5px'}} |
|
|
|
|
> |
|
|
|
|
<BsPlusLg /> |
|
|
|
|
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 |
|
|
|
|
size='sm' |
|
|
|
|
variant='success' |
|
|
|
|
onClick={() => { |
|
|
|
|
downloadExcel() |
|
|
|
|
}} |
|
|
|
|
style={{marginRight:'5px'}} |
|
|
|
|
> |
|
|
|
|
<BsFileEarmarkExcel /> |
|
|
|
|
Excel |
|
|
|
|
</Button> |
|
|
|
|
{ parseInt(proc!.replace('proc=', '')) === 1 && parseInt(modo!.replace('modo=', '')) === 1? <> |
|
|
|
|
<Form.Control type="file" style={{display:'none'}} onChange={readFile} ref={hiddenFileInputRef}/> |
|
|
|
|
<Button |
|
|
|
|
id="BtnLoadTxt" |
|
|
|
|
variant="success" |
|
|
|
|
size="sm" |
|
|
|
|
onClick={() => hiddenFileInputRef.current?.click()} |
|
|
|
|
> |
|
|
|
|
|
|
|
|
|
<FaCrow /> |
|
|
|
|
Layout Casa Cuervo |
|
|
|
|
</Button> |
|
|
|
|
</> : ""} |
|
|
|
|
</Col> |
|
|
|
|
<Col>Corresponsal</Col> |
|
|
|
|
<Col xs={4}> |
|
|
|
|
<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> |
|
|
|
|
</Col> |
|
|
|
|
<Col></Col> |
|
|
|
|
</Row> |
|
|
|
|
</Card.Body> |
|
|
|
|
</Card> |
|
|
|
|