Merge pull request '5849-makeInvoice_solved' (!1676) from 5849-makeInvoice_solved into dev
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
Reviewed-on: #1676 Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
This commit is contained in:
commit
c3a897b8c3
|
@ -18,6 +18,9 @@
|
||||||
},
|
},
|
||||||
"expired": {
|
"expired": {
|
||||||
"type": "date"
|
"type": "date"
|
||||||
|
},
|
||||||
|
"supplierAccountFk": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scope": {
|
"scope": {
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE `vn`.`company` MODIFY COLUMN sage200Company int(2) DEFAULT 10 NOT NULL;
|
|
@ -305,6 +305,7 @@
|
||||||
"The renew period has not been exceeded": "El periodo de renovación no ha sido superado",
|
"The renew period has not been exceeded": "El periodo de renovación no ha sido superado",
|
||||||
"Valid priorities": "Prioridades válidas: %d",
|
"Valid priorities": "Prioridades válidas: %d",
|
||||||
"Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}",
|
"Negative basis of tickets": "Base negativa para los tickets: {{ticketsIds}}",
|
||||||
|
"The company has not informed the supplier account for bank transfers": "La empresa no tiene informado la cuenta de proveedor para transferencias bancarias",
|
||||||
"You cannot assign/remove an alias that you are not assigned to": "No puede asignar/eliminar un alias que no tenga asignado",
|
"You cannot assign/remove an alias that you are not assigned to": "No puede asignar/eliminar un alias que no tenga asignado",
|
||||||
"This invoice has a linked vehicle.": "Esta factura tiene un vehiculo vinculado"
|
"This invoice has a linked vehicle.": "Esta factura tiene un vehiculo vinculado"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
const UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
module.exports = function(Self) {
|
module.exports = function(Self) {
|
||||||
Self.remoteMethodCtx('canBeInvoiced', {
|
Self.remoteMethodCtx('canBeInvoiced', {
|
||||||
description: 'Change property isEqualizated in all client addresses',
|
description: 'Change property isEqualizated in all client addresses',
|
||||||
|
@ -9,6 +11,12 @@ module.exports = function(Self) {
|
||||||
required: true,
|
required: true,
|
||||||
description: 'Client id',
|
description: 'Client id',
|
||||||
http: {source: 'path'}
|
http: {source: 'path'}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'companyFk',
|
||||||
|
description: 'The company id',
|
||||||
|
type: 'number',
|
||||||
|
required: true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
returns: {
|
returns: {
|
||||||
|
@ -22,18 +30,29 @@ module.exports = function(Self) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.canBeInvoiced = async(id, options) => {
|
Self.canBeInvoiced = async(id, companyFk, options) => {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
|
|
||||||
const myOptions = {};
|
const myOptions = {};
|
||||||
|
|
||||||
if (typeof options == 'object')
|
if (typeof options == 'object')
|
||||||
Object.assign(myOptions, options);
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
const client = await models.Client.findById(id, {
|
const client = await models.Client.findById(id, {
|
||||||
fields: ['id', 'isTaxDataChecked', 'hasToInvoice']
|
fields: ['id', 'isTaxDataChecked', 'hasToInvoice', 'payMethodFk'],
|
||||||
|
include:
|
||||||
|
{
|
||||||
|
relation: 'payMethod',
|
||||||
|
scope: {
|
||||||
|
fields: ['code']
|
||||||
|
}
|
||||||
|
}
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
|
||||||
|
const company = await models.Company.findById(companyFk, {fields: ['supplierAccountFk']}, myOptions);
|
||||||
|
|
||||||
|
if (client.payMethod().code === 'wireTransfer' && !company.supplierAccountFk)
|
||||||
|
throw new UserError('The company has not informed the supplier account for bank transfers');
|
||||||
|
|
||||||
if (client.isTaxDataChecked && client.hasToInvoice)
|
if (client.isTaxDataChecked && client.hasToInvoice)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ const LoopBackContext = require('loopback-context');
|
||||||
describe('client canBeInvoiced()', () => {
|
describe('client canBeInvoiced()', () => {
|
||||||
const userId = 19;
|
const userId = 19;
|
||||||
const clientId = 1101;
|
const clientId = 1101;
|
||||||
|
const companyId = 442;
|
||||||
const activeCtx = {
|
const activeCtx = {
|
||||||
accessToken: {userId: userId}
|
accessToken: {userId: userId}
|
||||||
};
|
};
|
||||||
|
@ -23,7 +24,7 @@ describe('client canBeInvoiced()', () => {
|
||||||
const client = await models.Client.findById(clientId, null, options);
|
const client = await models.Client.findById(clientId, null, options);
|
||||||
await client.updateAttribute('isTaxDataChecked', false, options);
|
await client.updateAttribute('isTaxDataChecked', false, options);
|
||||||
|
|
||||||
const canBeInvoiced = await models.Client.canBeInvoiced(clientId, options);
|
const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
|
||||||
|
|
||||||
expect(canBeInvoiced).toEqual(false);
|
expect(canBeInvoiced).toEqual(false);
|
||||||
|
|
||||||
|
@ -43,7 +44,7 @@ describe('client canBeInvoiced()', () => {
|
||||||
const client = await models.Client.findById(clientId, null, options);
|
const client = await models.Client.findById(clientId, null, options);
|
||||||
await client.updateAttribute('hasToInvoice', false, options);
|
await client.updateAttribute('hasToInvoice', false, options);
|
||||||
|
|
||||||
const canBeInvoiced = await models.Client.canBeInvoiced(clientId, options);
|
const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
|
||||||
|
|
||||||
expect(canBeInvoiced).toEqual(false);
|
expect(canBeInvoiced).toEqual(false);
|
||||||
|
|
||||||
|
@ -60,7 +61,7 @@ describe('client canBeInvoiced()', () => {
|
||||||
try {
|
try {
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
|
||||||
const canBeInvoiced = await models.Client.canBeInvoiced(clientId, options);
|
const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
|
||||||
|
|
||||||
expect(canBeInvoiced).toEqual(true);
|
expect(canBeInvoiced).toEqual(true);
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ module.exports = function(Self) {
|
||||||
{
|
{
|
||||||
arg: 'companyFk',
|
arg: 'companyFk',
|
||||||
description: 'The company id',
|
description: 'The company id',
|
||||||
type: 'string',
|
type: 'number',
|
||||||
required: true
|
required: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -67,7 +67,7 @@ module.exports = function(Self) {
|
||||||
|
|
||||||
const [firstTicket] = tickets;
|
const [firstTicket] = tickets;
|
||||||
const clientId = firstTicket.clientFk;
|
const clientId = firstTicket.clientFk;
|
||||||
const clientCanBeInvoiced = await models.Client.canBeInvoiced(clientId, myOptions);
|
const clientCanBeInvoiced = await models.Client.canBeInvoiced(clientId, companyFk, myOptions);
|
||||||
if (!clientCanBeInvoiced)
|
if (!clientCanBeInvoiced)
|
||||||
throw new UserError(`This client can't be invoiced`);
|
throw new UserError(`This client can't be invoiced`);
|
||||||
|
|
||||||
|
|
|
@ -1,25 +1,13 @@
|
||||||
SELECT
|
SELECT
|
||||||
io.ref,
|
io.ref,
|
||||||
c.socialName,
|
|
||||||
sa.iban,
|
|
||||||
pm.name AS payMethod,
|
|
||||||
t.clientFk,
|
|
||||||
t.shipped,
|
|
||||||
t.nickname,
|
|
||||||
s.ticketFk,
|
s.ticketFk,
|
||||||
s.itemFk,
|
ib.ediBotanic botanical,
|
||||||
s.concept,
|
|
||||||
s.quantity,
|
s.quantity,
|
||||||
s.price,
|
s.price,
|
||||||
s.discount,
|
s.discount,
|
||||||
i.tag5,
|
s.itemFk,
|
||||||
i.value5,
|
s.concept,
|
||||||
i.tag6,
|
tc.code vatType
|
||||||
i.value6,
|
|
||||||
i.tag7,
|
|
||||||
i.value7,
|
|
||||||
tc.code AS vatType,
|
|
||||||
ib.ediBotanic botanical
|
|
||||||
FROM vn.invoiceOut io
|
FROM vn.invoiceOut io
|
||||||
JOIN vn.ticket t ON t.refFk = io.ref
|
JOIN vn.ticket t ON t.refFk = io.ref
|
||||||
JOIN vn.supplier su ON su.id = io.companyFk
|
JOIN vn.supplier su ON su.id = io.companyFk
|
||||||
|
@ -41,26 +29,14 @@ SELECT
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT
|
SELECT
|
||||||
io.ref,
|
io.ref,
|
||||||
c.socialName,
|
t.id ticketFk,
|
||||||
sa.iban,
|
NULL botanical,
|
||||||
pm.name AS payMethod,
|
|
||||||
t.clientFk,
|
|
||||||
t.shipped,
|
|
||||||
t.nickname,
|
|
||||||
t.id AS ticketFk,
|
|
||||||
'',
|
|
||||||
ts.description concept,
|
|
||||||
ts.quantity,
|
ts.quantity,
|
||||||
ts.price,
|
ts.price,
|
||||||
0 discount,
|
0 discount,
|
||||||
NULL AS tag5,
|
'',
|
||||||
NULL AS value5,
|
ts.description concept,
|
||||||
NULL AS tag6,
|
tc.code vatType
|
||||||
NULL AS value6,
|
|
||||||
NULL AS tag7,
|
|
||||||
NULL AS value7,
|
|
||||||
tc.code AS vatType,
|
|
||||||
NULL AS botanical
|
|
||||||
FROM vn.invoiceOut io
|
FROM vn.invoiceOut io
|
||||||
JOIN vn.ticket t ON t.refFk = io.ref
|
JOIN vn.ticket t ON t.refFk = io.ref
|
||||||
JOIN vn.ticketService ts ON ts.ticketFk = t.id
|
JOIN vn.ticketService ts ON ts.ticketFk = t.id
|
||||||
|
|
Loading…
Reference in New Issue