mirror of
https://github.com/opensupports/opensupports.git
synced 2025-07-31 01:35:15 +02:00
solve merge conflics with languages
This commit is contained in:
commit
5f0996f243
@ -12,12 +12,12 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
retrieveMyTickets() {
|
retrieveMyTickets(closed = 0) {
|
||||||
return {
|
return {
|
||||||
type: 'MY_TICKETS',
|
type: 'MY_TICKETS',
|
||||||
payload: API.call({
|
payload: API.call({
|
||||||
path: '/staff/get-tickets',
|
path: '/staff/get-tickets',
|
||||||
data: {}
|
data: {closed}
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -32,12 +32,12 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
retrieveAllTickets(page = 1) {
|
retrieveAllTickets(page = 1, query = '', closed = 0) {
|
||||||
return {
|
return {
|
||||||
type: 'ALL_TICKETS',
|
type: 'ALL_TICKETS',
|
||||||
payload: API.call({
|
payload: API.call({
|
||||||
path: '/staff/get-all-tickets',
|
path: '/staff/get-all-tickets',
|
||||||
data: {page}
|
data: {page, query, closed}
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
@ -9,6 +9,7 @@ import Table from 'core-components/table';
|
|||||||
import Button from 'core-components/button';
|
import Button from 'core-components/button';
|
||||||
import Tooltip from 'core-components/tooltip';
|
import Tooltip from 'core-components/tooltip';
|
||||||
import DropDown from 'core-components/drop-down';
|
import DropDown from 'core-components/drop-down';
|
||||||
|
import Checkbox from 'core-components/checkbox';
|
||||||
|
|
||||||
class TicketList extends React.Component {
|
class TicketList extends React.Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
@ -21,7 +22,9 @@ class TicketList extends React.Component {
|
|||||||
type: React.PropTypes.oneOf([
|
type: React.PropTypes.oneOf([
|
||||||
'primary',
|
'primary',
|
||||||
'secondary'
|
'secondary'
|
||||||
])
|
]),
|
||||||
|
closedTicketsShown: React.PropTypes.bool,
|
||||||
|
onClosedTicketsShownChange: React.PropTypes.func
|
||||||
};
|
};
|
||||||
|
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
@ -30,7 +33,8 @@ class TicketList extends React.Component {
|
|||||||
tickets: [],
|
tickets: [],
|
||||||
departments: [],
|
departments: [],
|
||||||
ticketPath: '/dashboard/ticket/',
|
ticketPath: '/dashboard/ticket/',
|
||||||
type: 'primary'
|
type: 'primary',
|
||||||
|
closedTicketsShown: false
|
||||||
};
|
};
|
||||||
|
|
||||||
state = {
|
state = {
|
||||||
@ -40,12 +44,20 @@ class TicketList extends React.Component {
|
|||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div className="ticket-list">
|
<div className="ticket-list">
|
||||||
|
<div className="ticket-list__filters">
|
||||||
{(this.props.type === 'secondary' && this.props.showDepartmentDropdown) ? this.renderDepartmentsDropDown() : null}
|
{(this.props.type === 'secondary' && this.props.showDepartmentDropdown) ? this.renderDepartmentsDropDown() : null}
|
||||||
|
{this.props.onClosedTicketsShownChange ? this.renderFilterCheckbox() : null}
|
||||||
|
</div>
|
||||||
<Table {...this.getTableProps()} />
|
<Table {...this.getTableProps()} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
renderFilterCheckbox() {
|
||||||
|
return <Checkbox className="ticket-list__checkbox" label={i18n("SHOW_CLOSED_TICKETS")} value={this.props.closedTicketsShown} onChange={this.props.onClosedTicketsShownChange} wrapInLabel/>
|
||||||
|
}
|
||||||
|
|
||||||
renderDepartmentsDropDown() {
|
renderDepartmentsDropDown() {
|
||||||
return (
|
return (
|
||||||
<div className="ticket-list__department-selector">
|
<div className="ticket-list__department-selector">
|
||||||
|
@ -2,8 +2,19 @@
|
|||||||
|
|
||||||
.ticket-list {
|
.ticket-list {
|
||||||
|
|
||||||
&__department-selector {
|
&__filters {
|
||||||
margin-bottom: 25px;
|
margin-bottom: 25px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__department-selector {
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 25px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__checkbox {
|
||||||
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__number {
|
&__number {
|
||||||
|
@ -34,6 +34,7 @@ class TicketViewer extends React.Component {
|
|||||||
userId: React.PropTypes.number,
|
userId: React.PropTypes.number,
|
||||||
userStaff: React.PropTypes.bool,
|
userStaff: React.PropTypes.bool,
|
||||||
userDepartments: React.PropTypes.array,
|
userDepartments: React.PropTypes.array,
|
||||||
|
userLevel: React.PropTypes.number
|
||||||
};
|
};
|
||||||
|
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
@ -77,7 +78,7 @@ class TicketViewer extends React.Component {
|
|||||||
<div className="ticket-viewer__comments">
|
<div className="ticket-viewer__comments">
|
||||||
{ticket.events && ticket.events.map(this.renderTicketEvent.bind(this))}
|
{ticket.events && ticket.events.map(this.renderTicketEvent.bind(this))}
|
||||||
</div>
|
</div>
|
||||||
{(!this.props.ticket.closed && (this.props.editable || !this.props.assignmentAllowed)) ? this.renderResponseField() : null}
|
{(!this.props.ticket.closed && (this.props.editable || !this.props.assignmentAllowed)) ? this.renderResponseField() : (this.showDeleteButton())? <Button size="medium" onClick={this.onDeleteTicketClick.bind(this)}>{i18n('DELETE_TICKET')}</Button> : null}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -226,7 +227,10 @@ class TicketViewer extends React.Component {
|
|||||||
{(this.props.allowAttachments) ? <FormField name="file" field="file"/> : null}
|
{(this.props.allowAttachments) ? <FormField name="file" field="file"/> : null}
|
||||||
<div className="ticket-viewer__response-buttons">
|
<div className="ticket-viewer__response-buttons">
|
||||||
<SubmitButton type="secondary">{i18n('RESPOND_TICKET')}</SubmitButton>
|
<SubmitButton type="secondary">{i18n('RESPOND_TICKET')}</SubmitButton>
|
||||||
|
<div>
|
||||||
<Button size="medium" onClick={this.onCloseTicketClick.bind(this)}>{i18n('CLOSE_TICKET')}</Button>
|
<Button size="medium" onClick={this.onCloseTicketClick.bind(this)}>{i18n('CLOSE_TICKET')}</Button>
|
||||||
|
{(this.showDeleteButton())? <Button className="ticket-viewer__delete-button" size="medium" onClick={this.onDeleteTicketClick.bind(this)}>{i18n('DELETE_TICKET')}</Button> : null}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{(this.state.commentError) ? this.renderCommentError() : null}
|
{(this.state.commentError) ? this.renderCommentError() : null}
|
||||||
@ -339,6 +343,10 @@ class TicketViewer extends React.Component {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
AreYouSure.openModal(null, this.closeTicket.bind(this));
|
AreYouSure.openModal(null, this.closeTicket.bind(this));
|
||||||
}
|
}
|
||||||
|
onDeleteTicketClick(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
AreYouSure.openModal(null, this.deleteTicket.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
reopenTicket() {
|
reopenTicket() {
|
||||||
API.call({
|
API.call({
|
||||||
@ -357,6 +365,14 @@ class TicketViewer extends React.Component {
|
|||||||
}
|
}
|
||||||
}).then(this.onTicketModification.bind(this));
|
}).then(this.onTicketModification.bind(this));
|
||||||
}
|
}
|
||||||
|
deleteTicket() {
|
||||||
|
API.call({
|
||||||
|
path: '/ticket/delete',
|
||||||
|
data: {
|
||||||
|
ticketNumber: this.props.ticket.ticketNumber
|
||||||
|
}
|
||||||
|
}).then(this.onTicketModification.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
changeDepartment(index) {
|
changeDepartment(index) {
|
||||||
API.call({
|
API.call({
|
||||||
@ -459,6 +475,18 @@ class TicketViewer extends React.Component {
|
|||||||
|
|
||||||
return staffAssignmentItems;
|
return staffAssignmentItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
showDeleteButton() {
|
||||||
|
if(!this.props.ticket.owner) {
|
||||||
|
if(this.props.userLevel == 3) return true;
|
||||||
|
if(this.props.userId == this.props.ticket.author.id) {
|
||||||
|
if((this.props.userStaff && this.props.ticket.author.staff) || (!this.props.userStaff && !this.props.ticket.author.staff)){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default connect((store) => {
|
export default connect((store) => {
|
||||||
@ -469,6 +497,7 @@ export default connect((store) => {
|
|||||||
staffMembers: store.adminData.staffMembers,
|
staffMembers: store.adminData.staffMembers,
|
||||||
staffMembersLoaded: store.adminData.staffMembersLoaded,
|
staffMembersLoaded: store.adminData.staffMembersLoaded,
|
||||||
allowAttachments: store.config['allow-attachments'],
|
allowAttachments: store.config['allow-attachments'],
|
||||||
userSystemEnabled: store.config['user-system-enabled']
|
userSystemEnabled: store.config['user-system-enabled'],
|
||||||
|
userLevel: store.session.userLevel
|
||||||
};
|
};
|
||||||
})(TicketViewer);
|
})(TicketViewer);
|
||||||
|
@ -97,4 +97,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
&__delete-button {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,11 +20,12 @@ class AdminPanelAllTickets extends React.Component {
|
|||||||
|
|
||||||
state = {
|
state = {
|
||||||
page: 1,
|
page: 1,
|
||||||
query: ''
|
query: '',
|
||||||
|
closedTicketsShown: false
|
||||||
};
|
};
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.props.dispatch(AdminDataAction.retrieveAllTickets());
|
this.updateTicketList();
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@ -41,6 +42,14 @@ class AdminPanelAllTickets extends React.Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateTicketList() {
|
||||||
|
this.props.dispatch(AdminDataAction.retrieveAllTickets(
|
||||||
|
this.state.page,
|
||||||
|
this.state.query,
|
||||||
|
this.state.closedTicketsShown*1
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
getTicketListProps() {
|
getTicketListProps() {
|
||||||
return {
|
return {
|
||||||
userId: this.props.userId,
|
userId: this.props.userId,
|
||||||
@ -52,28 +61,32 @@ class AdminPanelAllTickets extends React.Component {
|
|||||||
ticketPath: '/admin/panel/tickets/view-ticket/',
|
ticketPath: '/admin/panel/tickets/view-ticket/',
|
||||||
onPageChange: this.onPageChange.bind(this),
|
onPageChange: this.onPageChange.bind(this),
|
||||||
page: this.state.page,
|
page: this.state.page,
|
||||||
pages: this.props.pages
|
pages: this.props.pages,
|
||||||
|
closedTicketsShown: this.state.closedTicketsShown,
|
||||||
|
onClosedTicketsShownChange: this.onClosedTicketsShownChange.bind(this)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
onSearch(query) {
|
onClosedTicketsShownChange() {
|
||||||
this.setState({query, page: 1});
|
this.setState(function(state) {
|
||||||
|
return {
|
||||||
if(query) {
|
closedTicketsShown: !state.closedTicketsShown
|
||||||
this.props.dispatch(AdminDataAction.searchTickets(query));
|
};
|
||||||
} else {
|
}, () => {
|
||||||
this.props.dispatch(AdminDataAction.retrieveAllTickets());
|
this.updateTicketList();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onSearch(query) {
|
||||||
|
this.setState({query, page: 1}, () => {
|
||||||
|
this.updateTicketList();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onPageChange(event) {
|
onPageChange(event) {
|
||||||
this.setState({page: event.target.value});
|
this.setState({page: event.target.value}, () => {
|
||||||
|
this.updateTicketList();
|
||||||
if(this.state.query) {
|
});
|
||||||
this.props.dispatch(AdminDataAction.searchTickets(this.state.query, event.target.value));
|
|
||||||
} else {
|
|
||||||
this.props.dispatch(AdminDataAction.retrieveAllTickets(event.target.value));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +21,10 @@ class AdminPanelMyTickets extends React.Component {
|
|||||||
tickets: []
|
tickets: []
|
||||||
};
|
};
|
||||||
|
|
||||||
|
state = {
|
||||||
|
closedTicketsShown: false
|
||||||
|
};
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.props.dispatch(AdminDataAction.retrieveMyTickets());
|
this.props.dispatch(AdminDataAction.retrieveMyTickets());
|
||||||
}
|
}
|
||||||
@ -46,10 +50,22 @@ class AdminPanelMyTickets extends React.Component {
|
|||||||
tickets: this.props.tickets,
|
tickets: this.props.tickets,
|
||||||
type: 'secondary',
|
type: 'secondary',
|
||||||
loading: this.props.loading,
|
loading: this.props.loading,
|
||||||
ticketPath: '/admin/panel/tickets/view-ticket/'
|
ticketPath: '/admin/panel/tickets/view-ticket/',
|
||||||
|
closedTicketsShown: this.state.closedTicketsShown,
|
||||||
|
onClosedTicketsShownChange: this.onClosedTicketsShownChange.bind(this)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onClosedTicketsShownChange() {
|
||||||
|
this.setState(function(state) {
|
||||||
|
return {
|
||||||
|
closedTicketsShown: !state.closedTicketsShown
|
||||||
|
};
|
||||||
|
}, () => {
|
||||||
|
this.props.dispatch(AdminDataAction.retrieveMyTickets(this.state.closedTicketsShown * 1));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
onCreateTicket() {
|
onCreateTicket() {
|
||||||
ModalContainer.openModal(
|
ModalContainer.openModal(
|
||||||
<div>
|
<div>
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': 'Responder',
|
'RESPOND': 'Responder',
|
||||||
'RESPOND_TICKET': 'Responder chamado',
|
'RESPOND_TICKET': 'Responder chamado',
|
||||||
'CLOSE_TICKET': 'Fechar ticket',
|
'CLOSE_TICKET': 'Fechar ticket',
|
||||||
|
'DELETE_TICKET': 'Apagar ticket',
|
||||||
'NO_ATTACHMENT': 'Nenhum anexo',
|
'NO_ATTACHMENT': 'Nenhum anexo',
|
||||||
'STAFF': 'Equipe',
|
'STAFF': 'Equipe',
|
||||||
'CUSTOMER': 'Cliente',
|
'CUSTOMER': 'Cliente',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'privado',
|
'PRIVATE': 'privado',
|
||||||
'ENABLE_USER': 'Ativar usuário',
|
'ENABLE_USER': 'Ativar usuário',
|
||||||
'DISABLE_USER': 'Desativar usuário',
|
'DISABLE_USER': 'Desativar usuário',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'Mostrar ingressos fechados',
|
||||||
'IMAGE_HEADER_URL': 'URL do cabeçalho da imagem',
|
'IMAGE_HEADER_URL': 'URL do cabeçalho da imagem',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'Chamados criados',
|
'CHART_CREATE_TICKET': 'Chamados criados',
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': '響應',
|
'RESPOND': '響應',
|
||||||
'RESPOND_TICKET': '響應故障單',
|
'RESPOND_TICKET': '響應故障單',
|
||||||
'CLOSE_TICKET': '關門票',
|
'CLOSE_TICKET': '關門票',
|
||||||
|
'DELETE_TICKET': '删除票证',
|
||||||
'NO_ATTACHMENT': '沒有文件附件',
|
'NO_ATTACHMENT': '沒有文件附件',
|
||||||
'STAFF': '員工',
|
'STAFF': '員工',
|
||||||
'CUSTOMER': '顧客',
|
'CUSTOMER': '顧客',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': '私人的',
|
'PRIVATE': '私人的',
|
||||||
'ENABLE_USER': '启用用户',
|
'ENABLE_USER': '启用用户',
|
||||||
'DISABLE_USER': '禁用用户',
|
'DISABLE_USER': '禁用用户',
|
||||||
|
'SHOW_CLOSED_TICKETS': '显示已关闭的门票',
|
||||||
'IMAGE_HEADER_URL': '图片标题网址',
|
'IMAGE_HEADER_URL': '图片标题网址',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': '已創建門票',
|
'CHART_CREATE_TICKET': '已創建門票',
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': 'Antworten',
|
'RESPOND': 'Antworten',
|
||||||
'RESPOND_TICKET': 'Ticket beantworten',
|
'RESPOND_TICKET': 'Ticket beantworten',
|
||||||
'CLOSE_TICKET': 'Ticket schließen',
|
'CLOSE_TICKET': 'Ticket schließen',
|
||||||
|
'DELETE_TICKET': 'Ticket löschen',
|
||||||
'NO_ATTACHMENT': 'Keine Dateianlage',
|
'NO_ATTACHMENT': 'Keine Dateianlage',
|
||||||
'STAFF': 'Personal',
|
'STAFF': 'Personal',
|
||||||
'CUSTOMER': 'Kunde',
|
'CUSTOMER': 'Kunde',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'Privatgelände',
|
'PRIVATE': 'Privatgelände',
|
||||||
'ENABLE_USER': 'Benutzer aktivieren',
|
'ENABLE_USER': 'Benutzer aktivieren',
|
||||||
'DISABLE_USER': 'Benutzer deaktivieren',
|
'DISABLE_USER': 'Benutzer deaktivieren',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'Geschlossene Tickets anzeigen',
|
||||||
'IMAGE_HEADER_URL': 'URL des Image-Headers',
|
'IMAGE_HEADER_URL': 'URL des Image-Headers',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'Tickets erstellt',
|
'CHART_CREATE_TICKET': 'Tickets erstellt',
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': 'Respond',
|
'RESPOND': 'Respond',
|
||||||
'RESPOND_TICKET': 'Respond Ticket',
|
'RESPOND_TICKET': 'Respond Ticket',
|
||||||
'CLOSE_TICKET': 'Close ticket',
|
'CLOSE_TICKET': 'Close ticket',
|
||||||
|
'DELETE_TICKET': 'Delete ticket',
|
||||||
'NO_ATTACHMENT': 'No file attachment',
|
'NO_ATTACHMENT': 'No file attachment',
|
||||||
'STAFF': 'Staff',
|
'STAFF': 'Staff',
|
||||||
'CUSTOMER': 'Customer',
|
'CUSTOMER': 'Customer',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'Private',
|
'PRIVATE': 'Private',
|
||||||
'ENABLE_USER': 'Enable User',
|
'ENABLE_USER': 'Enable User',
|
||||||
'DISABLE_USER': 'Disable User',
|
'DISABLE_USER': 'Disable User',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'Show Closed Tickets',
|
||||||
'IMAGE_HEADER_URL': 'Image header URL',
|
'IMAGE_HEADER_URL': 'Image header URL',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'Tickets created',
|
'CHART_CREATE_TICKET': 'Tickets created',
|
||||||
|
@ -21,15 +21,16 @@ export default {
|
|||||||
'VIEW_ARTICLES': 'Ver Artículos',
|
'VIEW_ARTICLES': 'Ver Artículos',
|
||||||
'EDIT_PROFILE': 'Editar Perfil',
|
'EDIT_PROFILE': 'Editar Perfil',
|
||||||
'CLOSE_SESSION': 'Cerrar sesión',
|
'CLOSE_SESSION': 'Cerrar sesión',
|
||||||
'CREATE_TICKET': 'Crear Ticket',
|
'CREATE_TICKET': 'Crear ticket',
|
||||||
'TICKET_LIST': 'Lista de Tickets',
|
'TICKET_LIST': 'Lista de tickets',
|
||||||
'SUPPORT_CENTER': 'Centro de Soporte',
|
'SUPPORT_CENTER': 'Centro de Soporte',
|
||||||
'DEPARTMENT': 'Departamento',
|
'DEPARTMENT': 'Departamento',
|
||||||
'AUTHOR': 'Autor',
|
'AUTHOR': 'Autor',
|
||||||
'DATE': 'Fecha',
|
'DATE': 'Fecha',
|
||||||
'RESPOND': 'Responder',
|
'RESPOND': 'Responder',
|
||||||
'RESPOND_TICKET': 'Responder Ticket',
|
'RESPOND_TICKET': 'Responder ticket',
|
||||||
'CLOSE_TICKET': 'Cerrar Ticket',
|
'CLOSE_TICKET': 'Cerrar ticket',
|
||||||
|
'DELETE_TICKET': 'Borrar ticket',
|
||||||
'NO_ATTACHMENT': 'No hay archivo adjunto',
|
'NO_ATTACHMENT': 'No hay archivo adjunto',
|
||||||
'STAFF': 'Staff',
|
'STAFF': 'Staff',
|
||||||
'CUSTOMER': 'Cliente',
|
'CUSTOMER': 'Cliente',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'privado',
|
'PRIVATE': 'privado',
|
||||||
'ENABLE_USER': 'Habilitar usuario',
|
'ENABLE_USER': 'Habilitar usuario',
|
||||||
'DISABLE_USER': 'Deshabilitar usuario',
|
'DISABLE_USER': 'Deshabilitar usuario',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'Mostrar Tickets Cerrados',
|
||||||
'IMAGE_HEADER_URL': 'URL del encabezado de la imagen',
|
'IMAGE_HEADER_URL': 'URL del encabezado de la imagen',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'Tickets creados',
|
'CHART_CREATE_TICKET': 'Tickets creados',
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': 'Répondre',
|
'RESPOND': 'Répondre',
|
||||||
'RESPOND_TICKET': 'Répondre au ticket',
|
'RESPOND_TICKET': 'Répondre au ticket',
|
||||||
'CLOSE_TICKET': 'Fermer ticket',
|
'CLOSE_TICKET': 'Fermer ticket',
|
||||||
|
'DELETE_TICKET': 'Supprimer le ticket',
|
||||||
'NO_ATTACHMENT': 'Aucune pièce jointe',
|
'NO_ATTACHMENT': 'Aucune pièce jointe',
|
||||||
'STAFF': 'Administrateur',
|
'STAFF': 'Administrateur',
|
||||||
'CUSTOMER': 'Client',
|
'CUSTOMER': 'Client',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'privé',
|
'PRIVATE': 'privé',
|
||||||
'ENABLE_USER': 'Activer l\'utilisateur',
|
'ENABLE_USER': 'Activer l\'utilisateur',
|
||||||
'DISABLE_USER': 'Désactiver l\'utilisateur',
|
'DISABLE_USER': 'Désactiver l\'utilisateur',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'Afficher les billets fermés',
|
||||||
'IMAGE_HEADER_URL': 'URL de l\'en-tête de l\'image',
|
'IMAGE_HEADER_URL': 'URL de l\'en-tête de l\'image',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'Tickets créés',
|
'CHART_CREATE_TICKET': 'Tickets créés',
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
'RESPOND': 'Απάντηση',
|
'RESPOND': 'Απάντηση',
|
||||||
'RESPOND_TICKET': 'Απάντηση Εισιτηρίου',
|
'RESPOND_TICKET': 'Απάντηση Εισιτηρίου',
|
||||||
'CLOSE_TICKET': 'κλειστό εισιτήριο',
|
'CLOSE_TICKET': 'κλειστό εισιτήριο',
|
||||||
|
'DELETE_TICKET': 'Διαγραφή εισιτηρίου',
|
||||||
'NO_ATTACHMENT': 'Χωρίς Συνημμένα Αρχεία',
|
'NO_ATTACHMENT': 'Χωρίς Συνημμένα Αρχεία',
|
||||||
'STAFF': 'Προσωπικό',
|
'STAFF': 'Προσωπικό',
|
||||||
'CUSTOMER': 'Πελάτης',
|
'CUSTOMER': 'Πελάτης',
|
||||||
@ -188,6 +189,7 @@
|
|||||||
'PRIVATE': 'ιδιωτικός',
|
'PRIVATE': 'ιδιωτικός',
|
||||||
'ENABLE_USER': 'Ενεργοποίηση χρήστη',
|
'ENABLE_USER': 'Ενεργοποίηση χρήστη',
|
||||||
'DISABLE_USER': 'Απενεργοποίηση χρήστη',
|
'DISABLE_USER': 'Απενεργοποίηση χρήστη',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'Εμφάνιση κλειστών εισιτηρίων',
|
||||||
'IMAGE_HEADER_URL': 'Διεύθυνση URL κεφαλίδας εικόνας',
|
'IMAGE_HEADER_URL': 'Διεύθυνση URL κεφαλίδας εικόνας',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'Τα εισιτήρια δημιουργήθηκαν',
|
'CHART_CREATE_TICKET': 'Τα εισιτήρια δημιουργήθηκαν',
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': 'प्रतिक्रिया',
|
'RESPOND': 'प्रतिक्रिया',
|
||||||
'RESPOND_TICKET': 'प्रतिक्रिया टिकट',
|
'RESPOND_TICKET': 'प्रतिक्रिया टिकट',
|
||||||
'CLOSE_TICKET': 'करीबी टिकट',
|
'CLOSE_TICKET': 'करीबी टिकट',
|
||||||
|
'DELETE_TICKET': 'टिकट हटाएं',
|
||||||
'NO_ATTACHMENT': 'कोई फ़ाइल अनुलग्नक नहीं',
|
'NO_ATTACHMENT': 'कोई फ़ाइल अनुलग्नक नहीं',
|
||||||
'STAFF': 'कर्मचारी',
|
'STAFF': 'कर्मचारी',
|
||||||
'CUSTOMER': 'ग्राहक',
|
'CUSTOMER': 'ग्राहक',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'निजी',
|
'PRIVATE': 'निजी',
|
||||||
'ENABLE_USER': 'उपयोगकर्ता सक्षम करें',
|
'ENABLE_USER': 'उपयोगकर्ता सक्षम करें',
|
||||||
'DISABLE_USER': 'उपयोगकर्ता को अक्षम करें',
|
'DISABLE_USER': 'उपयोगकर्ता को अक्षम करें',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'बंद टिकट दिखाएं',
|
||||||
'IMAGE_HEADER_URL': 'छवि शीर्षलेख यूआरएल',
|
'IMAGE_HEADER_URL': 'छवि शीर्षलेख यूआरएल',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'टिकट बनाया',
|
'CHART_CREATE_TICKET': 'टिकट बनाया',
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': 'Rispondi',
|
'RESPOND': 'Rispondi',
|
||||||
'RESPOND_TICKET': 'Rispondi al ticket',
|
'RESPOND_TICKET': 'Rispondi al ticket',
|
||||||
'CLOSE_TICKET': 'Ticket vicino',
|
'CLOSE_TICKET': 'Ticket vicino',
|
||||||
|
'DELETE_TICKET': 'Elimina ticket',
|
||||||
'NO_ATTACHMENT': 'Nessun file allegato',
|
'NO_ATTACHMENT': 'Nessun file allegato',
|
||||||
'STAFF': 'Staff',
|
'STAFF': 'Staff',
|
||||||
'CUSTOMER': 'Customer',
|
'CUSTOMER': 'Customer',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'privato',
|
'PRIVATE': 'privato',
|
||||||
'ENABLE_USER': 'Abilita utente',
|
'ENABLE_USER': 'Abilita utente',
|
||||||
'DISABLE_USER': 'Disabilita utente',
|
'DISABLE_USER': 'Disabilita utente',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'Mostra biglietti chiusi',
|
||||||
'IMAGE_HEADER_URL': 'URL dell\'intestazione dell\'immagine',
|
'IMAGE_HEADER_URL': 'URL dell\'intestazione dell\'immagine',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'Tickets creato',
|
'CHART_CREATE_TICKET': 'Tickets creato',
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': '応答する',
|
'RESPOND': '応答する',
|
||||||
'RESPOND_TICKET': 'チケット応答',
|
'RESPOND_TICKET': 'チケット応答',
|
||||||
'CLOSE_TICKET': 'クローズチケット',
|
'CLOSE_TICKET': 'クローズチケット',
|
||||||
|
'DELETE_TICKET': 'チケットを削除する',
|
||||||
'NO_ATTACHMENT': '添付ファイルがありません',
|
'NO_ATTACHMENT': '添付ファイルがありません',
|
||||||
'STAFF': 'スタッフ',
|
'STAFF': 'スタッフ',
|
||||||
'CUSTOMER': '顧客',
|
'CUSTOMER': '顧客',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'プライベート',
|
'PRIVATE': 'プライベート',
|
||||||
'ENABLE_USER': 'ユーザーを有効にする',
|
'ENABLE_USER': 'ユーザーを有効にする',
|
||||||
'DISABLE_USER': 'ユーザーを無効にする',
|
'DISABLE_USER': 'ユーザーを無効にする',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'クローズドチケットを表示する',
|
||||||
'IMAGE_HEADER_URL': '画像のヘッダーURL',
|
'IMAGE_HEADER_URL': '画像のヘッダーURL',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': '作成されたチケット',
|
'CHART_CREATE_TICKET': '作成されたチケット',
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': 'Actie',
|
'RESPOND': 'Actie',
|
||||||
'RESPOND_TICKET': 'Reageren',
|
'RESPOND_TICKET': 'Reageren',
|
||||||
'CLOSE_TICKET': 'Sluit ticket',
|
'CLOSE_TICKET': 'Sluit ticket',
|
||||||
|
'DELETE_TICKET': 'Ticket verwijderen',
|
||||||
'NO_ATTACHMENT': 'Geen bijlage',
|
'NO_ATTACHMENT': 'Geen bijlage',
|
||||||
'STAFF': 'Management',
|
'STAFF': 'Management',
|
||||||
'CUSTOMER': 'Klant',
|
'CUSTOMER': 'Klant',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'privaat',
|
'PRIVATE': 'privaat',
|
||||||
'ENABLE_USER': 'Schakel gebruiker in',
|
'ENABLE_USER': 'Schakel gebruiker in',
|
||||||
'DISABLE_USER': 'Gebruiker uitschakelen',
|
'DISABLE_USER': 'Gebruiker uitschakelen',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'Toon gesloten tickets',
|
||||||
'IMAGE_HEADER_URL': 'Image header URL',
|
'IMAGE_HEADER_URL': 'Image header URL',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'Aangemaakte incidenten',
|
'CHART_CREATE_TICKET': 'Aangemaakte incidenten',
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': 'Responder',
|
'RESPOND': 'Responder',
|
||||||
'RESPOND_TICKET': 'Respond Ticket',
|
'RESPOND_TICKET': 'Respond Ticket',
|
||||||
'CLOSE_TICKET': 'Fechar passagem',
|
'CLOSE_TICKET': 'Fechar passagem',
|
||||||
|
'DELETE_TICKET': 'Apagar ticket',
|
||||||
'NO_ATTACHMENT': 'Nenhum anexo de arquivo',
|
'NO_ATTACHMENT': 'Nenhum anexo de arquivo',
|
||||||
'STAFF': 'Funcionários',
|
'STAFF': 'Funcionários',
|
||||||
'CUSTOMER': 'Cliente',
|
'CUSTOMER': 'Cliente',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'privado',
|
'PRIVATE': 'privado',
|
||||||
'ENABLE_USER': 'Ativar usuário',
|
'ENABLE_USER': 'Ativar usuário',
|
||||||
'DISABLE_USER': 'Desativar usuário',
|
'DISABLE_USER': 'Desativar usuário',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'Mostrar ingressos fechados',
|
||||||
'IMAGE_HEADER_URL': 'URL do cabeçalho da imagem',
|
'IMAGE_HEADER_URL': 'URL do cabeçalho da imagem',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'Ingressos criados',
|
'CHART_CREATE_TICKET': 'Ingressos criados',
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': 'Отвечать',
|
'RESPOND': 'Отвечать',
|
||||||
'RESPOND_TICKET': 'Ответить билет',
|
'RESPOND_TICKET': 'Ответить билет',
|
||||||
'CLOSE_TICKET': 'закрыть билет',
|
'CLOSE_TICKET': 'закрыть билет',
|
||||||
|
'DELETE_TICKET': 'Удалить билет',
|
||||||
'NO_ATTACHMENT': 'Нет вложений файлов',
|
'NO_ATTACHMENT': 'Нет вложений файлов',
|
||||||
'STAFF': 'Сотрудники',
|
'STAFF': 'Сотрудники',
|
||||||
'CUSTOMER': 'Клиент',
|
'CUSTOMER': 'Клиент',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'частный',
|
'PRIVATE': 'частный',
|
||||||
'ENABLE_USER': 'Включить пользователя',
|
'ENABLE_USER': 'Включить пользователя',
|
||||||
'DISABLE_USER': 'Отключить пользователя',
|
'DISABLE_USER': 'Отключить пользователя',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'Показать закрытые билеты',
|
||||||
'IMAGE_HEADER_URL': 'URL заголовка изображения',
|
'IMAGE_HEADER_URL': 'URL заголовка изображения',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'Билеты создано',
|
'CHART_CREATE_TICKET': 'Билеты создано',
|
||||||
|
@ -30,6 +30,7 @@ export default {
|
|||||||
'RESPOND': 'Yanıtla',
|
'RESPOND': 'Yanıtla',
|
||||||
'RESPOND_TICKET': 'Bilete Gider',
|
'RESPOND_TICKET': 'Bilete Gider',
|
||||||
'CLOSE_TICKET': 'Yakın bilet',
|
'CLOSE_TICKET': 'Yakın bilet',
|
||||||
|
'DELETE_TICKET': 'Bilet sil',
|
||||||
'NO_ATTACHMENT': 'Dosya eki yok',
|
'NO_ATTACHMENT': 'Dosya eki yok',
|
||||||
'STAFF': 'Personel',
|
'STAFF': 'Personel',
|
||||||
'CUSTOMER': 'Müşteri',
|
'CUSTOMER': 'Müşteri',
|
||||||
@ -188,6 +189,7 @@ export default {
|
|||||||
'PRIVATE': 'gizli',
|
'PRIVATE': 'gizli',
|
||||||
'ENABLE_USER': 'Kullanıcıyı Etkinleştir',
|
'ENABLE_USER': 'Kullanıcıyı Etkinleştir',
|
||||||
'DISABLE_USER': 'Kullanıcıyı Devre Dışı Bırak',
|
'DISABLE_USER': 'Kullanıcıyı Devre Dışı Bırak',
|
||||||
|
'SHOW_CLOSED_TICKETS': 'Kapalı Biletleri Göster',
|
||||||
'IMAGE_HEADER_URL': 'Resim başlığı URL\'si',
|
'IMAGE_HEADER_URL': 'Resim başlığı URL\'si',
|
||||||
|
|
||||||
'CHART_CREATE_TICKET': 'Biletler oluşturuldu',
|
'CHART_CREATE_TICKET': 'Biletler oluşturuldu',
|
||||||
|
@ -2,18 +2,20 @@
|
|||||||
use Respect\Validation\Validator as DataValidator;
|
use Respect\Validation\Validator as DataValidator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @api {post} /staff/get-all-tickets Get all tickets
|
* @api {post} /staff/get-all-tickets Get all tickets according to search
|
||||||
* @apiVersion 4.3.0
|
* @apiVersion 4.3.0
|
||||||
*
|
*
|
||||||
* @apiName Get all tickets
|
* @apiName Get all tickets
|
||||||
*
|
*
|
||||||
* @apiGroup Staff
|
* @apiGroup Staff
|
||||||
*
|
*
|
||||||
* @apiDescription This path retrieves all tickets.
|
* @apiDescription This path retrieves all tickets according to search and opened/closed filters.
|
||||||
*
|
*
|
||||||
* @apiPermission staff1
|
* @apiPermission staff1
|
||||||
*
|
*
|
||||||
* @apiParam {Number} page The page number.
|
* @apiParam {Number} page The page number.
|
||||||
|
* @apiParam {String} query Query string to search.
|
||||||
|
* @apiParam {Boolean} closed Include closed tickets.
|
||||||
*
|
*
|
||||||
* @apiUse NO_PERMISSION
|
* @apiUse NO_PERMISSION
|
||||||
* @apiUse INVALID_PAGE
|
* @apiUse INVALID_PAGE
|
||||||
@ -58,10 +60,24 @@ class GetAllTicketsStaffController extends Controller {
|
|||||||
private function getTicketList() {
|
private function getTicketList() {
|
||||||
$page = Controller::request('page');
|
$page = Controller::request('page');
|
||||||
|
|
||||||
$query = $this->getStaffDepartmentsQueryFilter();
|
$query = $this->getSearchQuery();
|
||||||
$query .= 'ORDER BY id DESC LIMIT 10 OFFSET ' . (($page-1)*10);
|
$query .= $this->getStaffDepartmentsQueryFilter();
|
||||||
|
$query .= $this->getClosedFilter();
|
||||||
|
$query .= "ORDER BY CASE WHEN (title LIKE ?) THEN 1 ELSE 2 END ASC, id DESC LIMIT 10 OFFSET " . (($page-1)*10);
|
||||||
|
|
||||||
return Ticket::find($query);
|
return Ticket::find($query, [
|
||||||
|
Controller::request('query') . '%',
|
||||||
|
'%' . Controller::request('query') . '%',
|
||||||
|
Controller::request('query') . '%'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getSearchQuery() {
|
||||||
|
$page = Controller::request('page');
|
||||||
|
|
||||||
|
$query = " (title LIKE ? OR title LIKE ?) AND ";
|
||||||
|
|
||||||
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getTotalPages() {
|
private function getTotalPages() {
|
||||||
@ -81,4 +97,13 @@ class GetAllTicketsStaffController extends Controller {
|
|||||||
|
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getClosedFilter() {
|
||||||
|
$closed = Controller::request('closed')*1;
|
||||||
|
if ($closed) {
|
||||||
|
return '';
|
||||||
|
} else {
|
||||||
|
return " AND (closed = '0')";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,8 @@ use Respect\Validation\Validator as DataValidator;
|
|||||||
*
|
*
|
||||||
* @apiPermission staff1
|
* @apiPermission staff1
|
||||||
*
|
*
|
||||||
|
* @apiParam {bool} closed Include closed tickets in the response.
|
||||||
|
*
|
||||||
* @apiUse NO_PERMISSION
|
* @apiUse NO_PERMISSION
|
||||||
*
|
*
|
||||||
* @apiSuccess {[Ticket](#api-Data_Structures-ObjectTicket)[]} data Array of tickets assigned to the staff
|
* @apiSuccess {[Ticket](#api-Data_Structures-ObjectTicket)[]} data Array of tickets assigned to the staff
|
||||||
@ -32,6 +34,11 @@ class GetTicketStaffController extends Controller {
|
|||||||
|
|
||||||
public function handler() {
|
public function handler() {
|
||||||
$user = Controller::getLoggedUser();
|
$user = Controller::getLoggedUser();
|
||||||
|
$closed = Controller::request('closed');
|
||||||
|
if ($closed) {
|
||||||
Response::respondSuccess($user->sharedTicketList->toArray());
|
Response::respondSuccess($user->sharedTicketList->toArray());
|
||||||
|
} else {
|
||||||
|
Response::respondSuccess($user->withCondition('closed = ?', ['0'])->sharedTicketList->toArray());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,6 +12,7 @@ include 'ticket/close.php';
|
|||||||
include 'ticket/re-open.php';
|
include 'ticket/re-open.php';
|
||||||
include 'ticket/change-priority.php';
|
include 'ticket/change-priority.php';
|
||||||
include 'ticket/seen.php';
|
include 'ticket/seen.php';
|
||||||
|
include 'ticket/delete.php';
|
||||||
|
|
||||||
$ticketControllers = new ControllerGroup();
|
$ticketControllers = new ControllerGroup();
|
||||||
$ticketControllers->setGroupPath('/ticket');
|
$ticketControllers->setGroupPath('/ticket');
|
||||||
@ -29,5 +30,6 @@ $ticketControllers->addController(new CloseController);
|
|||||||
$ticketControllers->addController(new ReOpenController);
|
$ticketControllers->addController(new ReOpenController);
|
||||||
$ticketControllers->addController(new ChangePriorityController);
|
$ticketControllers->addController(new ChangePriorityController);
|
||||||
$ticketControllers->addController(new SeenController);
|
$ticketControllers->addController(new SeenController);
|
||||||
|
$ticketControllers->addController(new DeleteController);
|
||||||
|
|
||||||
$ticketControllers->finalize();
|
$ticketControllers->finalize();
|
63
server/controllers/ticket/delete.php
Normal file
63
server/controllers/ticket/delete.php
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<?php
|
||||||
|
use Respect\Validation\Validator as DataValidator;
|
||||||
|
DataValidator::with('CustomValidations', true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {post} /ticket/delete Delete a ticket
|
||||||
|
* @apiVersion 4.3.0
|
||||||
|
*
|
||||||
|
* @apiName Delete ticket
|
||||||
|
*
|
||||||
|
* @apiGroup Ticket
|
||||||
|
*
|
||||||
|
* @apiDescription This path deletes a ticket.
|
||||||
|
*
|
||||||
|
* @apiPermission user
|
||||||
|
*
|
||||||
|
* @apiParam {Number} ticketNumber The number of the ticket to delete.
|
||||||
|
*
|
||||||
|
* @apiUse NO_PERMISSION
|
||||||
|
* @apiUse INVALID_TICKET
|
||||||
|
*
|
||||||
|
* @apiSuccess {Object} data Empty object
|
||||||
|
*ulp d
|
||||||
|
*/
|
||||||
|
|
||||||
|
class DeleteController extends Controller {
|
||||||
|
const PATH = '/delete';
|
||||||
|
const METHOD = 'POST';
|
||||||
|
|
||||||
|
public function validations() {
|
||||||
|
return [
|
||||||
|
'permission' => 'user',
|
||||||
|
'requestData' => [
|
||||||
|
'ticketNumber' => [
|
||||||
|
'validation' => DataValidator::validTicketNumber(),
|
||||||
|
'error' => ERRORS::INVALID_TICKET
|
||||||
|
]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handler() {
|
||||||
|
$user = Controller::getLoggedUser();
|
||||||
|
$ticket = Ticket::getByTicketNumber(Controller::request('ticketNumber'));
|
||||||
|
$ticketAuthor = $ticket->authorToArray();
|
||||||
|
|
||||||
|
if($ticket->owner) {
|
||||||
|
throw new Exception(ERRORS::NO_PERMISSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Controller::isStaffLogged() && $user->level < 3) {
|
||||||
|
throw new Exception(ERRORS::NO_PERMISSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!Controller::isStaffLogged() && ($user->email !== $ticketAuthor['email'] || $ticketAuthor['staff'])) {
|
||||||
|
throw new Exception(ERRORS::NO_PERMISSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ticket->delete();
|
||||||
|
|
||||||
|
Response::respondSuccess();
|
||||||
|
}
|
||||||
|
}
|
@ -150,6 +150,10 @@ abstract class DataStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function withCondition($condition, $values) {
|
||||||
|
return new static($this->_bean->withCondition($condition, $values));
|
||||||
|
}
|
||||||
|
|
||||||
private function updateBeanProp($key, $value) {
|
private function updateBeanProp($key, $value) {
|
||||||
if ($value instanceof DataStoreList) {
|
if ($value instanceof DataStoreList) {
|
||||||
$this->_bean[$key] = $value->toBeanList();
|
$this->_bean[$key] = $value->toBeanList();
|
||||||
|
@ -90,17 +90,21 @@ class Ticket extends DataStore {
|
|||||||
parent::store();
|
parent::store();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function delete() {
|
||||||
|
parent::delete();
|
||||||
|
}
|
||||||
|
|
||||||
public function generateUniqueTicketNumber() {
|
public function generateUniqueTicketNumber() {
|
||||||
$linearCongruentialGenerator = new LinearCongruentialGenerator();
|
$linearCongruentialGenerator = new LinearCongruentialGenerator();
|
||||||
$ticketQuantity = Ticket::count();
|
|
||||||
|
|
||||||
if ($ticketQuantity === 0) {
|
if (Ticket::count() === 0) {
|
||||||
$ticketNumber = Setting::getSetting('ticket-first-number')->value;
|
$ticketNumber = Setting::getSetting('ticket-first-number')->value;
|
||||||
} else {
|
} else {
|
||||||
|
$lastTicketId = Ticket::findOne(' ORDER BY id DESC')->id;
|
||||||
$linearCongruentialGenerator->setGap(Setting::getSetting('ticket-gap')->value);
|
$linearCongruentialGenerator->setGap(Setting::getSetting('ticket-gap')->value);
|
||||||
$linearCongruentialGenerator->setFirst(Setting::getSetting('ticket-first-number')->value);
|
$linearCongruentialGenerator->setFirst(Setting::getSetting('ticket-first-number')->value);
|
||||||
|
|
||||||
$ticketNumber = $linearCongruentialGenerator->generate($ticketQuantity);
|
$ticketNumber = $linearCongruentialGenerator->generate($lastTicketId + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $ticketNumber;
|
return $ticketNumber;
|
||||||
|
@ -27,6 +27,7 @@ require './ticket/custom-response.rb'
|
|||||||
require './ticket/change-department.rb'
|
require './ticket/change-department.rb'
|
||||||
require './ticket/close.rb'
|
require './ticket/close.rb'
|
||||||
require './ticket/re-open.rb'
|
require './ticket/re-open.rb'
|
||||||
|
require './ticket/delete.rb'
|
||||||
require './staff/add.rb'
|
require './staff/add.rb'
|
||||||
require './staff/get.rb'
|
require './staff/get.rb'
|
||||||
require './staff/edit.rb'
|
require './staff/edit.rb'
|
||||||
|
@ -35,6 +35,17 @@ class Scripts
|
|||||||
raise response['message']
|
raise response['message']
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
def self.deleteStaff(staffId)
|
||||||
|
response = request('/staff/delete', {
|
||||||
|
staffId: staffId,
|
||||||
|
csrf_userid: $csrf_userid,
|
||||||
|
csrf_token: $csrf_token
|
||||||
|
})
|
||||||
|
|
||||||
|
if response['status'] === 'fail'
|
||||||
|
raise response['message']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.login(email = 'steve@jobs.com', password = 'custompassword', staff = false)
|
def self.login(email = 'steve@jobs.com', password = 'custompassword', staff = false)
|
||||||
request('/user/logout')
|
request('/user/logout')
|
||||||
|
@ -31,10 +31,12 @@ describe '/staff/assign-ticket' do
|
|||||||
(staff_ticket['ticket_id']).should.equal('1')
|
(staff_ticket['ticket_id']).should.equal('1')
|
||||||
end
|
end
|
||||||
it 'should assign ticket if a staff choose another to assing a ticket ' do
|
it 'should assign ticket if a staff choose another to assing a ticket ' do
|
||||||
|
staffId = $database.getRow('staff','ayra2@opensupports.com','email')['id']
|
||||||
|
|
||||||
ticket = $database.getRow('ticket', 3 , 'id')
|
ticket = $database.getRow('ticket', 3 , 'id')
|
||||||
result = request('/staff/assign-ticket', {
|
result = request('/staff/assign-ticket', {
|
||||||
ticketNumber: ticket['ticket_number'],
|
ticketNumber: ticket['ticket_number'],
|
||||||
staffId:4,
|
staffId: staffId,
|
||||||
csrf_userid: $csrf_userid,
|
csrf_userid: $csrf_userid,
|
||||||
csrf_token: $csrf_token
|
csrf_token: $csrf_token
|
||||||
})
|
})
|
||||||
@ -42,10 +44,9 @@ describe '/staff/assign-ticket' do
|
|||||||
|
|
||||||
ticket = $database.getRow('ticket', 3 , 'id')
|
ticket = $database.getRow('ticket', 3 , 'id')
|
||||||
|
|
||||||
(ticket['owner_id']).should.equal('4')
|
(ticket['owner_id']).should.equal(staffId)
|
||||||
|
|
||||||
(ticket['unread']).should.equal('1')
|
(ticket['unread']).should.equal('1')
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should fail if ticket is already owned' do
|
it 'should fail if ticket is already owned' do
|
||||||
|
@ -1,28 +1,30 @@
|
|||||||
describe'/staff/delete' do
|
describe'/staff/delete' do
|
||||||
request('/user/logout')
|
request('/user/logout')
|
||||||
Scripts.login($staff[:email], $staff[:password], true)
|
Scripts.login($staff[:email], $staff[:password], true)
|
||||||
|
@staffId = $database.getRow('staff','littlelannister@opensupports.com','email')['id']
|
||||||
|
|
||||||
it 'should delete staff member' do
|
it 'should delete staff member' do
|
||||||
result= request('/staff/delete', {
|
result= request('/staff/delete', {
|
||||||
csrf_userid: $csrf_userid,
|
csrf_userid: $csrf_userid,
|
||||||
csrf_token: $csrf_token,
|
csrf_token: $csrf_token,
|
||||||
staffId: 3
|
staffId: @staffId
|
||||||
})
|
})
|
||||||
|
|
||||||
(result['status']).should.equal('success')
|
(result['status']).should.equal('success')
|
||||||
|
|
||||||
row = $database.getRow('staff', 3, 'id')
|
row = $database.getRow('staff', @staffId, 'id')
|
||||||
(row).should.equal(nil)
|
(row).should.equal(nil)
|
||||||
|
|
||||||
row = $database.getRow('department', 1, 'id')
|
row = $database.getRow('department', 1, 'id')
|
||||||
(row['owners']).should.equal('3')
|
(row['owners']).should.equal('3')
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should fail delete if staff member is does not exist' do
|
it 'should fail delete if staff member is does not exist' do
|
||||||
result = request('/staff/delete', {
|
result = request('/staff/delete', {
|
||||||
csrf_userid: $csrf_userid,
|
csrf_userid: $csrf_userid,
|
||||||
csrf_token: $csrf_token,
|
csrf_token: $csrf_token,
|
||||||
staffId: 3
|
staffId: @staffId
|
||||||
})
|
})
|
||||||
|
|
||||||
(result['status']).should.equal('fail')
|
(result['status']).should.equal('fail')
|
||||||
|
@ -3,23 +3,24 @@ describe'/staff/edit' do
|
|||||||
Scripts.login($staff[:email], $staff[:password], true)
|
Scripts.login($staff[:email], $staff[:password], true)
|
||||||
|
|
||||||
it 'should edit another staff member' do
|
it 'should edit another staff member' do
|
||||||
|
staffId = $database.getRow('staff','tyrion@opensupports.com','email')['id']
|
||||||
result= request('/staff/edit', {
|
result= request('/staff/edit', {
|
||||||
csrf_userid: $csrf_userid,
|
csrf_userid: $csrf_userid,
|
||||||
csrf_token: $csrf_token,
|
csrf_token: $csrf_token,
|
||||||
email: 'LittleLannister@opensupports.com',
|
email: 'LittleLannister@opensupports.com',
|
||||||
level: 1,
|
level: 1,
|
||||||
departments: '[1, 2]',
|
departments: '[1, 2]',
|
||||||
staffId: 3
|
staffId: staffId
|
||||||
})
|
})
|
||||||
|
|
||||||
(result['status']).should.equal('success')
|
(result['status']).should.equal('success')
|
||||||
|
|
||||||
row = $database.getRow('staff', 3, 'id')
|
row = $database.getRow('staff', staffId, 'id')
|
||||||
|
|
||||||
(row['email']).should.equal('littlelannister@opensupports.com')
|
(row['email']).should.equal('littlelannister@opensupports.com')
|
||||||
(row['level']).should.equal('1')
|
(row['level']).should.equal('1')
|
||||||
|
|
||||||
rows = $database.getRow('department_staff', 3, 'staff_id')
|
rows = $database.getRow('department_staff', staffId, 'staff_id')
|
||||||
|
|
||||||
(rows['department_id']).should.equal('1')
|
(rows['department_id']).should.equal('1')
|
||||||
|
|
||||||
@ -28,7 +29,6 @@ describe'/staff/edit' do
|
|||||||
|
|
||||||
row = $database.getRow('department', 2, 'id')
|
row = $database.getRow('department', 2, 'id')
|
||||||
(row['owners']).should.equal('2')
|
(row['owners']).should.equal('2')
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should edit staff member ' do
|
it 'should edit staff member ' do
|
||||||
@ -43,7 +43,7 @@ describe'/staff/edit' do
|
|||||||
departments: '[1]'
|
departments: '[1]'
|
||||||
})
|
})
|
||||||
|
|
||||||
row = $database.getRow('staff', 'Arya Stark', 'name')
|
row = $database.getRow('staff', 'arya@opensupports.com', 'email')
|
||||||
|
|
||||||
result = request('/staff/edit', {
|
result = request('/staff/edit', {
|
||||||
csrf_userid: $csrf_userid,
|
csrf_userid: $csrf_userid,
|
||||||
|
@ -20,7 +20,7 @@ describe'/staff/get-all' do
|
|||||||
(result['data'][0]['departments'][1]['name']).should.equal('Suggestions')
|
(result['data'][0]['departments'][1]['name']).should.equal('Suggestions')
|
||||||
(result['data'][0]['departments'][2]['id']).should.equal('3')
|
(result['data'][0]['departments'][2]['id']).should.equal('3')
|
||||||
(result['data'][0]['departments'][2]['name']).should.equal('Tech support')
|
(result['data'][0]['departments'][2]['name']).should.equal('Tech support')
|
||||||
(result['data'][0]['assignedTickets']).should.equal(4)
|
(result['data'][0]['assignedTickets']).should.equal(6)
|
||||||
(result['data'][0]['closedTickets']).should.equal(0)
|
(result['data'][0]['closedTickets']).should.equal(0)
|
||||||
|
|
||||||
(result['data'][2]['name']).should.equal('Arya Stark')
|
(result['data'][2]['name']).should.equal('Arya Stark')
|
||||||
|
@ -3,14 +3,12 @@ describe '/staff/get-new-tickets' do
|
|||||||
Scripts.login($staff[:email], $staff[:password], true)
|
Scripts.login($staff[:email], $staff[:password], true)
|
||||||
|
|
||||||
it 'should get news tickets' do
|
it 'should get news tickets' do
|
||||||
|
|
||||||
result = request('/staff/get-new-tickets', {
|
result = request('/staff/get-new-tickets', {
|
||||||
csrf_userid: $csrf_userid,
|
csrf_userid: $csrf_userid,
|
||||||
csrf_token: $csrf_token
|
csrf_token: $csrf_token
|
||||||
})
|
})
|
||||||
|
|
||||||
(result['status']).should.equal('success')
|
(result['status']).should.equal('success')
|
||||||
(result['data'].size).should.equal(8)
|
(result['data'].size).should.equal(9)
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -22,6 +22,6 @@ describe '/staff/get-tickets' do
|
|||||||
})
|
})
|
||||||
|
|
||||||
(result['status']).should.equal('success')
|
(result['status']).should.equal('success')
|
||||||
(result['data'].size).should.equal(3)
|
(result['data'].size).should.equal(5)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -16,10 +16,11 @@ describe '/staff/get/' do
|
|||||||
(result['data']['sendEmailOnNewTicket']).should.equal('1')
|
(result['data']['sendEmailOnNewTicket']).should.equal('1')
|
||||||
end
|
end
|
||||||
it 'should return staff member data with staff Id' do
|
it 'should return staff member data with staff Id' do
|
||||||
|
staff = $database.getRow('staff','tyrion@opensupports.com','email')
|
||||||
result = request('/staff/get', {
|
result = request('/staff/get', {
|
||||||
csrf_userid: $csrf_userid,
|
csrf_userid: $csrf_userid,
|
||||||
csrf_token: $csrf_token,
|
csrf_token: $csrf_token,
|
||||||
staffId: 3
|
staffId: staff['id']
|
||||||
})
|
})
|
||||||
|
|
||||||
(result['status']).should.equal('success')
|
(result['status']).should.equal('success')
|
||||||
|
@ -19,7 +19,7 @@ describe'system/disable-user-system' do
|
|||||||
|
|
||||||
numberOftickets= $database.query("SELECT * FROM ticket WHERE author_id IS NULL AND author_email IS NOT NULL AND author_name IS NOT NULL")
|
numberOftickets= $database.query("SELECT * FROM ticket WHERE author_id IS NULL AND author_email IS NOT NULL AND author_name IS NOT NULL")
|
||||||
|
|
||||||
(numberOftickets.num_rows).should.equal(39)
|
(numberOftickets.num_rows).should.equal(40)
|
||||||
|
|
||||||
request('/user/logout')
|
request('/user/logout')
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ describe'system/disable-user-system' do
|
|||||||
|
|
||||||
numberOftickets= $database.query("SELECT * FROM ticket WHERE author_email IS NULL AND author_name IS NULL AND author_id IS NOT NULL" )
|
numberOftickets= $database.query("SELECT * FROM ticket WHERE author_email IS NULL AND author_name IS NULL AND author_id IS NOT NULL" )
|
||||||
|
|
||||||
(numberOftickets.num_rows).should.equal(40)
|
(numberOftickets.num_rows).should.equal(41)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
114
tests/ticket/delete.rb
Normal file
114
tests/ticket/delete.rb
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
describe '/ticket/delete' do
|
||||||
|
|
||||||
|
it 'should delete ticket if it is not assigned and is logged a staff lvl 3 ' do
|
||||||
|
request('/user/logout')
|
||||||
|
Scripts.login($staff[:email], $staff[:password], true)
|
||||||
|
Scripts.createTicket('ticket_to_delete')
|
||||||
|
ticket = $database.getRow('ticket', 'ticket_to_delete', 'title')
|
||||||
|
|
||||||
|
request('/staff/add', {
|
||||||
|
csrf_userid: $csrf_userid,
|
||||||
|
csrf_token: $csrf_token,
|
||||||
|
name: 'Ned Stark',
|
||||||
|
password: 'headless',
|
||||||
|
email: 'ned@opensupports.com',
|
||||||
|
level: 3,
|
||||||
|
profilePic: '',
|
||||||
|
departments: '[1]'
|
||||||
|
})
|
||||||
|
|
||||||
|
request('/user/logout')
|
||||||
|
Scripts.login('ned@opensupports.com', 'headless', true)
|
||||||
|
|
||||||
|
result = request('/ticket/delete', {
|
||||||
|
ticketNumber: ticket['ticket_number'],
|
||||||
|
csrf_userid: $csrf_userid,
|
||||||
|
csrf_token: $csrf_token
|
||||||
|
})
|
||||||
|
|
||||||
|
(result['status']).should.equal('success')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should delete ticket if it is yours and it is not assigned' do
|
||||||
|
request('/user/logout')
|
||||||
|
Scripts.createUser('deleter@opensupports.com', 'deleterpassword', 'Delter')
|
||||||
|
Scripts.login('deleter@opensupports.com', 'deleterpassword')
|
||||||
|
|
||||||
|
Scripts.createTicket('ticket_to_delete_2')
|
||||||
|
ticket = $database.getRow('ticket', 'ticket_to_delete_2', 'title');
|
||||||
|
result = request('/ticket/delete', {
|
||||||
|
ticketNumber: ticket['ticket_number'],
|
||||||
|
csrf_userid: $csrf_userid,
|
||||||
|
csrf_token: $csrf_token
|
||||||
|
})
|
||||||
|
(result['status']).should.equal('success')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should not delete ticket if it is assigned' do
|
||||||
|
request('/user/logout')
|
||||||
|
Scripts.login('deleter@opensupports.com', 'deleterpassword')
|
||||||
|
|
||||||
|
Scripts.createTicket('ticket_to_delete_3')
|
||||||
|
ticket = $database.getRow('ticket', 'ticket_to_delete_3', 'title');
|
||||||
|
|
||||||
|
request('/user/logout')
|
||||||
|
Scripts.login($staff[:email], $staff[:password], true)
|
||||||
|
|
||||||
|
result = request('/staff/assign-ticket', {
|
||||||
|
ticketNumber: ticket['ticket_number'],
|
||||||
|
csrf_userid: $csrf_userid,
|
||||||
|
csrf_token: $csrf_token
|
||||||
|
})
|
||||||
|
|
||||||
|
request('/user/logout')
|
||||||
|
Scripts.login('deleter@opensupports.com', 'deleterpassword')
|
||||||
|
|
||||||
|
result = request('/ticket/delete', {
|
||||||
|
ticketNumber: ticket['ticket_number'],
|
||||||
|
csrf_userid: $csrf_userid,
|
||||||
|
csrf_token: $csrf_token
|
||||||
|
})
|
||||||
|
|
||||||
|
(result['status']).should.equal('fail')
|
||||||
|
(result['message']).should.equal('NO_PERMISSION')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should not delete ticket if the staff logged is not lvl 3' do
|
||||||
|
request('/user/logout')
|
||||||
|
Scripts.login($staff[:email], $staff[:password], true)
|
||||||
|
Scripts.createTicket('ticket_to_delete_4')
|
||||||
|
|
||||||
|
ticket = $database.getRow('ticket', 'ticket_to_delete_4', 'title');
|
||||||
|
|
||||||
|
request('/staff/add', {
|
||||||
|
csrf_userid: $csrf_userid,
|
||||||
|
csrf_token: $csrf_token,
|
||||||
|
name: 'Joan Chris',
|
||||||
|
password: 'theyaregonnafireme',
|
||||||
|
email: 'uselessstaff@opensupports.com',
|
||||||
|
level: 2,
|
||||||
|
profilePic: '',
|
||||||
|
departments: '[1]'
|
||||||
|
})
|
||||||
|
request('/user/logout')
|
||||||
|
|
||||||
|
Scripts.login('uselessstaff@opensupports.com', 'theyaregonnafireme',true)
|
||||||
|
|
||||||
|
result = request('/ticket/delete', {
|
||||||
|
ticketNumber: ticket['ticket_number'],
|
||||||
|
csrf_userid: $csrf_userid,
|
||||||
|
csrf_token: $csrf_token
|
||||||
|
})
|
||||||
|
|
||||||
|
(result['status']).should.equal('fail')
|
||||||
|
(result['message']).should.equal('NO_PERMISSION')
|
||||||
|
|
||||||
|
request('/user/logout')
|
||||||
|
Scripts.login($staff[:email], $staff[:password], true)
|
||||||
|
staff = $database.getRow('staff', 'ned@opensupports.com', 'email')
|
||||||
|
Scripts.deleteStaff(staff['id'])
|
||||||
|
|
||||||
|
staff = $database.getRow('staff', 'uselessstaff@opensupports.com', 'email')
|
||||||
|
Scripts.deleteStaff(staff['id'])
|
||||||
|
end
|
||||||
|
end
|
@ -36,7 +36,7 @@ describe '/user/get-users' do
|
|||||||
})
|
})
|
||||||
|
|
||||||
(result['status']).should.equal('success')
|
(result['status']).should.equal('success')
|
||||||
(result['data']['users'].size).should.equal(5)
|
(result['data']['users'].size).should.equal(6)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should get users with order by tickets and asc' do
|
it 'should get users with order by tickets and asc' do
|
||||||
|
Loading…
x
Reference in New Issue
Block a user