#7019 fix(createManualInvoice): add throw error #2175
|
@ -348,5 +348,6 @@
|
||||||
"You are not allowed to modify the alias": "No estás autorizado a modificar el alias",
|
"You are not allowed to modify the alias": "No estás autorizado a modificar el alias",
|
||||||
"The address of the customer must have information about Incoterms and Customs Agent": "El consignatario del cliente debe tener informado Incoterms y Agente de aduanas",
|
"The address of the customer must have information about Incoterms and Customs Agent": "El consignatario del cliente debe tener informado Incoterms y Agente de aduanas",
|
||||||
"This password can only be changed by the user themselves": "Esta contraseña solo puede ser modificada por el propio usuario",
|
"This password can only be changed by the user themselves": "Esta contraseña solo puede ser modificada por el propio usuario",
|
||||||
"They're not your subordinate": "No es tu subordinado/a."
|
"They're not your subordinate": "No es tu subordinado/a.",
|
||||||
|
"Select ticket or client": "Elija un ticket o un client"
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,12 +46,11 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.createManualInvoice = async(ctx, options) => {
|
Self.createManualInvoice = async(ctx, clientFk, ticketFk, maxShipped, serial, taxArea, reference, options) => {
|
||||||
|
if (!clientFk && !ticketFk) throw new UserError(`Select ticket or client`);
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
const args = ctx.args;
|
|
||||||
|
|
||||||
let tx;
|
|
||||||
const myOptions = {userId: ctx.req.accessToken.userId};
|
const myOptions = {userId: ctx.req.accessToken.userId};
|
||||||
|
let tx;
|
||||||
|
|
||||||
if (typeof options == 'object')
|
if (typeof options == 'object')
|
||||||
Object.assign(myOptions, options);
|
Object.assign(myOptions, options);
|
||||||
|
@ -61,18 +60,15 @@ module.exports = Self => {
|
||||||
myOptions.transaction = tx;
|
myOptions.transaction = tx;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ticketId = args.ticketFk;
|
|
||||||
let clientId = args.clientFk;
|
|
||||||
let maxShipped = args.maxShipped;
|
|
||||||
let companyId;
|
let companyId;
|
||||||
let newInvoice;
|
let newInvoice;
|
||||||
let query;
|
let query;
|
||||||
try {
|
try {
|
||||||
if (ticketId) {
|
if (ticketFk) {
|
||||||
const ticket = await models.Ticket.findById(ticketId, null, myOptions);
|
const ticket = await models.Ticket.findById(ticketFk, null, myOptions);
|
||||||
const company = await models.Company.findById(ticket.companyFk, null, myOptions);
|
const company = await models.Company.findById(ticket.companyFk, null, myOptions);
|
||||||
|
|
||||||
clientId = ticket.clientFk;
|
clientFk = ticket.clientFk;
|
||||||
maxShipped = ticket.shipped;
|
maxShipped = ticket.shipped;
|
||||||
companyId = ticket.companyFk;
|
companyId = ticket.companyFk;
|
||||||
|
|
||||||
|
@ -85,7 +81,7 @@ module.exports = Self => {
|
||||||
throw new UserError(`A ticket with an amount of zero can't be invoiced`);
|
throw new UserError(`A ticket with an amount of zero can't be invoiced`);
|
||||||
|
|
||||||
// Validates ticket nagative base
|
// Validates ticket nagative base
|
||||||
const hasNegativeBase = await getNegativeBase(maxShipped, clientId, companyId, myOptions);
|
const hasNegativeBase = await getNegativeBase(maxShipped, clientFk, companyId, myOptions);
|
||||||
if (hasNegativeBase && company.code == 'VNL')
|
if (hasNegativeBase && company.code == 'VNL')
|
||||||
throw new UserError(`A ticket with a negative base can't be invoiced`);
|
throw new UserError(`A ticket with a negative base can't be invoiced`);
|
||||||
} else {
|
} else {
|
||||||
|
@ -95,7 +91,7 @@ module.exports = Self => {
|
||||||
const company = await models.Ticket.findOne({
|
const company = await models.Ticket.findOne({
|
||||||
fields: ['companyFk'],
|
fields: ['companyFk'],
|
||||||
where: {
|
where: {
|
||||||
clientFk: clientId,
|
clientFk: clientFk,
|
||||||
shipped: {lte: maxShipped}
|
shipped: {lte: maxShipped}
|
||||||
}
|
}
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
@ -103,7 +99,7 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate invoiceable client
|
// Validate invoiceable client
|
||||||
const isClientInvoiceable = await isInvoiceable(clientId, myOptions);
|
const isClientInvoiceable = await isInvoiceable(clientFk, myOptions);
|
||||||
if (!isClientInvoiceable)
|
if (!isClientInvoiceable)
|
||||||
throw new UserError(`This client is not invoiceable`);
|
throw new UserError(`This client is not invoiceable`);
|
||||||
|
|
||||||
|
@ -114,27 +110,27 @@ module.exports = Self => {
|
||||||
if (maxShipped >= tomorrow)
|
if (maxShipped >= tomorrow)
|
||||||
throw new UserError(`Can't invoice to future`);
|
throw new UserError(`Can't invoice to future`);
|
||||||
|
|
||||||
const maxInvoiceDate = await getMaxIssued(args.serial, companyId, myOptions);
|
const maxInvoiceDate = await getMaxIssued(serial, companyId, myOptions);
|
||||||
if (Date.vnNew() < maxInvoiceDate)
|
if (Date.vnNew() < maxInvoiceDate)
|
||||||
throw new UserError(`Can't invoice to past`);
|
throw new UserError(`Can't invoice to past`);
|
||||||
|
|
||||||
if (ticketId) {
|
if (ticketFk) {
|
||||||
query = `CALL invoiceOut_newFromTicket(?, ?, ?, ?, @newInvoiceId)`;
|
query = `CALL invoiceOut_newFromTicket(?, ?, ?, ?, @newInvoiceId)`;
|
||||||
await Self.rawSql(query, [
|
await Self.rawSql(query, [
|
||||||
ticketId,
|
ticketFk,
|
||||||
args.serial,
|
serial,
|
||||||
args.taxArea,
|
taxArea,
|
||||||
args.reference
|
reference
|
||||||
], myOptions);
|
], myOptions);
|
||||||
} else {
|
} else {
|
||||||
query = `CALL invoiceOut_newFromClient(?, ?, ?, ?, ?, ?, @newInvoiceId)`;
|
query = `CALL invoiceOut_newFromClient(?, ?, ?, ?, ?, ?, @newInvoiceId)`;
|
||||||
await Self.rawSql(query, [
|
await Self.rawSql(query, [
|
||||||
clientId,
|
clientFk,
|
||||||
args.serial,
|
serial,
|
||||||
maxShipped,
|
maxShipped,
|
||||||
companyId,
|
companyId,
|
||||||
args.taxArea,
|
taxArea,
|
||||||
args.reference
|
reference
|
||||||
], myOptions);
|
], myOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,26 +142,27 @@ module.exports = Self => {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newInvoice.id)
|
if (!newInvoice.id) throw new UserError(`...`);
|
||||||
await Self.createPdf(ctx, newInvoice.id);
|
|
||||||
|
await Self.createPdf(ctx, newInvoice.id);
|
||||||
|
|
||||||
return newInvoice;
|
return newInvoice;
|
||||||
};
|
};
|
||||||
|
|
||||||
async function isInvoiceable(clientId, options) {
|
async function isInvoiceable(clientFk, options) {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
const query = `SELECT (hasToInvoice AND isTaxDataChecked) AS invoiceable
|
const query = `SELECT (hasToInvoice AND isTaxDataChecked) AS invoiceable
|
||||||
FROM client
|
FROM client
|
||||||
WHERE id = ?`;
|
WHERE id = ?`;
|
||||||
const [result] = await models.InvoiceOut.rawSql(query, [clientId], options);
|
const [result] = await models.InvoiceOut.rawSql(query, [clientFk], options);
|
||||||
|
|
||||||
return result.invoiceable;
|
return result.invoiceable;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getNegativeBase(maxShipped, clientId, companyId, options) {
|
async function getNegativeBase(maxShipped, clientFk, companyId, options) {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
await models.InvoiceOut.rawSql('CALL invoiceOut_exportationFromClient(?,?,?)',
|
await models.InvoiceOut.rawSql('CALL invoiceOut_exportationFromClient(?,?,?)',
|
||||||
[maxShipped, clientId, companyId], options
|
[maxShipped, clientFk, companyId], options
|
||||||
);
|
);
|
||||||
const query = 'SELECT vn.hasAnyNegativeBase() AS base';
|
const query = 'SELECT vn.hasAnyNegativeBase() AS base';
|
||||||
const [result] = await models.InvoiceOut.rawSql(query, [], options);
|
const [result] = await models.InvoiceOut.rawSql(query, [], options);
|
||||||
|
|
Loading…
Reference in New Issue