Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5020-borradoLogico-IPT
gitea/salix/pipeline/head This commit looks good Details

This commit is contained in:
Alexandre Riera 2023-01-18 08:00:20 +01:00
commit 98d6322b0e
16 changed files with 236 additions and 36 deletions

View File

@ -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

View File

@ -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 ;

View File

@ -80201,3 +80201,6 @@ USE `vncontrol`;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2022-11-21 7:57:28

View File

@ -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"]',

View File

@ -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);

View File

@ -19,9 +19,9 @@ class Controller extends ModuleCard {
}, {
relation: 'ticket',
scope: {
fields: ['agencyModeFk'],
fields: ['zoneFk'],
include: {
relation: 'agencyMode'
relation: 'zone'
}
}
}, {

View File

@ -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>

View File

@ -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;
};
};

View File

@ -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;
}
});
});

View File

@ -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);
};

View File

@ -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

View File

@ -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', {

View File

@ -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);
});
});
});
});

View File

@ -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

View File

@ -26,6 +26,9 @@
"PackingSiteConfig": {
"dataSource": "vn"
},
"ExpeditionMistake": {
"dataSource": "vn"
},
"PrintServerQueue": {
"dataSource": "vn"
},

View File

@ -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"
}
}
}