Se agrega que el clasificador lider pueda asignar facturas

AmazonRelease1.1
unknown 2 years ago
parent dc634e616a
commit 02d27131fb
  1. 1
      src/Components/Clientes/Amazon/Components/ComboSelect/ComboDescripcion.tsx
  2. 1
      src/Components/Clientes/Amazon/Components/ComboSelect/ComboFraccion.tsx
  3. 5
      src/Components/Clientes/Amazon/DTO/DTO2096PerfilesParecidos.ts
  4. 1
      src/Components/Clientes/Amazon/Interfaces/I2096Header.ts
  5. 1
      src/Components/Clientes/Amazon/Reportes/Clasification/Finished/RptAmazonFinishedClasificationInvoicesDetail.tsx
  6. 133
      src/Components/Clientes/Amazon/Reportes/Clasification/Pending/ClasificatorAssign.tsx
  7. 69
      src/Components/Clientes/Amazon/Reportes/Clasification/Pending/RptAmazonPendingClasificationInvoices.tsx
  8. 1
      src/Components/Clientes/Amazon/Reportes/Clasification/Pending/RptAmazonPendingClasificationInvoicesDetail.tsx
  9. 2
      src/Components/Clientes/Amazon/Reportes/Clasification/WaitingAnswer/RptPendingAnswerFromAmazonDetail.tsx
  10. 1
      src/Components/Clientes/Amazon/Reportes/Traffic/Linking/RptAmazonInvoiceTrafficDetail.tsx
  11. 1
      src/Components/Clientes/Amazon/Reportes/Traffic/Pending/RptAmazonPendingTraficInvoiceDetail.tsx
  12. 7
      src/Components/Clientes/Amazon/Services/Amazon.Services.ts
  13. 17
      src/Components/Login/login.tsx
  14. 93
      src/Components/Register/UserList/UserList.tsx
  15. 1
      src/Interfaces/IjwtStructure.ts

@ -85,6 +85,7 @@ export function ComboDescripcion(props: IComboDescripcionProps) {
footNote: Invoice.footNote,
archivo: Invoice.archivo,
fCreacion: Invoice.fCreacion,
clasificador: Invoice.clasificador,
estatus: Invoice.estatus,
max: true,
detail: Detail

@ -79,6 +79,7 @@ export function ComboFraccion(props: IComboFraccionProps) {
footNote: Invoice.footNote,
archivo: Invoice.archivo,
fCreacion: Invoice.fCreacion,
clasificador: Invoice.clasificador,
estatus: Invoice.estatus,
max: true,
detail: Detail

@ -0,0 +1,5 @@
export default interface DTO2096PerfilesParecidos {
idUsuario: number
nombre: string
perfil: string
}

@ -22,6 +22,7 @@ export default interface I2096Headers {
footNote: string
archivo: string
fCreacion: string
clasificador: number
estatus: number
max: boolean
detail: Detail[]

@ -89,6 +89,7 @@ export default function RptAmazonFinishedClasificationInvoicesDetail(
footNote: Invoice.footNote,
archivo: Invoice.archivo,
fCreacion: Invoice.fCreacion,
clasificador: Invoice.clasificador,
estatus: Invoice.estatus,
max: true,
detail: Detail

@ -0,0 +1,133 @@
import * as React from 'react'
import { useEffect, useState } from 'react'
import { Alert, Button, Col, Form, Modal, Row } from 'react-bootstrap'
import DTO2096PerfilesParecidos from '../../../DTO/DTO2096PerfilesParecidos'
import { RootState } from '../../../../../../store/store'
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
Disabled: boolean
}
export default function ClasificatorAssign(props: IClasificatorAssignProps) {
const dispatch = useDispatch()
const mInvoices = useSelector(
(state: RootState) => state.AmazonInvoices.Invoice
)
const [IDClasificador, setIDClasificador] = useState(
props.Invoice.clasificador ? props.Invoice.clasificador : 0
)
const [Clasificador, setClasificador] = useState('')
const [Data, setData] = useState<DTO2096PerfilesParecidos[]>([])
const [showModal, setShowModal] = useState(false)
useEffect(() => {
DSAmazon.PerfilesParecidosGet('Clasificador')
.then((response) => {
setData(response.data)
})
.catch((e: Error) => {
alert('Ocurrio un error' + e.message.toString())
})
}, [])
useEffect(() => {
setClasificador(getUser(IDClasificador))
}, [IDClasificador])
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 UpdateInfo = (updatedInvoice: I2096Headers) => {
dispatch(updateInvoice(updatedInvoice))
}
const editArray = () => {
const Invoice = mInvoices
.filter((el) => el.id === props.Invoice.id)
.map((el) => {
return {
...el,
clasificador: IDClasificador
}
})
UpdateInfo(Invoice[0])
}
const saveAsignation = () => {
DSAmazon.AsignaFactura(IDClasificador, props.Invoice.id)
.then((response) => {
setShowModal(false)
editArray()
})
.catch((e: Error) => {
alert('Ocurrio un error' + e.message.toString())
})
}
return (
<div>
<Form.Control
as="select"
disabled={props.Disabled}
className="form-select form-select-sm"
onChange={(e) => {
setIDClasificador(parseInt(e.target.value))
setShowModal(true)
}}
value={IDClasificador}
>
<option value="0">- NO ASIGNADO -</option>
{Data
? Data.map((item) => {
return <option value={item.idUsuario}>{item.nombre}</option>
})
: ''}
</Form.Control>
<Modal
show={showModal}
onHide={() => {
setShowModal(false)
}}
size={'sm'}
dialogClassName={'modal-50w'}
>
<Modal.Body>
<Row>
<Col xs={12}>
<Alert variant="danger">
<Alert.Heading>
¿Esta seguro de asignar esta factura Amazon a: {Clasificador}?
</Alert.Heading>
</Alert>
</Col>
</Row>
<Row style={{ paddingTop: '10px' }}>
<Col XS={9}></Col>
<Col xs={3}>
<Button
onClick={() => {
saveAsignation()
}}
>
Asignar
</Button>
</Col>
</Row>
</Modal.Body>
</Modal>
</div>
)
}

@ -11,7 +11,7 @@ import {
} from 'react-bootstrap'
import { IconContext } from 'react-icons'
import { BsChevronDown, BsChevronRight } from 'react-icons/bs'
import { FaAmazon, FaFileExcel } from 'react-icons/fa'
import { FaAmazon } from 'react-icons/fa'
import I2096Headers from '../../../Interfaces/I2096Header'
import DSAmazon from '../../../Services/Amazon.Services'
import { MsgInformativo } from '../../../../../Utils/Toast/msgInformativo'
@ -24,12 +24,20 @@ import {
// Redux
import { useDispatch, useSelector } from 'react-redux'
import RtpAmazonPendingClasificationInvoicesDetail from './RptAmazonPendingClasificationInvoicesDetail'
import { AiTwotoneFileExcel } from 'react-icons/ai'
import ClasificatorAssign from './ClasificatorAssign'
export interface IRtpAmazonPendingInvoicesProps {}
export default function RtpAmazonPendingInvoices(
props: IRtpAmazonPendingInvoicesProps
) {
const [Usuario, setUsuario] = useState(() => {
const stickyValue = window.localStorage.getItem('UserId')
return stickyValue !== null ? JSON.parse(stickyValue) : ''
})
const [Perfil, setPerfil] = useState(() => {
const stickyValue = window.localStorage.getItem('Perfil')
return stickyValue !== null ? JSON.parse(stickyValue) : 0
})
const dispatch = useDispatch()
const mInvoices = useSelector(
(state: RootState) => state.AmazonInvoices.Invoice
@ -42,14 +50,14 @@ export default function RtpAmazonPendingInvoices(
const [msg, setMsg] = useState('')
const msgColor = 'primary'
function currentDate(days: number): string {
/* 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.AmazonPendingClasificationInvoiceGET()
@ -88,7 +96,7 @@ export default function RtpAmazonPendingInvoices(
.catch((e: Error) => {})
}
const downloadExceptionsFile = (id: number) => {
/* const downloadExceptionsFile = (id: number) => {
DSAmazon.SePuedeTerminardeClasificarFactura(id)
.then((response) => {})
.catch((e: Error) => {})
@ -112,10 +120,11 @@ export default function RtpAmazonPendingInvoices(
setShowMsg(true)
return
})
}
} */
useEffect(() => {
loadReport()
console.log('Usuario=' + Usuario)
}, [])
const changeToggle = (row: I2096Headers) => {
@ -125,9 +134,9 @@ export default function RtpAmazonPendingInvoices(
dispatch(updateInvoice(Obj))
}
const openLink = (item: string) => {
/* const openLink = (item: string) => {
window.open('https://www.amazon.com/dp/' + item)
}
} */
const existsExeptions = (IDMaster: number) => {
const Exceptions = mInvoices
@ -150,7 +159,7 @@ export default function RtpAmazonPendingInvoices(
return Exceptions && Exceptions.length ? Exceptions[0].length : 0
}
const invoiceIncomplete = (IDMaster: number) => {
/* const invoiceIncomplete = (IDMaster: number) => {
let itemsChecked = 0
mInvoices.forEach((invoice) => {
invoice.detail.forEach((det) => {
@ -168,7 +177,7 @@ export default function RtpAmazonPendingInvoices(
//console.log(JSON.stringify(Exceptions.length)+' '+IDMaster)
console.log(IDMaster + ' ' + itemsChecked + ' ' + totItems)
return itemsChecked !== totItems
}
} */
const facturaTerminada = (row: I2096Headers) => {
if (!existsExeptions(row.id)) {
@ -258,7 +267,6 @@ export default function RtpAmazonPendingInvoices(
<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>
@ -270,12 +278,22 @@ export default function RtpAmazonPendingInvoices(
<th style={{ width: '100px' }}>Tot Charge or allowance</th>
<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: '250px' }}>Total de partidas</th>
<th style={{ width: '250px' }}>Asignado</th>
</tr>
</thead>
<tbody>
{mInvoices
? mInvoices.map((MasterData) => {
? mInvoices
.filter((a) => {
if (
a.clasificador === parseInt(Usuario) &&
Perfil !== 'Clasificador lider'
) {
return a
} else if ( ["Clasificador lider", "Administrador"].includes(Perfil)) {return a}
})
.map((MasterData) => {
return (
<>
<tr
@ -333,16 +351,22 @@ export default function RtpAmazonPendingInvoices(
label=""
/>
</td>
<td style={{ width: '80px', textAlign: 'center' }}>
<td
style={{ width: '80px', textAlign: 'center' }}
>
{MasterData.commercialInvoiceDate}
</td>
<td style={{ width: '150px' }}>
{MasterData.invoiceNumber}
</td>
<td style={{ width: '50px', textAlign: 'center' }}>
<td
style={{ width: '50px', textAlign: 'center' }}
>
{MasterData.name}
</td>
<td style={{ width: '100px', textAlign: 'center' }}>
<td
style={{ width: '100px', textAlign: 'center' }}
>
{MasterData.incoterms}
</td>
<td style={{ textAlign: 'center' }}>
@ -378,6 +402,15 @@ export default function RtpAmazonPendingInvoices(
return row.detail.length
})}
</td>
<td>
{' '}
{/* Componente: Asigna clasificador */}
{/* {Perfil==='Clasificador lider' ? 'Modifica' : 'NO MODIFICA'} */}
<ClasificatorAssign
Disabled={Perfil !== 'Clasificador lider'}
Invoice={MasterData}
/>
</td>
</tr>
{MasterData.max ? (
<tr
@ -704,7 +737,6 @@ export default function RtpAmazonPendingInvoices(
</Modal.Body>
</Modal>
<Modal
show={ShowModalW}
onHide={() => {
@ -719,7 +751,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>

@ -90,6 +90,7 @@ export default function RtpAmazonPendingInvoivesDetail(
footNote: Invoice.footNote,
archivo: Invoice.archivo,
fCreacion: Invoice.fCreacion,
clasificador: Invoice.clasificador,
estatus: Invoice.estatus,
max: true,
detail: Detail

@ -95,6 +95,7 @@ export default function RptPendingAnswerFromAmazonDetail(
footNote: Invoice.footNote,
archivo: Invoice.archivo,
fCreacion: Invoice.fCreacion,
clasificador: Invoice.clasificador,
estatus: Invoice.estatus,
max: true,
detail: Detail
@ -392,7 +393,6 @@ export default function RptPendingAnswerFromAmazonDetail(
>
{props.detail.netWeightUnitOfMeasure}
</td>
<td
style={{
textAlign: 'center'

@ -90,6 +90,7 @@ export default function RtpAmazonInvoiceTrafficDetail(
footNote: Invoice.footNote,
archivo: Invoice.archivo,
fCreacion: Invoice.fCreacion,
clasificador: Invoice.clasificador,
estatus: Invoice.estatus,
max: true,
detail: Detail

@ -86,6 +86,7 @@ export default function RptAmazonPendingTraficInvoiceDetail(
footNote: Invoice.footNote,
archivo: Invoice.archivo,
fCreacion: Invoice.fCreacion,
clasificador: Invoice.clasificador,
estatus: Invoice.estatus,
max: true,
detail: Detail

@ -10,6 +10,7 @@ import DTO2096ItemAutoriza from '../DTO/DTO2096ItemAutoriza'
import DTORespuesta from '../../ZincInternacional/DTO/DTORespuesta'
import DTO2096SightLine from '../DTO/DTO2096SightLine'
import DTO2096FraccionDescripcion from '../DTO/DTO2096FraccionDescripcion'
import DTO2096PerfilesParecidos from '../DTO/DTO2096PerfilesParecidos'
class AmazonDataService {
AmazonPendingClasificationInvoiceGET() {
@ -112,5 +113,11 @@ class AmazonDataService {
NoPartesGet(Search: string) {
return http.get<I2096NoParte[]>(`/AmazonInvoice/NoPartesGet?Search=${Search}`)
}
PerfilesParecidosGet(Perfil: string) {
return http.get<DTO2096PerfilesParecidos[]>(`/Usuarios/Catalogo/Usuarios/PerfilesParecidos?Perfil=${Perfil}`)
}
AsignaFactura(IdUsuario: number, IdFactura: number) {
return http.put<DTO2096PerfilesParecidos[]>(`/AmazonInvoice/AsignaFactura?IdUsuario=${IdUsuario}&IdFactura=${IdFactura}`)
}
}
export default new AmazonDataService()

@ -25,16 +25,6 @@ export const Login: React.FC<{}> = () => {
const [msgColor, setMsgColor] = React.useState('primary')
const initialValues: ILogin = { Usuario: '', Contrasena: '' }
React.useEffect(() => {
/* if ('caches' in window) {
caches.keys().then((names) => {
names.forEach((name) => {
caches.delete(name)
})
})
} */
}, [])
return (
<div>
{!userLogued ? (
@ -80,9 +70,11 @@ export const Login: React.FC<{}> = () => {
'UserType',
JSON.stringify(values.UserType)
)
localStorage.setItem(
'Perfil',
JSON.stringify(values.Perfil)
)
dispatch(logued(true))
//navigate('/')
//window.location.href = '/#/Dashboard'
})
.catch((e: AxiosError) => {
localStorage.setItem('menu', '')
@ -97,7 +89,6 @@ export const Login: React.FC<{}> = () => {
}
setShow(true)
})
// actions.setSubmitting(false);
}}
>
<Form id='login-form' className='form'>

@ -3,6 +3,15 @@ import { Alert, Button, Col, Form, Modal, Row, Table } from 'react-bootstrap'
import DataTable from 'react-data-table-component'
import { IRegister } from '../../../Interfaces/IRegister'
import usuariosServices from '../../../Services/Catalogos/Usuarios.Services'
import PerfilesServices from '../../../Services/Catalogos/PerfilesMenu.Services'
import { IPerfil } from '../../../Interfaces/Catalogos/IPerfiles'
import { IconContext } from 'react-icons'
import {
BsCheckCircleFill,
BsCheckLg,
BsFillPersonCheckFill,
BsFillPersonDashFill
} from 'react-icons/bs'
interface IProps {
show: boolean
@ -14,12 +23,13 @@ export const UserList: React.FC<IProps> = (props) => {
const [sDialog, setsDialog] = React.useState(true)
const [Usuarios, setUsuarios] = React.useState<IRegister[]>()
const [Data, setData] = useState<IRegister[]>([])
const [DataPerfiles, setDataPerfiles] = useState<IPerfil[]>([])
const [DataOriginal, setDataOriginal] = useState<IRegister[]>([])
const [filtro, setFiltro] = useState('')
const columnsConcepts = [
{
name: 'id',
width: '125px',
width: '70px',
cell: (row: IRegister) => (
<div
style={{ width: '100%' }}
@ -30,11 +40,11 @@ export const UserList: React.FC<IProps> = (props) => {
{row.id}
</div>
),
sortable: true,
sortable: true
},
{
name: 'Usuario',
width: '250px',
width: '200px',
cell: (row: IRegister) => (
<div
style={{ width: '100%' }}
@ -45,7 +55,7 @@ export const UserList: React.FC<IProps> = (props) => {
{row.usuario}
</div>
),
sortable: true,
sortable: true
},
{
name: 'Nombre',
@ -60,7 +70,7 @@ export const UserList: React.FC<IProps> = (props) => {
{row.nombre}
</div>
),
sortable: true,
sortable: true
},
{
name: 'Correo',
@ -75,9 +85,9 @@ export const UserList: React.FC<IProps> = (props) => {
{row.correo}
</div>
),
sortable: true,
sortable: true
},
{
/* {
name: 'Ultima visita',
width: '125px',
cell: (row: IRegister) => (
@ -90,11 +100,11 @@ export const UserList: React.FC<IProps> = (props) => {
{row.fechaUltimaVisita}
</div>
),
sortable: true,
},
sortable: true
}, */
{
name: 'Estatus',
width: '125px',
name: 'Perfil',
width: '250px',
cell: (row: IRegister) => (
<div
style={{ width: '100%' }}
@ -102,24 +112,63 @@ export const UserList: React.FC<IProps> = (props) => {
props.GetUserInfo(row)
}}
>
{row.activo == 1 ? 'Activo' : 'Inactivo'}
{getProfile(row.idPerfil)}
</div>
),
sortable: true,
sortable: true
},
{
name: 'Estatus',
width: '90px',
cell: (row: IRegister) => (
<div
style={{ width: '100%', textAlign:'center' }}
onClick={() => {
props.GetUserInfo(row)
}}
>
{row.activo == 1 ? (
<IconContext.Provider value={{ color: 'green', size: '20px' }}>
<BsCheckCircleFill />
</IconContext.Provider>
) : (
<IconContext.Provider value={{ color: 'red', size: '20px' }}>
<BsFillPersonDashFill />
</IconContext.Provider>
)}
</div>
),
sortable: true
}
]
const getProfile = (Id: number) => {
const NoAsignado = ' - NO ASIGNADO -'
if (Id === 0) return NoAsignado
else if (DataPerfiles) {
const Profile = DataPerfiles.filter((item) => item.id === Id)
return Profile[0].perfil ? Profile[0].perfil : NoAsignado
}
return NoAsignado
}
useEffect(() => {
usuariosServices
.getAllUsuarios()
.then((response) => {
// setUsuarios(response.data)
setData(response.data)
setDataOriginal(response.data)
})
.catch((e: Error) => {
console.log(e)
})
PerfilesServices.getAllPerfiles()
.then((response) => {
setDataPerfiles(response.data)
})
.catch((e: Error) => {
console.log(e)
})
}, [props.show])
const filtraReporte = (e: any) => {
@ -141,9 +190,15 @@ export const UserList: React.FC<IProps> = (props) => {
}
return props.show ? (
<Modal {...props} size='lg' aria-labelledby='contained-modal-title-vcenter' centered dialogClassName={'modal-70w'}>
<Modal
{...props}
size="lg"
aria-labelledby="contained-modal-title-vcenter"
centered
dialogClassName={'modal-70w'}
>
<Modal.Header>
<Modal.Title id='contained-modal-title-vcenter'></Modal.Title>
<Modal.Title id="contained-modal-title-vcenter"></Modal.Title>
</Modal.Header>
<Alert>
<Row>
@ -152,9 +207,9 @@ export const UserList: React.FC<IProps> = (props) => {
</Col>
<Col xs={10}>
<Form.Control
type='text'
size='sm'
placeholder='Search...'
type="text"
size="sm"
placeholder="Search..."
onChange={(e) => {
filtraReporte(e)
}}

@ -6,4 +6,5 @@ export default interface IjwtStructure {
Usuario: string;
Departamento: string;
UserType: number,
Perfil: string
}
Loading…
Cancel
Save