feat: refs #7134 refs #6427 #7134 add new supplier/receipts method
gitea/salix/pipeline/pr-dev This commit looks good Details

This commit is contained in:
Javier Segarra 2024-11-11 14:47:21 +01:00
parent a254cb19cd
commit 62243e164a
3 changed files with 248 additions and 0 deletions

View File

@ -0,0 +1,173 @@
const UserError = require('vn-loopback/util/user-error');
// Insert payment
// divisa = solo en caso que la moneda sea distinta a €,
module.exports = function(Self) {
Self.remoteMethodCtx('createReceipt', {
description: 'Creates receipt and its compensation if necessary',
accessType: 'READ',
accepts: [{
arg: 'supplierFk',
type: 'number',
description: 'The supplier id',
http: {source: 'path'}
},
{
arg: 'received',
type: 'Date',
required: true
},
{
arg: 'dueDate',
type: 'Date',
required: true
},
{
arg: 'companyFk',
type: 'number',
required: true
},
{
arg: 'currencyFk',
type: 'number',
required: true
},
{
arg: 'bankFk',
type: 'number',
required: true
},
{
arg: 'payMethodFk',
type: 'number',
required: true
},
{
arg: 'amount',
type: 'number',
required: true
},
{
arg: 'concept',
type: 'string',
required: true
},
{
arg: 'divisa',
type: 'number'
},
{
arg: 'compensationAccount',
type: 'any'
}],
returns: {
root: true,
type: 'Object'
},
http: {
verb: 'post',
path: '/:supplierFk/createReceipt'
},
accessScopes: ['DEFAULT', 'read:multimedia']
});
Self.createReceipt = async(ctx, options) => {
const models = Self.app.models;
const args = ctx.args;
const date = Date.vnNew();
date.setHours(0, 0, 0, 0);
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 {
delete args.ctx; // Remove unwanted properties
const originalSupplier = await models.Supplier.findById(args.supplierFk, null, myOptions);
const bank = await models.Accounting.findById(args.bankFk, null, myOptions);
const accountingType = await models.AccountingType.findById(bank.accountingTypeFk, null, myOptions);
if (accountingType.code == 'compensation') {
if (!args.compensationAccount)
throw new UserError('Compensation account is empty');
// Check compensation account exists
await models.Supplier.getClientOrSupplierReference(args.compensationAccount, myOptions);
await Self.rawSql(
`CALL vn.ledger_doCompensation(?, ?, ?, ?, ?, ?, ?)`,
[
date,
args.compensationAccount,
args.bankFk,
accountingType.receiptDescription + originalSupplier.accountingAccount,
args.amountPaid,
args.companyFk,
originalSupplier.accountingAccount
],
myOptions
);
} else if (accountingType.isAutoConciliated == true) {
const description =
`${originalSupplier.id} : ${originalSupplier.socialName} - ${accountingType.receiptDescription}`;
const [, [xdiarioNew]] = await Self.rawSql(
`CALL xdiario_new(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, @xdiarioNew);
SELECT @xdiarioNew ledger;`,
[
null,
date,
bank.account,
originalSupplier.accountingAccount,
description,
args.amountPaid,
0,
0,
'',
'',
null,
null,
false,
args.companyFk
],
myOptions
);
await Self.rawSql(
`CALL xdiario_new(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, @xdiarioNew);`,
[
xdiarioNew.ledger,
date,
originalSupplier.accountingAccount,
bank.account,
description,
0,
args.amountPaid,
0,
'',
'',
null,
null,
false,
args.companyFk
],
myOptions
);
}
const newReceipt = await models.Receipt.create(args, myOptions);
if (tx) await tx.commit();
return newReceipt;
} catch (e) {
if (tx) await tx.rollback();
throw e;
}
};
};

View File

@ -0,0 +1,73 @@
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
module.exports = Self => {
Self.remoteMethodCtx('receipts', {
description: 'Find all clients matched by the filter',
accessType: 'READ',
accepts: [
{
arg: 'supplierId',
type: 'number',
description: 'The supplier id',
},
{
arg: 'companyId',
type: 'number',
description: 'The company id',
},
{
arg: 'currencyFk',
type: 'number',
description: 'The currency',
default: 1,
},
{
arg: 'orderBy',
type: 'string',
description: 'The client fiscal id',
enum: ['issued', ' bookEntried', ' booked', ' dueDate'],
},
{
arg: 'isConciliated',
default: false,
type: 'boolean',
},
],
returns: {
type: ['object'],
root: true
},
http: {
path: `/receipts`,
verb: 'GET'
}
});
Self.receipts = async(ctx, filter, options) => {
const conn = Self.dataSource.connector;
const myOptions = {userId: ctx.req.accessToken.userId};
const args = ctx.args;
if (typeof options == 'object')
Object.assign(myOptions, options);
let stmts = [];
stmts.push(new ParameterizedSQL('CALL vn.supplier_statementWithEntries(?,?,?,?,?,?)', [
args.supplierId,
args.currencyFk ?? 1,
args.companyId,
args.orderBy ?? 'issued',
args.isConciliated ?? false,
false
]));
stmts.push(`
SELECT *
FROM tmp.supplierStatement`);
stmts.push(`DROP TEMPORARY TABLE tmp.supplierStatement`);
const sql = ParameterizedSQL.join(stmts, ';');
const results = await conn.executeStmt(sql);
const resultsIndex = stmts.length - 1;
const result = results[resultsIndex];
return result;
};
};

View File

@ -8,6 +8,8 @@ module.exports = Self => {
require('../methods/supplier/updateFiscalData')(Self);
require('../methods/supplier/consumption')(Self);
require('../methods/supplier/freeAgencies')(Self);
require('../methods/supplier/createReceipt')(Self);
require('../methods/supplier/receipts')(Self);
require('../methods/supplier/campaignMetricsPdf')(Self);
require('../methods/supplier/campaignMetricsEmail')(Self);
require('../methods/supplier/newSupplier')(Self);