Merge branch 'dev' into test
gitea/salix/test This commit looks good
Details
gitea/salix/test This commit looks good
Details
This commit is contained in:
commit
e3e9998243
|
@ -17,10 +17,15 @@ pipeline {
|
|||
steps {
|
||||
script {
|
||||
env.COMPOSE_PROJECT_NAME = "${env.PROJECT_NAME}-${env.BRANCH_NAME}"
|
||||
env.GIT_COMMITTER_EMAIL = sh(
|
||||
script: 'git --no-pager show -s --format="%ae"',
|
||||
returnStdout: true
|
||||
).trim()
|
||||
|
||||
if (!env.GIT_COMMITTER_EMAIL) {
|
||||
env.COMMITTER_EMAIL = sh(
|
||||
script: 'git --no-pager show -s --format="%ae"',
|
||||
returnStdout: true
|
||||
).trim()
|
||||
} else {
|
||||
env.COMMITTER_EMAIL = env.GIT_COMMITTER_EMAIL;
|
||||
}
|
||||
|
||||
switch (env.BRANCH_NAME) {
|
||||
case 'master':
|
||||
|
@ -39,7 +44,7 @@ pipeline {
|
|||
break
|
||||
}
|
||||
}
|
||||
echo "Committer: ${env.GIT_COMMITTER_EMAIL}"
|
||||
sh 'printenv'
|
||||
}
|
||||
}
|
||||
stage('Install') {
|
||||
|
@ -143,7 +148,7 @@ pipeline {
|
|||
}
|
||||
}
|
||||
|
||||
if (!env.GIT_COMMITTER_EMAIL) return
|
||||
if (!env.COMMITTER_EMAIL) return
|
||||
try {
|
||||
mail(
|
||||
to: env.GIT_COMMITTER_EMAIL,
|
||||
|
|
|
@ -19,5 +19,11 @@
|
|||
"expired": {
|
||||
"type": "date"
|
||||
}
|
||||
},
|
||||
|
||||
"scope": {
|
||||
"where" :{
|
||||
"expired": null
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
const app = require('vn-loopback/server/server');
|
||||
|
||||
describe('loopback model Company', () => {
|
||||
it('should check that the company FTH doesnt exists', async() => {
|
||||
let result = await app.models.Company.findOne({where: {code: 'FTH'}});
|
||||
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
});
|
|
@ -262,7 +262,7 @@ export default {
|
|||
itemDiary: {
|
||||
thirdTicketId: 'vn-item-diary vn-tbody > vn-tr:nth-child(3) > vn-td:nth-child(2) > span',
|
||||
firstBalance: 'vn-item-diary vn-tbody > vn-tr:nth-child(1) > vn-td.balance',
|
||||
fifthBalance: 'vn-item-diary vn-tbody > vn-tr.ng-scope.isToday.isIn > vn-td.balance > span',
|
||||
fifthBalance: 'vn-item-diary vn-tbody > vn-tr:nth-child(5) > vn-td.balance',
|
||||
warehouseAutocomplete: 'vn-item-diary vn-autocomplete[field="$ctrl.warehouseFk"]',
|
||||
},
|
||||
ticketSummary: {
|
||||
|
@ -484,12 +484,14 @@ export default {
|
|||
orderByAutocomplete: `vn-autocomplete[label="Order by"]`,
|
||||
},
|
||||
orderBasicData: {
|
||||
clientAutocomplete: `vn-autocomplete[label=Client]`,
|
||||
clientAutocomplete: `vn-autocomplete[label="Client"]`,
|
||||
addressAutocomplete: `vn-autocomplete[label="Address"]`,
|
||||
agencyAutocomplete: `vn-autocomplete[label="Agency"]`,
|
||||
observationInput: `vn-textarea[label="Observation"] textarea`,
|
||||
saveButton: `${components.vnSubmit}`
|
||||
},
|
||||
orderLine: {
|
||||
orderSubtotal: 'vn-order-line > vn-vertical > vn-card > div > vn-vertical > vn-horizontal > div > span',
|
||||
orderSubtotal: 'vn-order-line vn-horizontal.header p:nth-child(1)',
|
||||
firstLineDeleteButton: 'vn-order-line vn-tbody > vn-tr:nth-child(1) vn-icon[icon="delete"]',
|
||||
confirmOrder: 'vn-order-line > vn-vertical > vn-button-bar > vn-button > button',
|
||||
confirmButton: 'vn-order-line > vn-confirm button[response="ACCEPT"]',
|
||||
|
|
|
@ -31,7 +31,7 @@ describe('User config', () => {
|
|||
expect(userLocalBank).toEqual('');
|
||||
expect(userLocalCompany).toEqual('');
|
||||
expect(userWarehouse).toEqual('Warehouse Three');
|
||||
expect(userCompany).toEqual('FTH');
|
||||
expect(userCompany).toEqual('VNH');
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -103,7 +103,7 @@ describe('User config', () => {
|
|||
expect(userLocalBank).toContain('Pay on receipt');
|
||||
expect(userLocalCompany).toContain('VNL');
|
||||
expect(userWarehouse).toEqual('Warehouse Three');
|
||||
expect(userCompany).toEqual('FTH');
|
||||
expect(userCompany).toEqual('VNH');
|
||||
});
|
||||
|
||||
it('should now clear the local settings', async() => {
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
import selectors from '../../helpers/selectors.js';
|
||||
import createNightmare from '../../helpers/nightmare';
|
||||
|
||||
// Bug #808 order.basic-data
|
||||
xdescribe('Order edit basic data path', () => {
|
||||
describe('Order edit basic data path', () => {
|
||||
const nightmare = createNightmare();
|
||||
describe('when confirmed order', () => {
|
||||
beforeAll(() => {
|
||||
|
@ -15,11 +14,12 @@ xdescribe('Order edit basic data path', () => {
|
|||
it('should not be able to change the client', async() => {
|
||||
const result = await nightmare
|
||||
.autocompleteSearch(selectors.orderBasicData.clientAutocomplete, 'Tony Stark')
|
||||
.autocompleteSearch(selectors.orderBasicData.addressAutocomplete, 'Tony Stark')
|
||||
.waitToClick(selectors.orderBasicData.saveButton)
|
||||
.waitForLastSnackbar();
|
||||
|
||||
expect(result).toEqual(`You can't make changes on the basic data of an confirmed order or with rows`);
|
||||
});
|
||||
}, 15000);
|
||||
});
|
||||
|
||||
describe('when order with rows', () => {
|
||||
|
@ -63,6 +63,8 @@ xdescribe('Order edit basic data path', () => {
|
|||
it('should be able to modify all the properties', async() => {
|
||||
const result = await nightmare
|
||||
.autocompleteSearch(selectors.orderBasicData.clientAutocomplete, 'Tony Stark')
|
||||
.autocompleteSearch(selectors.orderBasicData.addressAutocomplete, 'Tony Stark')
|
||||
.autocompleteSearch(selectors.orderBasicData.agencyAutocomplete, 'Silla247')
|
||||
.clearInput(selectors.orderBasicData.observationInput)
|
||||
.write(selectors.orderBasicData.observationInput, 'Observation modified')
|
||||
.waitToClick(selectors.orderBasicData.saveButton)
|
||||
|
@ -79,6 +81,13 @@ xdescribe('Order edit basic data path', () => {
|
|||
expect(result).toEqual('104: Tony Stark');
|
||||
});
|
||||
|
||||
it('should now confirm the agency have been edited', async() => {
|
||||
const result = await nightmare
|
||||
.waitToGetProperty(`${selectors.orderBasicData.agencyAutocomplete} input`, 'value');
|
||||
|
||||
expect(result).toEqual('7: Silla247');
|
||||
});
|
||||
|
||||
it('should now confirm the observations have been edited', async() => {
|
||||
const result = await nightmare
|
||||
.waitToGetProperty(selectors.orderBasicData.observationInput, 'value');
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
import selectors from '../../helpers/selectors.js';
|
||||
import createNightmare from '../../helpers/nightmare';
|
||||
|
||||
describe('Ticket Edit sale path', () => {
|
||||
// #1152 refactor ticket.sale, update price no funciona correctamente.
|
||||
xdescribe('Ticket Edit sale path', () => {
|
||||
const nightmare = createNightmare();
|
||||
|
||||
beforeAll(() => {
|
||||
|
@ -156,8 +157,7 @@ describe('Ticket Edit sale path', () => {
|
|||
it('should update the price', async() => {
|
||||
const result = await nightmare
|
||||
.waitToClick(selectors.ticketSales.firstSalePrice)
|
||||
.write(selectors.ticketSales.firstSalePriceInput, 5)
|
||||
.write('body', '\u000d') // simulates enter
|
||||
.write(selectors.ticketSales.firstSalePriceInput, '5\u000d')
|
||||
.waitForLastSnackbar();
|
||||
|
||||
expect(result).toEqual('Data saved!');
|
||||
|
@ -181,8 +181,8 @@ describe('Ticket Edit sale path', () => {
|
|||
const result = await nightmare
|
||||
.waitToClick(selectors.ticketSales.firstSaleDiscount)
|
||||
.wait('vn-textfield[label="Discount"] > div[class="container selected"]') // a function selects the text after it's loaded
|
||||
.write(selectors.ticketSales.firstSaleDiscountInput, 50)
|
||||
.write('body', '\u000d') // simulates enter
|
||||
.write(selectors.ticketSales.firstSaleDiscountInput, '50\u000d')
|
||||
// .write('body', '\u000d') // simulates enter
|
||||
.waitForLastSnackbar();
|
||||
|
||||
expect(result).toEqual('Data saved!');
|
||||
|
@ -318,7 +318,7 @@ describe('Ticket Edit sale path', () => {
|
|||
it('should go back to the original ticket sales section', async() => {
|
||||
const url = await nightmare
|
||||
.waitToClick(selectors.itemsIndex.goBackToModuleIndexButton)
|
||||
.write(selectors.ticketsIndex.searchTicketInput, 'id:16')
|
||||
.write(selectors.ticketsIndex.searchTicketInput, '16')
|
||||
.waitToClick(selectors.ticketsIndex.searchButton)
|
||||
.waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1)
|
||||
.waitForTextInElement(selectors.ticketsIndex.searchResult, 'address 21')
|
||||
|
@ -488,7 +488,7 @@ describe('Ticket Edit sale path', () => {
|
|||
|
||||
it('should now search for a specific ticket', async() => {
|
||||
const result = await nightmare
|
||||
.write(selectors.ticketsIndex.searchTicketInput, 'id:16')
|
||||
.write(selectors.ticketsIndex.searchTicketInput, '16')
|
||||
.waitToClick(selectors.ticketsIndex.searchButton)
|
||||
.waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1)
|
||||
.countElement(selectors.ticketsIndex.searchResult);
|
||||
|
@ -574,7 +574,7 @@ describe('Ticket Edit sale path', () => {
|
|||
|
||||
it('should once again search for a specific ticket', async() => {
|
||||
const result = await nightmare
|
||||
.write(selectors.ticketsIndex.searchTicketInput, 'id:16')
|
||||
.write(selectors.ticketsIndex.searchTicketInput, '16')
|
||||
.waitToClick(selectors.ticketsIndex.searchButton)
|
||||
.waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1)
|
||||
.countElement(selectors.ticketsIndex.searchResult);
|
||||
|
|
|
@ -50,7 +50,7 @@ describe('Ticket diary path', () => {
|
|||
|
||||
it(`should check the fifth line balance is marked as counter`, async() => {
|
||||
const result = await nightmare
|
||||
.waitToGetProperty(selectors.itemDiary.fifthBalance, 'className');
|
||||
.waitToGetProperty(`${selectors.itemDiary.fifthBalance} > span`, 'className');
|
||||
|
||||
expect(result).toContain('counter');
|
||||
});
|
||||
|
|
|
@ -75,9 +75,9 @@ export default class ArrayModel extends ModelProxy {
|
|||
});
|
||||
}
|
||||
|
||||
data.sort((a, b) => this.sortFunc(a, b, orderComp));
|
||||
data = data.sort((a, b) => this.sortFunc(a, b, orderComp));
|
||||
} else if (typeof order === 'function')
|
||||
data.sort(order);
|
||||
data = data.sort(order);
|
||||
|
||||
this.skip = skip;
|
||||
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
<md-checkbox
|
||||
aria-label="{{::$ctrl.label}}"
|
||||
aria-label="::$ctrl.label"
|
||||
md-indeterminate="$ctrl.isIntermediate"
|
||||
ng-disabled="$ctrl.disabled"
|
||||
ng-disabled="::$ctrl.disabled"
|
||||
ng-checked="$ctrl.isChecked"
|
||||
ng-model="$ctrl.model">
|
||||
<span translate>{{::$ctrl.label}}</span>
|
||||
</md-checkbox>
|
||||
<i class="material-icons"
|
||||
ng-if="$ctrl.hasInfo"
|
||||
vn-tooltip="{{$ctrl.info}}">
|
||||
ng-if="::$ctrl.hasInfo"
|
||||
vn-tooltip="{{::$ctrl.info}}">
|
||||
info_outline
|
||||
</i>
|
|
@ -16,9 +16,7 @@ export default class Controller extends Component {
|
|||
set model(value) {
|
||||
if (value === null) return;
|
||||
|
||||
if (this.model === true)
|
||||
value = false;
|
||||
else if (this.model === false && this.tripleState)
|
||||
if (this.model === false && this.tripleState)
|
||||
value = null;
|
||||
|
||||
this.emit('change', {value});
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
describe('Component vnCheck', () => {
|
||||
let controller;
|
||||
let $element;
|
||||
|
||||
beforeEach(ngModule('vnCore'));
|
||||
|
||||
beforeEach(inject(($compile, $rootScope) => {
|
||||
$element = $compile(`<vn-check></vn-check`)($rootScope);
|
||||
controller = $element.controller('vnCheck');
|
||||
}));
|
||||
|
||||
afterEach(() => {
|
||||
$element.remove();
|
||||
});
|
||||
|
||||
describe('model() setter', () => {
|
||||
it(`should set model value`, () => {
|
||||
controller.model = true;
|
||||
|
||||
expect(controller.model).toEqual(true);
|
||||
});
|
||||
|
||||
it(`should set model value to null if current model value is false and is a triple-state checkbox`, () => {
|
||||
controller._model = false;
|
||||
controller.tripleState = true;
|
||||
controller.model = true;
|
||||
|
||||
expect(controller.model).toEqual(null);
|
||||
});
|
||||
});
|
||||
|
||||
describe('field() setter', () => {
|
||||
it(`should set model value`, () => {
|
||||
controller.field = true;
|
||||
|
||||
expect(controller.field).toEqual(true);
|
||||
});
|
||||
|
||||
it(`should set model value and convert numerical values to boolean values`, () => {
|
||||
controller.field = 1;
|
||||
|
||||
expect(controller.field).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isIntermediate() getter', () => {
|
||||
it(`should return true if intermediate property is truthy`, () => {
|
||||
controller.intermediate = true;
|
||||
|
||||
let result = controller.isIntermediate;
|
||||
|
||||
expect(result).toEqual(true);
|
||||
});
|
||||
|
||||
it(`should return true if is a triple-state checkbox and has null or undefined value`, () => {
|
||||
controller.tripleState = true;
|
||||
controller.model = null;
|
||||
|
||||
let result = controller.isIntermediate;
|
||||
|
||||
expect(result).toEqual(true);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -14,4 +14,8 @@ vn-check {
|
|||
md-checkbox.md-checked .md-icon {
|
||||
background-color: $color-main;
|
||||
}
|
||||
|
||||
md-checkbox {
|
||||
margin-bottom: 0
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
<vn-horizontal>
|
||||
<vn-one>{{::$ctrl.title}}</vn-one>
|
||||
<vn-one
|
||||
title="{{::$ctrl.title}}">
|
||||
{{::$ctrl.title}}
|
||||
</vn-one>
|
||||
<vn-auto>
|
||||
<section
|
||||
class="inline-tag ellipsize"
|
||||
ng-class="::{empty: !fetchedTag.value}"
|
||||
ng-repeat="fetchedTag in $ctrl.tags track by $index"
|
||||
vn-tooltip="{{::fetchedTag.name}}: {{::fetchedTag.value}}">
|
||||
ng-repeat="fetchedTag in $ctrl.tags track by $index"
|
||||
title="{{::fetchedTag.name}}: {{::fetchedTag.value}}">
|
||||
{{::fetchedTag.value}}
|
||||
</section>
|
||||
</vn-auto>
|
||||
|
|
|
@ -8,23 +8,37 @@ export default class Controller {
|
|||
this.hasInfo = Boolean($attrs.info);
|
||||
this.info = $attrs.info || null;
|
||||
}
|
||||
|
||||
set label(value) {
|
||||
let label = this.element.querySelector('vn-label');
|
||||
label.textContent = this._.instant(value);
|
||||
this._label = value;
|
||||
}
|
||||
|
||||
get label() {
|
||||
return this._label;
|
||||
}
|
||||
|
||||
set value(value) {
|
||||
let span = this.element.querySelector('span');
|
||||
span.title = value;
|
||||
span.textContent = value ? value : '-';
|
||||
this._value = value;
|
||||
}
|
||||
|
||||
get value() {
|
||||
return this._value;
|
||||
}
|
||||
|
||||
get title() {
|
||||
return this._title;
|
||||
}
|
||||
|
||||
set title(value) {
|
||||
let span = this.element.querySelector('span');
|
||||
span.title = value;
|
||||
this._title = value;
|
||||
}
|
||||
}
|
||||
Controller.$inject = ['$element', '$translate', '$attrs'];
|
||||
|
||||
|
@ -32,6 +46,7 @@ ngModule.component('vnLabelValue', {
|
|||
controller: Controller,
|
||||
template: require('./label-value.html'),
|
||||
bindings: {
|
||||
title: '@?',
|
||||
label: '@',
|
||||
value: '@'
|
||||
}
|
||||
|
|
|
@ -77,9 +77,6 @@
|
|||
</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
<vn-empty-rows ng-if="$ctrl.model.data.length === 0" translate>
|
||||
No results
|
||||
</vn-empty-rows>
|
||||
</vn-table>
|
||||
</vn-vertical>
|
||||
<vn-pagination model="$ctrl.model"></vn-pagination>
|
||||
|
|
|
@ -155,7 +155,6 @@ vn-table {
|
|||
padding: 1.5em;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
color: $color-font-secondary;
|
||||
}
|
||||
}
|
||||
vn-autocomplete {
|
||||
|
|
|
@ -66,7 +66,14 @@ export default class Treeview extends Component {
|
|||
});
|
||||
}
|
||||
|
||||
item.childs = newData.sort((a, b) => b.isIncluded - a.isIncluded);
|
||||
item.childs = newData.sort((a, b) => {
|
||||
let priority = (b.isIncluded - a.isIncluded) - 1;
|
||||
|
||||
if (b.name > a.name)
|
||||
priority++;
|
||||
|
||||
return priority;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -32,12 +32,12 @@ vn-treeview {
|
|||
background-color: $color-hover-cd
|
||||
}
|
||||
|
||||
li.expanded .actions > vn-icon[icon="keyboard_arrow_down"] {
|
||||
li.expanded > vn-horizontal > .actions > vn-icon[icon="keyboard_arrow_down"] {
|
||||
transition: all 0.2s;
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
li.collapsed .actions > vn-icon[icon="keyboard_arrow_down"] {
|
||||
li.collapsed > vn-horizontal > .actions > vn-icon[icon="keyboard_arrow_down"] {
|
||||
transition: all 0.2s;
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ export function directive($http, $compile, vnApp, $translate) {
|
|||
headerList.forEach(header => {
|
||||
let id = header.getAttribute('th-id') || header.getAttribute('field');
|
||||
ids.push(id);
|
||||
titles[id] = header.innerText || id;
|
||||
titles[id] = header.innerText || id.charAt(0).toUpperCase() + id.slice(1);
|
||||
});
|
||||
|
||||
$scope.fields = ids;
|
||||
|
|
|
@ -19,7 +19,7 @@ input[type=reset]::-moz-focus-inner {
|
|||
user-select: none;
|
||||
}
|
||||
|
||||
a , .link{
|
||||
a, .link{
|
||||
color: $color-font-link;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
@ -153,7 +153,7 @@ a.vn-list-item {
|
|||
}
|
||||
.vn-list-item {
|
||||
padding: $pad-medium;
|
||||
border-bottom: $border-thin solid $color-spacer-light;
|
||||
border-bottom: $border-thin solid $color-spacer;
|
||||
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
|
@ -184,7 +184,6 @@ vn-empty-rows.vn-list-item {
|
|||
text-align: center;
|
||||
padding: 1.5em;
|
||||
box-sizing: border-box;
|
||||
color: $color-font-secondary;
|
||||
}
|
||||
|
||||
/** START - FORM ELEMENTS DISABLED **/
|
||||
|
|
|
@ -32,6 +32,7 @@ $color-font: #222222;
|
|||
$color-font-secondary: #9b9b9b;
|
||||
$color-font-dark: white;
|
||||
$color-font-bg: rgba(0, 0, 0, .7);
|
||||
$color-font-link: #005a9a;
|
||||
$color-active: #3d3d3d;
|
||||
$color-active-font: white;
|
||||
$color-bg-panel: white;
|
||||
|
@ -40,6 +41,7 @@ $color-secondary: #ccc;
|
|||
$color-success: #a3d131;
|
||||
$color-notice: #32b1ce;
|
||||
$color-alert: #f42121;
|
||||
|
||||
$color-spacer: rgba(0, 0, 0, .3);
|
||||
$color-spacer-light: rgba(0, 0, 0, .12);
|
||||
$color-input-underline: rgba(0, 0, 0, .12);
|
||||
|
@ -49,7 +51,6 @@ $color-hover-cd: rgba(0, 0, 0, .1);
|
|||
$color-hover-dc: .7;
|
||||
$color-disabled: .6;
|
||||
|
||||
$color-font-link: darken($color-main, 10%);
|
||||
$color-main-medium: lighten($color-main, 20%);
|
||||
$color-main-light: lighten($color-main, 35%);
|
||||
$color-success-medium: lighten($color-success, 20%);
|
||||
|
@ -68,6 +69,7 @@ $color-font: white;
|
|||
$color-font-secondary: #777;
|
||||
$color-font-dark: white;
|
||||
$color-font-bg: rgba(0, 0, 0, .8);
|
||||
$color-font-link: #005a9a;
|
||||
$color-active: #666;
|
||||
$color-active-font: white;
|
||||
$color-bg-panel: #3c3b3b;
|
||||
|
|
|
@ -58,7 +58,7 @@ function backWatch(done) {
|
|||
|
||||
nodemon({
|
||||
exec: commands.join(' && '),
|
||||
ext: 'js html css',
|
||||
ext: 'js html css json',
|
||||
args: ['backOnly'],
|
||||
watch: backSources,
|
||||
done: done
|
||||
|
|
|
@ -36,5 +36,6 @@
|
|||
"The warehouse can't be repeated": "The warehouse can't be repeated",
|
||||
"Barcode must be unique": "Barcode must be unique",
|
||||
"You don't have enough privileges to do that": "You don't have enough privileges to do that",
|
||||
"You can't create a ticket for a frozen client": "You can't create a ticket for a frozen client"
|
||||
"You can't create a ticket for a frozen client": "You can't create a ticket for a frozen client",
|
||||
"can't be blank": "can't be blank"
|
||||
}
|
|
@ -36,8 +36,6 @@ module.exports = Self => {
|
|||
let conn = Self.dataSource.connector;
|
||||
let stmts = [];
|
||||
|
||||
let geo = await Self.findById(parentFk);
|
||||
|
||||
stmts.push(`DROP TEMPORARY TABLE IF EXISTS tmp.checkedChilds`);
|
||||
stmts.push(new ParameterizedSQL(
|
||||
`CREATE TEMPORARY TABLE tmp.checkedChilds (
|
||||
|
@ -77,7 +75,9 @@ module.exports = Self => {
|
|||
zg.sons,
|
||||
IF(ch.id = zg.id, isIncluded, null) isIncluded
|
||||
FROM zoneGeo zg
|
||||
JOIN tmp.checkedChilds ch ON zg.lft <= ch.lft AND zg.rgt >= ch.rgt
|
||||
JOIN tmp.checkedChilds ch
|
||||
ON zg.lft <= ch.lft AND zg.rgt >= ch.rgt
|
||||
AND zg.depth > 0
|
||||
UNION ALL
|
||||
SELECT
|
||||
child.id,
|
||||
|
@ -105,12 +105,26 @@ module.exports = Self => {
|
|||
const result = await Self.rawStmt(sql);
|
||||
const nodes = result[resultIndex];
|
||||
|
||||
if (nodes.length == 0)
|
||||
return nodes;
|
||||
|
||||
// Get parent nodes
|
||||
const minorDepth = nodes.reduce((a, b) => {
|
||||
return b < a ? b : a;
|
||||
}).depth;
|
||||
|
||||
const parentNodes = nodes.filter(element => {
|
||||
return element.depth === geo.depth + 1;
|
||||
return element.depth === minorDepth;
|
||||
});
|
||||
|
||||
const sortedLeaves = parentNodes.sort((a, b) => b.isIncluded - a.isIncluded);
|
||||
const sortedLeaves = parentNodes.sort((a, b) => {
|
||||
let priority = (b.isIncluded - a.isIncluded) - 1;
|
||||
|
||||
if (b.name > a.name)
|
||||
priority++;
|
||||
|
||||
return priority;
|
||||
});
|
||||
const leaves = Object.assign([], sortedLeaves);
|
||||
|
||||
nestLeaves(leaves);
|
||||
|
|
|
@ -89,12 +89,33 @@ module.exports = Self => {
|
|||
filter = {
|
||||
where: {claimFk: id},
|
||||
include: [
|
||||
{relation: 'claimResponsible'},
|
||||
{relation: 'worker'},
|
||||
{relation: 'claimDestination'},
|
||||
{relation: 'claimReason'},
|
||||
{relation: 'claimResult'},
|
||||
{relation: 'claimRedelivery'}
|
||||
{
|
||||
relation: 'claimResponsible'
|
||||
},
|
||||
{
|
||||
relation: 'worker',
|
||||
scope: {
|
||||
fields: ['userFk'],
|
||||
include: {
|
||||
relation: 'user',
|
||||
scope: {
|
||||
fields: ['nickname']
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
relation: 'claimDestination'
|
||||
},
|
||||
{
|
||||
relation: 'claimReason'
|
||||
},
|
||||
{
|
||||
relation: 'claimResult'
|
||||
},
|
||||
{
|
||||
relation: 'claimRedelivery'
|
||||
}
|
||||
]
|
||||
};
|
||||
promises.push(Self.app.models.ClaimDevelopment.find(filter));
|
||||
|
|
|
@ -37,12 +37,18 @@
|
|||
ui-sref="claim.card.summary({id: claim.id})">
|
||||
<vn-td number>{{::claim.id}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span class="link" ng-click="$ctrl.showDescriptor($event, claim.client.id)">
|
||||
<span class="link" ng-click="$ctrl.showClientDescriptor($event, claim.client.id)">
|
||||
{{::claim.client.name}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td center>{{::claim.created | date:'dd/MM/yyyy'}}</vn-td>
|
||||
<vn-td expand>{{::claim.worker.user.nickname}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, claim.worker.user.id)">
|
||||
{{::claim.worker.user.nickname}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td>
|
||||
<span class="chip {{::$ctrl.stateColor(claim)}}">
|
||||
{{::claim.claimState.description}}
|
||||
|
@ -57,17 +63,15 @@
|
|||
</vn-td>
|
||||
</a>
|
||||
</vn-tbody>
|
||||
<vn-empty-rows ng-if="model.data.length === 0" translate>
|
||||
No results
|
||||
</vn-empty-rows>
|
||||
<vn-empty-rows ng-if="model.data === null" translate>
|
||||
Enter a new search
|
||||
</vn-empty-rows>
|
||||
</vn-table>
|
||||
</vn-card>
|
||||
<vn-pagination model="model"></vn-pagination>
|
||||
</div>
|
||||
<vn-client-descriptor-popover vn-id="descriptor"></vn-client-descriptor-popover>
|
||||
<vn-client-descriptor-popover vn-id="clientDescriptor"></vn-client-descriptor-popover>
|
||||
<vn-worker-descriptor-popover
|
||||
vn-id="workerDescriptor"
|
||||
user-id="$ctrl.selectedWorker">
|
||||
</vn-worker-descriptor-popover>
|
||||
<vn-dialog class="dialog-summary"
|
||||
vn-id="dialog-summary-claim">
|
||||
<tpl-body>
|
||||
|
|
|
@ -65,14 +65,22 @@ export default class Controller {
|
|||
}
|
||||
}
|
||||
|
||||
showDescriptor(event, clientFk) {
|
||||
this.$.descriptor.clientFk = clientFk;
|
||||
this.$.descriptor.parent = event.target;
|
||||
this.$.descriptor.show();
|
||||
showClientDescriptor(event, clientFk) {
|
||||
this.$.clientDescriptor.clientFk = clientFk;
|
||||
this.$.clientDescriptor.parent = event.target;
|
||||
this.$.clientDescriptor.show();
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
}
|
||||
|
||||
showWorkerDescriptor(event, userId) {
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
this.selectedWorker = userId;
|
||||
this.$.workerDescriptor.parent = event.target;
|
||||
this.$.workerDescriptor.show();
|
||||
}
|
||||
|
||||
preview(event, claim) {
|
||||
this.claimSelected = claim;
|
||||
this.$.dialogSummaryClaim.show();
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
"name": "Claims",
|
||||
"icon": "icon-claims",
|
||||
"validations": true,
|
||||
"dependencies": ["item", "client"],
|
||||
"dependencies": ["worker", "item", "client"],
|
||||
"menu": [
|
||||
{"state": "claim.card.basicData", "icon": "settings"},
|
||||
{"state": "claim.card.detail", "icon": "icon-details"},
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
<vn-tr ng-repeat="saleClaimed in $ctrl.summary.salesClaimed">
|
||||
<vn-td number>
|
||||
<span
|
||||
ng-click="$ctrl.showDescriptor($event, saleClaimed.sale.itemFk)"
|
||||
ng-click="$ctrl.showItemDescriptor($event, saleClaimed.sale.itemFk)"
|
||||
class="link">
|
||||
{{saleClaimed.sale.itemFk | zeroFill:6}}
|
||||
</span>
|
||||
|
@ -90,7 +90,13 @@
|
|||
<vn-td>{{development.claimReason.description}}</vn-td>
|
||||
<vn-td>{{development.claimResult.description}}</vn-td>
|
||||
<vn-td>{{development.claimResponsible.description}}</vn-td>
|
||||
<vn-td>{{development.worker.firstName}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, development.worker.user.id)">
|
||||
{{::development.worker.user.nickname}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td>{{development.claimRedelivery.description}}</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
|
@ -115,7 +121,7 @@
|
|||
<vn-tr ng-repeat="action in $ctrl.summary.actions">
|
||||
<vn-td number>
|
||||
<span
|
||||
ng-click="$ctrl.showDescriptor($event, action.sale.itemFk)"
|
||||
ng-click="$ctrl.showItemDescriptor($event, action.sale.itemFk)"
|
||||
class="link">
|
||||
{{action.sale.itemFk | zeroFill:6}}
|
||||
</span>
|
||||
|
@ -138,6 +144,10 @@
|
|||
</vn-horizontal>
|
||||
</vn-card>
|
||||
<vn-item-descriptor-popover
|
||||
vn-id="descriptor"
|
||||
vn-id="itemDescriptor"
|
||||
quicklinks="$ctrl.quicklinks">
|
||||
</vn-item-descriptor-popover>
|
||||
</vn-item-descriptor-popover>
|
||||
<vn-worker-descriptor-popover
|
||||
vn-id="workerDescriptor"
|
||||
user-id="$ctrl.selectedWorker">
|
||||
</vn-worker-descriptor-popover>
|
|
@ -1,7 +1,7 @@
|
|||
import ngModule from '../module';
|
||||
|
||||
class Controller {
|
||||
constructor($http, $scope) {
|
||||
constructor($scope, $http) {
|
||||
this.$http = $http;
|
||||
this.$ = $scope;
|
||||
}
|
||||
|
@ -17,8 +17,7 @@ class Controller {
|
|||
this.getSummary();
|
||||
}
|
||||
|
||||
// Item Descriptor
|
||||
showDescriptor(event, itemFk) {
|
||||
showItemDescriptor(event, itemFk) {
|
||||
this.quicklinks = {
|
||||
btnThree: {
|
||||
icon: 'icon-transaction',
|
||||
|
@ -28,13 +27,21 @@ class Controller {
|
|||
tooltip: 'Item diary'
|
||||
}
|
||||
};
|
||||
this.$.descriptor.itemFk = itemFk;
|
||||
this.$.descriptor.parent = event.target;
|
||||
this.$.descriptor.show();
|
||||
this.$.itemDescriptor.itemFk = itemFk;
|
||||
this.$.itemDescriptor.parent = event.target;
|
||||
this.$.itemDescriptor.show();
|
||||
}
|
||||
|
||||
showWorkerDescriptor(event, userId) {
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
this.selectedWorker = userId;
|
||||
this.$.workerDescriptor.parent = event.target;
|
||||
this.$.workerDescriptor.show();
|
||||
}
|
||||
}
|
||||
|
||||
Controller.$inject = ['$http', '$scope'];
|
||||
Controller.$inject = ['$scope', '$http'];
|
||||
|
||||
ngModule.component('vnClaimSummary', {
|
||||
template: require('./index.html'),
|
||||
|
|
|
@ -24,9 +24,6 @@
|
|||
<vn-td>{{::credit.worker.user.nickname}}</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
<vn-empty-rows ng-if="model.data.length === 0" translate>
|
||||
No results
|
||||
</vn-empty-rows>
|
||||
</vn-table>
|
||||
</vn-vertical>
|
||||
<vn-pagination model="model"></vn-pagination>
|
||||
|
|
|
@ -22,14 +22,6 @@
|
|||
ng-repeat="client in clients track by client.id"
|
||||
client="::client">
|
||||
</vn-item-client>
|
||||
<vn-empty-rows class="vn-list-item"
|
||||
ng-if="model.data.length === 0" translate>
|
||||
No results
|
||||
</vn-empty-rows>
|
||||
<vn-empty-rows class="vn-list-item"
|
||||
ng-if="model.data === null" translate>
|
||||
Enter a new search
|
||||
</vn-empty-rows>
|
||||
</vn-card>
|
||||
<vn-pagination model="model"></vn-pagination>
|
||||
</div>
|
||||
|
|
|
@ -28,9 +28,6 @@
|
|||
<vn-td>{{::mandate.finished | date:'dd/MM/yyyy HH:mm' || '-'}}</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
<vn-empty-rows ng-if="model.data.length === 0" translate>
|
||||
No results
|
||||
</vn-empty-rows>
|
||||
</vn-table>
|
||||
</vn-vertical>
|
||||
<vn-pagination model="model"></vn-pagination>
|
||||
|
|
|
@ -36,9 +36,6 @@
|
|||
<vn-td>{{::recovery.period}}</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
<vn-empty-rows ng-if="model.data.length === 0" translate>
|
||||
No results
|
||||
</vn-empty-rows>
|
||||
</vn-table>
|
||||
</vn-vertical>
|
||||
<vn-pagination model="model"></vn-pagination>
|
||||
|
|
|
@ -72,6 +72,7 @@ module.exports = Self => {
|
|||
i.size, i.tag5, i.value5, i.tag6, i.value6,
|
||||
i.tag7, i.value7, i.tag8, i.value8, i.isActive,
|
||||
t.name type, u.nickname userNickname,
|
||||
t.name type, u.id userId,
|
||||
intr.description AS intrastat, i.stems,
|
||||
ori.code AS origin, t.name AS type,
|
||||
ic.name AS category, i.density, tc.description AS taxClass
|
||||
|
|
|
@ -60,16 +60,6 @@ module.exports = Self => {
|
|||
};
|
||||
[item] = await Self.app.models.Item.find(filter);
|
||||
|
||||
// Visible Avaible
|
||||
let query = `
|
||||
CALL vn.getItemVisibleAvailable(?,curdate(),?,?)`;
|
||||
|
||||
let options = [item.id, item.itemType().warehouseFk, false];
|
||||
let [res] = await Self.rawSql(query, options);
|
||||
|
||||
item.available = res[0].available ? res[0].available : '-';
|
||||
item.visible = res[0].visible ? res[0].visible : '-';
|
||||
|
||||
return item;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
module.exports = Self => {
|
||||
Self.remoteMethod('getVisibleAvailable', {
|
||||
description: 'Returns visible and available for params',
|
||||
accessType: '',
|
||||
accepts: [
|
||||
{
|
||||
arg: 'id',
|
||||
type: 'Number',
|
||||
required: true,
|
||||
},
|
||||
{
|
||||
arg: 'warehouseFk',
|
||||
type: 'Number',
|
||||
required: true,
|
||||
}],
|
||||
returns: {
|
||||
type: ['object'],
|
||||
root: true
|
||||
},
|
||||
http: {
|
||||
path: `/:id/getVisibleAvailable`,
|
||||
verb: 'GET'
|
||||
}
|
||||
});
|
||||
|
||||
Self.getVisibleAvailable = async(itemFk, warehouseFk) => {
|
||||
let query = `
|
||||
CALL vn.getItemVisibleAvailable(?,curdate(),?,?)`;
|
||||
|
||||
let options = [itemFk, warehouseFk, false];
|
||||
[res] = await Self.rawSql(query, options);
|
||||
|
||||
return {
|
||||
available: res[0].available,
|
||||
visible: res[0].visible};
|
||||
};
|
||||
};
|
|
@ -28,7 +28,7 @@ module.exports = Self => {
|
|||
}
|
||||
});
|
||||
|
||||
Self.regularize = async (ctx, itemFk, quantity, warehouseFk) => {
|
||||
Self.regularize = async(ctx, itemFk, quantity, warehouseFk) => {
|
||||
const userId = ctx.req.accessToken.userId;
|
||||
const models = Self.app.models;
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ module.exports = Self => {
|
|||
require('../methods/item/getSummary')(Self);
|
||||
require('../methods/item/getCard')(Self);
|
||||
require('../methods/item/regularize')(Self);
|
||||
require('../methods/item/getVisibleAvailable')(Self);
|
||||
require('../methods/item/new')(Self);
|
||||
|
||||
Self.validatesPresenceOf('originFk', {message: 'Cannot be blank'});
|
||||
|
|
|
@ -34,11 +34,11 @@
|
|||
<vn-horizontal class="item-state">
|
||||
<vn-one>
|
||||
<p translate>Visible</p>
|
||||
<p>{{$ctrl.item.visible}}</p>
|
||||
<p>{{$ctrl.visible | dashIfEmpty}}</p>
|
||||
</vn-one>
|
||||
<vn-one>
|
||||
<p translate>Available</p>
|
||||
<p>{{$ctrl.item.available}}</p>
|
||||
<p>{{$ctrl.available | dashIfEmpty}}</p>
|
||||
</vn-one>
|
||||
</vn-horizontal>
|
||||
</div>
|
||||
|
|
|
@ -25,7 +25,6 @@ class Controller {
|
|||
if (value)
|
||||
this._warehouseFk = value;
|
||||
}
|
||||
|
||||
get warehouseFk() {
|
||||
if (!this._warehouseFk)
|
||||
this._warehouseFk = parseInt(window.localStorage.defaultWarehouseFk);
|
||||
|
@ -33,6 +32,31 @@ class Controller {
|
|||
return this._warehouseFk;
|
||||
}
|
||||
|
||||
set item(value) {
|
||||
this._item = value;
|
||||
this.updateStock();
|
||||
}
|
||||
|
||||
get item() {
|
||||
return this._item;
|
||||
}
|
||||
|
||||
updateStock() {
|
||||
this.available = null;
|
||||
this.visible = null;
|
||||
if (this._item && this._item.id) {
|
||||
let options = {
|
||||
params: {
|
||||
warehouseFk: this._warehouseFk
|
||||
}
|
||||
};
|
||||
this.$http.get(`/item/api/Items/${this._item.id}/getVisibleAvailable`, options).then(response => {
|
||||
this.available = response.data.available;
|
||||
this.visible = response.data.visible;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
onMoreChange(callback) {
|
||||
callback.call(this);
|
||||
}
|
||||
|
@ -57,6 +81,7 @@ class Controller {
|
|||
warehouseFk: this.warehouseFk
|
||||
}).then(res => {
|
||||
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
|
||||
this.updateStock();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<vn-thead>
|
||||
<vn-tr>
|
||||
<vn-th>Date</vn-th>
|
||||
<vn-th number order="DESC">Id</vn-th>
|
||||
<vn-th number order="DESC">Ticket/Entry</vn-th>
|
||||
<vn-th>State</vn-th>
|
||||
<vn-th>Reference</vn-th>
|
||||
<vn-th>Client</vn-th>
|
||||
|
@ -35,14 +35,14 @@
|
|||
<vn-tbody>
|
||||
<vn-tr
|
||||
ng-class="::{
|
||||
'isToday': $ctrl.isToday(sale.date),
|
||||
'isIn': sale.in,
|
||||
'balanceNegative': sale.balance < 0}"
|
||||
ng-repeat="sale in sales"
|
||||
vn-repeat-last
|
||||
on-last="$ctrl.scrollToLine()">
|
||||
<vn-td>
|
||||
<span class="chip date">
|
||||
<span class="chip"
|
||||
ng-class="::{warning: $ctrl.isToday(sale.date)}">
|
||||
{{::sale.date | date:'dd/MM/yyyy' }}
|
||||
</span>
|
||||
</vn-td>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
In: Entrada
|
||||
Out: Salida
|
||||
Visible quantity: Cantidad visible
|
||||
Visible quantity: Cantidad visible
|
||||
Ticket/Entry: Ticket/Entrada
|
|
@ -46,12 +46,18 @@
|
|||
ng-click="$ctrl.stopEvent($event)"
|
||||
on-error-src/>
|
||||
</vn-td>
|
||||
<vn-td number>{{::item.id | zeroFill:6}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showItemDescriptor($event, item.id)">
|
||||
{{::item.id | zeroFill:6}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td expand>
|
||||
<vn-fetched-tags
|
||||
max-length="6"
|
||||
item="item"
|
||||
title="item.name">
|
||||
item="::item"
|
||||
title="::item.name">
|
||||
</vn-fetched-tags>
|
||||
</vn-td>
|
||||
<vn-td number>{{::item.stems}}</vn-td>
|
||||
|
@ -59,13 +65,20 @@
|
|||
<vn-td>{{::item.category}}</vn-td>
|
||||
<vn-td>{{::item.intrastat}}</vn-td>
|
||||
<vn-td>{{::item.origin}}</vn-td>
|
||||
<vn-td>{{::item.userNickname}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, item.userId)">
|
||||
{{::item.userNickname}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td>{{::item.density}}</vn-td>
|
||||
<vn-td number>{{::item.density}}</vn-td>
|
||||
<vn-td>{{::item.taxClass}}</vn-td>
|
||||
<vn-td>
|
||||
<vn-check
|
||||
disabled="true"
|
||||
field="item.isActive">
|
||||
field="::item.isActive">
|
||||
</vn-check>
|
||||
</vn-td>
|
||||
<vn-td shrink>
|
||||
|
@ -101,4 +114,10 @@
|
|||
on-response="$ctrl.onCloneAccept(response)"
|
||||
question="Do you want to clone this item?"
|
||||
message="All it's properties will be copied">
|
||||
</vn-confirm>
|
||||
</vn-confirm>
|
||||
<vn-item-descriptor-popover vn-id="itemDescriptor">
|
||||
</vn-item-descriptor-popover>
|
||||
<vn-worker-descriptor-popover
|
||||
vn-id="workerDescriptor"
|
||||
user-id="$ctrl.selectedWorker">
|
||||
</vn-worker-descriptor-popover>
|
|
@ -28,21 +28,36 @@ class Controller {
|
|||
this.$.model.clear();
|
||||
}
|
||||
|
||||
showDescriptor(event, itemFk) {
|
||||
showItemDescriptor(event, itemFk) {
|
||||
if (event.defaultPrevented) return;
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
this.quicklinks = {
|
||||
btnThree: {
|
||||
icon: 'icon-transaction',
|
||||
state: `item.card.diary({
|
||||
id: ${itemFk},
|
||||
warehouseFk: ${this.ticket.warehouseFk},
|
||||
ticketFk: ${this.ticket.id}
|
||||
})`,
|
||||
tooltip: 'Item diary'
|
||||
}
|
||||
};
|
||||
this.$scope.descriptor.itemFk = itemFk;
|
||||
this.$scope.descriptor.parent = event.target;
|
||||
this.$scope.descriptor.show();
|
||||
this.$.itemDescriptor.itemFk = itemFk;
|
||||
this.$.itemDescriptor.parent = event.target;
|
||||
this.$.itemDescriptor.show();
|
||||
}
|
||||
|
||||
|
||||
showWorkerDescriptor(event, userId) {
|
||||
if (event.defaultPrevented) return;
|
||||
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
this.selectedWorker = userId;
|
||||
this.$.workerDescriptor.parent = event.target;
|
||||
this.$.workerDescriptor.show();
|
||||
}
|
||||
|
||||
cloneItem(event, item) {
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
"name": "Items",
|
||||
"icon": "inbox",
|
||||
"validations" : true,
|
||||
"dependencies": ["client", "ticket"],
|
||||
"dependencies": ["worker", "client", "ticket"],
|
||||
"menu": [
|
||||
{"state": "item.card.data", "icon": "settings"},
|
||||
{"state": "item.card.tags", "icon": "icon-tags"},
|
||||
|
|
|
@ -111,6 +111,7 @@ module.exports = Self => {
|
|||
FROM tmp.ticketCalculateItem tci
|
||||
JOIN vn.item i ON i.id = tci.itemFk
|
||||
JOIN vn.itemType it ON it.id = i.typeFk
|
||||
JOIN vn.ink ON ink.id = i.inkFk
|
||||
JOIN vn.worker w on w.id = it.workerFk`);
|
||||
|
||||
// Apply order by tag
|
||||
|
|
|
@ -29,9 +29,10 @@
|
|||
</vn-autocomplete>
|
||||
<vn-autocomplete
|
||||
vn-one
|
||||
fields="['id', 'nickname']"
|
||||
data="address"
|
||||
label="Address"
|
||||
search-function="{or: [{id: $search}, {nickname: {like: '%'+$search+'%'}}]}"
|
||||
search-function="$search"
|
||||
show-field="nickname"
|
||||
value-field="id"
|
||||
field="$ctrl.order.addressFk">
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
initial-data="$ctrl.field"
|
||||
field="$ctrl.field"
|
||||
translate-fields="['name']"
|
||||
order="name"
|
||||
show-field="name"
|
||||
value-field="field"
|
||||
label="Order by">
|
||||
|
|
|
@ -12,7 +12,9 @@ class Controller {
|
|||
{way: 'DESC', name: 'Descendant'},
|
||||
];
|
||||
this.defaultFieldList = [
|
||||
{field: 'relevancy DESC, name', name: 'Name'},
|
||||
{field: 'relevancy DESC, name', name: 'Default'},
|
||||
{field: 'showOrder, price', name: 'Color'},
|
||||
{field: 'name', name: 'Name'},
|
||||
{field: 'price', name: 'Price'}
|
||||
];
|
||||
this.fieldList = [];
|
||||
|
@ -27,20 +29,18 @@ class Controller {
|
|||
*/
|
||||
onDataChange() {
|
||||
const items = this.$scope.model.data;
|
||||
|
||||
const newFilterList = [];
|
||||
if (!items) return;
|
||||
|
||||
this.fieldList = [];
|
||||
this.fieldList = this.fieldList.concat(this.defaultFieldList);
|
||||
|
||||
items.forEach(item => {
|
||||
// Add new tag filters
|
||||
item.tags.forEach(itemTag => {
|
||||
const alreadyAdded = this.fieldList.find(order => {
|
||||
return order.field == itemTag.tagFk;
|
||||
const alreadyAdded = newFilterList.findIndex(filter => {
|
||||
return filter.field == itemTag.tagFk;
|
||||
});
|
||||
|
||||
if (!alreadyAdded) {
|
||||
this.fieldList.push({
|
||||
if (alreadyAdded == -1) {
|
||||
newFilterList.push({
|
||||
name: itemTag.name,
|
||||
field: itemTag.tagFk,
|
||||
isTag: true
|
||||
|
@ -48,6 +48,20 @@ class Controller {
|
|||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Add default filters - Replaces tags with same name
|
||||
this.defaultFieldList.forEach(defaultField => {
|
||||
const index = newFilterList.findIndex(newfield => {
|
||||
return newfield.name == defaultField.name;
|
||||
});
|
||||
|
||||
if (index > -1)
|
||||
newFilterList[index] = defaultField;
|
||||
else
|
||||
newFilterList.push(defaultField);
|
||||
});
|
||||
|
||||
this.fieldList = newFilterList;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,18 +17,17 @@ describe('Order', () => {
|
|||
|
||||
describe('onDataChange()', () => {
|
||||
it(`should return an object with order params`, () => {
|
||||
let expectedList = [
|
||||
{field: 'relevancy DESC, name', name: 'Name'},
|
||||
{field: 'price', name: 'Price'},
|
||||
{field: 4, name: 'Length', isTag: true}
|
||||
];
|
||||
$scope.model.data = [{id: 1, name: 'My Item', tags: [
|
||||
{tagFk: 4, name: 'Length'}
|
||||
{tagFk: 4, name: 'Length'},
|
||||
{tagFk: 5, name: 'Color'}
|
||||
]}];
|
||||
|
||||
let expectedResult = [{field: 'showOrder, price', name: 'Color'}];
|
||||
let unexpectedResult = [{tagFk: 5, name: 'Color'}];
|
||||
controller.onDataChange();
|
||||
|
||||
expect(controller.fieldList).toEqual(expectedList);
|
||||
expect(controller.fieldList.length).toEqual(5);
|
||||
expect(controller.fieldList).toEqual(jasmine.arrayContaining(expectedResult));
|
||||
expect(controller.fieldList).not.toEqual(jasmine.arrayContaining(unexpectedResult));
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -36,11 +36,17 @@
|
|||
ui-sref="order.card.summary({id: {{::order.id}}})">
|
||||
<vn-td number>{{::order.id}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span class="link" ng-click="$ctrl.showDescriptor($event, order.clientFk)">
|
||||
<span class="link" ng-click="$ctrl.showClientDescriptor($event, order.clientFk)">
|
||||
{{::order.client.name}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td>{{::order.client.salesPerson.user.nickname}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, order.client.salesPerson.user.id)">
|
||||
{{::order.client.salesPerson.user.nickname | dashIfEmpty}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td center>
|
||||
<vn-check
|
||||
field="order.isConfirmed"
|
||||
|
@ -60,9 +66,6 @@
|
|||
</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
<vn-empty-rows ng-if="model.data === null" translate>
|
||||
Enter a new search
|
||||
</vn-empty-rows>
|
||||
</vn-table>
|
||||
</vn-card>
|
||||
<vn-pagination model="model"></vn-pagination>
|
||||
|
@ -71,8 +74,12 @@
|
|||
<vn-float-button icon="add"></vn-float-button>
|
||||
</a>
|
||||
<vn-client-descriptor-popover
|
||||
vn-id="descriptor">
|
||||
vn-id="clientDescriptor">
|
||||
</vn-client-descriptor-popover>
|
||||
<vn-worker-descriptor-popover
|
||||
vn-id="workerDescriptor"
|
||||
user-id="$ctrl.selectedWorker">
|
||||
</vn-worker-descriptor-popover>
|
||||
<vn-dialog
|
||||
vn-id="summary"
|
||||
class="dialog-summary">
|
||||
|
|
|
@ -2,7 +2,7 @@ import ngModule from '../module';
|
|||
|
||||
export default class Controller {
|
||||
constructor($scope) {
|
||||
this.$scope = $scope;
|
||||
this.$ = $scope;
|
||||
this.ticketSelected = null;
|
||||
this.filter = {
|
||||
include: [
|
||||
|
@ -51,23 +51,31 @@ export default class Controller {
|
|||
}
|
||||
}
|
||||
|
||||
showDescriptor(event, clientFk) {
|
||||
this.$scope.descriptor.clientFk = clientFk;
|
||||
this.$scope.descriptor.parent = event.target;
|
||||
this.$scope.descriptor.show();
|
||||
showClientDescriptor(event, clientFk) {
|
||||
this.$.clientDescriptor.clientFk = clientFk;
|
||||
this.$.clientDescriptor.parent = event.target;
|
||||
this.$.clientDescriptor.show();
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
}
|
||||
|
||||
showWorkerDescriptor(event, userId) {
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
this.selectedWorker = userId;
|
||||
this.$.workerDescriptor.parent = event.target;
|
||||
this.$.workerDescriptor.show();
|
||||
}
|
||||
|
||||
onDescriptorLoad() {
|
||||
this.$scope.popover.relocate();
|
||||
this.$.popover.relocate();
|
||||
}
|
||||
|
||||
preview(event, order) {
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
this.selectedOrder = order;
|
||||
this.$scope.summary.show();
|
||||
this.$.summary.show();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,17 +5,12 @@
|
|||
<vn-vertical>
|
||||
<vn-card pad-large>
|
||||
<vn-vertical>
|
||||
<vn-horizontal>
|
||||
<div class="totalBox">
|
||||
<vn-label translate>Subtotal</vn-label>
|
||||
<span>{{$ctrl.subtotal | currency: 'EUR':2}}</span>
|
||||
<p>
|
||||
<vn-label translate>VAT</vn-label>
|
||||
<span>{{$ctrl.VAT | currency: 'EUR':2}}</span>
|
||||
</p>
|
||||
<vn-label><strong>Total</strong></vn-label>
|
||||
<strong>{{$ctrl.order.total | currency: 'EUR':2}}</strong>
|
||||
</div>
|
||||
<vn-horizontal class="header">
|
||||
<vn-one class="taxes" ng-if="$ctrl.rows.length > 0">
|
||||
<p><vn-label translate>Subtotal</vn-label> {{$ctrl.subtotal | currency: 'EUR':2}}</p>
|
||||
<p><vn-label translate>VAT</vn-label> {{$ctrl.VAT | currency: 'EUR':2}}</p>
|
||||
<p><vn-label><strong>Total</strong></vn-label> <strong>{{$ctrl.order.total | currency: 'EUR':2}}</strong></p>
|
||||
</vn-one>
|
||||
</vn-horizontal>
|
||||
<vn-table>
|
||||
<vn-thead>
|
||||
|
|
|
@ -6,4 +6,20 @@ vn-order-line{
|
|||
height: 50px;
|
||||
}
|
||||
}
|
||||
.taxes {
|
||||
max-width: 10em;
|
||||
border: .1em solid #CCC;
|
||||
text-align: right;
|
||||
padding: .5em !important;
|
||||
|
||||
|
||||
& > p {
|
||||
font-size: 1.2em;
|
||||
margin: .2em;
|
||||
}
|
||||
}
|
||||
vn-horizontal.header {
|
||||
justify-content: flex-end;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
}
|
|
@ -3,7 +3,7 @@
|
|||
"name": "Orders",
|
||||
"icon": "shopping_cart",
|
||||
"validations": true,
|
||||
"dependencies": ["item", "ticket"],
|
||||
"dependencies": ["worker", "item", "ticket"],
|
||||
"menu": [
|
||||
{"state": "order.card.basicData", "icon": "settings"},
|
||||
{"state": "order.card.catalog", "icon": "shopping_cart"},
|
||||
|
|
|
@ -33,14 +33,15 @@ module.exports = Self => {
|
|||
e.checked,
|
||||
i2.name nameBox,
|
||||
e.itemFk,
|
||||
w.name nameWorker,
|
||||
w.firstName,
|
||||
u.nickname userNickname,
|
||||
u.id userId,
|
||||
e.created
|
||||
FROM
|
||||
vn.expedition e
|
||||
LEFT JOIN vn.item i2 ON i2.id = e.itemFk
|
||||
INNER JOIN vn.item i1 ON i1.id = e.isBox
|
||||
LEFT JOIN vn.worker w ON w.id = e.workerFk
|
||||
JOIN account.user u ON u.id = w.id
|
||||
`);
|
||||
stmt.merge(Self.buildSuffix(filter, 'e'));
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ module.exports = Self => {
|
|||
st.created,
|
||||
st.workerFk,
|
||||
u.nickname userNickname,
|
||||
u.id userId,
|
||||
ste.name AS state
|
||||
FROM saleTracking st
|
||||
JOIN sale s ON s.id = st.saleFk
|
||||
|
|
|
@ -183,7 +183,8 @@ module.exports = Self => {
|
|||
ts.stateFk as stateFk,
|
||||
ts.alertLevel as alertLevel,
|
||||
ts.code as alertLevelCode,
|
||||
u.nickname userNickname
|
||||
u.nickname userNickname,
|
||||
u.id userId
|
||||
FROM ticket t
|
||||
LEFT JOIN address a ON a.id = t.addressFk
|
||||
LEFT JOIN province p ON p.id = a.provinceFk
|
||||
|
|
|
@ -26,9 +26,6 @@
|
|||
<vn-td number>{{ticket.state.state.name}}</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
<vn-empty-rows ng-if="$ctrl.possibleStowaways.length === 0" translate>
|
||||
No results
|
||||
</vn-empty-rows>
|
||||
</vn-table>
|
||||
</vn-horizontal>
|
||||
</tpl-body>
|
||||
|
|
|
@ -25,9 +25,6 @@
|
|||
<vn-td number>{{stowaway.ticket.state.state.name}}</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
<vn-empty-rows ng-if="$ctrl.ticketStowaways.length === 0" translate>
|
||||
No results
|
||||
</vn-empty-rows>
|
||||
</vn-table>
|
||||
</vn-horizontal>
|
||||
</tpl-body>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<vn-td number>
|
||||
<span
|
||||
ng-class="{link: expedition.itemFk}"
|
||||
ng-click="$ctrl.showDescriptor($event, expedition.itemFk)">
|
||||
ng-click="$ctrl.showItemDescriptor($event, expedition.itemFk)">
|
||||
{{expedition.itemFk | zeroFill:6}}
|
||||
</span>
|
||||
</vn-td>
|
||||
|
@ -41,7 +41,14 @@
|
|||
<vn-td>{{::expedition.nameBox}}</vn-td>
|
||||
<vn-td number>{{::expedition.counter}}</vn-td>
|
||||
<vn-td number>{{::expedition.checked}}</vn-td>
|
||||
<vn-td>{{::expedition.firstName}} {{::expedition.nameWorker}}</vn-td>
|
||||
<vn-td>{{::expedition.userNickname}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, expedition.userId)">
|
||||
{{::expedition.userNickname | dashIfEmpty}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td>{{::expedition.created | date:'dd/MM/yyyy HH:mm'}}</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
|
@ -51,9 +58,14 @@
|
|||
</vn-card>
|
||||
|
||||
</vn-vertical>
|
||||
<vn-item-descriptor-popover vn-id="descriptor"
|
||||
<vn-item-descriptor-popover
|
||||
vn-id="itemDescriptor"
|
||||
quicklinks="$ctrl.quicklinks">
|
||||
</vn-item-descriptor-popover>
|
||||
<vn-worker-descriptor-popover
|
||||
vn-id="workerDescriptor"
|
||||
user-id="$ctrl.selectedWorker">
|
||||
</vn-worker-descriptor-popover>
|
||||
<vn-confirm
|
||||
vn-id="delete-expedition"
|
||||
on-response="$ctrl.returnDialog(response)"
|
||||
|
|
|
@ -2,25 +2,25 @@ import ngModule from '../module';
|
|||
|
||||
class Controller {
|
||||
constructor($scope, $stateParams, $http) {
|
||||
this.$scope = $scope;
|
||||
this.$ = $scope;
|
||||
this.$stateParams = $stateParams;
|
||||
this.$http = $http;
|
||||
}
|
||||
|
||||
deleteExpedition(expedition) {
|
||||
this.expeditionId = expedition.id;
|
||||
this.$scope.deleteExpedition.show();
|
||||
this.$.deleteExpedition.show();
|
||||
}
|
||||
|
||||
returnDialog(response) {
|
||||
if (response === 'ACCEPT') {
|
||||
this.$http.delete(`/ticket/api/Expeditions/${this.expeditionId}`).then(
|
||||
() => this.$scope.model.refresh()
|
||||
() => this.$.model.refresh()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
showDescriptor(event, itemFk) {
|
||||
showItemDescriptor(event, itemFk) {
|
||||
if (!itemFk) return;
|
||||
this.quicklinks = {
|
||||
btnThree: {
|
||||
|
@ -33,13 +33,21 @@ class Controller {
|
|||
tooltip: 'Item diary',
|
||||
},
|
||||
};
|
||||
this.$scope.descriptor.itemFk = itemFk;
|
||||
this.$scope.descriptor.parent = event.target;
|
||||
this.$scope.descriptor.show();
|
||||
this.$.itemDescriptor.itemFk = itemFk;
|
||||
this.$.itemDescriptor.parent = event.target;
|
||||
this.$.itemDescriptor.show();
|
||||
}
|
||||
|
||||
showWorkerDescriptor(event, userId) {
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
this.selectedWorker = userId;
|
||||
this.$.workerDescriptor.parent = event.target;
|
||||
this.$.workerDescriptor.show();
|
||||
}
|
||||
|
||||
onDescriptorLoad() {
|
||||
this.$scope.popover.relocate();
|
||||
this.$.popover.relocate();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -59,7 +59,13 @@
|
|||
</vn-icon>
|
||||
</vn-td>
|
||||
<vn-td number>{{::ticket.id}}</vn-td>
|
||||
<vn-td>{{::ticket.userNickname | dashIfEmpty}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, ticket.userId)">
|
||||
{{::ticket.userNickname | dashIfEmpty}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td>
|
||||
<span class="chip {{$ctrl.compareDate(ticket.shipped)}}">
|
||||
{{::ticket.shipped | dateTime: 'dd/MM/yyyy'}}
|
||||
|
@ -69,7 +75,7 @@
|
|||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showDescriptor($event, ticket.clientFk)">
|
||||
ng-click="$ctrl.showClientDescriptor($event, ticket.clientFk)">
|
||||
{{::ticket.nickname}}
|
||||
</span>
|
||||
</vn-td>
|
||||
|
@ -110,5 +116,9 @@
|
|||
<vn-ticket-summary ticket="$ctrl.selectedTicket"></vn-ticket-summary>
|
||||
</tpl-body>
|
||||
</vn-dialog>
|
||||
<vn-client-descriptor-popover vn-id="descriptor">
|
||||
</vn-client-descriptor-popover>
|
||||
<vn-client-descriptor-popover vn-id="clientDescriptor">
|
||||
</vn-client-descriptor-popover>
|
||||
<vn-worker-descriptor-popover
|
||||
vn-id="workerDescriptor"
|
||||
user-id="$ctrl.selectedWorker">
|
||||
</vn-worker-descriptor-popover>
|
|
@ -88,12 +88,20 @@ export default class Controller {
|
|||
return 'alert';
|
||||
}
|
||||
|
||||
showDescriptor(event, clientFk) {
|
||||
showClientDescriptor(event, clientFk) {
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
this.$.descriptor.clientFk = clientFk;
|
||||
this.$.descriptor.parent = event.target;
|
||||
this.$.descriptor.show();
|
||||
this.$.clientDescriptor.clientFk = clientFk;
|
||||
this.$.clientDescriptor.parent = event.target;
|
||||
this.$.clientDescriptor.show();
|
||||
}
|
||||
|
||||
showWorkerDescriptor(event, userId) {
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
this.selectedWorker = userId;
|
||||
this.$.workerDescriptor.parent = event.target;
|
||||
this.$.workerDescriptor.show();
|
||||
}
|
||||
|
||||
preview(event, ticket) {
|
||||
|
|
|
@ -14,12 +14,13 @@ describe('Component vnTicketIndex', () => {
|
|||
}];
|
||||
|
||||
beforeEach(() => {
|
||||
ngModule('worker');
|
||||
ngModule('client');
|
||||
ngModule('item');
|
||||
ngModule('ticket');
|
||||
});
|
||||
|
||||
beforeEach(inject(($compile, $rootScope, $httpBackend, _$window_) => {
|
||||
beforeEach(inject(($compile, $rootScope, _$window_) => {
|
||||
$window = _$window_;
|
||||
$element = $compile('<vn-ticket-index></vn-ticket-index>')($rootScope);
|
||||
controller = $element.controller('vnTicketIndex');
|
||||
|
@ -54,18 +55,18 @@ describe('Component vnTicketIndex', () => {
|
|||
});
|
||||
});
|
||||
|
||||
describe('showDescriptor()', () => {
|
||||
it('should show the descriptor popover', () => {
|
||||
spyOn(controller.$.descriptor, 'show');
|
||||
describe('showClientDescriptor()', () => {
|
||||
it('should show the client descriptor popover', () => {
|
||||
spyOn(controller.$.clientDescriptor, 'show');
|
||||
|
||||
let event = new MouseEvent('click', {
|
||||
view: $window,
|
||||
bubbles: true,
|
||||
cancelable: true
|
||||
});
|
||||
controller.showDescriptor(event, tickets[0].clientFk);
|
||||
controller.showClientDescriptor(event, tickets[0].clientFk);
|
||||
|
||||
expect(controller.$.descriptor.show).toHaveBeenCalledWith();
|
||||
expect(controller.$.clientDescriptor.show).toHaveBeenCalledWith();
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -35,14 +35,26 @@
|
|||
<vn-td number>{{::request.id}}</vn-td>
|
||||
<vn-td expand>{{::request.description}}</vn-td>
|
||||
<vn-td number>{{::request.created | dateTime: 'dd/MM/yyyy'}}</vn-td>
|
||||
<vn-td>{{::request.requester.user.nickname}}</vn-td>
|
||||
<vn-td>{{::request.atender.user.nickname}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, request.requester.user.id)">
|
||||
{{::request.requester.user.nickname | dashIfEmpty}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, request.atender.user.id)">
|
||||
{{::request.atender.user.nickname | dashIfEmpty}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td number>{{::request.quantity}}</vn-td>
|
||||
<vn-td number>{{::request.price | currency: 'EUR': 2}}</vn-td>
|
||||
<vn-td number>
|
||||
<span
|
||||
ng-show="::request.saleFk"
|
||||
ng-click="$ctrl.showDescriptor($event, request.sale)"
|
||||
ng-click="$ctrl.showItemDescriptor($event, request.sale)"
|
||||
class="link">
|
||||
{{request.saleFk | zeroFill:6}}
|
||||
</span>
|
||||
|
@ -69,9 +81,13 @@
|
|||
</vn-card>
|
||||
</form>
|
||||
<vn-item-descriptor-popover
|
||||
vn-id="descriptor"
|
||||
vn-id="itemDescriptor"
|
||||
quicklinks="$ctrl.quicklinks">
|
||||
</vn-item-descriptor-popover>
|
||||
<vn-worker-descriptor-popover
|
||||
vn-id="workerDescriptor"
|
||||
user-id="$ctrl.selectedWorker">
|
||||
</vn-worker-descriptor-popover>
|
||||
<a ui-sref="ticket.card.request.create"
|
||||
vn-tooltip="New request"
|
||||
vn-bind="+"
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import ngModule from '../../module';
|
||||
|
||||
class Controller {
|
||||
constructor($stateParams, $scope) {
|
||||
constructor($scope, $stateParams) {
|
||||
this.$stateParams = $stateParams;
|
||||
this.$scope = $scope;
|
||||
this.$ = $scope;
|
||||
this.filter = {
|
||||
include: [
|
||||
{
|
||||
|
@ -36,15 +36,15 @@ class Controller {
|
|||
}
|
||||
|
||||
removeLine(index) {
|
||||
this.$scope.model.remove(index);
|
||||
this.$scope.watcher.check();
|
||||
this.$scope.model.save().then(() => {
|
||||
this.$scope.watcher.notifySaved();
|
||||
this.$scope.watcher.updateOriginalData();
|
||||
this.$.model.remove(index);
|
||||
this.$.watcher.check();
|
||||
this.$.model.save().then(() => {
|
||||
this.$.watcher.notifySaved();
|
||||
this.$.watcher.updateOriginalData();
|
||||
});
|
||||
}
|
||||
// Item Descriptor
|
||||
showDescriptor(event, sale) {
|
||||
|
||||
showItemDescriptor(event, sale) {
|
||||
this.quicklinks = {
|
||||
btnThree: {
|
||||
icon: 'icon-transaction',
|
||||
|
@ -55,13 +55,21 @@ class Controller {
|
|||
tooltip: 'Item diary'
|
||||
}
|
||||
};
|
||||
this.$scope.descriptor.itemFk = sale.itemFk;
|
||||
this.$scope.descriptor.parent = event.target;
|
||||
this.$scope.descriptor.show();
|
||||
this.$.itemDescriptor.itemFk = sale.itemFk;
|
||||
this.$.itemDescriptor.parent = event.target;
|
||||
this.$.itemDescriptor.show();
|
||||
}
|
||||
|
||||
showWorkerDescriptor(event, userId) {
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
this.selectedWorker = userId;
|
||||
this.$.workerDescriptor.parent = event.target;
|
||||
this.$.workerDescriptor.show();
|
||||
}
|
||||
}
|
||||
|
||||
Controller.$inject = ['$stateParams', '$scope'];
|
||||
Controller.$inject = ['$scope', '$stateParams'];
|
||||
|
||||
ngModule.component('vnTicketRequestIndex', {
|
||||
template: require('./index.html'),
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
"name": "Tickets",
|
||||
"icon": "icon-ticket",
|
||||
"validations": true,
|
||||
"dependencies": ["item", "client"],
|
||||
"dependencies": ["worker", "item", "client"],
|
||||
"menu": [
|
||||
{"state": "ticket.card.data.stepOne", "icon": "settings"},
|
||||
{"state": "ticket.card.sale", "icon": "icon-lines"},
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
</vn-td>
|
||||
<vn-td number>
|
||||
<span
|
||||
ng-click="$ctrl.showDescriptor($event, sale.itemFk)"
|
||||
ng-click="$ctrl.showItemDescriptor($event, sale.itemFk)"
|
||||
class="link">
|
||||
{{sale.itemFk | zeroFill:6}}
|
||||
</span>
|
||||
|
@ -40,9 +40,12 @@
|
|||
<vn-td><vn-fetched-tags max-length="6" item="sale.item"/></vn-td>
|
||||
<vn-td>{{::sale.quantity}}</vn-td>
|
||||
<vn-td>{{::sale.originalQuantity}}</vn-td>
|
||||
<vn-td title="{{::sale.firstName}} {{::sale.name}}"
|
||||
class="ellipsize" style="max-width: 5em">
|
||||
{{::sale.userNickname}}
|
||||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, sale.userId)">
|
||||
{{::sale.userNickname | dashIfEmpty}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td>{{::sale.state}}</vn-td>
|
||||
<vn-td>{{::sale.created | date: 'dd/MM/yyyy HH:mm'}}</vn-td>
|
||||
|
@ -53,6 +56,10 @@
|
|||
<vn-pagination model="model"></vn-pagination>
|
||||
</vn-card>
|
||||
</vn-vertical>
|
||||
<vn-item-descriptor-popover vn-id="descriptor"
|
||||
<vn-item-descriptor-popover vn-id="itemDescriptor"
|
||||
quicklinks="$ctrl.quicklinks">
|
||||
</vn-item-descriptor-popover>
|
||||
</vn-item-descriptor-popover>
|
||||
<vn-worker-descriptor-popover
|
||||
vn-id="workerDescriptor"
|
||||
user-id="$ctrl.selectedWorker">
|
||||
</vn-worker-descriptor-popover>
|
|
@ -2,11 +2,11 @@ import ngModule from '../module';
|
|||
|
||||
class Controller {
|
||||
constructor($scope, $stateParams) {
|
||||
this.$scope = $scope;
|
||||
this.$ = $scope;
|
||||
this.$stateParams = $stateParams;
|
||||
}
|
||||
|
||||
showDescriptor(event, itemFk) {
|
||||
showItemDescriptor(event, itemFk) {
|
||||
this.quicklinks = {
|
||||
btnThree: {
|
||||
icon: 'icon-transaction',
|
||||
|
@ -18,13 +18,21 @@ class Controller {
|
|||
tooltip: 'Item diary',
|
||||
},
|
||||
};
|
||||
this.$scope.descriptor.itemFk = itemFk;
|
||||
this.$scope.descriptor.parent = event.target;
|
||||
this.$scope.descriptor.show();
|
||||
this.$.itemDescriptor.itemFk = itemFk;
|
||||
this.$.itemDescriptor.parent = event.target;
|
||||
this.$.itemDescriptor.show();
|
||||
}
|
||||
|
||||
showWorkerDescriptor(event, userId) {
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
this.selectedWorker = userId;
|
||||
this.$.workerDescriptor.parent = event.target;
|
||||
this.$.workerDescriptor.show();
|
||||
}
|
||||
|
||||
onDescriptorLoad() {
|
||||
this.$scope.popover.relocate();
|
||||
this.$.popover.relocate();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -144,9 +144,6 @@
|
|||
</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
<vn-empty-rows ng-if="$ctrl.sales.length === 0" translate>
|
||||
No results
|
||||
</vn-empty-rows>
|
||||
</vn-table>
|
||||
</vn-vertical>
|
||||
</vn-card>
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
limit="20"
|
||||
data="trackings">
|
||||
</vn-crud-model>
|
||||
|
||||
<vn-vertical compact>
|
||||
<vn-card pad-large>
|
||||
<vn-vertical>
|
||||
|
@ -22,7 +21,13 @@
|
|||
<vn-tbody>
|
||||
<vn-tr ng-repeat="tracking in trackings">
|
||||
<vn-td>{{::tracking.state.name}}</vn-td>
|
||||
<vn-td>{{::tracking.worker.firstName}} {{ticket.worker.name}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
class="link"
|
||||
ng-click="$ctrl.showWorkerDescriptor($event, tracking.worker.user.id)">
|
||||
{{::tracking.worker.user.nickname | dashIfEmpty}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td>{{::tracking.created | date:'dd/MM/yyyy HH:mm'}}</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
|
@ -33,4 +38,8 @@
|
|||
</vn-vertical>
|
||||
<a ui-sref="ticket.card.tracking.edit" vn-bind="+" fixed-bottom-right>
|
||||
<vn-float-button icon="add"></vn-float-button>
|
||||
</a>
|
||||
</a>
|
||||
<vn-worker-descriptor-popover
|
||||
vn-id="workerDescriptor"
|
||||
user-id="$ctrl.selectedWorker">
|
||||
</vn-worker-descriptor-popover>
|
|
@ -1,14 +1,21 @@
|
|||
import ngModule from '../../module';
|
||||
|
||||
class Controller {
|
||||
constructor($stateParams) {
|
||||
constructor($scope, $stateParams) {
|
||||
this.$ = $scope;
|
||||
this.$stateParams = $stateParams;
|
||||
this.filter = {
|
||||
include: [
|
||||
{
|
||||
relation: 'worker',
|
||||
scope: {
|
||||
fields: ['firstName', 'name']
|
||||
fields: ['userFk'],
|
||||
include: {
|
||||
relation: 'user',
|
||||
scope: {
|
||||
fields: ['nickname']
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -20,9 +27,17 @@ class Controller {
|
|||
]
|
||||
};
|
||||
}
|
||||
|
||||
showWorkerDescriptor(event, userId) {
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
this.selectedWorker = userId;
|
||||
this.$.workerDescriptor.parent = event.target;
|
||||
this.$.workerDescriptor.show();
|
||||
}
|
||||
}
|
||||
|
||||
Controller.$inject = ['$stateParams'];
|
||||
Controller.$inject = ['$scope', '$stateParams'];
|
||||
|
||||
ngModule.component('vnTicketTrackingIndex', {
|
||||
template: require('./index.html'),
|
||||
|
|
|
@ -47,9 +47,6 @@
|
|||
<vn-td></vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
<vn-empty-rows ng-if="!model.data || model.data.length === 0" translate>
|
||||
Enter a new search
|
||||
</vn-empty-rows>
|
||||
</vn-table>
|
||||
</vn-card>
|
||||
<vn-pagination model="model"></vn-pagination>
|
||||
|
|
|
@ -25,6 +25,13 @@ class Controller {
|
|||
}, {
|
||||
relation: 'sip',
|
||||
scope: {fields: ['extension']}
|
||||
}, {
|
||||
relation: 'department',
|
||||
scope: {
|
||||
include: {
|
||||
relation: 'department'
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
<vn-popover vn-id="popover">
|
||||
<vn-spinner
|
||||
ng-if="$ctrl.worker == null"
|
||||
style="padding: 1em;"
|
||||
enable="true">
|
||||
</vn-spinner>
|
||||
<vn-worker-descriptor
|
||||
ng-if="$ctrl.worker"
|
||||
worker="$ctrl.worker"
|
||||
quicklinks="$ctrl.quicklinks">
|
||||
</vn-worker-descriptor>
|
||||
</vn-popover>
|
|
@ -0,0 +1,83 @@
|
|||
import ngModule from '../module';
|
||||
import Component from 'core/lib/component';
|
||||
import './style.scss';
|
||||
|
||||
class Controller extends Component {
|
||||
constructor($element, $scope, $http, $timeout, $q) {
|
||||
super($element, $scope);
|
||||
this.$timeout = $timeout;
|
||||
this.$http = $http;
|
||||
this.$q = $q;
|
||||
this.worker = null;
|
||||
}
|
||||
|
||||
set userId(id) {
|
||||
if (id == this._userId) return;
|
||||
|
||||
this._userId = id;
|
||||
this.worker = null;
|
||||
this.loadData();
|
||||
}
|
||||
|
||||
get userId() {
|
||||
return this._userId;
|
||||
}
|
||||
|
||||
set quicklinks(value = {}) {
|
||||
this._quicklinks = Object.assign(value, this._quicklinks);
|
||||
}
|
||||
|
||||
get quicklinks() {
|
||||
return this._quicklinks;
|
||||
}
|
||||
|
||||
show() {
|
||||
this.$.popover.parent = this.parent;
|
||||
this.$.popover.show();
|
||||
}
|
||||
|
||||
loadData() {
|
||||
let query = `api/Workers/findOne`;
|
||||
let filter = {
|
||||
where: {
|
||||
userFk: this._userId
|
||||
},
|
||||
include: [
|
||||
{
|
||||
relation: 'user',
|
||||
scope: {fields: ['name', 'email']}
|
||||
}, {
|
||||
relation: 'client',
|
||||
scope: {fields: ['fi']}
|
||||
}, {
|
||||
relation: 'sip',
|
||||
scope: {fields: ['extension']}
|
||||
}, {
|
||||
relation: 'department',
|
||||
scope: {
|
||||
include: {
|
||||
relation: 'department'
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
this.$http.get(query, {params: {filter}}).then(res => {
|
||||
this.worker = res.data;
|
||||
this.$.$applyAsync(() => {
|
||||
this.$.popover.relocate();
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
Controller.$inject = ['$element', '$scope', '$http', '$timeout', '$q'];
|
||||
|
||||
ngModule.component('vnWorkerDescriptorPopover', {
|
||||
template: require('./index.html'),
|
||||
controller: Controller,
|
||||
bindings: {
|
||||
userId: '<',
|
||||
quicklinks: '<'
|
||||
}
|
||||
});
|
|
@ -0,0 +1,97 @@
|
|||
import './index.js';
|
||||
|
||||
describe('worker Component vnWorkerDescriptorPopover', () => {
|
||||
let $httpBackend;
|
||||
let $httpParamSerializer;
|
||||
let $scope;
|
||||
let controller;
|
||||
let $element;
|
||||
|
||||
beforeEach(ngModule('worker'));
|
||||
|
||||
beforeEach(angular.mock.inject(($componentController, $rootScope, _$httpBackend_, _$httpParamSerializer_) => {
|
||||
$httpBackend = _$httpBackend_;
|
||||
$httpParamSerializer = _$httpParamSerializer_;
|
||||
$element = angular.element(`<div></div>`);
|
||||
$scope = $rootScope.$new();
|
||||
$scope.popover = {relocate: () => {}, show: () => {}};
|
||||
controller = $componentController('vnWorkerDescriptorPopover', {$scope, $element});
|
||||
}));
|
||||
|
||||
describe('workerFk()', () => {
|
||||
it(`should not apply any changes if the received id is the same stored in _workerFk`, () => {
|
||||
controller.worker = 'I exist!';
|
||||
controller._userId = 1;
|
||||
spyOn(controller, 'loadData');
|
||||
controller.userId = 1;
|
||||
|
||||
expect(controller.worker).toEqual('I exist!');
|
||||
expect(controller._userId).toEqual(1);
|
||||
expect(controller.loadData).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it(`should set the received id into _workerFk, set the worker to null and then call loadData()`, () => {
|
||||
controller.worker = `Please don't`;
|
||||
controller._userId = 1;
|
||||
spyOn(controller, 'loadData');
|
||||
controller.userId = 999;
|
||||
|
||||
expect(controller.worker).toBeNull();
|
||||
expect(controller._userId).toEqual(999);
|
||||
expect(controller.loadData).toHaveBeenCalledWith();
|
||||
});
|
||||
});
|
||||
|
||||
describe('show()', () => {
|
||||
it(`should call the show()`, () => {
|
||||
spyOn(controller.$.popover, 'show');
|
||||
controller.show();
|
||||
|
||||
expect(controller.$.popover.show).toHaveBeenCalledWith();
|
||||
});
|
||||
});
|
||||
|
||||
describe('loadData()', () => {
|
||||
it(`should perform a get query to store the worker data into the controller`, () => {
|
||||
controller.userId = 1;
|
||||
controller.canceler = null;
|
||||
let response = {};
|
||||
|
||||
let config = {
|
||||
filter: {
|
||||
where: {
|
||||
userFk: controller.userId
|
||||
},
|
||||
include: [
|
||||
{
|
||||
relation: 'user',
|
||||
scope: {fields: ['name', 'email']}
|
||||
}, {
|
||||
relation: 'client',
|
||||
scope: {fields: ['fi']}
|
||||
}, {
|
||||
relation: 'sip',
|
||||
scope: {fields: ['extension']}
|
||||
}, {
|
||||
relation: 'department',
|
||||
scope: {
|
||||
include: {
|
||||
relation: 'department'
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
let json = $httpParamSerializer(config);
|
||||
|
||||
$httpBackend.whenGET(`api/Workers/findOne?${json}`).respond(response);
|
||||
$httpBackend.expectGET(`api/Workers/findOne?${json}`);
|
||||
controller.loadData();
|
||||
$httpBackend.flush();
|
||||
|
||||
expect(controller.worker).toEqual(response);
|
||||
});
|
||||
});
|
||||
});
|
|
@ -0,0 +1,11 @@
|
|||
vn-ticket-descriptor-popover {
|
||||
vn-ticket-descriptor {
|
||||
display: block;
|
||||
width: 16em;
|
||||
max-height: 28em;
|
||||
|
||||
& > vn-card {
|
||||
margin: 0!important;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -10,12 +10,15 @@
|
|||
</vn-horizontal>
|
||||
<div class="body">
|
||||
<div class="attributes">
|
||||
<h5>{{$ctrl.worker.firstName}} {{$ctrl.worker.name}}</h5>
|
||||
<h5 title="{{$ctrl.worker.firstName}} {{$ctrl.worker.name}}">
|
||||
{{$ctrl.worker.firstName}} {{$ctrl.worker.name}}
|
||||
</h5>
|
||||
<vn-label-value label="Id"
|
||||
value="{{$ctrl.worker.id}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="User"
|
||||
value="{{$ctrl.worker.user.name}}">
|
||||
value="{{$ctrl.worker.user.name}}"
|
||||
title="{{$ctrl.worker.firstName}} {{$ctrl.worker.name}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="Email"
|
||||
value="{{$ctrl.worker.user.email}}">
|
||||
|
@ -24,13 +27,13 @@
|
|||
value="{{$ctrl.worker.client.fi}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="Department"
|
||||
value="{{$ctrl.worker.department.department}}">
|
||||
value="{{$ctrl.worker.department.department.name}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="Phone"
|
||||
value="{{$ctrl.worker.phone}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="Extension"
|
||||
value="{{$ctrl.worker.sip.phone}}">
|
||||
value="{{$ctrl.worker.sip.extension}}">
|
||||
</vn-label-value>
|
||||
</div>
|
||||
<div class="quicklinks">
|
||||
|
|
|
@ -4,5 +4,6 @@ import './index/';
|
|||
import './summary';
|
||||
import './card';
|
||||
import './descriptor';
|
||||
import './descriptor-popover';
|
||||
import './search-panel';
|
||||
import './basic-data';
|
||||
|
|
|
@ -48,10 +48,6 @@
|
|||
</vn-horizontal>
|
||||
</vn-horizontal>
|
||||
</a>
|
||||
<vn-empty-rows class="vn-list-item" style="text-align: center"
|
||||
ng-if="model.data === null" translate>
|
||||
Enter a new search
|
||||
</vn-empty-rows>
|
||||
</vn-card>
|
||||
<vn-pagination model="model"></vn-pagination>
|
||||
</div>
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
Workers: Trabajadores
|
||||
Last name: Apellidos
|
||||
User data: Datos de usuario
|
||||
Fiscal identifier: Identificador fiscal
|
||||
Email: Correo electrónico
|
||||
Fiscal identifier: NIF
|
||||
Email: E-mail
|
||||
Department: Departamento
|
||||
User id: Id de usuario
|
||||
Role: Rol
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
value="{{worker.user.email}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="Department"
|
||||
value="{{worker.department.department}}">
|
||||
value="{{worker.department.department.name}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="Phone"
|
||||
value="{{worker.phone}}">
|
||||
|
@ -25,13 +25,14 @@
|
|||
value="{{worker.userFk}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="User"
|
||||
value="{{worker.user.name}}">
|
||||
value="{{worker.user.name}}"
|
||||
title="{{worker.firstName}} {{worker.name}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="Role"
|
||||
value="{{worker.user.role.name}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="Extension"
|
||||
value="{{worker.sip.phone}}">
|
||||
value="{{worker.sip.extension}}">
|
||||
</vn-label-value>
|
||||
</vn-one>
|
||||
</vn-horizontal>
|
||||
|
|
|
@ -35,6 +35,13 @@ class Controller {
|
|||
}, {
|
||||
relation: 'sip',
|
||||
scope: {fields: ['extension']}
|
||||
}, {
|
||||
relation: 'department',
|
||||
scope: {
|
||||
include: {
|
||||
relation: 'department'
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
|
File diff suppressed because it is too large
Load Diff
22
package.json
22
package.json
|
@ -11,13 +11,13 @@
|
|||
"dependencies": {
|
||||
"compression": "^1.7.3",
|
||||
"fs-extra": "^5.0.0",
|
||||
"helmet": "^3.15.0",
|
||||
"helmet": "^3.15.1",
|
||||
"i18n": "^0.8.3",
|
||||
"loopback": "^3.24.0",
|
||||
"loopback": "^3.25.0",
|
||||
"loopback-boot": "^2.27.1",
|
||||
"loopback-component-explorer": "^6.3.1",
|
||||
"loopback-connector-mysql": "^5.3.1",
|
||||
"loopback-connector-remote": "^3.4.0",
|
||||
"loopback-connector-remote": "^3.4.1",
|
||||
"loopback-context": "^3.4.0",
|
||||
"md5": "^2.2.1",
|
||||
"object-diff": "0.0.4",
|
||||
|
@ -29,16 +29,16 @@
|
|||
"vn-loopback": "file:./loopback"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.2.2",
|
||||
"@babel/core": "^7.3.3",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
||||
"@babel/polyfill": "^7.2.5",
|
||||
"@babel/preset-env": "^7.2.0",
|
||||
"@babel/preset-env": "^7.3.1",
|
||||
"@babel/register": "^7.0.0",
|
||||
"angular-mocks": "^1.7.4",
|
||||
"angular-mocks": "^1.7.7",
|
||||
"babel-loader": "^8.0.5",
|
||||
"css-loader": "^2.1.0",
|
||||
"del": "^2.2.2",
|
||||
"eslint": "^5.12.0",
|
||||
"eslint": "^5.14.0",
|
||||
"eslint-config-google": "^0.11.0",
|
||||
"eslint-plugin-jasmine": "^2.10.1",
|
||||
"fancy-log": "^1.3.2",
|
||||
|
@ -68,16 +68,16 @@
|
|||
"karma-webpack": "^3.0.5",
|
||||
"merge-stream": "^1.0.1",
|
||||
"minimist": "^1.2.0",
|
||||
"mysql2": "^1.6.1",
|
||||
"mysql2": "^1.6.5",
|
||||
"nightmare": "^3.0.1",
|
||||
"node-sass": "^4.9.3",
|
||||
"nodemon": "^1.18.5",
|
||||
"nodemon": "^1.18.10",
|
||||
"plugin-error": "^1.0.1",
|
||||
"raw-loader": "^1.0.0",
|
||||
"sass-loader": "^7.1.0",
|
||||
"style-loader": "^0.23.1",
|
||||
"webpack": "^4.28.3",
|
||||
"webpack-cli": "^3.2.1",
|
||||
"webpack": "^4.29.5",
|
||||
"webpack-cli": "^3.2.3",
|
||||
"webpack-dev-server": "^3.1.14",
|
||||
"webpack-merge": "^4.2.1",
|
||||
"yaml-loader": "^0.5.0"
|
||||
|
|
|
@ -657,8 +657,8 @@ INSERT INTO `vn`.`saleComponent`(`saleFk`, `componentFk`, `value`)
|
|||
|
||||
INSERT INTO `vn`.`saleTracking`(`saleFk`, `isChecked`, `created`, `originalQuantity`, `workerFk`, `actionFk`, `id`, `stateFk`)
|
||||
VALUES
|
||||
( 1, 0, CURDATE(), 5, 40, 3, 1, 14),
|
||||
( 1, 1, CURDATE(), 5, 40, 3, 2, 8),
|
||||
( 1, 0, CURDATE(), 5, 55, 3, 1, 14),
|
||||
( 1, 1, CURDATE(), 5, 54, 3, 2, 8),
|
||||
( 2, 1, CURDATE(), 10, 40, 4, 3, 8),
|
||||
( 3, 1, CURDATE(), 2, 40, 4, 4, 8);
|
||||
|
||||
|
@ -1055,7 +1055,7 @@ INSERT INTO `vn`.`userConfig` (`userFk`, `warehouseFk`, `companyFk`)
|
|||
(1, 2, 69),
|
||||
(5, 1, 442),
|
||||
(9, 1, 442),
|
||||
(18, 3, 791);
|
||||
(18, 3, 567);
|
||||
|
||||
INSERT INTO `vn`.`receipt`(`id`, `invoiceFk`, `amountPaid`, `amountUnpaid`, `payed`, `workerFk`, `bankFk`, `clientFk`, `created`, `companyFk`, `isConciliate`)
|
||||
VALUES
|
||||
|
|
Loading…
Reference in New Issue