Here's what I came up with.

Business service (works in SYNC or ASYNC mode depending on OneWay setting):

Class Passthrough.PassthroughService Extends EnsLib.SOAP.GenericService
{

Property DefaultResponce As %String(MAXLEN = "") [ InitialExpression = "<soap:Envelope><soap:Body></soap:Body></soap:Envelope>" ];

Parameter SETTINGS = "OneWay:Basic";

/// Pass through to OnProcessInput()
Method ProcessBody(pAction As %String, pRequestBody As %CharacterStream, pResponseBody As %CharacterStream) As %Boolean
{
    Set tSC=..ProcessInput(pRequestBody, .pResponseBody, pAction)
    Set:pResponseBody="" pResponseBody = ..DefaultResponce
    Quit $$$OK
}

}

And a BP for ASYNC logging (you need to set it as a target for BS only if you want ASYNC mode and logging, otherwise just call BO directly):

Class Passthrough.PassthroughProcess Extends Ens.BusinessProcess [ ClassType = persistent ]
{

/// Configuration item to which to send messages
Property TargetConfigName As Ens.DataType.ConfigName;

Parameter SETTINGS = "TargetConfigName:Basic:selector?multiSelect=0&context={Ens.ContextSearch/ProductionItems?targets=1&productionName=@productionId}";

Method OnRequest(pRequest As EnsLib.SOAP.GenericMessage, Output pResponse As EnsLib.SOAP.GenericMessage) As %Status
{
    Quit ..SendRequestSync(..TargetConfigName, pRequest, .pResponse)
}

}

Default EnsLib.SOAP.GenericOperation can be used for BO.

  • Do you use an issue tracking / collaboration system? If so which one. Any you would recommend or immediately dismiss based on personal experience?

I use Github and GitLab. Issues are tracked there. They are fairly similar, use GitLab if you want on-premise solution.

  • How do you keep track of large code bases? Thousdands of folders named backup1, backups2, ..., SVN, git?

Git.

  • Do you have a development server to which you commit and test features there, or do you rather run a local copy of caché and implement features locally first, then push to the server?

Everything is implemented and tested locally. Then I push to a version control. Continuous integration does the rest.

You can define a parameter as an ObjectScript expression that it is evaluated at runtime. To do so, specify its type as COSEXPRESSION and specify an ObjectScript expression as the value:

Parameter PARAMNAME As COSEXPRESSION = "ObjectScriptExpression";

where PARAMNAME is the parameter being defined and ObjectScriptExpression is the ObjectScript content that is evaluated at runtime.
An example class parameter definition would be:

Parameter DateParam As COSEXPRESSION = "$H";

Documentation.

That said, I'd recommend gradual refactoring of these parameters into methods.

Ensemble event log?

It is stored in Ens.Util.Log class, so you can easily export it to csv/html/xml/pdf/txt from SQL. Here's a sample export to CSV:

set rs = ##class(%SQL.Statement).%ExecDirect(,"SELECT * FROM Ens_Util.Log")
set file = "C:\InterSystems\Ensemble\mgr\Temp\Ens.Log"
do rs.%DisplayFormatted(100, file) // 100 for CSV format

Docs for %DisplayFormatted.

If it's a part of Ensemble Production, you need to create Business Operation. Here's a sample BO that does POST request:

/// This operation does a POST request to a REST API and receives Auth token
Class Production.Operation.NLPAuthOperation Extends Ens.BusinessOperation
{

Parameter ADAPTER = "EnsLib.HTTP.OutboundAdapter";

Property Adapter As EnsLib.HTTP.OutboundAdapter;

Parameter INVOCATION = "Queue";

/// Get Auth token
Method GetAuth(request As Ens.Request, Output response As Ens.StringResponse) As %Status
{
    #dim sc As %Statis = $$$OK
    
    // Form request body (using Credentials)
    set input = {"user": ( ..Adapter.%CredentialsObj.Username), "pass": (..Adapter.%CredentialsObj.Password)}
    
    // Send post request
    set sc = ..Adapter.Post(.httpResponse,,input.%ToJSON())
    quit:$$$ISERR(sc) sc
    
    // Get token from response
    set token = {}.%FromJSON(httpResponse.Data).token

    //
    set response = ##class(Ens.StringResponse).%New(token)
    quit sc
}

XData MessageMap
{
<MapItems>
    <MapItem MessageType="Ens.Request">
        <Method>GetAuth</Method>
    </MapItem>
</MapItems>
}

}

If you're outside of Ensemble, you need to use %Net.HttpRequest class. Here's an example.