406 lines
14 KiB
JavaScript
406 lines
14 KiB
JavaScript
const got = require('got');
|
|
const UserError = require('vn-loopback/util/user-error');
|
|
const axios = require('axios');
|
|
|
|
module.exports = Self => {
|
|
Self.remoteMethodCtx('upload', {
|
|
description: 'Upload an docuware PDF',
|
|
accessType: 'WRITE',
|
|
accepts: [
|
|
{
|
|
arg: 'id',
|
|
type: 'number',
|
|
description: 'The ticket id',
|
|
http: {source: 'path'}
|
|
},
|
|
{
|
|
arg: 'fileCabinet',
|
|
type: 'string',
|
|
description: 'The file cabinet'
|
|
},
|
|
{
|
|
arg: 'dialog',
|
|
type: 'string',
|
|
description: 'The dialog'
|
|
}
|
|
],
|
|
returns: [],
|
|
http: {
|
|
path: `/:id/upload`,
|
|
verb: 'POST'
|
|
}
|
|
});
|
|
|
|
Self.upload = async function(ctx, id, fileCabinet) {
|
|
const models = Self.app.models;
|
|
const action = 'store';
|
|
|
|
const options = await Self.getOptions();
|
|
const fileCabinetId = await Self.getFileCabinet(fileCabinet);
|
|
const dialogId = await Self.getDialog(fileCabinet, action, fileCabinetId);
|
|
|
|
// get delivery note
|
|
const deliveryNote = await models.Ticket.deliveryNotePdf(ctx, {
|
|
id,
|
|
type: 'deliveryNote'
|
|
});
|
|
|
|
// get ticket data
|
|
const ticket = await models.Ticket.findById(id, {
|
|
include: [{
|
|
relation: 'client',
|
|
scope: {
|
|
fields: ['id', 'socialName', 'fi']
|
|
}
|
|
}]
|
|
});
|
|
const [taxes] = await models.Ticket.rawSql('CALL vn.ticketGetTaxAdd(?)', [id]);
|
|
|
|
// upload file
|
|
const templateJson = {
|
|
'Fields': [
|
|
{
|
|
'FieldName': 'N__ALBAR_N',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'string',
|
|
'PointAndShootInfo': {
|
|
'Box': [
|
|
{
|
|
'Left': 2531,
|
|
'Top': 3645,
|
|
'Width': 257,
|
|
'Height': 230,
|
|
'PageNumber': 0
|
|
}
|
|
],
|
|
'PageNumber': 0
|
|
},
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': id,
|
|
'FieldValue': id
|
|
},
|
|
{
|
|
'FieldName': 'CIF_PROVEEDOR',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'string',
|
|
'PointAndShootInfo': {
|
|
'Box': [
|
|
{
|
|
'Left': 6176,
|
|
'Top': 4624,
|
|
'Width': 839,
|
|
'Height': 168,
|
|
'PageNumber': 0
|
|
}
|
|
],
|
|
'PageNumber': 0
|
|
},
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': ticket.client().fi,
|
|
'FieldValue': ticket.client().fi
|
|
},
|
|
{
|
|
'FieldName': 'CODIGO_PROVEEDOR',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'string',
|
|
'PointAndShootInfo': {
|
|
'Box': [
|
|
{
|
|
'Left': 2531,
|
|
'Top': 3240,
|
|
'Width': 514,
|
|
'Height': 230,
|
|
'PageNumber': 0
|
|
}
|
|
],
|
|
'PageNumber': 0
|
|
},
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': ticket.client().id,
|
|
'FieldValue': ticket.client().id
|
|
},
|
|
{
|
|
'FieldName': 'NOMBRE_PROVEEDOR',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'string',
|
|
'PointAndShootInfo': {
|
|
'Box': [
|
|
{
|
|
'Left': 6175,
|
|
'Top': 4264,
|
|
'Width': 858,
|
|
'Height': 168,
|
|
'PageNumber': 0
|
|
}
|
|
],
|
|
'PageNumber': 0
|
|
},
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': ticket.client().socialName,
|
|
'FieldValue': ticket.client().socialName
|
|
},
|
|
{
|
|
'FieldName': 'FECHA_FACTURA',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'date',
|
|
'PointAndShootInfo': {
|
|
'Box': [
|
|
{
|
|
'Left': 2531,
|
|
'Top': 4050,
|
|
'Width': 1181,
|
|
'Height': 230,
|
|
'PageNumber': 0
|
|
}
|
|
],
|
|
'PageNumber': 0
|
|
},
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': ticket.shipped,
|
|
'FieldValue': ticket.shipped
|
|
},
|
|
{
|
|
'FieldName': 'TIPO_IVA__1_',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'Decimal',
|
|
'PointAndShootInfo': {
|
|
'Box': [
|
|
{
|
|
'Left': 9537,
|
|
'Top': 10057,
|
|
'Width': 615,
|
|
'Height': 168,
|
|
'PageNumber': 0
|
|
}
|
|
],
|
|
'PageNumber': 0
|
|
},
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': taxes[0].rate,
|
|
'FieldValue': taxes[0].rate
|
|
},
|
|
{
|
|
'FieldName': 'BASE_IMPONIBLE__1_',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'Decimal',
|
|
'PointAndShootInfo': {
|
|
'Box': [
|
|
{
|
|
'Left': 8907,
|
|
'Top': 10567,
|
|
'Width': 419,
|
|
'Height': 168,
|
|
'PageNumber': 0
|
|
}
|
|
],
|
|
'PageNumber': 0
|
|
},
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': ticket.totalWithoutVat,
|
|
'FieldValue': ticket.totalWithoutVat
|
|
},
|
|
{
|
|
'FieldName': 'IMPORTE_IVA__1_',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'Decimal',
|
|
'PointAndShootInfo': {
|
|
'Box': [
|
|
{
|
|
'Left': 10423,
|
|
'Top': 10057,
|
|
'Width': 419,
|
|
'Height': 168,
|
|
'PageNumber': 0
|
|
}
|
|
],
|
|
'PageNumber': 0
|
|
},
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': taxes[0].tax,
|
|
'FieldValue': taxes[0].tax
|
|
},
|
|
{
|
|
'FieldName': 'TIPO_IVA__2_',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'Decimal',
|
|
'PointAndShootInfo': null,
|
|
'IsAutoNumber': false,
|
|
'IsNull': true,
|
|
'Item': null,
|
|
'FieldValue': null
|
|
},
|
|
{
|
|
'FieldName': 'BASE_IMPONIBLE__2_',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'Decimal',
|
|
'PointAndShootInfo': null,
|
|
'IsAutoNumber': false,
|
|
'IsNull': true,
|
|
'Item': null,
|
|
'FieldValue': null
|
|
},
|
|
{
|
|
'FieldName': 'IMPORTE_IVA__2_',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'Decimal',
|
|
'PointAndShootInfo': null,
|
|
'IsAutoNumber': false,
|
|
'IsNull': true,
|
|
'Item': null,
|
|
'FieldValue': null
|
|
},
|
|
{
|
|
'FieldName': 'TIPO_IVA__3_',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'Decimal',
|
|
'PointAndShootInfo': null,
|
|
'IsAutoNumber': false,
|
|
'IsNull': true,
|
|
'Item': null,
|
|
'FieldValue': null
|
|
},
|
|
{
|
|
'FieldName': 'BASE_IMPONIBLE__3_',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'Decimal',
|
|
'PointAndShootInfo': null,
|
|
'IsAutoNumber': false,
|
|
'IsNull': true,
|
|
'Item': null,
|
|
'FieldValue': null
|
|
},
|
|
{
|
|
'FieldName': 'IMPORTE_IVA__3_',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'Decimal',
|
|
'PointAndShootInfo': null,
|
|
'IsAutoNumber': false,
|
|
'IsNull': true,
|
|
'Item': null,
|
|
'FieldValue': null
|
|
},
|
|
{
|
|
'FieldName': 'IRPF',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'Decimal',
|
|
'PointAndShootInfo': null,
|
|
'IsAutoNumber': false,
|
|
'IsNull': true,
|
|
'Item': null,
|
|
'FieldValue': null
|
|
},
|
|
{
|
|
'FieldName': 'TOTAL_FACTURA',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'Decimal',
|
|
'PointAndShootInfo': {
|
|
'Box': [
|
|
{
|
|
'Left': 10423,
|
|
'Top': 10958,
|
|
'Width': 419,
|
|
'Height': 168,
|
|
'PageNumber': 0
|
|
}
|
|
],
|
|
'PageNumber': 0
|
|
},
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': ticket.totalWithVat,
|
|
'FieldValue': ticket.totalWithVat
|
|
},
|
|
{
|
|
'FieldName': 'ESTADO',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'string',
|
|
'PointAndShootInfo': null,
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': 'Pendiente procesar',
|
|
'FieldValue': 'Pendiente procesar'
|
|
},
|
|
{
|
|
'FieldName': 'URL',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'string',
|
|
'PointAndShootInfo': null,
|
|
'IsAutoNumber': false,
|
|
'IsNull': true,
|
|
'Item': null,
|
|
'FieldValue': ''
|
|
},
|
|
{
|
|
'FieldName': 'FIRMA_',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'string',
|
|
'PointAndShootInfo': null,
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': 'Si',
|
|
'FieldValue': 'Si'
|
|
},
|
|
{
|
|
'FieldName': 'FILTRO_TABLET',
|
|
'ReadOnly': false,
|
|
'SystemField': false,
|
|
'ItemElementName': 'string',
|
|
'PointAndShootInfo': null,
|
|
'IsAutoNumber': false,
|
|
'IsNull': false,
|
|
'Item': 'Tablet1',
|
|
'FieldValue': 'Tablet1'
|
|
}
|
|
]
|
|
};
|
|
|
|
const uploadUri = `${options.url}/FileCabinets/${fileCabinetId}/Documents?StoreDialogId=${dialogId}`;
|
|
|
|
const FormData = require('form-data');
|
|
const data = new FormData();
|
|
|
|
data.append('document', JSON.stringify(templateJson), 'schema.json');
|
|
data.append('file[]', deliveryNote[0], 'file.pdf');
|
|
const uploadOptions = {
|
|
headers: {
|
|
'Content-Type': 'multipart/form-data',
|
|
'X-File-ModifiedDate': new Date(),
|
|
'Cookie': options.headers.headers.Cookie,
|
|
...data.getHeaders()
|
|
},
|
|
};
|
|
|
|
return await axios.post(uploadUri, data, uploadOptions)
|
|
.catch(() => {
|
|
throw new UserError('Failed to upload file');
|
|
});
|
|
};
|
|
};
|