7

Deploy a rest api application on BTP Cloud foundry to block supplier invoice by...

 2 years ago
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.
neoserver,ios ssh client
June 5, 2022 2 minute read

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 .

6-8.png

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 :

7-7.png
8-7.png

The End.

Best regards!

Jacky Liu


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK