Merge branch 'feature/Reporte_Relacion_Facturas_Alen'

feature/Agregar_Multiples_Rectificaciones_Al_Mismo_Trafico_20240109
Felix Morales 9 months ago
commit 30203afc87
  1. 134
      src/Components/Clientes/Traficos/TraficoCliente.tsx
  2. 118
      src/Components/Corresponsales/Contenedores/FacturasContenedor.tsx
  3. 39
      src/Components/Corresponsales/Contenedores/SelectContainer.tsx
  4. 53
      src/Components/Corresponsales/ProveedorFactura/ControlledInput/ControlledInput.tsx
  5. 143
      src/Components/Corresponsales/ProveedorFactura/ProveedorFactura.tsx
  6. 117
      src/Components/Corresponsales/TraficoCorresponsales.tsx
  7. 8
      src/Components/Reportes/RptCorresponsalesTraficos.tsx
  8. 64
      src/Components/ReportesClientes/Alen/RelacionFacturas.tsx
  9. 6
      src/Interfaces/Corresponsales/ICorresponsalFacturas.ts
  10. 3
      src/Services/Corresponsalias/Corresponsales.Facturas.Services.ts
  11. 3
      src/Services/Corresponsalias/Corresponsales.Trafico.Services.ts
  12. 10
      src/Services/Reportes/ReportesAlen.Service.ts
  13. 4
      src/index.tsx
  14. 18
      src/store/features/Corresponsales/CorresponsalesFacturasSlice.ts

@ -1151,7 +1151,6 @@ export default function TraficoCliente(props:IProps){
comentarios: arrStatus[0].estatus
}
await saveFinalStep(data).then(async (r) => {
if(Proceso === 2) await generateFacturacionTxt();
});
}else{
let data: ICorresponsalesTraficoContabilidad = {
@ -1218,123 +1217,6 @@ export default function TraficoCliente(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 () => {
let Gcs = fileReader.result?.toString().split("\r\n")
let facturas: Array<Array<string>> = []
Gcs?.forEach(Gc => {
facturas.push(Gc.split("|"))
})
console.log(facturas)
if(hiddenFileInputRef.current !== null ) hiddenFileInputRef.current.value = "";
patchForm(facturas[0])
await saveTxtContenedores(facturas)
await saveFacturasTxt(facturas)
setTimeout(()=> {dispatch(addTxtContenedores(txtContenedores));dispatch(addTxtFacturas(txtFacturas))}, 2000)
};
fileReader.onerror = () => {}
};
const patchForm = (factura: string[]) => {
setPedimento(+factura[6]);
setFechaPago(setDate(factura[7]));
setClavePedimento(factura[8])
setTipoCambio(+factura[15])
setCantidadFracciones(+factura[21])
setDescripcionMercancia(factura[14])
setObservaciones(factura[48])
}
const saveTxtContenedores = async (facturas: string[][]) => {
facturas.forEach(async (factura) => {
await CContDataService.Append(
{id: 0, contenedor: factura[32], idTrafico: IDTrafico , fSemaforo: factura[22], semaforo: factura[45] === 'VERDE' ? 2 : 1,}
)
.then((response) => {
if (response.status === 200) {
txtContenedores.push(response.data)
}
})
.catch((e: Error) => {
return
})
})
}
const saveFacturasTxt = async(facturas: string[][]) => {
facturas.forEach(async (factura) => {
let proveedor = mCProveedores.filter(x => x.nombre === factura[10])[0]
await CFacDataService.Append({
id: 0,
factura: factura[13],
idTrafico: IDTrafico,
valorFacturaDls: +factura[16],
proveedor: proveedor.id,
corresponsal: IDCorresponsal,
pedido: factura[29],
code: 0,
folioGEMCO: ''
}).then((response) => {
if (response.status === 200) {
txtFacturas.push(response.data)
}
})
.catch((e: Error) => {
return
})
});
}
const generateFacturacionTxt = async () => {
let cliente = Clientes?.filter(x => x.sClave === IDCliente)[0];
let tipoMercancia = TiposMercancia.filter(x => x.id === IDTipoMercancia)[0];
let facturas = mCFacturas.filter(factura => factura.id > 0);
let nombreProveedor = "";
let descripcionMercancia = DescripcionMercancia!.replace(/(\r\n|\n|\r)/gm, "");
//
let fileData = `"${FolioTrafico}"|${ClaveClienteFacturacion === IDCliente || ClaveClienteFacturacion === 0? IDCliente : ClaveClienteFacturacion}|${Patente}|${Pedimento}|${TipoCambio}|${FechaPago}|0|0|0|0|0|0|0.00|"${Aduana}"|"${ClavePedimento}"|${TipoOperacion}|`;
//
fileData += `"C"|${ValorFacturasDls}|${ValorFacturasDls! * TipoCambio!}|${ValorAduanaMN}|"${descripcionMercancia}"|${Kilos}|${Kilos! * 2.20462}|${CantidadFracciones}|"${SemafoFiscal === 0 ? "R" : "V"}"|`;
//
if(facturas.length > 0){
nombreProveedor = mCProveedores.filter(p => p.id === facturas[0].proveedor)[0].nombre;
fileData += `${facturas.length}|"${facturas.map(factura => {return factura.factura}).join(",").substring(0, 25)}"|0|"${nombreProveedor}"|"${concatFacturasPedidos(facturas)}"|`;
}else
fileData += `0|""|0|""|""|`;
//
fileData += `${Bultos}|${0}|${0}|${moment(FechaDesaduanamiento).format('MM/DD/YYYY')}|${mCContenedores.length-1}|0|""|${moment(FechaDesaduanamiento).format('MM/DD/YYYY')}|${tipoMercancia?.clave ? tipoMercancia?.clave : '""'}|0|0|""|""|""|""|/ /|F|F|F|F|0|0|F|0.00|F|0|""|""|`;
//
fileData += `${FechaPagoH !== "" ? FechaPagoH : FechaPago}|""|""|0|"${ClaveClienteFacturacion === IDCliente || ClaveClienteFacturacion === 0? cliente!.sRazonSocial.split('|')[0].trim() : NombreClienteFacturacion}"|${ClaveClienteFacturacion === IDCliente || ClaveClienteFacturacion === 0? cliente!.sRFC : RfcClienteFacturacion}|""|""|""|""|""|""|""|"${nombreProveedor}"|`;
//
fileData += `0|""|""|""|""|""|""|""|""|${ValorFacturasDls}|""|""|336|""|/ / : :|${moment().format("MM/DD/YYYY hh:mm:ss")}|${moment().format("MM/DD/YYYY hh:mm:ss")}|`;
//
fileData += `0|""|""|""|0|0|0|F|""|0|""|""|0|0|0|0|""|"${CentroCostos}"`;
//const blob = new Blob([fileData], { type: "text/plain" });
const file = new File([fileData], `${FolioTrafico}_${Date.now()}.txt`, {type: "text/plain"});
let formData = new FormData();
formData.append('file', file);
await axios.post(
URL.get() +
`/FileManager/AppendFileByProcess?IdUsuario=${UserId}&Proceso=${31}&Tags=${IDTrafico}&crud=1`,
formData, {
headers:{
'Authorization': 'Bearer ' + token
}
}
);
/*const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.download = `${FolioTrafico}_${Date.now()}.txt`;
link.href = url;
link.click();*/
}
const concatFacturasPedidos = (facturas: ICorresponsalFacturas[]) => {
let pedidos = "";
facturas.forEach((factura, index) => {
@ -1743,22 +1625,6 @@ export default function TraficoCliente(props:IProps){
<Col sm={11} md={11} lg={11}
style={{ visibility: Proceso < 2 ? 'visible' : 'hidden', textAlign: 'end'}}
>
{IDTrafico > 0 && IDCliente === 1896? (
<>
<Form.Control type="file" style={{display:'none'}} onChange={readFile} ref={hiddenFileInputRef}/>
<Button
id="BtnLoadTxt"
variant="success"
size="sm"
style={{ paddingLeft: '20px', paddingRight: '20px' }}
onClick={() => hiddenFileInputRef.current?.click()}
>
Cargar TXT
</Button>
</>
) : (
''
)}
</Col>
<Col sm={1} md={1} lg={1}
style={{ visibility: Proceso < 2 ? 'visible' : 'hidden', textAlign: 'end'}}

@ -0,0 +1,118 @@
import { Alert, Col, FormControl, Row, Table } from "react-bootstrap"
import { useDispatch, useSelector } from "react-redux"
import { RootState } from "../../../store/store"
import { useEffect, useState } from "react"
import FormCheckInput from "react-bootstrap/esm/FormCheckInput"
import CorresponsalesFacturasServices from "../../../Services/Corresponsalias/Corresponsales.Facturas.Services"
import ICorresponsalFacturas from "../../../Interfaces/Corresponsales/ICorresponsalFacturas"
import { updateCorresponsalesFacturas } from "../../../store/features/Corresponsales/CorresponsalesFacturasSlice"
import { MsgInformativo } from "../../Utils/Toast/msgInformativo"
interface IProps{
IDTrafico: number
IdContenedor: number
Contenedor: string
}
export const FacturasContenedor: React.FC<IProps> = (props) => {
const mCFacturas = useSelector(
(state: RootState) => state.CFData.CorresponsalesFacturas
)
const dispatch = useDispatch()
const [header, setHeader] = useState('')
const [msg, setMsg] = useState('')
const [show, setShowMsg] = useState(false)
const [msgColor, setMsgColor] = useState('primary')
const AppendContenedor = (e: any) => {
var data = mCFacturas.filter(x => x.id === +e.target.value)[0]
var factura: ICorresponsalFacturas = {
id: data.id,
factura: data.factura,
idTrafico: data.idTrafico,
valorFacturaDls: data.valorFacturaDls,
proveedor: data.proveedor,
pedido: data.pedido,
code: data.code,
folioGEMCO: data.folioGEMCO,
corresponsal: data.corresponsal,
activo: data.activo,
fechaFactura: data.fechaFactura,
uuid: data.uuid,
cove: data.cove,
entrega: data.entrega,
transporte: data.transporte,
idContenedor: e.currentTarget.checked ? props.IdContenedor : 0
}
CorresponsalesFacturasServices.Append(factura)
.then((resp:any) => {
dispatch(updateCorresponsalesFacturas(factura));
setHeader('Informativo')
setMsg('Factura asignada correctamente')
setShowMsg(true)
return
})
.catch(() => {
setHeader('Error')
setMsg('Ocurrio un error: ' + e)
setShowMsg(true)
return
})
}
return (
<>
<Alert variant='primary' style={{height:'100%', overflowY: 'hidden'}}>
<Row>
<Col xs={12}>
<b>Agregar facturas al contenedor {props.Contenedor}</b>
</Col>
</Row>
<div className="table-wrapper" style={{width:'100%', maxHeight:'450px'}}>
<Table
className="table table-earnings table-earnings__challenge"
striped
bordered
hover
>
<thead>
<tr><th></th><th>Factura</th></tr>
</thead>
<tbody>
{mCFacturas
? mCFacturas.map((item, index) => {
return item.idTrafico === props.IDTrafico ? (
<tr>
<td>
<FormCheckInput
onChange={(event:any) => {
AppendContenedor(event)
}}
value={item.id}
disabled = {item.idContenedor !== 0 && item.idContenedor !== props.IdContenedor}
defaultChecked = {item.idContenedor === props.IdContenedor}
/>
</td>
<td>
{item.factura}
</td>
</tr>
) : (
''
)
})
: ''}
</tbody>
</Table>
</div>
</Alert>
<MsgInformativo
show={show}
msg={msg}
header={header}
msgColor={msgColor}
closeToast={() => {
setShowMsg(false)
}}
/>
</>
)
}

@ -15,6 +15,8 @@ import 'react-datepicker/dist/react-datepicker.css'
//Images
import caret from '../../../images/caret.png';
import clean from '../../../images/Clean.png';
import { FaFile } from 'react-icons/fa'
import { FacturasContenedor } from './FacturasContenedor'
interface IProps {
IDTrafico: number
@ -36,6 +38,7 @@ export const SelectContainer: FC<IProps> = (props) => {
const [DialogAddDate, setDialogAddDate] = useState(false)
const [FSemaforo, setFSemaforo] = useState<Date | null>()
const [Semaforo, setSemaforo] = useState(0)
const [ShowFacturasDialog, setShowFacturasDialog] = useState(false)
useEffect(() => {
setPlaceholder('(' + mCContenedores.filter((item) => item.id > 0).length + ') Contenedores')
@ -218,6 +221,11 @@ export const SelectContainer: FC<IProps> = (props) => {
<BsFillXCircleFill />
</IconContext.Provider>
</span>
<span style={{paddingLeft:'3px'}}>
<IconContext.Provider value={{ color: 'green', size: '15px' }}>
<FaFile onClick={() => setShowFacturasDialog(true)}/>
</IconContext.Provider>
</span>
<span style={{ paddingLeft: '10px' }}>{item.contenedor}</span>
<span
onClick={() => {
@ -251,6 +259,7 @@ export const SelectContainer: FC<IProps> = (props) => {
<BsFillCalendarCheckFill />
</IconContext.Provider>
</span>
</span>
</li>
) : (
@ -377,6 +386,36 @@ export const SelectContainer: FC<IProps> = (props) => {
</Row>
</Modal.Body>
</Modal>
<Modal
show={ShowFacturasDialog}
onHide={() => setShowFacturasDialog(false)}
centered
dialogClassName='modal-20w'
>
<Modal.Body
style={{
height: 'calc(70vh)',
}}
>
<div style={{height:'100%'}}>
<FacturasContenedor IdContenedor={IDContenedor} Contenedor={Contenedor} IDTrafico={props.IDTrafico}/>
</div>
</Modal.Body>
<Modal.Footer>
<Row>
<Button
variant='secondary'
onClick={() => {
setShowFacturasDialog(false)
}}
size='sm'
>
Cerrar
</Button>
</Row>
</Modal.Footer>
</Modal>
</div>
)
}

@ -30,6 +30,12 @@ export const ControlledInput: FC<IProps> = (props) => {
const [show, setShowMsg] = useState(false);
const [msg, setMsg] = useState('');
const [ClasificacionProveedor, setClasificacionProveedor] = useState(2);
const [Uuid, setUuid] = useState(props.record.uuid);
const [FechaFactura, setFechaFactura] = useState(props.record.fechaFactura);
const [Cove, setCove] = useState(props.record.cove);
const [Entrega, setEntrega] = useState(props.record.entrega);
const [Transporte, setTransporte] = useState(props.record.transporte);
const [IdContenedor, setIdContenedor] = useState(props.record.idContenedor);
const onChangeFac = (event: any) => {
setValue(event.target.value);
@ -63,6 +69,12 @@ export const ControlledInput: FC<IProps> = (props) => {
pedido: Pedido,
code: 0,
folioGEMCO: '',
uuid: Uuid,
fechaFactura: FechaFactura,
cove: Cove,
entrega: Entrega,
transporte: Transporte,
idContenedor: IdContenedor,
};
CorFacDataService.Append(data)
.then((response) => {
@ -134,6 +146,47 @@ export const ControlledInput: FC<IProps> = (props) => {
})
: null}
</Form.Control>
<input
value={Uuid}
onChange={(e) => setUuid(e.target.value)}
disabled={false}
onKeyDown={(e) => handleKeyDown(e, 2)}
style={{ width: '20%', textAlign: 'right' }}
/>
&nbsp; &nbsp; &nbsp;
<Form.Control
type='date'
id='FechaFactura'
size='sm'
value={FechaFactura}
placeholder='Fecha de la Factura'
onChange={(e) => setFechaFactura(e.target.value)}
/>
&nbsp; &nbsp; &nbsp;
<input
value={Cove}
onChange={(e) => setCove(e.target.value)}
disabled={false}
onKeyDown={(e) => handleKeyDown(e, 2)}
style={{ width: '20%', textAlign: 'right' }}
/>
&nbsp; &nbsp; &nbsp;
<input
value={Entrega}
onChange={(e) => setEntrega(e.target.value)}
disabled={false}
onKeyDown={(e) => handleKeyDown(e, 2)}
style={{ width: '20%', textAlign: 'right' }}
/>
&nbsp; &nbsp; &nbsp;
<input
value={Transporte}
onChange={(e) => setTransporte(e.target.value)}
disabled={false}
onKeyDown={(e) => handleKeyDown(e, 2)}
style={{ width: '20%', textAlign: 'right' }}
/>
&nbsp; &nbsp; &nbsp;
<MsgInformativo
show={show}
msg={msg}

@ -47,7 +47,11 @@ export const ProveedorFactura: FC<IProps> = (props) => {
const MsgTime = 2000;
const msgColor = 'primary';
const ClasificacionProveedor = 2;
const [Uuid, setUuid] = useState<string>('');
const [FechaFactura, setFechaFactura] = useState<string>('');
const [Cove, setCove] = useState<string>('');
const [Entrega, setEntrega] = useState<string>('');
const [Transporte, setTransporte] = useState<string>('');
const TblHeader: React.FC = () => (
<table>
<tr
@ -69,26 +73,98 @@ export const ProveedorFactura: FC<IProps> = (props) => {
<td width='560px' style={{ textAlign: 'center' }}>
Proveedor
</td>
<td width='120px' style={{ textAlign: 'center' }}>
UUID
</td>
<td width='120px' style={{ textAlign: 'center' }}>
Fecha Factura
</td>
<td width='120px' style={{ textAlign: 'center' }}>
COVE
</td>
<td width='120px' style={{ textAlign: 'center' }}>
Entrega
</td>
<td width='120px' style={{ textAlign: 'center' }}>
Transporte
</td>
</tr>
</table>
);
const columnsFacturas = [
{
name: 'id',
width: '10%',
name: 'Id',
width: '65px',
selector: (row: ICorresponsalFacturas) => row.id,
sortable: true,
},
{
name: 'Factura',
width:'150px',
selector: (row: ICorresponsalFacturas) => row.factura,
sortable: true,
},
{
name: 'Valor Dls',
width:'100px',
selector: (row: ICorresponsalFacturas) => '$ ' + row.valorFacturaDls,
sortable: true,
},
{
name: 'Pedido',
width:'130px',
selector: (row: ICorresponsalFacturas) => row.pedido,
sortable: true,
},
{
name: 'Proveedor',
width:'150px',
selector: (row: ICorresponsalFacturas) => mProveedores.filter(x => x.id === row.proveedor)[0].nombre,
sortable: true,
center:true,
wrap: true
},
{
name: 'UUID',
width:'160px',
selector: (row: ICorresponsalFacturas) => row.uuid ? row.uuid : '',
sortable: true,
center:true,
wrap: true
},
{
name: 'Fecha Factura',
width: '125px',
selector: (row: ICorresponsalFacturas) => row.fechaFactura? row.fechaFactura!.substring(0,11) : '',
sortable: true,
},
{
name: 'COVE',
selector: (row: ICorresponsalFacturas) => row.cove ? row.cove : '',
sortable: true,
allowOverflow: true
},
{
name: 'Entrega',
selector: (row: ICorresponsalFacturas) => row.entrega ? row.entrega : '',
sortable: true,
},
{
name: 'Transporte',
selector: (row: ICorresponsalFacturas) => row.transporte ? row.transporte : '',
sortable: true,
},
/* {
name: <TblHeader />,
width: '75%',
cell: (row: ICorresponsalFacturas) => {
return <ControlledInput record={row} disabled={false} mode={2} />;
},
},
}, */
{
name: 'Elimina',
width: '80px',
cell: (row: ICorresponsalFacturas) => (
<div
style={{
@ -113,6 +189,7 @@ export const ProveedorFactura: FC<IProps> = (props) => {
useEffect(() => {
FacDataService.getAll(props.IDTrafico)
.then((response) => {
console.log(response.data);
dispatch(populateCorresponsalesFacturas(response.data));
})
.catch((e: Error) => {
@ -162,6 +239,12 @@ export const ProveedorFactura: FC<IProps> = (props) => {
pedido: Pedido,
code: 0,
folioGEMCO: '',
uuid: Uuid,
fechaFactura: FechaFactura,
cove: Cove,
entrega: Entrega,
transporte: Transporte,
idContenedor: 0,
};
FacDataService.Append(data)
.then((response) => {
@ -337,6 +420,58 @@ export const ProveedorFactura: FC<IProps> = (props) => {
</Col>
<Col>&nbsp;</Col>
</Row>
<Row className='justify-content-end'>
<Col xs={3}>
<Form.Control
type='text'
id='UUID'
size='sm'
value={Uuid}
placeholder='UUID'
onChange={(e) => setUuid(e.target.value)}
/>
</Col>
<Col xs={2}>
<Form.Control
type='date'
id='FechaFactura'
size='sm'
value={FechaFactura}
placeholder='Fecha de la Factura'
onChange={(e) => setFechaFactura(e.target.value)}
/>
</Col>
<Col xs={2}>
<Form.Control
type='text'
id='Cove'
size='sm'
value={Cove}
placeholder='COVE'
onChange={(e) => setCove(e.target.value)}
/>
</Col>
<Col xs={2}>
<Form.Control
type='text'
id='Entrega'
size='sm'
value={Entrega}
placeholder='Entrega'
onChange={(e) => setEntrega(e.target.value)}
/>
</Col>
<Col xs={2}>
<Form.Control
type='text'
id='Transporte'
size='sm'
value={Transporte}
placeholder='Transporte'
onChange={(e) => setTransporte(e.target.value)}
/>
</Col>
</Row>
</Card.Subtitle>
<DataTable
/* noHeader */

@ -40,6 +40,7 @@ import {
addCorresponsalesFacturas,
addTxtFacturas,
InitCorresponsalesFacturas,
populateCorresponsalesFacturas,
} from '../../store/features/Corresponsales/CorresponsalesFacturasSlice'
import {
addCorresponsalesFacturasTerceros,
@ -50,6 +51,7 @@ import {
addTxtContenedores,
CorresponsalesContenedoresSlice,
InitCorresponsalesContenedores,
populateCorresponsalesContenedores,
updateCorresponsalesContenedores
} from '../../store/features/Corresponsales/CorresponsalesContenedoresSlice'
import { populateCorresponsalesAnticipos } from '../../store/features/Corresponsales/CorresponsalesAnticiposSlice'
@ -1286,79 +1288,56 @@ export default function TraficoCorresponsales (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 () => {
let Gcs = fileReader.result?.toString().split("\r\n")
let facturas: Array<Array<string>> = []
Gcs?.forEach(Gc => {
facturas.push(Gc.split("|"))
})
console.log(facturas)
const uploadAlenTxt = (file: File) => {
const formData = new FormData()
formData.append('name', file.name)
formData.append('file', file)
axios.post(
URL.get() + `/FileManager/AppendFileByProcess?IdUsuario=${UserId}&Proceso=${43}&Tags=${IDTrafico}&crud=1`,
formData, {
headers:{
'Authorization': 'Bearer ' + token
}
}
).then((res) => {
if(hiddenFileInputRef.current !== null ) hiddenFileInputRef.current.value = "";
patchForm(facturas[0])
await saveTxtContenedores(facturas)
await saveFacturasTxt(facturas)
setTimeout(()=> {dispatch(addTxtContenedores(txtContenedores));dispatch(addTxtFacturas(txtFacturas))}, 2000)
};
fileReader.onerror = () => {}
};
const patchForm = (factura: string[]) => {
setPedimento(+factura[6]);
setFechaPago(setDate(factura[7]));
setClavePedimento(factura[8])
setTipoCambio(+factura[15])
setCantidadFracciones(+factura[21])
setDescripcionMercancia(factura[14])
setObservaciones(factura[48])
}
const saveTxtContenedores = async (facturas: string[][]) => {
facturas.forEach(async (factura) => {
await CContDataService.Append(
{id: 0, contenedor: factura[32], idTrafico: IDTrafico , fSemaforo: factura[22], semaforo: factura[45] === 'VERDE' ? 2 : 1,}
)
.then((response) => {
if (response.status === 200) {
txtContenedores.push(response.data)
if (res.data.id > 0) {
CTrafDataService.AppendFacturasContenedoresAlen(IDTrafico, res.data.id)
.then(resp => {
setPedimento(resp.data.trafico.pedimento);
setFechaPago(resp.data.trafico.fechaPago);
setClavePedimento(resp.data.trafico.clave)
setTipoCambio(resp.data.trafico.tipoCambio)
setCantidadFracciones(resp.data.trafico.cantidadFracciones)
setDescripcionMercancia(resp.data.trafico.descripcionMercancia)
setObservaciones(resp.data.trafico.observaciones)
dispatch(addTxtContenedores(resp.data.contenedores));
dispatch(addTxtFacturas(resp.data.facturas));
setHeader('Informativo')
setMsg('Layout cargado exitosamente.');
setShowMsg(true)
return
}).catch(() => {
setHeader('Error')
setMsg('Ocurrió un error cargar el layout. Por favor, intentelo de nuevo.')
setShowMsg(true)
return
})
} else {
setHeader('Error')
setMsg('Ocurrió un error cargar el layout. Por favor, intentelo de nuevo.')
setShowMsg(true)
return
}
})
.catch((e: Error) => {
return
})
}).catch((err) => {
if(hiddenFileInputRef.current !== null ) hiddenFileInputRef.current.value = "";
setHeader('Error')
setMsg('Ocurrió un error cargar el layout. Por favor, intentelo de nuevo.')
setShowMsg(true)
return
})
}
const saveFacturasTxt = async(facturas: string[][]) => {
facturas.forEach(async (factura) => {
let proveedor = mCProveedores.filter(x => x.nombre === factura[10])[0]
await CFacDataService.Append({
id: 0,
factura: factura[13],
idTrafico: IDTrafico,
valorFacturaDls: +factura[16],
proveedor: proveedor.id,
corresponsal: IDCorresponsal,
pedido: factura[29],
code: 0,
folioGEMCO: ''
}).then((response) => {
if (response.status === 200) {
txtFacturas.push(response.data)
}
})
.catch((e: Error) => {
return
})
});
}
const generateFacturacionTxt = async () => {
let cliente = Clientes?.filter(x => x.sClave === IDCliente)[0];
let tipoMercancia = TiposMercancia.filter(x => x.id === IDTipoMercancia)[0];
@ -1824,7 +1803,7 @@ export default function TraficoCorresponsales (props:IProps) {
>
{IDTrafico > 0 && IDCliente === 1896? (
<>
<Form.Control type="file" style={{display:'none'}} onChange={readFile} ref={hiddenFileInputRef}/>
<Form.Control type="file" style={{display:'none'}} onChange={(e:any) => {uploadAlenTxt(e.target.files[0]);}} ref={hiddenFileInputRef}/>
<Button
id="BtnLoadTxt"
variant="success"

@ -460,7 +460,13 @@ export default function RptCorresponsalesTraficos(props: IProps) {
corresponsal: model.idCorresponsal,
pedido: element[29],
code: 0,
folioGEMCO: ''
folioGEMCO: '',
uuid: '',
fechaFactura: '',
cove: '',
entrega: '',
transporte: '',
idContenedor: 0,
}).catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error al guardar la factura: ' + element[13])

@ -0,0 +1,64 @@
import { useState } from "react";
import { Button, Card, Col, Form, Row } from "react-bootstrap";
import ReportesAlenService from "../../../Services/Reportes/ReportesAlen.Service";
import { MsgInformativo } from "../../Utils/Toast/msgInformativo";
export const RelacionFacturas: React.FC<{}> = () => {
const [Referencia, setReferencia] = useState('')
const [show, setShowMsg] = useState(false)
const [header, setHeader] = useState('')
const [msg, setMsg] = useState('')
const [msgColor, setMsgColor] = useState('primary')
const GetExcel = () => {
ReportesAlenService.getRelacionFacturas(Referencia)
.then(resp => {
const url = window.URL.createObjectURL(new Blob([resp.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', `RelacionFacturas_${Referencia}.xlsx`);
document.body.appendChild(link);
link.click();
}).catch(e => {
setHeader('Error')
setMsg('Ocurrio un error al generar el reporte. Por favor, intentelo de nuevo.')
setShowMsg(true)
return
})
}
return(
<>
<Row style={{height:'90vh'}} className="align-items-center justify-content-center">
<Col xs={3}>
<Card style={{width:'100%'}}>
<Card.Header><h4>Relación de Facturas</h4></Card.Header>
<Card.Body>
<Row style={{padding:'0px 20px 0px 20px'}} className="align-items-center justify-content-center">
<Form.Control
type="text"
placeholder="Referencia"
onChange={e => setReferencia(e.target.value)}
/>
</Row>
</Card.Body>
<Card.Footer style={{textAlign:'end'}}>
<Button variant="primary" title="Quitar archivo cargado" style={{marginRight:'10px'}} onClick={GetExcel}>
Generar Excel
</Button>
</Card.Footer>
</Card>
</Col>
</Row>
<MsgInformativo
show={show}
msg={msg}
header={header}
msgColor={msgColor}
closeToast={() => {
setShowMsg(false)
}}
/>
</>
)
}

@ -9,4 +9,10 @@ export default interface ICorresponsalFacturas {
activo?: boolean;
code: number;
folioGEMCO: string;
fechaFactura?: string;
uuid?: string;
cove?: string;
entrega?: string;
transporte?: string;
idContenedor?: number;
}

@ -15,5 +15,8 @@ class Corresponsales_Facturas_DataService {
GetExcel(idTrafico: number){
return http.get(`/Corresponsalias/Facturas/GetExcel?idTrafico=${idTrafico}`, {responseType:'blob'})
}
AppendContenedor(idFactura: number, idContenedor: number){
return http.post(`/Corresponsalias/Facturas/AppendContenedor`, {IdFactura: idFactura, IdContenedor: idContenedor})
}
}
export default new Corresponsales_Facturas_DataService();

@ -42,5 +42,8 @@ class Corresponsales_Trafico_DataService {
ValidaTraficoDuplicado(aduana: number | undefined, patente: number | undefined, pedimento:number | undefined, IdTrafico: number | undefined){
return http.get<String>(`Corresponsalias/Traficos/Duplicado?aduana=${aduana}&patente=${patente}&pedimento=${pedimento}&idTrafico=${IdTrafico}`)
}
AppendFacturasContenedoresAlen(idTrafico:number, fileId:number){
return http.post(`/Corresponsalias/Traficos/Append/LayoutAlen?idTrafico=${idTrafico}&fileId=${fileId}`);
}
}
export default new Corresponsales_Trafico_DataService();

@ -0,0 +1,10 @@
import http from '../common/http-common';
class ReportesAlenService{
getRelacionFacturas(referencia: string){
return http.get(`ReportesAlen/RelacionFacturas?referencia=${referencia}`, {responseType: 'blob'});
}
}
export default new ReportesAlenService();

@ -27,6 +27,7 @@ import { ReportesEmbarques } from './Components/ReportesClientes/Embarques/Repor
import { ClientesExternos } from './Components/Clientes/Clientes'
import { ReporteGC50 } from './Components/ReportesClientes/GC50/ReporteGC50'
import RptClientesTraficos from './Components/Clientes/Traficos/RptClientesTraficos'
import { RelacionFacturas } from './Components/ReportesClientes/Alen/RelacionFacturas'
require (`./css/${process.env.REACT_APP_ENVIRONMENT}-home.css`)
function PageNotFound() {
@ -84,6 +85,9 @@ root.render(
<Route path='/Reportes/Newell/Semanal' element={<ReporteSemanalNewell/>}/>
<Route path='/Reportes/Newell/Mensual' element={<ReporteMensualNewell/>}/>
<Route path='/Reportes/GC50' element={<ReporteGC50/>}/>
<Route path='/Reportes/Alen' element={<Outlet/>}>
<Route path='/Reportes/Alen/RelacionFacturas' element={<RelacionFacturas/>}/>
</Route>
</Route>
<Route path="Clientes" element={<Outlet/>}>{/*Aqui van todas las rutas relacionadas a los clientes */}
<Route path='/Clientes/Reportes/' element={<ClientesExternos/>}>{/*Aqui van todas las rutas relacionadas a los reportes de los clientes*/}

@ -10,6 +10,12 @@ const CorresponsalesFacturas: ICorresponsalFacturas[] = [
pedido: '',
code: 0,
folioGEMCO: '',
uuid: '',
fechaFactura: '',
cove: '',
entrega: '',
transporte: '',
idContenedor: 0,
},
];
const initialState = { CorresponsalesFacturas };
@ -32,6 +38,12 @@ export const CorresponsalesFacturasSlice = createSlice({
pedido: '',
code: 0,
folioGEMCO: '',
uuid: '',
fechaFactura: '',
cove: '',
entrega: '',
transporte: '',
idContenedor: 0,
},
];
state.CorresponsalesFacturas.push(...action.payload);
@ -73,6 +85,12 @@ export const CorresponsalesFacturasSlice = createSlice({
pedido: '',
code: 0,
folioGEMCO: '',
uuid: '',
fechaFactura: '',
cove: '',
entrega: '',
transporte: '',
idContenedor: 0,
},
];
},

Loading…
Cancel
Save