104 lines
3.6 KiB
JavaScript
104 lines
3.6 KiB
JavaScript
module.exports = Self => {
|
|
Self.remoteMethodCtx('createInvoiceIn', {
|
|
description: 'Creates an invoiceIn from one or more agency terms',
|
|
accessType: 'WRITE',
|
|
accepts: [{
|
|
arg: 'rows',
|
|
type: ['object'],
|
|
required: true,
|
|
description: `The rows from which the invoiceIn will be created`,
|
|
},
|
|
{
|
|
arg: 'dms',
|
|
type: ['object'],
|
|
required: true,
|
|
description: 'The dms file attached'
|
|
}],
|
|
returns: {
|
|
type: 'object',
|
|
root: true
|
|
},
|
|
http: {
|
|
path: `/createInvoiceIn`,
|
|
verb: 'POST'
|
|
}
|
|
});
|
|
|
|
Self.createInvoiceIn = async(ctx, rows, dms, options) => {
|
|
const models = Self.app.models;
|
|
|
|
let tx;
|
|
const myOptions = {userId: ctx.req.accessToken.userId};
|
|
|
|
if (typeof options == 'object')
|
|
Object.assign(myOptions, options);
|
|
|
|
if (!myOptions.transaction) {
|
|
tx = await Self.beginTransaction({});
|
|
myOptions.transaction = tx;
|
|
}
|
|
|
|
try {
|
|
const [firstRow] = rows;
|
|
const [firstDms] = dms;
|
|
|
|
const reference = await models.Dms.findById([firstDms.id], null, myOptions);
|
|
|
|
const newInvoiceIn = await models.InvoiceIn.create({
|
|
supplierFk: firstRow.supplierFk,
|
|
supplierRef: reference.reference,
|
|
issued: firstRow.created,
|
|
booked: firstRow.created,
|
|
operated: firstRow.created,
|
|
bookEntried: firstRow.created,
|
|
dmsFk: firstDms.id,
|
|
}, myOptions);
|
|
|
|
const expense = await models.AgencyTermConfig.findOne(null, myOptions);
|
|
|
|
const [taxTypeSage] = await Self.rawSql(`
|
|
SELECT IFNULL(s.taxTypeSageFk, CodigoIva) value
|
|
FROM vn.supplier s
|
|
JOIN sage.TiposIva ti ON TRUE
|
|
JOIN vn.agencyTermConfig atg
|
|
WHERE s.id = ?
|
|
AND ti.CuentaIvaSoportado = atg.vatAccountSupported
|
|
AND ti.PorcentajeIva = atg.vatPercentage
|
|
`, [firstRow.supplierFk], myOptions);
|
|
|
|
const [transactionTypeSage] = await Self.rawSql(`
|
|
SELECT IFNULL(s.transactionTypeSageFk, tt.CodigoTransaccion) value
|
|
FROM vn.supplier s
|
|
JOIN sage.TiposTransacciones tt ON TRUE
|
|
JOIN vn.agencyTermConfig atg
|
|
WHERE s.id = ?
|
|
AND tt.Transaccion = atg.transaction
|
|
`, [firstRow.supplierFk], myOptions);
|
|
|
|
await models.InvoiceInTax.create({
|
|
invoiceInFk: newInvoiceIn.id,
|
|
taxableBase: firstRow.totalPrice,
|
|
expenseFk: expense.expenseFk,
|
|
taxTypeSageFk: taxTypeSage.value,
|
|
transactionTypeSageFk: transactionTypeSage.value
|
|
}, myOptions);
|
|
|
|
await Self.rawSql(`CALL invoiceInDueDay_calculate(?)`, [newInvoiceIn.id], myOptions);
|
|
|
|
for (let agencyTerm of rows) {
|
|
const route = await models.Route.findById(agencyTerm.routeFk, null, myOptions);
|
|
await Self.rawSql(`
|
|
UPDATE vn.route SET invoiceInFk = ? WHERE id = ?
|
|
`, [newInvoiceIn.id, route.id], myOptions);
|
|
}
|
|
|
|
if (tx) await tx.commit();
|
|
|
|
return newInvoiceIn;
|
|
} catch (e) {
|
|
if (tx) await tx.rollback();
|
|
throw e;
|
|
}
|
|
};
|
|
};
|