Se le hacen mejoras al catalogo de numero de partes

AmazonRelease1.1
unknown 2 years ago
parent d0a8d07ca0
commit 82b77d1e6e
  1. 6
      src/Components/Clientes/Amazon/Components/ComboSelect/ComboDescripcion.tsx
  2. 5
      src/Components/Clientes/Amazon/Components/ComboSelect/ComboFraccion.tsx
  3. 5
      src/Components/Clientes/Amazon/DTO/DTO2096Estatus.ts
  4. 7
      src/Components/Clientes/Amazon/DTO/DTO2096NoParte.ts
  5. 5
      src/Components/Clientes/Amazon/Interfaces/I2096NoParte.ts
  6. 113
      src/Components/Clientes/Amazon/Reportes/AmazonNoPartes.tsx
  7. 77
      src/Components/Clientes/Amazon/Reportes/Clasification/Finished/RptAmazonFinishedClasificationInvoices.tsx
  8. 1
      src/Components/Clientes/Amazon/Reportes/Clasification/Finished/RptAmazonFinishedClasificationInvoicesDetail.tsx
  9. 1
      src/Components/Clientes/Amazon/Reportes/Clasification/Pending/ClasificatorAssign.tsx
  10. 169
      src/Components/Clientes/Amazon/Reportes/Clasification/Pending/RptAmazonPendingClasificationInvoices.tsx
  11. 104
      src/Components/Clientes/Amazon/Reportes/Clasification/Pending/RptAmazonPendingClasificationInvoicesDetail.tsx
  12. 109
      src/Components/Clientes/Amazon/Reportes/Clasification/WaitingAnswer/RptPendingAnswerFromAmazon.tsx
  13. 36
      src/Components/Clientes/Amazon/Reportes/Clasification/WaitingAnswer/RptPendingAnswerFromAmazonDetail.tsx
  14. 4
      src/Components/Clientes/Amazon/Reportes/Traffic/Linking/RptAmazonLinkInvoice2Traffic.tsx
  15. 1
      src/Components/Clientes/Amazon/Reportes/Traffic/Linking/RptAmazonLinkInvoice2TrafficDetail.tsx
  16. 14
      src/Components/Clientes/Amazon/Services/Amazon.Services.ts

@ -21,6 +21,7 @@ export interface IComboDescripcionProps {
DescripcionOriginal: string
Deshabilitado: boolean
ConfirmaDescripcion: number
Detail: I2096Detail
}
export function ComboDescripcion(props: IComboDescripcionProps) {
@ -150,9 +151,10 @@ export function ComboDescripcion(props: IComboDescripcionProps) {
onChange={(e) => changeValidacion(parseInt(e.target.value))}
value={Validacion}
>
<option value="0"> </option>
<option value="1"> = </option>
{props.Detail.validaFraccionOriginal===0 ? <option value="0"> </option> : '' }
{props.Detail.validaFraccionOriginal===0 ? <option value="1"> = </option> : ''}
<option value="2"> != </option>
{props.Detail.validaFraccionOriginal===3 ? <option value="3"> Ok </option> : ''}
</Form.Control>
<Modal
show={showModal}

@ -182,9 +182,10 @@ export function ComboFraccion(props: IComboFraccionProps) {
onChange={(e) => changeValidacion(parseInt(e.target.value))}
value={Validacion}
>
<option value="0"> </option>
<option value="1"> = </option>
{props.Detail.validaFraccionOriginal===0 ? <option value="0"> </option> : '' }
{props.Detail.validaFraccionOriginal===0 ? <option value="1"> = </option> : ''}
<option value="2"> != </option>
{props.Detail.validaFraccionOriginal===3 ? <option value="3"> Ok </option> : ''}
</Form.Control>
<Modal
show={showModal}

@ -0,0 +1,5 @@
export default interface DTO2096Estatus {
code: number,
respuesta: string,
estatus: number
}

@ -0,0 +1,7 @@
export default interface DTO2096NoParte {
id: number
fraccionGEMCO: string
subdivisionGEMCO: string
descripcionAgenteAduanal: string
usuario: number
}

@ -14,8 +14,7 @@ export default interface I2096NoParte {
paisOrigen: string,
unidadMedidaFactura: string,
unidadMedidaCOVE: string,
usuarioConfirmacion: number,
fechaModificacion: string,
usuarioModificacion: number,
FHActualizacion: string,
usuarioActualizacion: number,
activo: number
}

@ -4,7 +4,8 @@ import DataTable from 'react-data-table-component'
import I2096NoParte from '../Interfaces/I2096NoParte'
import AmazonDS from '../Services/Amazon.Services'
import {
populateNoPartes
populateNoPartes,
updateNoPartes
} from '../../../../store/features/Clientes/2096/AmazonNoPartes'
import { RootState } from '../../../../store/store'
import { useDispatch, useSelector } from 'react-redux'
@ -13,7 +14,9 @@ import { MsgInformativo } from '../../../Utils/Toast/msgInformativo'
import { IconContext } from 'react-icons'
import { BsFillPencilFill, BsFillTrashFill } from 'react-icons/bs'
import I2096PaisClave from '../Interfaces/I2096PaisClave'
import DTO2096PerfilesParecidos from '../DTO/DTO2096PerfilesParecidos'
import DSAmazon from '../Services/Amazon.Services'
import DTO2096NoParte from '../DTO/DTO2096NoParte'
export interface IAmazonNoPartesProps {}
export function AmazonNoPartes(props: IAmazonNoPartesProps) {
@ -21,7 +24,12 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
const mNoPartes = useSelector(
(state: RootState) => state.AmazonNoPartes.NoPartes
)
const [UserId, setUserId] = useState(() => {
const stickyValue = window.localStorage.getItem('UserId')
return stickyValue !== null ? JSON.parse(stickyValue) : 0
})
const [PaisClaves, setPaisClaves] = useState<I2096PaisClave[]>([])
const [Data, setData] = useState<DTO2096PerfilesParecidos[]>([])
const [ShowModal, setShowModal] = useState(false)
const [header, setHeader] = useState('')
const [msgColor, setMsgColor] = useState('primary')
@ -29,6 +37,7 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
const [msg, setMsg] = useState('')
const [MsgTime, setMsgTime] = useState(3000)
const [IDParte, setIDParte] = useState(0)
const [Parte, setParte] = useState('')
const [TipoOperacion, setTipoOperacion] = useState(0)
const [Fraccion, setFraccion] = useState('')
const [Subdivision, setSubdivision] = useState('')
@ -37,6 +46,9 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
const [PaisOrigen, setPaisOrigen] = useState('')
const [UMF, setUMF] = useState('')
const [Search, setSearch] = useState('')
const [FechaInsercion, setFechaInsercion] = useState('')
const [Clasificador, setClasificador] = useState('')
const openLink = (item: string) => {
window.open('https://www.amazon.com/dp/' + item)
}
@ -81,7 +93,9 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
name: 'Parte',
width: '110px',
cell: (row: I2096NoParte) => (
<div style={{cursor: 'pointer'}} onClick={() => openLink(row.parte)}>{row.parte}</div>
<div style={{ cursor: 'pointer' }} onClick={() => openLink(row.parte)}>
{row.parte}
</div>
),
sortable: true
},
@ -135,22 +149,59 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
selector: (row: I2096NoParte) => row.descripcionAgenteAduanal,
wrap: true,
sortable: true
},
{
name: 'Fecha / Hora',
width: '200px',
selector: (row: I2096NoParte) => row.fechaConfirmacion,
wrap: true,
sortable: true
},
{
name: 'Usuario',
width: '300px',
selector: (row: I2096NoParte) => getUser(row.usuarioActualizacion),
wrap: true,
sortable: true
}
]
const getUser = (Id: number) => {
const NoAsignado = 'NO ASIGNADO'
if (Id === 0) return NoAsignado
else if (Data.length) {
const Usuario = Data.filter((item) => item.idUsuario === Id)
return Usuario ? Usuario[0].nombre : NoAsignado
}
return NoAsignado
}
const loadProfiles = () => {
DSAmazon.PerfilesParecidosGet('_')
.then((response) => {
setData(response.data)
})
.catch((e: Error) => {
alert('Ocurrio un error' + e.message.toString())
})
}
const loadData = (row: I2096NoParte) => {
setIDParte(row.id)
setParte(row.parte)
setTipoOperacion(row.tipoOperacion)
setFraccion(row.fraccion.substring(0, 8))
setSubdivision(row.fraccion.slice(-2))
setSubdivision(row.subdivision)
setPaisOrigen(row.paisOrigen)
setDescripcionFactura(row.descripcionFactura)
setDescripcionAgenteAduanal(row.descripcionAgenteAduanal)
setUMF(row.unidadMedidaFactura)
setFechaInsercion(row.FHActualizacion)
setClasificador(getUser(row.usuarioActualizacion))
setShowModal(true)
}
useEffect(() => {
const loadPaisesClaves = () => {
AmazonDS.PaisClavesGET()
.then((response) => {
setPaisClaves(response.data)
@ -161,6 +212,11 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
setShowMsg(true)
return
})
}
useEffect(() => {
loadPaisesClaves()
loadProfiles()
}, [])
const loadInfo = () => {
@ -172,6 +228,7 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
}
AmazonDS.NoPartesGet(Search)
.then((response) => {
//console.log(JSON.stringify(response.data))
dispatch(populateNoPartes(response.data))
})
.catch((e: Error) => {
@ -182,6 +239,26 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
})
}
const saveInfo = () => {
const data: DTO2096NoParte = {
id: IDParte,
fraccionGEMCO: Fraccion,
subdivisionGEMCO: Subdivision,
descripcionAgenteAduanal: DescripcionAgenteAduanal,
usuario: UserId
}
AmazonDS.NoPartesUpdate(data)
.then((response) => {
dispatch(updateNoPartes(response.data))
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error: ' + e)
setShowMsg(true)
return
})
}
return (
<div>
<Card>
@ -235,12 +312,18 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
size={'sm'}
dialogClassName={'modal-50w'}
>
<Modal.Header closeButton>
<Modal.Title>
No Parte: {Parte} ................ insertado : [ {FechaInsercion} ]
</Modal.Title>
</Modal.Header>
<Modal.Body>
<div style={{ height: '400px', overflow: 'scroll' }}>
<Row style={{ paddingTop: '15px' }}>
<Col xs={2}>T. Operacion</Col>
<Col xs={3}>
<Form.Control
disabled={true}
as="select"
onChange={(e) => setTipoOperacion(parseInt(e.target.value))}
className="form-select form-select-sm"
@ -277,6 +360,7 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
<Col xs={10}>
<Form.Group className="mb-3">
<Form.Control
disabled={true}
as="textarea"
rows={3}
value={DescripcionFactura}
@ -294,6 +378,9 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
as="textarea"
rows={3}
value={DescripcionAgenteAduanal}
onChange={(e) =>
setDescripcionAgenteAduanal(e.target.value)
}
/>
</Form.Group>
</Col>
@ -304,6 +391,7 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
<Form.Control
as="select"
value={PaisOrigen}
disabled={true}
onChange={(e) => setPaisOrigen(e.target.value)}
className="form-select form-select-sm"
>
@ -320,6 +408,7 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
<Col xs={4}>Unidad medida factura</Col>
<Col xs={1}>
<Form.Control
disabled={true}
defaultValue={UMF}
type="text"
placeholder="Unidad de medida factura"
@ -329,9 +418,19 @@ export function AmazonNoPartes(props: IAmazonNoPartesProps) {
</Col>
</Row>
<Row style={{ paddingTop: '15px' }}>
<Col xs={10}></Col>
<Col xs={2}>Clasificador</Col>
<Col xs={4} style={{ textAlign: 'left' }}>
<Form.Control
defaultValue={Clasificador}
disabled={true}
type="text"
placeholder="Clasificador"
size="sm"
/>
</Col>
<Col xs={4}></Col>
<Col xs={1}>
<Button>Guarda</Button>
<Button onClick={() => saveInfo()}>Guarda</Button>
</Col>
</Row>
</div>

@ -11,21 +11,9 @@ import {
} from 'react-bootstrap'
import { IconContext } from 'react-icons'
import { BsChevronDown, BsChevronRight, BsSearch } from 'react-icons/bs'
import {
FaAmazon,
FaCheckCircle,
FaFileExcel,
FaQuestionCircle
} from 'react-icons/fa'
import { ImCross } from 'react-icons/im'
import { ComboDescripcion } from '../../../Components/ComboSelect/ComboDescripcion'
import { ComboFraccion } from '../../../Components/ComboSelect/ComboFraccion'
import { TextBoxFraccion } from '../../../Components/TextBox/TextBoxFraccion'
import I2096Detail from '../../../Interfaces/I2096Detail'
import { FaAmazon, FaFileExcel } from 'react-icons/fa'
import I2096Headers from '../../../Interfaces/I2096Header'
import DSAmazon from '../../../Services/Amazon.Services'
import * as XLSX from 'xlsx'
import DTO2096PrevioExcel from '../../../DTO/DTO2096PrevioExcel'
import { MsgInformativo } from '../../../../../Utils/Toast/msgInformativo'
import { RootState } from '../../../../../../store/store'
import {
@ -37,7 +25,7 @@ import RtpAmazonFinishedClasificationInvoicesDetail from './RptAmazonFinishedCla
// Redux
import { useDispatch, useSelector } from 'react-redux'
import DTO2096PerfilesParecidos from '../../../DTO/DTO2096PerfilesParecidos'
import { SelectEstatus } from '../../../../../Corresponsales/CuentasComplementarias/SelectEstatus/SelectEstatus'
import loadingImg from '../../../../../../images/ajaxloader.gif'
export interface IRptAmazonFinishedClasificationInvoicesProps {}
@ -49,10 +37,6 @@ export default function RptAmazonFinishedClasificationInvoices(
(state: RootState) => state.AmazonInvoices.Invoice
)
const [Data, setData] = useState<DTO2096PerfilesParecidos[]>([])
/* const [Inicio, setInicio] = useState(currentDate(0))
const [Fin, setFin] = useState(currentDate(0))
const [filtro, setFiltro] = useState('')
*/
const [Accion, setAccion] = useState(0)
const [Estatus, setEstatus] = useState(0)
const [IDInvoice, setIDInvoice] = useState(0)
@ -62,17 +46,10 @@ export default function RptAmazonFinishedClasificationInvoices(
const [header, setHeader] = useState('')
const [show, setShowMsg] = useState(false)
const [msg, setMsg] = useState('')
const [WaitingDialog, setWaitingDialog] = useState(false)
const [WaitingMessage, setWaitingMessage] = useState('Plantilla de Partes')
const msgColor = 'primary'
/* function currentDate(days: number): string {
var today = new Date()
today.setDate(today.getDate() + days)
var dd = String(today.getDate()).padStart(2, '0')
var mm = String(today.getMonth() + 1).padStart(2, '0')
var yyyy = today.getFullYear()
return yyyy + '-' + mm + '-' + dd
} */
const loadReport = () => {
DSAmazon.AmazonFinishedClasificationInvoiceGET()
.then((response) => {
@ -85,9 +62,7 @@ export default function RptAmazonFinishedClasificationInvoices(
}
const downloadExcel = (id: number) => {
DSAmazon.SePuedeTerminardeClasificarFactura(id)
.then((response) => {})
.catch((e: Error) => {})
setWaitingDialog(true)
DSAmazon.NoPartesAmazon2SIRGET(id)
.then((response: any) => {
if (response.status === 200) {
@ -97,11 +72,7 @@ export default function RptAmazonFinishedClasificationInvoices(
link.setAttribute('download', 'Plantilla de partes.xlsx')
document.body.appendChild(link)
link.click()
DSAmazon.TerminaClasificarFactura(id)
.then((response) => {})
.catch((e: Error) => {
alert('Ocurrio un error' + e.message.toString())
})
setWaitingDialog(false)
}
})
.catch((e: Error) => {
@ -112,8 +83,7 @@ export default function RptAmazonFinishedClasificationInvoices(
})
}
useEffect(() => {
loadReport()
const loadProfiles = () => {
DSAmazon.PerfilesParecidosGet('Clasificador')
.then((response) => {
setData(response.data)
@ -121,10 +91,15 @@ export default function RptAmazonFinishedClasificationInvoices(
.catch((e: Error) => {
alert('Ocurrio un error' + e.message.toString())
})
}
useEffect(() => {
loadReport()
loadProfiles()
}, [])
const getUser = (Id: number) => {
const NoAsignado = ' - NO ASIGNADO -'
const NoAsignado = 'NO ASIGNADO'
if (Id === 0) return NoAsignado
else if (Data.length) {
const Usuario = Data.filter((item) => item.idUsuario === Id)
@ -157,10 +132,6 @@ export default function RptAmazonFinishedClasificationInvoices(
})
}
const openLink = (item: string) => {
window.open('https://www.amazon.com/dp/' + item)
}
return (
<div>
<Card>
@ -204,6 +175,7 @@ export default function RptAmazonFinishedClasificationInvoices(
<th>Tot currency ISO code</th>
<th>Tot Monetary amount</th>
<th>Tot partidas</th>
<th>Clasificador</th>
<th></th>
</tr>
</thead>
@ -305,6 +277,7 @@ export default function RptAmazonFinishedClasificationInvoices(
return row.detail.length
})}
</td>
<td>{getUser(MasterData.clasificador)}</td>
<td>
<Form.Control
as="select"
@ -605,6 +578,26 @@ export default function RptAmazonFinishedClasificationInvoices(
</div>
</Modal.Body>
</Modal>
<Modal
show={WaitingDialog}
onHide={() => {
setWaitingDialog(false)
}}
backdrop="static"
keyboard={false}
size="sm"
dialogClassName={'modal-50w'}
centered
>
<Modal.Header closeButton>
<Modal.Title></Modal.Title>
</Modal.Header>
<Modal.Body>
<img src={loadingImg} style={{ height: '150px' }} alt="proccessing" />
Generando {WaitingMessage}...
</Modal.Body>
<Modal.Footer></Modal.Footer>
</Modal>
<MsgInformativo
show={show}

@ -295,6 +295,7 @@ export default function RptAmazonFinishedClasificationInvoicesDetail(
DescripcionOriginal={props.detail.pedimentoDescription}
ConfirmaDescripcion={props.detail.confirmaDescripcion}
Deshabilitado={props.Deshabilitado}
Detail={props.detail}
/>
</td>
<td

@ -7,7 +7,6 @@ import { useDispatch, useSelector } from 'react-redux'
import I2096Headers from '../../../Interfaces/I2096Header'
import { updateInvoice } from '../../../../../../store/features/Clientes/2096/AmazonInvoices'
import DSAmazon from '../../../Services/Amazon.Services'
import I2096Detail from '../../../Interfaces/I2096Detail'
export interface IClasificatorAssignProps {
Invoice: I2096Headers

@ -21,6 +21,7 @@ import {
populateInvoices,
updateInvoice
} from '../../../../../../store/features/Clientes/2096/AmazonInvoices'
import loadingImg from '../../../../../../images/ajaxloader.gif'
// Redux
import { useDispatch, useSelector } from 'react-redux'
import RtpAmazonPendingClasificationInvoicesDetail from './RptAmazonPendingClasificationInvoicesDetail'
@ -45,6 +46,8 @@ export default function RtpAmazonPendingInvoices(
const [header, setHeader] = useState('')
const [IDFactura, setIDFactura] = useState(0)
const [show, setShowMsg] = useState(false)
const [WaitingDialog, setWaitingDialog] = useState(false)
const [WaitingMessage, setWaitingMessage] = useState('')
const [ShowModal, setShowModal] = useState(false)
const [ShowModalW, setShowModalW] = useState(false)
const [msg, setMsg] = useState('')
@ -61,32 +64,6 @@ export default function RtpAmazonPendingInvoices(
})
}
const downloadExcel = (id: number) => {
DSAmazon.TerminaClasificarFactura(id)
.then((response) => {
DSAmazon.NoPartesAmazon2SIRGET(id)
.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', 'Plantilla de partes.xlsx')
document.body.appendChild(link)
link.click()
setShowModal(false)
loadReport()
}
})
.catch((e: Error) => {
setHeader('Error')
setMsg('Ocurrio un error')
setShowMsg(true)
return
})
})
.catch((e: Error) => {})
}
useEffect(() => {
loadReport()
}, [])
@ -109,67 +86,104 @@ export default function RtpAmazonPendingInvoices(
(child) =>
child.idHeader === IDMaster &&
child.destinationHTSCode.replaceAll('.', '').trim() !==
child.fraccionGEMCO
child.fraccionGEMCO &&
child.validaFraccionOriginal !== 3
)
})
return Exceptions && Exceptions.length ? Exceptions[0].length : 0
}
const facturaTerminada = (row: I2096Headers) => {
if (!existsExeptions(row.id)) {
DSAmazon.SePuedeTerminardeClasificarFactura(row.id)
const descargaArchivoExcepciones = () => {
setShowModalW(false)
setWaitingMessage('Archivo de excepciones')
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', 'Archivo de excepciones.xlsx')
document.body.appendChild(link)
link.click()
DSAmazon.EnviaEsperaRespuestaAmazon(IDFactura)
.then((response) => {
if (response.data.respuesta.includes('lista')) {
setIDFactura(row.id)
setShowModal(true)
return
} else {
setIDFactura(0)
loadReport()
setWaitingDialog(false)
})
.catch((e: Error) => {
setHeader('Error')
setMsg(response.data.respuesta)
setMsg(
'Ocurrio un error, no se pudo actualizar informacion' +
e.message.toString()
)
setShowMsg(true)
return
})
}
})
.catch((e: Error) => {
setIDFactura(0)
setHeader('Error')
setMsg('Ocurrio un error')
setShowMsg(true)
return
})
} else {
DSAmazon.SePuedeTerminardeClasificarFacturaEsperandoRespuesta(row.id)
}
const descargaPantillaPartes = () => {
setShowModal(false)
setWaitingMessage('Plantilla de partes')
setWaitingDialog(true)
DSAmazon.NoPartesAmazon2SIRGET(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', 'Plantilla de partes.xlsx')
document.body.appendChild(link)
link.click()
DSAmazon.TerminaClasificarFactura(IDFactura)
.then((response) => {
if (response.data.respuesta.includes('lista')) {
setIDFactura(row.id)
setShowModalW(true)
return
} else {
setIDFactura(0)
loadReport()
setWaitingDialog(false)
})
.catch((e: Error) => {
setHeader('Error')
setMsg(response.data.respuesta)
setMsg(
'Ocurrio un error, no se pudo actualizar informacion' +
e.message.toString()
)
setShowMsg(true)
return
})
}
})
.catch((e: Error) => {
setIDFactura(0)
setHeader('Error')
setMsg('Ocurrio un error')
setShowMsg(true)
return
})
}
}
const send2WaitingProcess = (id: number) => {
DSAmazon.EnviaEsperaRespuestaAmazon(id)
.then((response) => {
setShowModalW(false)
loadReport()
const facturaTerminada = (row: I2096Headers) => {
DSAmazon.SePuedeTerminardeClasificarFactura(row.id).then((response) => {
if (response.data.estatus === 0) {
setIDFactura(0)
setHeader('Error')
setMsg(response.data.respuesta)
setShowMsg(true)
return
} else if (response.data.estatus === 1) {
setIDFactura(row.id)
setShowModalW(true)
} else if (response.data.estatus === 2) {
setIDFactura(row.id)
setShowModal(true)
}
})
.catch((e: Error) => {})
}
return (
@ -228,7 +242,13 @@ export default function RtpAmazonPendingInvoices(
Perfil !== 'Clasificador lider'
) {
return a
} else if ( ["Clasificador lider", "Administrador"].includes(Perfil)) {return a}
} else if (
['Clasificador lider', 'Administrador'].includes(
Perfil
)
) {
return a
}
})
.map((MasterData) => {
return (
@ -332,9 +352,6 @@ export default function RtpAmazonPendingInvoices(
})}
</td>
<td>
{' '}
{/* Componente: Asigna clasificador */}
{/* {Perfil==='Clasificador lider' ? 'Modifica' : 'NO MODIFICA'} */}
<ClasificatorAssign
Disabled={Perfil !== 'Clasificador lider'}
Invoice={MasterData}
@ -418,7 +435,8 @@ export default function RtpAmazonPendingInvoices(
textAlign: 'center'
}}
>
Confirme fraccion
Confirme
&nbsp;&nbsp;fraccion&nbsp;&nbsp;
</th>
<th
style={{
@ -626,7 +644,8 @@ export default function RtpAmazonPendingInvoices(
<Col xs={1}></Col>
<Col xs={10}>
<Alert key={'danger'} variant={'danger'}>
La factura esta lista para terminarse y pasarse al siguiente proceso?
¿La factura esta lista para terminarse y pasarse al siguiente
proceso?
</Alert>
</Col>
<Col xs={1}></Col>
@ -646,7 +665,7 @@ export default function RtpAmazonPendingInvoices(
<Button
variant="danger"
onClick={() => {
downloadExcel(IDFactura)
descargaPantillaPartes()
}}
>
&nbsp;&nbsp;Si&nbsp;&nbsp;
@ -671,8 +690,8 @@ export default function RtpAmazonPendingInvoices(
<Col xs={1}></Col>
<Col xs={10}>
<Alert key={'danger'} variant={'danger'}>
La factura esta lista para enviarse al proceso de esperar
respuesta de Amazon
¿La factura esta lista para enviarse al proceso de esperar
respuesta de Amazon?
</Alert>
</Col>
<Col xs={1}></Col>
@ -692,7 +711,7 @@ export default function RtpAmazonPendingInvoices(
<Button
variant="danger"
onClick={() => {
send2WaitingProcess(IDFactura)
descargaArchivoExcepciones()
}}
>
&nbsp;&nbsp;Si&nbsp;&nbsp;
@ -702,6 +721,26 @@ export default function RtpAmazonPendingInvoices(
</div>
</Modal.Body>
</Modal>
<Modal
show={WaitingDialog}
onHide={() => {
setWaitingDialog(false)
}}
backdrop='static'
keyboard={false}
size='sm'
dialogClassName={'modal-50w'}
centered
>
<Modal.Header closeButton>
<Modal.Title></Modal.Title>
</Modal.Header>
<Modal.Body>
<img src={loadingImg} style={{ height: '150px' }} alt='proccessing' />
Generando {WaitingMessage}...
</Modal.Body>
<Modal.Footer></Modal.Footer>
</Modal>
<MsgInformativo
show={show}
msg={msg}

@ -64,7 +64,10 @@ export default function RtpAmazonPendingInvoivesDetail(
}
const target = React.useRef(null)
const UpdateInvoiceDetail = (Invoice: I2096Headers, Detail: I2096Detail[]) => {
const UpdateInvoiceDetail = (
Invoice: I2096Headers,
Detail: I2096Detail[]
) => {
const updatedInvoice: I2096Headers = {
id: props.IDMaster,
referencia: Invoice.referencia,
@ -139,17 +142,41 @@ export default function RtpAmazonPendingInvoivesDetail(
DSAmazon.CheckDetail(props.detail.id)
.then((response) => {
setChecked(!Checked)
editInvoice(props.detail.id,!Checked)
editInvoice(props.detail.id, !Checked)
})
.catch((e: Error) => {})
}
const ColorSET = (value: number, mode: number) => {
switch(mode) {
case 1: {
// Background color
if (value === 1) return '#FFFAF2'
else if (value === 2) return '#E5F7B6'
else if (value === 3) return '#E9F3FC'
break
} case 2: {
// Border color
if (value === 1) return '2px solid #F9A721'
else if (value === 2) return '2px solid green'
else if (value === 3) return '2px solid blue'
break
} case 3: {
// Color
if (value === 1) return '#5923F6'
if (value === 2) return '#000000'
if (value === 3) return 'blue'
break
}
}
}
return (
<>
<tr>
<th
style={{
width: '50px',
width: '50px'
}}
className="DetailData"
>
@ -217,6 +244,15 @@ export default function RtpAmazonPendingInvoivesDetail(
>
<FaCheckCircle />
</IconContext.Provider>
) : props.detail.validaFraccionOriginal === 3 ? (
<IconContext.Provider
value={{
color: 'blue',
size: '20px'
}}
>
<FaCheckCircle />
</IconContext.Provider>
) : (
<IconContext.Provider
value={{
@ -259,18 +295,9 @@ export default function RtpAmazonPendingInvoivesDetail(
displayType={'input'}
style={{
fontSize: '18px',
backgroundColor:
props.detail.validaFraccionOriginal === 0
? '#FFFAF2 '
: '#E5F7B6',
border:
props.detail.validaFraccionOriginal === 0
? '2px solid #F9A721'
: '2px solid green',
color:
props.detail.validaFraccionOriginal === 0
? '#5923F6'
: '#000000',
backgroundColor: ColorSET(props.detail.confirmaFraccion, 1),
border: ColorSET(props.detail.confirmaFraccion, 2),
color: ColorSET(props.detail.confirmaFraccion, 3),
width: '115px',
textAlign: 'right',
borderRadius: '10px'
@ -290,6 +317,7 @@ export default function RtpAmazonPendingInvoivesDetail(
DescripcionOriginal={props.detail.pedimentoDescription}
ConfirmaDescripcion={props.detail.confirmaDescripcion}
Deshabilitado={props.detail.validaFraccionOriginal === 1}
Detail={props.detail}
/>
</td>
<td
@ -392,7 +420,7 @@ export default function RtpAmazonPendingInvoivesDetail(
>
{props.detail.totalUnitValueMonetaryAmount}
</td>
{/* <td
{/* <td
style={{
textAlign: 'center',
paddingLeft: '30px',
@ -409,7 +437,7 @@ export default function RtpAmazonPendingInvoivesDetail(
></td> */}
<td
style={{
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff'
}}
>
<OverlayTrigger
@ -419,8 +447,14 @@ export default function RtpAmazonPendingInvoivesDetail(
}
>
{({ ref, ...triggerHandler }) => (
<Button variant="light" {...triggerHandler} style={{visibility:
CumplimientoNormativo.length === 0 ? 'hidden' : 'visible'}}>
<Button
variant="light"
{...triggerHandler}
style={{
visibility:
CumplimientoNormativo.length === 0 ? 'hidden' : 'visible'
}}
>
<IconContext.Provider
value={{
color: 'blue',
@ -436,8 +470,7 @@ export default function RtpAmazonPendingInvoivesDetail(
</td>
<td
style={{
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff'
}}
>
<OverlayTrigger
@ -445,8 +478,14 @@ export default function RtpAmazonPendingInvoivesDetail(
overlay={<Tooltip id="button-tooltip-2">{Comentarios}</Tooltip>}
>
{({ ref, ...triggerHandler }) => (
<Button variant="light" {...triggerHandler} style={{visibility:
CumplimientoNormativo.length === 0 ? 'hidden' : 'visible'}}>
<Button
variant="light"
{...triggerHandler}
style={{
visibility:
CumplimientoNormativo.length === 0 ? 'hidden' : 'visible'
}}
>
<IconContext.Provider
value={{
color: 'green',
@ -460,9 +499,21 @@ export default function RtpAmazonPendingInvoivesDetail(
)}
</OverlayTrigger>
</td>
<td style={{textAlign:'center', backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff'}}>
<td
style={{
textAlign: 'center',
backgroundColor: props.detail.checked ? '#E6EEF5' : '#ffffff'
}}
>
<Form>
<Form.Check type="checkbox" id="Checkbox" onClick={()=>{ checkDetail()}} checked={Checked}/>
<Form.Check
type="checkbox"
id="Checkbox"
onClick={() => {
checkDetail()
}}
checked={Checked}
/>
</Form>
</td>
</tr>
@ -481,7 +532,8 @@ export default function RtpAmazonPendingInvoivesDetail(
<Col xs={1}></Col>
<Col xs={10}>
<Alert key={'danger'} variant={'danger'}>
Para poder continuar es necesario que proporcione la siguiente informacion
Para poder continuar es necesario que proporcione la siguiente
informacion
</Alert>
</Col>
<Col xs={1}></Col>

@ -26,6 +26,8 @@ import {
import { useDispatch, useSelector } from 'react-redux'
import RtpPendingAnswerFromAmazonDetail from './RptPendingAnswerFromAmazonDetail'
import { AiTwotoneFileExcel } from 'react-icons/ai'
import { FiAlertCircle } from 'react-icons/fi'
import DTO2096PerfilesParecidos from '../../../DTO/DTO2096PerfilesParecidos'
export interface IRptPendingAnswerFromAmazonProps {}
export default function RptPendingAnswerFromAmazon(
@ -35,6 +37,7 @@ export default function RptPendingAnswerFromAmazon(
const mInvoices = useSelector(
(state: RootState) => state.AmazonInvoices.Invoice
)
const [Data, setData] = useState<DTO2096PerfilesParecidos[]>([])
const [header, setHeader] = useState('')
const [IDFactura, setIDFactura] = useState(0)
const [show, setShowMsg] = useState(false)
@ -62,16 +65,30 @@ export default function RptPendingAnswerFromAmazon(
})
}
const downloadExcel = (id: number) => {
DSAmazon.TerminaClasificarFactura(id)
const loadProfiles = () => {
DSAmazon.PerfilesParecidosGet('Clasificador')
.then((response) => {
DSAmazon.NoPartesAmazon2SIRGET(id)
setData(response.data)
})
.catch((e: Error) => {
alert('Ocurrio un error' + e.message.toString())
})
}
const downloadExceptionsFile = (id: number) => {
/* DSAmazon.SePuedeTerminardeClasificarFactura(id)
.then((response) => {})
.catch((e: Error) => {})
DSAmazon.ExceptionsFileAmazonGET(id)
.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', 'Plantilla de partes.xlsx')
link.setAttribute(
'download',
'Formato de consultas (Exceptions Handling 2021).xlsx'
)
document.body.appendChild(link)
link.click()
}
@ -81,27 +98,18 @@ export default function RptPendingAnswerFromAmazon(
setMsg('Ocurrio un error')
setShowMsg(true)
return
})
})
.catch((e: Error) => {})
}
}) */
const downloadExceptionsFile = (id: number) => {
DSAmazon.SePuedeTerminardeClasificarFactura(id)
.then((response) => {})
.catch((e: Error) => {})
DSAmazon.ExceptionsFileAmazonGET(id)
.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',
'Formato de consultas (Exceptions Handling 2021).xlsx'
)
link.setAttribute('download', 'Archivo de excepciones.xlsx')
document.body.appendChild(link)
link.click()
setShowModal(false)
}
})
.catch((e: Error) => {
@ -114,6 +122,7 @@ export default function RptPendingAnswerFromAmazon(
useEffect(() => {
loadReport()
loadProfiles()
}, [])
const changeToggle = (row: I2096Headers) => {
@ -123,8 +132,14 @@ export default function RptPendingAnswerFromAmazon(
dispatch(updateInvoice(Obj))
}
const openLink = (item: string) => {
window.open('https://www.amazon.com/dp/' + item)
const getUser = (Id: number) => {
const NoAsignado = 'NO ASIGNADO'
if (Id === 0) return NoAsignado
else if (Data.length) {
const Usuario = Data.filter((item) => item.idUsuario === Id)
return Usuario[0].nombre ? Usuario[0].nombre : NoAsignado
}
return NoAsignado
}
const existsExeptions = (IDMaster: number) => {
@ -142,13 +157,34 @@ export default function RptPendingAnswerFromAmazon(
return Exceptions[0].length ? Exceptions[0].length : 0
}
const facturaTerminada = (row: I2096Headers) => {
DSAmazon.SePuedeTerminardeClasificarFactura(row.id)
const TerminadeClasificar = () => {
DSAmazon.TerminaClasificarFactura(IDFactura)
.then((response) => {
if (response.data.respuesta.includes('lista')) {
setIDFactura(row.id)
setShowModal(true)
loadReport()
setShowModal(false)
})
.catch((e: Error) => {
setIDFactura(0)
setHeader('Error')
setMsg('Ocurrio un error ' + e.toString())
setShowMsg(true)
return
})
}
const sePuedeTerminarFactura = (id: number) =>{
setIDFactura(id)
DSAmazon.SeRecibioRespuestaDeAmazon(id)
.then((response) => {
//alert(response.data.estatus)
if (response.data.estatus === 0) {
setHeader('Error')
setMsg('Verifique que todas las partidas esten verificadas por usted')
setShowMsg(true)
return
} else if (response.data.estatus === 1) {
//TerminadeClasificar()
setShowModal(true)
} else {
setIDFactura(0)
setHeader('Informativo')
@ -208,7 +244,6 @@ export default function RptPendingAnswerFromAmazon(
<th style={{ width: '50px' }}>id</th>
<th style={{ width: '50px' }}></th>
<th style={{ width: '50px' }}></th>
<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>
@ -221,6 +256,7 @@ export default function RptPendingAnswerFromAmazon(
<th style={{ width: '100px' }}>Tot currency ISO code</th>
<th style={{ width: '100px' }}>Tot Monetary amount</th>
<th style={{ width: '500px' }}>Total de partidas</th>
<th style={{ width: '100px' }}>Clasificador</th>
</tr>
</thead>
<tbody>
@ -280,29 +316,16 @@ export default function RptPendingAnswerFromAmazon(
) : null}
</td>
<td>
{MasterData.estatus === 1 ? (
<div
onClick={() => downloadExcel(MasterData.id)}
>
<IconContext.Provider
value={{ color: 'green', size: '20px' }}
>
<AiTwotoneFileExcel />
</IconContext.Provider>
</div>
) : null}
</td>
<td>
{/* <FormCheck
<FormCheck
className="form-check form-switch form-control-sm"
id="switchEnabled"
type="switch"
checked={false}
onChange={() => {
facturaTerminada(MasterData)
sePuedeTerminarFactura(MasterData.id)
}}
label=""
/> */}
/>
</td>
<td style={{ width: '80px', textAlign: 'center' }}>
{MasterData.commercialInvoiceDate}
@ -349,6 +372,9 @@ export default function RptPendingAnswerFromAmazon(
return row.detail.length
})}
</td>
<td style={{ textAlign: 'center' }}>
{getUser(MasterData.clasificador)}
</td>
</tr>
{MasterData.max ? (
<tr
@ -651,7 +677,8 @@ export default function RptPendingAnswerFromAmazon(
<Button
variant="danger"
onClick={() => {
downloadExcel(IDFactura)
//downloadExcel(IDFactura)
TerminadeClasificar()
}}
>
&nbsp;&nbsp;Si&nbsp;&nbsp;

@ -180,6 +180,30 @@ export default function RptPendingAnswerFromAmazonDetail(
</Popover>
)
const ColorSET = (value: number, mode: number) => {
switch(mode) {
case 1: {
// Background color
if (value === 1) return '#FFFAF2'
else if (value === 2) return '#E5F7B6'
else if (value === 3) return '#E9F3FC'
break
} case 2: {
// Border color
if (value === 1) return '2px solid #F9A721'
else if (value === 2) return '2px solid green'
else if (value === 3) return '2px solid blue'
break
} case 3: {
// Color
if (value === 1) return '#5923F6'
if (value === 2) return '#000000'
if (value === 3) return 'blue'
break
}
}
}
return (
<>
<tr>
@ -251,6 +275,15 @@ export default function RptPendingAnswerFromAmazonDetail(
>
<FaCheckCircle />
</IconContext.Provider>
) : props.detail.validaFraccionOriginal === 3 ? (
<IconContext.Provider
value={{
color: 'blue',
size: '20px'
}}
>
<FaCheckCircle />
</IconContext.Provider>
) : (
<IconContext.Provider
value={{
@ -320,6 +353,7 @@ export default function RptPendingAnswerFromAmazonDetail(
DescripcionOriginal={props.detail.pedimentoDescription}
ConfirmaDescripcion={props.detail.confirmaDescripcion}
Deshabilitado={true}
Detail={props.detail}
/>
</td>
<td
@ -415,7 +449,7 @@ export default function RptPendingAnswerFromAmazonDetail(
textAlign: 'center',
paddingLeft: '30px',
visibility:
props.detail.destinationHTSCode.replaceAll('.', '').trim() !==
props.detail.confirmaFraccion === 2 && props.detail.destinationHTSCode.replaceAll('.', '').trim() !==
(props.detail.fraccionGEMCO
? props.detail.fraccionGEMCO.trim()
: '')

@ -82,7 +82,7 @@ export function RptAmazonLinkInvoice2Traffic(
})
}
const downloadExcel = (id: number) => {
/* const downloadExcel = (id: number) => {
DSAmazon.SePuedeTerminardeClasificarFactura(id)
.then((response) => {})
.catch((e: Error) => {})
@ -104,7 +104,7 @@ export function RptAmazonLinkInvoice2Traffic(
return
})
}
*/
const downloadPDF = (id: number) => {
DSAmazon.PDFAmazonInvoiceGET(id)
.then((response: any) => {

@ -296,6 +296,7 @@ export default function RtpAmazonInvoiceTrafficDetail(
DescripcionOriginal={props.detail.pedimentoDescription}
ConfirmaDescripcion={props.detail.confirmaDescripcion}
Deshabilitado={props.Habilitado}
Detail={props.detail}
/>
</td>
<td

@ -11,6 +11,8 @@ import DTO2096SightLine from '../DTO/DTO2096SightLine'
import DTO2096FraccionDescripcion from '../DTO/DTO2096FraccionDescripcion'
import DTO2096PerfilesParecidos from '../DTO/DTO2096PerfilesParecidos'
import DTO2096LinkInvoice2Reference from '../DTO/DTO2096LinkInvoice2Reference'
import DTO2096Estatus from '../DTO/DTO2096Estatus'
import DTO2096NoParte from '../DTO/DTO2096NoParte'
class AmazonDataService {
AmazonPendingClasificationInvoiceGET() {
@ -23,11 +25,14 @@ class AmazonDataService {
return http.get<I2096Headers[]>(`/AmazonInvoice/AmazonFinishedClasificationInvoiceGet`)
}
SePuedeTerminardeClasificarFactura(id: number) {
return http.get<DTORespuesta>(`/AmazonInvoice/SePuedeTerminardeClasificarFactura?id=${id}`)
return http.get<DTO2096Estatus>(`/AmazonInvoice/SePuedeTerminardeClasificarFactura?id=${id}`)
}
SePuedeTerminardeClasificarFacturaEsperandoRespuesta(id: number) {
return http.get<DTORespuesta>(`/AmazonInvoice/SePuedeTerminardeClasificarFacturaEsperandoRespuesta?id=${id}`)
SeRecibioRespuestaDeAmazon(id: number) {
return http.get<DTO2096Estatus>(`/AmazonInvoice/SeRecibioRespuestaDeAmazon?id=${id}`)
}
/*SePuedeTerminardeClasificarFacturaEsperandoRespuesta(id: number) {
return http.get<DTORespuesta>(`/AmazonInvoice/SePuedeTerminardeClasificarFacturaEsperandoRespuesta?id=${id}`)
} */
EnviaEsperaRespuestaAmazon(id: number) {
return http.get<DTORespuesta>(`/AmazonInvoice/EnviaEsperaRespuestaAmazon?id=${id}`)
}
@ -132,6 +137,9 @@ class AmazonDataService {
NoPartesGet(Search: string) {
return http.get<I2096NoParte[]>(`/AmazonInvoice/NoPartesGet?Search=${Search}`)
}
NoPartesUpdate(data: DTO2096NoParte) {
return http.put<I2096NoParte>(`/AmazonInvoice/NoPartesUpdate`, data)
}
PerfilesParecidosGet(Perfil: string) {
return http.get<DTO2096PerfilesParecidos[]>(`/Usuarios/Catalogo/Usuarios/PerfilesParecidos?Perfil=${Perfil}`)
}

Loading…
Cancel
Save