Merge branch 'master' of https://gitea.verdnatura.es/verdnatura/salix
This commit is contained in:
commit
33a1928f62
|
@ -121,7 +121,7 @@ pipeline {
|
|||
steps {
|
||||
script {
|
||||
def packageJson = readJSON file: 'package.json'
|
||||
env.VERSION = "${packageJson.version}-vn${env.BUILD_ID}"
|
||||
env.VERSION = "${packageJson.version}-build${env.BUILD_ID}"
|
||||
}
|
||||
sh 'docker-compose build back'
|
||||
}
|
||||
|
@ -159,7 +159,7 @@ pipeline {
|
|||
steps {
|
||||
script {
|
||||
def packageJson = readJSON file: 'package.json'
|
||||
env.VERSION = "${packageJson.version}-vn${env.BUILD_ID}"
|
||||
env.VERSION = "${packageJson.version}-build${env.BUILD_ID}"
|
||||
}
|
||||
sh 'gulp build'
|
||||
sh 'docker-compose build front'
|
||||
|
@ -179,7 +179,7 @@ pipeline {
|
|||
steps {
|
||||
script {
|
||||
def packageJson = readJSON file: 'package.json'
|
||||
env.VERSION = "${packageJson.version}-vn${env.BUILD_ID}"
|
||||
env.VERSION = "${packageJson.version}-build${env.BUILD_ID}"
|
||||
}
|
||||
sh 'docker login --username $CREDENTIALS_USR --password $CREDENTIALS_PSW $REGISTRY'
|
||||
sh 'docker-compose push'
|
||||
|
@ -210,7 +210,7 @@ pipeline {
|
|||
steps {
|
||||
script {
|
||||
def packageJson = readJSON file: 'package.json'
|
||||
env.VERSION = "${packageJson.version}-vn${env.BUILD_ID}"
|
||||
env.VERSION = "${packageJson.version}-build${env.BUILD_ID}"
|
||||
}
|
||||
withKubeConfig([
|
||||
serverUrl: "$KUBERNETES_API",
|
||||
|
|
|
@ -1711,7 +1711,7 @@ INSERT INTO `ACL` VALUES (570,'InvoiceOut','canCreatePdf','WRITE','ALLOW','ROLE'
|
|||
INSERT INTO `ACL` VALUES (571,'Supplier','editPayMethodCheck','WRITE','ALLOW','ROLE','financial');
|
||||
INSERT INTO `ACL` VALUES (572,'Worker','isTeamBoss','WRITE','ALLOW','ROLE','teamBoss');
|
||||
INSERT INTO `ACL` VALUES (573,'Worker','forceIsSubordinate','READ','ALLOW','ROLE','hr');
|
||||
INSERT INTO `ACL` VALUES (574,'Claim','editState','WRITE','ALLOW','ROLE','claimManager');
|
||||
INSERT INTO `ACL` VALUES (574,'Claim','editPickup','WRITE','ALLOW','ROLE','claimManager');
|
||||
INSERT INTO `ACL` VALUES (577,'Claim','findOne','READ','ALLOW','ROLE','salesPerson');
|
||||
INSERT INTO `ACL` VALUES (579,'Claim','updateClaim','WRITE','ALLOW','ROLE','salesPerson');
|
||||
INSERT INTO `ACL` VALUES (580,'Claim','regularizeClaim','WRITE','ALLOW','ROLE','claimManager');
|
||||
|
|
|
@ -3126,6 +3126,18 @@ INSERT INTO `vn`.`entryDms`(`entryFk`, `dmsFk`, `editorFk`)
|
|||
VALUES
|
||||
(1, 9, 9);
|
||||
|
||||
INSERT INTO vn.entryType (code,description,isInformal)
|
||||
VALUES ('devaluation','Devaluation',0),
|
||||
('internal','Internal',1),
|
||||
('inventory','Inventory',1),
|
||||
('life','Life',1),
|
||||
('packaging','Packaging',0),
|
||||
('payment','Refund',0),
|
||||
('product','Product',0),
|
||||
('regularization','Regularization',1),
|
||||
('return','Return',0),
|
||||
('transport','Delivery',0);
|
||||
|
||||
INSERT INTO `vn`.`cmr` (id,truckPlate,observations,senderInstruccions,paymentInstruccions,specialAgreements,companyFk,addressToFk,addressFromFk,supplierFk,packagesList,merchandiseDetail,state)
|
||||
VALUES (1,'123456A','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet',442,1,2,1,'Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet'),
|
||||
(2,'123456N','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet',69,3,4,2,'Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet'),
|
||||
|
|
|
@ -13,7 +13,15 @@ trig:BEGIN
|
|||
LEAVE trig;
|
||||
END IF;
|
||||
|
||||
CALL entry_isEditable(OLD.entryFk);
|
||||
IF NOT (NEW.entryFk <=> OLD.entryFk) OR
|
||||
NOT (NEW.quantity <=> OLD.quantity) OR
|
||||
NOT (NEW.buyingValue <=> OLD.buyingValue) OR
|
||||
NOT (NEW.packing <=> OLD.packing)
|
||||
THEN
|
||||
|
||||
CALL entry_isEditable(OLD.entryFk);
|
||||
END IF;
|
||||
|
||||
SET NEW.editorFk = account.myUser_getId();
|
||||
|
||||
SELECT defaultEntry INTO vDefaultEntry
|
||||
|
|
|
@ -7,10 +7,21 @@ BEGIN
|
|||
DECLARE vPrintedCount INT;
|
||||
DECLARE vHasDistinctWarehouses BOOL;
|
||||
DECLARE vTotalBuy INT;
|
||||
|
||||
IF NEW.isBooked = OLD.isBooked THEN
|
||||
|
||||
IF NEW.isBooked = OLD.isBooked AND (
|
||||
NOT (NEW.supplierFk <=> OLD.supplierFk) OR
|
||||
NOT (NEW.dated <=> OLD.dated) OR
|
||||
NOT (NEW.invoiceNumber <=> OLD.invoiceNumber) OR
|
||||
NOT (NEW.travelFk <=> OLD.travelFk) OR
|
||||
NOT (NEW.companyFk <=> OLD.companyFk) OR
|
||||
NOT (NEW.invoiceInFk <=> OLD.invoiceInFk) OR
|
||||
NOT (NEW.invoiceAmount <=> OLD.invoiceAmount) OR
|
||||
NOT (NEW.typeFk <=> OLD.typeFk)
|
||||
) THEN
|
||||
|
||||
CALL entry_isEditable(OLD.id);
|
||||
ELSE
|
||||
|
||||
IF NEW.isBooked THEN
|
||||
SELECT COUNT(*) INTO vTotalBuy
|
||||
FROM buy
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
INSERT INTO salix.ACL
|
||||
SET
|
||||
model = 'Ticket',
|
||||
property = 'editZone',
|
||||
accessType = 'WRITE',
|
||||
permission = 'ALLOW',
|
||||
principalType = 'ROLE',
|
||||
principalId = 'buyer';
|
|
@ -69,30 +69,26 @@ module.exports = Self => {
|
|||
}
|
||||
}
|
||||
}, myOptions);
|
||||
// Get sales person from claim client
|
||||
const salesPerson = claim.client().salesPersonUser();
|
||||
|
||||
const changedPickup = args.pickup != claim.pickup;
|
||||
const changedPickup = args.pickup && args.pickup != claim.pickup;
|
||||
|
||||
// Validate when claimState has been changed
|
||||
if (args.claimStateFk) {
|
||||
const canEditOldState = await models.ClaimState.isEditable(ctx, claim.claimStateFk, myOptions);
|
||||
const canEditNewState = await models.ClaimState.isEditable(ctx, args.claimStateFk, myOptions);
|
||||
const canEditState = await models.ACL.checkAccessAcl(ctx, 'Claim', 'editState', 'WRITE');
|
||||
const canEditPickup = await models.ACL.checkAccessAcl(ctx, 'Claim', 'editPickup', 'WRITE');
|
||||
|
||||
if (!canEditOldState || !canEditNewState || changedPickup && !canEditState)
|
||||
if (!canEditOldState || !canEditNewState || (changedPickup && !canEditPickup))
|
||||
throw new UserError(`You don't have enough privileges to change that field`);
|
||||
}
|
||||
|
||||
delete args.ctx;
|
||||
const updatedClaim = await claim.updateAttributes(args, myOptions);
|
||||
|
||||
// When pickup has been changed
|
||||
const salesPerson = claim.client().salesPersonUser();
|
||||
if (salesPerson) {
|
||||
if (changedPickup && updatedClaim.pickup)
|
||||
await notifyPickUp(ctx, salesPerson.id, claim);
|
||||
|
||||
// When claimState has been changed
|
||||
if (args.claimStateFk) {
|
||||
const newState = await models.ClaimState.findById(args.claimStateFk, null, myOptions);
|
||||
await notifyStateChange(ctx, salesPerson.id, claim, newState.description);
|
||||
|
@ -113,7 +109,7 @@ module.exports = Self => {
|
|||
async function notifyStateChange(ctx, workerId, claim, newState) {
|
||||
const models = Self.app.models;
|
||||
const url = await models.Url.getUrl();
|
||||
const $t = ctx.req.__; // $translate
|
||||
const $t = ctx.req.__;
|
||||
|
||||
const message = $t(`Claim state has changed to`, {
|
||||
claimId: claim.id,
|
||||
|
|
|
@ -11,7 +11,7 @@ export default class Controller extends Section {
|
|||
fields: ['id', 'countryFk', 'taxClassFk'],
|
||||
include: [{
|
||||
relation: 'country',
|
||||
scope: {fields: ['country']}
|
||||
scope: {fields: ['name']}
|
||||
}]
|
||||
};
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
label="Country"
|
||||
ng-model="filter.countryFk"
|
||||
url="countries"
|
||||
show-field="country"
|
||||
show-field="name"
|
||||
value-field="id">
|
||||
</vn-autocomplete>
|
||||
</vn-horizontal>
|
||||
|
|
|
@ -72,16 +72,20 @@ module.exports = Self => {
|
|||
const salesPerson = sale.ticket().client().salesPersonUser();
|
||||
if (salesPerson) {
|
||||
const url = await Self.app.models.Url.getUrl();
|
||||
const message = $t('Changed sale quantity', {
|
||||
ticketId: sale.ticket().id,
|
||||
const change = $t('Changes in sales', {
|
||||
itemId: sale.itemFk,
|
||||
concept: sale.concept,
|
||||
oldQuantity: oldQuantity,
|
||||
newQuantity: newQuantity,
|
||||
ticketUrl: `${url}ticket/${sale.ticket().id}/sale`,
|
||||
itemUrl: `${url}item/${sale.itemFk}/summary`
|
||||
});
|
||||
|
||||
const message = $t('Changed sale quantity', {
|
||||
ticketId: sale.ticket().id,
|
||||
changes: change,
|
||||
ticketUrl: `${url}ticket/${sale.ticket().id}/sale`,
|
||||
});
|
||||
|
||||
await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message, myOptions);
|
||||
}
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ module.exports = Self => {
|
|||
const models = Self.app.models;
|
||||
const myOptions = {};
|
||||
let tx;
|
||||
let newStateOrder;
|
||||
|
||||
if (typeof options == 'object')
|
||||
Object.assign(myOptions, options);
|
||||
|
@ -40,11 +41,16 @@ module.exports = Self => {
|
|||
throw new UserError('State cannot be blank');
|
||||
|
||||
if (params.stateFk) {
|
||||
const {code} = await models.State.findById(params.stateFk, {fields: ['code']}, myOptions);
|
||||
const {code, order} = await models.State.findById(
|
||||
params.stateFk,
|
||||
{fields: ['code', 'order']},
|
||||
myOptions);
|
||||
params.code = code;
|
||||
newStateOrder = order;
|
||||
} else {
|
||||
const {id} = await models.State.findOne({where: {code: params.code}}, myOptions);
|
||||
const {id, order} = await models.State.findOne({where: {code: params.code}}, myOptions);
|
||||
params.stateFk = id;
|
||||
newStateOrder = order;
|
||||
}
|
||||
|
||||
if (!params.userFk) {
|
||||
|
@ -75,50 +81,46 @@ module.exports = Self => {
|
|||
}, myOptions);
|
||||
|
||||
const salesPersonFk = ticket.client().salesPersonFk;
|
||||
if (salesPersonFk) {
|
||||
const stateChecked = await models.State.findOne({fields: ['order'], where: {code: 'CHECKED'}});
|
||||
|
||||
if (salesPersonFk && newStateOrder >= stateChecked.order) {
|
||||
const sales = await Self.rawSql(`
|
||||
SELECT DISTINCT s.id,
|
||||
s.itemFk,
|
||||
s.concept,
|
||||
s.originalQuantity AS oldQuantity,
|
||||
s.quantity AS newQuantity
|
||||
s.itemFk,
|
||||
s.concept,
|
||||
s.originalQuantity AS oldQuantity,
|
||||
s.quantity AS newQuantity
|
||||
FROM vn.sale s
|
||||
JOIN vn.saleTracking st ON st.saleFk = s.id
|
||||
JOIN vn.ticket t ON t.id = s.ticketFk
|
||||
JOIN vn.client c ON c.id = t.clientFk
|
||||
JOIN vn.ticketState ts ON ts.ticketFk = t.id
|
||||
JOIN vn.state s2 ON s2.id = ts.stateFk
|
||||
WHERE s.ticketFk = ?
|
||||
AND st.isChecked
|
||||
AND s.originalQuantity IS NOT NULL
|
||||
AND s.originalQuantity <> s.quantity
|
||||
AND s2.\`order\` < (SELECT \`order\` FROM vn.state WHERE code = 'CHECKED')
|
||||
ORDER BY st.created DESC
|
||||
WHERE s.ticketFk = ?
|
||||
AND s.originalQuantity IS NOT NULL
|
||||
AND s.originalQuantity <> s.quantity
|
||||
`, [params.ticketFk], myOptions);
|
||||
|
||||
let changes = '';
|
||||
const url = await models.Url.getUrl();
|
||||
const $t = ctx.req.__;
|
||||
for (let sale of sales) {
|
||||
changes += `\r\n-` + $t('Changes in sales', {
|
||||
itemId: sale.itemFk,
|
||||
concept: sale.concept,
|
||||
oldQuantity: sale.oldQuantity,
|
||||
newQuantity: sale.newQuantity,
|
||||
itemUrl: `${url}item/${sale.itemFk}/summary`
|
||||
});
|
||||
const currentSale = await models.Sale.findById(sale.id, null, myOptions);
|
||||
await currentSale.updateAttributes({
|
||||
originalQuantity: currentSale.quantity
|
||||
}, myOptions);
|
||||
}
|
||||
if (sales.length) {
|
||||
let changes = '';
|
||||
const url = await models.Url.getUrl();
|
||||
const $t = ctx.req.__;
|
||||
for (let sale of sales) {
|
||||
changes += `\r\n-` + $t('Changes in sales', {
|
||||
itemId: sale.itemFk,
|
||||
concept: sale.concept,
|
||||
oldQuantity: sale.oldQuantity,
|
||||
newQuantity: sale.newQuantity,
|
||||
itemUrl: `${url}item/${sale.itemFk}/summary`
|
||||
});
|
||||
const currentSale = await models.Sale.findById(sale.id, null, myOptions);
|
||||
await currentSale.updateAttributes({
|
||||
originalQuantity: currentSale.quantity
|
||||
}, myOptions);
|
||||
}
|
||||
|
||||
const message = $t('Changed sale quantity', {
|
||||
ticketId: ticket.id,
|
||||
changes: changes,
|
||||
ticketUrl: `${url}ticket/${ticket.id}/sale`
|
||||
});
|
||||
await models.Chat.sendCheckingPresence(ctx, salesPersonFk, message, myOptions);
|
||||
const message = $t('Changed sale quantity', {
|
||||
ticketId: ticket.id,
|
||||
changes: changes,
|
||||
ticketUrl: `${url}ticket/${ticket.id}/sale`
|
||||
});
|
||||
await models.Chat.sendCheckingPresence(ctx, salesPersonFk, message, myOptions);
|
||||
}
|
||||
}
|
||||
await Self.rawSql(`CALL vn.ticket_setState(?, ?)`, [ticket.id, params.code], myOptions);
|
||||
|
||||
|
|
Loading…
Reference in New Issue