Merge pull request 'feat: refs #7348 hasDailyInvoice from client' (!3110) from 7348-autonomyDailyInvoice into dev
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
Reviewed-on: #3110 Reviewed-by: Carlos Andrés <carlosap@verdnatura.es> Reviewed-by: Alex Moreno <alexm@verdnatura.es>
This commit is contained in:
commit
be9f711cc1
|
@ -16,6 +16,10 @@
|
|||
"name": {
|
||||
"type": "string",
|
||||
"required": true
|
||||
},
|
||||
"hasDailyInvoice": {
|
||||
"type": "boolean",
|
||||
"description": "Indicates if the autonomy has daily invoice enabled"
|
||||
}
|
||||
},
|
||||
"relations": {
|
||||
|
@ -40,4 +44,4 @@
|
|||
"permission": "ALLOW"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
},
|
||||
"continentFk": {
|
||||
"type": "number"
|
||||
},
|
||||
"hasDailyInvoice": {
|
||||
"type": "boolean",
|
||||
"description": "Indicates if the autonomy has daily invoice enabled"
|
||||
}
|
||||
},
|
||||
"relations": {
|
||||
|
|
|
@ -16,6 +16,9 @@
|
|||
"name": {
|
||||
"type": "string",
|
||||
"required": true
|
||||
},
|
||||
"autonomyFk": {
|
||||
"type": "number"
|
||||
}
|
||||
},
|
||||
"relations": {
|
||||
|
@ -55,4 +58,4 @@
|
|||
"permission": "ALLOW"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,22 +34,19 @@ BEGIN
|
|||
DECLARE vIsTaxDataChecked TINYINT(1);
|
||||
DECLARE vHasCoreVnl BOOLEAN;
|
||||
DECLARE vMandateTypeFk INT;
|
||||
DECLARE vHasDailyInvoice BOOLEAN;
|
||||
|
||||
SELECT cc.defaultPayMethodFk,
|
||||
cc.defaultDueDay,
|
||||
cc.defaultCredit,
|
||||
cc.defaultIsTaxDataChecked,
|
||||
cc.defaultHasCoreVnl,
|
||||
cc.defaultMandateTypeFk,
|
||||
c.hasDailyInvoice
|
||||
cc.defaultMandateTypeFk
|
||||
INTO vPayMethodFk,
|
||||
vDueDay,
|
||||
vDefaultCredit,
|
||||
vIsTaxDataChecked,
|
||||
vHasCoreVnl,
|
||||
vMandateTypeFk,
|
||||
vHasDailyInvoice
|
||||
vMandateTypeFk
|
||||
FROM clientConfig cc
|
||||
LEFT JOIN province p ON p.id = vProvinceFk
|
||||
LEFT JOIN country c ON c.id = p.countryFk;
|
||||
|
@ -70,8 +67,7 @@ BEGIN
|
|||
credit = vDefaultCredit,
|
||||
isTaxDataChecked = vIsTaxDataChecked,
|
||||
hasCoreVnl = vHasCoreVnl,
|
||||
isEqualizated = FALSE,
|
||||
hasDailyInvoice = vHasDailyInvoice
|
||||
isEqualizated = FALSE
|
||||
ON duplicate KEY UPDATE
|
||||
payMethodFk = vPayMethodFk,
|
||||
dueDay = vDueDay,
|
||||
|
|
|
@ -43,7 +43,7 @@ BEGIN
|
|||
c.isTaxDataChecked,
|
||||
t.companyFk,
|
||||
t.shipped,
|
||||
IFNULL(a.hasDailyInvoice, co.hasDailyInvoice),
|
||||
c.hasDailyInvoice,
|
||||
w.isManaged,
|
||||
c.hasToInvoice
|
||||
INTO vClientFk,
|
||||
|
@ -55,9 +55,6 @@ BEGIN
|
|||
vHasToInvoice
|
||||
FROM ticket t
|
||||
JOIN `client` c ON c.id = t.clientFk
|
||||
JOIN province p ON p.id = c.provinceFk
|
||||
LEFT JOIN autonomy a ON a.id = p.autonomyFk
|
||||
JOIN country co ON co.id = p.countryFk
|
||||
JOIN warehouse w ON w.id = t.warehouseFk
|
||||
WHERE t.id = vCurTicketFk;
|
||||
|
||||
|
@ -85,7 +82,7 @@ BEGIN
|
|||
|
||||
IF(vHasDailyInvoice) AND vHasToInvoice THEN
|
||||
SELECT invoiceSerial(vClientFk, vCompanyFk, 'quick') INTO vSerial;
|
||||
IF vSerial IS NULL THEN
|
||||
IF vSerial IS NULL THEN
|
||||
CALL util.throw('Cannot booking without a serial');
|
||||
END IF;
|
||||
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
|
||||
UPDATE `vn`.`client` c
|
||||
JOIN `vn`.`country` co ON co.id=c.countryFk
|
||||
SET c.hasDailyInvoice = co.hasDailyInvoice
|
||||
WHERE co.hasDailyInvoice IS NOT NULL
|
||||
AND c.hasDailyInvoice = FALSE;
|
||||
|
||||
UPDATE `vn`.`client` c
|
||||
JOIN `vn`.`province` p ON p.id=c.provinceFk
|
||||
JOIN `vn`.`autonomy` a ON a.id = p.autonomyFk
|
||||
SET c.hasDailyInvoice = a.hasDailyInvoice
|
||||
WHERE a.hasDailyInvoice IS NOT NULL
|
||||
AND c.hasDailyInvoice = FALSE;
|
|
@ -43,6 +43,23 @@ module.exports = function(Self) {
|
|||
};
|
||||
|
||||
try {
|
||||
const province = await models.Province.findOne({
|
||||
where: {id: data.provinceFk},
|
||||
fields: ['autonomyFk']
|
||||
});
|
||||
|
||||
const autonomy = province ? await models.Autonomy.findOne({
|
||||
where: {id: province.autonomyFk},
|
||||
fields: ['hasDailyInvoice']
|
||||
}) : null;
|
||||
|
||||
const country = await models.Country.findOne({
|
||||
where: {id: data.countryFk},
|
||||
fields: ['hasDailyInvoice']
|
||||
});
|
||||
|
||||
const hasDailyInvoice = (autonomy?.hasDailyInvoice ?? country?.hasDailyInvoice) || false;
|
||||
|
||||
const account = await models.VnUser.create(user, myOptions);
|
||||
const client = await Self.create({
|
||||
id: account.id,
|
||||
|
@ -57,7 +74,8 @@ module.exports = function(Self) {
|
|||
provinceFk: data.provinceFk,
|
||||
countryFk: data.countryFk,
|
||||
isEqualizated: data.isEqualizated,
|
||||
businessTypeFk: data.businessTypeFk
|
||||
businessTypeFk: data.businessTypeFk,
|
||||
hasDailyInvoice: hasDailyInvoice
|
||||
}, myOptions);
|
||||
|
||||
const address = await models.Address.create({
|
||||
|
|
|
@ -1,67 +1,78 @@
|
|||
const models = require('vn-loopback/server/server').models;
|
||||
|
||||
describe('Client Create', () => {
|
||||
const newAccount = {
|
||||
userName: 'deadpool',
|
||||
email: 'deadpool@marvel.com',
|
||||
fi: '16195279J',
|
||||
name: 'Wade',
|
||||
socialName: 'DEADPOOL MARVEL',
|
||||
street: 'WALL STREET',
|
||||
city: 'New York',
|
||||
businessTypeFk: 'florist',
|
||||
provinceFk: 1
|
||||
};
|
||||
const newAccountWithoutEmail = JSON.parse(JSON.stringify(newAccount));
|
||||
delete newAccountWithoutEmail.email;
|
||||
let options;
|
||||
let tx;
|
||||
|
||||
beforeAll.mockLoopBackContext();
|
||||
|
||||
it(`should not find deadpool as he's not created yet`, async() => {
|
||||
const tx = await models.Client.beginTransaction({});
|
||||
beforeEach(async() => {
|
||||
tx = await models.Client.beginTransaction({});
|
||||
options = {transaction: tx};
|
||||
});
|
||||
|
||||
afterEach(async() => await tx.rollback());
|
||||
|
||||
it('should not find deadpool as he is not created yet', async() => {
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
const account = await models.VnUser.findOne({where: {name: 'deadpool'}}, options);
|
||||
const client = await models.Client.findOne({where: {name: 'Wade'}}, options);
|
||||
|
||||
const account = await models.VnUser.findOne({where: {name: newAccount.userName}}, options);
|
||||
const client = await models.Client.findOne({where: {name: newAccount.name}}, options);
|
||||
|
||||
expect(account).toEqual(null);
|
||||
expect(client).toEqual(null);
|
||||
|
||||
await tx.rollback();
|
||||
expect(account).toBeNull();
|
||||
expect(client).toBeNull();
|
||||
} catch (e) {
|
||||
await tx.rollback();
|
||||
throw e;
|
||||
}
|
||||
});
|
||||
|
||||
it('should not create a new account', async() => {
|
||||
const tx = await models.Client.beginTransaction({});
|
||||
|
||||
it('should throw an error when creating a new account without email', async() => {
|
||||
let error;
|
||||
const newAccountWithoutEmail = {
|
||||
userName: 'deadpool',
|
||||
fi: '16195279J',
|
||||
name: 'Wade',
|
||||
socialName: 'DEADPOOL MARVEL',
|
||||
street: 'WALL STREET',
|
||||
city: 'New York',
|
||||
businessTypeFk: 'florist',
|
||||
provinceFk: 1
|
||||
};
|
||||
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
await models.Client.createWithUser(newAccountWithoutEmail, options);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
error = e.message;
|
||||
|
||||
await tx.rollback();
|
||||
error = e;
|
||||
}
|
||||
|
||||
expect(error).toEqual(`An email is necessary`);
|
||||
expect(error.message).toEqual('An email is necessary');
|
||||
});
|
||||
|
||||
it('should create a new account', async() => {
|
||||
const tx = await models.Client.beginTransaction({});
|
||||
it('should create a new account with dailyInvoice', async() => {
|
||||
const newAccount = {
|
||||
userName: 'deadpool',
|
||||
email: 'deadpool@marvel.com',
|
||||
fi: '16195279J',
|
||||
name: 'Wade',
|
||||
socialName: 'DEADPOOL MARVEL',
|
||||
street: 'WALL STREET',
|
||||
city: 'New York',
|
||||
businessTypeFk: 'florist',
|
||||
provinceFk: 1
|
||||
};
|
||||
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
const province = await models.Province.findById(newAccount.provinceFk, {
|
||||
fields: ['id', 'name', 'autonomyFk'],
|
||||
include: {
|
||||
relation: 'autonomy'
|
||||
}
|
||||
}, options);
|
||||
|
||||
const client = await models.Client.createWithUser(newAccount, options);
|
||||
const account = await models.VnUser.findOne({where: {name: newAccount.userName}}, options);
|
||||
|
||||
expect(province.autonomy().hasDailyInvoice).toBeTruthy();
|
||||
expect(account.name).toEqual(newAccount.userName);
|
||||
expect(client.id).toEqual(account.id);
|
||||
expect(client.name).toEqual(newAccount.name);
|
||||
|
@ -69,8 +80,38 @@ describe('Client Create', () => {
|
|||
expect(client.fi).toEqual(newAccount.fi);
|
||||
expect(client.socialName).toEqual(newAccount.socialName);
|
||||
expect(client.businessTypeFk).toEqual(newAccount.businessTypeFk);
|
||||
|
||||
expect(client.hasDailyInvoice).toBeTruthy();
|
||||
} catch (e) {
|
||||
await tx.rollback();
|
||||
throw e;
|
||||
}
|
||||
});
|
||||
|
||||
it('should create a new account without dailyInvoice', async() => {
|
||||
const newAccount = {
|
||||
userName: 'deadpool',
|
||||
email: 'deadpool@marvel.com',
|
||||
fi: '16195279J',
|
||||
name: 'Wade',
|
||||
socialName: 'DEADPOOL MARVEL',
|
||||
street: 'WALL STREET',
|
||||
city: 'New York',
|
||||
businessTypeFk: 'florist',
|
||||
provinceFk: 3
|
||||
};
|
||||
|
||||
try {
|
||||
const province = await models.Province.findById(newAccount.provinceFk, {
|
||||
fields: ['id', 'name', 'autonomyFk'],
|
||||
include: {
|
||||
relation: 'autonomy'
|
||||
}
|
||||
}, options);
|
||||
|
||||
const client = await models.Client.createWithUser(newAccount, options);
|
||||
|
||||
expect(province.autonomy.hasDailyInvoice).toBeFalsy();
|
||||
expect(client.hasDailyInvoice).toBeFalsy();
|
||||
} catch (e) {
|
||||
await tx.rollback();
|
||||
throw e;
|
||||
|
@ -78,26 +119,25 @@ describe('Client Create', () => {
|
|||
});
|
||||
|
||||
it('should not be able to create a user if exists', async() => {
|
||||
const tx = await models.Client.beginTransaction({});
|
||||
|
||||
let error;
|
||||
|
||||
const newAccount = {
|
||||
userName: 'deadpool',
|
||||
email: 'deadpool@marvel.com',
|
||||
fi: '16195279J',
|
||||
name: 'Wade',
|
||||
socialName: 'DEADPOOL MARVEL',
|
||||
street: 'WALL STREET',
|
||||
city: 'New York',
|
||||
businessTypeFk: 'florist',
|
||||
provinceFk: 1
|
||||
};
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
|
||||
await models.Client.createWithUser(newAccount, options);
|
||||
const client = await models.Client.createWithUser(newAccount, options);
|
||||
|
||||
expect(client).toBeNull();
|
||||
|
||||
await tx.rollback();
|
||||
await models.Client.createWithUser(newAccount, options);
|
||||
} catch (e) {
|
||||
await tx.rollback();
|
||||
error = e;
|
||||
}
|
||||
|
||||
const errorName = error.details.codes.name[0];
|
||||
|
||||
expect(errorName).toEqual('uniqueness');
|
||||
expect(error.message).toContain('already exists');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -46,7 +46,7 @@ module.exports = Self => {
|
|||
c.salesPersonFk,
|
||||
c.isToBeMailed,
|
||||
c.hasToInvoice,
|
||||
co.hasDailyInvoice,
|
||||
c.hasDailyInvoice,
|
||||
eu.email salesPersonEmail,
|
||||
t.addressFk
|
||||
FROM ticket t
|
||||
|
@ -125,7 +125,7 @@ module.exports = Self => {
|
|||
WHERE (al.code = 'PACKED' OR (am.code = 'refund' AND al.code <> 'delivered'))
|
||||
AND t.shipped BETWEEN ? - INTERVAL tc.closureDaysAgo DAY AND util.dayEnd(?)
|
||||
AND t.refFk IS NULL
|
||||
AND IFNULL(a.hasDailyInvoice, co.hasDailyInvoice)
|
||||
AND c.hasDailyInvoice
|
||||
GROUP BY ticketFk
|
||||
HAVING hasErrorToInvoice
|
||||
OR hasErrorTaxDataChecked
|
||||
|
|
|
@ -50,7 +50,7 @@ module.exports = Self => {
|
|||
c.salesPersonFk,
|
||||
c.isToBeMailed,
|
||||
c.hasToInvoice,
|
||||
co.hasDailyInvoice,
|
||||
c.hasDailyInvoice,
|
||||
eu.email salesPersonEmail,
|
||||
t.addressFk
|
||||
FROM expedition e
|
||||
|
@ -58,8 +58,6 @@ module.exports = Self => {
|
|||
JOIN ticketState ts ON ts.ticketFk = t.id
|
||||
JOIN alertLevel al ON al.id = ts.alertLevel
|
||||
JOIN client c ON c.id = t.clientFk
|
||||
JOIN province p ON p.id = c.provinceFk
|
||||
JOIN country co ON co.id = p.countryFk
|
||||
LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
|
||||
WHERE al.code = 'PACKED'
|
||||
AND t.id = ?
|
||||
|
|
Loading…
Reference in New Issue