Merge
This commit is contained in:
commit
3c9d8f32bb
|
@ -34,7 +34,7 @@
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
</vn-vertical>
|
</vn-vertical>
|
||||||
<a vn-auto ui-sref="client.card.creditInsurance.insurance.index({classificationId: {{classification.id}}})">
|
<a vn-auto ui-sref="client.card.creditInsurance.insurance.index({classificationId: {{classification.id}}})">
|
||||||
<vn-icon-button icon="desktop_windows" vn-tooltip="List classifications"></vn-icon-button>
|
<vn-icon-button icon="desktop_windows" vn-tooltip="View credits"></vn-icon-button>
|
||||||
</a>
|
</a>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
</vn-one>
|
</vn-one>
|
||||||
|
|
|
@ -2,5 +2,6 @@ Contract credit insurance: Contratos de seguro de crédito
|
||||||
New contract: Nuevo contrato
|
New contract: Nuevo contrato
|
||||||
Close contract: Cerrar contrato
|
Close contract: Cerrar contrato
|
||||||
Edit contract: Modificar contrato
|
Edit contract: Modificar contrato
|
||||||
List classifications: Ver clasificaciones
|
View credits: Ver créditos
|
||||||
Are you sure you want to close this contract?: ¿Seguro que quieres cerrar este contrato?
|
Are you sure you want to close this contract?: ¿Seguro que quieres cerrar este contrato?
|
||||||
|
Grade: Grado
|
|
@ -8,7 +8,7 @@
|
||||||
<form name="form"
|
<form name="form"
|
||||||
ng-submit="watcher.submitGo('client.card.creditInsurance.insurance.index', {classificationId: post.params.classificationId})">
|
ng-submit="watcher.submitGo('client.card.creditInsurance.insurance.index', {classificationId: post.params.classificationId})">
|
||||||
<vn-card pad-large>
|
<vn-card pad-large>
|
||||||
<vn-title>New classification</vn-title>
|
<vn-title>New credit</vn-title>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one
|
vn-one
|
||||||
|
@ -37,5 +37,9 @@
|
||||||
</vn-card>
|
</vn-card>
|
||||||
<vn-button-bar>
|
<vn-button-bar>
|
||||||
<vn-submit label="Save"></vn-submit>
|
<vn-submit label="Save"></vn-submit>
|
||||||
|
<button
|
||||||
|
class="mdl-button mdl-button--raised mdl-button--colored"
|
||||||
|
translate
|
||||||
|
ui-sref="client.card.creditInsurance.insurance.index({classificationId: post.params.classificationId})">Cancel</button>
|
||||||
</vn-button-bar>
|
</vn-button-bar>
|
||||||
</form>
|
</form>
|
|
@ -1,15 +1,14 @@
|
||||||
import ngModule from '../../../module';
|
import ngModule from '../../../module';
|
||||||
|
|
||||||
class Controller {
|
class Controller {
|
||||||
constructor($state, $filter) {
|
constructor($filter) {
|
||||||
this.insurance = {
|
this.insurance = {
|
||||||
created: $filter('date')(new Date(), 'yyyy-MM-dd HH:mm')
|
created: $filter('date')(new Date(), 'yyyy-MM-dd HH:mm')
|
||||||
};
|
};
|
||||||
this.classificationId = $state.params.classificationId;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Controller.$inject = ['$state', '$filter'];
|
Controller.$inject = ['$filter'];
|
||||||
|
|
||||||
ngModule.component('vnClientCreditInsuranceInsuranceCreate', {
|
ngModule.component('vnClientCreditInsuranceInsuranceCreate', {
|
||||||
template: require('./index.html'),
|
template: require('./index.html'),
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
New classification: Nueva clasificación
|
New credit: Nuevo crédito
|
|
@ -1,31 +1,38 @@
|
||||||
<mg-ajax path="/client/api/CreditInsurances/filter" options="vnIndexNonAuto"></mg-ajax>
|
<mg-ajax path="/client/api/CreditClassifications/{{index.params.classificationId}}/creditInsurances" options="vnIndex"></mg-ajax>
|
||||||
<vn-vertical>
|
<vn-vertical>
|
||||||
<vn-card pad-large>
|
<vn-card pad-large>
|
||||||
<vn-vertical>
|
<vn-vertical>
|
||||||
<vn-title>Requested credits</vn-title>
|
<vn-title>Requested credits</vn-title>
|
||||||
<vn-grid-header on-order="$ctrl.onOrder(field, order)">
|
<table class="vn-grid">
|
||||||
<vn-column-header vn-one pad-medium-h field="credit" text="Credit"></vn-column-header>
|
<thead>
|
||||||
<vn-column-header vn-one pad-medium-h field="grade" text="Grade"></vn-column-header>
|
<tr>
|
||||||
<vn-column-header vn-two pad-medium-h field="created" text="Created" default-order="DESC"></vn-column-header>
|
<th number translate>Credit</th>
|
||||||
</vn-grid-header>
|
<th number translate>Grade</th>
|
||||||
<vn-one class="list list-content">
|
<th translate>Created</th>
|
||||||
<vn-horizontal
|
</tr>
|
||||||
vn-one class="list list-element text-center"
|
</thead>
|
||||||
pad-small-bottom
|
<tbody>
|
||||||
ng-repeat="insurance in index.model.instances track by insurance.id">
|
<tr ng-repeat="insurance in index.model track by insurance.id" class="list list-element">
|
||||||
<vn-one pad-medium-h>{{::insurance.credit}}</vn-one>
|
<td number>{{::insurance.credit | currency: '€': 2}}</td>
|
||||||
<vn-one pad-medium-h>{{::insurance.grade}}</vn-one>
|
<td number>{{::insurance.grade}}</td>
|
||||||
<vn-two pad-medium-h>{{::insurance.created | date: 'dd/MM/yyyy'}}</vn-two>
|
<td>{{::insurance.created | date: 'dd/MM/yyyy'}}</td>
|
||||||
</vn-horizontal>
|
</tr>
|
||||||
</vn-one>
|
<tr ng-if="index.model.count === 0" class="list list-element">
|
||||||
<vn-one class="text-center pad-small-v" ng-if="index.model.count === 0" translate>No results</vn-one>
|
<td colspan="6" style="text-align: center" translate>No results</td>
|
||||||
<vn-horizontal vn-one class="list list-footer"></vn-horizontal>
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
</vn-vertical>
|
</vn-vertical>
|
||||||
</vn-card>
|
</vn-card>
|
||||||
|
<vn-button-bar>
|
||||||
|
<button
|
||||||
|
class="mdl-button mdl-button--raised mdl-button--colored"
|
||||||
|
translate
|
||||||
|
ui-sref="client.card.creditInsurance.index">Back</button>
|
||||||
|
</vn-button-bar>
|
||||||
<vn-paging vn-one margin-large-top index="index" total="index.model.count"></vn-paging>
|
<vn-paging vn-one margin-large-top index="index" total="index.model.count"></vn-paging>
|
||||||
<!-- <vn-auto-paging vn-one margin-large-top index="index" total="index.model.count" items="$ctrl.instances"></vn-auto-paging> -->
|
|
||||||
</vn-vertical>
|
</vn-vertical>
|
||||||
<a ui-sref="client.card.creditInsurance.insurance.create({classificationId: {{index.params.classificationId}}})"
|
<a ui-sref="client.card.creditInsurance.insurance.create({classificationId: {{index.params.classificationId}}})"
|
||||||
fixed-bottom-right vn-tooltip="New classification" vn-bind="+" ng-if="!$ctrl.isClosed">
|
fixed-bottom-right vn-tooltip="New credit" vn-bind="+" ng-if="!$ctrl.isClosed">
|
||||||
<vn-float-button icon="add"></vn-float-button>
|
<vn-float-button icon="add"></vn-float-button>
|
||||||
</a>
|
</a>
|
|
@ -21,3 +21,4 @@ Credit contracts: Contratos de crédito
|
||||||
Verified data: Datos comprobados
|
Verified data: Datos comprobados
|
||||||
Mandate: Mandato
|
Mandate: Mandato
|
||||||
Amount: Importe
|
Amount: Importe
|
||||||
|
Back: Volver
|
|
@ -1 +1 @@
|
||||||
<div ng-transclude></div>
|
<div></div>
|
||||||
|
|
|
@ -7,8 +7,12 @@ export default function directive(vnTemplate) {
|
||||||
restrict: 'E',
|
restrict: 'E',
|
||||||
transclude: true,
|
transclude: true,
|
||||||
template: require('./card.html'),
|
template: require('./card.html'),
|
||||||
link: function(_, $element) {
|
link: function($scope, $element, $attrs, $ctrl, $transclude) {
|
||||||
$element.addClass('demo-card-wide mdl-shadow--2dp bg-panel');
|
$element.addClass('demo-card-wide mdl-shadow--2dp bg-panel');
|
||||||
|
|
||||||
|
$transclude($scope, function(clone) {
|
||||||
|
angular.element($element[0].querySelector('div')).append(clone);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,18 +9,18 @@ import './style.scss';
|
||||||
* @property {HTMLElement} buttons The dialog HTML buttons
|
* @property {HTMLElement} buttons The dialog HTML buttons
|
||||||
*/
|
*/
|
||||||
export default class Dialog extends Component {
|
export default class Dialog extends Component {
|
||||||
constructor($element, $transclude) {
|
constructor($element, $scope, $transclude) {
|
||||||
super($element);
|
super($element, $scope);
|
||||||
this.shown = false;
|
this.shown = false;
|
||||||
this.$element.addClass('vn-dialog');
|
this.$element.addClass('vn-dialog');
|
||||||
this.element.addEventListener('mousedown',
|
this.element.addEventListener('mousedown',
|
||||||
e => this.onBackgroundMouseDown(e));
|
e => this.onBackgroundMouseDown(e));
|
||||||
|
|
||||||
if ($transclude) {
|
if ($transclude) {
|
||||||
$transclude(tClone => {
|
$transclude($scope.$parent, tClone => {
|
||||||
this.body = tClone[0];
|
this.body = tClone[0];
|
||||||
}, null, 'body');
|
}, null, 'body');
|
||||||
$transclude(tClone => {
|
$transclude($scope.$parent, tClone => {
|
||||||
this.buttons = tClone[0];
|
this.buttons = tClone[0];
|
||||||
}, null, 'buttons');
|
}, null, 'buttons');
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ export default class Dialog extends Component {
|
||||||
clearTimeout(this.transitionTimeout);
|
clearTimeout(this.transitionTimeout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Dialog.$inject = ['$element', '$transclude'];
|
Dialog.$inject = ['$element', '$scope', '$transclude'];
|
||||||
|
|
||||||
ngModule.component('vnDialog', {
|
ngModule.component('vnDialog', {
|
||||||
template: require('./dialog.html'),
|
template: require('./dialog.html'),
|
||||||
|
|
|
@ -33,7 +33,8 @@ class Controller {
|
||||||
let data = {
|
let data = {
|
||||||
landed: toJsonDate(this.ticket.landed),
|
landed: toJsonDate(this.ticket.landed),
|
||||||
addressFk: this.ticket.addressFk,
|
addressFk: this.ticket.addressFk,
|
||||||
agencyModeFk: this.ticket.agencyModeFk
|
agencyModeFk: this.ticket.agencyModeFk,
|
||||||
|
warehouseFk: this.ticket.warehouseFk
|
||||||
};
|
};
|
||||||
|
|
||||||
return this.$http.post(query, data).then(res => {
|
return this.$http.post(query, data).then(res => {
|
||||||
|
|
|
@ -26,6 +26,7 @@ describe('ticket', () => {
|
||||||
addressFk: 121,
|
addressFk: 121,
|
||||||
agencyModeFk: 1,
|
agencyModeFk: 1,
|
||||||
companyFk: 442,
|
companyFk: 442,
|
||||||
|
warehouseFk: 1,
|
||||||
shipped: new Date(),
|
shipped: new Date(),
|
||||||
landed: new Date()
|
landed: new Date()
|
||||||
};
|
};
|
||||||
|
@ -46,6 +47,7 @@ describe('ticket', () => {
|
||||||
addressFk: 121,
|
addressFk: 121,
|
||||||
agencyModeFk: 1,
|
agencyModeFk: 1,
|
||||||
companyFk: 442,
|
companyFk: 442,
|
||||||
|
warehouseFk: 1,
|
||||||
shipped: new Date(),
|
shipped: new Date(),
|
||||||
landed: landed
|
landed: landed
|
||||||
};
|
};
|
||||||
|
|
|
@ -11,5 +11,12 @@
|
||||||
initial-data="$ctrl.ticket.option">
|
initial-data="$ctrl.ticket.option">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-check
|
||||||
|
vn-one label="Remove from route"
|
||||||
|
field="$ctrl.ticket.hasToBeUnrouted"
|
||||||
|
vn-acl="delivery">
|
||||||
|
</vn-check>
|
||||||
|
</vn-horizontal>
|
||||||
</vn-card>
|
</vn-card>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -15,6 +15,7 @@ class Controller {
|
||||||
|
|
||||||
$onChanges() {
|
$onChanges() {
|
||||||
this.ticket.option = 1;
|
this.ticket.option = 1;
|
||||||
|
this.ticket.hasToBeUnrouted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
onStepChange(state) {
|
onStepChange(state) {
|
||||||
|
@ -29,12 +30,14 @@ class Controller {
|
||||||
|
|
||||||
let query = `/ticket/api/tickets/${this.ticket.id}/componentUpdate`;
|
let query = `/ticket/api/tickets/${this.ticket.id}/componentUpdate`;
|
||||||
let data = {
|
let data = {
|
||||||
|
clientFk: this.ticket.clientFk,
|
||||||
agencyModeFk: this.ticket.agencyModeFk,
|
agencyModeFk: this.ticket.agencyModeFk,
|
||||||
addressFk: this.ticket.addressFk,
|
addressFk: this.ticket.addressFk,
|
||||||
warehouseFk: this.ticket.warehouseFk,
|
warehouseFk: this.ticket.warehouseFk,
|
||||||
shipped: this.ticket.shipped,
|
shipped: this.ticket.shipped,
|
||||||
landed: this.ticket.landed,
|
landed: this.ticket.landed,
|
||||||
isDeleted: this.ticket.isDeleted,
|
isDeleted: this.ticket.isDeleted,
|
||||||
|
hasToBeUnrouted: this.ticket.hasToBeUnrouted,
|
||||||
option: this.ticket.option
|
option: this.ticket.option
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
Charge: Cargo
|
Charge: Cargo
|
||||||
Choose an option: Selecciona una opción
|
Choose an option: Selecciona una opción
|
||||||
Charge difference to: Diferencia a cargo de
|
Charge difference to: Diferencia a cargo de
|
||||||
|
Remove from route: Sacar de la ruta
|
|
@ -1,14 +0,0 @@
|
||||||
module.exports = Self => {
|
|
||||||
Self.installMethod('filter', filterParams);
|
|
||||||
|
|
||||||
function filterParams(params) {
|
|
||||||
return {
|
|
||||||
where: {
|
|
||||||
creditClassification: params.creditClassificationFk
|
|
||||||
},
|
|
||||||
skip: (params.page - 1) * params.size,
|
|
||||||
limit: params.size,
|
|
||||||
order: params.order
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,6 +1,4 @@
|
||||||
module.exports = function(Self) {
|
module.exports = function(Self) {
|
||||||
require('../methods/credit-insurance/filter')(Self);
|
|
||||||
|
|
||||||
Self.validateCredit = function(credit) {
|
Self.validateCredit = function(credit) {
|
||||||
return credit >= 0;
|
return credit >= 0;
|
||||||
};
|
};
|
||||||
|
@ -20,6 +18,26 @@ module.exports = function(Self) {
|
||||||
allowNull: true
|
allowNull: true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
async function validateNullGrade(err, done) {
|
||||||
|
let filter = {
|
||||||
|
fields: ['grade'],
|
||||||
|
where: {
|
||||||
|
creditClassification: this.creditClassification
|
||||||
|
},
|
||||||
|
order: 'created DESC'
|
||||||
|
};
|
||||||
|
let insurance = await Self.findOne(filter);
|
||||||
|
|
||||||
|
if (insurance && (!insurance.grade && this.grade || insurance.grade && ! this.grade))
|
||||||
|
err();
|
||||||
|
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
|
||||||
|
Self.validateAsync('nullGrade', validateNullGrade, {
|
||||||
|
message: 'The grade must be similar to the last one'
|
||||||
|
});
|
||||||
|
|
||||||
Self.messageSend = async function(data, accessToken) {
|
Self.messageSend = async function(data, accessToken) {
|
||||||
let filter = {
|
let filter = {
|
||||||
include: {
|
include: {
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
USE `vn`;
|
||||||
|
DROP procedure IF EXISTS `ticketComponentMakeUpdate`;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
USE `vn`$$
|
||||||
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `ticketComponentMakeUpdate`(
|
||||||
|
vTicketFk INT,
|
||||||
|
vClientFk INT,
|
||||||
|
vAgencyModeFk INT,
|
||||||
|
vAddressFk INT,
|
||||||
|
vWarehouseFk INT,
|
||||||
|
vShipped DATETIME,
|
||||||
|
vLanded DATE,
|
||||||
|
vIsDeleted BOOLEAN,
|
||||||
|
vHasToBeUnrouted BOOLEAN,
|
||||||
|
vOption INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Calcula los componentes de un ticket
|
||||||
|
* y los actualiza con los nuevos datos.
|
||||||
|
*
|
||||||
|
* @param vTicketFk Id del ticket
|
||||||
|
* @param vClientFk Id del cliente
|
||||||
|
* @param vAgencyModeFk Id del tipo de agencia
|
||||||
|
* @param vAddressFk Id del consignatario
|
||||||
|
* @param vWarehouseFk Id del almacén
|
||||||
|
* @param vShipped Fecha de salida
|
||||||
|
* @param vLanded Fecha de llegada
|
||||||
|
* @param vIsDeleted Marcado como eliminado
|
||||||
|
* @param vHasToBeUnrouted Marcado para sacar de ruta
|
||||||
|
* @param vOption Id de la acción ticketUpdateAction
|
||||||
|
*/
|
||||||
|
|
||||||
|
CALL vn.ticketComponentPreview (vTicketFk, vLanded, vAddressFk, vAgencyModeFk, vWarehouseFk);
|
||||||
|
CALL vn.ticketComponentUpdate (
|
||||||
|
vTicketFk,
|
||||||
|
vClientFk,
|
||||||
|
vAgencyModeFk,
|
||||||
|
vAddressFk,
|
||||||
|
vWarehouseFk,
|
||||||
|
vShipped,
|
||||||
|
vLanded,
|
||||||
|
vIsDeleted,
|
||||||
|
vHasToBeUnrouted,
|
||||||
|
vOption
|
||||||
|
);
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE
|
||||||
|
tmp.ticketComponent,
|
||||||
|
tmp.ticketComponentPrice;
|
||||||
|
END$$
|
||||||
|
|
||||||
|
DELIMITER ;
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
USE `vn`;
|
||||||
|
DROP procedure IF EXISTS `ticketComponentPreview`;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
USE `vn`$$
|
||||||
|
CREATE DEFINER=`root`@`%` PROCEDURE `ticketComponentPreview`(
|
||||||
|
vTicketFk INT,
|
||||||
|
vDate DATE,
|
||||||
|
vAddressFk INT,
|
||||||
|
vAgencyModeFk INT,
|
||||||
|
vWarehouseFk SMALLINT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Devuelve un listado previo de
|
||||||
|
* componentes para un ticket
|
||||||
|
*
|
||||||
|
* @param vTicketFk Id del ticket
|
||||||
|
* @param vDate Fecha de envÃo
|
||||||
|
* @param vAddressFk Id del consignatario
|
||||||
|
* @param vAgencyModeFk Id del modo de agencia
|
||||||
|
* @param vWarehouseFk Id del almacén
|
||||||
|
*/
|
||||||
|
DECLARE vAgencyFk INT;
|
||||||
|
DECLARE vShipped DATE;
|
||||||
|
DECLARE vBuyOrderItem INT DEFAULT 100;
|
||||||
|
|
||||||
|
SELECT agencyFk INTO vAgencyFk
|
||||||
|
FROM agencyMode
|
||||||
|
WHERE id = vAgencyModeFk;
|
||||||
|
|
||||||
|
CALL agencyHourOffer(vDate, vAddressFk, vAgencyFk);
|
||||||
|
|
||||||
|
SELECT shipped INTO vShipped
|
||||||
|
FROM tmp.agencyHourOffer
|
||||||
|
WHERE warehouseFk = vWarehouseFK;
|
||||||
|
|
||||||
|
CALL buyUltimate(vWarehouseFK, vShipped);
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.ticketLot;
|
||||||
|
CREATE TEMPORARY TABLE tmp.ticketLot ENGINE = MEMORY (
|
||||||
|
SELECT
|
||||||
|
vWarehouseFK AS warehouseFk,
|
||||||
|
NULL AS available,
|
||||||
|
s.itemFk,
|
||||||
|
bu.buyFk
|
||||||
|
FROM sale s
|
||||||
|
LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk
|
||||||
|
WHERE s.ticketFk = vTicketFk
|
||||||
|
AND s.itemFk != vBuyOrderItem
|
||||||
|
GROUP BY bu.warehouseFk, bu.itemFk);
|
||||||
|
|
||||||
|
CALL ticketComponentCalculate(vAddressFk, vAgencyModeFk);
|
||||||
|
|
||||||
|
REPLACE INTO tmp.ticketComponent (warehouseFk, itemFk, componentFk, cost)
|
||||||
|
SELECT t.warehouseFk, s.itemFk, sc.componentFk, sc.value
|
||||||
|
FROM saleComponent sc
|
||||||
|
JOIN sale s ON s.id = sc.saleFk
|
||||||
|
JOIN ticket t ON t.id = s.ticketFk
|
||||||
|
JOIN componentRate cr ON cr.id = sc.componentFk
|
||||||
|
WHERE s.ticketFk = vTicketFk AND NOT cr.isRenewable;
|
||||||
|
|
||||||
|
SET @shipped = vShipped;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE
|
||||||
|
tmp.agencyHourOffer,
|
||||||
|
tmp.buyUltimate,
|
||||||
|
tmp.ticketLot;
|
||||||
|
|
||||||
|
IF IFNULL(vShipped, CURDATE() - 1) < CURDATE() THEN
|
||||||
|
CALL util.throw('NO_AGENCY_AVAILABLE');
|
||||||
|
END IF;
|
||||||
|
END$$
|
||||||
|
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,55 @@
|
||||||
|
USE `vn`;
|
||||||
|
DROP procedure IF EXISTS `ticketComponentPriceDifference`;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
USE `vn`$$
|
||||||
|
CREATE DEFINER=`root`@`%` PROCEDURE `ticketComponentPriceDifference`(
|
||||||
|
vTicketFk INT,
|
||||||
|
vDate DATE,
|
||||||
|
vAddressFk INT,
|
||||||
|
vAgencyModeFk INT,
|
||||||
|
vWarehouseFk INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Devuelve las diferencias de precio
|
||||||
|
* de los movimientos de un ticket.
|
||||||
|
*
|
||||||
|
* @param vTicketFk Id del ticket
|
||||||
|
* @param vDate Fecha de envÃo
|
||||||
|
* @param vAddressFk Id del consignatario
|
||||||
|
* @param vAgencyModeFk Id del modo de agencia
|
||||||
|
* @param vWarehouseFk Id del almacén
|
||||||
|
*/
|
||||||
|
CALL vn.ticketComponentPreview(vTicketFk, vDate, vAddressFk, vAgencyModeFk, vWarehouseFk);
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
s.itemFk,
|
||||||
|
i.name,
|
||||||
|
i.size,
|
||||||
|
i.category,
|
||||||
|
IFNULL(s.quantity, 0) AS quantity,
|
||||||
|
IFNULL(s.price, 0) AS price,
|
||||||
|
ROUND(SUM(tc.cost), 4) AS newPrice,
|
||||||
|
s.quantity * (s.price - ROUND(SUM(cost), 4)) difference,
|
||||||
|
s.id AS saleFk
|
||||||
|
FROM sale s
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
JOIN ticket t ON t.id = s.ticketFk
|
||||||
|
LEFT JOIN tmp.ticketComponent tc ON tc.itemFk = s.itemFk
|
||||||
|
AND tc.warehouseFk = t.warehouseFk
|
||||||
|
LEFT JOIN saleComponent sc ON sc.saleFk = s.id
|
||||||
|
AND sc.componentFk = tc.componentFk
|
||||||
|
LEFT JOIN componentRate cr ON cr.id = tc.componentFk
|
||||||
|
WHERE
|
||||||
|
t.id = vTicketFk
|
||||||
|
AND IF(sc.componentFk IS NULL
|
||||||
|
AND cr.classRate IS NOT NULL, FALSE, TRUE)
|
||||||
|
GROUP BY s.id ORDER BY s.id;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE
|
||||||
|
tmp.ticketComponent,
|
||||||
|
tmp.ticketComponentPrice;
|
||||||
|
END$$
|
||||||
|
|
||||||
|
DELIMITER ;
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
USE `vn`;
|
||||||
|
DROP procedure IF EXISTS `ticketComponentUpdate`;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
USE `vn`$$
|
||||||
|
CREATE DEFINER=`root`@`%` PROCEDURE `ticketComponentUpdate`(
|
||||||
|
vTicketFk INT,
|
||||||
|
vClientFk INT,
|
||||||
|
vAgencyModeFk INT,
|
||||||
|
vAddressFk INT,
|
||||||
|
vWarehouseFk INT,
|
||||||
|
vShipped DATETIME,
|
||||||
|
vLanded DATE,
|
||||||
|
vIsDeleted BOOLEAN,
|
||||||
|
vHasToBeUnrouted BOOLEAN,
|
||||||
|
vOption INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Actualiza un ticket y sus componentes
|
||||||
|
* con los nuevos datos.
|
||||||
|
*
|
||||||
|
* @param vTicketFk Id del ticket
|
||||||
|
* @param vClientFk Id del cliente
|
||||||
|
* @param vAgencyModeFk Id del tipo de agencia
|
||||||
|
* @param vAddressFk Id del consignatario
|
||||||
|
* @param vWarehouseFk Id del almacén
|
||||||
|
* @param vShipped Fecha de salida
|
||||||
|
* @param vLanded Fecha de llegada
|
||||||
|
* @param vIsDeleted Marcado como eliminado
|
||||||
|
* @param vHasToBeUnrouted Marcado para sacar de ruta
|
||||||
|
* @param vOption Id de la acción ticketUpdateAction
|
||||||
|
*/
|
||||||
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
||||||
|
BEGIN
|
||||||
|
ROLLBACK;
|
||||||
|
RESIGNAL;
|
||||||
|
END;
|
||||||
|
|
||||||
|
START TRANSACTION;
|
||||||
|
|
||||||
|
UPDATE ticket t
|
||||||
|
SET
|
||||||
|
t.clientFk = vClientFk,
|
||||||
|
t.agencyModeFk = vAgencyModeFk,
|
||||||
|
t.addressFk = vAddressFk,
|
||||||
|
t.warehouseFk = vWarehouseFk,
|
||||||
|
t.landed = vLanded,
|
||||||
|
t.shipped = vShipped,
|
||||||
|
t.isDeleted = vIsDeleted
|
||||||
|
WHERE
|
||||||
|
t.id = vTicketFk;
|
||||||
|
|
||||||
|
IF vHasToBeUnrouted THEN
|
||||||
|
UPDATE ticket t SET t.routeFk = NULL
|
||||||
|
WHERE t.id = vTicketFk;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF vOption <> 8 THEN
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.sale;
|
||||||
|
CREATE TEMPORARY TABLE tmp.sale
|
||||||
|
(PRIMARY KEY (saleFk))
|
||||||
|
ENGINE = MEMORY
|
||||||
|
SELECT id AS saleFk, vWarehouseFk warehouseFk
|
||||||
|
FROM sale s WHERE s.ticketFk = vTicketFk;
|
||||||
|
|
||||||
|
CALL ticketComponentUpdateSale (vOption);
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE tmp.sale;
|
||||||
|
END IF;
|
||||||
|
COMMIT;
|
||||||
|
END$$
|
||||||
|
|
||||||
|
DELIMITER ;
|
||||||
|
|
|
@ -20,5 +20,7 @@
|
||||||
"Cannot change the payment method if no salesperson": "No se puede cambiar la forma de pago si no hay comercial asignado",
|
"Cannot change the payment method if no salesperson": "No se puede cambiar la forma de pago si no hay comercial asignado",
|
||||||
"can't be blank": "El campo no puede estar vacío",
|
"can't be blank": "El campo no puede estar vacío",
|
||||||
"Observation type cannot be blank": "El tipo de observación no puede estar en blanco",
|
"Observation type cannot be blank": "El tipo de observación no puede estar en blanco",
|
||||||
"Observation type must be unique": "El tipo de observación no puede repetirse"
|
"Observation type must be unique": "El tipo de observación no puede repetirse",
|
||||||
|
"The credit must be an integer greater than or equal to zero": "The credit must be an integer greater than or equal to zero",
|
||||||
|
"The grade must be similar to the last one": "El grado debe ser similar al último crédito"
|
||||||
}
|
}
|
|
@ -57,8 +57,14 @@ module.exports = Self => {
|
||||||
salesObj.totalNewPrice = 0.00;
|
salesObj.totalNewPrice = 0.00;
|
||||||
salesObj.totalDifference = 0.00;
|
salesObj.totalDifference = 0.00;
|
||||||
|
|
||||||
let query = `CALL vn.ticketComponentPriceDifference(?, ?, ?, ?)`;
|
let query = `CALL vn.ticketComponentPriceDifference(?, ?, ?, ?, ?)`;
|
||||||
let [differences] = await Self.rawSql(query, [data.landed, data.addressFk, data.agencyModeFk, ticketFk]);
|
let [differences] = await Self.rawSql(query, [
|
||||||
|
ticketFk,
|
||||||
|
data.landed,
|
||||||
|
data.addressFk,
|
||||||
|
data.agencyModeFk,
|
||||||
|
data.warehouseFk
|
||||||
|
]);
|
||||||
|
|
||||||
salesObj.items.forEach(sale => {
|
salesObj.items.forEach(sale => {
|
||||||
differences.forEach(difference => {
|
differences.forEach(difference => {
|
||||||
|
|
|
@ -5,7 +5,8 @@ describe('sale priceDifference()', () => {
|
||||||
let data = {
|
let data = {
|
||||||
landed: Date.now(),
|
landed: Date.now(),
|
||||||
addressFk: 121,
|
addressFk: 121,
|
||||||
agencyModeFk: 1
|
agencyModeFk: 1,
|
||||||
|
warehouseFk: 1
|
||||||
};
|
};
|
||||||
app.models.Sale.priceDifference(1, data)
|
app.models.Sale.priceDifference(1, data)
|
||||||
.catch(response => {
|
.catch(response => {
|
||||||
|
|
|
@ -12,8 +12,14 @@ module.exports = Self => {
|
||||||
arg: 'data',
|
arg: 'data',
|
||||||
type: 'Object',
|
type: 'Object',
|
||||||
required: true,
|
required: true,
|
||||||
description: 'landed, addressFk, agencyModeFk',
|
description: 'landed, addressFk, agencyModeFk, warehouseFk',
|
||||||
http: {source: 'body'}
|
http: {source: 'body'}
|
||||||
|
}, {
|
||||||
|
arg: 'context',
|
||||||
|
type: 'object',
|
||||||
|
http: function(ctx) {
|
||||||
|
return ctx;
|
||||||
|
}
|
||||||
}],
|
}],
|
||||||
returns: {
|
returns: {
|
||||||
type: ['Object'],
|
type: ['Object'],
|
||||||
|
@ -25,16 +31,24 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.componentUpdate = async(ticketFk, data) => {
|
Self.componentUpdate = async(ticketFk, data, ctx) => {
|
||||||
let query = 'CALL vn.ticketComponentMakeUpdate(?, ?, ?, ?, ?, ?, ?, ?)';
|
let userId = ctx.req.accessToken.userId;
|
||||||
|
let hasDeliveryRole = await Self.app.models.Account.hasRole(userId, 'delivery');
|
||||||
|
|
||||||
|
if (!hasDeliveryRole)
|
||||||
|
data.hasToBeUnrouted = true;
|
||||||
|
|
||||||
|
let query = 'CALL vn.ticketComponentMakeUpdate(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
|
||||||
let res = await Self.rawSql(query, [
|
let res = await Self.rawSql(query, [
|
||||||
ticketFk,
|
ticketFk,
|
||||||
|
data.clientFk,
|
||||||
data.agencyModeFk,
|
data.agencyModeFk,
|
||||||
data.addressFk,
|
data.addressFk,
|
||||||
data.warehouseFk,
|
data.warehouseFk,
|
||||||
data.shipped,
|
data.shipped,
|
||||||
data.landed,
|
data.landed,
|
||||||
data.isDeleted,
|
data.isDeleted,
|
||||||
|
data.hasToBeUnrouted,
|
||||||
data.option
|
data.option
|
||||||
]);
|
]);
|
||||||
return res;
|
return res;
|
||||||
|
|
|
@ -8,9 +8,11 @@ describe('ticket componentUpdate()', () => {
|
||||||
warehouseFk: 1,
|
warehouseFk: 1,
|
||||||
shipped: Date.now(),
|
shipped: Date.now(),
|
||||||
landed: Date.now(),
|
landed: Date.now(),
|
||||||
|
hasToBeUnrouted: true,
|
||||||
option: 1
|
option: 1
|
||||||
};
|
};
|
||||||
app.models.Ticket.componentUpdate(1, data)
|
let ctx = {req: {accessToken: {userId: 101}}};
|
||||||
|
app.models.Ticket.componentUpdate(1, data, ctx)
|
||||||
.catch(response => {
|
.catch(response => {
|
||||||
expect(response).toEqual(new Error('ER_SIGNAL_EXCEPTION: NO_AGENCY_AVAILABLE'));
|
expect(response).toEqual(new Error('ER_SIGNAL_EXCEPTION: NO_AGENCY_AVAILABLE'));
|
||||||
done();
|
done();
|
||||||
|
|
|
@ -75,7 +75,7 @@ function vnBoot(app, rootDir, rootModule) {
|
||||||
let packageJson = require(`${rootDir}/../package.json`);
|
let packageJson = require(`${rootDir}/../package.json`);
|
||||||
let appName = packageJson.name;
|
let appName = packageJson.name;
|
||||||
let baseUrl = app.get('url').replace(/\/$/, '');
|
let baseUrl = app.get('url').replace(/\/$/, '');
|
||||||
console.log(`Web server ${appName} listening at: %s`, baseUrl);
|
console.log(`Web server ${appName} listening at: %s`, `${baseUrl}/explorer`);
|
||||||
}
|
}
|
||||||
|
|
||||||
let args = port ? [port, onListen] : [onListen];
|
let args = port ? [port, onListen] : [onListen];
|
||||||
|
|
Loading…
Reference in New Issue