go to post Julian Matthews · May 17 Hey Jon. One option could be to change the permissions for the source directory to be read only for the account running Ensemble/Healthshare? This way, the adapter will copy the file from the directory but will then be unable to delete it from the directory, while also keeping track of what files it has copied. The log for the passthrough service will be a bit messy at first. but you'll end up with something like: However, if the directory you're going to be checking for documents will be an ever growing list of a large number of documents, then your own suggestion of copying the files into a secondary working directory before being picked up by ensemble might actually be the best option as there's a bit of an overhead for the adapter when it's scanning a directory that contains a large number of files. Depending on how soon after the files creation you need it for onward processing, you could create a scheduled task that copies all files from the previous day into your working directory and then sends an email if that fails for any reason?
go to post Julian Matthews · Apr 19 Hey Kurro.I'm not sure of a built in function for this, but if you wanted to have your own: Class Demo.FunctionSets.Example { ClassMethod Format(InputString As %String, Params... As %String) As %String { Set OutputString = InputString For i = 1 : 1 : $GET(Params, 0){ Set OutputString = $Replace(OutputString,"{"_i_"}",Params(i)) } Quit OutputString } } And then: Write ##Class(Demo.FunctionSets.example).Format("My name is {1} and I'm {2} years","Kurro","18") My name is Kurro and I'm 18 years
go to post Julian Matthews · Apr 19 StackOverflow suggests using svglib and reportlab to achieve this with python: from svglib.svglib import svg2rlg from reportlab.graphics import renderPM drawing = svg2rlg("my.svg") renderPM.drawToFile(drawing, "my.png", fmt="PNG")
go to post Julian Matthews · Apr 13 I would recommend approaching this in three parts: Create a custom message class for your target system. Use a DTL to transform your HL7 into your custom message class Use a custom File Operation to write the file output based on your custom message class For #1, this could be as basic as: Class Demo.Messages.SystemX.CustomBody Extends Ens.Request { Property Param1 As %String; Property Param2 As %String; Property Param3 As %String; Property Etc As %String; } For #2, your transform would then be something like: And then for #3, your file operation would be something along the lines of: Class Demo.Operations.SystemX.FileWriter Extends Ens.BusinessOperation { Parameter ADAPTER = "EnsLib.File.OutboundAdapter"; Property Adapter As EnsLib.File.OutboundAdapter; Parameter INVOCATION = "Queue"; Method OnMessage(pRequest As Demo.Messages.SystemX.CustomBody, Output pResponse As Ens.Response) As %Status { Set Line1 = pRequest.Param1_"|"pRequest.Param2 Set Line2 = pRequest.Param3_"|"pRequest.Param4 Set Line3 = pRequest.Param5_"|"pRequest.Param6 Set outString = Line1_$C(13)_$C(10)_Line2_$C(13)_$C(10)_Line3_$C(13)_$C(10) Set fileName = "Filename" Set sc = ..Adapter.PutString(fileName_".dat",outString) Quit sc } } Please note that the above is a super rough draft - there's no error handling, and you'd need to consider how you'd make the filename unique per message, but I'm hoping this gets you on the right path.
go to post Julian Matthews · Mar 27 Hi @Evgeny Shvarov I don't have anything immediately to hand as I still feel that the reuse of code in Step 3 from the original class method is not best practice, although I do have this running in a live production for 2-3 operations where this was needed. I will try and see if I can get something put together that can be exported and put onto the Open Exchange. Just a warning, I'm not one for Docker, so it'll be a Production deployment export
go to post Julian Matthews · Mar 21 Hey Yuri. The users are held within the SQL table "Security.Users" in the %SYS namespace, so you could use embedded sql to return the information, however as you're unlikely to be executing your code directly from the %SYS namespace, I'd suggest creating a function that you pass the email address, and it returns the username. Something like: Class Demo.Utils.General.Users { ClassMethod UserFromEmail(Email As %String, Output Username As %String) As %Status { //Initially set this to null, as we want to return it empty when we get no results Set Username = "" //Hold the Namespace within a variable so we can use the variable to set the namespace back once the SQL has been run. Set CurrNamespace = $NAMESPACE //Change NameSpace to %SYS Set $NAMESPACE = "%SYS" //Run query to get the Username based on the email address - note the use of the UPPER function to remove issues with case sensitivity &SQL( Select ID into :Username FROM Security.Users WHERE UPPER(EmailAddress) = UPPER(:Email) ) //Set namespace back to the namespace the function was run from Set $NAMESPACE = CurrNamespace //Evaluate SQLCODE for result //Less than 0 is an error. If SQLCODE <0{ WRITE "SQLCODE="_$SYSTEM.SQL.Functions.SQLCODE(SQLCODE) QUIT 0 } //Greater than 0 can really only mean Code 100, which is no results found. If SQLCODE > 0 { QUIT 1 //No Result Found } Else { QUIT 1 //Result Found } } } DEMO> WRITE Class(Demo.Utils.General.Users).UserFromEmail("YuriMarx@ACME.XYZ",.Output) 1 DEMO> WRITE Output YMARX This is by no means perfect as I have thrown it together for the example - please forgive the messy if/else's!
go to post Julian Matthews · Mar 14 There's a few "gotchas" when it comes to Character Encoding. But the key thing in you case is understanding the character encoding being used by the receiving system. This should be something specified in the specification of the receiving system, but many times it's not. If I had to guess, it's most likely that the receiving system is using UTF-8 simply because latin1/ISO-8859-1 encodes the pound symbol as hex "A3" whereas UTF-8 encodes to "C2 A3". As there's no solitary "A3" in UTF-8, there's nothing to print, which is why you get the ? instead. I'm sure there's other character sets where this can happen, but I would start there.
go to post Julian Matthews · Jan 18 Hey Joe. To quickly answer your second question: you will want to take a look at the table Ens.MessageHeader which contains the Session ID, and then the Ens.MessageBody which is linked to the Ens.MessageHeader on the field "MessageBodyId".