Merge branch 'dev' into 4930-add-zone
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
This commit is contained in:
commit
1597c40a16
|
@ -0,0 +1,23 @@
|
||||||
|
DROP FUNCTION IF EXISTS `vn`.`priceFixed_getRate2`;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE FUNCTION `vn`.`priceFixed_getRate2`(vFixedPriceFk INT, vRate3 DOUBLE)
|
||||||
|
RETURNS DOUBLE
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
DECLARE vWarehouse INT;
|
||||||
|
DECLARE vRate2 DOUBLE;
|
||||||
|
|
||||||
|
SELECT round(vRate3 * (1 + ((r.rate2 - r.rate3)/100)), 2) INTO vRate2
|
||||||
|
FROM vn.rate r
|
||||||
|
JOIN vn.priceFixed p ON p.id = vFixedPriceFk
|
||||||
|
WHERE r.dated <= p.started
|
||||||
|
AND r.warehouseFk = p.warehouseFk
|
||||||
|
ORDER BY r.dated DESC
|
||||||
|
LIMIT 1;
|
||||||
|
|
||||||
|
RETURN vRate2;
|
||||||
|
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -417,8 +417,8 @@ export default {
|
||||||
fourthFixedPrice: 'vn-fixed-price tr:nth-child(5)',
|
fourthFixedPrice: 'vn-fixed-price tr:nth-child(5)',
|
||||||
fourthItemID: 'vn-fixed-price tr:nth-child(5) vn-autocomplete[ng-model="price.itemFk"]',
|
fourthItemID: 'vn-fixed-price tr:nth-child(5) vn-autocomplete[ng-model="price.itemFk"]',
|
||||||
fourthWarehouse: 'vn-fixed-price tr:nth-child(5) vn-autocomplete[ng-model="price.warehouseFk"]',
|
fourthWarehouse: 'vn-fixed-price tr:nth-child(5) vn-autocomplete[ng-model="price.warehouseFk"]',
|
||||||
fourthPPU: 'vn-fixed-price tr:nth-child(5) > td:nth-child(4)',
|
fourthGroupingPrice: 'vn-fixed-price tr:nth-child(5) > td:nth-child(4)',
|
||||||
fourthPPP: 'vn-fixed-price tr:nth-child(5) > td:nth-child(5)',
|
fourthPackingPrice: 'vn-fixed-price tr:nth-child(5) > td:nth-child(5)',
|
||||||
fourthHasMinPrice: 'vn-fixed-price tr:nth-child(5) > td:nth-child(6) > vn-check[ng-model="price.hasMinPrice"]',
|
fourthHasMinPrice: 'vn-fixed-price tr:nth-child(5) > td:nth-child(6) > vn-check[ng-model="price.hasMinPrice"]',
|
||||||
fourthMinPrice: 'vn-fixed-price tr:nth-child(5) > td:nth-child(6) > vn-input-number[ng-model="price.minPrice"]',
|
fourthMinPrice: 'vn-fixed-price tr:nth-child(5) > td:nth-child(6) > vn-input-number[ng-model="price.minPrice"]',
|
||||||
fourthStarted: 'vn-fixed-price tr:nth-child(5) vn-date-picker[ng-model="price.started"]',
|
fourthStarted: 'vn-fixed-price tr:nth-child(5) vn-date-picker[ng-model="price.started"]',
|
||||||
|
|
|
@ -24,8 +24,8 @@ describe('Item fixed prices path', () => {
|
||||||
it('should fill the fixed price data', async() => {
|
it('should fill the fixed price data', async() => {
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
await page.autocompleteSearch(selectors.itemFixedPrice.fourthWarehouse, 'Warehouse one');
|
await page.autocompleteSearch(selectors.itemFixedPrice.fourthWarehouse, 'Warehouse one');
|
||||||
await page.write(selectors.itemFixedPrice.fourthPPU, '1');
|
await page.writeOnEditableTD(selectors.itemFixedPrice.fourthGroupingPrice, '1');
|
||||||
await page.write(selectors.itemFixedPrice.fourthPPP, '1');
|
await page.writeOnEditableTD(selectors.itemFixedPrice.fourthPackingPrice, '1');
|
||||||
await page.write(selectors.itemFixedPrice.fourthMinPrice, '1');
|
await page.write(selectors.itemFixedPrice.fourthMinPrice, '1');
|
||||||
await page.pickDate(selectors.itemFixedPrice.fourthStarted, now);
|
await page.pickDate(selectors.itemFixedPrice.fourthStarted, now);
|
||||||
await page.pickDate(selectors.itemFixedPrice.fourthEnded, now);
|
await page.pickDate(selectors.itemFixedPrice.fourthEnded, now);
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethod('getRate2', {
|
||||||
|
description: 'Return the rate2',
|
||||||
|
accessType: 'READ',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'fixedPriceId',
|
||||||
|
type: 'integer',
|
||||||
|
description: 'The fixedPrice Id',
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'rate3',
|
||||||
|
type: 'number',
|
||||||
|
description: `The price rate 3`,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: {
|
||||||
|
type: 'object',
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/getRate2`,
|
||||||
|
verb: 'GET'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.getRate2 = async(fixedPriceId, rate3, options) => {
|
||||||
|
const myOptions = {};
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
const [result] = await Self.rawSql(`SELECT vn.priceFixed_getRate2(?, ?) as rate2`,
|
||||||
|
[fixedPriceId, rate3], myOptions);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,39 @@
|
||||||
|
const models = require('vn-loopback/server/server').models;
|
||||||
|
|
||||||
|
describe('getRate2()', () => {
|
||||||
|
it(`should return new rate2 if exists rate`, async() => {
|
||||||
|
const tx = await models.FixedPrice.beginTransaction({});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const options = {transaction: tx};
|
||||||
|
const fixedPriceId = 1;
|
||||||
|
const rate3 = 2;
|
||||||
|
const result = await models.FixedPrice.getRate2(fixedPriceId, rate3, options);
|
||||||
|
|
||||||
|
expect(result.rate2).toEqual(1.9);
|
||||||
|
|
||||||
|
await tx.rollback();
|
||||||
|
} catch (e) {
|
||||||
|
await tx.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should return null if not exists rate`, async() => {
|
||||||
|
const tx = await models.FixedPrice.beginTransaction({});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const options = {transaction: tx};
|
||||||
|
const fixedPriceId = 13;
|
||||||
|
const rate3 = 2;
|
||||||
|
const result = await models.FixedPrice.getRate2(fixedPriceId, rate3, options);
|
||||||
|
|
||||||
|
expect(result.rate2).toEqual(null);
|
||||||
|
|
||||||
|
await tx.rollback();
|
||||||
|
} catch (e) {
|
||||||
|
await tx.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,4 +1,5 @@
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
require('../methods/fixed-price/filter')(Self);
|
require('../methods/fixed-price/filter')(Self);
|
||||||
require('../methods/fixed-price/upsertFixedPrice')(Self);
|
require('../methods/fixed-price/upsertFixedPrice')(Self);
|
||||||
|
require('../methods/fixed-price/getRate2')(Self);
|
||||||
};
|
};
|
||||||
|
|
|
@ -41,14 +41,12 @@
|
||||||
<span translate>Warehouse</span>
|
<span translate>Warehouse</span>
|
||||||
</th>
|
</th>
|
||||||
<th
|
<th
|
||||||
field="rate2"
|
field="rate2">
|
||||||
vn-tooltip="Price By Unit">
|
<span translate>Grouping price</span>
|
||||||
<span translate>P.P.U.</span>
|
|
||||||
</th>
|
</th>
|
||||||
<th
|
<th
|
||||||
field="rate3"
|
field="rate3">
|
||||||
vn-tooltip="Price By Package">
|
<span translate>Packing price</span>
|
||||||
<span translate>P.P.P.</span>
|
|
||||||
</th>
|
</th>
|
||||||
<th field="minPrice">
|
<th field="minPrice">
|
||||||
<span translate>Min price</span>
|
<span translate>Min price</span>
|
||||||
|
@ -72,7 +70,7 @@
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
search-function="$ctrl.itemSearchFunc($search)"
|
search-function="$ctrl.itemSearchFunc($search)"
|
||||||
on-change="$ctrl.upsertPrice(price)"
|
on-change="$ctrl.upsertPrice(price, true)"
|
||||||
order="id DESC"
|
order="id DESC"
|
||||||
tabindex="1">
|
tabindex="1">
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
|
@ -112,18 +110,32 @@
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</td>
|
</td>
|
||||||
<td shrink-field>
|
<td shrink-field>
|
||||||
<vn-input-number
|
<vn-td-editable number>
|
||||||
ng-model="price.rate2"
|
<text>{{price.rate2 | currency: 'EUR':2}}</text>
|
||||||
on-change="$ctrl.upsertPrice(price)"
|
<field>
|
||||||
step="0.01">
|
<vn-input-number
|
||||||
</vn-input-number>
|
class="dense"
|
||||||
|
vn-focus
|
||||||
|
ng-model="price.rate2"
|
||||||
|
on-change="$ctrl.upsertPrice(price)"
|
||||||
|
step="0.01">
|
||||||
|
</vn-input-number>
|
||||||
|
</field>
|
||||||
|
</vn-td-editable>
|
||||||
</td>
|
</td>
|
||||||
<td shrink-field>
|
<td shrink-field>
|
||||||
<vn-input-number
|
<vn-td-editable number>
|
||||||
ng-model="price.rate3"
|
<text>{{price.rate3 | currency: 'EUR':2}}</text>
|
||||||
on-change="$ctrl.upsertPrice(price)"
|
<field>
|
||||||
step="0.01">
|
<vn-input-number
|
||||||
</vn-input-number>
|
class="dense"
|
||||||
|
vn-focus
|
||||||
|
ng-model="price.rate3"
|
||||||
|
on-change="$ctrl.upsertPrice(price); $ctrl.recalculateRate2(price)"
|
||||||
|
step="0.01"s>
|
||||||
|
</vn-input-number>
|
||||||
|
</field>
|
||||||
|
</vn-td-editable>
|
||||||
</td>
|
</td>
|
||||||
<td shrink-field-expand class="minPrice">
|
<td shrink-field-expand class="minPrice">
|
||||||
<vn-check
|
<vn-check
|
||||||
|
|
|
@ -62,7 +62,10 @@ export default class Controller extends Section {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
upsertPrice(price) {
|
upsertPrice(price, resetMinPrice) {
|
||||||
|
if (resetMinPrice)
|
||||||
|
delete price['minPrice'];
|
||||||
|
|
||||||
price.hasMinPrice = price.minPrice ? true : false;
|
price.hasMinPrice = price.minPrice ? true : false;
|
||||||
|
|
||||||
let requiredFields = ['itemFk', 'started', 'ended', 'rate2', 'rate3'];
|
let requiredFields = ['itemFk', 'started', 'ended', 'rate2', 'rate3'];
|
||||||
|
@ -110,6 +113,24 @@ export default class Controller extends Section {
|
||||||
return {[param]: value};
|
return {[param]: value};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recalculateRate2(price) {
|
||||||
|
if (!price.id || !price.rate3) return;
|
||||||
|
|
||||||
|
const query = 'FixedPrices/getRate2';
|
||||||
|
const params = {
|
||||||
|
fixedPriceId: price.id,
|
||||||
|
rate3: price.rate3
|
||||||
|
};
|
||||||
|
this.$http.get(query, {params})
|
||||||
|
.then(res => {
|
||||||
|
const rate2 = res.data.rate2;
|
||||||
|
if (rate2) {
|
||||||
|
price.rate2 = rate2;
|
||||||
|
this.upsertPrice(price);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ngModule.vnComponent('vnFixedPrice', {
|
ngModule.vnComponent('vnFixedPrice', {
|
||||||
|
|
|
@ -85,5 +85,25 @@ describe('fixed price', () => {
|
||||||
expect(controller.$.model.remove).toHaveBeenCalled();
|
expect(controller.$.model.remove).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('recalculateRate2()', () => {
|
||||||
|
it(`should rate2 recalculate`, () => {
|
||||||
|
jest.spyOn(controller.vnApp, 'showSuccess');
|
||||||
|
const price = {
|
||||||
|
id: 1,
|
||||||
|
itemFk: 1,
|
||||||
|
rate2: 2,
|
||||||
|
rate3: 2
|
||||||
|
};
|
||||||
|
const response = {rate2: 1};
|
||||||
|
controller.recalculateRate2(price);
|
||||||
|
|
||||||
|
const query = `FixedPrices/getRate2?fixedPriceId=${price.id}&rate3=${price.rate3}`;
|
||||||
|
$httpBackend.expectGET(query).respond(response);
|
||||||
|
$httpBackend.flush();
|
||||||
|
|
||||||
|
expect(price.rate2).toEqual(response.rate2);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,5 +3,3 @@ Search prices by item ID or code: Buscar por ID de artículo o código
|
||||||
Search fixed prices: Buscar precios fijados
|
Search fixed prices: Buscar precios fijados
|
||||||
Add fixed price: Añadir precio fijado
|
Add fixed price: Añadir precio fijado
|
||||||
This row will be removed: Esta linea se eliminará
|
This row will be removed: Esta linea se eliminará
|
||||||
Price By Unit: Precio Por Unidad
|
|
||||||
Price By Package: Precio Por Paquete
|
|
|
@ -26,6 +26,9 @@
|
||||||
"PackingSiteConfig": {
|
"PackingSiteConfig": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
|
"ExpeditionMistake": {
|
||||||
|
"dataSource": "vn"
|
||||||
|
},
|
||||||
"PrintServerQueue": {
|
"PrintServerQueue": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
{
|
||||||
|
"name": "ExpeditionMistake",
|
||||||
|
"base": "VnModel",
|
||||||
|
"options": {
|
||||||
|
"mysql": {
|
||||||
|
"table": "expeditionMistake"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"created": {
|
||||||
|
"type": "date"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"relations": {
|
||||||
|
"expedition": {
|
||||||
|
"type": "belongsTo",
|
||||||
|
"model": "Expedition",
|
||||||
|
"foreignKey": "expeditionFk"
|
||||||
|
},
|
||||||
|
"worker": {
|
||||||
|
"type": "belongsTo",
|
||||||
|
"model": "Worker",
|
||||||
|
"foreignKey": "workerFk"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "belongsTo",
|
||||||
|
"model": "MistakeType",
|
||||||
|
"foreignKey": "typeFk"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue