Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 3341-item_search-panel

This commit is contained in:
Carlos Jimenez Ruiz 2021-11-18 12:40:50 +01:00
commit 2bfcaa810c
83 changed files with 249 additions and 142 deletions

View File

@ -27,7 +27,7 @@ module.exports = Self => {
Self.sendCheckingPresence = async(ctx, recipientId, message, options) => { Self.sendCheckingPresence = async(ctx, recipientId, message, options) => {
if (!recipientId) return false; if (!recipientId) return false;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -60,7 +60,7 @@ module.exports = Self => {
const args = ctx.args; const args = ctx.args;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -54,7 +54,7 @@ module.exports = Self => {
const args = ctx.args; const args = ctx.args;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -16,7 +16,7 @@ module.exports = function(Self) {
const models = Self.app.models; const models = Self.app.models;
const userId = ctx.req.accessToken.userId; const userId = ctx.req.accessToken.userId;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -31,7 +31,7 @@ module.exports = function(Self) {
const userId = ctx.req.accessToken.userId; const userId = ctx.req.accessToken.userId;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -23,7 +23,7 @@ module.exports = function(Self) {
const userId = ctx.req.accessToken.userId; const userId = ctx.req.accessToken.userId;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -1,9 +1,9 @@
DROP PROCEDURE IF EXISTS vn.item_getBalance; DROP PROCEDURE IF EXISTS `vn`.`item_getBalance`;
DELIMITER $$ DELIMITER $$
$$ $$
CREATE CREATE
definer = root@`%` procedure vn.item_getBalance(IN vItemId int, IN vWarehouse int) definer = root@`%` procedure `vn`.`item_getBalance`(IN vItemId int, IN vWarehouse int)
BEGIN BEGIN
DECLARE vDateInventory DATETIME; DECLARE vDateInventory DATETIME;
DECLARE vCurdate DATE DEFAULT CURDATE(); DECLARE vCurdate DATE DEFAULT CURDATE();

View File

@ -739,7 +739,7 @@ INSERT INTO `vn`.`itemType`(`id`, `code`, `name`, `categoryFk`, `warehouseFk`, `
(3, 'WPN', 'Paniculata', 2, 1, 31, 35, 0), (3, 'WPN', 'Paniculata', 2, 1, 31, 35, 0),
(4, 'PRT', 'Delivery ports', 3, 1, NULL, 35, 1), (4, 'PRT', 'Delivery ports', 3, 1, NULL, 35, 1),
(5, 'CON', 'Container', 3, 1, NULL, 35, 1), (5, 'CON', 'Container', 3, 1, NULL, 35, 1),
(6, 'ALS', 'Alstroemeria', 1, 1, 31, 35, 0); (6, 'ALS', 'Alstroemeria', 1, 1, 31, 16, 0);
INSERT INTO `vn`.`ink`(`id`, `name`, `picture`, `showOrder`, `hex`) INSERT INTO `vn`.`ink`(`id`, `name`, `picture`, `showOrder`, `hex`)
VALUES VALUES
@ -813,8 +813,8 @@ INSERT INTO `vn`.`item`(`id`, `typeFk`, `size`, `inkFk`, `stems`, `originFk`, `d
(13, 5, 30, 'RED', 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '13', NULL, 0, 2, 'VT', 1), (13, 5, 30, 'RED', 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '13', NULL, 0, 2, 'VT', 1),
(14, 5, 90, 'BLU', 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 4, 'VT', 1), (14, 5, 90, 'BLU', 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 4, 'VT', 1),
(15, 4, NULL, NULL, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 0, 'EMB', 0), (15, 4, NULL, NULL, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 0, 'EMB', 0),
(16, 4, NULL, NULL, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 0, 'EMB', 0), (16, 6, NULL, NULL, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 0, 'EMB', 0),
(71, 4, NULL, NULL, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 0, 'VT', 0); (71, 6, NULL, NULL, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 0, 'VT', 0);
-- Update the taxClass after insert of the items -- Update the taxClass after insert of the items
UPDATE `vn`.`itemTaxCountry` SET `taxClassFk` = 2 UPDATE `vn`.`itemTaxCountry` SET `taxClassFk` = 2

View File

@ -83,6 +83,7 @@ describe('Client create path', () => {
expect(message.text).toContain('Some fields are invalid'); expect(message.text).toContain('Some fields are invalid');
}); });
/* Tarea #3370
it(`should attempt to create a new user with all it's data but wrong business type`, async() => { it(`should attempt to create a new user with all it's data but wrong business type`, async() => {
await page.clearInput(selectors.createClientView.email); await page.clearInput(selectors.createClientView.email);
await page.write(selectors.createClientView.email, 'CarolDanvers@verdnatura.es'); await page.write(selectors.createClientView.email, 'CarolDanvers@verdnatura.es');
@ -91,9 +92,12 @@ describe('Client create path', () => {
const message = await page.waitForSnackbar(); const message = await page.waitForSnackbar();
expect(message.text).toContain('Some fields are invalid'); expect(message.text).toContain('Some fields are invalid');
}); });*/
it(`should attempt to create a new user with all it's data but wrong postal code`, async() => { it(`should attempt to create a new user with all it's data but wrong postal code`, async() => {
await page.clearInput(selectors.createClientView.email);
await page.write(selectors.createClientView.email, 'CarolDanvers@verdnatura.es');
await page.autocompleteSearch(selectors.createClientView.businessType, 'florist'); await page.autocompleteSearch(selectors.createClientView.businessType, 'florist');
await page.clearInput(selectors.createClientView.postcode); await page.clearInput(selectors.createClientView.postcode);
await page.write(selectors.createClientView.postcode, '479999'); await page.write(selectors.createClientView.postcode, '479999');

View File

@ -222,7 +222,7 @@
} }
} }
&.focused { &.focused {
background-color: $color-bg-panel; background-color: $color-font-dark;
& > .container { & > .container {
& > .infix > .control > * { & > .infix > .control > * {

View File

@ -27,7 +27,7 @@ smart-table table {
& > th, & > th,
& > td { & > td {
text-align: left; text-align: left;
padding: 9px 5px; padding: 5px;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
@ -76,23 +76,26 @@ smart-table table {
.chip { .chip {
padding: 4px; padding: 4px;
border-radius: 4px; border-radius: 4px;
color: $color-font-bg;
&.notice { &.notice {
background-color: $color-notice-medium background-color: $color-notice-medium;
color: $color-font-bg;
} }
&.success { &.success {
background-color: $color-success-medium; background-color: $color-success-medium;
color: $color-font-bg;
} }
&.warning { &.warning {
background-color: $color-main-medium; background-color: $color-main-medium;
color: $color-font-bg;
} }
&.alert { &.alert {
background-color: $color-alert-medium; background-color: $color-alert-medium;
color: $color-font-bg;
} }
&.message { &.message {
background-color: $color-bg-dark;
color: $color-font-dark; color: $color-font-dark;
background-color: $color-bg-dark
} }
} }
} }

View File

@ -132,23 +132,26 @@ vn-table {
.chip { .chip {
padding: 4px; padding: 4px;
border-radius: 4px; border-radius: 4px;
color: $color-font-bg;
&.notice { &.notice {
background-color: $color-notice-medium background-color: $color-notice-medium;
color: $color-font-bg;
} }
&.success { &.success {
background-color: $color-success-medium; background-color: $color-success-medium;
color: $color-font-bg;
} }
&.warning { &.warning {
background-color: $color-main-medium; background-color: $color-main-medium;
color: $color-font-bg;
} }
&.alert { &.alert {
background-color: $color-alert-medium; background-color: $color-alert-medium;
color: $color-font-bg;
} }
&.message { &.message {
background-color: $color-bg-dark;
color: $color-font-dark; color: $color-font-dark;
background-color: $color-bg-dark
} }
} }
vn-icon-menu { vn-icon-menu {
@ -195,7 +198,7 @@ vn-table.scrollable > .vn-table,
thead vn-th, thead vn-th,
thead th { thead th {
border-bottom: 2px solid $color-spacer; border-bottom: 2px solid $color-spacer;
background-color: #FFF; background-color: $color-bg-panel;
position: sticky; position: sticky;
z-index: 9; z-index: 9;
top: 0 top: 0

View File

@ -23,30 +23,30 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.icon-basketadd:before { .icon-preserved:before {
content: "\e901"; content: "\e963";
} }
.icon-addperson:before { .icon-treatments:before {
content: "\e955"; content: "\e964";
} }
.icon-supplierfalse:before { .icon-funeral:before {
content: "\e965";
}
.icon-handmadeArtificial:before {
content: "\e966";
}
.icon-fixedPrice:before {
content: "\e962"; content: "\e962";
} }
.icon-invoice-in-create:before { .icon-accounts:before {
content: "\e948"; content: "\e95f";
} }
.icon-invoiceOut:before { .icon-clientConsumption:before {
content: "\e960"; content: "\e960";
} }
.icon-invoiceIn:before { .icon-lastBuy:before {
content: "\e961"; content: "\e961";
} }
.icon-supplier:before {
content: "\e936";
}
.icon-latestBuy:before {
content: "\e95f";
}
.icon-zone:before { .icon-zone:before {
content: "\e95d"; content: "\e95d";
} }
@ -86,6 +86,9 @@
.icon-deliveryprices:before { .icon-deliveryprices:before {
content: "\e956"; content: "\e956";
} }
.icon-basketadd:before {
content: "\e955";
}
.icon-catalog:before { .icon-catalog:before {
content: "\e952"; content: "\e952";
} }
@ -128,9 +131,15 @@
.icon-actions:before { .icon-actions:before {
content: "\e900"; content: "\e900";
} }
.icon-addperson:before {
content: "\e901";
}
.icon-albaran:before { .icon-albaran:before {
content: "\e902"; content: "\e902";
} }
.icon-apps:before {
content: "\e948";
}
.icon-artificial:before { .icon-artificial:before {
content: "\e903"; content: "\e903";
} }
@ -239,6 +248,9 @@
.icon-mandatory:before { .icon-mandatory:before {
content: "\e921"; content: "\e921";
} }
.icon-niche:before {
content: "\e922";
}
.icon-no036:before { .icon-no036:before {
content: "\e923"; content: "\e923";
} }
@ -302,6 +314,9 @@
.icon-stowaway:before { .icon-stowaway:before {
content: "\e92c"; content: "\e92c";
} }
.icon-supplier:before {
content: "\e936";
}
.icon-tags:before { .icon-tags:before {
content: "\e937"; content: "\e937";
} }

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 136 KiB

View File

@ -1,6 +1,6 @@
@import "./util"; @import "./util";
$font-size: 12pt; $font-size: 11pt;
$menu-width: 256px; $menu-width: 256px;
$topbar-height: 56px; $topbar-height: 56px;
$mobile-width: 800px; $mobile-width: 800px;
@ -24,7 +24,7 @@ $spacing-xl: 70px;
// Light theme // Light theme
$color-primary: #f7931e; /* $color-primary: #f7931e;
$color-secondary: $color-primary; $color-secondary: $color-primary;
$color-font: #222; $color-font: #222;
@ -72,28 +72,36 @@ $color-success-light: lighten($color-success, 35%);
$color-notice-medium: lighten($color-notice, 20%); $color-notice-medium: lighten($color-notice, 20%);
$color-notice-light: lighten($color-notice, 35%); $color-notice-light: lighten($color-notice, 35%);
$color-alert-medium: lighten($color-alert, 20%); $color-alert-medium: lighten($color-alert, 20%);
$color-alert-light: lighten($color-alert, 35%); $color-alert-light: lighten($color-alert, 35%); */
/**/ /**/
// Dark theme // Dark theme
/* $color-primary: #f7931e;
$color-header: #3d3d3d; $color-secondary: $color-primary;
$color-bg: #222;
$color-bg-dark: #222;
$color-font: #eee; $color-font: #eee;
$color-font-light: #aaa; $color-font-light: #aaa;
$color-font-secondary: #777; $color-font-secondary: #777;
$color-font-dark: white; $color-font-dark: white;
$color-font-link: #66bfff;
$color-font-bg: rgba(0, 0, 0, .8); $color-font-bg: rgba(0, 0, 0, .8);
$color-font-link: #005a9a; $color-font-bg-marginal: rgba(0, 0, 0, .4);
$color-font-bg-dark: rgba(255, 255, 255, .7);
$color-font-bg-dark-marginal: rgba(255, 255, 255, .4);
$color-header: #3d3d3d;
$color-menu-header: #3d3d3d;
$color-bg: #222;
$color-bg-dark: #222;
$color-active: #666; $color-active: #666;
$color-active-font: white; $color-active-font: white;
$color-bg-panel: #3c3b3b; $color-bg-panel: #3c3b3b;
$color-main: #f7931e; $color-main: $color-primary;
$color-marginal: #ccc; $color-marginal: #111;
$color-success: #a3d131; $color-success: #a3d131;
$color-notice: #32b1ce; $color-notice: #32b1ce;
$color-alert: #f42121; $color-alert: #fa3939;
$color-button: $color-secondary;
$color-spacer: rgba(255, 255, 255, .3); $color-spacer: rgba(255, 255, 255, .3);
$color-spacer-light: rgba(255, 255, 255, .12); $color-spacer-light: rgba(255, 255, 255, .12);
@ -105,15 +113,18 @@ $color-hover-cd: rgba(255, 255, 255, .1);
$color-hover-dc: .7; $color-hover-dc: .7;
$color-disabled: .6; $color-disabled: .6;
$color-font-link: lighten($color-main, 10%); $color-primary-medium: lighten($color-primary, 20%);
$color-main-medium: darken($color-main, 20%); $color-primary-light: lighten($color-primary, 35%);
$color-main-light: darken($color-main, 35%); $color-font-link-medium: lighten($color-font-link, 20%);
$color-success-medium: darken($color-success, 20%); $color-font-link-light: lighten($color-font-link, 35%);
$color-success-light: darken($color-success, 35%); $color-main-medium: lighten($color-main, 20%);
$color-notice-medium: darken($color-notice, 20%); $color-main-light: lighten($color-main, 35%);
$color-notice-light: darken($color-notice, 35%); $color-success-medium: lighten($color-success, 20%);
$color-alert-medium: darken($color-alert, 20%); $color-success-light: lighten($color-success, 35%);
$color-alert-light: darken($color-alert, 35%); $color-notice-medium: lighten($color-notice, 20%);
$color-notice-light: lighten($color-notice, 35%);
$color-alert-medium: lighten($color-alert, 20%);
$color-alert-light: lighten($color-alert, 35%);
/**/ /**/
// Border // Border

View File

@ -68,7 +68,6 @@ ui-view > .vn-summary {
padding: 7px; padding: 7px;
padding-bottom: 4px; /* Bottom line-height fix */ padding-bottom: 4px; /* Bottom line-height fix */
font-weight: lighter; font-weight: lighter;
background-color: $color-main-light;
border-bottom: 1px solid $color-main; border-bottom: 1px solid $color-main;
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
@ -78,7 +77,7 @@ ui-view > .vn-summary {
display: block; display: block;
} }
a { a {
color: $color-font; color: $color-font-link;
} }
} }
h4 span:after { h4 span:after {
@ -87,7 +86,7 @@ ui-view > .vn-summary {
position: absolute; position: absolute;
right: 5px; right: 5px;
text-transform: none; text-transform: none;
color: $color-spacer color: $color-font-link;
} }
& > * { & > * {
margin: $spacing-sm; margin: $spacing-sm;

View File

@ -63,7 +63,7 @@ module.exports = Self => {
}; };
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -20,7 +20,7 @@ module.exports = Self => {
Self.removeFile = async(ctx, id, options) => { Self.removeFile = async(ctx, id, options) => {
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -22,7 +22,7 @@ module.exports = Self => {
let userId = ctx.req.accessToken.userId; let userId = ctx.req.accessToken.userId;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -24,7 +24,7 @@ module.exports = Self => {
const resolvedState = 3; const resolvedState = 3;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -44,7 +44,7 @@ module.exports = Self => {
const userId = ctx.req.accessToken.userId; const userId = ctx.req.accessToken.userId;
const args = ctx.args; const args = ctx.args;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -30,7 +30,7 @@ module.exports = Self => {
Self.updateClaimAction = async(ctx, id, options) => { Self.updateClaimAction = async(ctx, id, options) => {
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -54,7 +54,7 @@ module.exports = Self => {
Self.uploadFile = async(ctx, id, options) => { Self.uploadFile = async(ctx, id, options) => {
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -25,7 +25,7 @@ module.exports = function(Self) {
Self.canBeInvoiced = async(id, options) => { Self.canBeInvoiced = async(id, options) => {
const models = Self.app.models; const models = Self.app.models;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -135,8 +135,7 @@
"type": "string", "type": "string",
"mysql": { "mysql": {
"columnName": "businessTypeFk" "columnName": "businessTypeFk"
}, }
"required": true
} }
}, },
"relations": { "relations": {

View File

@ -68,7 +68,7 @@ module.exports = Self => {
Self.addBuy = async(ctx, options) => { Self.addBuy = async(ctx, options) => {
const conn = Self.dataSource.connector; const conn = Self.dataSource.connector;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -21,7 +21,7 @@ module.exports = Self => {
Self.deleteBuys = async(ctx, options) => { Self.deleteBuys = async(ctx, options) => {
const models = Self.app.models; const models = Self.app.models;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -32,7 +32,7 @@ module.exports = Self => {
Self.editLatestBuys = async(field, newValue, lines, options) => { Self.editLatestBuys = async(field, newValue, lines, options) => {
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -108,7 +108,7 @@ module.exports = Self => {
}); });
Self.filter = async(ctx, filter, options) => { Self.filter = async(ctx, filter, options) => {
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -29,7 +29,7 @@ module.exports = Self => {
Self.getBuys = async(id, filter, options) => { Self.getBuys = async(id, filter, options) => {
const models = Self.app.models; const models = Self.app.models;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -21,7 +21,7 @@ module.exports = Self => {
Self.getEntry = async(id, options) => { Self.getEntry = async(id, options) => {
const models = Self.app.models; const models = Self.app.models;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -26,7 +26,7 @@ module.exports = Self => {
Self.importBuysPreview = async(id, buys, options) => { Self.importBuysPreview = async(id, buys, options) => {
const models = Self.app.models; const models = Self.app.models;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -76,7 +76,7 @@ module.exports = Self => {
}); });
Self.latestBuysFilter = async(ctx, filter, options) => { Self.latestBuysFilter = async(ctx, filter, options) => {
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -15,16 +15,16 @@ vn-entry-buy-index vn-card {
tbody tr:nth-child(1), tbody tr:nth-child(1),
tbody tr:nth-child(2) { tbody tr:nth-child(2) {
border-left: 1px solid $color-marginal; border-left: 1px solid $color-spacer;
border-right: 1px solid $color-marginal; border-right: 1px solid $color-spacer;
} }
tbody tr:nth-child(2) { tbody tr:nth-child(2) {
border-bottom: 1px solid $color-marginal; border-bottom: 1px solid $color-spacer;
} }
tbody{ tbody{
border-bottom: 1px solid $color-marginal; border-bottom: 1px solid $color-spacer;
} }
tbody:last-child { tbody:last-child {

View File

@ -2,7 +2,8 @@
vn-id="model" vn-id="model"
url="Entries/filter" url="Entries/filter"
limit="20" limit="20"
auto-load="true"> auto-load="true"
order="landed DESC, id DESC">
</vn-crud-model> </vn-crud-model>
<vn-portal slot="topbar"> <vn-portal slot="topbar">
<vn-searchbar <vn-searchbar

View File

@ -7,7 +7,7 @@
"menus": { "menus": {
"main": [ "main": [
{"state": "entry.index", "icon": "icon-entry"}, {"state": "entry.index", "icon": "icon-entry"},
{"state": "entry.latestBuys", "icon": "contact_support"} {"state": "entry.latestBuys", "icon": "icon-lastBuy"}
], ],
"card": [ "card": [
{"state": "entry.card.basicData", "icon": "settings"}, {"state": "entry.card.basicData", "icon": "settings"},

View File

@ -9,13 +9,13 @@ vn-entry-summary .summary {
} }
tbody tr:nth-child(1) { tbody tr:nth-child(1) {
border-top: 1px solid $color-marginal; border-top: 1px solid $color-spacer;
} }
tbody tr:nth-child(1), tbody tr:nth-child(1),
tbody tr:nth-child(2) { tbody tr:nth-child(2) {
border-left: 1px solid $color-marginal; border-left: 1px solid $color-spacer;
border-right: 1px solid $color-marginal border-right: 1px solid $color-spacer
} }
tbody tr:nth-child(3) { tbody tr:nth-child(3) {

View File

@ -78,7 +78,7 @@ module.exports = Self => {
{ {
arg: 'isBooked', arg: 'isBooked',
type: 'boolean', type: 'boolean',
description: 'Whether the the invoice is booked or not', description: 'Whether the invoice is booked or not',
}, },
], ],
returns: { returns: {
@ -95,7 +95,7 @@ module.exports = Self => {
const conn = Self.dataSource.connector; const conn = Self.dataSource.connector;
const args = ctx.args; const args = ctx.args;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -20,7 +20,7 @@ module.exports = Self => {
}); });
Self.summary = async(id, options) => { Self.summary = async(id, options) => {
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -23,7 +23,7 @@ module.exports = Self => {
Self.book = async(ref, options) => { Self.book = async(ref, options) => {
const models = Self.app.models; const models = Self.app.models;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -35,7 +35,7 @@ module.exports = Self => {
throw new UserError(`Action not allowed on the test environment`); throw new UserError(`Action not allowed on the test environment`);
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -35,7 +35,7 @@ module.exports = Self => {
{ {
arg: 'hasPdf', arg: 'hasPdf',
type: 'boolean', type: 'boolean',
description: 'Whether the the invoiceOut has PDF or not', description: 'Whether the invoiceOut has PDF or not',
http: {source: 'query'} http: {source: 'query'}
}, },
{ {
@ -87,7 +87,7 @@ module.exports = Self => {
Self.filter = async(ctx, filter, options) => { Self.filter = async(ctx, filter, options) => {
const conn = Self.dataSource.connector; const conn = Self.dataSource.connector;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -29,7 +29,7 @@ module.exports = Self => {
Self.getTickets = async(id, filter, options) => { Self.getTickets = async(id, filter, options) => {
const models = Self.app.models; const models = Self.app.models;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -21,7 +21,7 @@ module.exports = Self => {
Self.summary = async(id, options) => { Self.summary = async(id, options) => {
let summary = {}; let summary = {};
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -0,0 +1,44 @@
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
module.exports = Self => {
Self.remoteMethod('activeBuyers', {
description: 'Returns a list of buyers for the given item type',
accepts: [{
arg: 'filter',
type: 'object',
description: `Filter defining where, order, offset, and limit - must be a JSON-encoded string`
}],
returns: {
type: ['object'],
root: true
},
http: {
path: `/activeBuyers`,
verb: 'GET'
}
});
Self.activeBuyers = async(filter, options) => {
const conn = Self.dataSource.connector;
const where = {isActive: true};
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
filter = mergeFilters(filter, {where});
let stmt = new ParameterizedSQL(
`SELECT DISTINCT w.id workerFk, w.firstName, w.lastName, u.name, u.nickname
FROM worker w
JOIN itemType it ON it.workerFk = w.id
JOIN account.user u ON u.id = w.id
JOIN item i ON i.typeFk = it.id`,
null, myOptions);
stmt.merge(conn.makeSuffix(filter));
return conn.executeStmt(stmt);
};
};

View File

@ -41,10 +41,10 @@ module.exports = Self => {
{ {
arg: 'isActive', arg: 'isActive',
type: 'boolean', type: 'boolean',
description: 'Whether the the item is or not active', description: 'Whether the item is or not active',
}, },
{ {
arg: 'salesPersonFk', arg: 'buyerFk',
type: 'integer', type: 'integer',
description: 'The buyer of the item', description: 'The buyer of the item',
}, },

View File

@ -0,0 +1,24 @@
const models = require('vn-loopback/server/server').models;
describe('Worker activeBuyers', () => {
it('should return the buyers in itemType as result', async() => {
const tx = await models.Item.beginTransaction({});
try {
const options = {transaction: tx};
const filter = {};
const result = await models.Item.activeBuyers(filter, options);
const firstWorker = result[0];
const secondWorker = result[1];
expect(result.length).toEqual(2);
expect(firstWorker.nickname).toEqual('logisticBossNick');
expect(secondWorker.nickname).toEqual('buyerNick');
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
});
});

View File

@ -14,6 +14,7 @@ module.exports = Self => {
require('../methods/item/getWasteByWorker')(Self); require('../methods/item/getWasteByWorker')(Self);
require('../methods/item/getWasteByItem')(Self); require('../methods/item/getWasteByItem')(Self);
require('../methods/item/createIntrastat')(Self); require('../methods/item/createIntrastat')(Self);
require('../methods/item/activeBuyers')(Self);
Self.validatesPresenceOf('originFk', {message: 'Cannot be blank'}); Self.validatesPresenceOf('originFk', {message: 'Cannot be blank'});

View File

@ -9,7 +9,7 @@
{"state": "item.index", "icon": "icon-item"}, {"state": "item.index", "icon": "icon-item"},
{"state": "item.request", "icon": "pan_tool"}, {"state": "item.request", "icon": "pan_tool"},
{"state": "item.waste.index", "icon": "icon-claims"}, {"state": "item.waste.index", "icon": "icon-claims"},
{"state": "item.fixedPrice", "icon": "contact_support"} {"state": "item.fixedPrice", "icon": "icon-fixedPrice"}
], ],
"card": [ "card": [
{"state": "item.card.basicData", "icon": "settings"}, {"state": "item.card.basicData", "icon": "settings"},

View File

@ -40,13 +40,11 @@
<vn-horizontal> <vn-horizontal>
<vn-autocomplete <vn-autocomplete
vn-one vn-one
disabled="false"
ng-model="filter.buyerFk" ng-model="filter.buyerFk"
url="Workers/activeWithRole" url="Items/activeBuyers"
show-field="nickname" show-field="nickname"
search-function="{firstName: $search}" search-function="{firstName: $search}"
value-field="id" value-field="workerFk"
where="{role: {inq: ['logistic', 'buyer']}}"
label="Buyer"> label="Buyer">
</vn-autocomplete> </vn-autocomplete>
</vn-horizontal> </vn-horizontal>

View File

@ -11,7 +11,7 @@ vn-monitor-sales-orders {
color: gray; color: gray;
& > vn-td { & > vn-td {
border-bottom: 2px solid $color-marginal; border-bottom: 2px solid $color-spacer;
font-size: 13px; font-size: 13px;
} }
} }

View File

@ -84,7 +84,7 @@ export default class Controller extends Section {
]; ];
const hasExcludedParams = excludedParams.some(param => { const hasExcludedParams = excludedParams.some(param => {
return $params && $params[param]; return $params && $params[param] != undefined;
}); });
const hasParams = Object.entries($params).length; const hasParams = Object.entries($params).length;
if (!hasParams || !hasExcludedParams) if (!hasParams || !hasExcludedParams)

View File

@ -20,7 +20,7 @@ module.exports = Self => {
}); });
Self.getSuggestedTickets = async(id, options) => { Self.getSuggestedTickets = async(id, options) => {
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -26,7 +26,8 @@ module.exports = Self => {
Self.getTickets = async(filter, options) => { Self.getTickets = async(filter, options) => {
const conn = Self.dataSource.connector; const conn = Self.dataSource.connector;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -30,7 +30,7 @@ module.exports = Self => {
const models = Self.app.models; const models = Self.app.models;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -24,7 +24,7 @@ module.exports = Self => {
const models = Self.app.models; const models = Self.app.models;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -6,5 +6,5 @@
margin-bottom: 10px; margin-bottom: 10px;
padding-right: 10px; padding-right: 10px;
padding-left: 10px; padding-left: 10px;
border: 1px solid $color-marginal; border: 1px solid $color-spacer;
} }

View File

@ -28,11 +28,6 @@
icon="icon-disabled" icon="icon-disabled"
ng-if="$ctrl.supplier.isActive == false"> ng-if="$ctrl.supplier.isActive == false">
</vn-icon> </vn-icon>
<vn-icon
vn-tooltip="Verified supplier"
icon="verified_user"
ng-if="$ctrl.supplier.isSerious == true">
</vn-icon>
<vn-icon <vn-icon
vn-tooltip="Unverified supplier" vn-tooltip="Unverified supplier"
icon="icon-supplierfalse" icon="icon-supplierfalse"

View File

@ -13,7 +13,7 @@
{"state": "supplier.card.fiscalData", "icon": "account_balance"}, {"state": "supplier.card.fiscalData", "icon": "account_balance"},
{"state": "supplier.card.billingData", "icon": "icon-payment"}, {"state": "supplier.card.billingData", "icon": "icon-payment"},
{"state": "supplier.card.address.index", "icon": "icon-delivery"}, {"state": "supplier.card.address.index", "icon": "icon-delivery"},
{"state": "supplier.card.account", "icon": "contact_support"}, {"state": "supplier.card.account", "icon": "icon-accounts"},
{"state": "supplier.card.contact", "icon": "contact_phone"}, {"state": "supplier.card.contact", "icon": "contact_phone"},
{"state": "supplier.card.log", "icon": "history"}, {"state": "supplier.card.log", "icon": "history"},
{"state": "supplier.card.consumption", "icon": "show_chart"} {"state": "supplier.card.consumption", "icon": "show_chart"}

View File

@ -14,7 +14,7 @@ export default class Ticket extends ModuleMain {
]; ];
const hasExcludedParams = excludedParams.some(param => { const hasExcludedParams = excludedParams.some(param => {
return $params && $params[param]; return $params && $params[param] != undefined;
}); });
const hasParams = Object.entries($params).length; const hasParams = Object.entries($params).length;
if (!hasParams || !hasExcludedParams) if (!hasParams || !hasExcludedParams)

View File

@ -40,7 +40,7 @@ module.exports = Self => {
ended.setMonth(12); ended.setMonth(12);
ended.setDate(0); ended.setDate(0);
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -34,8 +34,8 @@ module.exports = Self => {
const models = Self.app.models; const models = Self.app.models;
const args = ctx.args; const args = ctx.args;
const currentUserId = ctx.req.accessToken.userId; const currentUserId = ctx.req.accessToken.userId;
const myOptions = {};
let myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -25,7 +25,7 @@ module.exports = Self => {
const currentUserId = ctx.req.accessToken.userId; const currentUserId = ctx.req.accessToken.userId;
const models = Self.app.models; const models = Self.app.models;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -31,7 +31,7 @@ module.exports = Self => {
const models = Self.app.models; const models = Self.app.models;
const args = ctx.args; const args = ctx.args;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -41,7 +41,7 @@ module.exports = Self => {
const userId = ctx.req.accessToken.userId; const userId = ctx.req.accessToken.userId;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -28,7 +28,7 @@ module.exports = Self => {
const userId = ctx.req.accessToken.userId; const userId = ctx.req.accessToken.userId;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -34,7 +34,7 @@ module.exports = Self => {
const models = Self.app.models; const models = Self.app.models;
const args = ctx.args; const args = ctx.args;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -27,7 +27,7 @@ module.exports = Self => {
const models = Self.app.models; const models = Self.app.models;
const myUserId = ctx.req.accessToken.userId; const myUserId = ctx.req.accessToken.userId;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -25,7 +25,7 @@ module.exports = Self => {
const userId = ctx.req.accessToken.userId; const userId = ctx.req.accessToken.userId;
const stmts = []; const stmts = [];
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -22,7 +22,7 @@ module.exports = Self => {
Self.byWarehouse = async(filter, options) => { Self.byWarehouse = async(filter, options) => {
const conn = Self.dataSource.connector; const conn = Self.dataSource.connector;
const where = {isActive: true}; const where = {isActive: true};
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -29,7 +29,7 @@ module.exports = Self => {
}); });
Self.getAgenciesWithWarehouse = async(addressFk, landed, warehouseFk, options) => { Self.getAgenciesWithWarehouse = async(addressFk, landed, warehouseFk, options) => {
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -23,7 +23,7 @@ module.exports = Self => {
}); });
Self.landsThatDay = async(addressFk, landed, options) => { Self.landsThatDay = async(addressFk, landed, options) => {
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -22,7 +22,7 @@ module.exports = Self => {
Self.clone = async(id, options) => { Self.clone = async(id, options) => {
const models = Self.app.models; const models = Self.app.models;
let tx; let tx;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -26,7 +26,7 @@ module.exports = Self => {
}); });
Self.getEvents = async(geoFk, agencyModeFk, options) => { Self.getEvents = async(geoFk, agencyModeFk, options) => {
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -32,7 +32,7 @@ module.exports = Self => {
}); });
Self.getLeaves = async(id, parentId = null, search, options) => { Self.getLeaves = async(id, parentId = null, search, options) => {
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -14,7 +14,7 @@ module.exports = Self => {
}); });
Self.getUpcomingDeliveries = async options => { Self.getUpcomingDeliveries = async options => {
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -2,7 +2,7 @@ const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
module.exports = Self => { module.exports = Self => {
Self.remoteMethodCtx('includingExpired', { Self.remoteMethodCtx('includingExpired', {
description: 'Returns a list of agencies from a warehouse', description: 'Returns a list of zones for the given warehouse and user',
accepts: [{ accepts: [{
arg: 'filter', arg: 'filter',
type: 'Object', type: 'Object',
@ -19,7 +19,7 @@ module.exports = Self => {
}); });
Self.includingExpired = async(ctx, filter, options) => { Self.includingExpired = async(ctx, filter, options) => {
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -29,7 +29,7 @@ module.exports = Self => {
Self.toggleIsIncluded = async(id, geoId, isIncluded, options) => { Self.toggleIsIncluded = async(id, geoId, isIncluded, options) => {
const models = Self.app.models; const models = Self.app.models;
let myOptions = {}; const myOptions = {};
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);

View File

@ -45,6 +45,8 @@ class Controller extends Component {
let date = new Date(this.date.getTime()); let date = new Date(this.date.getTime());
date.setMonth(date.getMonth() + (this.nMonths * direction)); date.setMonth(date.getMonth() + (this.nMonths * direction));
this.date = date; this.date = date;
this.emit('step');
} }
get data() { get data() {

View File

@ -3,6 +3,7 @@
vn-id="calendar" vn-id="calendar"
data="data" data="data"
on-selection="$ctrl.onSelection($days, $type, $weekday, $events, $exclusions)" on-selection="$ctrl.onSelection($days, $type, $weekday, $events, $exclusions)"
on-step="$ctrl.refresh()"
class="vn-w-md"> class="vn-w-md">
</vn-zone-calendar> </vn-zone-calendar>
<vn-side-menu side="right"> <vn-side-menu side="right">

View File

@ -28,7 +28,7 @@ module.exports = {
for (let attachment of options.attachments) { for (let attachment of options.attachments) {
const fileName = attachment.filename; const fileName = attachment.filename;
const filePath = attachment.path; const filePath = attachment.path;
// if (fileName.includes('.png')) return; if (fileName.includes('.png')) return;
if (fileName || filePath) if (fileName || filePath)
attachments.push(filePath ? filePath : fileName); attachments.push(filePath ? filePath : fileName);