dev #1731

Merged
jgallego merged 105 commits from dev into test 2023-08-31 09:13:29 +00:00
8 changed files with 166 additions and 117 deletions
Showing only changes of commit d727ea83ab - Show all commits

View File

@ -31,23 +31,25 @@ module.exports = Self => {
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);
// const [itemShelvingSale] = await models.ItemShelvingSale.find({saleFk: saleFk}, myOptions); const itemShelvingSales = await models.ItemShelvingSale.find({saleFk: saleFk}, myOptions);
// if (itemShelvingSale) await itemShelvingSale.destroy(myOptions); for (let itemShelvingSale of itemShelvingSales)
await itemShelvingSale.destroy(myOptions);
// const filter = { const filter = {
// where: { where: {
// saleFk: saleFk, saleFk: saleFk,
// code: stateCode code: stateCode
// } }
// }; };
// const [saleTracking] = await models.SaleTracking.find(filter, myOptions); const saleTrackings = await models.SaleTracking.find(filter, myOptions);
// return saleTracking.destroy(myOptions); for (let saleTracking of saleTrackings)
await saleTracking.destroy(myOptions);
query = `CALL vn.saleTracking_del(?, ?)`; // query = `CALL vn.saleTracking_del(?, ?)`;
return Self.rawSql(query, // return Self.rawSql(query,
[ // [
saleFk, // saleFk,
stateCode, // stateCode,
], myOptions); // ], myOptions);
}; };
}; };

View File

@ -40,30 +40,31 @@ module.exports = Self => {
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);
// const state = await models.State.findOne({ const state = await models.State.findOne({
// where: {code: stateCode} where: {code: stateCode}
// }, myOptions); }, myOptions);
// if (!state) return; if (!state) return;
// const data = { const data = {
// saleFk: saleFk, saleFk: saleFk,
// isChecked: isChecked, isChecked: isChecked,
// originalQuantity: quantity, originalQuantity: quantity,
// workerFk: userId, workerFk: userId,
// stateFk: state.id stateFk: state.id
// }; };
// return models.SaleTracking.replaceOrCreate(data, myOptions); return models.SaleTracking.replaceOrCreate(data, myOptions);
query = `CALL vn.saleTracking_new(?, ?, ?, ?, ?, ?)`; // query = `CALL vn.saleTracking_new(?, ?, ?, ?, ?, ?, ?)`;
return Self.rawSql(query, // return Self.rawSql(query,
[ // [
saleFk, // saleFk,
isChecked, // isChecked,
quantity, // quantity,
userId, // userId,
stateCode, // stateCode,
null // 'parameterToDelete',
], myOptions); // null
// ], myOptions);
}; };
}; };

View File

@ -0,0 +1,99 @@
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
module.exports = Self => {
Self.remoteMethod('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'}
},
{
arg: 'filter',
type: 'object',
description: 'Filter defining where and paginated data'
}
],
returns: {
type: ['object'],
root: true
},
http: {
path: `/:id/salePreparingList`,
verb: 'GET'
}
});
Self.salePreparingList = async(id, filter, options) => {
const conn = Self.dataSource.connector;
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
const stmts = [];
let stmt;
stmts.push('CALL cache.last_buy_refresh(FALSE)');
stmt = new ParameterizedSQL(
`SELECT t.clientFk,
t.shipped,
a.nickname,
s.ticketFk,
s.itemFk,
s.quantity,
s.concept,
s.reserved,
s.id saleFk,
i.size,
i.inkFk,
i.stems,
i.image,
i.subName,
b.grouping,
IF(stPrevious.saleFk,TRUE,FALSE) as isPreviousSelected,
stPrevious.isChecked as isPrevious,
stPrepared.isChecked as isPrepared,
stControled.isChecked as isControled,
ib.code as barcode,
(MAX(sgd.id) IS NOT NULL) AS hasSaleGroupDetail,
p.code AS parkingCode,
i.value5,
i.value6,
i.value7,
i.value8,
i.value9,
i.value10
FROM vn.ticket t
JOIN vn.address a ON a.id = t.addressFk
JOIN vn.sale s ON s.ticketFk = t.id
JOIN vn.item i ON i.id = s.itemFk
LEFT JOIN cache.last_buy lb ON lb.item_id = i.id AND lb.warehouse_id = t.warehouseFk
LEFT JOIN vn.buy b ON b.id = lb.buy_id
LEFT JOIN vn.saleTracking stPrevious ON stPrevious.saleFk = s.id AND stPrevious.stateFk = 26
LEFT JOIN vn.saleTracking stPrepared ON stPrepared.saleFk = s.id AND stPrepared.stateFk = 14
LEFT JOIN vn.saleTracking stControled ON stControled.saleFk = s.id AND stControled.stateFk = 8
LEFT JOIN vn.itemBarcode ib ON ib.itemFk = i.id
LEFT JOIN vn.saleGroupDetail sgd ON sgd.saleFk = s.id
LEFT JOIN vn.saleGroup sg ON sg.id = sgd.saleGroupFk
LEFT JOIN vn.parking p ON p.id = sg.parkingFk
WHERE t.id = ?
GROUP BY s.id`, [id]);
stmts.push(stmt);
stmt.merge(Self.makeSuffix(filter));
const index = stmts.push(stmt) - 1;
const sql = ParameterizedSQL.join(stmts, ';');
const result = await conn.executeStmt(sql, myOptions);
return result[index];
};
};

View File

@ -1,33 +0,0 @@
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;
};
};

View File

@ -1,4 +1,5 @@
module.exports = Self => { module.exports = Self => {
require('../methods/sale-tracking/salePreparingList')(Self);
require('../methods/sale-tracking/listSaleTracking')(Self); require('../methods/sale-tracking/listSaleTracking')(Self);
require('../methods/sale-tracking/replace')(Self); require('../methods/sale-tracking/replace')(Self);
require('../methods/sale-tracking/delete')(Self); require('../methods/sale-tracking/delete')(Self);

View File

@ -1,6 +1,5 @@
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);

View File

@ -1,8 +1,6 @@
<vn-crud-model <vn-crud-model
vn-id="model" vn-id="model"
url="Sales" url="SaleTrackings/{{$ctrl.$params.id}}/salePreparingList"
filter="::$ctrl.filter"
link="{ticketFk: $ctrl.$params.id}"
limit="20" limit="20"
data="$ctrl.sales" data="$ctrl.sales"
order="concept ASC" order="concept ASC"
@ -26,8 +24,8 @@
<vn-td center> <vn-td center>
<vn-chip <vn-chip
ng-class="{ ng-class="{
'pink': sale.preparingList.hasSaleGroupDetail, 'pink': sale.hasSaleGroupDetail,
'none': !sale.preparingList.hasSaleGroupDetail, 'none': !sale.hasSaleGroupDetail,
}" }"
class="circleState" class="circleState"
vn-tooltip="has saleGroupDetail" vn-tooltip="has saleGroupDetail"
@ -35,8 +33,8 @@
</vn-chip> </vn-chip>
<vn-chip <vn-chip
ng-class="{ ng-class="{
'notice': sale.preparingList.isPreviousSelected, 'notice': sale.isPreviousSelected,
'none': !sale.preparingList.isPreviousSelected, 'none': !sale.isPreviousSelected,
}" }"
class="circleState" class="circleState"
vn-tooltip="is previousSelected" vn-tooltip="is previousSelected"
@ -44,24 +42,24 @@
</vn-chip> </vn-chip>
<vn-chip <vn-chip
ng-class="{ ng-class="{
'dark-notice': sale.preparingList.isPrevious, 'dark-notice': sale.isPrevious,
'none': !sale.preparingList.isPrevious, 'none': !sale.isPrevious,
}" }"
class="circleState" class="circleState"
vn-tooltip="is previous"> vn-tooltip="is previous">
</vn-chip> </vn-chip>
<vn-chip <vn-chip
ng-class="{ ng-class="{
'warning': sale.preparingList.isPrepared, 'warning': sale.isPrepared,
'none': !sale.preparingList.isPrepared, 'none': !sale.isPrepared,
}" }"
class="circleState" class="circleState"
vn-tooltip="is prepared"> vn-tooltip="is prepared">
</vn-chip> </vn-chip>
<vn-chip <vn-chip
ng-class="{ ng-class="{
'yellow': sale.preparingList.isControled, 'yellow': sale.isControled,
'none': !sale.preparingList.isControled, 'none': !sale.isControled,
}" }"
class="circleState" class="circleState"
vn-tooltip="is controled"> vn-tooltip="is controled">
@ -69,26 +67,26 @@
</vn-td> </vn-td>
<vn-td number> <vn-td number>
<span <span
ng-click="itemDescriptor.show($event, sale.item.id)" ng-click="itemDescriptor.show($event, sale.itemFk)"
class="link"> class="link">
{{::sale.item.id}} {{::sale.itemFk}}
</span> </span>
</vn-td> </vn-td>
<vn-td vn-fetched-tags> <vn-td vn-fetched-tags>
<div> <div>
<vn-one title="{{::sale.item.name}}">{{::sale.item.name}}</vn-one> <vn-one title="{{::sale.concept}}">{{::sale.concept}}</vn-one>
<vn-one ng-if="::sale.item.subName"> <vn-one ng-if="::sale.subName">
<h3 title="{{::sale.item.subName}}">{{::sale.item.subName}}</h3> <h3 title="{{::sale.subName}}">{{::sale.subName}}</h3>
</vn-one> </vn-one>
</div> </div>
<vn-fetched-tags <vn-fetched-tags
max-length="6" max-length="6"
item="::sale.item" item="::sale"
tabindex="-1"> tabindex="-1">
</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 center>{{::sale.saleGroupDetail.saleGroup.parking.code | dashIfEmpty}}</vn-td> <vn-td center>{{::sale.parkingCode | dashIfEmpty}}</vn-td>
<vn-td actions> <vn-td actions>
<vn-icon-button <vn-icon-button
vn-click-stop="$ctrl.showSaleTracking(sale)" vn-click-stop="$ctrl.showSaleTracking(sale)"

View File

@ -38,24 +38,6 @@ class Controller extends Section {
}; };
} }
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 => {
res.data.forEach(salePreparing => {
const sale = this.sales.find(sale => salePreparing.saleFk === sale.id);
if (sale) sale.preparingList = salePreparing;
});
});
}
}
showItemDescriptor(event, sale) { showItemDescriptor(event, sale) {
this.quicklinks = { this.quicklinks = {
btnThree: { btnThree: {
@ -72,29 +54,29 @@ class Controller extends Section {
} }
showSaleTracking(sale) { showSaleTracking(sale) {
this.saleId = sale.id; this.saleId = sale.saleFk;
this.$.saleTracking.show(); this.$.saleTracking.show();
} }
showItemShelvingSale(sale) { showItemShelvingSale(sale) {
this.saleId = sale.id; this.saleId = sale.saleFk;
this.$.itemShelvingSale.show(); this.$.itemShelvingSale.show();
} }
clickPreviousSelected(index) { clickPreviousSelected(index) {
const sale = this.sales[index]; const sale = this.sales[index];
if (!sale.preparingList.isPreviousSelected) { if (!sale.isPreviousSelected) {
this.saleTrackingNew(sale, 'PREVIOUS_PREPARATION', false); this.saleTrackingNew(sale, 'PREVIOUS_PREPARATION', false);
sale.preparingList.isPreviousSelected = true; sale.isPreviousSelected = true;
} else { } else {
this.saleTrackingDel(sale, 'PREVIOUS_PREPARATION'); this.saleTrackingDel(sale, 'PREVIOUS_PREPARATION');
sale.preparingList.isPreviousSelected = false; sale.isPreviousSelected = false;
} }
} }
saleTrackingNew(sale, stateCode, isChecked) { saleTrackingNew(sale, stateCode, isChecked) {
const params = { const params = {
saleFk: sale.id, saleFk: sale.saleFk,
isChecked: isChecked, isChecked: isChecked,
quantity: sale.quantity, quantity: sale.quantity,
stateCode: stateCode stateCode: stateCode
@ -106,7 +88,7 @@ class Controller extends Section {
saleTrackingDel(sale, stateCode) { saleTrackingDel(sale, stateCode) {
const params = { const params = {
saleFk: sale.id, saleFk: sale.saleFk,
stateCode: stateCode stateCode: stateCode
}; };
this.$http.post(`SaleTrackings/delete`, params).then(() => { this.$http.post(`SaleTrackings/delete`, params).then(() => {