Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5020-borradoLogico-IPT
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
This commit is contained in:
commit
98d6322b0e
|
@ -14,6 +14,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
|
||||
|
||||
### Changed
|
||||
- [Reclamaciones](Descriptor) Cambiado el campo Agencia por Zona
|
||||
- [Tickets](Líneas preparadas) Actualizada sección para que sea más visual
|
||||
|
||||
### Fixed
|
||||
|
|
|
@ -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 ;
|
|
@ -80201,3 +80201,6 @@ USE `vncontrol`;
|
|||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
|
||||
-- Dump completed on 2022-11-21 7:57:28
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -417,8 +417,8 @@ export default {
|
|||
fourthFixedPrice: 'vn-fixed-price tr:nth-child(5)',
|
||||
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"]',
|
||||
fourthPPU: 'vn-fixed-price tr:nth-child(5) > td:nth-child(4)',
|
||||
fourthPPP: 'vn-fixed-price tr:nth-child(5) > td:nth-child(5)',
|
||||
fourthGroupingPrice: 'vn-fixed-price tr:nth-child(5) > td:nth-child(4)',
|
||||
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"]',
|
||||
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"]',
|
||||
|
|
|
@ -24,8 +24,8 @@ describe('Item fixed prices path', () => {
|
|||
it('should fill the fixed price data', async() => {
|
||||
const now = new Date();
|
||||
await page.autocompleteSearch(selectors.itemFixedPrice.fourthWarehouse, 'Warehouse one');
|
||||
await page.write(selectors.itemFixedPrice.fourthPPU, '1');
|
||||
await page.write(selectors.itemFixedPrice.fourthPPP, '1');
|
||||
await page.writeOnEditableTD(selectors.itemFixedPrice.fourthGroupingPrice, '1');
|
||||
await page.writeOnEditableTD(selectors.itemFixedPrice.fourthPackingPrice, '1');
|
||||
await page.write(selectors.itemFixedPrice.fourthMinPrice, '1');
|
||||
await page.pickDate(selectors.itemFixedPrice.fourthStarted, now);
|
||||
await page.pickDate(selectors.itemFixedPrice.fourthEnded, now);
|
||||
|
|
|
@ -19,9 +19,9 @@ class Controller extends ModuleCard {
|
|||
}, {
|
||||
relation: 'ticket',
|
||||
scope: {
|
||||
fields: ['agencyModeFk'],
|
||||
fields: ['zoneFk'],
|
||||
include: {
|
||||
relation: 'agencyMode'
|
||||
relation: 'zone'
|
||||
}
|
||||
}
|
||||
}, {
|
||||
|
|
|
@ -27,16 +27,16 @@
|
|||
<slot-body>
|
||||
<div class="attributes">
|
||||
<vn-label-value
|
||||
label="State"
|
||||
label="State"
|
||||
value="{{$ctrl.claim.claimState.description}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value
|
||||
label="Created"
|
||||
label="Created"
|
||||
value="{{$ctrl.claim.created | date: 'dd/MM/yyyy HH:mm'}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value
|
||||
label="Salesperson">
|
||||
<span
|
||||
<span
|
||||
ng-click="workerDescriptor.show($event, $ctrl.claim.client.salesPersonFk)"
|
||||
class="link">
|
||||
{{$ctrl.claim.client.salesPersonUser.name}}
|
||||
|
@ -44,19 +44,23 @@
|
|||
</vn-label-value>
|
||||
<vn-label-value
|
||||
label="Attended by">
|
||||
<span
|
||||
<span
|
||||
ng-click="workerDescriptor.show($event, $ctrl.claim.worker.userFk)"
|
||||
class="link">
|
||||
{{$ctrl.claim.worker.user.name}}
|
||||
</span>
|
||||
</vn-label-value>
|
||||
<vn-label-value
|
||||
label="Agency"
|
||||
value="{{$ctrl.claim.ticket.agencyMode.name}}">
|
||||
label="Zone">
|
||||
<span
|
||||
ng-click="zoneDescriptor.show($event, $ctrl.claim.ticket.zoneFk)"
|
||||
class="link">
|
||||
{{$ctrl.claim.ticket.zoneFk}}
|
||||
</span>
|
||||
</vn-label-value>
|
||||
<vn-label-value
|
||||
label="Ticket">
|
||||
<span
|
||||
<span
|
||||
ng-click="ticketDescriptor.show($event, $ctrl.claim.ticketFk)"
|
||||
class="link">
|
||||
{{$ctrl.claim.ticketFk}}
|
||||
|
@ -94,12 +98,15 @@
|
|||
question="Delete claim"
|
||||
message="Are you sure you want to delete this claim?">
|
||||
</vn-confirm>
|
||||
<vn-worker-descriptor-popover
|
||||
<vn-worker-descriptor-popover
|
||||
vn-id="workerDescriptor">
|
||||
</vn-worker-descriptor-popover>
|
||||
<vn-ticket-descriptor-popover
|
||||
<vn-ticket-descriptor-popover
|
||||
vn-id="ticketDescriptor">
|
||||
</vn-ticket-descriptor-popover>
|
||||
<vn-popup vn-id="summary">
|
||||
<vn-claim-summary claim="$ctrl.claim"></vn-claim-summary>
|
||||
</vn-popup>
|
||||
</vn-popup>
|
||||
<vn-zone-descriptor-popover
|
||||
vn-id="zoneDescriptor">
|
||||
</vn-zone-descriptor-popover>
|
||||
|
|
|
@ -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 => {
|
||||
require('../methods/fixed-price/filter')(Self);
|
||||
require('../methods/fixed-price/upsertFixedPrice')(Self);
|
||||
require('../methods/fixed-price/getRate2')(Self);
|
||||
};
|
||||
|
|
|
@ -41,14 +41,12 @@
|
|||
<span translate>Warehouse</span>
|
||||
</th>
|
||||
<th
|
||||
field="rate2"
|
||||
vn-tooltip="Price By Unit">
|
||||
<span translate>P.P.U.</span>
|
||||
field="rate2">
|
||||
<span translate>Grouping price</span>
|
||||
</th>
|
||||
<th
|
||||
field="rate3"
|
||||
vn-tooltip="Price By Package">
|
||||
<span translate>P.P.P.</span>
|
||||
field="rate3">
|
||||
<span translate>Packing price</span>
|
||||
</th>
|
||||
<th field="minPrice">
|
||||
<span translate>Min price</span>
|
||||
|
@ -72,7 +70,7 @@
|
|||
show-field="name"
|
||||
value-field="id"
|
||||
search-function="$ctrl.itemSearchFunc($search)"
|
||||
on-change="$ctrl.upsertPrice(price)"
|
||||
on-change="$ctrl.upsertPrice(price, true)"
|
||||
order="id DESC"
|
||||
tabindex="1">
|
||||
<tpl-item>
|
||||
|
@ -112,18 +110,32 @@
|
|||
</vn-autocomplete>
|
||||
</td>
|
||||
<td shrink-field>
|
||||
<vn-input-number
|
||||
ng-model="price.rate2"
|
||||
on-change="$ctrl.upsertPrice(price)"
|
||||
step="0.01">
|
||||
</vn-input-number>
|
||||
<vn-td-editable number>
|
||||
<text>{{price.rate2 | currency: 'EUR':2}}</text>
|
||||
<field>
|
||||
<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 shrink-field>
|
||||
<vn-input-number
|
||||
ng-model="price.rate3"
|
||||
on-change="$ctrl.upsertPrice(price)"
|
||||
step="0.01">
|
||||
</vn-input-number>
|
||||
<vn-td-editable number>
|
||||
<text>{{price.rate3 | currency: 'EUR':2}}</text>
|
||||
<field>
|
||||
<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 shrink-field-expand class="minPrice">
|
||||
<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;
|
||||
|
||||
let requiredFields = ['itemFk', 'started', 'ended', 'rate2', 'rate3'];
|
||||
|
@ -110,6 +113,24 @@ export default class Controller extends Section {
|
|||
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', {
|
||||
|
|
|
@ -85,5 +85,25 @@ describe('fixed price', () => {
|
|||
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
|
||||
Add fixed price: Añadir precio fijado
|
||||
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": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
"ExpeditionMistake": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
"PrintServerQueue": {
|
||||
"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