Deploy a rest api application on BTP Cloud foundry to block supplier invoice by...
source link: https://blogs.sap.com/2022/06/05/deploy-a-rest-api-application-on-btp-cloud-foundry-to-block-supplier-invoice-by-calling-soap-api-in-s-4-hana-cloud/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Deploy a rest api application on BTP Cloud foundry to block supplier invoice by calling soap api in s/4 hana cloud
In my previouse blog Use nodejs soap to block supplier invoice by call soap api in s/4 hana cloud,we can payment block supplier invoice with local application. Today I want to blog down developing and deploying a rest api application on BTP Cloud foundry to realize the same function.On BTP,we need to use destination to call soap api in s/4 hana cloud . To to this , we need to replace the default httpClient used in soap client library .
For developing and deploying MTA application , please refer to the blog. The folowing is the how is the MTA application look like .
We need to replace the httpClient used SOAP client with sap-cf-axios to utilize destination . The following is the js code .
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
// const cds = require('@sap/cds');
const core = require('@sap-cloud-sdk/core')
const short = require('short-uuid');
const uuid = require('uuid');
const SapCfAxios = require('sap-cf-axios').default;
const { retrieveJwt } = require('@sap-cloud-sdk/core');
const { desc } = require('@sap-cloud-sdk/core');
url = '/sap/bc/srt/scs_ext/sap/journalentrybulkchangerequest_';
const xssec = require('@sap/xssec');
const passport = require('passport');
const soap = require('soap');
const xsenv = require('@sap/xsenv');
xsenv.loadEnv();
const services = xsenv.getServices({
uaa: { tag: 'xsuaa' }
});
passport.use('JWT', new xssec.JWTStrategy(services.uaa));
app.use(passport.initialize());
app.use(passport.authenticate('JWT', {
session: false
}));
app.use(bodyParser.json());
var invoiceblock = function(req,res){
if (req.authInfo.checkScope('$XSAPPNAME.User')) {
const destinationName = "O5P";
const axios = SapCfAxios(destinationName);
var httpClient1 = {
request: function (url, data, callback, exheaders, exoptions) {
axios({
method: 'POST',
url: url,
data: data,
headers: exheaders
}).then((result) => {
callback(null, result, result.data);
}).catch((e) => {
callback(e);
});
}
}
var options = {
httpClient:httpClient1,
forceSoap12Headers: true
};
soap.createClient('./external/JOURNALENTRYBULKCHANGEREQUEST_.wsdl',options,function(err,client){
if(err){
console.log('soap client creation failed');
console.log(err);
res.status(500).send( err.toString())}
else{
client.setEndpoint(url);
var sid =short.generate();
var id = uuid.v1();
var date1 =new Date().toISOString();
var args = {'MessageHeader':{'ID':sid,'UUID':id,'CreationDateTime':date1},'JournalEntryHeader':{'MessageHeader':{'ID':sid,'CreationDateTime':date1},'HeaderKey':{'AccountingDocument':'5100000050','CompanyCode':'1310','FiscalYear':'2022'},'DocumentHeaderTextChange':{'DocumentHeaderText':'hello1','FieldValueChangeIsRequested':true}},'JournalEntryDebtorCreditorItem':{'MessageHeader':{'ID':sid,'CreationDateTime':date1},'ItemKey':{'AccountingDocument':'5100000050','CompanyCode':'1310','FiscalYear':'2022','AccountingDocumentItemID':'1'},'PaymentBlockingReasonCodeChange':{'PaymentBlockingReasonCode':'A','FieldValueChangeIsRequested':true}}};
client.addSoapHeader({MessageID:id},'http://www.w3.org/2005/08/addressing','wsa','http://www.w3.org/2005/08/addressing');
client.JournalEntryBulkChangeRequest_In(args,function(err,result){
if(err){
console.log('soap call failed');
console.log(err);
res.status(500).send(err.toString());}else{res.status(200).send('Journal Entry sent successfully!');}
});}
});
} else {
res.status(403).send('Forbidden');}}
app.get('/srv/grir',invoiceblock);
app.get('/srv', function (req, res) {
if (req.authInfo.checkScope('$XSAPPNAME.User')) {
res.status(200).send('mtasoap2');
} else {
res.status(403).send('Forbidden');
}
});
const port = process.env.PORT || 5001;
app.listen(port, function () {
console.info('Listening on http://localhost:' + port);
});
The following is the code for package.json
{
"name": "mtasoap2-srv",
"engines": {
"node": "14.x"
},
"dependencies": {
"@sap-cloud-sdk/core": "1.54.2",
"@sap/cloud-sdk-vdm-sales-order-service": "2.0.0",
"@sap/xsenv": "3.2.2",
"@sap/xssec": "3.2.13",
"body-parser": "1.20.0",
"express": "4.18.1",
"passport": "0.6.0",
"sap-cf-axios": "^0.3.5",
"short-uuid": "^4.2.0",
"soap": "^0.43.0",
"uuid": "^8.3.2"
},
"scripts": {
"start": "node server.js"
}
}
The following is the testing effect :
The End.
Best regards!
Jacky Liu
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK