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'] } }] }); // upload file const templateJson = { 'Fields': [ { 'FieldName': 'N__ALBAR_N', 'ItemElementName': 'string', 'Item': id, }, { 'FieldName': 'CIF_PROVEEDOR', 'ItemElementName': 'string', 'Item': ticket.client().fi, }, { 'FieldName': 'CODIGO_PROVEEDOR', 'ItemElementName': 'string', 'Item': ticket.client().id, }, { 'FieldName': 'NOMBRE_PROVEEDOR', 'ItemElementName': 'string', 'Item': ticket.client().socialName, }, { 'FieldName': 'FECHA_FACTURA', 'ItemElementName': 'date', 'Item': ticket.shipped, }, { 'FieldName': 'TOTAL_FACTURA', 'ItemElementName': 'Decimal', 'Item': ticket.totalWithVat, }, { 'FieldName': 'ESTADO', 'ItemElementName': 'string', 'Item': 'Pendiente procesar', }, { 'FieldName': 'FIRMA_', 'ItemElementName': 'string', 'Item': 'Si', }, { 'FieldName': 'FILTRO_TABLET', 'ItemElementName': 'string', 'Item': 'Tablet1', } ] }; if (process.env.NODE_ENV != 'production') throw new UserError('Action not allowed on the test environment'); // delete old const docuwareFile = await models.Docuware.checkFile(ctx, id, fileCabinet, false); if (docuwareFile) { const deleteJson = { 'Field': [{'FieldName': 'ESTADO', 'Item': 'Pendiente eliminar', 'ItemElementName': 'String'}] }; const deleteUri = `${options.url}/FileCabinets/${fileCabinetId}/Documents/${docuwareFile.id}/Fields`; await axios.put(deleteUri, deleteJson, options.headers); } 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'); }); }; };