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",
"version": "0.1.0",
"version": "3.2.0",
"homepage": ".",
"private": true,
"dependencies": {
@ -69,7 +69,7 @@
"start-dev": "env-cmd -f .env.development react-scripts start",
"start-qa": "env-cmd -f .env.qa 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",
"test": "react-scripts test",
"eject": "react-scripts eject"

@ -1,5 +1,5 @@
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 ICatFraccionesVulnerables from '../../../Interfaces/Catalogos/ICatFraccionesVulnerables'
import FraccionesVulnerables from '../../../Services/Catalogos/FraccionesVulnerables'
@ -11,6 +11,12 @@ import { FaEraser } from 'react-icons/fa'
import { FormControl } from 'react-bootstrap'
import { AiFillCloseCircle } 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
interface IProps {}
@ -31,20 +37,19 @@ export default function CatFraccionesVulnerables(props: IProps) {
// const mFraccionesVulnerables = useSelector((state: RootState) => state.CatFraccionesVulnerables.CatFraccionesVulnerables);
const [header, setHeader] = useState<string>('') // Specify the type of 'header'
// 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 [id, setId] = useState<number>(0) // Specify the type of 'id'
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 [showModal, setShowModal] = useState<boolean>(false)
const [editMode, setEditMode] = useState(false) // Nuevo estado para controlar el modo de edición
const [selectedRow, setSelectedRow] =
useState<ICatFraccionesVulnerables | null>(null) // Nuevo estado para almacenar la fila seleccionada
// const [fraccionesVulnerables, setFraccionesVulnerables] = useState([]);
const [modalFileManager, setModalFileManager] = useState(false)
const msgColor = 'primary'
const columnsFraccionesVulnerables = [
{
@ -123,6 +128,9 @@ export default function CatFraccionesVulnerables(props: IProps) {
setNico(data.nico)
}
// const truncatedValue = inputValue.substring(0, 8)
// setFraccion(truncatedValue)
const generaReporte = () => {
setTipoReporte(0)
FraccionesVulnerables.getAll()
@ -130,6 +138,10 @@ export default function CatFraccionesVulnerables(props: IProps) {
setData(response.data)
setDataOriginal(response.data)
// uploadAllRows(response.data)
setHeader('Informativo')
setMsg('Se encontro la siguiente informacion...')
setShowMsg(true)
})
.catch((e: Error) => {
setHeader('Error')
@ -155,7 +167,7 @@ export default function CatFraccionesVulnerables(props: IProps) {
setSelectedRow(null)
setFraccion(0)
setNico('')
setNico('0')
setActivo(0) // Establecer a 0 (No)
setEditMode(true)
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 () => {
if (id === 0) {
if (Nico.length > 2) {
console.log(
'El valor de Nico tiene más de 2 caracteres. No se actualizará la tabla ni se realizará la petición uploadFile.'
)
return
const fraccionAsString = Fraccion.toString()
if (fraccionAsString.length !== 8 || Nico.length !== 2) {
setHeader('Error')
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 = {
@ -223,28 +287,35 @@ export default function CatFraccionesVulnerables(props: IProps) {
// console.log('este el id normal ' + id)
// Restablecer valores de los campos
setFraccion(0)
setNico('')
setActivo(1)
setEditMode(false)
setShowModal(false)
handleCreateNewRecord()
} catch (error) {
console.error('Error durante la inserción:', error)
}
} else {
// Aquí actualizamos el registro existente
if (Nico.length > 2) {
console.log(
'El valor de Nico tiene más de 2 caracteres. No se actualizará la tabla ni se realizará la petición uploadFile.'
)
return // Sale de la función sin hacer nada más
const fraccionAsString = Fraccion.toString()
if (fraccionAsString.length !== 8) {
setHeader('Error')
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) =>
row.id === selectedRow?.id
? { ...row, fraccion: Fraccion, nico: Nico, activo: Activo }
: row
)
setData(updatedData)
const updatedRow = updatedData.find((row) => row.id === selectedRow?.id)
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 value = parseFloat(e.target.value)
setFraccion(isNaN(value) ? 0 : value)
}
// Función para manejar el cambio en el campo de entrada de la fracción
return (
<div className="mt-2">
<Card>
@ -329,9 +401,12 @@ export default function CatFraccionesVulnerables(props: IProps) {
type="text"
value={Fraccion}
onChange={handleFraccionChange}
onKeyDown={handleFraccionKeyDown}
onBlur={handleFraccionBlur}
inputMode="numeric"
className="orm-select mx-2"
maxLength={8}
minLength={8}
style={{
backgroundColor: 'white',
color: 'black',
@ -351,9 +426,14 @@ export default function CatFraccionesVulnerables(props: IProps) {
<FormControl
type="text"
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"
maxLength={2}
minLength={2}
style={{
backgroundColor: 'white',
color: 'black',
@ -481,6 +561,15 @@ export default function CatFraccionesVulnerables(props: IProps) {
</div>
</Card.Body>
</Card>
<MsgInformativo
show={show}
msg={msg}
header={header}
msgColor={msgColor}
closeToast={() => {
setShowMsg(false)
}}
/>
</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>
<Modal
show={showModal}

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

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

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

@ -1,4 +1,5 @@
export default interface DTO2096RptFacturasPagadas {
factura: string,
pedimento: string,
fechaPago: string,
@ -7,5 +8,6 @@ export default interface DTO2096RptFacturasPagadas {
valorDolares: string,
valorAduana: 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
estatus: number
autorizado: boolean
tipoConsulta: number
cumplimientoNormativo: string
comentarios: string
sightLine: boolean

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

@ -4,6 +4,7 @@ import {
Button,
Card,
Col,
Form,
FormCheck,
Modal,
Row,
@ -35,6 +36,8 @@ import { MFileManager } from '../../../../../Utils/MFileManager/MFileManager'
import { AiFillWarning } from 'react-icons/ai'
import { PrioritySelector } from '../PrioritySelector/PrioritySelector'
import IFileManager from '../../../../../../Interfaces/Utils/IFileManager'
import { VscHubot } from 'react-icons/vsc'
import { populateCatConcetosConsultas } from '../../../../../../store/features/Clientes/2096/AmazonCatConceptosConsulta'
export interface IRtpAmazonPendingInvoicesProps {}
@ -64,6 +67,7 @@ export default function RtpAmazonPendingInvoices(
const [WaitingMessage, setWaitingMessage] = useState('Generado...')
const [ShowModal, setShowModal] = useState(false)
const [ShowModalW, setShowModalW] = useState(false)
const [BOTEnabled, setBOTEnabled] = useState(false)
const [msg, setMsg] = useState('')
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(() => {
loadReport()
loadCatalogoTipoConsultas()
}, [])
const check4Updates = (IDInvoice: number) => {
@ -121,16 +136,10 @@ export default function RtpAmazonPendingInvoices(
const descargaArchivoExcepciones = () => {
setShowModalW(false)
setWaitingMessage('Archivo de excepciones')
setWaitingDialog(true)
DSAmazon.ExceptionsFileAmazonGET(IDFactura)
/* setWaitingDialog(true)*/
/* DSAmazon.ExceptionsFileAmazonGET(IDFactura)
.then((response: any) => {
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() */
if (response.status === 200) {*/
DSAmazon.EnviaEsperaRespuestaAmazon(IDFactura)
.then((response) => {
loadReport()
@ -145,14 +154,14 @@ export default function RtpAmazonPendingInvoices(
setShowMsg(true)
return
})
}
})
// }
/* })
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error')
setShowMsg(true)
return
})
}) */
}
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 (
<div>
<Card>
@ -317,7 +356,30 @@ export default function RtpAmazonPendingInvoices(
CLASIFICACION : facturas pendientes
</Card.Title>
</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}>
<Alert
variant="primary"
@ -379,7 +441,7 @@ export default function RtpAmazonPendingInvoices(
<tr>
<th style={{ width: '50px' }}></th>
<th style={{ width: '50px' }}>id</th>
<th style={{ width: '50px', paddingRight:'20px' }}>
<th style={{ width: '50px', paddingRight: '20px' }}>
<IconContext.Provider
value={{ color: 'yellow', size: '20px' }}
>
@ -389,7 +451,7 @@ export default function RtpAmazonPendingInvoices(
<th style={{ width: '50px' }}></th>
<th style={{ width: '80px' }}>Commercial Invoice Date</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' }}>Qty Unit of measure</th>
<th style={{ width: '100px' }}>Tot Qty</th>
@ -441,7 +503,8 @@ export default function RtpAmazonPendingInvoices(
}
key={MasterData.id}
onClick={() => {
toggleExpandRow(MasterData)
//toggleExpandRow(MasterData)
RunBOT(MasterData)
}}
>
{MasterData.max === true ? (
@ -459,10 +522,15 @@ export default function RtpAmazonPendingInvoices(
)}
</td>
<td>{MasterData.id}</td>
<td style={{textAlign:'left'}}>
<PrioritySelector IDInvoice={MasterData.id} Priority={MasterData.urgente} canChange={['Clasificador lider', 'Administrador'].includes(
Perfil
)}/>
<td style={{ textAlign: 'left' }}>
<PrioritySelector
IDInvoice={MasterData.id}
Priority={MasterData.urgente}
canChange={[
'Clasificador lider',
'Administrador'
].includes(Perfil)}
/>
</td>
<td>
<FormCheck
@ -800,7 +868,9 @@ export default function RtpAmazonPendingInvoices(
return (
<RtpAmazonPendingClasificationInvoicesDetail
IDMaster={MasterData.id}
Prioridad={MasterData.urgente}
Prioridad={
MasterData.urgente
}
detail={detail}
Deshabilitado={
detail.destinationHTSCode
@ -937,6 +1007,13 @@ export default function RtpAmazonPendingInvoices(
</Modal.Header>
<Modal.Body>
<img src={loadingImg} style={{ height: '150px' }} alt="proccessing" />
{WaitingMessage.includes('BOT') ? (
<IconContext.Provider value={{ color: 'green', size: '65px' }}>
<VscHubot />
</IconContext.Provider>
) : (
''
)}
{WaitingMessage}
</Modal.Body>
<Modal.Footer></Modal.Footer>
@ -1017,8 +1094,9 @@ export default function RtpAmazonPendingInvoices(
Proceso={IDProcess}
showPreview={0}
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>
</Row>

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

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

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

@ -144,18 +144,6 @@ export default function RptConsultaTrafico(props: IRptConsultaTraficoProps) {
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]) {
return Cadena.slice(Cadena.indexOf(char1) + 1, Cadena.lastIndexOf(char2))
}
@ -191,9 +179,6 @@ export default function RptConsultaTrafico(props: IRptConsultaTraficoProps) {
<th></th>
<th style={{ width: '50px' }}>id</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: '80px' }}>Commercial Invoice Date</th>
<th style={{ width: '250px' }}>Invoice Number</th>

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

@ -25,6 +25,7 @@ import { AiFillFileExcel } from 'react-icons/ai'
import { IconContext } from 'react-icons'
import { BsChevronDown, BsChevronRight, BsFilePdfFill } from 'react-icons/bs'
import { FaAmazon } from 'react-icons/fa'
import { BsSearch, BsFileEarmarkExcel } from 'react-icons/bs'
import loadingImg from '../../../../../images/ajaxloader.gif'
import { MFileManager } from '../../../../Utils/MFileManager/MFileManager'
import DTO2096RptPayedOperations from '../../DTO/DTO2096RptPayedOperations'
@ -33,6 +34,7 @@ import IFileManager from '../../../../../Interfaces/Utils/IFileManager'
import DTO2096RptFacturasPagadas from '../../DTO/DTO2096RptFacturasPagadas'
import DataTable from 'react-data-table-component'
import * as XLSX from 'xlsx'
import DTOAmazonSegragacion from '../../DTO/DTOAmazonSegragacion'
export interface IRptSegregacionProps {}
@ -45,7 +47,7 @@ export default function RptSegregacion(props: IRptSegregacionProps) {
const [Referencia, setReferencia] = useState('')
const [Inicio, setInicio] = useState(currentDate())
const [Fin, setFin] = useState(currentDate())
const [Data, setData] = useState<DTO2096RptFacturasPagadas[]>([])
const [Data, setData] = useState<DTOAmazonSegragacion[]>([])
const [show, setShowMsg] = useState(false)
const [ShowModal, setShowModal] = useState(false)
const [WaitingDialog, setWaitingDialog] = useState(false)
@ -56,61 +58,50 @@ export default function RptSegregacion(props: IRptSegregacionProps) {
const [IDFactura, setIDFactura] = useState(0)
const [Invoices, setInvoices] = useState<number[]>([])
const msgColor = 'primary'
const columnsConcepts = [
{
name: 'Factura',
width: '350px',
selector: (row: DTO2096RptFacturasPagadas) => row.factura,
name: 'VRID',
width: '150px',
selector: (row: DTOAmazonSegragacion) => row.vrid,
sortable: true
},
{
name: 'Pedimento',
width: '120px',
selector: (row: DTO2096RptFacturasPagadas) => row.pedimento,
name: 'ASIN',
width: '150px',
selector: (row: DTOAmazonSegragacion) => row.asin,
sortable: true
},
{
name: 'Fecha pago',
width: '120px',
selector: (row: DTO2096RptFacturasPagadas) =>
row.fechaPago.substring(0, 10),
name: 'Quantyty',
width: '100px',
selector: (row: DTOAmazonSegragacion) => row.quantity,
sortable: true
},
{
name: 'Clave',
width: '80px',
selector: (row: DTO2096RptFacturasPagadas) => row.clave,
name: 'Descripcion',
width: '250px',
selector: (row: DTOAmazonSegragacion) => row.descripcion,
sortable: true
},
{
name: 'Tipo Op',
width: '120px',
selector: (row: DTO2096RptFacturasPagadas) => row.tipoOp,
sortable: true
},
{
name: 'Valor Dolares',
width: '130px',
selector: (row: DTO2096RptFacturasPagadas) => row.valorDolares,
name: 'Motivo',
width: '2100px',
selector: (row: DTOAmazonSegragacion) => row.motivo,
sortable: true
},
{
name: 'Valor Aduana',
width: '130px',
selector: (row: DTO2096RptFacturasPagadas) => row.valorAduana,
name: 'FSegregacion',
width: '160px',
selector: (row: DTOAmazonSegragacion) => row.fSegregacion,
sortable: true
},
{
name: 'Razon Social',
width: '350px',
selector: (row: DTO2096RptFacturasPagadas) => row.razonSocial,
name: 'ValorMercancia',
width: '160px',
selector: (row: DTOAmazonSegragacion) => row.valorMercancia,
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 (
<div>
<Card>
@ -189,8 +190,47 @@ export default function RptSegregacion(props: IRptSegregacionProps) {
downloadReport()
}}
>
<Button variant="primary">Descargar</Button>
<Button variant="primary">
<BsFileEarmarkExcel />
Descargar
</Button>
</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>
</Card.Body>
</Card>

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

@ -25,20 +25,20 @@ export default function Dashboard(props: IProps) {
<br />
<Container>
<Row xs={1} md={3} className='g-4'>
{[['Direcccion', 'Sistemas', 'Corresponsalias'].includes(Depto) ? <DashboardCorresponsales /> : ''].map(
{/* {[['Direcccion', 'Sistemas', 'Corresponsalias'].includes(Depto) ? <DashboardCorresponsales /> : ''].map(
(item) => {
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>
})}
{[['Heineken1'].includes(User) ? <Heineken1 /> : ''].map((item) => {
})} */}
{/* {[['Heineken1'].includes(User) ? <Heineken1 /> : ''].map((item) => {
return <React.Fragment>{item}</React.Fragment>
})}
{[['Direcccion', 'Sistemas', 'Facturacion'].includes(Depto) ? <DashboardFacturacion /> : ''].map((item) => {
return <React.Fragment>{item}</React.Fragment>
})}
})} */}
{[['Direcccion', 'Sistemas', 'Operaciones', 'Clasificacion'].includes(Depto) ? <DashboardClasificacion /> : ''].map((item) => {
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 Dashboard from '../Dashboard/Dashboard'
import { Nav } from 'react-bootstrap'
import Info from '../../../package.json'
export const Login: React.FC<{}> = () => {
const dispatch = useDispatch()
@ -132,6 +133,7 @@ export const Login: React.FC<{}> = () => {
login
</button>
</div>
<div style={{textAlign:'right'}}>v{Info.version}</div>
</Form>
</Formik>
</div>

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

@ -18,6 +18,8 @@ import {
import { useEffect, useState } from 'react'
import IPerfilesMenu from '../../Interfaces/IPerfilesMenu'
import { IPerfil } from '../../Interfaces/Catalogos/IPerfiles'
// import { IDepartamento } from '../../Interfaces/Catalogos/IDepartamento'
import PerfilesMenuServices from '../../Services/Catalogos/PerfilesMenu.Services'
import ClientesServices from '../../Services/Catalogos/Clientes.Services'
import usuariosServices from '../../Services/Catalogos/Usuarios.Services'
@ -34,6 +36,7 @@ import DTOUsuariosShort from '../../DTO/DTOUsuariosShort'
import DTOClonarUsuario from '../../DTO/DTOClonarUsuario'
import { AdmonPerfiles } from './admonPerfiles/AdmonPerfiles'
import { Form as FormCtrl } from 'react-bootstrap'
import { Console } from 'console'
interface IProps {}
@ -52,7 +55,7 @@ const SignupSchema = Yup.object().shape({
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 stickyValue = window.localStorage.getItem('UserId')
return stickyValue !== null ? JSON.parse(stickyValue) : 0
@ -92,6 +95,7 @@ export default function Register(props:IProps) {
const [TokenAccesoM, setTokenAccesoM] = useState('')
const [DeviceToken, setDeviceToken] = useState('')
const [IdPerfil, setIdPerfil] = useState(0)
const [Departamento, setDepartamento] = useState('')
const [user2Clone, setUser2Clone] = React.useState(0)
const [perfiles, setPerfiles] = useState<IPerfil[]>([
{
@ -140,7 +144,8 @@ export default function Register(props:IProps) {
codigoAccesoM: CodigoAccesoM,
tokenAccesoM: TokenAccesoM,
deviceToken: DeviceToken,
idPerfil: IdPerfil
idPerfil: IdPerfil,
departamento: Departamento
}
const initialValuesPerfiles: IPerfil = {
@ -148,6 +153,11 @@ export default function Register(props:IProps) {
perfil: ''
}
// const initialValuesDepartamento: IDepartamento = {
// id: Dept,
// descripcion: ''
// }
function getUsuario() {
const item = localStorage.getItem('tokenInfo')
let Usr = ''
@ -367,13 +377,13 @@ export default function Register(props:IProps) {
}
const CloseModalPerfiles = (show: boolean): void => {
//setmodalAdmonPerfiles(false);
setmodalAdmonPerfiles(false)
}
function loadAllUserInfo(id: number) {}
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)
setUsuario(data.usuario)
setNombre(data.nombre)
@ -381,16 +391,20 @@ export default function Register(props:IProps) {
setCorreo(data.correo)
setIdPerfil(data.idPerfil)
loadAllUserInfo(data.id)
setTipoUsuario(data.tipoUsuario)
setDepartamento(data.departamento)
setDept(data.dept)
}
const clonaInformacion = (): void => {
// alert(IdPerfil)
// alert(IdPerfil)
if (IdPerfil == 0) {
setToastPerfil(true)
setmsgDialog('')
return
} else
setShowConfirmation(true)
} else setShowConfirmation(true)
}
const ChangeUser2Clone = (e: any): void => {
@ -542,6 +556,7 @@ export default function Register(props:IProps) {
name="nombre"
className="form-control"
placeholder="nombre"
// onChange={(e) => setNombre(e.target.value)}
/>
{errors.nombre && touched.nombre ? (
<div>
@ -683,24 +698,40 @@ export default function Register(props:IProps) {
</Field>
</div>
</div>
<div className="col">
<div className="form-group">
<label
className="text-info"
htmlFor="fechaModifico"
htmlFor="Departamento"
>
Fecha modifico
Departamento
</label>
<Field
id="fechaModifico"
name="fechaModifico"
readOnly="readOnly"
className="form-control"
placeholder="Fecha modifico"
defaultValue={currentDate()}
/>
<FormCtrl.Control
as="select"
value={Dept}
onChange={
(e) => setDept(parseInt(e.target.value))
// setDepartamento(e.target.value)
}
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>
{/* aquo termina el div */}
</div>
</Accordion.Body>
</Accordion.Item>
@ -770,6 +801,8 @@ export default function Register(props:IProps) {
name="dept"
className="form-control"
placeholder="departamento"
// IsReadOnly="True"
disabled="diabled"
/>
</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) => {
return (
<div>
<ToastContainer position={'middle-center'}>
<ToastContainer position={'middle-center'} style={{zIndex:'99999 !important'}} >
<Toast
show={props.show}
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 {
id: number;
usuario: string;
nombre: string;
contrasena: string;
correo: string;
tipoUsuario: number;
activo: number;
fechaAlta: string;
usuarioAlta: number;
fechaModifico: string;
usuarioModifico: number;
fechaElimino: string;
usuarioElimino: number;
motivoElimino: string;
idModulo: number;
dept: number;
tmercancia: number;
fechaUltimaVisita: string;
visitas: number;
internos: number;
permisoEspecial: number;
estadoConfiguracion: number;
fechaValidacionConf: string;
realizoEncuesta: string;
encuestaActiva: number;
fechaLimiteEncuesta: string;
codigoAccesoM: string;
tokenAccesoM: string;
deviceToken: string;
idPerfil: number;
id: number
usuario: string
nombre: string
contrasena: string
correo: string
tipoUsuario: number
activo: number
fechaAlta: string
usuarioAlta: number
fechaModifico: string
usuarioModifico: number
fechaElimino: string
usuarioElimino: number
motivoElimino: string
idModulo: number
dept: number
tmercancia: number
fechaUltimaVisita: string
visitas: number
internos: number
permisoEspecial: number
estadoConfiguracion: number
fechaValidacionConf: string
realizoEncuesta: string
encuestaActiva: number
fechaLimiteEncuesta: string
codigoAccesoM: string
tokenAccesoM: string
deviceToken: string
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 IConsolidadosSinCerrar from '../../Interfaces/Facturacion/Anexo/IConsolidadosSinCerrar'
import DTOAnexoFacturacionMission from '../../DTO/Facturacion/Anexo/DTOAnexoFacturacionMission'
import IConsolidadosSinFirmaBanco from '../../Interfaces/Facturacion/Anexo/IConsolidadosSinFirmaBanco'
class OperacionesDataService {
Get() {
@ -8,5 +10,20 @@ class OperacionesDataService {
`/AnexoFacturacion/GetRptConsolidadosSinCerrar`
)
}
OperacionesSinFirmaBancoGet(){
return http.post<IConsolidadosSinFirmaBanco[]>(
`/AnexoFacturacion/GetRptConsolidadosSinFirmaBanco`
)
}
}
export default new OperacionesDataService()

@ -17,6 +17,12 @@ import IRptOperacionesDiarias from '../../Interfaces/Reportes/IRptOperacionesDia
import { IRptPedimentosPagadosFacturasCruzadas } from '../../Interfaces/Reportes/IRptPedimentosPagadosFacturasCruzadas'
import { IRptMonitoreoFacturaPagadasAmazon } from '../../Interfaces/Reportes/IRptMonitoreoFacturasPagadasAmazon'
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 {
getRptPedimentosPagados(data: DTOReporte) {
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()

@ -29,6 +29,7 @@ import RptArchivoElectronicoOficial from './Components/Reportes/RptArchivoElectr
import RptBattery from './Components/Reportes/RptBattery'
import RptControlDocumentosClientes from './Components/Reportes/RptControlDocumentosClientes'
import RptConsolidadosSinCerrar from './Components/GEMCO/Facturacion/Anexo/RptConsolidadosSinCerrar'
import RtpConsolidadosSinFirmaBanco from './Components/GEMCO/Facturacion/Anexo/RptConsolidadosSinFirmaBanco'
import RptDetalleAnexo24 from './Components/Reportes/RptDetalleAnexo24'
import RptFacturasTxtHeineken from './Components/Reportes/RptFacturasTxtHeineken'
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 RptMonitoreoFacturasPagadasAmazon from './Components/Reportes/RptMonitoreoFacturasPagadasAmazon'
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`)
@ -139,6 +145,11 @@ ReactDOM.render(
path="/RptConsolidadosSinCerrar"
element={<RptConsolidadosSinCerrar />}
/>
<Route
path="/RptConsolidadosSinFirmaBanco"
element={<RtpConsolidadosSinFirmaBanco />}
/>
<Route
path="/RptOperacionesDiarias"
element={<RptOperacionesDiarias />}
@ -150,7 +161,16 @@ ReactDOM.render(
<Route path="/CatTabuladores" element={<CatTabuladores />} />
<Route path="/RptPedidos" element={<RptPedidos />} />
<Route path="/Rpt1868Facturas" element={<Rpt1868Facturas />} />
<Route path = "/CatFraccionesVulnerables" element={<CatFraccionesVulnerables /> } />
<Route
path="/CatFraccionesVulnerables"
element={<CatFraccionesVulnerables />}
/>
<Route
path="/CatConceptosConsulta"
element={<CatConceptosConsulta />}
/>
<Route
path="/Rpt1868Transportista"
element={<Rpt1868Transportista />}
@ -194,10 +214,7 @@ ReactDOM.render(
path="/RptAmazonFacturasPagadas"
element={<RptAmazonFacturasPagadas />}
/>
<Route
path="/RptSegregacion"
element={<RptSegregacion />}
/>
<Route path="/RptSegregacion" element={<RptSegregacion />} />
<Route
path="/RptCasaCuervoCOVEs"
element={<RptCasaCuervoCOVEs />}
@ -210,9 +227,15 @@ ReactDOM.render(
path="/RptPedimentosPagadosFacturasCruzadas"
element={<RptPedimentosPagadosFacturasCruzadas />}
/>
<Route
path="/RptMonitoreoFacturasPagadasAmazon"
element = {<RptMonitoreoFacturasPagadasAmazon />}
path="/RptOperacionesPagadasMisionFood"
element={<RptOperacionesPagadasMisionFood />}
/>
<Route
path="/RptMonitoreoFacturasPagadasAmazon"
element={<RptMonitoreoFacturasPagadasAmazon />}
/>
<Route
path="/RptPedimentosCruces01"
@ -238,6 +261,17 @@ ReactDOM.render(
path="/RptPedimentosCruces06"
element={<RptPedimentosCruces06 />}
/>
<Route
path="/RptConsFacturasFraccion"
element={<RptFacturasFraccion />}
/>
<Route
path="/RptFacturasPedimentosPagados"
element={<RptFacturasPedimentosPagados />}
/>
<Route path="/RptArcosa" element={<RptArcosa />} />
<Route path="*" element={<PageNotFound />} />
</Route>
</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 AmazonNoPartesSlice from './features/Clientes/2096/AmazonNoPartes'
import AmazonTraficoConsultaSlice from './features/Clientes/2096/AmazonTraficoConsulta'
import AmazonCatConceptosConsulta from './features/Clientes/2096/AmazonCatConceptosConsulta'
@ -41,7 +42,8 @@ export const store = configureStore({
CCueCompEstatus : CorresponsalesCuentasComplementariasEstatusSlice,
AmazonInvoices : AmazonInvoicesSlice,
AmazonNoPartes: AmazonNoPartesSlice,
AmazonTraficoConsulta: AmazonTraficoConsultaSlice
AmazonTraficoConsulta: AmazonTraficoConsultaSlice,
AmazonCatConceptosConsulta: AmazonCatConceptosConsulta
}
})

Loading…
Cancel
Save