Updated unit tests
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
This commit is contained in:
parent
f4ff854a1f
commit
5518fac357
|
@ -23,7 +23,7 @@
|
|||
<vn-button disabled="$ctrl.checked.length === 0"
|
||||
icon="show_chart"
|
||||
ng-click="filters.show($event)"
|
||||
vn-tooltip="Client consumption">
|
||||
vn-tooltip="Campaign consumption">
|
||||
</vn-button>
|
||||
</slot-actions>
|
||||
<slot-table>
|
||||
|
@ -87,7 +87,7 @@
|
|||
<vn-popover vn-id="filters">
|
||||
<div class="vn-pa-lg">
|
||||
<form ng-submit="$ctrl.onSendClientConsumption()">
|
||||
<vn-horizontal><h4>Client consumption</h4></vn-horizontal>
|
||||
<vn-horizontal><h4 translate>Campaign consumption</h4></vn-horizontal>
|
||||
<vn-horizontal>
|
||||
<vn-autocomplete vn-one
|
||||
url="Campaigns/latest"
|
||||
|
@ -119,7 +119,7 @@
|
|||
</vn-date-picker>
|
||||
</vn-horizontal>
|
||||
<vn-horizontal class="vn-mt-lg">
|
||||
<vn-submit label="send"></vn-submit>
|
||||
<vn-submit label="Send"></vn-submit>
|
||||
</vn-horizontal>
|
||||
</form>
|
||||
</div>
|
||||
|
|
|
@ -35,7 +35,6 @@ export default class Controller extends Section {
|
|||
to: null
|
||||
};
|
||||
|
||||
// if (!this.dateParams)
|
||||
this.getUpcomingCampaing();
|
||||
}
|
||||
|
||||
|
@ -56,9 +55,8 @@ export default class Controller extends Section {
|
|||
}
|
||||
|
||||
getUpcomingCampaing() {
|
||||
this.$http.get('Campaigns/upcoming').then(res => {
|
||||
this.campaign.id = res.data.id;
|
||||
});
|
||||
this.$http.get('Campaigns/upcoming')
|
||||
.then(res => this.campaign.id = res.data.id);
|
||||
}
|
||||
|
||||
get campaignSelection() {
|
||||
|
@ -77,14 +75,6 @@ export default class Controller extends Section {
|
|||
}
|
||||
}
|
||||
|
||||
get clientConsumptionParams() {
|
||||
const userParams = this.$.model.userParams;
|
||||
return Object.assign({
|
||||
recipient: this.client.email,
|
||||
recipientId: this.client.id
|
||||
}, userParams);
|
||||
}
|
||||
|
||||
onSendClientConsumption() {
|
||||
const clientIds = this.checked.map(client => client.id);
|
||||
const params = Object.assign({
|
||||
|
@ -93,7 +83,7 @@ export default class Controller extends Section {
|
|||
|
||||
this.$http.post('notify/consumption', params)
|
||||
.then(() => this.$.filters.hide())
|
||||
.then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
|
||||
.then(() => this.vnApp.showSuccess(this.$t('Notifications sent!')));
|
||||
}
|
||||
|
||||
exprBuilder(param, value) {
|
||||
|
|
|
@ -0,0 +1,99 @@
|
|||
import './index';
|
||||
import crudModel from 'core/mocks/crud-model';
|
||||
|
||||
describe('Client notification', () => {
|
||||
describe('Component vnClientNotification', () => {
|
||||
let controller;
|
||||
let $httpBackend;
|
||||
|
||||
beforeEach(ngModule('client'));
|
||||
|
||||
beforeEach(inject(($componentController, _$httpBackend_) => {
|
||||
$httpBackend = _$httpBackend_;
|
||||
const $element = angular.element('<vn-client-notification></vn-client-notification>');
|
||||
controller = $componentController('vnClientNotification', {$element});
|
||||
controller.$.model = crudModel;
|
||||
controller.$.model.data = [
|
||||
{id: 1101},
|
||||
{id: 1102},
|
||||
{id: 1103}
|
||||
];
|
||||
$httpBackend.expect('GET', `Campaigns/upcoming`).respond(200, {id: 1});
|
||||
}));
|
||||
|
||||
describe('checked() getter', () => {
|
||||
it('should return the checked lines', () => {
|
||||
const data = controller.$.model.data;
|
||||
data[1].$checked = true;
|
||||
data[2].$checked = true;
|
||||
|
||||
const checkedRows = controller.checked;
|
||||
|
||||
const firstCheckedRow = checkedRows[0];
|
||||
const secondCheckedRow = checkedRows[1];
|
||||
|
||||
expect(firstCheckedRow.id).toEqual(1102);
|
||||
expect(secondCheckedRow.id).toEqual(1103);
|
||||
});
|
||||
});
|
||||
|
||||
describe('campaignSelection() setter', () => {
|
||||
it('should set the campaign from and to properties', () => {
|
||||
const dated = new Date();
|
||||
controller.campaignSelection = {
|
||||
dated: dated,
|
||||
scopeDays: 14
|
||||
};
|
||||
|
||||
const expectedDateTo = new Date(dated);
|
||||
expectedDateTo.setDate(expectedDateTo.getDate() - 14);
|
||||
|
||||
const campaign = controller.campaign;
|
||||
|
||||
expect(campaign.from).toEqual(expectedDateTo);
|
||||
expect(campaign.to).toEqual(dated);
|
||||
});
|
||||
});
|
||||
|
||||
describe('onSendClientConsumption()', () => {
|
||||
it('should return saved message', () => {
|
||||
jest.spyOn(controller.vnApp, 'showSuccess');
|
||||
|
||||
controller.$.filters = {hide: () => {}};
|
||||
controller.campaign = {
|
||||
id: 1,
|
||||
from: new Date(),
|
||||
to: new Date()
|
||||
};
|
||||
|
||||
const data = controller.$.model.data;
|
||||
data[0].$checked = true;
|
||||
data[1].$checked = true;
|
||||
|
||||
const params = Object.assign({
|
||||
clientIds: [1101, 1102]
|
||||
}, controller.campaign);
|
||||
|
||||
$httpBackend.expect('POST', `notify/consumption`, params).respond(200, params);
|
||||
controller.onSendClientConsumption();
|
||||
$httpBackend.flush();
|
||||
|
||||
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Notifications sent!');
|
||||
});
|
||||
});
|
||||
|
||||
describe('exprBuilder()', () => {
|
||||
it('should search by sales person', () => {
|
||||
let expr = controller.exprBuilder('salesPersonFk', '5');
|
||||
|
||||
expect(expr).toEqual({'salesPersonFk': '5'});
|
||||
});
|
||||
|
||||
it('should search by client social name', () => {
|
||||
let expr = controller.exprBuilder('socialName', '1foo');
|
||||
|
||||
expect(expr).toEqual({'socialName': {like: '%1foo%'}});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
|
@ -0,0 +1,2 @@
|
|||
Campaign consumption: Consumo campaña
|
||||
Send: Enviar
|
|
@ -2,44 +2,57 @@ const db = require('vn-print/core/database');
|
|||
const Email = require('vn-print/core/email');
|
||||
|
||||
module.exports = async function(request, response, next) {
|
||||
const reqArgs = request.body;
|
||||
try {
|
||||
const reqArgs = request.body;
|
||||
|
||||
if (!reqArgs.clientIds)
|
||||
throw new Error('The argument clientIds is required');
|
||||
if (!reqArgs.from)
|
||||
throw new Error('The argument from is required');
|
||||
if (!reqArgs.to)
|
||||
throw new Error('The argument to is required');
|
||||
if (!reqArgs.clientIds)
|
||||
throw new Error('The argument clientIds is required');
|
||||
if (!reqArgs.from)
|
||||
throw new Error('The argument from is required');
|
||||
if (!reqArgs.to)
|
||||
throw new Error('The argument to is required');
|
||||
|
||||
response.status(200).json({
|
||||
message: 'Success'
|
||||
});
|
||||
response.status(200).json({
|
||||
message: 'Success'
|
||||
});
|
||||
|
||||
for (const clientId of reqArgs.clientIds) {
|
||||
const client = await db.findOne(`
|
||||
SELECT
|
||||
c.email,
|
||||
eu.email salesPersonEmail
|
||||
FROM client c
|
||||
JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
|
||||
JOIN ticket t ON t.clientFk = c.id
|
||||
JOIN sale s ON s.ticketFk = t.id
|
||||
JOIN item i ON i.id = s.itemFk
|
||||
JOIN itemType it ON it.id = i.typeFk
|
||||
WHERE c.id = ?
|
||||
AND it.isPackaging = FALSE
|
||||
AND DATE(t.shipped) BETWEEN ? AND ?
|
||||
GROUP BY c.id`, [clientId, reqArgs.from, reqArgs.to]);
|
||||
const clientIds = reqArgs.clientIds;
|
||||
|
||||
if (client) {
|
||||
const args = Object.assign({
|
||||
recipientId: clientId,
|
||||
recipient: client.email,
|
||||
replyTo: client.salesPersonEmail
|
||||
}, response.locals);
|
||||
const clients = await db.rawSql(`
|
||||
SELECT
|
||||
c.id,
|
||||
c.email,
|
||||
eu.email salesPersonEmail
|
||||
FROM client c
|
||||
JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
|
||||
JOIN ticket t ON t.clientFk = c.id
|
||||
JOIN sale s ON s.ticketFk = t.id
|
||||
JOIN item i ON i.id = s.itemFk
|
||||
JOIN itemType it ON it.id = i.typeFk
|
||||
WHERE c.id IN(?)
|
||||
AND it.isPackaging = FALSE
|
||||
AND DATE(t.shipped) BETWEEN ? AND ?
|
||||
GROUP BY c.id`, [clientIds, reqArgs.from, reqArgs.to]);
|
||||
|
||||
const email = new Email('campaign-metrics', args);
|
||||
await email.send();
|
||||
const clientData = new Map();
|
||||
for (const client of clients)
|
||||
clientData.set(client.id, client);
|
||||
|
||||
for (const clientId of reqArgs.clientIds) {
|
||||
const client = clientData.get(clientId);
|
||||
|
||||
if (client) {
|
||||
const args = Object.assign({
|
||||
recipientId: clientId,
|
||||
recipient: client.email,
|
||||
replyTo: client.salesPersonEmail
|
||||
}, response.locals);
|
||||
|
||||
const email = new Email('campaign-metrics', args);
|
||||
await email.send();
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue