Compare commits

...

51 Commits

Author SHA1 Message Date
Luis Rendon d82e95da4c Se agrega en la interfazy el componente RptOperacionesPagadasMissionFood el atributo Edocument. 5 months ago
Luis Rendon 68b3f9f965 Merge branch 'RptConsolidadosSinPagar' 8 months ago
Luis Rendon 355715c445 Se elimno el campo NumeroFactura En Dto20296RptFacturaspGadas y RptAmazonFacturasPagadas 8 months ago
Luis Rendon 693fcb91af se agregaron 2 campos en el DTO2096RptFacturasPagadas y en RptAmazonFacturasPagadas se agregaron esos campos en la tablay los iconos de buscar y exel. 8 months ago
alfonso a138fc80e0 + filter RptPendingAnswerFromAmazon to only show XML download file after all items were checked by user 8 months ago
alfonso 00184d2400 - GEMCO.bak file that was not necesary to be here 8 months ago
Luis Rendon 52ba9c13d4 Merge branch 'RptConsolidadosSinPagar' 8 months ago
Luis Rendon 195449562c se agrego un nuevo reportes de Consolidados sin firma banco en Gemco/Operaciones. 8 months ago
Luis Rendon 6fa3bba918 Merge branch 'RptwebMission' 9 months ago
Luis Rendon 014ab65baa Agrege el nuevo reporte de arcosa mensual que estuve trabjando enFronted 9 months ago
Luis Rendon a8d886b0bb Merge branch 'main' of https://git.gemcousa.mx/alfonso/GEMCOFrontend 9 months ago
alfonso 5c3df3c235 + Exception code selection option on the clasification items invoice 9 months ago
Luis Rendon 13ff7cefae Agrege los cambios pertinetes para el marge de main conmi rama 9 months ago
Luis Rendon 51d8174f67 Agrege los cambios del main a mi rama RptwebMission en fronted 9 months ago
alfonso a89472eb7d Added Catalogo de conceptos para consultar a Amazon 10 months ago
Luis Rendon 63d2a9162a se agregaron los cambios y los nuevos archivos de los reportes OperacionesPagadasMissionFood y Facturas en Pedimentos en fronted 10 months ago
Luis Rendon fa9572566b se agrego el nombre del reporte OperacionesPagadasMisisonFood en fronted 10 months ago
Luis Rendon aca4ec4eb0 Se subieron archivos RptMission 10 months ago
alfonso 4168ed846e Escondi en el dashboard los indicadores de corresponsalias y de contaduria 11 months ago
Luis Rendon 47518d9c37 Merge branch 'main' of https://git.gemcousa.mx/alfonso/GEMCOFrontend 11 months ago
Luis Rendon 40425cfee2 se edito el componente RpTSegregacion para incrustar una tabla con los datos ademas de descargar. 11 months ago
alfonso cb5c418ae7 + version minor increment 11 months ago
alfonso 1447e68770 v3.2.0 11 months ago
Luis Rendon 1e886a44d8 se corrigio el codigo y se elimino una peticion inecesaria 11 months ago
Luis Rendon 1cb60eb089 se actualizo el nombre del reporte a Estatus Facturas Recibidas. 11 months ago
Luis Rendon 9829fe1e54 se actualizo la parte visual del componente AmazonInvoiceStatus. 11 months ago
Luis Rendon d986f06084 Se actualio el componente Estatus fatura para agregar Inicio y fin y boton exel 11 months ago
Luis Rendon 0b097671b7 Se Agrego la validacion de referencia vacia. 1 year ago
Luis Rendon de12c0bdc5 Se corregio una falta de ortografia en el comboBox de registrer 1 year ago
Luis Rendon d343097935 Merge branch 'featureDepto4User' 1 year ago
Luis Rendon a3ef6f13ce se agrego en el combo box una nueva opcion 0 = no Asiganado 1 year ago
Luis Rendon 69248a51f5 Merge branch 'featureDepto4User' 1 year ago
Luis Rendon 81b705feb5 Se modifico register Userlist y IRegister para agregar departamento al formulario 1 year ago
Luis Rendon ad3dcc96b7 Merge branch 'newRptFraccionesNicosReferenciaFront' 1 year ago
Luis Rendon be6b7dab03 Se agregaron las validaciones para la fraccion y el usuario 1 year ago
alfonso b2ff145834 Merge branch 'featureBotClasifcacion' 1 year ago
Luis Rendon 9deec2a789 Merge branch 'FraccionesVulneFronted' 1 year ago
Luis Rendon 3fbb48f5e2 Merge branch 'main' of https://git.gemcousa.mx/alfonso/GEMCOFrontend 1 year ago
Luis Rendon 5f5dbae7a2 Se agrego los archivos correspodientes para el nuevo componente FacturasFraccion 1 year ago
alfonso 118cce6dd3 v3.1.0 1 year ago
alfonso 3f590ac953 Added version number that will be showned on login form 1 year ago
alfonso 9a45e404ac Added delete feature to NoPartes Catalog 1 year ago
alfonso c9a9433790 v3.0.0 1 year ago
alfonso e139722720 v2.0.0 1 year ago
alfonso 8f4bcf1df9 Fixed form: AmazonNoPartes Fraccion + subdivision also validated with public web service 1 year ago
alfonso d4a7d92473 Fixed bot mechanism 1 year ago
alfonso dfe741a194 Fixed strange behaviour on opening and closing the Invoice detail on the clasification report from 1 year ago
alfonso 18b1428632 Just added a switch for selectebly actionatin the BOT 1 year ago
alfonso de7a0351d4 Added Clasification BOT 1 year ago
alfonso 6c95eca80d Merge branch 'main' of https://git.gemcousa.mx/alfonso/GEMCOFrontend 1 year ago
alfonso 27d779fdc4 Changed prettier config settings 1 year ago
  1. 3
      .vscode/settings.json
  2. BIN
      GEMCO_20230719.bak
  3. 4
      package.json
  4. 135
      src/Components/Catalogos/CatFraccionesVulnerables/CatFraccionesVulnerables.tsx
  5. 501
      src/Components/Clientes/Amazon/Catalogos/CatConceptosConsulta.tsx
  6. 5
      src/Components/Clientes/Amazon/Components/ComboSelect/ComboDescripcion.tsx
  7. 88
      src/Components/Clientes/Amazon/Components/ComboSelect/ComboFraccion.tsx
  8. 1
      src/Components/Clientes/Amazon/DTO/DTO2096FraccionDescripcion.ts
  9. 7
      src/Components/Clientes/Amazon/DTO/DTO2096InvoiceStatus.ts
  10. 4
      src/Components/Clientes/Amazon/DTO/DTO2096RptFacturasPagadas.ts
  11. 10
      src/Components/Clientes/Amazon/DTO/DTOAmazonSegragacion.ts
  12. 8
      src/Components/Clientes/Amazon/Interfaces/I2096CatConceptosConsulta.ts
  13. 1
      src/Components/Clientes/Amazon/Interfaces/I2096Detail.ts
  14. 198
      src/Components/Clientes/Amazon/Reportes/AmazonNoPartes.tsx
  15. 15
      src/Components/Clientes/Amazon/Reportes/Clasification/Finished/RptAmazonFinishedClasificationInvoices.tsx
  16. 124
      src/Components/Clientes/Amazon/Reportes/Clasification/Pending/RptAmazonPendingClasificationInvoices.tsx
  17. 44
      src/Components/Clientes/Amazon/Reportes/Clasification/Pending/RptAmazonPendingClasificationInvoicesDetail.tsx
  18. 170
      src/Components/Clientes/Amazon/Reportes/Clasification/WaitingAnswerFromAmazon/RptPendingAnswerFromAmazon.tsx
  19. 105
      src/Components/Clientes/Amazon/Reportes/Clasification/WaitingAnswerFromAmazon/RptPendingAnswerFromAmazonDetail.tsx
  20. 15
      src/Components/Clientes/Amazon/Reportes/ConsultaTrafico/RptConsultaTrafico.tsx
  21. 1087
      src/Components/Clientes/Amazon/Reportes/Estatus/RtpAmazonInvoiceStatus.tsx
  22. 85
      src/Components/Clientes/Amazon/Reportes/FacturasPagadas/RptAmazonFacturasPagadas.tsx
  23. 112
      src/Components/Clientes/Amazon/Reportes/Segregacion/RptSegregacion.tsx
  24. 40
      src/Components/Clientes/Amazon/Services/Amazon.Services.ts
  25. 12
      src/Components/Dashboard/Dashboard.tsx
  26. 125
      src/Components/GEMCO/Facturacion/Anexo/RptConsolidadosSinFirmaBanco.tsx
  27. 2
      src/Components/Login/login.tsx
  28. 22
      src/Components/Register/UserList/UserList.tsx
  29. 67
      src/Components/Register/register.tsx
  30. 401
      src/Components/Reportes/RptArcosa.tsx
  31. 308
      src/Components/Reportes/RptContsFacturasFraccion.tsx
  32. 322
      src/Components/Reportes/RptFacturasPedimentosPagados.tsx
  33. 409
      src/Components/Reportes/RptOperacionesPagadasMisionFood.tsx
  34. 2
      src/Components/Utils/Toast/msgInformativo.tsx
  35. 7
      src/Interfaces/Facturacion/Anexo/IConsolidadosSinFirmaBanco.ts
  36. 61
      src/Interfaces/IRegister.tsx
  37. 18
      src/Interfaces/Reportes/IRptArcosa.ts
  38. 16
      src/Interfaces/Reportes/IRptContsFacturasFraccion.ts
  39. 10
      src/Interfaces/Reportes/IRptFacturasPedimentosPagados.ts
  40. 24
      src/Interfaces/Reportes/IRptOperacionesPagadasMisionFood.ts
  41. 17
      src/Services/Operaciones/Operaciones.Services.ts
  42. 33
      src/Services/Reportes/reportes.services.ts
  43. 48
      src/index.tsx
  44. 50
      src/store/features/Clientes/2096/AmazonCatConceptosConsulta.ts
  45. 4
      src/store/store.ts

@ -0,0 +1,3 @@
{
"workbench.colorTheme": "Infinity Dark Theme Eye Friendly Colors"
}

Binary file not shown.

@ -1,6 +1,6 @@
{ {
"name": "gemco", "name": "gemco",
"version": "0.1.0", "version": "3.2.0",
"homepage": ".", "homepage": ".",
"private": true, "private": true,
"dependencies": { "dependencies": {
@ -69,7 +69,7 @@
"start-dev": "env-cmd -f .env.development react-scripts start", "start-dev": "env-cmd -f .env.development react-scripts start",
"start-qa": "env-cmd -f .env.qa react-scripts start", "start-qa": "env-cmd -f .env.qa react-scripts start",
"start-prod": "env-cmd -f .env.production react-scripts start", "start-prod": "env-cmd -f .env.production react-scripts start",
"build-qa": "env-cmd -f .env.qa react-scripts build", "build-qa": "env-cmd -f .env.qa react-scripts build version --patch",
"build-prod": "env-cmd -f .env.production react-scripts build", "build-prod": "env-cmd -f .env.production react-scripts build",
"test": "react-scripts test", "test": "react-scripts test",
"eject": "react-scripts eject" "eject": "react-scripts eject"

@ -1,5 +1,5 @@
import React, { FC, useEffect, useState } from 'react' import React, { FC, useEffect, useState } from 'react'
import { Button, Card, Col, Form, Modal, Row } from 'react-bootstrap' import { Alert, Button, Card, Col, Form, Modal, Row } from 'react-bootstrap'
import { IconContext } from 'react-icons' import { IconContext } from 'react-icons'
import ICatFraccionesVulnerables from '../../../Interfaces/Catalogos/ICatFraccionesVulnerables' import ICatFraccionesVulnerables from '../../../Interfaces/Catalogos/ICatFraccionesVulnerables'
import FraccionesVulnerables from '../../../Services/Catalogos/FraccionesVulnerables' import FraccionesVulnerables from '../../../Services/Catalogos/FraccionesVulnerables'
@ -11,6 +11,12 @@ import { FaEraser } from 'react-icons/fa'
import { FormControl } from 'react-bootstrap' import { FormControl } from 'react-bootstrap'
import { AiFillCloseCircle } from 'react-icons/ai' import { AiFillCloseCircle } from 'react-icons/ai'
import { AiOutlineSave } from 'react-icons/ai' import { AiOutlineSave } from 'react-icons/ai'
import { MsgInformativo } from '../../Utils/Toast/msgInformativo'
// import { kMaxLength } from 'buffer'
// import { isNull, set } from 'cypress/types/lodash'
// import { number } from 'yup'
// import { parse } from 'path'
// Define types for the component props and table row data // Define types for the component props and table row data
interface IProps {} interface IProps {}
@ -31,20 +37,19 @@ export default function CatFraccionesVulnerables(props: IProps) {
// const mFraccionesVulnerables = useSelector((state: RootState) => state.CatFraccionesVulnerables.CatFraccionesVulnerables); // const mFraccionesVulnerables = useSelector((state: RootState) => state.CatFraccionesVulnerables.CatFraccionesVulnerables);
const [header, setHeader] = useState<string>('') // Specify the type of 'header' const [header, setHeader] = useState<string>('') // Specify the type of 'header'
// const [msgColor, setMsgColor] = useState<string>('primary'); // Specify the type of 'msgColor' // const [msgColor, setMsgColor] = useState<string>('primary'); // Specify the type of 'msgColor'
const [show, setShowMsg] = useState<boolean>(false) // Specify the type of 'show' const [show, setShowMsg] = useState(false) // Specify the type of 'show'
const [msg, setMsg] = useState<string>('') // Specify the type of 'msg' const [msg, setMsg] = useState<string>('') // Specify the type of 'msg'
const [id, setId] = useState<number>(0) // Specify the type of 'id' const [id, setId] = useState<number>(0) // Specify the type of 'id'
const [Fraccion, setFraccion] = useState<number>(0) // Specify the type of 'Fraccion' const [Fraccion, setFraccion] = useState<number>(0) // Specify the type of 'Fraccion'
const [Nico, setNico] = useState<string>('') // Specify the type of 'Nico' const [Nico, setNico] = useState<string>('0') // Specify the type of 'Nico'
const [Activo, setActivo] = useState<number>(0) // Specify the type of 'Activo' const [Activo, setActivo] = useState<number>(0) // Specify the type of 'Activo'
const [showModal, setShowModal] = useState<boolean>(false) const [showModal, setShowModal] = useState<boolean>(false)
const [editMode, setEditMode] = useState(false) // Nuevo estado para controlar el modo de edición const [editMode, setEditMode] = useState(false) // Nuevo estado para controlar el modo de edición
const [selectedRow, setSelectedRow] = const [selectedRow, setSelectedRow] =
useState<ICatFraccionesVulnerables | null>(null) // Nuevo estado para almacenar la fila seleccionada useState<ICatFraccionesVulnerables | null>(null) // Nuevo estado para almacenar la fila seleccionada
// const [fraccionesVulnerables, setFraccionesVulnerables] = useState([]); // const [fraccionesVulnerables, setFraccionesVulnerables] = useState([]);
const [modalFileManager, setModalFileManager] = useState(false) const [modalFileManager, setModalFileManager] = useState(false)
const msgColor = 'primary'
const columnsFraccionesVulnerables = [ const columnsFraccionesVulnerables = [
{ {
@ -123,6 +128,9 @@ export default function CatFraccionesVulnerables(props: IProps) {
setNico(data.nico) setNico(data.nico)
} }
// const truncatedValue = inputValue.substring(0, 8)
// setFraccion(truncatedValue)
const generaReporte = () => { const generaReporte = () => {
setTipoReporte(0) setTipoReporte(0)
FraccionesVulnerables.getAll() FraccionesVulnerables.getAll()
@ -130,6 +138,10 @@ export default function CatFraccionesVulnerables(props: IProps) {
setData(response.data) setData(response.data)
setDataOriginal(response.data) setDataOriginal(response.data)
// uploadAllRows(response.data) // uploadAllRows(response.data)
setHeader('Informativo')
setMsg('Se encontro la siguiente informacion...')
setShowMsg(true)
}) })
.catch((e: Error) => { .catch((e: Error) => {
setHeader('Error') setHeader('Error')
@ -155,7 +167,7 @@ export default function CatFraccionesVulnerables(props: IProps) {
setSelectedRow(null) setSelectedRow(null)
setFraccion(0) setFraccion(0)
setNico('') setNico('0')
setActivo(0) // Establecer a 0 (No) setActivo(0) // Establecer a 0 (No)
setEditMode(true) setEditMode(true)
setId(0) setId(0)
@ -194,14 +206,66 @@ export default function CatFraccionesVulnerables(props: IProps) {
}) })
}) })
} }
//Aqui agregamos la validacion de los digitos de las fracciones -------------------------------------------------------
const handleFraccionKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
const fraccionAsString = Fraccion.toString()
if (e.key.length === 1 && fraccionAsString.length >= 8) {
e.preventDefault() // Evitar agregar más caracteres si ya hay 8
}
}
const handleFraccionBlur = (e: React.FocusEvent<HTMLInputElement>) => {
const fraccionAsString = Fraccion.toString()
if (fraccionAsString.length !== 8) {
console.log('La fracción debe tener 8 dígitos.')
e.currentTarget.focus() // Mantener el foco en el campo
}
}
// aqui agregamos las validaciones de los digitos del nico---------------------------------------------------------
const handleNicoChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const value = e.target.value
if (value.length <= 2) {
setNico(value)
}
}
const handleNicoKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (e.key.length === 1 && Nico.length >= 2) {
e.preventDefault() // Evitar agregar más caracteres si ya hay 2
}
}
const handleNicoBlur = (e: React.FocusEvent<HTMLInputElement>) => {
if (Nico.length !== 2) {
console.log('El Nico debe tener 2 dígitos.')
e.currentTarget.focus() // Mantener el foco en el campo
}
}
// Guardar --------------------------------------------------------------
const handleSaveChanges = async () => { const handleSaveChanges = async () => {
if (id === 0) { if (id === 0) {
if (Nico.length > 2) { const fraccionAsString = Fraccion.toString()
console.log(
'El valor de Nico tiene más de 2 caracteres. No se actualizará la tabla ni se realizará la petición uploadFile.' if (fraccionAsString.length !== 8 || Nico.length !== 2) {
) setHeader('Error')
return
if (fraccionAsString.length !== 8 && Nico.length !== 2) {
setMsg(
'La fraccion debe tener 8 dígitos y el nico debe tener 2 dígitos.'
)
} else if (fraccionAsString.length !== 8) {
setMsg('La fracción debe tener 8 dígitos.')
} else {
setMsg('El nico debe tener 2 dígitos.')
}
setShowMsg(true)
return // Esto podría ser necesario para evitar una ejecución adicional
} }
const newRecord = { const newRecord = {
@ -223,28 +287,35 @@ export default function CatFraccionesVulnerables(props: IProps) {
// console.log('este el id normal ' + id) // console.log('este el id normal ' + id)
// Restablecer valores de los campos // Restablecer valores de los campos
setFraccion(0) handleCreateNewRecord()
setNico('')
setActivo(1)
setEditMode(false)
setShowModal(false)
} catch (error) { } catch (error) {
console.error('Error durante la inserción:', error) console.error('Error durante la inserción:', error)
} }
} else { } else {
// Aquí actualizamos el registro existente // Aquí actualizamos el registro existente
if (Nico.length > 2) { const fraccionAsString = Fraccion.toString()
console.log(
'El valor de Nico tiene más de 2 caracteres. No se actualizará la tabla ni se realizará la petición uploadFile.' if (fraccionAsString.length !== 8) {
) setHeader('Error')
return // Sale de la función sin hacer nada más setMsg('La fraccion debe tener 8 digitos.')
setShowMsg(true)
return
}
if (Nico.length !== 2) {
setHeader('Error')
setMsg('El Nico debe tener 2 digitos.')
setShowMsg(true)
return
} }
const updatedData = Data.map((row) => const updatedData = Data.map((row) =>
row.id === selectedRow?.id row.id === selectedRow?.id
? { ...row, fraccion: Fraccion, nico: Nico, activo: Activo } ? { ...row, fraccion: Fraccion, nico: Nico, activo: Activo }
: row : row
) )
setData(updatedData) setData(updatedData)
const updatedRow = updatedData.find((row) => row.id === selectedRow?.id) const updatedRow = updatedData.find((row) => row.id === selectedRow?.id)
if (updatedRow) { if (updatedRow) {
@ -289,12 +360,13 @@ export default function CatFraccionesVulnerables(props: IProps) {
} }
} }
// Función para manejar el cambio en el campo de entrada de la fracción
const handleFraccionChange = (e: React.ChangeEvent<HTMLInputElement>) => { const handleFraccionChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const value = parseFloat(e.target.value) const value = parseFloat(e.target.value)
setFraccion(isNaN(value) ? 0 : value) setFraccion(isNaN(value) ? 0 : value)
} }
// Función para manejar el cambio en el campo de entrada de la fracción
return ( return (
<div className="mt-2"> <div className="mt-2">
<Card> <Card>
@ -329,9 +401,12 @@ export default function CatFraccionesVulnerables(props: IProps) {
type="text" type="text"
value={Fraccion} value={Fraccion}
onChange={handleFraccionChange} onChange={handleFraccionChange}
onKeyDown={handleFraccionKeyDown}
onBlur={handleFraccionBlur}
inputMode="numeric" inputMode="numeric"
className="orm-select mx-2" className="orm-select mx-2"
maxLength={8} maxLength={8}
minLength={8}
style={{ style={{
backgroundColor: 'white', backgroundColor: 'white',
color: 'black', color: 'black',
@ -351,9 +426,14 @@ export default function CatFraccionesVulnerables(props: IProps) {
<FormControl <FormControl
type="text" type="text"
value={Nico} value={Nico}
onChange={(e) => setNico(e.target.value)} // onChange={(e) => setNico(e.target.value)}
onChange={handleNicoChange}
onKeyDown={handleNicoKeyDown}
onBlur={handleNicoBlur}
// inputMode="numeric"
className="orm-select mx-2" className="orm-select mx-2"
maxLength={2} maxLength={2}
minLength={2}
style={{ style={{
backgroundColor: 'white', backgroundColor: 'white',
color: 'black', color: 'black',
@ -481,6 +561,15 @@ export default function CatFraccionesVulnerables(props: IProps) {
</div> </div>
</Card.Body> </Card.Body>
</Card> </Card>
<MsgInformativo
show={show}
msg={msg}
header={header}
msgColor={msgColor}
closeToast={() => {
setShowMsg(false)
}}
/>
</div> </div>
) )
} }

@ -0,0 +1,501 @@
import React, { FC, useEffect, useState } from 'react'
import ITabulador from '../../../../Interfaces/Catalogos/ITabulador'
import ITabuladorConceptos from '../../../../Interfaces/Catalogos/ITabuladorConceptos'
import DTOConceptos from '../../../../DTO/Utils/DTOConceptos'
import CTabDataService from '../../../../Services/Corresponsalias/Corresponsales.Tabuladores.Services'
//import CTabDetDataService from '../../../../Services/Corresponsalias/Corresponsales.Tabuladores.Detalle.Sevices'
import AmazonSrvDataService from '../Services/Amazon.Services'
import ClientesDataService from '../../../../Services/Catalogos/Clientes.Services'
import { MsgInformativo } from '../../../Utils/Toast/msgInformativo'
import { ControlledInput } from '../../../Utils/ControlledInput/ControlledInput'
import DataTable from 'react-data-table-component'
import {
Alert,
Button,
Card,
Col,
Container,
FloatingLabel,
Form,
Modal,
Row
} from 'react-bootstrap'
import { IconContext } from 'react-icons'
import 'react-data-table-component-extensions/dist/index.css'
import {
BsCheckCircleFill,
BsPlusSquareFill,
BsXCircleFill
} from 'react-icons/bs'
import IClientes from '../../../../Interfaces/Catalogos/IClientes'
import { FcTimeline } from 'react-icons/fc'
import { FaEraser, FaTimesCircle } from 'react-icons/fa'
import ICat2096CatConceptosConsulta from '../Interfaces/I2096CatConceptosConsulta'
import { populateCatConcetosConsultas, updateCatConcetosConsulta } from '../../../../store/features/Clientes/2096/AmazonCatConceptosConsulta'
import { useDispatch } from 'react-redux'
export interface ICatConceptosConsultaProps {}
export default function CatConceptosConsulta(
props: ICatConceptosConsultaProps
) {
const [UserId, setUserId] = useState(() => {
const stickyValue = window.localStorage.getItem('UserId')
return stickyValue !== null ? JSON.parse(stickyValue) : 0
})
const dispatch = useDispatch()
const [Tabulador, setTabulador] = useState(0)
const [Id, setId] = useState(0)
const [Concepto, setConcepto] = useState(0)
const [Cliente, setCliente] = useState(0)
const [Activo, setActivo] = useState(0)
const [Clientes, setClientes] = useState<Array<IClientes>>()
const [Siglas, setSiglas] = useState('')
const [ShortDescription, setShortDescription] = useState('')
const [SpanishDescription, setSpanishDescription] = useState('')
const [SpanishDescriptionWide, setSpanishDescriptionWide] = useState('')
const [DetalleConceptos, setDetalleConceptos] = useState<
ITabuladorConceptos[]
>([])
const [CatConceptos, setCatConceptos] = useState<
ICat2096CatConceptosConsulta[]
>([])
const [Tabuladores, setTabuladores] = useState<ITabulador[]>([])
const [AllTabuladores, setAllTabuladores] = useState<ITabulador[]>([])
const [Costo, setCosto] = useState('')
const [header, setHeader] = useState('')
const [msgColor, setMsgColor] = React.useState('primary')
const [show, setShowMsg] = useState(false)
const [msg, setMsg] = useState('')
const [DialogTabs, setDialogTabs] = useState(false)
const colConcepts = [
{
name: 'Activo',
width: '80px',
cell: (row: ICat2096CatConceptosConsulta) => (
<div
onClick={() => {
loadData(row)
}}
>
<IconContext.Provider
value={{ color: row.activo ? 'green' : 'red', size: '20px' }}
>
{row.activo ? <BsCheckCircleFill /> : <BsXCircleFill />}
</IconContext.Provider>
</div>
)
},
{
name: 'Siglas',
width: '80px',
selector: (row: ICat2096CatConceptosConsulta) => row.siglas,
sortable: true
},
{
name: 'Descripcion corta',
width: '300px',
selector: (row: ICat2096CatConceptosConsulta) => row.shortDescription,
wrap: true,
sortable: true
},
{
name: 'Descripcion español',
width: '450px',
selector: (row: ICat2096CatConceptosConsulta) => row.spanishDescription,
wrap: true,
sortable: true
},
{
name: 'Descripcion amplia',
width: '450px',
selector: (row: ICat2096CatConceptosConsulta) =>
row.spanishDescriptionWide,
wrap: true,
sortable: true
}
]
const loadData = (data: ICat2096CatConceptosConsulta) => {
setId(data.id)
setSiglas(data.siglas)
setShortDescription(data.shortDescription)
setSpanishDescription(data.spanishDescription)
setSpanishDescriptionWide(data.spanishDescriptionWide)
setActivo(data.activo ? 1 : 0)
}
const deleteTabulador = () => {
CTabDataService.Delete(Tabulador)
.then((response) => {
if (response.status === 200) {
setHeader('Informativo')
setMsg(response.data.respuesta)
setShowMsg(true)
setDialogTabs(false)
setTabuladores(Tabuladores.filter((data) => data.id != Tabulador))
setAllTabuladores(Tabuladores)
return
}
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error: ' + e)
setShowMsg(true)
return
})
}
const loadCatalog = () => {
AmazonSrvDataService.CatConceptosConsultaGET()
.then((response) => {
dispatch(populateCatConcetosConsultas(response.data))
setCatConceptos(response.data)
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error: ' + e)
setShowMsg(true)
return
})
}
useEffect(() => {
loadCatalog()
}, [])
useEffect(() => {
if (Cliente > 0) {
setSiglas('')
setTabuladores([])
setDetalleConceptos([])
CTabDataService.GetByCustomer(Cliente)
.then((response) => {
setTabuladores(response.data)
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error: ' + e)
setShowMsg(true)
return
})
}
}, [Cliente])
const filtraTabulador = (e: any) => {
if (e.target.value !== '') {
setTabuladores(
AllTabuladores.filter(function (el) {
return el.nombre
.toLocaleLowerCase()
.includes(e.target.value.toLocaleLowerCase())
})
)
} else {
setTabuladores(AllTabuladores)
}
}
const save = () => {
const data: ICat2096CatConceptosConsulta = {
id: Id,
siglas: Siglas,
shortDescription: ShortDescription,
spanishDescription: SpanishDescription,
spanishDescriptionWide: SpanishDescriptionWide,
activo: Activo==1
}
AmazonSrvDataService.CatConceptosConsultaAppend(data)
.then((response) => {
if (response.status === 200) {
loadCatalog()
setHeader('Informativo')
setMsg('La informacion se guardo correctamente')
setShowMsg(true)
return
}
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error: ' + e)
setShowMsg(true)
return
})
}
return (
<div>
<Card>
<Card.Body>
<Card style={{ height: '100%' }}>
<Card.Header as="h4">Catalogo de consultas para Amazon</Card.Header>
<Card.Body>
<Container fluid>
<Alert variant="primary">
<Row>
<Col xs={1}>
<FloatingLabel
controlId="floatingInput"
label="Siglas"
className="mb-3"
>
<Form.Control
type="text"
placeholder=""
value={Siglas}
maxLength={4}
onChange={(e) => {
setSiglas(e.target.value)
}}
/>
</FloatingLabel>
</Col>
<Col xs={8}>
<FloatingLabel
controlId="floatingInput"
label="Descripcion corta"
className="mb-3"
>
<Form.Control
type="text"
placeholder="Descripcion corta"
value={ShortDescription}
onChange={(e) => {
setShortDescription(e.target.value)
}}
/>
</FloatingLabel>
</Col>
<Col
xs={1}
style={{
textAlign: 'left',
paddingTop: '5px',
cursor: 'pointer',
paddingLeft: '0px'
}}
onClick={() => {
setTabulador(0)
setSiglas('')
}}
>
<IconContext.Provider
value={{ color: 'orange', size: '25px' }}
>
<FaEraser />
</IconContext.Provider>
</Col>
<Col></Col>
<Col style={{ paddingTop: '20px' }}>
<Button
variant="primary"
size="sm"
style={{ paddingLeft: '10px', paddingRight: '10px' }}
onClick={() => save()}
>
Guardar
</Button>
</Col>
</Row>
<Row>
<Col xs={5}>
<FloatingLabel
controlId="floatingInput"
label="Descripcion en español"
className="mb-3"
>
<Form.Control
as="textarea"
placeholder=""
style={{ height: '100px' }}
value={SpanishDescription}
onChange={(e) => {
setSpanishDescription(e.target.value)
}}
/>
</FloatingLabel>
</Col>
<Col xs={5}>
<FloatingLabel
controlId="floatingInput"
label="Descripcion amplia"
className="mb-3"
>
<Form.Control
as="textarea"
placeholder="Descripcion amplia"
style={{ height: '100px' }}
value={SpanishDescriptionWide}
onChange={(e) => {
setSpanishDescriptionWide(e.target.value)
}}
/>
</FloatingLabel>
</Col>
<Col style={{ paddingTop: '20px' }}>
<FloatingLabel controlId="floatingSelect" label="Activo">
<Form.Select
aria-label="Activo"
value={Activo}
onChange={(e) => {
setActivo(parseInt(e.target.value))
}}
>
<option value="1">Si</option>
<option value="0">No</option>
</Form.Select>
</FloatingLabel>
</Col>
<Col></Col>
</Row>
</Alert>
<Row>
{/* <Col xs={6}>
<Card style={{}}>
<Card.Body>
<Card.Subtitle className="mb-2 text-muted">
<Row>
<Col xs={2} style={{ paddingTop: '8px' }}>
Tabulador
</Col>
<Col xs={10}>
<Form.Control
type="text"
size="sm"
placeholder="Busqueda de tabulador..."
onChange={(e) => {
filtraTabulador(e)
}}
/>
</Col>
</Row>
</Card.Subtitle>
</Card.Body>
</Card>
</Col> */}
<Col xs={12}>
<Card style={{}}>
<Card.Body>
<Card.Subtitle className="mb-2 text-muted">
<Row>
<Col xs={12} style={{ paddingTop: '8px' }}>
<DataTable
noHeader
defaultSortFieldId={'id'}
defaultSortAsc={true}
pagination
highlightOnHover
columns={colConcepts}
data={CatConceptos}
/>
</Col>
<Col xs={9}>
{/* <Form.Control
as="select"
onChange={(e) =>
setConcepto(parseInt(e.target.value))
}
className="form-select form-select-sm"
style={{ fontSize: '17px' }}
>
<option value="0">- Seleccione -</option>
{CatConceptos
? CatConceptos.map((c) => {
return (
<option value={c.id} key={c.id}>
{c.concepto}
</option>
)
})
: null}
</Form.Control> */}
</Col>
<Col style={{ paddingTop: '5px' }}>
{/* <Form.Label
onClick={() => {
addConcept()
}}
style={{ cursor: 'pointer' }}
>
<IconContext.Provider
value={{ color: 'green', size: '30px' }}
>
<BsPlusSquareFill />
</IconContext.Provider>
</Form.Label> */}
</Col>
</Row>
</Card.Subtitle>
{/* <DataTable
noHeader
defaultSortFieldId={'id'}
defaultSortAsc={true}
pagination
highlightOnHover
columns={columnsConcepts}
data={DetalleConceptos}
/> */}
</Card.Body>
</Card>
</Col>
</Row>
</Container>
</Card.Body>
</Card>
</Card.Body>
</Card>
<Modal
show={DialogTabs}
onHide={() => {
setDialogTabs(false)
}}
size="sm"
>
<Modal.Body>
¿Esta seguro de eliminar:
<br /> {Siglas}?
</Modal.Body>
<Modal.Footer>
<Row>
<Col xs={6} style={{ textAlign: 'left', paddingRight: '100px' }}>
<Button
variant="danger"
onClick={deleteTabulador}
size="sm"
style={{ paddingRight: '20px', paddingLeft: '20px' }}
>
Si
</Button>
</Col>
<Col xs={6} style={{ textAlign: 'right' }}>
<Button
variant="secondary"
onClick={() => {
setDialogTabs(false)
}}
size="sm"
>
Cerrar
</Button>
</Col>
</Row>
</Modal.Footer>
</Modal>
<MsgInformativo
show={show}
msg={msg}
header={header}
msgColor={msgColor}
closeToast={() => {
setShowMsg(false)
}}
/>
</div>
)
}

@ -177,6 +177,11 @@ export function ComboDescripcion(props: IComboDescripcionProps) {
) : ( ) : (
'' ''
)} )}
{props.Detail.validaFraccionOriginal === 5 ? (
<option value="5">BOT</option>
) : (
''
)}
</Form.Control> </Form.Control>
<Modal <Modal
show={showModal} show={showModal}

@ -1,5 +1,5 @@
import { useCallback, useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import { Button, Col, Form, Modal, Row } from 'react-bootstrap' import { Badge, Button, Col, Form, Modal, Row } from 'react-bootstrap'
import * as CurrencyFormat from 'react-currency-format' import * as CurrencyFormat from 'react-currency-format'
import { MsgInformativo } from '../../../../Utils/Toast/msgInformativo' import { MsgInformativo } from '../../../../Utils/Toast/msgInformativo'
import { RootState } from '../../../../../store/store' import { RootState } from '../../../../../store/store'
@ -31,6 +31,9 @@ export function ComboFraccion(props: IComboFraccionProps) {
const mInvoices = useSelector( const mInvoices = useSelector(
(state: RootState) => state.AmazonInvoices.Invoice (state: RootState) => state.AmazonInvoices.Invoice
) )
const mCatTipoConsultas = useSelector(
(state: RootState) => state.AmazonCatConceptosConsulta.CatConcetosConsulta
)
const [Validacion, setValidacion] = useState(props.ConfirmaFraccion) const [Validacion, setValidacion] = useState(props.ConfirmaFraccion)
const [UserChanged, setUserChanged] = useState(false) const [UserChanged, setUserChanged] = useState(false)
const [showModal, setShowModal] = useState(false) const [showModal, setShowModal] = useState(false)
@ -49,8 +52,10 @@ export function ComboFraccion(props: IComboFraccionProps) {
const [Comentarios, setComentarios] = useState( const [Comentarios, setComentarios] = useState(
props.Detail.comentarios props.Detail.comentarios
? props.Detail.comentarios ? props.Detail.comentarios
: 'Clasificacion Incorrecta' : ''
) )
const [TipoConsulta, setTipoConsulta] = useState(0)
const [TipoConsultaTxt, setTipoConsultaTxt] = useState('')
const msgColor = 'primary' const msgColor = 'primary'
const refreshStore = (Invoice: I2096Headers, Detail: I2096Detail[]) => { const refreshStore = (Invoice: I2096Headers, Detail: I2096Detail[]) => {
@ -108,13 +113,10 @@ export function ComboFraccion(props: IComboFraccionProps) {
cumplimientoNormativo: newData.cumplimientoNormativo, cumplimientoNormativo: newData.cumplimientoNormativo,
comentarios: newData.comentarios, comentarios: newData.comentarios,
confirmaFraccion: newData.confirmaFraccion confirmaFraccion: newData.confirmaFraccion
/*,
checked: true*/
} }
} }
return el return el
}) })
//console.log('newDetail '+JSON.stringify(newDetail))
refreshStore(Invoice[0], newDetail) refreshStore(Invoice[0], newDetail)
} }
@ -134,6 +136,13 @@ export function ComboFraccion(props: IComboFraccionProps) {
} }
}, [Validacion, UserChanged]) }, [Validacion, UserChanged])
useEffect(() => {
let selected = mCatTipoConsultas.filter((a)=>{if(a.id==TipoConsulta){return a}})
if (selected.length) {
setTipoConsultaTxt(selected[0].shortDescription+' '+selected[0].spanishDescription)
}
}, [TipoConsulta])
const saveFraccion = (Fracc: string) => { const saveFraccion = (Fracc: string) => {
Fracc = Fracc.replaceAll('.', '').replaceAll(' ', '') Fracc = Fracc.replaceAll('.', '').replaceAll(' ', '')
if (Validacion === 2) { if (Validacion === 2) {
@ -165,6 +174,7 @@ export function ComboFraccion(props: IComboFraccionProps) {
const data: DTO2096FraccionDescripcion = { const data: DTO2096FraccionDescripcion = {
id: props.IDDetail, id: props.IDDetail,
fraccion: Fracc, fraccion: Fracc,
tipoConsulta: TipoConsulta,
cumplimientoNormativo: CumplimientoNormativo, cumplimientoNormativo: CumplimientoNormativo,
comentarios: Comentarios, comentarios: Comentarios,
descripcionGEMCO: DescripcionGEMCO descripcionGEMCO: DescripcionGEMCO
@ -209,6 +219,7 @@ export function ComboFraccion(props: IComboFraccionProps) {
<option value="0"> </option> <option value="0"> </option>
<option value="1"> = </option> <option value="1"> = </option>
<option value="2"> != </option> <option value="2"> != </option>
{/* <option value="5">BOT</option> */}
</> </>
) : ( ) : (
'' ''
@ -222,7 +233,6 @@ export function ComboFraccion(props: IComboFraccionProps) {
) : ( ) : (
'' ''
)} )}
{/* <option value="2"> != </option> */}
{props.Detail.validaFraccionOriginal === 3 ? ( {props.Detail.validaFraccionOriginal === 3 ? (
<option value="3"> Ok </option> <option value="3"> Ok </option>
) : ( ) : (
@ -248,7 +258,11 @@ export function ComboFraccion(props: IComboFraccionProps) {
> >
<Modal.Body> <Modal.Body>
<Row> <Row>
<Col xs={3}>Fraccion GEMCO</Col> <Col xs={3}>
<Badge bg="primary">
<h6>Fraccion GEMCO</h6>
</Badge>
</Col>
<Col xs={3}> <Col xs={3}>
<CurrencyFormat <CurrencyFormat
onValueChange={(values: any) => { onValueChange={(values: any) => {
@ -272,8 +286,45 @@ export function ComboFraccion(props: IComboFraccionProps) {
<Col xs={6}></Col> <Col xs={6}></Col>
</Row> </Row>
<Row style={{ paddingTop: '15px' }}> <Row style={{ paddingTop: '15px' }}>
<Col xs={3}>Cumplimiento normativo</Col> <Col xs={1}>
<Col xs={8}> <Badge bg="primary">
<h6>Tipo</h6>
</Badge>
</Col>
<Col xs={2}>
<Form.Control
as="select"
className="form-select form-select-sm"
onChange={(e) => setTipoConsulta(parseInt(e.target.value))}
value={TipoConsulta}
> <option value='0'> ??? </option>
{mCatTipoConsultas.map((tipo) => {
return <option value={tipo.id}>{tipo.siglas}</option>
})}
</Form.Control>
</Col>
<Col xs={9}>
<Form.Control
as="textarea"
id="TipoConsultaTxt"
size="sm"
disabled={true}
value={TipoConsultaTxt}
style={{height:'100px', fontSize:'13px'}}
/>
</Col>
</Row>
<Row style={{ paddingTop: '15px' }}>
<Col xs={3}>
<Badge bg="primary">
<h6>
Cumplimiento&nbsp;&nbsp;&nbsp;&nbsp;
<br />
normativo
</h6>
</Badge>
</Col>
<Col xs={9}>
<Form.Control <Form.Control
as="textarea" as="textarea"
id="CumplimientoNormativo" id="CumplimientoNormativo"
@ -285,15 +336,19 @@ export function ComboFraccion(props: IComboFraccionProps) {
<Col>&nbsp;</Col> <Col>&nbsp;</Col>
</Row> </Row>
<Row style={{ paddingTop: '15px' }}> <Row style={{ paddingTop: '15px' }}>
<Col xs={3}>Comentarios</Col> <Col xs={3}>
<Col xs={8}> <Badge bg="primary">
<h6>Comentarios&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</h6>
</Badge>
</Col>
<Col xs={9}>
{' '} {' '}
<Form.Control <Form.Control
as="textarea" as="textarea"
id="Comentarios" id="Comentarios"
size="sm" size="sm"
value={ value={
Comentarios.length ? Comentarios : 'Clasificacion incorrecta.' Comentarios.length ? Comentarios : ''
} }
onChange={(e) => setComentarios(e.target.value)} onChange={(e) => setComentarios(e.target.value)}
/> />
@ -301,8 +356,12 @@ export function ComboFraccion(props: IComboFraccionProps) {
<Col>&nbsp;</Col> <Col>&nbsp;</Col>
</Row> </Row>
<Row style={{ paddingTop: '15px' }}> <Row style={{ paddingTop: '15px' }}>
<Col xs={3}>Descripcion GEMCO</Col> <Col xs={3}>
<Col xs={8}> <Badge bg="primary">
<h6>Descripcion GEMCO</h6>
</Badge>
</Col>
<Col xs={9}>
<Form.Control <Form.Control
as="textarea" as="textarea"
id="PedimentoDescripcion" id="PedimentoDescripcion"
@ -315,6 +374,7 @@ export function ComboFraccion(props: IComboFraccionProps) {
<Col XS={9}></Col> <Col XS={9}></Col>
<Col xs={3}> <Col xs={3}>
<Button <Button
style={{visibility: (Comentarios.length && TipoConsulta>0) ? 'visible' : 'hidden'}}
onClick={() => { onClick={() => {
saveFraccion(Fraccion) saveFraccion(Fraccion)
}} }}

@ -1,6 +1,7 @@
export default interface DTO2096FraccionDescripcion { export default interface DTO2096FraccionDescripcion {
id: number id: number
fraccion: string fraccion: string
tipoConsulta: number,
cumplimientoNormativo: string cumplimientoNormativo: string
comentarios: string comentarios: string
descripcionGEMCO: string descripcionGEMCO: string

@ -1,3 +1,5 @@
import { number } from "yup"
export default interface DTO2096InvoiceStatus { export default interface DTO2096InvoiceStatus {
id: number id: number
referencia: string referencia: string
@ -26,4 +28,9 @@ export default interface DTO2096InvoiceStatus {
idArchivoACK: number, idArchivoACK: number,
archivoACK: string, archivoACK: string,
fhArchivoACK: string fhArchivoACK: string
clasificador: string
fechaRecepcion: string
cantidadASIN: number
} }

@ -1,4 +1,5 @@
export default interface DTO2096RptFacturasPagadas { export default interface DTO2096RptFacturasPagadas {
factura: string, factura: string,
pedimento: string, pedimento: string,
fechaPago: string, fechaPago: string,
@ -7,5 +8,6 @@ export default interface DTO2096RptFacturasPagadas {
valorDolares: string, valorDolares: string,
valorAduana: string, valorAduana: string,
razonSocial: string, razonSocial: string,
aduana: string aduana: string,
piezas: string
} }

@ -0,0 +1,10 @@
export default interface DTOAmazonSegragacion {
vrid: string,
asin: string,
quantity: number,
descripcion: string,
motivo: string,
fSegregacion: string,
valorMercancia: string,
}

@ -0,0 +1,8 @@
export default interface ICat2096CatConceptosConsulta {
id: number,
siglas: string,
shortDescription: string,
spanishDescription: string,
spanishDescriptionWide: string,
activo: boolean
}

@ -37,6 +37,7 @@ export default interface I2096Detail {
fCreacion: string fCreacion: string
estatus: number estatus: number
autorizado: boolean autorizado: boolean
tipoConsulta: number
cumplimientoNormativo: string cumplimientoNormativo: string
comentarios: string comentarios: string
sightLine: boolean sightLine: boolean

@ -4,6 +4,7 @@ import DataTable from 'react-data-table-component'
import I2096NoParte from '../Interfaces/I2096NoParte' import I2096NoParte from '../Interfaces/I2096NoParte'
import AmazonDS from '../Services/Amazon.Services' import AmazonDS from '../Services/Amazon.Services'
import { import {
deleteNoPartes,
populateNoPartes, populateNoPartes,
updateNoPartes updateNoPartes
} from '../../../../store/features/Clientes/2096/AmazonNoPartes' } from '../../../../store/features/Clientes/2096/AmazonNoPartes'
@ -12,7 +13,7 @@ import { useDispatch, useSelector } from 'react-redux'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { MsgInformativo } from '../../../Utils/Toast/msgInformativo' import { MsgInformativo } from '../../../Utils/Toast/msgInformativo'
import { IconContext } from 'react-icons' import { IconContext } from 'react-icons'
import { BsFillPencilFill } from 'react-icons/bs' import { BsFillPencilFill, BsFillXCircleFill } from 'react-icons/bs'
import I2096PaisClave from '../Interfaces/I2096PaisClave' import I2096PaisClave from '../Interfaces/I2096PaisClave'
import DTO2096PerfilesParecidos from '../DTO/DTO2096PerfilesParecidos' import DTO2096PerfilesParecidos from '../DTO/DTO2096PerfilesParecidos'
@ -35,10 +36,14 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
const [NoParteLOG, setNoParteLOG] = useState<I2096NoParteLog[]>([]) const [NoParteLOG, setNoParteLOG] = useState<I2096NoParteLog[]>([])
const [PaisClaves, setPaisClaves] = useState<I2096PaisClave[]>([]) const [PaisClaves, setPaisClaves] = useState<I2096PaisClave[]>([])
const [Data, setData] = useState<DTO2096PerfilesParecidos[]>([]) const [Data, setData] = useState<DTO2096PerfilesParecidos[]>([])
const [DataNoParteVerificacion, setDataNoParteVeriifcacion] = useState<DTO2096NoParteVerificacion[]>([]) const [DataNoParteVerificacion, setDataNoParteVeriifcacion] = useState<
DTO2096NoParteVerificacion[]
>([])
const [ShowModal, setShowModal] = useState(false) const [ShowModal, setShowModal] = useState(false)
const [ShowModalLog, setShowModalLog] = useState(false) const [ShowModalLog, setShowModalLog] = useState(false)
const [ShowModalNoParteVerificacion, setShowModalNoParteVerificacion] = useState(false) const [ShowModalNoParteVerificacion, setShowModalNoParteVerificacion] =
useState(false)
const [ShowModalDelete, setShowModalDelete] = useState(false)
const [header, setHeader] = useState('') const [header, setHeader] = useState('')
const [msgColor, setMsgColor] = useState('primary') const [msgColor, setMsgColor] = useState('primary')
const [show, setShowMsg] = useState(false) const [show, setShowMsg] = useState(false)
@ -81,12 +86,35 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
<Col> <Col>
<div <div
style={{ style={{
cursor: 'pointer', cursor: 'pointer'
}}
onClick={() => {
setIDParte(row.id)
setShowModalDelete(true)
}}
>
<IconContext.Provider value={{ color: 'red', size: '25px' }}>
<BsFillXCircleFill />
</IconContext.Provider>
</div>
</Col>
</Row>
),
sortable: true
},
{
name: '',
width: '60px',
cell: (row: I2096NoParte) => (
<Row>
<Col>
<div
style={{
cursor: 'pointer'
}} }}
onClick={() => { onClick={() => {
loadDataNoParteVerificacion(row) loadDataNoParteVerificacion(row)
setShowModalNoParteVerificacion(true) setShowModalNoParteVerificacion(true)
}} }}
> >
<IconContext.Provider value={{ color: '#60DD0E', size: '30px' }}> <IconContext.Provider value={{ color: '#60DD0E', size: '30px' }}>
@ -166,13 +194,15 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
{ {
name: 'UMF', name: 'UMF',
width: '80px', width: '80px',
selector: (row: I2096NoParte) => row.unidadMedidaFactura ? row.unidadMedidaFactura : '', selector: (row: I2096NoParte) =>
row.unidadMedidaFactura ? row.unidadMedidaFactura : '',
sortable: true sortable: true
}, },
{ {
name: 'UMC', name: 'UMC',
width: '80px', width: '80px',
selector: (row: I2096NoParte) => row.unidadMedidaCOVE ? row.unidadMedidaCOVE : '', selector: (row: I2096NoParte) =>
row.unidadMedidaCOVE ? row.unidadMedidaCOVE : '',
sortable: true sortable: true
}, },
{ {
@ -215,7 +245,8 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
{ {
name: 'Fracc Original', name: 'Fracc Original',
width: '130px', width: '130px',
cell: (row: I2096NoParteLog) => row.fraccionOriginal ? row.fraccionOriginal : '', cell: (row: I2096NoParteLog) =>
row.fraccionOriginal ? row.fraccionOriginal : '',
sortable: true sortable: true
}, },
{ {
@ -228,7 +259,8 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
{ {
name: 'NICO Original', name: 'NICO Original',
width: '130px', width: '130px',
cell: (row: I2096NoParteLog) => row.subdivisionOriginal ? row.subdivisionOriginal : '', cell: (row: I2096NoParteLog) =>
row.subdivisionOriginal ? row.subdivisionOriginal : '',
sortable: true, sortable: true,
center: true center: true
}, },
@ -237,7 +269,7 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
width: '250px', width: '250px',
cell: (row: I2096NoParteLog) => row.descripcionAgenteAduanal, cell: (row: I2096NoParteLog) => row.descripcionAgenteAduanal,
wrap: true, wrap: true,
sortable: true, sortable: true
}, },
{ {
name: 'Desc Original', name: 'Desc Original',
@ -256,7 +288,7 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
{ {
name: 'Usuario', name: 'Usuario',
width: '300px', width: '300px',
cell: (row: I2096NoParteLog) => row.sUsuario ? row.sUsuario : '', cell: (row: I2096NoParteLog) => (row.sUsuario ? row.sUsuario : ''),
wrap: true, wrap: true,
sortable: true sortable: true
} }
@ -294,7 +326,7 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
width: '100px', width: '100px',
cell: (row: DTO2096NoParteVerificacion) => row.aduana, cell: (row: DTO2096NoParteVerificacion) => row.aduana,
wrap: true, wrap: true,
sortable: true, sortable: true
}, },
{ {
name: 'Pedimento', name: 'Pedimento',
@ -305,7 +337,6 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
} }
] ]
const openLink = (item: string) => { const openLink = (item: string) => {
window.open('https://www.amazon.com/dp/' + item) window.open('https://www.amazon.com/dp/' + item)
} }
@ -315,7 +346,7 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
if (Id === 0) return NoAsignado if (Id === 0) return NoAsignado
else if (Data.length) { else if (Data.length) {
const Usuario = Data.filter((item) => item.idUsuario === Id) const Usuario = Data.filter((item) => item.idUsuario === Id)
return Usuario ? Usuario[0].nombre : NoAsignado return Usuario.length ? Usuario[0].nombre : NoAsignado
} }
return NoAsignado return NoAsignado
} }
@ -396,6 +427,7 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
} }
AmazonDS.NoPartesGet(Search) AmazonDS.NoPartesGet(Search)
.then((response) => { .then((response) => {
console.log(response.data)
dispatch(populateNoPartes(response.data)) dispatch(populateNoPartes(response.data))
}) })
.catch((e: Error) => { .catch((e: Error) => {
@ -417,11 +449,36 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
AmazonDS.NoPartesUpdate(data) AmazonDS.NoPartesUpdate(data)
.then((response) => { .then((response) => {
dispatch(updateNoPartes(response.data)) dispatch(updateNoPartes(response.data))
setHeader('Informativo')
setMsg('La informacion se guardo correctamente')
setShowMsg(true)
}) })
.catch((e: Error) => { .catch(function (error) {
setHeader('Error') console.log(error.toJSON())
setMsg('Ocurrio un error: ' + e) if (error.message == 'Request failed with status code 400') {
setHeader('Error')
setMsg('Fraccion no valida!')
setShowMsg(true)
}
return
})
}
const deleteNoParte = () => {
AmazonDS.DeleteNoParte(IDParte)
.then((response) => {
dispatch(deleteNoPartes(IDParte))
setHeader('Informativo')
setMsg('La informacion se guardo correctamente')
setShowMsg(true) setShowMsg(true)
})
.catch(function (error) {
console.log(error.toJSON())
if (error.message == 'Request failed with status code 400') {
setHeader('Error')
setMsg('Fraccion no valida!')
setShowMsg(true)
}
return return
}) })
} }
@ -616,26 +673,26 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
<Modal.Title>No Parte: {Parte}</Modal.Title> <Modal.Title>No Parte: {Parte}</Modal.Title>
</Modal.Header> </Modal.Header>
<Modal.Body> <Modal.Body>
{/* <div style={{ height: '400px', overflow: 'scroll' }}> */} {/* <div style={{ height: '400px', overflow: 'scroll' }}> */}
<Row style={{ paddingTop: '15px' }}> <Row style={{ paddingTop: '15px' }}>
<Col xs={12}> <Col xs={12}>
<DataTable <DataTable
noHeader noHeader
fixedHeaderScrollHeight="400px" fixedHeaderScrollHeight="400px"
defaultSortFieldId={'id'} defaultSortFieldId={'id'}
defaultSortAsc={true} defaultSortAsc={true}
pagination pagination
highlightOnHover highlightOnHover
striped={true} striped={true}
dense={true} dense={true}
columns={colsNoPartesLOG} columns={colsNoPartesLOG}
data={NoParteLOG.filter(function (el) { data={NoParteLOG.filter(function (el) {
return el.id > 0 return el.id > 0
})} })}
/> />
</Col> </Col>
</Row> </Row>
{/* </div> */} {/* </div> */}
</Modal.Body> </Modal.Body>
</Modal> </Modal>
@ -651,27 +708,62 @@ export default function AmazonNoPartes(props: IAmazonNoPartesProps) {
<Modal.Title>No Parte: {Search}</Modal.Title> <Modal.Title>No Parte: {Search}</Modal.Title>
</Modal.Header> </Modal.Header>
<Modal.Body> <Modal.Body>
<Row style={{ paddingTop: '15px' }}> <Row style={{ paddingTop: '15px' }}>
<Col xs={12}>
<DataTable
noHeader
fixedHeaderScrollHeight="400px"
defaultSortFieldId={'id'}
defaultSortAsc={true}
pagination
highlightOnHover
striped={true}
dense={true}
columns={colsNoPartesVerificacion}
data={DataNoParteVerificacion.filter(function (el) {
return el
})}
/>
</Col>
</Row>
{/* </div> */}
</Modal.Body>
</Modal>
<Modal
show={ShowModalDelete}
onHide={() => {
setShowModalDelete(false)
}}
size={'sm'}
dialogClassName={'modal-50w'}
>
<Modal.Header>
<Modal.Title>
<Row>
<Col xs={12}> <Col xs={12}>
<DataTable <Alert variant="warning">
noHeader <h3>¿Esta seguro de eliminar el no parte: {Parte}</h3>
fixedHeaderScrollHeight="400px" </Alert>
defaultSortFieldId={'id'}
defaultSortAsc={true}
pagination
highlightOnHover
striped={true}
dense={true}
columns={colsNoPartesVerificacion}
data={DataNoParteVerificacion.filter(function (el) {
return el
})}
/>
</Col> </Col>
</Row> </Row>
{/* </div> */} </Modal.Title>
</Modal.Header>
<Modal.Body>
<Row style={{ paddingTop: '15px' }}>
<Col></Col>
<Col xs={5}>
<Button variant={'danger'} onClick={()=>{deleteNoParte()}}>Elimina</Button>
</Col>
<Col xs={5}>
<Button variant={'secondary'} onClick={()=>{setShowModalDelete(false)}}>Salir</Button>
</Col>
<Col></Col>
</Row>
{/* </div> */}
</Modal.Body> </Modal.Body>
</Modal> </Modal>
<MsgInformativo <MsgInformativo
show={show} show={show}
msg={msg} msg={msg}

@ -161,6 +161,13 @@ export default function RptAmazonFinishedClasificationInvoices(
}) })
} }
function getReceiver(Cadena: string, char1: string[1], char2: string[1]) {
return Cadena.slice(
Cadena.indexOf(char1) + 1,
Cadena.lastIndexOf(char2),
);
}
return ( return (
<div> <div>
<Card> <Card>
@ -195,6 +202,7 @@ export default function RptAmazonFinishedClasificationInvoices(
<th style={{ width: '50px' }}></th> <th style={{ width: '50px' }}></th>
<th style={{ width: '80px' }}>Commercial Invoice Date</th> <th style={{ width: '80px' }}>Commercial Invoice Date</th>
<th style={{ width: '300px' }}>Invoice Number</th> <th style={{ width: '300px' }}>Invoice Number</th>
<th style={{ width: '80px' }}>Receiver</th>
<th style={{ width: '100px' }}>Incoterms</th> <th style={{ width: '100px' }}>Incoterms</th>
<th style={{ textAlign: 'center' }}>HAWB</th> <th style={{ textAlign: 'center' }}>HAWB</th>
<th>Qty Unit of measure</th> <th>Qty Unit of measure</th>
@ -300,6 +308,13 @@ export default function RptAmazonFinishedClasificationInvoices(
<td style={{ width: '300px' }}> <td style={{ width: '300px' }}>
{MasterData.invoiceNumber} {MasterData.invoiceNumber}
</td> </td>
<td style={{ width: '80px', textAlign:'center' }}>
{mInvoices
.filter((value) => value.id === MasterData.id)
.map((row) => {
return getReceiver(row.detail[0].amazonShipmentReferenceId,'_','_')
})}
</td>
<td style={{ width: '100px', textAlign: 'center' }}> <td style={{ width: '100px', textAlign: 'center' }}>
{MasterData.incoterms} {MasterData.incoterms}
</td> </td>

@ -4,6 +4,7 @@ import {
Button, Button,
Card, Card,
Col, Col,
Form,
FormCheck, FormCheck,
Modal, Modal,
Row, Row,
@ -35,6 +36,8 @@ import { MFileManager } from '../../../../../Utils/MFileManager/MFileManager'
import { AiFillWarning } from 'react-icons/ai' import { AiFillWarning } from 'react-icons/ai'
import { PrioritySelector } from '../PrioritySelector/PrioritySelector' import { PrioritySelector } from '../PrioritySelector/PrioritySelector'
import IFileManager from '../../../../../../Interfaces/Utils/IFileManager' import IFileManager from '../../../../../../Interfaces/Utils/IFileManager'
import { VscHubot } from 'react-icons/vsc'
import { populateCatConcetosConsultas } from '../../../../../../store/features/Clientes/2096/AmazonCatConceptosConsulta'
export interface IRtpAmazonPendingInvoicesProps {} export interface IRtpAmazonPendingInvoicesProps {}
@ -64,6 +67,7 @@ export default function RtpAmazonPendingInvoices(
const [WaitingMessage, setWaitingMessage] = useState('Generado...') const [WaitingMessage, setWaitingMessage] = useState('Generado...')
const [ShowModal, setShowModal] = useState(false) const [ShowModal, setShowModal] = useState(false)
const [ShowModalW, setShowModalW] = useState(false) const [ShowModalW, setShowModalW] = useState(false)
const [BOTEnabled, setBOTEnabled] = useState(false)
const [msg, setMsg] = useState('') const [msg, setMsg] = useState('')
const msgColor = 'primary' const msgColor = 'primary'
@ -78,8 +82,19 @@ export default function RtpAmazonPendingInvoices(
}) })
} }
const loadCatalogoTipoConsultas = async () => {
DSAmazon.CatConceptosConsultaGET()
.then((response) => {
dispatch(populateCatConcetosConsultas(response.data))
})
.catch((e: Error) => {
alert('Ocurrio un error' + e.message.toString())
})
}
useEffect(() => { useEffect(() => {
loadReport() loadReport()
loadCatalogoTipoConsultas()
}, []) }, [])
const check4Updates = (IDInvoice: number) => { const check4Updates = (IDInvoice: number) => {
@ -121,16 +136,10 @@ export default function RtpAmazonPendingInvoices(
const descargaArchivoExcepciones = () => { const descargaArchivoExcepciones = () => {
setShowModalW(false) setShowModalW(false)
setWaitingMessage('Archivo de excepciones') setWaitingMessage('Archivo de excepciones')
setWaitingDialog(true) /* setWaitingDialog(true)*/
DSAmazon.ExceptionsFileAmazonGET(IDFactura) /* DSAmazon.ExceptionsFileAmazonGET(IDFactura)
.then((response: any) => { .then((response: any) => {
if (response.status === 200) { if (response.status === 200) {*/
/* const url = window.URL.createObjectURL(new Blob([response.data]))
const link = document.createElement('a')
link.href = url
link.setAttribute('download', 'Excepciones ' + Factura + '.xlsx')
document.body.appendChild(link)
link.click() */
DSAmazon.EnviaEsperaRespuestaAmazon(IDFactura) DSAmazon.EnviaEsperaRespuestaAmazon(IDFactura)
.then((response) => { .then((response) => {
loadReport() loadReport()
@ -145,14 +154,14 @@ export default function RtpAmazonPendingInvoices(
setShowMsg(true) setShowMsg(true)
return return
}) })
} // }
}) /* })
.catch((e: Error) => { .catch((e: Error) => {
setHeader('Error') setHeader('Error')
setMsg('Ocurrio un error') setMsg('Ocurrio un error')
setShowMsg(true) setShowMsg(true)
return return
}) }) */
} }
const descargaPantillaPartes = () => { const descargaPantillaPartes = () => {
@ -304,6 +313,36 @@ export default function RtpAmazonPendingInvoices(
}) })
} }
const RunBOT = (row: I2096Headers) => {
if (!BOTEnabled || row.max) {
toggleExpandRow(row)
return false
}
if (BOTEnabled) {
setWaitingMessage('BOT trabajando...')
setWaitingDialog(true)
DSAmazon.ClasificacionBOT(row.id)
.then((response) => {
if (response.data) {
setIDFactura(0)
setFactura('')
setShowModalInvoiceFile(false)
setWaitingDialog(false)
//loadReport()
toggleExpandRow(row)
return
}
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error')
setShowModalDeleteInvoice(false)
setWaitingDialog(false)
return
})
}
}
return ( return (
<div> <div>
<Card> <Card>
@ -317,7 +356,30 @@ export default function RtpAmazonPendingInvoices(
CLASIFICACION : facturas pendientes CLASIFICACION : facturas pendientes
</Card.Title> </Card.Title>
</Col> </Col>
<Col xs={5}></Col> <Col xs={3}></Col>
<Col xs={2}>
{/* <Row>
<Col xs={4} style={{ textAlign: 'right' }}>
<IconContext.Provider
value={{ color: 'green', size: '65px' }}
>
<VscHubot />
</IconContext.Provider>
</Col>
<Col xs={8} style={{ textAlign: 'left', paddingTop: '25px' }}>
<Form.Check
type="switch"
id="custom-switch"
label="¿Aplica BOT?"
checked={BOTEnabled}
onChange={() => {
setBOTEnabled(!BOTEnabled)
}}
/>
</Col>
</Row> */}
<Form></Form>
</Col>
<Col xs={2}> <Col xs={2}>
<Alert <Alert
variant="primary" variant="primary"
@ -379,7 +441,7 @@ export default function RtpAmazonPendingInvoices(
<tr> <tr>
<th style={{ width: '50px' }}></th> <th style={{ width: '50px' }}></th>
<th style={{ width: '50px' }}>id</th> <th style={{ width: '50px' }}>id</th>
<th style={{ width: '50px', paddingRight:'20px' }}> <th style={{ width: '50px', paddingRight: '20px' }}>
<IconContext.Provider <IconContext.Provider
value={{ color: 'yellow', size: '20px' }} value={{ color: 'yellow', size: '20px' }}
> >
@ -389,7 +451,7 @@ export default function RtpAmazonPendingInvoices(
<th style={{ width: '50px' }}></th> <th style={{ width: '50px' }}></th>
<th style={{ width: '80px' }}>Commercial Invoice Date</th> <th style={{ width: '80px' }}>Commercial Invoice Date</th>
<th style={{ width: '300px' }}>Invoice Number</th> <th style={{ width: '300px' }}>Invoice Number</th>
<th style={{ width: '50px' }}>Name</th> <th style={{ width: '50px' }}>Receiver</th>
<th style={{ width: '100px' }}>Incoterms</th> <th style={{ width: '100px' }}>Incoterms</th>
<th style={{ width: '100px' }}>Qty Unit of measure</th> <th style={{ width: '100px' }}>Qty Unit of measure</th>
<th style={{ width: '100px' }}>Tot Qty</th> <th style={{ width: '100px' }}>Tot Qty</th>
@ -441,7 +503,8 @@ export default function RtpAmazonPendingInvoices(
} }
key={MasterData.id} key={MasterData.id}
onClick={() => { onClick={() => {
toggleExpandRow(MasterData) //toggleExpandRow(MasterData)
RunBOT(MasterData)
}} }}
> >
{MasterData.max === true ? ( {MasterData.max === true ? (
@ -459,10 +522,15 @@ export default function RtpAmazonPendingInvoices(
)} )}
</td> </td>
<td>{MasterData.id}</td> <td>{MasterData.id}</td>
<td style={{textAlign:'left'}}> <td style={{ textAlign: 'left' }}>
<PrioritySelector IDInvoice={MasterData.id} Priority={MasterData.urgente} canChange={['Clasificador lider', 'Administrador'].includes( <PrioritySelector
Perfil IDInvoice={MasterData.id}
)}/> Priority={MasterData.urgente}
canChange={[
'Clasificador lider',
'Administrador'
].includes(Perfil)}
/>
</td> </td>
<td> <td>
<FormCheck <FormCheck
@ -800,7 +868,9 @@ export default function RtpAmazonPendingInvoices(
return ( return (
<RtpAmazonPendingClasificationInvoicesDetail <RtpAmazonPendingClasificationInvoicesDetail
IDMaster={MasterData.id} IDMaster={MasterData.id}
Prioridad={MasterData.urgente} Prioridad={
MasterData.urgente
}
detail={detail} detail={detail}
Deshabilitado={ Deshabilitado={
detail.destinationHTSCode detail.destinationHTSCode
@ -937,6 +1007,13 @@ export default function RtpAmazonPendingInvoices(
</Modal.Header> </Modal.Header>
<Modal.Body> <Modal.Body>
<img src={loadingImg} style={{ height: '150px' }} alt="proccessing" /> <img src={loadingImg} style={{ height: '150px' }} alt="proccessing" />
{WaitingMessage.includes('BOT') ? (
<IconContext.Provider value={{ color: 'green', size: '65px' }}>
<VscHubot />
</IconContext.Provider>
) : (
''
)}
{WaitingMessage} {WaitingMessage}
</Modal.Body> </Modal.Body>
<Modal.Footer></Modal.Footer> <Modal.Footer></Modal.Footer>
@ -1017,8 +1094,9 @@ export default function RtpAmazonPendingInvoices(
Proceso={IDProcess} Proceso={IDProcess}
showPreview={0} showPreview={0}
canEdit={true} canEdit={true}
Leyenda="Seleccione las facturas de Amazon" onAppendMFM={function (Files: IFileManager[]): void { Leyenda="Seleccione las facturas de Amazon"
} } /> onAppendMFM={function (Files: IFileManager[]): void {}}
/>
</Col> </Col>
<Col></Col> <Col></Col>
</Row> </Row>

@ -186,7 +186,7 @@ export default function RtpAmazonPendingInvoivesDetail(
style={{ style={{
textAlign: 'center', textAlign: 'center',
cursor: 'pointer', cursor: 'pointer',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
onClick={() => openLink(props.detail.itemId)} onClick={() => openLink(props.detail.itemId)}
@ -196,7 +196,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'right', textAlign: 'right',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -205,7 +205,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'right', textAlign: 'right',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
> >
{props.detail.pedimentoDescription} {props.detail.pedimentoDescription}
@ -214,7 +214,7 @@ export default function RtpAmazonPendingInvoivesDetail(
style={{ style={{
textAlign: 'center', textAlign: 'center',
fontSize: '18px', fontSize: '18px',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
> >
&nbsp;&nbsp;{props.detail.destinationHTSCode} &nbsp;&nbsp;{props.detail.destinationHTSCode}
@ -222,7 +222,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -230,7 +230,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -247,7 +247,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -270,7 +270,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -287,7 +287,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -296,7 +296,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -305,7 +305,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'right', textAlign: 'right',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -314,7 +314,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'right', textAlign: 'right',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -323,7 +323,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'right', textAlign: 'right',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -332,7 +332,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -341,7 +341,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -350,7 +350,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -359,7 +359,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -369,7 +369,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -378,7 +378,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
className="DetailData" className="DetailData"
> >
@ -386,7 +386,7 @@ export default function RtpAmazonPendingInvoivesDetail(
</td> </td>
<td <td
style={{ style={{
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
> >
<OverlayTrigger <OverlayTrigger
@ -423,7 +423,7 @@ export default function RtpAmazonPendingInvoivesDetail(
</td> </td>
<td <td
style={{ style={{
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
> >
<OverlayTrigger <OverlayTrigger
@ -455,7 +455,7 @@ export default function RtpAmazonPendingInvoivesDetail(
<td <td
style={{ style={{
textAlign: 'center', textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff' backgroundColor: props.detail.checked ? props.detail.confirmaFraccion==5 ? '#F7E2D2' : '#E6EEF5' : '#ffffff'
}} }}
> >
<Form> <Form>

@ -2,6 +2,7 @@ import * as React from 'react'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { import {
Alert, Alert,
Badge,
Button, Button,
Card, Card,
Col, Col,
@ -33,11 +34,15 @@ import { MFileManager } from '../../../../../Utils/MFileManager/MFileManager'
import { setEmitFlags } from 'typescript' import { setEmitFlags } from 'typescript'
import DTO2096RELParteFactura from '../../../DTO/DTO2096RELParteFactura' import DTO2096RELParteFactura from '../../../DTO/DTO2096RELParteFactura'
import IFileManager from '../../../../../../Interfaces/Utils/IFileManager' import IFileManager from '../../../../../../Interfaces/Utils/IFileManager'
import { populateCatConcetosConsultas } from '../../../../../../store/features/Clientes/2096/AmazonCatConceptosConsulta'
export interface IRptPendingAnswerFromAmazonProps {} export interface IRptPendingAnswerFromAmazonProps {}
export default function RptPendingAnswerFromAmazon( export default function RptPendingAnswerFromAmazon(
props: IRptPendingAnswerFromAmazonProps props: IRptPendingAnswerFromAmazonProps
) { ) {
const mExceptionCode = useSelector(
(state: RootState) => state.AmazonCatConceptosConsulta.CatConcetosConsulta
)
const [Usuario, setUsuario] = useState(() => { const [Usuario, setUsuario] = useState(() => {
const stickyValue = window.localStorage.getItem('UserId') const stickyValue = window.localStorage.getItem('UserId')
return stickyValue !== null ? JSON.parse(stickyValue) : '' return stickyValue !== null ? JSON.parse(stickyValue) : ''
@ -57,6 +62,9 @@ export default function RptPendingAnswerFromAmazon(
const [Data, setData] = useState<DTO2096PerfilesParecidos[]>([]) const [Data, setData] = useState<DTO2096PerfilesParecidos[]>([])
const [ResumeData, setResumeData] = useState<DTO2096RELParteFactura[]>([]) const [ResumeData, setResumeData] = useState<DTO2096RELParteFactura[]>([])
const [AmazonAnswerFile, setAmazonAnswerFile] = useState<IFileManager[]>([]) const [AmazonAnswerFile, setAmazonAnswerFile] = useState<IFileManager[]>([])
const [DistinctExceptionCode, setDistinctExceptionCode] = useState<number[]>(
[]
)
const [header, setHeader] = useState('') const [header, setHeader] = useState('')
const [IDFactura, setIDFactura] = useState(0) const [IDFactura, setIDFactura] = useState(0)
const [Factura, setFactura] = useState('') const [Factura, setFactura] = useState('')
@ -91,6 +99,39 @@ export default function RptPendingAnswerFromAmazon(
}) })
} }
const loadDistinctExceptionCode = (id: number) => {
DSAmazon.InvoiceDistinctExceptionCodeGet(id)
.then((response) => {
setDistinctExceptionCode(response.data)
})
.catch((e: Error) => {
alert('Ocurrio un error' + e.message.toString())
})
}
const getExceptionCode = (id: number) => {
// console.log(mExceptionCode)
let code = mExceptionCode.filter((a) => {
if (a.id == id) {
return a
}
})
return code.length ? code[0].siglas : ''
}
const loadExceptionCodeCatalog = () => {
DSAmazon.CatConceptosConsultaGET()
.then((response) => {
dispatch(populateCatConcetosConsultas(response.data))
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error: ' + e)
setShowMsg(true)
return
})
}
const generateResume = (id: number) => { const generateResume = (id: number) => {
DSAmazon.RELParteFacturasGET(id) DSAmazon.RELParteFacturasGET(id)
.then((response) => { .then((response) => {
@ -104,17 +145,29 @@ export default function RptPendingAnswerFromAmazon(
}) })
} }
const downloadExceptionsFile = (id: number, Factura: string) => { const downloadExceptionsFile = (
setWaitingDialog(true) id: number,
generateResume(id) Factura: string,
setFactura(Factura) ExceptionCode: number
DSAmazon.ExceptionsFileAmazonGET(id) ) => {
//setWaitingDialog(true)
/* loadDistinctExceptionCode(id)
generateResume(id) */
//setFactura(Factura)
DSAmazon.ExceptionsFileAmazonGET(id, ExceptionCode)
.then((response: any) => { .then((response: any) => {
if (response.status === 200) { if (response.status === 200) {
const url = window.URL.createObjectURL(new Blob([response.data])) const url = window.URL.createObjectURL(new Blob([response.data]))
const link = document.createElement('a') const link = document.createElement('a')
link.href = url link.href = url
link.setAttribute('download', 'Excepciones ' + Factura + '.xlsx') link.setAttribute(
'download',
'Excepciones ' +
Factura +
'_' +
getExceptionCode(ExceptionCode) +
'.xlsx'
)
document.body.appendChild(link) document.body.appendChild(link)
link.click() link.click()
} }
@ -128,15 +181,22 @@ export default function RptPendingAnswerFromAmazon(
}) })
} }
const loadInvoiceData = (id: number) => {
setWaitingDialog(true)
loadDistinctExceptionCode(id)
generateResume(id)
}
useEffect(() => { useEffect(() => {
loadReport() loadReport()
loadProfiles() loadProfiles()
loadExceptionCodeCatalog()
}, []) }, [])
const check4Updates = (IDInvoice: number) => { const check4Updates = (IDInvoice: number) => {
DSAmazon.SETInvoiceDetailRevalidateParts(IDInvoice) DSAmazon.SETInvoiceDetailRevalidateParts(IDInvoice)
.then((response) => { .then((response) => {
DSAmazon.AmazonInvoiceGET(IDInvoice) DSAmazon.AmazonInvoiceGET(IDInvoice)
.then((response) => { .then((response) => {
//console.log(JSON.stringify(response.data)) //console.log(JSON.stringify(response.data))
dispatch(updateInvoice(response.data[0])) dispatch(updateInvoice(response.data[0]))
@ -188,9 +248,10 @@ export default function RptPendingAnswerFromAmazon(
.map((element) => { .map((element) => {
let newElt = Object.assign({}, element) // copies element let newElt = Object.assign({}, element) // copies element
return newElt.detail.filter( return newElt.detail.filter(
(child) => child.idHeader === IDMaster && !child.autorizado (child) => child.idHeader === IDMaster && child.autorizado
) )
}) })
return Exceptions.length ? Exceptions[0].length : 0 return Exceptions.length ? Exceptions[0].length : 0
} }
@ -242,23 +303,23 @@ export default function RptPendingAnswerFromAmazon(
const ApplyAnswerFiles2Invoice = () => { const ApplyAnswerFiles2Invoice = () => {
setWaitingMessage('Generando...') setWaitingMessage('Generando...')
const Filenames = AmazonAnswerFile.map(element => element.nombreArchivo); const Filenames = AmazonAnswerFile.map((element) => element.nombreArchivo)
setWaitingDialog(true) setWaitingDialog(true)
DSAmazon.ApplyAnswerFile2Invoice(Filenames) DSAmazon.ApplyAnswerFile2Invoice(Filenames)
.then((response) => { .then((response) => {
loadReport() loadReport()
setAmazonAnswerFile([]) setAmazonAnswerFile([])
setWaitingDialog(false) setWaitingDialog(false)
setShowModal(false) setShowModal(false)
}) })
.catch((e: Error) => { .catch((e: Error) => {
setAmazonAnswerFile([]) setAmazonAnswerFile([])
setIDFactura(0) setIDFactura(0)
setHeader('Error') setHeader('Error')
setMsg('Ocurrio un error ' + e.toString()) setMsg('Ocurrio un error ' + e.toString())
setShowMsg(true) setShowMsg(true)
return return
}) })
} }
return ( return (
@ -305,7 +366,7 @@ export default function RptPendingAnswerFromAmazon(
<th style={{ width: '50px' }}></th> <th style={{ width: '50px' }}></th>
<th style={{ width: '80px' }}>Commercial Invoice Date</th> <th style={{ width: '80px' }}>Commercial Invoice Date</th>
<th style={{ width: '300px' }}>Invoice Number</th> <th style={{ width: '300px' }}>Invoice Number</th>
<th style={{ width: '50px' }}>Name</th> <th style={{ width: '50px' }}>Receiver</th>
<th style={{ width: '100px' }}>Incoterms</th> <th style={{ width: '100px' }}>Incoterms</th>
<th style={{ width: '100px' }}>Qty Unit of measure</th> <th style={{ width: '100px' }}>Qty Unit of measure</th>
<th style={{ width: '100px' }}>Tot Qty</th> <th style={{ width: '100px' }}>Tot Qty</th>
@ -378,12 +439,16 @@ export default function RptPendingAnswerFromAmazon(
<td> <td>
{existsExeptions(MasterData.id) > 0 ? ( {existsExeptions(MasterData.id) > 0 ? (
<div <div
onClick={() => onClick={() => {
downloadExceptionsFile( /* downloadExceptionsFile(
MasterData.id, MasterData.id,
MasterData.invoiceNumber MasterData.invoiceNumber
) ) */
} setIDFactura(MasterData.id)
setFactura(MasterData.invoiceNumber)
loadInvoiceData(MasterData.id)
//setWaitingDialog(true)
}}
title="Archivo de excepciones" title="Archivo de excepciones"
> >
<IconContext.Provider <IconContext.Provider
@ -810,10 +875,12 @@ export default function RptPendingAnswerFromAmazon(
Proceso={IDProcess} Proceso={IDProcess}
showPreview={3} showPreview={3}
canEdit={true} canEdit={true}
Leyenda="Sube archivos de respuesta de Amazon" onAppendMFM={function (Files: IFileManager[]): void { Leyenda="Sube archivos de respuesta de Amazon"
onAppendMFM={function (Files: IFileManager[]): void {
setAmazonAnswerFile(Files) setAmazonAnswerFile(Files)
setConfirmApplyAnswerFile(true) setConfirmApplyAnswerFile(true)
}}/> }}
/>
</Col> </Col>
<Col></Col> <Col></Col>
</Row> </Row>
@ -838,17 +905,18 @@ export default function RptPendingAnswerFromAmazon(
variant={'danger'} variant={'danger'}
style={{ textAlign: 'center' }} style={{ textAlign: 'center' }}
> >
<h4>Desea aplicar el archivo de respuesta de Amazon?</h4> <h4>Desea aplicar el archivo de respuesta de Amazon?</h4>
</Alert> </Alert>
</Col> </Col>
</Row> </Row>
<Row style={{paddingTop:'30px'}}> <Row style={{ paddingTop: '30px' }}>
<Col xs={12}>&nbsp;</Col> <Col xs={12}>&nbsp;</Col>
</Row> </Row>
<Row style={{ paddingTop: '15px' }}> <Row style={{ paddingTop: '15px' }}>
<Col xs={6} style={{ textAlign: 'center' }}> <Col xs={6} style={{ textAlign: 'center' }}>
<Button <Button
variant="secondary" size="lg" variant="secondary"
size="lg"
onClick={() => { onClick={() => {
setShowModalAnswerFile(false) setShowModalAnswerFile(false)
setConfirmApplyAnswerFile(false) setConfirmApplyAnswerFile(false)
@ -858,8 +926,9 @@ export default function RptPendingAnswerFromAmazon(
</Button> </Button>
</Col> </Col>
<Col xs={6} style={{ textAlign: 'center' }}> <Col xs={6} style={{ textAlign: 'center' }}>
<Button <Button
variant="danger" size="lg" variant="danger"
size="lg"
onClick={() => { onClick={() => {
setShowModalAnswerFile(false) setShowModalAnswerFile(false)
ApplyAnswerFiles2Invoice() ApplyAnswerFiles2Invoice()
@ -889,7 +958,7 @@ export default function RptPendingAnswerFromAmazon(
<Modal.Title></Modal.Title> <Modal.Title></Modal.Title>
</Modal.Header> </Modal.Header>
<Modal.Body> <Modal.Body>
<img {/* <img
src={loadingImg} src={loadingImg}
style={{ style={{
height: WaitingMessage === 'Generando...' ? '150px' : '0px', height: WaitingMessage === 'Generando...' ? '150px' : '0px',
@ -897,8 +966,31 @@ export default function RptPendingAnswerFromAmazon(
}} }}
alt="proccessing" alt="proccessing"
/> />
{WaitingMessage} {WaitingMessage} */}
<div style={{ overflow: 'auto' }}> <div>
<Row>
{DistinctExceptionCode
? DistinctExceptionCode.map((code) => {
return (
<Col style={{ textAlign: 'center' }}>
<Badge
bg="primary"
style={{ cursor: 'pointer' }}
onClick={() => {
downloadExceptionsFile(IDFactura, Factura, code)
}}
>
<h6>{getExceptionCode(code)}</h6>
</Badge>
</Col>
)
})
: ''}
</Row>
</div>
<div
style={{ overflow: 'auto', height: '500px', paddingTop: '15px' }}
>
<table> <table>
<tr> <tr>
<td style={{ backgroundColor: '#6095BF', color: '#FFFFFF' }}> <td style={{ backgroundColor: '#6095BF', color: '#FFFFFF' }}>

@ -1,4 +1,3 @@
import * as React from 'react'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { import {
Alert, Alert,
@ -8,13 +7,10 @@ import {
FormCheck, FormCheck,
Modal, Modal,
OverlayTrigger, OverlayTrigger,
Popover,
Row, Row,
Tooltip Tooltip
} from 'react-bootstrap' } from 'react-bootstrap'
import { IconContext } from 'react-icons' import { IconContext } from 'react-icons'
import { FaCheckCircle, FaQuestionCircle } from 'react-icons/fa'
import { ImCross } from 'react-icons/im'
import { MsgInformativo } from '../../../../../Utils/Toast/msgInformativo' import { MsgInformativo } from '../../../../../Utils/Toast/msgInformativo'
import { ComboDescripcion } from '../../../Components/ComboSelect/ComboDescripcion' import { ComboDescripcion } from '../../../Components/ComboSelect/ComboDescripcion'
import { ComboFraccion } from '../../../Components/ComboSelect/ComboFraccion' import { ComboFraccion } from '../../../Components/ComboSelect/ComboFraccion'
@ -46,13 +42,14 @@ export default function RptPendingAnswerFromAmazonDetail(
const [ShowModal, setShowModal] = useState(false) const [ShowModal, setShowModal] = useState(false)
const [EstatusSwith, setEstatusSwitch] = useState(props.detail.autorizado) const [EstatusSwith, setEstatusSwitch] = useState(props.detail.autorizado)
const [Fraccion, setFraccion] = useState(props.detail.fraccionGEMCO) const [Fraccion, setFraccion] = useState(props.detail.fraccionGEMCO)
const [TipoConsulta, setTipoConsulta] = useState(props.detail.tipoConsulta)
const [UserChanged, setUserChanged] = useState(false) const [UserChanged, setUserChanged] = useState(false)
const [DescripcionGEMCO, setDescripcionGEMCO] = useState( const [DescripcionGEMCO, setDescripcionGEMCO] = useState(
props.detail.descripcionGEMCO props.detail.descripcionGEMCO
) )
const [header, setHeader] = useState('') const [header, setHeader] = useState('')
const [show, setShowMsg] = useState(false) const [show, setShowMsg] = useState(false)
const [Show, setShow] = useState(false) //const [Show, setShow] = useState(false)
const [msg, setMsg] = useState('') const [msg, setMsg] = useState('')
const [CumplimientoNormativo, setCumplimientoNormativo] = useState( const [CumplimientoNormativo, setCumplimientoNormativo] = useState(
props.detail.cumplimientoNormativo ? props.detail.cumplimientoNormativo : '' props.detail.cumplimientoNormativo ? props.detail.cumplimientoNormativo : ''
@ -142,41 +139,36 @@ export default function RptPendingAnswerFromAmazonDetail(
return return
} }
DSAmazon.ValidaFraccionGET(Fraccion) DSAmazon.ValidaFraccionGET(Fraccion)
.then((response) => { .then((response) => {
if (response.data.respuesta === 'Si') { if (response.data.respuesta === 'Si') {
const data: DTO2096FraccionDescripcion = { const data: DTO2096FraccionDescripcion = {
id: id, id: id,
fraccion: Fraccion, fraccion: Fraccion,
cumplimientoNormativo: CumplimientoNormativo, tipoConsulta: TipoConsulta,
comentarios: Comentarios, cumplimientoNormativo: CumplimientoNormativo,
descripcionGEMCO: DescripcionGEMCO comentarios: Comentarios,
descripcionGEMCO: DescripcionGEMCO
}
DSAmazon.AutorizaItemFacturaAmazon(data)
.then((response) => {
editArray(id, !props.detail.autorizado)
setShowModal(false)
})
.catch((e: Error) => {})
} else {
alert(
'Esa fraccion no existe, favor de verificarla antes de guardarla'
)
return
} }
DSAmazon.AutorizaItemFacturaAmazon(data) })
.then((response) => { .catch((e: Error) => {
editArray(id, !props.detail.autorizado) setHeader('Error')
setShowModal(false) setMsg('Ocurrio un error' + e.message.toString())
}) setShowMsg(true)
.catch((e: Error) => {})
} else {
alert(
'Esa fraccion no existe, favor de verificarla antes de guardarla'
)
return return
} })
})
.catch((e: Error) => {
setHeader('Error')
setMsg(
'Ocurrio un error' + e.message.toString()
)
setShowMsg(true)
return
})
} }
} }
useEffect(() => { useEffect(() => {
@ -184,7 +176,7 @@ export default function RptPendingAnswerFromAmazonDetail(
autoriceItem(props.detail.id) autoriceItem(props.detail.id)
}, [EstatusSwith, UserChanged]) }, [EstatusSwith, UserChanged])
const ColorSET = (value: number, mode: number) => { /* const ColorSET = (value: number, mode: number) => {
switch (mode) { switch (mode) {
case 1: { case 1: {
// Background color // Background color
@ -208,7 +200,7 @@ export default function RptPendingAnswerFromAmazonDetail(
break break
} }
} }
} } */
return ( return (
<> <>
@ -263,8 +255,7 @@ export default function RptPendingAnswerFromAmazonDetail(
textAlign: 'center' textAlign: 'center'
}} }}
className="DetailData" className="DetailData"
> ></td>
</td>
<td <td
style={{ style={{
textAlign: 'center' textAlign: 'center'
@ -299,14 +290,6 @@ export default function RptPendingAnswerFromAmazonDetail(
props.detail.validaFraccionOriginal === 0 props.detail.validaFraccionOriginal === 0
? '#FFFAF2 ' ? '#FFFAF2 '
: '#E5F7B6', : '#E5F7B6',
/* border:
props.detail.validaFraccionOriginal === 0
? '2px solid #F9A721'
: '2px solid green',
color:
props.detail.validaFraccionOriginal === 0
? '#5923F6'
: '#000000', */
border: '2px solid #000000', border: '2px solid #000000',
color: '@000000', color: '@000000',
width: '135px', width: '135px',
@ -410,19 +393,11 @@ export default function RptPendingAnswerFromAmazonDetail(
> >
{props.detail.actualUnitCostMonetaryAmount} {props.detail.actualUnitCostMonetaryAmount}
</td> </td>
<td <td className="DetailData">
/* style={{visibility: EstatusSwith ? 'hidden' : 'visible'}} */
className="DetailData"
>
<FormCheck <FormCheck
className="form-check form-switch form-control-lg" className="form-check form-switch form-control-lg"
id="switchEnabled" id="switchEnabled"
type="switch" type="switch"
/* disabled={
props.detail.fraccionGEMCO ===
props.detail.destinationHTSCode.replaceAll('.', '')
} */
/* disabled={EstatusSwith} */
disabled={false} disabled={false}
checked={EstatusSwith && props.detail.autorizado} checked={EstatusSwith && props.detail.autorizado}
onChange={() => { onChange={() => {
@ -433,12 +408,7 @@ export default function RptPendingAnswerFromAmazonDetail(
label="" label=""
/> />
</td> </td>
<td <td>
/* style={{
visibility:
CumplimientoNormativo.length === 0 ? 'hidden' : 'visible'
}} */
>
<OverlayTrigger <OverlayTrigger
placement="bottom" placement="bottom"
overlay={ overlay={
@ -460,12 +430,7 @@ export default function RptPendingAnswerFromAmazonDetail(
)} )}
</OverlayTrigger> </OverlayTrigger>
</td> </td>
<td <td>
/* style={{
visibility:
CumplimientoNormativo.length === 0 ? 'hidden' : 'visible'
}} */
>
<OverlayTrigger <OverlayTrigger
placement="bottom" placement="bottom"
overlay={<Tooltip id="button-tooltip-2">{Comentarios}</Tooltip>} overlay={<Tooltip id="button-tooltip-2">{Comentarios}</Tooltip>}

@ -144,18 +144,6 @@ export default function RptConsultaTrafico(props: IRptConsultaTraficoProps) {
if (Obj.max) */ check4Updates(IDInvoice) if (Obj.max) */ check4Updates(IDInvoice)
} }
/* const toggleInvoice = (id: number) => {
if (!Invoices.includes(id)) {
Invoices.push(id)
} else {
setInvoices(
Invoices.filter(function (el) {
return el != id
})
)
}
}*/
function getReceiver(Cadena: string, char1: string[1], char2: string[1]) { function getReceiver(Cadena: string, char1: string[1], char2: string[1]) {
return Cadena.slice(Cadena.indexOf(char1) + 1, Cadena.lastIndexOf(char2)) return Cadena.slice(Cadena.indexOf(char1) + 1, Cadena.lastIndexOf(char2))
} }
@ -191,9 +179,6 @@ export default function RptConsultaTrafico(props: IRptConsultaTraficoProps) {
<th></th> <th></th>
<th style={{ width: '50px' }}>id</th> <th style={{ width: '50px' }}>id</th>
<th style={{ width: '50px' }}></th> <th style={{ width: '50px' }}></th>
{/*<th style={{ width: '50px' }}>PDF</th>
<th style={{ width: '50px' }}>Facturas</th>
<th style={{ width: '50px' }}>Partidas</th> */}
<th style={{ width: '100px' }}>Referencia</th> <th style={{ width: '100px' }}>Referencia</th>
<th style={{ width: '80px' }}>Commercial Invoice Date</th> <th style={{ width: '80px' }}>Commercial Invoice Date</th>
<th style={{ width: '250px' }}>Invoice Number</th> <th style={{ width: '250px' }}>Invoice Number</th>

@ -23,6 +23,7 @@ import {
import { MsgInformativo } from '../../../../Utils/Toast/msgInformativo' import { MsgInformativo } from '../../../../Utils/Toast/msgInformativo'
import { AiFillFileExcel } from 'react-icons/ai' import { AiFillFileExcel } from 'react-icons/ai'
import { IconContext } from 'react-icons' import { IconContext } from 'react-icons'
import { BsSearch, BsFileEarmarkExcel } from 'react-icons/bs'
import { BsChevronDown, BsChevronRight, BsFilePdfFill } from 'react-icons/bs' import { BsChevronDown, BsChevronRight, BsFilePdfFill } from 'react-icons/bs'
import { FaAmazon } from 'react-icons/fa' import { FaAmazon } from 'react-icons/fa'
import loadingImg from '../../../../../images/ajaxloader.gif' import loadingImg from '../../../../../images/ajaxloader.gif'
@ -60,58 +61,75 @@ export default function RptAmazonFacturasPagadas(
const msgColor = 'primary' const msgColor = 'primary'
const columnsConcepts = [ const columnsConcepts = [
{ {
name: 'Factura', name: <div style={{ textAlign: 'center' }}>Factura</div>,
width: '350px',
width: '300px',
selector: (row: DTO2096RptFacturasPagadas) => row.factura, selector: (row: DTO2096RptFacturasPagadas) => row.factura,
sortable: true sortable: true
}, },
{ {
name: 'Pedimento', name: <div style={{ textAlign: 'center' }}>Pedimento</div>,
width: '120px', width: '120px',
selector: (row: DTO2096RptFacturasPagadas) => row.pedimento, selector: (row: DTO2096RptFacturasPagadas) => row.pedimento,
sortable: true sortable: true
}, },
{ {
name: 'Fecha pago', name: <div style={{ textAlign: 'center' }}>Fecha Pago</div>,
width: '120px', width: '120px',
selector: (row: DTO2096RptFacturasPagadas) => row.fechaPago.substring(0,10), selector: (row: DTO2096RptFacturasPagadas) =>
row.fechaPago.substring(0, 10),
sortable: true sortable: true
}, },
{ {
name: 'Clave', name: <div style={{ textAlign: 'center' }}>Clave</div>,
width: '80px', width: '80px',
selector: (row: DTO2096RptFacturasPagadas) => row.clave, selector: (row: DTO2096RptFacturasPagadas) => row.clave,
sortable: true sortable: true
}, },
{ {
name: 'Tipo Op', name: <div style={{ textAlign: 'center' }}>Tipo Operacion</div>,
width: '120px', width: '120px',
selector: (row: DTO2096RptFacturasPagadas) => row.tipoOp, selector: (row: DTO2096RptFacturasPagadas) => row.tipoOp,
sortable: true sortable: true
}, },
{ {
name: 'Valor Dolares', name: <div style={{ textAlign: 'center' }}>Valor Dolares</div>,
width: '130px', width: '130px',
selector: (row: DTO2096RptFacturasPagadas) => row.valorDolares, selector: (row: DTO2096RptFacturasPagadas) => row.valorDolares,
sortable: true sortable: true
}, },
{ {
name: 'Valor Aduana', name: <div style={{ textAlign: 'center' }}>Valor Aduana </div>,
width: '130px', width: '130px',
selector: (row: DTO2096RptFacturasPagadas) => row.valorAduana, selector: (row: DTO2096RptFacturasPagadas) => row.valorAduana,
sortable: true sortable: true
}, },
{ {
name: 'Razon Social', name: <div style={{ textAlign: 'center' }}>Razon Social</div>,
width: '350px', width: '350px',
selector: (row: DTO2096RptFacturasPagadas) => row.razonSocial, selector: (row: DTO2096RptFacturasPagadas) => row.razonSocial,
sortable: true sortable: true
}, },
{ {
name: 'Aduana', name: <div style={{ textAlign: 'center' }}>Aduana</div>,
width: '550px',
width: '100px',
selector: (row: DTO2096RptFacturasPagadas) => row.aduana, selector: (row: DTO2096RptFacturasPagadas) => row.aduana,
sortable: false sortable: false
},
{
name: <div style={{ textAlign: 'center' }}>Piezas</div>,
width: '100px',
selector: (row: DTO2096RptFacturasPagadas) => row.piezas,
sortable: false
} }
] ]
@ -137,7 +155,10 @@ export default function RptAmazonFacturasPagadas(
exportExcel(Data, 'Reporte de facturas pagadas de Amazon') exportExcel(Data, 'Reporte de facturas pagadas de Amazon')
} }
function exportExcel(jsonData: DTO2096RptFacturasPagadas[], fileName: string): void { function exportExcel(
jsonData: DTO2096RptFacturasPagadas[],
fileName: string
): void {
let Heading = [ let Heading = [
[ [
'Factura', 'Factura',
@ -148,7 +169,8 @@ export default function RptAmazonFacturasPagadas(
'Valor Dolares', 'Valor Dolares',
'Valor Aduana', 'Valor Aduana',
'Razon Social', 'Razon Social',
'Aduana' 'Aduana',
'Piezas'
] ]
] ]
const dataOnly = jsonData.map( const dataOnly = jsonData.map(
@ -161,7 +183,8 @@ export default function RptAmazonFacturasPagadas(
valorDolares, valorDolares,
valorAduana, valorAduana,
razonSocial, razonSocial,
aduana aduana,
piezas
}) => { }) => {
return { return {
factura, factura,
@ -172,7 +195,8 @@ export default function RptAmazonFacturasPagadas(
valorDolares, valorDolares,
valorAduana, valorAduana,
razonSocial, razonSocial,
aduana aduana,
piezas
} }
} }
) )
@ -186,7 +210,8 @@ export default function RptAmazonFacturasPagadas(
valorDolares, valorDolares,
valorAduana, valorAduana,
razonSocial, razonSocial,
aduana aduana,
piezas
}) => { }) => {
return { return {
factura, factura,
@ -197,7 +222,8 @@ export default function RptAmazonFacturasPagadas(
valorDolares, valorDolares,
valorAduana, valorAduana,
razonSocial, razonSocial,
aduana aduana,
piezas
} }
} }
) )
@ -215,7 +241,6 @@ export default function RptAmazonFacturasPagadas(
} }
} }
useEffect(() => { useEffect(() => {
loadReport() loadReport()
}, []) }, [])
@ -233,7 +258,20 @@ export default function RptAmazonFacturasPagadas(
Facturas Pagadas Facturas Pagadas
</Card.Title> </Card.Title>
</Col> </Col>
<Col><Button variant="success" onClick={()=>{downloadExcel()}}>Excel</Button></Col> <Col>
<Col style={{ textAlign: 'center' }}>
<Button
variant="success"
onClick={() => {
downloadExcel()
}}
>
<BsFileEarmarkExcel />
Excel
</Button>
</Col>
</Col>
<Col style={{ textAlign: 'right' }}>Desde</Col> <Col style={{ textAlign: 'right' }}>Desde</Col>
<Col xs={1}> <Col xs={1}>
<Form.Control <Form.Control
@ -267,7 +305,12 @@ export default function RptAmazonFacturasPagadas(
loadReport() loadReport()
}} }}
> >
<Button variant="primary">Buscar</Button> {/* <div className="col-md-3 d-flex aling-items-center"> */}
<Button variant="primary">
Buscar <BsSearch />
</Button>
{/* </div> */}
</Col> </Col>
</Row> </Row>
</Card.Body> </Card.Body>

@ -25,6 +25,7 @@ import { AiFillFileExcel } from 'react-icons/ai'
import { IconContext } from 'react-icons' import { IconContext } from 'react-icons'
import { BsChevronDown, BsChevronRight, BsFilePdfFill } from 'react-icons/bs' import { BsChevronDown, BsChevronRight, BsFilePdfFill } from 'react-icons/bs'
import { FaAmazon } from 'react-icons/fa' import { FaAmazon } from 'react-icons/fa'
import { BsSearch, BsFileEarmarkExcel } from 'react-icons/bs'
import loadingImg from '../../../../../images/ajaxloader.gif' import loadingImg from '../../../../../images/ajaxloader.gif'
import { MFileManager } from '../../../../Utils/MFileManager/MFileManager' import { MFileManager } from '../../../../Utils/MFileManager/MFileManager'
import DTO2096RptPayedOperations from '../../DTO/DTO2096RptPayedOperations' import DTO2096RptPayedOperations from '../../DTO/DTO2096RptPayedOperations'
@ -33,6 +34,7 @@ import IFileManager from '../../../../../Interfaces/Utils/IFileManager'
import DTO2096RptFacturasPagadas from '../../DTO/DTO2096RptFacturasPagadas' import DTO2096RptFacturasPagadas from '../../DTO/DTO2096RptFacturasPagadas'
import DataTable from 'react-data-table-component' import DataTable from 'react-data-table-component'
import * as XLSX from 'xlsx' import * as XLSX from 'xlsx'
import DTOAmazonSegragacion from '../../DTO/DTOAmazonSegragacion'
export interface IRptSegregacionProps {} export interface IRptSegregacionProps {}
@ -45,7 +47,7 @@ export default function RptSegregacion(props: IRptSegregacionProps) {
const [Referencia, setReferencia] = useState('') const [Referencia, setReferencia] = useState('')
const [Inicio, setInicio] = useState(currentDate()) const [Inicio, setInicio] = useState(currentDate())
const [Fin, setFin] = useState(currentDate()) const [Fin, setFin] = useState(currentDate())
const [Data, setData] = useState<DTO2096RptFacturasPagadas[]>([]) const [Data, setData] = useState<DTOAmazonSegragacion[]>([])
const [show, setShowMsg] = useState(false) const [show, setShowMsg] = useState(false)
const [ShowModal, setShowModal] = useState(false) const [ShowModal, setShowModal] = useState(false)
const [WaitingDialog, setWaitingDialog] = useState(false) const [WaitingDialog, setWaitingDialog] = useState(false)
@ -56,61 +58,50 @@ export default function RptSegregacion(props: IRptSegregacionProps) {
const [IDFactura, setIDFactura] = useState(0) const [IDFactura, setIDFactura] = useState(0)
const [Invoices, setInvoices] = useState<number[]>([]) const [Invoices, setInvoices] = useState<number[]>([])
const msgColor = 'primary' const msgColor = 'primary'
const columnsConcepts = [ const columnsConcepts = [
{ {
name: 'Factura', name: 'VRID',
width: '350px', width: '150px',
selector: (row: DTO2096RptFacturasPagadas) => row.factura, selector: (row: DTOAmazonSegragacion) => row.vrid,
sortable: true sortable: true
}, },
{ {
name: 'Pedimento', name: 'ASIN',
width: '120px', width: '150px',
selector: (row: DTO2096RptFacturasPagadas) => row.pedimento, selector: (row: DTOAmazonSegragacion) => row.asin,
sortable: true sortable: true
}, },
{ {
name: 'Fecha pago', name: 'Quantyty',
width: '120px', width: '100px',
selector: (row: DTO2096RptFacturasPagadas) => selector: (row: DTOAmazonSegragacion) => row.quantity,
row.fechaPago.substring(0, 10),
sortable: true sortable: true
}, },
{ {
name: 'Clave', name: 'Descripcion',
width: '80px', width: '250px',
selector: (row: DTO2096RptFacturasPagadas) => row.clave, selector: (row: DTOAmazonSegragacion) => row.descripcion,
sortable: true sortable: true
}, },
{ {
name: 'Tipo Op', name: 'Motivo',
width: '120px', width: '2100px',
selector: (row: DTO2096RptFacturasPagadas) => row.tipoOp,
sortable: true selector: (row: DTOAmazonSegragacion) => row.motivo,
},
{
name: 'Valor Dolares',
width: '130px',
selector: (row: DTO2096RptFacturasPagadas) => row.valorDolares,
sortable: true sortable: true
}, },
{ {
name: 'Valor Aduana', name: 'FSegregacion',
width: '130px', width: '160px',
selector: (row: DTO2096RptFacturasPagadas) => row.valorAduana, selector: (row: DTOAmazonSegragacion) => row.fSegregacion,
sortable: true sortable: true
}, },
{ {
name: 'Razon Social', name: 'ValorMercancia',
width: '350px', width: '160px',
selector: (row: DTO2096RptFacturasPagadas) => row.razonSocial, selector: (row: DTOAmazonSegragacion) => row.valorMercancia,
sortable: true sortable: true
},
{
name: 'Aduana',
width: '550px',
selector: (row: DTO2096RptFacturasPagadas) => row.aduana,
sortable: false
} }
] ]
@ -142,6 +133,16 @@ export default function RptSegregacion(props: IRptSegregacionProps) {
}) })
} }
const loadReport = () => {
DSAmazon.GETReportesSegregadoss(Inicio, Fin)
.then((response) => {
setData(response.data)
})
.catch((e: Error) => {
alert('Ocurrio un error' + e.message.toString())
})
}
return ( return (
<div> <div>
<Card> <Card>
@ -189,8 +190,47 @@ export default function RptSegregacion(props: IRptSegregacionProps) {
downloadReport() downloadReport()
}} }}
> >
<Button variant="primary">Descargar</Button> <Button variant="primary">
<BsFileEarmarkExcel />
Descargar
</Button>
</Col> </Col>
<Col
style={{ textAlign: 'center' }}
onClick={() => {
loadReport()
}}
>
<Button variant="primary">
{' '}
<BsSearch />
Buscar
</Button>
</Col>
<Card>
<Card.Body>
<div
className="ag-theme-alpine"
style={{ height: 500, width: '100%' }}
>
<DataTable
noHeader
defaultSortFieldId={''}
defaultSortAsc={true}
striped={true}
dense={true}
paginationPerPage={10}
pagination
highlightOnHover
columns={columnsConcepts}
data={Data}
pointerOnHover
/>
</div>
</Card.Body>
</Card>
</Row> </Row>
</Card.Body> </Card.Body>
</Card> </Card>

@ -25,6 +25,8 @@ import DTO2096TraficoConsultaAmazonDetail from '../DTO/DTO2096TraficoConsultaAma
import DTO2096TraficoConsultaAmazonHeader from '../DTO/DTO2096TraficoConsultaAmazonHeader' import DTO2096TraficoConsultaAmazonHeader from '../DTO/DTO2096TraficoConsultaAmazonHeader'
import DTO2096DataTraficoConsulta from '../DTO/DTO2096DataTraficoConsulta' import DTO2096DataTraficoConsulta from '../DTO/DTO2096DataTraficoConsulta'
import I2096CatGrupoRegulatorio from '../Interfaces/I2096CatGrupoRegulatorio' import I2096CatGrupoRegulatorio from '../Interfaces/I2096CatGrupoRegulatorio'
import DTOAmazonSegragacion from '../DTO/DTOAmazonSegragacion'
import ICat2096CatConceptosConsulta from '../Interfaces/I2096CatConceptosConsulta'
class AmazonDataService { class AmazonDataService {
AmazonPendingClasificationInvoiceGET() { AmazonPendingClasificationInvoiceGET() {
@ -85,8 +87,8 @@ class AmazonDataService {
AmazonFacturasPagadasGET(Inicio: string, Fin: string) { AmazonFacturasPagadasGET(Inicio: string, Fin: string) {
return http.get<DTO2096RptFacturasPagadas[]>(`/AmazonInvoice/AmazonFacturasPagadasGET?Inicio=${Inicio}&Fin=${Fin}`) return http.get<DTO2096RptFacturasPagadas[]>(`/AmazonInvoice/AmazonFacturasPagadasGET?Inicio=${Inicio}&Fin=${Fin}`)
} }
AmazonInvoiceStatusGET(Invoice: string) { AmazonInvoiceStatusGET(Invoice: string , Inicio: string, Fin: string) {
return http.get<DTO2096InvoiceStatus[]>(`/AmazonInvoice/AmazonInvoiceStatusGET?Invoice=${Invoice}`) return http.get<DTO2096InvoiceStatus[]>(`/AmazonInvoice/AmazonInvoiceStatusGET?Invoice=${Invoice}&Inicio=${Inicio}&Fin=${Fin}`)
} }
AmazonInvoicePrioritySET(Id: number, Prioridad: boolean) { AmazonInvoicePrioritySET(Id: number, Prioridad: boolean) {
return http.get<I2096Headers[]>(`/AmazonInvoice/AmazonInvoicePrioritySET?id=${Id}&prioridad=${Prioridad}`) return http.get<I2096Headers[]>(`/AmazonInvoice/AmazonInvoicePrioritySET?id=${Id}&prioridad=${Prioridad}`)
@ -141,8 +143,8 @@ class AmazonDataService {
console.log(error) console.log(error)
}) })
} }
ExceptionsFileAmazonGET(id: number) { ExceptionsFileAmazonGET(id: number, code: number) {
return http.get<ArrayBuffer>(`/AmazonInvoice/ExceptionsFileAmazonGET?id=${id}`, {responseType: 'arraybuffer'}) return http.get<ArrayBuffer>(`/AmazonInvoice/ExceptionsFileAmazonGET?id=${id}&code=${code}`, {responseType: 'arraybuffer'})
.then(function (response) { .then(function (response) {
return response return response
}) })
@ -197,6 +199,21 @@ class AmazonDataService {
return error return error
}) })
} }
GETReportesSegregadoss(Inicio: string, Fin: string){
return http.get<DTOAmazonSegragacion[]>(`/AmazonInvoice/GETAmazonReportesSegregadoss?Inicio=${Inicio}&Fin=${Fin}`)
}
TraficoConsultasAmazonGenerateExcel(id: number) { TraficoConsultasAmazonGenerateExcel(id: number) {
return http.get<ArrayBuffer>(`/AmazonInvoice/TraficoConsultaAmazonGenerateExcel?id=${id}`, {responseType: 'arraybuffer'}) return http.get<ArrayBuffer>(`/AmazonInvoice/TraficoConsultaAmazonGenerateExcel?id=${id}`, {responseType: 'arraybuffer'})
.then(function (response) { .then(function (response) {
@ -264,5 +281,20 @@ class AmazonDataService {
TraficoConsultasAmazonById(id: number) { TraficoConsultasAmazonById(id: number) {
return http.get<DTO2096TraficoConsultaAmazonHeader>(`/AmazonInvoice/TraficoConsultasAmazonById?id=${id}`) return http.get<DTO2096TraficoConsultaAmazonHeader>(`/AmazonInvoice/TraficoConsultasAmazonById?id=${id}`)
} }
ClasificacionBOT(id: number) {
return http.get<DTO2096TraficoConsultaAmazonHeader>(`/AmazonInvoice/Bot/Clasificacion?id=${id}`)
}
DeleteNoParte(id: number) {
return http.delete<Boolean>(`/AmazonInvoice/DeleteNoParte?id=${id}`)
}
CatConceptosConsultaGET() {
return http.get<ICat2096CatConceptosConsulta[]>(`/AmazonInvoice/Catalogos/CatConceptosConsultaGET`)
}
CatConceptosConsultaAppend(data: ICat2096CatConceptosConsulta) {
return http.post<ICat2096CatConceptosConsulta>(`/AmazonInvoice/Catalogos/CatConceptosConsultaAppend`, data)
}
InvoiceDistinctExceptionCodeGet(id: number) {
return http.get<number[]>(`/AmazonInvoice/Invoice/DistinctExceptionCodeGet?id=${id}`)
}
} }
export default new AmazonDataService() export default new AmazonDataService()

@ -25,20 +25,20 @@ export default function Dashboard(props: IProps) {
<br /> <br />
<Container> <Container>
<Row xs={1} md={3} className='g-4'> <Row xs={1} md={3} className='g-4'>
{[['Direcccion', 'Sistemas', 'Corresponsalias'].includes(Depto) ? <DashboardCorresponsales /> : ''].map( {/* {[['Direcccion', 'Sistemas', 'Corresponsalias'].includes(Depto) ? <DashboardCorresponsales /> : ''].map(
(item) => { (item) => {
return <React.Fragment>{item}</React.Fragment> return <React.Fragment>{item}</React.Fragment>
} }
)} )} */}
{[['Direcccion', 'Sistemas', 'Contabilidad'].includes(Depto) ? <DashboardContabilidad /> : ''].map((item) => { {/* {[['Direcccion', 'Sistemas', 'Contabilidad'].includes(Depto) ? <DashboardContabilidad /> : ''].map((item) => {
return <React.Fragment>{item}</React.Fragment> return <React.Fragment>{item}</React.Fragment>
})} })} */}
{[['Heineken1'].includes(User) ? <Heineken1 /> : ''].map((item) => { {/* {[['Heineken1'].includes(User) ? <Heineken1 /> : ''].map((item) => {
return <React.Fragment>{item}</React.Fragment> return <React.Fragment>{item}</React.Fragment>
})} })}
{[['Direcccion', 'Sistemas', 'Facturacion'].includes(Depto) ? <DashboardFacturacion /> : ''].map((item) => { {[['Direcccion', 'Sistemas', 'Facturacion'].includes(Depto) ? <DashboardFacturacion /> : ''].map((item) => {
return <React.Fragment>{item}</React.Fragment> return <React.Fragment>{item}</React.Fragment>
})} })} */}
{[['Direcccion', 'Sistemas', 'Operaciones', 'Clasificacion'].includes(Depto) ? <DashboardClasificacion /> : ''].map((item) => { {[['Direcccion', 'Sistemas', 'Operaciones', 'Clasificacion'].includes(Depto) ? <DashboardClasificacion /> : ''].map((item) => {
return <React.Fragment>{item}</React.Fragment> return <React.Fragment>{item}</React.Fragment>
})} })}

@ -0,0 +1,125 @@
import { useEffect, useState } from 'react'
import { Button, Card, Col, Row } from 'react-bootstrap'
import DataTable from 'react-data-table-component'
import IConsolidadosSinFirmaBanco from '../../../../Interfaces/Facturacion/Anexo/IConsolidadosSinFirmaBanco'
import DSOperaciones from '../../../../Services/Operaciones/Operaciones.Services'
import * as XLSX from 'xlsx'
import { BsFileEarmarkExcel } from 'react-icons/bs'
export interface IRtpConsolidadosSinFirmaBancoProps {}
export default function RtpConsolidadosSinFirmaBanco(
props: IRtpConsolidadosSinFirmaBancoProps
) {
const [Data, setData] = useState<IConsolidadosSinFirmaBanco[]>([])
const [Total, setTotal] = useState(0)
const columnsConcepts = [
{
name: 'Referencia',
width: '150px',
cell: (row: IConsolidadosSinFirmaBanco) => row.referencia,
sortable: true
},
{
name: 'Fecha Pago',
width: '250px',
cell: (row: IConsolidadosSinFirmaBanco) => row.fechaPago,
sortable: true
},
{
name: 'Fecha Validacion',
width: '250px',
cell: (row: IConsolidadosSinFirmaBanco) => row.firmaValidacion,
sortable: true
},
{
name: 'Firma Banco',
with: '250px',
cell: (row: IConsolidadosSinFirmaBanco) => row.firmaBanco,
sortable: true
}
]
const downloadExcel = () => {
exportExcel(Data, 'Consolidados sin firma de banco')
}
function exportExcel(jsonData: any[], fileName: string): void {
let Heading = [
['Referencia', 'FechaPago', 'Fecha Validacion', 'Firma Banco']
]
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 generaReporte = () => {
DSOperaciones.OperacionesSinFirmaBancoGet()
.then((response) => {
setData(response.data)
setTotal(response.data.length)
})
.catch((e: Error) => {
console.log(e)
})
}
useEffect(() => {
generaReporte()
}, [])
return (
<div>
<Card>
<Card.Body>
<Card.Title>
<Row>
<Col xs={3}>Consolidados sin firma banco : {Total} registros</Col>
<Col xs={8}></Col>
<Col xs={1} className="colAlignRight">
<Button
size="sm"
variant="success"
onClick={() => {
downloadExcel()
}}
>
<BsFileEarmarkExcel />
&nbsp;Excel
</Button>
</Col>
</Row>
</Card.Title>
<Row>
<Col xs={12}>
<DataTable
dense
noHeader
defaultSortFieldId={'cliente'}
defaultSortAsc={true}
fixedHeaderScrollHeight="550px"
striped={true}
fixedHeader
/* paginationPerPage={10}
pagination */
highlightOnHover
columns={columnsConcepts}
data={Data}
pointerOnHover
/>
</Col>
</Row>
</Card.Body>
</Card>
</div>
)
}

@ -14,6 +14,7 @@ import { MsgInformativo } from '../Utils/Toast/msgInformativo'
import logo from '../../images/GEMCO_mini.png' import logo from '../../images/GEMCO_mini.png'
import Dashboard from '../Dashboard/Dashboard' import Dashboard from '../Dashboard/Dashboard'
import { Nav } from 'react-bootstrap' import { Nav } from 'react-bootstrap'
import Info from '../../../package.json'
export const Login: React.FC<{}> = () => { export const Login: React.FC<{}> = () => {
const dispatch = useDispatch() const dispatch = useDispatch()
@ -132,6 +133,7 @@ export const Login: React.FC<{}> = () => {
login login
</button> </button>
</div> </div>
<div style={{textAlign:'right'}}>v{Info.version}</div>
</Form> </Form>
</Formik> </Formik>
</div> </div>

@ -117,12 +117,27 @@ export const UserList: React.FC<IProps> = (props) => {
), ),
sortable: true sortable: true
}, },
{
name: 'Departamento',
width: '250px',
cell: (row: IRegister) => (
<div
style={{ width: '100%' }}
onClick={() => {
props.GetUserInfo(row)
}}
>
{row.departamento}
</div>
),
sortable: true
},
{ {
name: 'Estatus', name: 'Estatus',
width: '90px', width: '90px',
cell: (row: IRegister) => ( cell: (row: IRegister) => (
<div <div
style={{ width: '100%', textAlign:'center' }} style={{ width: '100%', textAlign: 'center' }}
onClick={() => { onClick={() => {
props.GetUserInfo(row) props.GetUserInfo(row)
}} }}
@ -152,6 +167,10 @@ export const UserList: React.FC<IProps> = (props) => {
return NoAsignado return NoAsignado
} }
// getDepartamento = (Id: Number) => {
// }
useEffect(() => { useEffect(() => {
usuariosServices usuariosServices
.getAllUsuarios() .getAllUsuarios()
@ -166,6 +185,7 @@ export const UserList: React.FC<IProps> = (props) => {
.then((response) => { .then((response) => {
setDataPerfiles(response.data) setDataPerfiles(response.data)
}) })
.catch((e: Error) => { .catch((e: Error) => {
console.log(e) console.log(e)
}) })

@ -18,6 +18,8 @@ import {
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import IPerfilesMenu from '../../Interfaces/IPerfilesMenu' import IPerfilesMenu from '../../Interfaces/IPerfilesMenu'
import { IPerfil } from '../../Interfaces/Catalogos/IPerfiles' import { IPerfil } from '../../Interfaces/Catalogos/IPerfiles'
// import { IDepartamento } from '../../Interfaces/Catalogos/IDepartamento'
import PerfilesMenuServices from '../../Services/Catalogos/PerfilesMenu.Services' import PerfilesMenuServices from '../../Services/Catalogos/PerfilesMenu.Services'
import ClientesServices from '../../Services/Catalogos/Clientes.Services' import ClientesServices from '../../Services/Catalogos/Clientes.Services'
import usuariosServices from '../../Services/Catalogos/Usuarios.Services' import usuariosServices from '../../Services/Catalogos/Usuarios.Services'
@ -34,6 +36,7 @@ import DTOUsuariosShort from '../../DTO/DTOUsuariosShort'
import DTOClonarUsuario from '../../DTO/DTOClonarUsuario' import DTOClonarUsuario from '../../DTO/DTOClonarUsuario'
import { AdmonPerfiles } from './admonPerfiles/AdmonPerfiles' import { AdmonPerfiles } from './admonPerfiles/AdmonPerfiles'
import { Form as FormCtrl } from 'react-bootstrap' import { Form as FormCtrl } from 'react-bootstrap'
import { Console } from 'console'
interface IProps {} interface IProps {}
@ -52,7 +55,7 @@ const SignupSchema = Yup.object().shape({
correo: Yup.string().email('Correo invalido').required('Requirido') correo: Yup.string().email('Correo invalido').required('Requirido')
}) })
export default function Register(props:IProps) { export default function Register(props: IProps) {
const [UserId, setUserId] = useState(() => { const [UserId, setUserId] = useState(() => {
const stickyValue = window.localStorage.getItem('UserId') const stickyValue = window.localStorage.getItem('UserId')
return stickyValue !== null ? JSON.parse(stickyValue) : 0 return stickyValue !== null ? JSON.parse(stickyValue) : 0
@ -92,6 +95,7 @@ export default function Register(props:IProps) {
const [TokenAccesoM, setTokenAccesoM] = useState('') const [TokenAccesoM, setTokenAccesoM] = useState('')
const [DeviceToken, setDeviceToken] = useState('') const [DeviceToken, setDeviceToken] = useState('')
const [IdPerfil, setIdPerfil] = useState(0) const [IdPerfil, setIdPerfil] = useState(0)
const [Departamento, setDepartamento] = useState('')
const [user2Clone, setUser2Clone] = React.useState(0) const [user2Clone, setUser2Clone] = React.useState(0)
const [perfiles, setPerfiles] = useState<IPerfil[]>([ const [perfiles, setPerfiles] = useState<IPerfil[]>([
{ {
@ -140,7 +144,8 @@ export default function Register(props:IProps) {
codigoAccesoM: CodigoAccesoM, codigoAccesoM: CodigoAccesoM,
tokenAccesoM: TokenAccesoM, tokenAccesoM: TokenAccesoM,
deviceToken: DeviceToken, deviceToken: DeviceToken,
idPerfil: IdPerfil idPerfil: IdPerfil,
departamento: Departamento
} }
const initialValuesPerfiles: IPerfil = { const initialValuesPerfiles: IPerfil = {
@ -148,6 +153,11 @@ export default function Register(props:IProps) {
perfil: '' perfil: ''
} }
// const initialValuesDepartamento: IDepartamento = {
// id: Dept,
// descripcion: ''
// }
function getUsuario() { function getUsuario() {
const item = localStorage.getItem('tokenInfo') const item = localStorage.getItem('tokenInfo')
let Usr = '' let Usr = ''
@ -367,13 +377,13 @@ export default function Register(props:IProps) {
} }
const CloseModalPerfiles = (show: boolean): void => { const CloseModalPerfiles = (show: boolean): void => {
//setmodalAdmonPerfiles(false); setmodalAdmonPerfiles(false)
} }
function loadAllUserInfo(id: number) {} function loadAllUserInfo(id: number) {}
const GetUserInfo = (data: IRegister): void => { const GetUserInfo = (data: IRegister): void => {
console.log('data from get usuario '+JSON.stringify(data)) console.log('data from get usuario ' + JSON.stringify(data))
setIdUsuario(data.id) setIdUsuario(data.id)
setUsuario(data.usuario) setUsuario(data.usuario)
setNombre(data.nombre) setNombre(data.nombre)
@ -381,16 +391,20 @@ export default function Register(props:IProps) {
setCorreo(data.correo) setCorreo(data.correo)
setIdPerfil(data.idPerfil) setIdPerfil(data.idPerfil)
loadAllUserInfo(data.id) loadAllUserInfo(data.id)
setTipoUsuario(data.tipoUsuario)
setDepartamento(data.departamento)
setDept(data.dept)
} }
const clonaInformacion = (): void => { const clonaInformacion = (): void => {
// alert(IdPerfil) // alert(IdPerfil)
if (IdPerfil == 0) { if (IdPerfil == 0) {
setToastPerfil(true) setToastPerfil(true)
setmsgDialog('') setmsgDialog('')
return return
} else } else setShowConfirmation(true)
setShowConfirmation(true)
} }
const ChangeUser2Clone = (e: any): void => { const ChangeUser2Clone = (e: any): void => {
@ -542,6 +556,7 @@ export default function Register(props:IProps) {
name="nombre" name="nombre"
className="form-control" className="form-control"
placeholder="nombre" placeholder="nombre"
// onChange={(e) => setNombre(e.target.value)}
/> />
{errors.nombre && touched.nombre ? ( {errors.nombre && touched.nombre ? (
<div> <div>
@ -683,24 +698,40 @@ export default function Register(props:IProps) {
</Field> </Field>
</div> </div>
</div> </div>
<div className="col"> <div className="col">
<div className="form-group"> <div className="form-group">
<label <label
className="text-info" className="text-info"
htmlFor="fechaModifico" htmlFor="Departamento"
> >
Fecha modifico Departamento
</label> </label>
<Field <FormCtrl.Control
id="fechaModifico" as="select"
name="fechaModifico" value={Dept}
readOnly="readOnly" onChange={
className="form-control" (e) => setDept(parseInt(e.target.value))
placeholder="Fecha modifico" // setDepartamento(e.target.value)
defaultValue={currentDate()} }
/> className="form-select form-select-sm"
// style={{ width: '270px', height: '37px' }}
>
<option value="0">No Asignado</option>
<option value="1">Corresponsalias</option>
<option value="2">Contabilidad</option>
<option value="3">Sistemas</option>
<option value="4">Direccion</option>
<option value="5">Administracion</option>
<option value="6">Facturacion</option>
<option value="7">Clasificacion</option>
<option value="8">Trafico</option>
<option value="9">Operaciones</option>
</FormCtrl.Control>
</div> </div>
</div> </div>
{/* aquo termina el div */}
</div> </div>
</Accordion.Body> </Accordion.Body>
</Accordion.Item> </Accordion.Item>
@ -770,6 +801,8 @@ export default function Register(props:IProps) {
name="dept" name="dept"
className="form-control" className="form-control"
placeholder="departamento" placeholder="departamento"
// IsReadOnly="True"
disabled="diabled"
/> />
</div> </div>
</div> </div>

@ -0,0 +1,401 @@
import React, { FC, useEffect, useState } from 'react'
// Bootstrap components
import { Button, Card, Form } from 'react-bootstrap'
import { BsSearch, BsFileEarmarkExcel } from 'react-icons/bs'
// Interfaces
import IClientes from '../../Interfaces/Catalogos/IClientes'
import IArchivoElectronico from '../../Interfaces/IArchivoElectronico'
// DTOs
import DTOReporte from '../../DTO/DTOReporte'
// Services
import reportsDataService from '../../Services/Reportes/reportes.services'
import ClientesDataService from '../../Services/Catalogos/Clientes.Services'
import { useDispatch } from 'react-redux'
import { setArchivoElectronico } from '../../store/features/Reportes/ArchivoElectronico'
// GUI components
import { MsgInformativo } from '../Utils/Toast/msgInformativo'
import { AgGridReact } from 'ag-grid-react'
import { RowClickedEvent } from 'ag-grid-community'
import { TargetURL } from '../../Constants/TargetURL'
//Other
import moment from 'moment'
import * as XLSX from 'xlsx'
import IRptArcosa from '../../Interfaces/Reportes/IRptArcosa'
interface IProps {}
const RptArcosa: FC<IProps> = (props) => {
const [UserId, setUserId] = useState(() => {
const stickyValue = window.localStorage.getItem('UserId')
return stickyValue !== null ? JSON.parse(stickyValue) : 0
})
const [Data, setData] = useState<Array<IRptArcosa>>([])
const [filteredData, setFilteredData] = useState<Array<IRptArcosa>>([])
const [Inicio, setInicio] = useState(currentDate())
const [Fin, setFin] = useState(currentDate())
const [TipoOperacion, setTipoOperacion] = useState(1)
const [Cliente, setCliente] = useState(0)
const [Clientes, setClientes] = useState<Array<IClientes>>()
const [msgColor, setMsgColor] = React.useState('primary')
const [show, setShowMsg] = useState(false)
const [header, setHeader] = useState('')
const [msg, setMsg] = useState('')
const [filtro, setFiltro] = useState('')
const gridRef = React.useRef<any>(null)
const [columnaVerPDF, setcolumnaVerPDF] = useState(false)
const dispatch = useDispatch()
const [columnDefs] = useState([
{
field: 'patente',
headerName: 'Patente',
sortable: true,
filter: true,
width: 150
},
{
field: 'pedimento',
headerName: 'Pedimento',
sortable: true,
filter: true,
width: 150
},
{
field: 'pagoPedimento',
headerName: 'PagoPedimento',
sortable: true,
filter: true,
width: 200
},
{
field: 'regimen',
headerName: 'Regimen',
sortable: true,
filter: true,
width: 150
},
{
field: 'valorDls',
headerName: 'ValorDls',
sortable: true,
filter: true,
width: 150
},
{
field: 'valorAduana',
headerName: 'ValorAduana',
sortable: true,
filter: true,
width: 150
},
{
field: 'aduana',
headerName: 'Aduana',
sortable: true,
filter: true,
width: 150
},
{
field: 'planta',
headerName: 'Planta',
sortable: true,
filter: true,
width: 150
},
{
field: 'dta',
headerName: 'DTA',
sortable: true,
filter: true,
width: 150
},
{
field: 'prev',
headerName: 'PREV',
sortable: true,
filter: true,
width: 150
},
{
field: 'iva',
headerName: 'IVA',
sortable: true,
filter: true,
width: 150
},
{
field: 'ivaprev',
headerName: 'IVAPREV',
sortable: true,
filter: true,
width: 150
},
{
field: 'igi',
headerName: 'IGI',
sortable: true,
filter: true,
width: 150
},
{
field: 'cc',
headerName: 'CC',
sortable: true,
filter: true,
width: 150
},
{
field: 'total',
headerName: 'Total',
sortable: true,
filter: true,
width: 150
}
])
function currentDate(): string {
var today = new Date()
var dd = String(today.getDate()).padStart(2, '0')
var mm = String(today.getMonth() + 1).padStart(2, '0') //January is 0!
var yyyy = today.getFullYear()
return yyyy + '-' + mm + '-' + dd
}
const closeToast = (show: boolean): void => {
setShowMsg(false)
}
const generaReporte = () => {
if (Cliente === 0) {
setHeader('Error')
setMsg('Seleccion el cliente')
setShowMsg(true)
return
}
const data: DTOReporte = {
Inicio: moment(Inicio).format('YYYY-MM-DD'),
Fin: moment(Fin).format('YYYY-MM-DD'),
TipoOperacion: TipoOperacion,
NoCliente: Cliente,
IdUsuario: UserId
}
reportsDataService
.getRptArcosa(data)
.then((response) => {
setData(response.data)
setFilteredData(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
})
}
useEffect(() => {
ClientesDataService.getAllClientes(parseInt(UserId))
.then((response) => {
setClientes(response.data)
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error: ' + e)
setShowMsg(true)
return
})
}, [])
const downloadExcel = () => {
exportExcel(Data, 'Reporte Mensual Arcosa')
}
function exportExcel(jsonData: any[], fileName: string): void {
let Heading = [
[
'Patente',
'Pedimento',
'PagoPedimento',
'Regimen',
'ValorDls',
'ValorAduana',
'Aduana',
'Planta',
'DTA',
'PREV',
'IVA',
'IVAPREV',
'IGI',
'CC',
'Total'
]
]
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)
}
async function getAE(e: any) {
if (e.column.colId === 'ver pedimento') {
setcolumnaVerPDF(true)
} else {
setcolumnaVerPDF(false)
}
}
const formatNumber = (number: string, digits: number) => {
number = parseFloat(number).toFixed(digits)
let value = Number(number).toLocaleString('en')
if (!value.indexOf('NaN')) return '0.00'
return value
}
return (
<div>
<Card>
<Card.Body>
<div className="row">
<div className="col-md-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"
/>
</div>
<div className="col-md-2">
<Form.Control
defaultValue={Fin}
type="date"
name="Fin"
placeholder="Fin"
title="Fin"
alt="Fin"
onChange={(e) => setFin(e.target.value)}
size="sm"
/>
</div>
<div className="col-md-1 right-label">
<Form.Label size="sm">Tipo oper</Form.Label>
</div>
<div className="col-md-1">
<Form.Control
as="select"
onChange={(e) => setTipoOperacion(parseInt(e.target.value))}
className="form-select form-select-sm"
>
<option value="1">Importacion</option>
<option value="2">Exportacion</option>
</Form.Control>
</div>
<div className="col-md-1 right-label">
<Form.Label size="sm">Cliente</Form.Label>
</div>
<div className="col-md-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 c.agrupado === 1 ? (
<option value={c.sClave}>{c.sRazonSocial}</option>
) : (
''
)
})
: null}
</Form.Control>
</div>
<div className="col-md-1 right-label">
<Button
variant="primary"
size="sm"
onClick={() => {
generaReporte()
}}
>
<BsSearch />
&nbsp;Buscar
</Button>
</div>
</div>
<div className="row" style={{ paddingTop: 5 }}>
<div className="col">&nbsp;</div>
<div className="col-4">
<Form.Control
type="text"
size="sm"
placeholder="Search..."
onChange={(e) => {
filtraReporte(e)
}}
/>
</div>
<div className="col">
<Button
size="sm"
variant="success"
onClick={() => {
downloadExcel()
}}
>
<BsFileEarmarkExcel />
&nbsp;Excel
</Button>
</div>
</div>
</Card.Body>
</Card>
<br />
<div className="ag-theme-alpine" style={{ height: 500, width: '100%' }}>
<AgGridReact
rowData={filteredData}
columnDefs={columnDefs}
pagination={true}
paginationAutoPageSize={true}
ref={gridRef}
rowSelection={'multiple'}
rowMultiSelectWithClick={true}
onCellClicked={(e) => getAE(e)}
></AgGridReact>
</div>
<MsgInformativo
show={show}
msg={msg}
header={header}
msgColor={msgColor}
closeToast={closeToast}
/>
</div>
)
}
export default RptArcosa

@ -0,0 +1,308 @@
import React, { useEffect, useState } from 'react'
//boostrap componentes
import { Button, Card, Form } from 'react-bootstrap'
import { BsSearch, BsFileEarmarkExcel } from 'react-icons/bs'
//interfaces
import { IRptFacturasFraccion } from '../../Interfaces/Reportes/IRptContsFacturasFraccion'
import reportsDataService from '../../Services/Reportes/reportes.services'
import { useDispatch } from 'react-redux'
// Gui Components
import { MsgInformativo } from '../Utils/Toast/msgInformativo'
import { TargetURL } from '../../Constants/TargetURL'
// import DataTable from 'react-data-table-component'
import DataTable, { TableColumn } from 'react-data-table-component'
//Other
import moment from 'moment'
import * as XLSX from 'xlsx'
import { string } from 'yup'
const URL = new TargetURL()
export default function RptPFacturasFraccion() {
const [curURL, setCurURL] = useState(URL.get())
const [UserId, setUserId] = useState(() => {
const stickyValue = window.localStorage.getItem('UserId')
return stickyValue !== null ? JSON.parse(stickyValue) : 0
})
const [Data, setData] = useState<Array<IRptFacturasFraccion>>([])
const [filteredData, setFilteredData] = useState<Array<IRptFacturasFraccion>>(
[]
)
const [msgColor, setMsgColor] = React.useState('primary')
const [show, setShowMsg] = useState(false)
const [header, setHeader] = useState('')
const [msg, setMsg] = useState('')
const [filtro, setFiltro] = useState('')
// const gridRef = React.useRef<any>(null)
const [referencia, setReferencia] = useState('')
const columnDefs = [
{
name: <div style={{ textAlign: 'center' }}>Factura</div>,
width: '220px',
selector: (row: IRptFacturasFraccion) => row.factura,
sortable: true,
filter: true,
center: true
},
{
name: <div style={{ textAlign: 'center' }}>Almacen</div>,
width: '100px',
selector: (row: IRptFacturasFraccion) => row.almacen,
sortable: true,
filter: true,
center: true
},
{
name: <div style={{ textAlign: 'center' }}>Orden</div>,
width: '100px',
selector: (row: IRptFacturasFraccion) => row.orden,
sortable: true,
filter: true,
center: true,
texAlign: 'center'
},
{
name: <div style={{ textAlign: 'center' }}>Parte</div>,
width: '150px',
selector: (row: IRptFacturasFraccion) => row.parte,
sortable: true,
filter: true,
center: true
},
{
name: <div style={{ textAlign: 'center' }}>Pais</div>,
width: '120px',
selector: (row: IRptFacturasFraccion) => row.pais,
sortable: true,
filter: true,
center: true
},
{
name: <div style={{ textAlign: 'center' }}>Fraccion Factura XML</div>,
width: '200px',
selector: (row: IRptFacturasFraccion) => row.fraccionFacturaXML,
sortable: true,
filter: true,
center: true
},
{
name: <div style={{ textAlign: 'center' }}>Fraccion GEMCO</div>,
width: '150px',
selector: (row: IRptFacturasFraccion) => row.fraccionGEMCO,
sortable: true,
filter: true,
center: true
},
{
name: <div style={{ textAlign: 'center' }}>Nico GEMCO</div>,
width: '120px',
selector: (row: IRptFacturasFraccion) => row.nicoGEMCO,
sortable: true,
filter: true,
center: true
}
]
function currentDate(): string {
var today = new Date()
var dd = String(today.getDate()).padStart(2, '0')
var mm = String(today.getMonth() + 1).padStart(2, '0') //January is 0!
var yyyy = today.getFullYear()
return yyyy + '-' + mm + '-' + dd
}
const closeToast = (show: boolean): void => {
setShowMsg(false)
}
const generaReporte = () => {
if (!referencia) {
setHeader('Error')
setMsg('La referencia no puede estar vacía')
setShowMsg(true)
return
}
reportsDataService
.getRptContsFacturasFraccion(referencia) // Usa la variable 'referencia' en lugar de 'Referencia'
.then((response) => {
setData(response.data)
setFilteredData(response.data)
setHeader('Informativo')
setMsg('Se encontró la siguiente información...')
setShowMsg(true)
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrió un error: ' + e.message)
setShowMsg(true)
return
})
}
const downloadExcel = () => {
console.log(Data)
exportExcel(Data, 'Facturas Fraccion')
}
function exportExcel(
jsonData: IRptFacturasFraccion[],
fileName: string
): void {
let Heading = [
[
'Factura',
'Almacen',
'Orden',
'Parte',
'Pais',
'Fraccion Factura XML',
'Fraccion GEMCO',
'Nico GEMCO'
]
]
/* jsonData.forEach(function (v) {
delete v.tipodeCambiodePedimento
}) */
/* jsonData.map(function (item) {
delete item.tipodeCambiodePedimento
return item
}) */
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) => {
const searchText = e.target.value.toLowerCase()
setFiltro(searchText)
const filtered = Data.filter((item) => {
return (
(item.factura && item.factura.toLowerCase().includes(searchText)) ||
(item.almacen && item.almacen.toLowerCase().includes(searchText)) ||
(item.orden && item.orden.toString().includes(searchText)) ||
(item.parte && item.parte.toLowerCase().includes(searchText)) ||
(item.pais && item.pais.toLowerCase().includes(searchText)) ||
(item.fraccionFacturaXML &&
item.fraccionFacturaXML.toLowerCase().includes(searchText)) ||
(item.fraccionGEMCO &&
item.fraccionGEMCO.toLowerCase().includes(searchText)) ||
(item.nicoGEMCO && String(item.nicoGEMCO).includes(searchText))
)
})
// console.log('Filtered Data:', filtered)
setFilteredData(filtered)
}
return (
<div>
<Card>
<Card.Body>
<div className="row">
<div className="col-md-1" style={{ textAlign: 'right' }}>
<Form.Label size="sm">Referencia</Form.Label>
</div>
<div className="col-md-1" style={{ width: '130px' }}>
<Form.Control
type="text"
size="sm"
value={referencia}
onChange={(e) => setReferencia(e.target.value)}
/>
</div>
<div className="col-md-1" style={{ width: '5px' }}></div>
<div className="col-md-4" style={{ width: '150px ' }}>
<Button
variant="primary"
size="sm"
onClick={() => {
generaReporte()
}}
>
Buscar <BsSearch />
</Button>
</div>
<div className="col-md-1" style={{ width: '50px' }}></div>
<div className="col-md-4">
<Form.Control
type="text"
size="sm"
placeholder="Search..."
onChange={(e) => {
filtraReporte(e)
}}
/>
</div>
<div className="col-md-1" style={{ width: '260px' }}></div>
<div className="col-md-1">
<Button
size="sm"
variant="success"
onClick={() => {
downloadExcel()
}}
>
Excel <BsFileEarmarkExcel />
</Button>
</div>
</div>
</Card.Body>
</Card>
<Card>
<Card.Body>
<div
className="ag-theme-alpine"
style={{ height: 400, width: '100%', textAlign: 'center' }}
>
<DataTable
columns={columnDefs}
data={filteredData}
defaultSortAsc={true}
striped={true}
dense={true}
paginationPerPage={10}
pagination
highlightOnHover
pointerOnHover
style={{ height: 300, width: '100%', textAlign: 'center' }}
noHeader // Para evitar que se muestre el encabezado del DataTable
onRowClicked={(row) => {
// Aquí puedes manejar el clic en una fila si es necesario
}}
/>
</div>
</Card.Body>
</Card>
<MsgInformativo
show={show}
msg={msg}
header={header}
msgColor={msgColor}
closeToast={closeToast}
/>
</div>
)
}

@ -0,0 +1,322 @@
import React, { FC, useEffect, useState } from 'react'
// Bootstrap components
import { Button, Card, Form } from 'react-bootstrap'
import { BsSearch, BsFileEarmarkExcel } from 'react-icons/bs'
// Interfaces
import IClientes from '../../Interfaces/Catalogos/IClientes'
import IArchivoElectronico from '../../Interfaces/IArchivoElectronico'
// DTOs
import DTOReporte from '../../DTO/DTOReporte'
// Services
import reportsDataService from '../../Services/Reportes/reportes.services'
import ClientesDataService from '../../Services/Catalogos/Clientes.Services'
import { useDispatch } from 'react-redux'
import { setArchivoElectronico } from '../../store/features/Reportes/ArchivoElectronico'
// GUI components
import { MsgInformativo } from '../Utils/Toast/msgInformativo'
import { AgGridReact } from 'ag-grid-react'
import { RowClickedEvent } from 'ag-grid-community'
import { TargetURL } from '../../Constants/TargetURL'
//Other
import moment from 'moment'
import * as XLSX from 'xlsx'
import IRptFacturasPedimentosPagados from '../../Interfaces/Reportes/IRptFacturasPedimentosPagados'
interface IProps {}
const RptFacturasPedimentosPagados: FC<IProps> = (props) => {
const [UserId, setUserId] = useState(() => {
const stickyValue = window.localStorage.getItem('UserId')
return stickyValue !== null ? JSON.parse(stickyValue) : 0
})
const [Data, setData] = useState<Array<IRptFacturasPedimentosPagados>>([])
const [filteredData, setFilteredData] = useState<
Array<IRptFacturasPedimentosPagados>
>([])
const [Inicio, setInicio] = useState(currentDate())
const [Fin, setFin] = useState(currentDate())
const [TipoOperacion, setTipoOperacion] = useState(1)
const [Cliente, setCliente] = useState(0)
const [Clientes, setClientes] = useState<Array<IClientes>>()
const [msgColor, setMsgColor] = React.useState('primary')
const [show, setShowMsg] = useState(false)
const [header, setHeader] = useState('')
const [msg, setMsg] = useState('')
const [filtro, setFiltro] = useState('')
const gridRef = React.useRef<any>(null)
const [columnaVerPDF, setcolumnaVerPDF] = useState(false)
const dispatch = useDispatch()
const [columnDefs] = useState([
{
field: 'referencia',
headerName: 'Referencia',
sortable: true,
filter: true,
width: 300
},
{
field: 'pedido',
headerName: 'Pedido',
sortable: true,
filter: true,
width: 300
},
{
field: 'factura',
headerName: 'Factura',
sortable: true,
filter: true,
width: 400
},
{
field: 'uuid',
headerName: 'UUID',
sortable: true,
filter: true,
width: 350
},
{
field: 'fecha',
headerName: 'Fecha',
sortable: true,
filter: true,
width: 300
},
{
field: 'razonSocial',
headerName: 'RazonSocial',
sortable: true,
filter: true,
width: 300
}
])
function currentDate(): string {
var today = new Date()
var dd = String(today.getDate()).padStart(2, '0')
var mm = String(today.getMonth() + 1).padStart(2, '0') //January is 0!
var yyyy = today.getFullYear()
return yyyy + '-' + mm + '-' + dd
}
const closeToast = (show: boolean): void => {
setShowMsg(false)
}
const generaReporte = () => {
if (Cliente === 0) {
setHeader('Error')
setMsg('Seleccion el cliente')
setShowMsg(true)
return
}
const data: DTOReporte = {
Inicio: moment(Inicio).format('YYYY-MM-DD'),
Fin: moment(Fin).format('YYYY-MM-DD'),
TipoOperacion: TipoOperacion,
NoCliente: Cliente,
IdUsuario: UserId
}
reportsDataService
.getRptFacturasPedimentosPagados(data)
.then((response) => {
setData(response.data)
setFilteredData(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
})
}
useEffect(() => {
ClientesDataService.getAllClientes(parseInt(UserId))
.then((response) => {
setClientes(response.data)
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error: ' + e)
setShowMsg(true)
return
})
}, [])
const downloadExcel = () => {
exportExcel(Data, 'FacturasEnPedimentos')
}
function exportExcel(jsonData: any[], fileName: string): void {
let Heading = [
['Referencia', 'Pedido', 'Factura', 'UUID', 'Fecha', 'RazonSocial']
]
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)
}
async function getAE(e: any) {
if (e.column.colId === 'ver pedimento') {
setcolumnaVerPDF(true)
} else {
setcolumnaVerPDF(false)
}
}
const formatNumber = (number: string, digits: number) => {
number = parseFloat(number).toFixed(digits)
let value = Number(number).toLocaleString('en')
if (!value.indexOf('NaN')) return '0.00'
return value
}
return (
<div>
<Card>
<Card.Body>
<div className="row">
<div className="col-md-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"
/>
</div>
<div className="col-md-2">
<Form.Control
defaultValue={Fin}
type="date"
name="Fin"
placeholder="Fin"
title="Fin"
alt="Fin"
onChange={(e) => setFin(e.target.value)}
size="sm"
/>
</div>
<div className="col-md-1 right-label">
<Form.Label size="sm">Tipo oper</Form.Label>
</div>
<div className="col-md-1">
<Form.Control
as="select"
onChange={(e) => setTipoOperacion(parseInt(e.target.value))}
className="form-select form-select-sm"
>
<option value="1">Importacion</option>
<option value="2">Exportacion</option>
</Form.Control>
</div>
<div className="col-md-1 right-label">
<Form.Label size="sm">Cliente</Form.Label>
</div>
<div className="col-md-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 c.agrupado === 1 ? (
<option value={c.sClave}>{c.sRazonSocial}</option>
) : (
''
)
})
: null}
</Form.Control>
</div>
<div className="col-md-1 right-label">
<Button
variant="primary"
size="sm"
onClick={() => {
generaReporte()
}}
>
<BsSearch />
&nbsp;Buscar
</Button>
</div>
</div>
<div className="row" style={{ paddingTop: 5 }}>
<div className="col">&nbsp;</div>
<div className="col-4">
<Form.Control
type="text"
size="sm"
placeholder="Search..."
onChange={(e) => {
filtraReporte(e)
}}
/>
</div>
<div className="col">
<Button
size="sm"
variant="success"
onClick={() => {
downloadExcel()
}}
>
<BsFileEarmarkExcel />
&nbsp;Excel
</Button>
</div>
</div>
</Card.Body>
</Card>
<br />
<div className="ag-theme-alpine" style={{ height: 500, width: '100%' }}>
<AgGridReact
rowData={filteredData}
columnDefs={columnDefs}
pagination={true}
paginationAutoPageSize={true}
ref={gridRef}
rowSelection={'multiple'}
rowMultiSelectWithClick={true}
onCellClicked={(e) => getAE(e)}
></AgGridReact>
</div>
<MsgInformativo
show={show}
msg={msg}
header={header}
msgColor={msgColor}
closeToast={closeToast}
/>
</div>
)
}
export default RptFacturasPedimentosPagados

@ -0,0 +1,409 @@
import React, { FC, useEffect, useState } from 'react'
// Bootstrap components
import { Button, Card, Form } from 'react-bootstrap'
import { BsSearch, BsFileEarmarkExcel } from 'react-icons/bs'
// Interfaces
import IClientes from '../../Interfaces/Catalogos/IClientes'
import IArchivoElectronico from '../../Interfaces/IArchivoElectronico'
// DTOs
import DTOReporte from '../../DTO/DTOReporte'
// Services
import reportsDataService from '../../Services/Reportes/reportes.services'
import ClientesDataService from '../../Services/Catalogos/Clientes.Services'
// Redux
import { useDispatch } from 'react-redux'
import { setArchivoElectronico } from '../../store/features/Reportes/ArchivoElectronico'
// GUI components
import { MsgInformativo } from '../Utils/Toast/msgInformativo'
import { AgGridReact } from 'ag-grid-react'
import { RowClickedEvent } from 'ag-grid-community'
import { TargetURL } from '../../Constants/TargetURL'
//Other
import moment from 'moment'
import * as XLSX from 'xlsx'
import IRptOperacionesPagadasMisionFood from '../../Interfaces/Reportes/IRptOperacionesPagadasMisionFood'
interface IProps {}
const RptOperacionesPagadasMisionFood: FC<IProps> = (props) => {
const [UserId, setUserId] = useState(() => {
const stickyValue = window.localStorage.getItem('UserId')
return stickyValue !== null ? JSON.parse(stickyValue) : 0
})
const [Data, setData] = useState<Array<IRptOperacionesPagadasMisionFood>>([])
const [filteredData, setFilteredData] = useState<
Array<IRptOperacionesPagadasMisionFood>
>([])
const [Inicio, setInicio] = useState(currentDate())
const [Fin, setFin] = useState(currentDate())
const [TipoOperacion, setTipoOperacion] = useState(1)
const [Cliente, setCliente] = useState(0)
const [Clientes, setClientes] = useState<Array<IClientes>>()
const [msgColor, setMsgColor] = React.useState('primary')
const [show, setShowMsg] = useState(false)
const [header, setHeader] = useState('')
const [msg, setMsg] = useState('')
const [filtro, setFiltro] = useState('')
const gridRef = React.useRef<any>(null)
const [columnaVerPDF, setcolumnaVerPDF] = useState(false)
const dispatch = useDispatch()
const [columnDefs] = useState([
{
field: 'tipoOperacion',
headerName: 'TipoOperacion',
sortable: true,
filter: true
},
{
field: 'sPedimento',
headerName: 'Pedimento',
sortable: true,
filter: true
},
{
field: 'uuid',
headerName: 'UUID',
sortable: true,
filter: true,
width: 400
},
{
field: 'folioFactura',
headerName: 'FolioFactura',
sortable: true,
filter: true,
width: 500
},
{
field: 'dFechaFirmaBanco',
headerName: 'FechaFirmaBanco',
sortable: true,
filter: true
},
{
field: 'sRazonSocial',
headerName: 'RazonSocial',
sortable: true,
filter: true
},
{ field: 'sRFC', headerName: 'RFC', sortable: true, filter: true },
{
field: 'sReferencia',
headerName: 'Referencia',
sortable: true,
filter: true
},
{
field: 'sEDocument',
headerName: 'EDocument',
sortable: true,
filter: true
},
{
field: 'sHRazonSocial',
headerName: 'SHRazonSocial',
sortable: true,
filter: true,
width: 300
},
{
field: 'sHidentificadorProv',
headerName: 'HidentificadorProv',
sortable: true,
filter: true,
width: 300
},
{
field: 'aa',
headerName: 'AA',
sortable: true,
filter: true
},
{
field: 'rfcaa',
headerName: 'RFCAA',
sortable: true,
filter: true
},
{
field: 'incoterm',
headerName: 'Incoterm',
sortable: true,
filter: true
},
{
field: 'caja',
headerName: 'Caja',
sortable: true,
filter: true
},
{
field: 'acuceDoda',
headerName: 'AcuceDoda',
sortable: true,
filter: true
},
{
field: 'transportista',
headerName: 'Transportista',
sortable: true,
filter: true,
width: 300
},
{
field: 'edocument',
headerName: 'Edocument',
sortable: true,
filter: true,
width: 1000
}
])
function currentDate(): string {
var today = new Date()
var dd = String(today.getDate()).padStart(2, '0')
var mm = String(today.getMonth() + 1).padStart(2, '0') //January is 0!
var yyyy = today.getFullYear()
return yyyy + '-' + mm + '-' + dd
}
const closeToast = (show: boolean): void => {
setShowMsg(false)
}
const generaReporte = () => {
if (Cliente === 0) {
setHeader('Error')
setMsg('Seleccion el cliente')
setShowMsg(true)
return
}
const data: DTOReporte = {
Inicio: moment(Inicio).format('YYYY-MM-DD'),
Fin: moment(Fin).format('YYYY-MM-DD'),
TipoOperacion: TipoOperacion,
NoCliente: Cliente,
IdUsuario: UserId
}
reportsDataService
.getRptOPeracionesPagadasMisionFood(data)
.then((response) => {
setData(response.data)
setFilteredData(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
})
}
useEffect(() => {
ClientesDataService.getAllClientes(parseInt(UserId))
.then((response) => {
setClientes(response.data)
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error: ' + e)
setShowMsg(true)
return
})
}, [])
const downloadExcel = () => {
exportExcel(Data, 'OperacionesPagadasMissionFood')
}
function exportExcel(jsonData: any[], fileName: string): void {
let Heading = [
[
'TipoOperacion',
'Pedimento',
'UUID',
'FolioFactura',
'FechaFirmaBanco',
'RazonSocial',
'RFC',
'Referencia',
'EDocument',
'HRazonSocial',
'HidentificadorProv',
'AA',
'RFCAA',
'Incoterm',
'Caja',
'AcuceDoda',
'Transportista',
'Edocument'
]
]
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)
}
async function getAE(e: any) {
if (e.column.colId === 'ver pedimento') {
setcolumnaVerPDF(true)
} else {
setcolumnaVerPDF(false)
}
}
const formatNumber = (number: string, digits: number) => {
number = parseFloat(number).toFixed(digits)
let value = Number(number).toLocaleString('en')
if (!value.indexOf('NaN')) return '0.00'
return value
}
return (
<div>
<Card>
<Card.Body>
<div className="row">
<div className="col-md-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"
/>
</div>
<div className="col-md-2">
<Form.Control
defaultValue={Fin}
type="date"
name="Fin"
placeholder="Fin"
title="Fin"
alt="Fin"
onChange={(e) => setFin(e.target.value)}
size="sm"
/>
</div>
<div className="col-md-1 right-label">
<Form.Label size="sm">Tipo oper</Form.Label>
</div>
<div className="col-md-1">
<Form.Control
as="select"
onChange={(e) => setTipoOperacion(parseInt(e.target.value))}
className="form-select form-select-sm"
>
<option value="1">Importacion</option>
<option value="2">Exportacion</option>
</Form.Control>
</div>
<div className="col-md-1 right-label">
<Form.Label size="sm">Cliente</Form.Label>
</div>
<div className="col-md-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 c.agrupado === 1 ? (
<option value={c.sClave}>{c.sRazonSocial}</option>
) : (
''
)
})
: null}
</Form.Control>
</div>
<div className="col-md-1 right-label">
<Button
variant="primary"
size="sm"
onClick={() => {
generaReporte()
}}
>
<BsSearch />
&nbsp;Buscar
</Button>
</div>
</div>
<div className="row" style={{ paddingTop: 5 }}>
<div className="col">&nbsp;</div>
<div className="col-4">
<Form.Control
type="text"
size="sm"
placeholder="Search..."
onChange={(e) => {
filtraReporte(e)
}}
/>
</div>
<div className="col">
<Button
size="sm"
variant="success"
onClick={() => {
downloadExcel()
}}
>
<BsFileEarmarkExcel />
&nbsp;Excel
</Button>
</div>
</div>
</Card.Body>
</Card>
<br />
<div className="ag-theme-alpine" style={{ height: 500, width: '100%' }}>
<AgGridReact
rowData={filteredData}
columnDefs={columnDefs}
pagination={true}
paginationAutoPageSize={true}
ref={gridRef}
rowSelection={'multiple'}
rowMultiSelectWithClick={true}
onCellClicked={(e) => getAE(e)}
></AgGridReact>
</div>
<MsgInformativo
show={show}
msg={msg}
header={header}
msgColor={msgColor}
closeToast={closeToast}
/>
</div>
)
}
export default RptOperacionesPagadasMisionFood

@ -15,7 +15,7 @@ interface IProps {
export const MsgInformativo: FC<IProps> = (props) => { export const MsgInformativo: FC<IProps> = (props) => {
return ( return (
<div> <div>
<ToastContainer position={'middle-center'}> <ToastContainer position={'middle-center'} style={{zIndex:'99999 !important'}} >
<Toast <Toast
show={props.show} show={props.show}
delay={props.time} delay={props.time}

@ -0,0 +1,7 @@
export default interface IConsolidadosSinFirmaBanco{
referencia: string,
fechaPago: string,
firmaValidacion: string,
firmaBanco: string
}

@ -1,32 +1,33 @@
export interface IRegister { export interface IRegister {
id: number; id: number
usuario: string; usuario: string
nombre: string; nombre: string
contrasena: string; contrasena: string
correo: string; correo: string
tipoUsuario: number; tipoUsuario: number
activo: number; activo: number
fechaAlta: string; fechaAlta: string
usuarioAlta: number; usuarioAlta: number
fechaModifico: string; fechaModifico: string
usuarioModifico: number; usuarioModifico: number
fechaElimino: string; fechaElimino: string
usuarioElimino: number; usuarioElimino: number
motivoElimino: string; motivoElimino: string
idModulo: number; idModulo: number
dept: number; dept: number
tmercancia: number; tmercancia: number
fechaUltimaVisita: string; fechaUltimaVisita: string
visitas: number; visitas: number
internos: number; internos: number
permisoEspecial: number; permisoEspecial: number
estadoConfiguracion: number; estadoConfiguracion: number
fechaValidacionConf: string; fechaValidacionConf: string
realizoEncuesta: string; realizoEncuesta: string
encuestaActiva: number; encuestaActiva: number
fechaLimiteEncuesta: string; fechaLimiteEncuesta: string
codigoAccesoM: string; codigoAccesoM: string
tokenAccesoM: string; tokenAccesoM: string
deviceToken: string; deviceToken: string
idPerfil: number; idPerfil: number
departamento: string
} }

@ -0,0 +1,18 @@
export default interface IRptArcosa{
Patente: string,
Pedimento: string,
PagoPedimento: string,
Regimen: string,
ValorDls: Number,
ValorAduana: Number,
Aduana: Number,
Planta: string,
DTA: string,
PREV : string
IVA: string,
IGI : string,
CC: string,
Total : number
}

@ -0,0 +1,16 @@
export interface IRptFacturasFraccion{
factura : string,
almacen : string,
orden : number ;
parte : string,
pais : string ,
fraccionFacturaXML : string,
fraccionGEMCO : string,
nicoGEMCO : string;
}

@ -0,0 +1,10 @@
export default interface IRptFacturasPedimentosPagados{
Referencia: string
Pedido: string
Factura: string
UUID: string
Fecha : string
RazonSocial : string
}

@ -0,0 +1,24 @@
export default interface IRptOperacionesPagadasMissionFood {
TipoOperacion : string,
sPedimento: string,
UUID :string,
FolioFactura : string,
dFechaFirmaBanco : string,
sRazonSocial : string,
sRFC : string,
sRefrencia : string,
sEDocument : string,
sHRazonSocial : string,
sHidentificadorProv : string,
AA : string,
RFCAA : string,
Incoterm : string,
Caja : string,
AcuceDoda : string,
Transportista : string,
Edocument : string
}

@ -1,6 +1,8 @@
import http from '../common/http-common' import http from '../common/http-common'
import IConsolidadosSinCerrar from '../../Interfaces/Facturacion/Anexo/IConsolidadosSinCerrar' import IConsolidadosSinCerrar from '../../Interfaces/Facturacion/Anexo/IConsolidadosSinCerrar'
import DTOAnexoFacturacionMission from '../../DTO/Facturacion/Anexo/DTOAnexoFacturacionMission' import DTOAnexoFacturacionMission from '../../DTO/Facturacion/Anexo/DTOAnexoFacturacionMission'
import IConsolidadosSinFirmaBanco from '../../Interfaces/Facturacion/Anexo/IConsolidadosSinFirmaBanco'
class OperacionesDataService { class OperacionesDataService {
Get() { Get() {
@ -8,5 +10,20 @@ class OperacionesDataService {
`/AnexoFacturacion/GetRptConsolidadosSinCerrar` `/AnexoFacturacion/GetRptConsolidadosSinCerrar`
) )
} }
OperacionesSinFirmaBancoGet(){
return http.post<IConsolidadosSinFirmaBanco[]>(
`/AnexoFacturacion/GetRptConsolidadosSinFirmaBanco`
)
}
} }
export default new OperacionesDataService() export default new OperacionesDataService()

@ -17,6 +17,12 @@ import IRptOperacionesDiarias from '../../Interfaces/Reportes/IRptOperacionesDia
import { IRptPedimentosPagadosFacturasCruzadas } from '../../Interfaces/Reportes/IRptPedimentosPagadosFacturasCruzadas' import { IRptPedimentosPagadosFacturasCruzadas } from '../../Interfaces/Reportes/IRptPedimentosPagadosFacturasCruzadas'
import { IRptMonitoreoFacturaPagadasAmazon } from '../../Interfaces/Reportes/IRptMonitoreoFacturasPagadasAmazon' import { IRptMonitoreoFacturaPagadasAmazon } from '../../Interfaces/Reportes/IRptMonitoreoFacturasPagadasAmazon'
import DTORPTMonitorFacturasPagAmazon from '../../DTO/Utils/DTORPTMonitorFacturasPagAmazon' import DTORPTMonitorFacturasPagAmazon from '../../DTO/Utils/DTORPTMonitorFacturasPagAmazon'
import { IRptFacturasFraccion } from '../../Interfaces/Reportes/IRptContsFacturasFraccion'
import { data } from 'cypress/types/jquery'
import IRptMision from '../../Interfaces/Reportes/IRptOperacionesPagadasMisionFood'
import IRptOperacionesPagadasMissionFood from '../../Interfaces/Reportes/IRptOperacionesPagadasMisionFood'
import IRptFacturasPedimentosPagados from '../../Interfaces/Reportes/IRptFacturasPedimentosPagados'
import IRptArcosa from '../../Interfaces/Reportes/IRptArcosa'
class reportsDataService { class reportsDataService {
getRptPedimentosPagados(data: DTOReporte) { getRptPedimentosPagados(data: DTOReporte) {
return http.post<Array<IRptPedimentosPagados>>( return http.post<Array<IRptPedimentosPagados>>(
@ -115,5 +121,32 @@ class reportsDataService {
) )
} }
getRptContsFacturasFraccion(Referencia: string)
{
return http.get<Array<IRptFacturasFraccion>>(
`/reportes/RptContsFacturasConFraccion?Referencia=${Referencia}`
);
}
getRptOPeracionesPagadasMisionFood(data: DTOReporte) {
return http.post<Array<IRptOperacionesPagadasMissionFood>>(
'/reportes/RptOperacionesPagadasMissionFood', data
);
}
getRptFacturasPedimentosPagados(data: DTOReporte){
return http.post<Array<IRptFacturasPedimentosPagados>>(
'/reportes/RptFacturasPedimetosPagados', data
)
}
getRptArcosa(data: DTOReporte){
return http.post<Array<IRptArcosa>>(
'/reportes/RptArcosa', data
);
}
} }
export default new reportsDataService() export default new reportsDataService()

@ -29,6 +29,7 @@ import RptArchivoElectronicoOficial from './Components/Reportes/RptArchivoElectr
import RptBattery from './Components/Reportes/RptBattery' import RptBattery from './Components/Reportes/RptBattery'
import RptControlDocumentosClientes from './Components/Reportes/RptControlDocumentosClientes' import RptControlDocumentosClientes from './Components/Reportes/RptControlDocumentosClientes'
import RptConsolidadosSinCerrar from './Components/GEMCO/Facturacion/Anexo/RptConsolidadosSinCerrar' import RptConsolidadosSinCerrar from './Components/GEMCO/Facturacion/Anexo/RptConsolidadosSinCerrar'
import RtpConsolidadosSinFirmaBanco from './Components/GEMCO/Facturacion/Anexo/RptConsolidadosSinFirmaBanco'
import RptDetalleAnexo24 from './Components/Reportes/RptDetalleAnexo24' import RptDetalleAnexo24 from './Components/Reportes/RptDetalleAnexo24'
import RptFacturasTxtHeineken from './Components/Reportes/RptFacturasTxtHeineken' import RptFacturasTxtHeineken from './Components/Reportes/RptFacturasTxtHeineken'
import Notificaciones from './Components/Utils/Notificaciones/Notificaciones' import Notificaciones from './Components/Utils/Notificaciones/Notificaciones'
@ -64,6 +65,11 @@ import RptSegregacion from './Components/Clientes/Amazon/Reportes/Segregacion/Rp
import RptConsultaTrafico from './Components/Clientes/Amazon/Reportes/ConsultaTrafico/RptConsultaTrafico' import RptConsultaTrafico from './Components/Clientes/Amazon/Reportes/ConsultaTrafico/RptConsultaTrafico'
import RptMonitoreoFacturasPagadasAmazon from './Components/Reportes/RptMonitoreoFacturasPagadasAmazon' import RptMonitoreoFacturasPagadasAmazon from './Components/Reportes/RptMonitoreoFacturasPagadasAmazon'
import CatFraccionesVulnerables from './Components/Catalogos/CatFraccionesVulnerables/CatFraccionesVulnerables' import CatFraccionesVulnerables from './Components/Catalogos/CatFraccionesVulnerables/CatFraccionesVulnerables'
import RptFacturasFraccion from './Components/Reportes/RptContsFacturasFraccion'
import CatConceptosConsulta from './Components/Clientes/Amazon/Catalogos/CatConceptosConsulta'
import RptOperacionesPagadasMisionFood from './Components/Reportes/RptOperacionesPagadasMisionFood'
import RptFacturasPedimentosPagados from './Components/Reportes/RptFacturasPedimentosPagados'
import RptArcosa from './Components/Reportes/RptArcosa'
require(`./css/${process.env.REACT_APP_ENVIRONMENT}-home.css`) require(`./css/${process.env.REACT_APP_ENVIRONMENT}-home.css`)
@ -139,6 +145,11 @@ ReactDOM.render(
path="/RptConsolidadosSinCerrar" path="/RptConsolidadosSinCerrar"
element={<RptConsolidadosSinCerrar />} element={<RptConsolidadosSinCerrar />}
/> />
<Route
path="/RptConsolidadosSinFirmaBanco"
element={<RtpConsolidadosSinFirmaBanco />}
/>
<Route <Route
path="/RptOperacionesDiarias" path="/RptOperacionesDiarias"
element={<RptOperacionesDiarias />} element={<RptOperacionesDiarias />}
@ -150,7 +161,16 @@ ReactDOM.render(
<Route path="/CatTabuladores" element={<CatTabuladores />} /> <Route path="/CatTabuladores" element={<CatTabuladores />} />
<Route path="/RptPedidos" element={<RptPedidos />} /> <Route path="/RptPedidos" element={<RptPedidos />} />
<Route path="/Rpt1868Facturas" element={<Rpt1868Facturas />} /> <Route path="/Rpt1868Facturas" element={<Rpt1868Facturas />} />
<Route path = "/CatFraccionesVulnerables" element={<CatFraccionesVulnerables /> } /> <Route
path="/CatFraccionesVulnerables"
element={<CatFraccionesVulnerables />}
/>
<Route
path="/CatConceptosConsulta"
element={<CatConceptosConsulta />}
/>
<Route <Route
path="/Rpt1868Transportista" path="/Rpt1868Transportista"
element={<Rpt1868Transportista />} element={<Rpt1868Transportista />}
@ -194,10 +214,7 @@ ReactDOM.render(
path="/RptAmazonFacturasPagadas" path="/RptAmazonFacturasPagadas"
element={<RptAmazonFacturasPagadas />} element={<RptAmazonFacturasPagadas />}
/> />
<Route <Route path="/RptSegregacion" element={<RptSegregacion />} />
path="/RptSegregacion"
element={<RptSegregacion />}
/>
<Route <Route
path="/RptCasaCuervoCOVEs" path="/RptCasaCuervoCOVEs"
element={<RptCasaCuervoCOVEs />} element={<RptCasaCuervoCOVEs />}
@ -210,9 +227,15 @@ ReactDOM.render(
path="/RptPedimentosPagadosFacturasCruzadas" path="/RptPedimentosPagadosFacturasCruzadas"
element={<RptPedimentosPagadosFacturasCruzadas />} element={<RptPedimentosPagadosFacturasCruzadas />}
/> />
<Route <Route
path="/RptMonitoreoFacturasPagadasAmazon" path="/RptOperacionesPagadasMisionFood"
element = {<RptMonitoreoFacturasPagadasAmazon />} element={<RptOperacionesPagadasMisionFood />}
/>
<Route
path="/RptMonitoreoFacturasPagadasAmazon"
element={<RptMonitoreoFacturasPagadasAmazon />}
/> />
<Route <Route
path="/RptPedimentosCruces01" path="/RptPedimentosCruces01"
@ -238,6 +261,17 @@ ReactDOM.render(
path="/RptPedimentosCruces06" path="/RptPedimentosCruces06"
element={<RptPedimentosCruces06 />} element={<RptPedimentosCruces06 />}
/> />
<Route
path="/RptConsFacturasFraccion"
element={<RptFacturasFraccion />}
/>
<Route
path="/RptFacturasPedimentosPagados"
element={<RptFacturasPedimentosPagados />}
/>
<Route path="/RptArcosa" element={<RptArcosa />} />
<Route path="*" element={<PageNotFound />} /> <Route path="*" element={<PageNotFound />} />
</Route> </Route>
</Routes> </Routes>

@ -0,0 +1,50 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import ICat2096CatConceptosConsulta from '../../../../Components/Clientes/Amazon/Interfaces/I2096CatConceptosConsulta'
const CatConcetosConsulta: ICat2096CatConceptosConsulta[] = []
const initialState = { CatConcetosConsulta }
export const CatConceptosConsultaSlice = createSlice({
name: 'CatConceptosConsulta',
initialState: initialState,
reducers: {
initializeCatConcetosConsulta: (state, action: PayloadAction<ICat2096CatConceptosConsulta[]>) => {
state.CatConcetosConsulta = action.payload
},
populateCatConcetosConsultas: (state, action: PayloadAction<ICat2096CatConceptosConsulta[]>) => {
action.payload.forEach((newItem) => {
var Existe = state.CatConcetosConsulta.find(function (onMemoryItem) {
return onMemoryItem.id === newItem.id
})
if (!Existe) state.CatConcetosConsulta.push(newItem)
})
},
addCatConcetosConsulta: (state, action: PayloadAction<ICat2096CatConceptosConsulta>) => {
var Existe = state.CatConcetosConsulta.find(function (item) {
return item.id === action.payload.id
})
if (!Existe) state.CatConcetosConsulta.push(action.payload)
},
updateCatConcetosConsulta: (state, action: PayloadAction<ICat2096CatConceptosConsulta>) => {
const i = state.CatConcetosConsulta.findIndex(
(_element) => _element.id === action.payload.id
)
if (i > -1) state.CatConcetosConsulta[i] = action.payload
else state.CatConcetosConsulta.push(action.payload)
},
updateCatConcetosConsultaDetail: (state, action: PayloadAction<ICat2096CatConceptosConsulta>) => {
const i = state.CatConcetosConsulta.findIndex(
(_element) => _element.id === action.payload.id
)
if (i > -1) state.CatConcetosConsulta[i] = action.payload
else state.CatConcetosConsulta.push(action.payload)
},
deleteCatConcetosConsulta: (state, action: PayloadAction<number>) => {
const newArr = state.CatConcetosConsulta.filter((data) => data.id != action.payload)
state.CatConcetosConsulta = newArr
}
}
})
export const { initializeCatConcetosConsulta, addCatConcetosConsulta, populateCatConcetosConsultas, updateCatConcetosConsulta, deleteCatConcetosConsulta } =
CatConceptosConsultaSlice.actions
export default CatConceptosConsultaSlice.reducer

@ -18,6 +18,7 @@ import CorresponsalesCuentasComplementariasEstatusSlice from './features/Corresp
import AmazonInvoicesSlice from './features/Clientes/2096/AmazonInvoices' import AmazonInvoicesSlice from './features/Clientes/2096/AmazonInvoices'
import AmazonNoPartesSlice from './features/Clientes/2096/AmazonNoPartes' import AmazonNoPartesSlice from './features/Clientes/2096/AmazonNoPartes'
import AmazonTraficoConsultaSlice from './features/Clientes/2096/AmazonTraficoConsulta' import AmazonTraficoConsultaSlice from './features/Clientes/2096/AmazonTraficoConsulta'
import AmazonCatConceptosConsulta from './features/Clientes/2096/AmazonCatConceptosConsulta'
@ -41,7 +42,8 @@ export const store = configureStore({
CCueCompEstatus : CorresponsalesCuentasComplementariasEstatusSlice, CCueCompEstatus : CorresponsalesCuentasComplementariasEstatusSlice,
AmazonInvoices : AmazonInvoicesSlice, AmazonInvoices : AmazonInvoicesSlice,
AmazonNoPartes: AmazonNoPartesSlice, AmazonNoPartes: AmazonNoPartesSlice,
AmazonTraficoConsulta: AmazonTraficoConsultaSlice AmazonTraficoConsulta: AmazonTraficoConsultaSlice,
AmazonCatConceptosConsulta: AmazonCatConceptosConsulta
} }
}) })

Loading…
Cancel
Save