Merge branch '4605-Create-Model-PackagingMistake' of https://gitea.verdnatura.es/verdnatura/salix into 4605-Create-Model-PackagingMistake
gitea/salix/pipeline/head There was a failure building this commit
Details
gitea/salix/pipeline/head There was a failure building this commit
Details
This commit is contained in:
commit
05dfcfd864
|
@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
- [Artículo](Datos Básicos) Añadido campo Unidades/Caja
|
- [Artículo](Datos Básicos) Añadido campo Unidades/Caja
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
- [Tickets](Líneas preparadas) Actualizada sección para que sea más visual
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- [General] Al utilizar el traductor de Google se descuadraban los iconos
|
- [General] Al utilizar el traductor de Google se descuadraban los iconos
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`)
|
||||||
|
VALUES ('ItemShelvingSale','*','*','ALLOW','employee');
|
|
@ -1143,10 +1143,10 @@ INSERT INTO `vn`.`itemShelving` (`itemFk`, `shelvingFk`, `visible`, `grouping`,
|
||||||
|
|
||||||
INSERT INTO `vn`.`itemShelvingSale` (`itemShelvingFk`, `saleFk`, `quantity`, `created`, `userFk`)
|
INSERT INTO `vn`.`itemShelvingSale` (`itemShelvingFk`, `saleFk`, `quantity`, `created`, `userFk`)
|
||||||
VALUES
|
VALUES
|
||||||
('1', '1', '1', '', '1106'),
|
('1', '1', '1', util.VN_CURDATE(), '1106'),
|
||||||
('2', '2', '5', '', '1106'),
|
('2', '2', '5', util.VN_CURDATE(), '1106'),
|
||||||
('1', '7', '1', '', '1106'),
|
('1', '7', '1', util.VN_CURDATE(), '1106'),
|
||||||
('2', '8', '5', '', '1106');
|
('2', '8', '5', util.VN_CURDATE(), '1106');
|
||||||
|
|
||||||
INSERT INTO `vncontrol`.`accion`(`accion_id`, `accion`)
|
INSERT INTO `vncontrol`.`accion`(`accion_id`, `accion`)
|
||||||
VALUES
|
VALUES
|
||||||
|
@ -1779,7 +1779,7 @@ INSERT INTO `vn`.`claimDestination`(`id`, `description`, `addressFk`)
|
||||||
INSERT INTO `vn`.`claimDevelopment`(`id`, `claimFk`, `claimResponsibleFk`, `workerFk`, `claimReasonFk`, `claimResultFk`, `claimRedeliveryFk`, `claimDestinationFk`)
|
INSERT INTO `vn`.`claimDevelopment`(`id`, `claimFk`, `claimResponsibleFk`, `workerFk`, `claimReasonFk`, `claimResultFk`, `claimRedeliveryFk`, `claimDestinationFk`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 1, 1, 21, 1, 1, 2, 5),
|
(1, 1, 1, 21, 1, 1, 2, 5),
|
||||||
(2, 1, 1, 21, 7, 2, 2, 5),
|
(2, 1, 2, 21, 7, 2, 2, 5),
|
||||||
(3, 2, 7, 21, 9, 3, 2, 5),
|
(3, 2, 7, 21, 9, 3, 2, 5),
|
||||||
(4, 3, 7, 21, 15, 8, 2, 5),
|
(4, 3, 7, 21, 15, 8, 2, 5),
|
||||||
(5, 4, 7, 21, 7, 8, 2, 5);
|
(5, 4, 7, 21, 7, 8, 2, 5);
|
||||||
|
|
|
@ -153,6 +153,18 @@ vn-table {
|
||||||
background-color: $color-font-bg-dark;
|
background-color: $color-font-bg-dark;
|
||||||
color: $color-font-bg;
|
color: $color-font-bg;
|
||||||
}
|
}
|
||||||
|
&.dark-notice {
|
||||||
|
background-color: $color-notice;
|
||||||
|
color: $color-font-bg;
|
||||||
|
}
|
||||||
|
&.yellow {
|
||||||
|
background-color: $color-yellow;
|
||||||
|
color: $color-font-bg;
|
||||||
|
}
|
||||||
|
&.pink {
|
||||||
|
background-color: $color-pink;
|
||||||
|
color: $color-font-bg;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
vn-icon-menu {
|
vn-icon-menu {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
|
@ -101,6 +101,8 @@ $color-marginal: #222;
|
||||||
$color-success: #a3d131;
|
$color-success: #a3d131;
|
||||||
$color-notice: #32b1ce;
|
$color-notice: #32b1ce;
|
||||||
$color-alert: #fa3939;
|
$color-alert: #fa3939;
|
||||||
|
$color-pink: #ff99cc;
|
||||||
|
$color-yellow: #ffff00;
|
||||||
$color-button: $color-secondary;
|
$color-button: $color-secondary;
|
||||||
|
|
||||||
$color-spacer: rgba(255, 255, 255, .3);
|
$color-spacer: rgba(255, 255, 255, .3);
|
||||||
|
|
|
@ -23,7 +23,7 @@ module.exports = Self => {
|
||||||
{
|
{
|
||||||
arg: 'search',
|
arg: 'search',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
description: `If it's and integer searchs by id, otherwise it searchs by client name`,
|
description: `If it's a number searchs by id, otherwise it searchs by client name`,
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -34,31 +34,31 @@ module.exports = Self => {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'id',
|
arg: 'id',
|
||||||
type: 'integer',
|
type: 'number',
|
||||||
description: 'The claim id',
|
description: 'The claim id',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'clientFk',
|
arg: 'clientFk',
|
||||||
type: 'integer',
|
type: 'number',
|
||||||
description: 'The client id',
|
description: 'The client id',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'claimStateFk',
|
arg: 'claimStateFk',
|
||||||
type: 'integer',
|
type: 'number',
|
||||||
description: 'The claim state id',
|
description: 'The claim state id',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'salesPersonFk',
|
arg: 'salesPersonFk',
|
||||||
type: 'integer',
|
type: 'number',
|
||||||
description: 'The salesPerson id',
|
description: 'The salesPerson id',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'attenderFk',
|
arg: 'attenderFk',
|
||||||
type: 'integer',
|
type: 'number',
|
||||||
description: 'The attender worker id',
|
description: 'The attender worker id',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
},
|
},
|
||||||
|
@ -67,6 +67,18 @@ module.exports = Self => {
|
||||||
type: 'date',
|
type: 'date',
|
||||||
description: 'The to date filter',
|
description: 'The to date filter',
|
||||||
http: {source: 'query'}
|
http: {source: 'query'}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'itemFk',
|
||||||
|
type: 'number',
|
||||||
|
description: 'The item id',
|
||||||
|
http: {source: 'query'}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'claimResponsibleFk',
|
||||||
|
type: 'number',
|
||||||
|
description: 'The claimResponsible id',
|
||||||
|
http: {source: 'query'}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
returns: {
|
returns: {
|
||||||
|
@ -80,33 +92,58 @@ module.exports = Self => {
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.filter = async(ctx, filter, options) => {
|
Self.filter = async(ctx, filter, options) => {
|
||||||
|
const models = Self.app.models;
|
||||||
const conn = Self.dataSource.connector;
|
const conn = Self.dataSource.connector;
|
||||||
|
const args = ctx.args;
|
||||||
const myOptions = {};
|
const myOptions = {};
|
||||||
let to;
|
let to;
|
||||||
|
|
||||||
if (typeof options == 'object')
|
if (typeof options == 'object')
|
||||||
Object.assign(myOptions, options);
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
const where = buildFilter(ctx.args, (param, value) => {
|
let claimIdsByItemFk = [];
|
||||||
|
let claimIdsByClaimResponsibleFk = [];
|
||||||
|
|
||||||
|
if (args.itemFk) {
|
||||||
|
query = `SELECT cb.claimFk
|
||||||
|
FROM claimBeginning cb
|
||||||
|
LEFT JOIN sale s ON s.id = cb.saleFk
|
||||||
|
WHERE s.itemFk = ?`;
|
||||||
|
const claims = await Self.rawSql(query, [args.itemFk], myOptions);
|
||||||
|
claimIdsByItemFk = claims.map(claim => claim.claimFk);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.claimResponsibleFk) {
|
||||||
|
const claims = await models.ClaimDevelopment.find({
|
||||||
|
fields: ['claimFk'],
|
||||||
|
where: {claimResponsibleFk: args.claimResponsibleFk}
|
||||||
|
}, myOptions);
|
||||||
|
claimIdsByClaimResponsibleFk = claims.map(claim => claim.claimFk);
|
||||||
|
}
|
||||||
|
|
||||||
|
const where = buildFilter(args, (param, value) => {
|
||||||
switch (param) {
|
switch (param) {
|
||||||
case 'search':
|
case 'search':
|
||||||
return /^\d+$/.test(value)
|
return /^\d+$/.test(value)
|
||||||
? {'cl.id': value}
|
? {'cl.id': value}
|
||||||
: {
|
: {
|
||||||
or: [
|
or: [
|
||||||
{'cl.clientName': {like: `%${value}%`}}
|
{'c.name': {like: `%${value}%`}}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
case 'clientName':
|
case 'clientName':
|
||||||
return {'cl.clientName': {like: `%${value}%`}};
|
return {'c.name': {like: `%${value}%`}};
|
||||||
case 'clientFk':
|
case 'clientFk':
|
||||||
return {'cl.clientFk': value};
|
|
||||||
case 'id':
|
case 'id':
|
||||||
case 'claimStateFk':
|
case 'claimStateFk':
|
||||||
case 'priority':
|
case 'priority':
|
||||||
return {[`cl.${param}`]: value};
|
return {[`cl.${param}`]: value};
|
||||||
|
case 'itemFk':
|
||||||
|
return {'cl.id': {inq: claimIdsByItemFk}};
|
||||||
|
case 'claimResponsibleFk':
|
||||||
|
return {'cl.id': {inq: claimIdsByClaimResponsibleFk}};
|
||||||
case 'salesPersonFk':
|
case 'salesPersonFk':
|
||||||
return {'cl.salesPersonFk': value};
|
return {'c.salesPersonFk': value};
|
||||||
case 'attenderFk':
|
case 'attenderFk':
|
||||||
return {'cl.workerFk': value};
|
return {'cl.workerFk': value};
|
||||||
case 'created':
|
case 'created':
|
||||||
|
@ -118,29 +155,23 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
filter = mergeFilters(ctx.args.filter, {where});
|
filter = mergeFilters(args.filter, {where});
|
||||||
|
|
||||||
const stmts = [];
|
const stmts = [];
|
||||||
|
|
||||||
const stmt = new ParameterizedSQL(
|
const stmt = new ParameterizedSQL(
|
||||||
`SELECT *
|
`SELECT
|
||||||
FROM (
|
cl.id,
|
||||||
SELECT
|
cl.clientFk,
|
||||||
cl.id,
|
c.name AS clientName,
|
||||||
cl.clientFk,
|
cl.workerFk,
|
||||||
c.name AS clientName,
|
u.name AS workerName,
|
||||||
cl.workerFk,
|
cs.description,
|
||||||
u.name AS workerName,
|
cl.created
|
||||||
cs.description,
|
FROM claim cl
|
||||||
cl.created,
|
LEFT JOIN client c ON c.id = cl.clientFk
|
||||||
cs.priority,
|
LEFT JOIN account.user u ON u.id = cl.workerFk
|
||||||
cl.claimStateFk,
|
LEFT JOIN claimState cs ON cs.id = cl.claimStateFk`
|
||||||
c.salesPersonFk
|
|
||||||
FROM claim cl
|
|
||||||
LEFT JOIN client c ON c.id = cl.clientFk
|
|
||||||
LEFT JOIN worker w ON w.id = cl.workerFk
|
|
||||||
LEFT JOIN account.user u ON u.id = w.userFk
|
|
||||||
LEFT JOIN claimState cs ON cs.id = cl.claimStateFk ) cl`
|
|
||||||
);
|
);
|
||||||
|
|
||||||
stmt.merge(conn.makeSuffix(filter));
|
stmt.merge(conn.makeSuffix(filter));
|
||||||
|
|
|
@ -57,4 +57,44 @@ describe('claim filter()', () => {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return 3 results filtering by item id', async() => {
|
||||||
|
const tx = await app.models.Claim.beginTransaction({});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const options = {transaction: tx};
|
||||||
|
|
||||||
|
const result = await app.models.Claim.filter({args: {filter: {}, itemFk: 2}}, null, options);
|
||||||
|
|
||||||
|
expect(result.length).toEqual(3);
|
||||||
|
expect(result[0].id).toEqual(1);
|
||||||
|
expect(result[1].id).toEqual(2);
|
||||||
|
expect(result[2].id).toEqual(4);
|
||||||
|
|
||||||
|
await tx.rollback();
|
||||||
|
} catch (e) {
|
||||||
|
await tx.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return 3 results filtering by claimResponsible id', async() => {
|
||||||
|
const tx = await app.models.Claim.beginTransaction({});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const options = {transaction: tx};
|
||||||
|
|
||||||
|
const result = await app.models.Claim.filter({args: {filter: {}, claimResponsibleFk: 7}}, null, options);
|
||||||
|
|
||||||
|
expect(result.length).toEqual(3);
|
||||||
|
expect(result[0].id).toEqual(2);
|
||||||
|
expect(result[1].id).toEqual(3);
|
||||||
|
expect(result[2].id).toEqual(4);
|
||||||
|
|
||||||
|
await tx.rollback();
|
||||||
|
} catch (e) {
|
||||||
|
await tx.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -58,6 +58,26 @@
|
||||||
ng-model="filter.created">
|
ng-model="filter.created">
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-autocomplete vn-one class="dense"
|
||||||
|
label="Item"
|
||||||
|
url="Items/withName"
|
||||||
|
ng-model="filter.itemFk"
|
||||||
|
show-field="name"
|
||||||
|
value-field="id"
|
||||||
|
search-function="$ctrl.itemSearchFunc($search)"
|
||||||
|
order="id DESC">
|
||||||
|
<tpl-item>{{::id}} - {{::name}}</tpl-item>
|
||||||
|
</vn-autocomplete>
|
||||||
|
<vn-autocomplete
|
||||||
|
vn-one
|
||||||
|
ng-model="filter.claimResponsibleFk"
|
||||||
|
url="ClaimResponsibles"
|
||||||
|
show-field="description"
|
||||||
|
value-field="id"
|
||||||
|
label="Responsible">
|
||||||
|
</vn-autocomplete>
|
||||||
|
</vn-horizontal>
|
||||||
<vn-horizontal class="vn-mt-lg">
|
<vn-horizontal class="vn-mt-lg">
|
||||||
<vn-submit label="Search"></vn-submit>
|
<vn-submit label="Search"></vn-submit>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
import ngModule from '../module';
|
import ngModule from '../module';
|
||||||
import SearchPanel from 'core/components/searchbar/search-panel';
|
import SearchPanel from 'core/components/searchbar/search-panel';
|
||||||
|
|
||||||
|
class Controller extends SearchPanel {
|
||||||
|
itemSearchFunc($search) {
|
||||||
|
return /^\d+$/.test($search)
|
||||||
|
? {id: $search}
|
||||||
|
: {name: {like: '%' + $search + '%'}};
|
||||||
|
}
|
||||||
|
}
|
||||||
ngModule.vnComponent('vnClaimSearchPanel', {
|
ngModule.vnComponent('vnClaimSearchPanel', {
|
||||||
template: require('./index.html'),
|
template: require('./index.html'),
|
||||||
controller: SearchPanel
|
controller: Controller
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
|
||||||
|
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethod('filter', {
|
||||||
|
description: 'Returns all item shelving sale matching with the filter',
|
||||||
|
accessType: 'READ',
|
||||||
|
accepts: [{
|
||||||
|
arg: 'filter',
|
||||||
|
type: 'object',
|
||||||
|
description: 'Filter defining where and paginated data'
|
||||||
|
}],
|
||||||
|
returns: {
|
||||||
|
type: ['object'],
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/filter`,
|
||||||
|
verb: 'GET'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.filter = async(filter, options) => {
|
||||||
|
const conn = Self.dataSource.connector;
|
||||||
|
const myOptions = {};
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
const stmt = new ParameterizedSQL(`
|
||||||
|
SELECT iss.created,
|
||||||
|
iss.saleFk,
|
||||||
|
iss.quantity,
|
||||||
|
iss.userFk,
|
||||||
|
ish.shelvingFk,
|
||||||
|
p.code,
|
||||||
|
u.name
|
||||||
|
FROM itemShelvingSale iss
|
||||||
|
LEFT JOIN itemShelving ish ON iss.itemShelvingFk = ish.id
|
||||||
|
LEFT JOIN shelving s ON ish.shelvingFk = s.code
|
||||||
|
LEFT JOIN parking p ON s.parkingFk = p.id
|
||||||
|
LEFT JOIN account.user u ON u.id = iss.userFk`
|
||||||
|
);
|
||||||
|
|
||||||
|
stmt.merge(conn.makeSuffix(filter));
|
||||||
|
|
||||||
|
return conn.executeStmt(stmt);
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,3 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
require('../methods/item-shelving-sale/filter')(Self);
|
||||||
|
};
|
|
@ -12,21 +12,12 @@
|
||||||
"id": true,
|
"id": true,
|
||||||
"description": "Identifier"
|
"description": "Identifier"
|
||||||
},
|
},
|
||||||
"shelve": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"shelvingFk": {
|
"shelvingFk": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"itemFk": {
|
"itemFk": {
|
||||||
"type": "number"
|
"type": "number"
|
||||||
},
|
},
|
||||||
"deep": {
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
"quantity": {
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
"created": {
|
"created": {
|
||||||
"type": "date"
|
"type": "date"
|
||||||
}
|
}
|
||||||
|
@ -41,6 +32,11 @@
|
||||||
"type": "belongsTo",
|
"type": "belongsTo",
|
||||||
"model": "Account",
|
"model": "Account",
|
||||||
"foreignKey": "userFk"
|
"foreignKey": "userFk"
|
||||||
|
},
|
||||||
|
"shelving": {
|
||||||
|
"type": "belongsTo",
|
||||||
|
"model": "Shelving",
|
||||||
|
"foreignKey": "shelvingFk"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('salePreparingList', {
|
||||||
|
description: 'Returns a list with the lines of a ticket and its different states of preparation',
|
||||||
|
accessType: 'READ',
|
||||||
|
accepts: [{
|
||||||
|
arg: 'id',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'The ticket id',
|
||||||
|
http: {source: 'path'}
|
||||||
|
}],
|
||||||
|
returns: {
|
||||||
|
type: ['object'],
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/:id/salePreparingList`,
|
||||||
|
verb: 'GET'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.salePreparingList = async(ctx, id, options) => {
|
||||||
|
const myOptions = {};
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
query = `CALL vn.salePreparingList(?)`;
|
||||||
|
const [sales] = await Self.rawSql(query, [id], myOptions);
|
||||||
|
|
||||||
|
return sales;
|
||||||
|
};
|
||||||
|
};
|
|
@ -1,5 +1,6 @@
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
require('../methods/sale/getClaimableFromTicket')(Self);
|
require('../methods/sale/getClaimableFromTicket')(Self);
|
||||||
|
require('../methods/sale/salePreparingList')(Self);
|
||||||
require('../methods/sale/reserve')(Self);
|
require('../methods/sale/reserve')(Self);
|
||||||
require('../methods/sale/deleteSales')(Self);
|
require('../methods/sale/deleteSales')(Self);
|
||||||
require('../methods/sale/updatePrice')(Self);
|
require('../methods/sale/updatePrice')(Self);
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
<vn-crud-model
|
<vn-crud-model
|
||||||
vn-id="model"
|
vn-id="model"
|
||||||
url="SaleTrackings/listSaleTracking"
|
url="sales"
|
||||||
|
filter="::$ctrl.filter"
|
||||||
link="{ticketFk: $ctrl.$params.id}"
|
link="{ticketFk: $ctrl.$params.id}"
|
||||||
limit="20"
|
limit="20"
|
||||||
data="sales"
|
data="$ctrl.sales"
|
||||||
order="itemFk DESC"
|
order="concept ASC"
|
||||||
auto-load="true">
|
auto-load="true">
|
||||||
</vn-crud-model>
|
</vn-crud-model>
|
||||||
<vn-data-viewer model="model">
|
<vn-data-viewer model="model">
|
||||||
|
@ -12,31 +13,27 @@
|
||||||
<vn-table model="model">
|
<vn-table model="model">
|
||||||
<vn-thead>
|
<vn-thead>
|
||||||
<vn-tr>
|
<vn-tr>
|
||||||
<vn-th shrink></vn-th>
|
<vn-th field="isChecked" center>Is checked</vn-th>
|
||||||
<vn-th field="itemFk" number>Item</vn-th>
|
<vn-th field="itemFk" number>Item</vn-th>
|
||||||
<vn-th expand>Description</vn-th>
|
<vn-th field="concept">Description</vn-th>
|
||||||
<vn-th field="quantity" number>Quantity</vn-th>
|
<vn-th field="quantity" number>Quantity</vn-th>
|
||||||
<vn-th field="originalQuantity" number>Original</vn-th>
|
<vn-th></vn-th>
|
||||||
<vn-th field="workerFk">Worker</vn-th>
|
|
||||||
<vn-th field="state" shrink>State</vn-th>
|
|
||||||
<vn-th field="created" expand>Created</vn-th>
|
|
||||||
</vn-tr>
|
</vn-tr>
|
||||||
</vn-thead>
|
</vn-thead>
|
||||||
<vn-tbody>
|
<vn-tbody>
|
||||||
<vn-tr ng-repeat="sale in sales">
|
<vn-tr ng-repeat="sale in $ctrl.sales">
|
||||||
<vn-td shrink>
|
<vn-td center>
|
||||||
<vn-icon
|
<span class="chip {{$ctrl.chipHasSaleGroupDetail(sale.preparingList.hasSaleGroupDetail)}} vn-mx-xs chip2" vn-tooltip="has saleGroupDetail"></span>
|
||||||
class="bright"
|
<span class="chip {{$ctrl.chipIsPreviousSelected(sale.preparingList.isPreviousSelected)}} vn-ml-xs" vn-tooltip="is previousSelected"></span>
|
||||||
icon="warning"
|
<span class="chip {{$ctrl.chipIsPrevious(sale.preparingList.isPrevious)}} vn-mr-xs" vn-tooltip="is previous"></span>
|
||||||
ng-if="sale.quantity != sale.originalQuantity"
|
<span class="chip {{$ctrl.chipIsPrepared(sale.preparingList.isPrepared)}} vn-mx-xs" vn-tooltip="is prepared"></span>
|
||||||
vn-tooltip="The quantity do not match">
|
<span class="chip {{$ctrl.chipIsControled(sale.preparingList.isControled)}} vn-mx-xs" vn-tooltip="is controled"></span>
|
||||||
</vn-icon>
|
|
||||||
</vn-td>
|
</vn-td>
|
||||||
<vn-td number>
|
<vn-td number>
|
||||||
<span
|
<span
|
||||||
ng-click="itemDescriptor.show($event, sale.itemFk, sale.id)"
|
ng-click="$ctrl.showItemDescriptor($event, sale)"
|
||||||
class="link">
|
class="link">
|
||||||
{{sale.itemFk | zeroFill:6}}
|
{{::sale.itemFk | zeroFill:6}}
|
||||||
</span>
|
</span>
|
||||||
</vn-td>
|
</vn-td>
|
||||||
<vn-td vn-fetched-tags>
|
<vn-td vn-fetched-tags>
|
||||||
|
@ -53,16 +50,18 @@
|
||||||
</vn-fetched-tags>
|
</vn-fetched-tags>
|
||||||
</vn-td>
|
</vn-td>
|
||||||
<vn-td number>{{::sale.quantity}}</vn-td>
|
<vn-td number>{{::sale.quantity}}</vn-td>
|
||||||
<vn-td number>{{::sale.originalQuantity}}</vn-td>
|
<vn-td actions>
|
||||||
<vn-td expand>
|
<vn-icon-button
|
||||||
<span
|
vn-click-stop="$ctrl.showSaleTracking(sale)"
|
||||||
class="link"
|
vn-tooltip="Sale tracking"
|
||||||
ng-click="workerDescriptor.show($event, sale.workerFk)">
|
icon="history">
|
||||||
{{::sale.userNickname | dashIfEmpty}}
|
</vn-icon-button>
|
||||||
</span>
|
<vn-icon-button
|
||||||
|
vn-click-stop="$ctrl.showItemShelvingSale(sale)"
|
||||||
|
vn-tooltip="ItemShelvings sale"
|
||||||
|
icon="icon-inventory">
|
||||||
|
</vn-icon-button>
|
||||||
</vn-td>
|
</vn-td>
|
||||||
<vn-td shrink>{{::sale.state}}</vn-td>
|
|
||||||
<vn-td expand>{{::sale.created | date: 'dd/MM/yyyy HH:mm'}}</vn-td>
|
|
||||||
</vn-tr>
|
</vn-tr>
|
||||||
</vn-tbody>
|
</vn-tbody>
|
||||||
</vn-table>
|
</vn-table>
|
||||||
|
@ -70,8 +69,99 @@
|
||||||
</vn-data-viewer>
|
</vn-data-viewer>
|
||||||
<vn-item-descriptor-popover
|
<vn-item-descriptor-popover
|
||||||
vn-id="item-descriptor"
|
vn-id="item-descriptor"
|
||||||
warehouse-fk="$ctrl.ticket.warehouseFk">
|
warehouse-fk="$ctrl.ticket.warehouseFk"
|
||||||
|
ticket-fk="$ctrl.ticket.id">
|
||||||
</vn-item-descriptor-popover>
|
</vn-item-descriptor-popover>
|
||||||
<vn-worker-descriptor-popover
|
|
||||||
vn-id="worker-descriptor">
|
<vn-popup vn-id="saleTracking">
|
||||||
</vn-worker-descriptor-popover>
|
<vn-crud-model
|
||||||
|
vn-id="modelSaleTracking"
|
||||||
|
url="SaleTrackings/listSaleTracking"
|
||||||
|
link="{saleFk: $ctrl.saleId}"
|
||||||
|
limit="20"
|
||||||
|
data="saleTrackings"
|
||||||
|
order="itemFk DESC"
|
||||||
|
auto-load="true">
|
||||||
|
</vn-crud-model>
|
||||||
|
<vn-data-viewer model="modelSaleTracking">
|
||||||
|
<vn-card class="vn-w-lg">
|
||||||
|
<vn-table model="modelSaleTracking">
|
||||||
|
<vn-thead>
|
||||||
|
<vn-tr>
|
||||||
|
<vn-th field="quantity" number>Quantity</vn-th>
|
||||||
|
<vn-th field="originalQuantity" number>Original</vn-th>
|
||||||
|
<vn-th field="workerFk">Worker</vn-th>
|
||||||
|
<vn-th field="state" shrink>State</vn-th>
|
||||||
|
<vn-th field="created" expand>Created</vn-th>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-thead>
|
||||||
|
<vn-tbody>
|
||||||
|
<vn-tr ng-repeat="sale in saleTrackings">
|
||||||
|
<vn-td number>{{::sale.quantity}}</vn-td>
|
||||||
|
<vn-td number>{{::sale.originalQuantity}}</vn-td>
|
||||||
|
<vn-td expand>
|
||||||
|
<span
|
||||||
|
class="link"
|
||||||
|
ng-click="workerDescriptor.show($event, sale.workerFk)">
|
||||||
|
{{::sale.userNickname | dashIfEmpty}}
|
||||||
|
</span>
|
||||||
|
</vn-td>
|
||||||
|
<vn-td shrink>{{::sale.state}}</vn-td>
|
||||||
|
<vn-td expand>{{::sale.created | date: 'dd/MM/yyyy HH:mm'}}</vn-td>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-tbody>
|
||||||
|
</vn-table>
|
||||||
|
</vn-card>
|
||||||
|
</vn-data-viewer>
|
||||||
|
<vn-item-descriptor-popover
|
||||||
|
vn-id="item-descriptor"
|
||||||
|
warehouse-fk="$ctrl.ticket.warehouseFk">
|
||||||
|
</vn-item-descriptor-popover>
|
||||||
|
<vn-worker-descriptor-popover
|
||||||
|
vn-id="worker-descriptor">
|
||||||
|
</vn-worker-descriptor-popover>
|
||||||
|
</vn-popup>
|
||||||
|
|
||||||
|
<vn-popup vn-id="itemShelvingSale">
|
||||||
|
<vn-crud-model
|
||||||
|
vn-id="modelSaleTracking"
|
||||||
|
url="ItemShelvingSales/filter"
|
||||||
|
link="{saleFk: $ctrl.saleId}"
|
||||||
|
limit="20"
|
||||||
|
data="$ctrl.itemShelvingSales"
|
||||||
|
auto-load="true">
|
||||||
|
</vn-crud-model>
|
||||||
|
<vn-data-viewer model="modelSaleTracking">
|
||||||
|
<vn-card class="vn-w-lg">
|
||||||
|
<vn-table model="modelSaleTracking">
|
||||||
|
<vn-thead>
|
||||||
|
<vn-tr>
|
||||||
|
<vn-th field="quantity" number>Quantity</vn-th>
|
||||||
|
<vn-th field="workerFk">Worker</vn-th>
|
||||||
|
<vn-th field="shelving" shrink>Shelving</vn-th>
|
||||||
|
<vn-th field="parking" shrink>Parking</vn-th>
|
||||||
|
<vn-th field="created" expand>Created</vn-th>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-thead>
|
||||||
|
<vn-tbody>
|
||||||
|
<vn-tr ng-repeat="itemShelvingSale in $ctrl.itemShelvingSales">
|
||||||
|
<vn-td number>{{::itemShelvingSale.quantity}}</vn-td>
|
||||||
|
<vn-td expand>
|
||||||
|
<span
|
||||||
|
class="link"
|
||||||
|
ng-click="workerDescriptor.show($event, itemShelvingSale.userFk)">
|
||||||
|
{{::itemShelvingSale.name | dashIfEmpty}}
|
||||||
|
</span>
|
||||||
|
</vn-td>
|
||||||
|
<vn-td shrink>{{::itemShelvingSale.shelvingFk}}</vn-td>
|
||||||
|
<vn-td shrink>{{::itemShelvingSale.code}}</vn-td>
|
||||||
|
<vn-td expand>{{::itemShelvingSale.created | date: 'dd/MM/yyyy HH:mm'}}</vn-td>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-tbody>
|
||||||
|
</vn-table>
|
||||||
|
</vn-card>
|
||||||
|
</vn-data-viewer>
|
||||||
|
<vn-worker-descriptor-popover
|
||||||
|
vn-id="worker-descriptor">
|
||||||
|
</vn-worker-descriptor-popover>
|
||||||
|
</vn-popup>
|
||||||
|
|
|
@ -1,12 +1,100 @@
|
||||||
import ngModule from '../module';
|
import ngModule from '../module';
|
||||||
import Section from 'salix/components/section';
|
import Section from 'salix/components/section';
|
||||||
|
import './style.scss';
|
||||||
|
|
||||||
class Controller extends Section {}
|
class Controller extends Section {
|
||||||
|
constructor($element, $) {
|
||||||
|
super($element, $);
|
||||||
|
this.filter = {
|
||||||
|
include: [
|
||||||
|
{
|
||||||
|
relation: 'item'
|
||||||
|
}, {
|
||||||
|
relation: 'saleTracking',
|
||||||
|
scope: {
|
||||||
|
fields: ['isChecked']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
get sales() {
|
||||||
|
return this._sales;
|
||||||
|
}
|
||||||
|
|
||||||
|
set sales(value) {
|
||||||
|
this._sales = value;
|
||||||
|
if (value) {
|
||||||
|
const query = `Sales/${this.$params.id}/salePreparingList`;
|
||||||
|
this.$http.get(query)
|
||||||
|
.then(res => {
|
||||||
|
this.salePreparingList = res.data;
|
||||||
|
for (const salePreparing of this.salePreparingList) {
|
||||||
|
for (const sale of this.sales) {
|
||||||
|
if (salePreparing.saleFk == sale.id)
|
||||||
|
sale.preparingList = salePreparing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
showItemDescriptor(event, sale) {
|
||||||
|
this.quicklinks = {
|
||||||
|
btnThree: {
|
||||||
|
icon: 'icon-transaction',
|
||||||
|
state: `item.card.diary({
|
||||||
|
id: ${sale.itemFk},
|
||||||
|
warehouseFk: ${this.ticket.warehouseFk},
|
||||||
|
lineFk: ${sale.id}
|
||||||
|
})`,
|
||||||
|
tooltip: 'Item diary'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.$.itemDescriptor.show(event.target, sale.itemFk);
|
||||||
|
}
|
||||||
|
|
||||||
|
chipHasSaleGroupDetail(hasSaleGroupDetail) {
|
||||||
|
if (hasSaleGroupDetail) return 'pink';
|
||||||
|
else return 'message';
|
||||||
|
}
|
||||||
|
|
||||||
|
chipIsPreviousSelected(isPreviousSelected) {
|
||||||
|
if (isPreviousSelected) return 'notice';
|
||||||
|
else return 'message';
|
||||||
|
}
|
||||||
|
|
||||||
|
chipIsPrevious(isPrevious) {
|
||||||
|
if (isPrevious) return 'dark-notice';
|
||||||
|
else return 'message';
|
||||||
|
}
|
||||||
|
|
||||||
|
chipIsPrepared(isPrepared) {
|
||||||
|
if (isPrepared) return 'warning';
|
||||||
|
else return 'message';
|
||||||
|
}
|
||||||
|
|
||||||
|
chipIsControled(isControled) {
|
||||||
|
if (isControled) return 'yellow';
|
||||||
|
else return 'message';
|
||||||
|
}
|
||||||
|
|
||||||
|
showSaleTracking(sale) {
|
||||||
|
this.saleId = sale.id;
|
||||||
|
this.$.saleTracking.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
showItemShelvingSale(sale) {
|
||||||
|
this.saleId = sale.id;
|
||||||
|
this.$.itemShelvingSale.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ngModule.vnComponent('vnTicketSaleTracking', {
|
ngModule.vnComponent('vnTicketSaleTracking', {
|
||||||
template: require('./index.html'),
|
template: require('./index.html'),
|
||||||
controller: Controller,
|
controller: Controller,
|
||||||
bindings: {
|
bindings: {
|
||||||
ticket: '<',
|
ticket: '<'
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
ItemShelvings sale: Carros línea
|
||||||
|
has saleGroupDetail: tiene detalle grupo lineas
|
||||||
|
is previousSelected: es previa seleccionada
|
||||||
|
is previous: es previa
|
||||||
|
is prepared: esta preparado
|
||||||
|
is controled: esta controlado
|
|
@ -0,0 +1,7 @@
|
||||||
|
@import "variables";
|
||||||
|
|
||||||
|
.chip {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 15px;
|
||||||
|
min-height: 25px;
|
||||||
|
}
|
Loading…
Reference in New Issue