200 lines
5.7 KiB
JavaScript
200 lines
5.7 KiB
JavaScript
import ngModule from '../module';
|
|
import Section from 'salix/components/section';
|
|
import UserError from 'core/lib/user-error';
|
|
|
|
export default class Controller extends Section {
|
|
constructor($element, $) {
|
|
super($element, $);
|
|
this.defaulter = {};
|
|
this.defaulters = [];
|
|
this.checkedDefaulers = [];
|
|
|
|
this.smartTableOptions = {
|
|
activeButtons: {
|
|
search: true
|
|
},
|
|
columns: [
|
|
{
|
|
field: 'clientFk',
|
|
autocomplete: {
|
|
url: 'Clients',
|
|
showField: 'name',
|
|
valueField: 'id'
|
|
}
|
|
}, {
|
|
field: 'salesPersonFk',
|
|
autocomplete: {
|
|
url: 'Workers/activeWithInheritedRole',
|
|
where: `{role: 'salesPerson'}`,
|
|
searchFunction: '{firstName: $search}',
|
|
showField: 'name',
|
|
valueField: 'id',
|
|
}
|
|
}, {
|
|
field: 'countryFk',
|
|
autocomplete: {
|
|
url: 'Countries',
|
|
showField: 'country',
|
|
valueField: 'id'
|
|
}
|
|
}, {
|
|
field: 'payMethodFk',
|
|
autocomplete: {
|
|
showField: 'name',
|
|
valueField: 'id'
|
|
}
|
|
},
|
|
{
|
|
field: 'workerFk',
|
|
autocomplete: {
|
|
url: 'Workers/activeWithInheritedRole',
|
|
searchFunction: '{firstName: $search}',
|
|
showField: 'name',
|
|
valueField: 'id',
|
|
}
|
|
},
|
|
{
|
|
field: 'observation',
|
|
searchable: false
|
|
},
|
|
{
|
|
field: 'created',
|
|
datepicker: true
|
|
},
|
|
{
|
|
field: 'defaulterSinced',
|
|
datepicker: true
|
|
}
|
|
]
|
|
};
|
|
|
|
this.getBalanceDueTotal();
|
|
}
|
|
|
|
set defaulters(value) {
|
|
if (!value || !value.length) return;
|
|
for (let defaulter of value)
|
|
defaulter.isWorker = defaulter.businessTypeFk === 'worker';
|
|
|
|
this._defaulters = value;
|
|
}
|
|
|
|
get defaulters() {
|
|
return this._defaulters;
|
|
}
|
|
|
|
get checked() {
|
|
const clients = this.$.model.data || [];
|
|
const checkedLines = [];
|
|
for (let defaulter of clients) {
|
|
if (defaulter.checked)
|
|
checkedLines.push(defaulter);
|
|
}
|
|
|
|
return checkedLines;
|
|
}
|
|
|
|
saveChecked(clientId) {
|
|
this.checkedDefaulers = this.checkedDefaulers.includes(clientId) ?
|
|
this.checkedDefaulers.filter(id => id !== clientId) : [...this.checkedDefaulers, clientId];
|
|
}
|
|
|
|
reCheck() {
|
|
if (!this.$.model.data || !this.checkedDefaulers.length) return;
|
|
|
|
this.$.model.data.forEach(defaulter => {
|
|
defaulter.checked = this.checkedDefaulers.includes(defaulter.clientFk);
|
|
});
|
|
}
|
|
|
|
getBalanceDueTotal() {
|
|
this.$http.get('Defaulters/filter')
|
|
.then(res => {
|
|
if (!res.data) return 0;
|
|
|
|
this.balanceDueTotal = res.data.reduce(
|
|
(accumulator, currentValue) => {
|
|
return accumulator + (currentValue['amount'] || 0);
|
|
}, 0);
|
|
});
|
|
}
|
|
|
|
chipColor(date) {
|
|
const day = 24 * 60 * 60 * 1000;
|
|
const today = Date.vnNew();
|
|
today.setHours(0, 0, 0, 0);
|
|
|
|
const observationShipped = new Date(date);
|
|
observationShipped.setHours(0, 0, 0, 0);
|
|
|
|
const difference = today - observationShipped;
|
|
|
|
if (difference > (day * 20))
|
|
return 'alert';
|
|
if (difference > (day * 10))
|
|
return 'warning';
|
|
}
|
|
|
|
onResponse() {
|
|
if (!this.defaulter.observation)
|
|
throw new UserError(`The message can't be empty`);
|
|
|
|
const params = [];
|
|
for (let defaulter of this.checked) {
|
|
params.push({
|
|
text: this.defaulter.observation,
|
|
clientFk: defaulter.clientFk
|
|
});
|
|
}
|
|
|
|
this.$http.post(`ClientObservations`, params) .then(() => {
|
|
this.vnApp.showSuccess(this.$t('Observation saved!'));
|
|
this.sendMail();
|
|
this.$state.reload();
|
|
});
|
|
}
|
|
|
|
sendMail() {
|
|
const params = {
|
|
defaulters: this.checked,
|
|
observation: this.defaulter.observation,
|
|
};
|
|
this.$http.post(`Defaulters/observationEmail`, params);
|
|
}
|
|
|
|
exprBuilder(param, value) {
|
|
switch (param) {
|
|
case 'creditInsurance':
|
|
case 'amount':
|
|
case 'clientFk':
|
|
case 'workerFk':
|
|
case 'countryFk':
|
|
case 'payMethod':
|
|
case 'salesPersonFk':
|
|
return {[`d.${param}`]: value};
|
|
case 'created':
|
|
return {'d.created': {
|
|
between: this.dateRange(value)}
|
|
};
|
|
case 'defaulterSinced':
|
|
return {'d.defaulterSinced': {
|
|
between: this.dateRange(value)}
|
|
};
|
|
}
|
|
}
|
|
|
|
dateRange(value) {
|
|
const minHour = new Date(value);
|
|
minHour.setHours(0, 0, 0, 0);
|
|
const maxHour = new Date(value);
|
|
maxHour.setHours(23, 59, 59, 59);
|
|
|
|
return [minHour, maxHour];
|
|
}
|
|
}
|
|
|
|
ngModule.vnComponent('vnClientDefaulter', {
|
|
template: require('./index.html'),
|
|
controller: Controller
|
|
});
|