432 lines
16 KiB
JavaScript
432 lines
16 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, dialog) {
|
|
const myUserId = ctx.req.accessToken.userId;
|
|
if (!myUserId)
|
|
throw new UserError(`You don't have enough privileges`);
|
|
|
|
const models = Self.app.models;
|
|
const docuwareConfig = await models.DocuwareConfig.findOne();
|
|
const docuwareInfo = await models.Docuware.findOne({
|
|
where: {
|
|
code: fileCabinet,
|
|
dialogName: dialog
|
|
}
|
|
});
|
|
|
|
const docuwareUrl = docuwareConfig.url;
|
|
const cookie = docuwareConfig.token;
|
|
const fileCabinetName = docuwareInfo.fileCabinetName;
|
|
const options = {
|
|
'headers': {
|
|
'Accept': 'application/json',
|
|
'Content-Type': 'application/json',
|
|
'Cookie': cookie
|
|
}
|
|
};
|
|
|
|
// get fileCabinetId
|
|
const fileCabinetResponse = await got.get(`${docuwareUrl}/FileCabinets`, options);
|
|
const fileCabinetJson = JSON.parse(fileCabinetResponse.body).FileCabinet;
|
|
const fileCabinetId = fileCabinetJson.find(dialogs => dialogs.Name === fileCabinetName).Id;
|
|
|
|
// get dialog
|
|
const dialogResponse = await got.get(`${docuwareUrl}/FileCabinets/${fileCabinetId}/dialogs`, options);
|
|
const dialogJson = JSON.parse(dialogResponse.body).Dialog;
|
|
const storeDialogId = dialogJson.find(dialogs => dialogs.DisplayName === 'Archivar').Id;
|
|
|
|
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 = `${docuwareUrl}/FileCabinets/${fileCabinetId}/Documents?StoreDialogId=${storeDialogId}`;
|
|
|
|
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': cookie,
|
|
...data.getHeaders()
|
|
},
|
|
};
|
|
|
|
return await axios.post(uploadUri, data, uploadOptions)
|
|
.catch(() => {
|
|
throw new UserError('Failed to upload file');
|
|
});
|
|
};
|
|
};
|