Ashok Kumar T · Oct 17, 2023 go to post

Thanks for pointing! I thought it's implemented. So, As of now Intersystems FHIR server doesn't have the ability to validate the resource against the profile. Then FHIR Client system need to take care of it

Ashok Kumar T · Oct 17, 2023 go to post

Hello @Luis Angel Pérez Ramos 

Of course, I had added the profile information in the meta data element. like below.

{
    "resourceType":"Patient",
    "meta"{
        "profile":[
            "http://eample.org/fhir/StructureDefinition/TutorialPatient"
        ]
    },
    "name":[
        {
            "use":"official",
            "given":[
                "test"
            ],
            "family":"Patient"
        }
    ]
}
Ashok Kumar T · Oct 16, 2023 go to post

Hello

You can send you're POST/GET URL's as part of the method itself. Refer the below sample codes

  Set httprequest=##class(%Net.HttpRequest).%New()
  Set httpRequest.ContentType = "application/json"
  Set httpRequest.Server = "renderProjectName.onrender.com"
  set httprequest.https=1 ;add this additional set if you're going to make it as a HTTPS call
  set httprequest.SSLConfiguration = "your ssl certificate" ; include the certificate as well for HTTPS call's
  Do httprequest.Post("/")
Ashok Kumar T · Oct 11, 2023 go to post

As for As I see there is no option to export the Business partners along with production export. Even there is no option with with deployable settings and config.Item definition as well. The Business partner details are stored in Ens. Config.BusinessPartner.

So, I hope you need to manually export your global's and import in to the another instance. 

Ashok Kumar T · Oct 11, 2023 go to post

Basically %JSONExport()  API method only works if you're class definition extends with %JSON.Adaptor. class You can even use the below to write your JSON response in UI

do ##Class(%REST.Impl).%WriteResponse(response)
Ashok Kumar T · Oct 11, 2023 go to post

hello @Yone Moreno 

You don't need to include the query params in the Url. That's is basically available in %request CSP object. You can take the query parameter values like below. And :studies represents it's a dynamic URL parameter value.

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
<Route Url="/:studies" Method="GET" Call="consultarEstudiosDatosPaciente"/>
</Routes>
}

ClassMethod consultarEstudiosDatosPaciente(studies As %String="") As %Status
{
    
    set patientId = %request.Get("patientId")
    /// or 
    set patientId = %request.Data("patientId", 1)
    return $$$OK
}
Ashok Kumar T · Oct 6, 2023 go to post

Generally we can't execute the macros directly in terminal, studio output. The Macro preprocessor aka MPP do converts the marcos into the expression or function at the time of compilation. So, You can open and use the .int file for the specific code. 

Test.mac
macromac
 write $$$EnsMajorVersion ; 
Test.int
macromac
 write $system.Version.GetMajor() ; 

Get the relevant value of macros and execute it in terminal or output window.

Ashok Kumar T · Oct 5, 2023 go to post

Hello @Colin Brough 

I Believe, There is no functional difference between rule 1 and rule 2 except the invoking the DTL twice and finally call the Target. By default it has the feature to call multiple targets once the transformation completed. You utilized the feature in rule 2. That's the exact way to call multiple target unless different message and different transformation required. There will be a performance difference should be there. Because it executes the DTL first every time and eventually call the targets asynchronously(Whether it's asynchronous or synchronous It depends on the configuration in production Business process).

Ashok Kumar T · Oct 5, 2023 go to post

xData block data's are basically stored the as a stream object in the class definition. If this is a property oriented then create a stream property  %Stream.GlobalCharacter and store the values.

Ashok Kumar T · Oct 4, 2023 go to post

You can do $Name for the global and use your subscript runtime

set gbl= $NA(^ABC)
write @gbl@(1,2)
set sub=1 
write @gbl@(sub)
Ashok Kumar T · Oct 3, 2023 go to post

%GetSwizzleObject - is basically belongs from the %Persistent Class. The HS.FHIR.DTL.vR4.Model.Resource.Practitioner is extending from the %Library.RegisteredObject class. For the store error you can try increasing the process memory allocation programmatically to maximum by set $zstorage=-1 for the specific process.

Ashok Kumar T · Sep 27, 2023 go to post

Use string functions to get the values in your query. If your OBS_Value  value is already a list then you can take from query $listget(a) as No_Urut instead List(a) as No_Urut. Or if it's a string $PIECE((a,",",1) as No_Urut

Ashok Kumar T · Sep 26, 2023 go to post

Hi @RKumar

You need to set the properties SSLConfiguration and  UseSTARTTLS for enabling SSL configuration

set smtp=##class(%Net.SMTP).%New()
set smtp.SSLConfiguration="TestSSL" ;your SSL configured name in System Management Portal
set smtp.UseSTARTTLS=1
/*
 ... Additional required property set
*/
Ashok Kumar T · Sep 25, 2023 go to post

The syntax of $$$LOGINFO won't allow you make it in multiple lines. Instead you can set it in local variable and pass the variable in LOGINFO for better visibility 

set log= "object: 'This is a try'"
    		_"this is the second line with an example parameter: "_$get(x,1)
    		_"this is the third line with an example parameter: "_$get(y,5)
    
$$$LOGINFO(log)
Ashok Kumar T · Sep 25, 2023 go to post

Hi @Lingnan Zhang 

You can use %File API class to create a directory. This result will be 1 if directory is created else 0. Refer the sample code below

set directory="c:\Test"
write ##class(%File).CreateDirectory(directory) ; result will be 1 if create else 0
Ashok Kumar T · Sep 23, 2023 go to post

I agree with Mr @Mihoko Iijima mentioned points. If Interoperability production need to be executed as part of the FHIR REST call configure HS.FHIRServer.Interop.Service this class in both Production and FHIR server configuration page. No need do it for using the direct Intersystems FHIRServer storage.

Ashok Kumar T · Sep 23, 2023 go to post

You need to pass the subscripts also part of the $NAME itself to make it dynamic instead start from the beginning

USER>s subscript="a" ;your dynamic subscript 
 
USER>set GlobalVar=$NAME(^["IRISMYDEV"]TEST(subscript)) ; pass the subscript into $NAME
 
USER>write GlobalVar
^["IRISMYDEV"]TEST("a")
USER>set sub="" write $o(@GlobalVar@(sub),1,data) ; next subscript of "a"
b
USER>write @GlobalVar
Test
USER>write GlobalVar
^["IRISMYDEV"]TEST("a")
Ashok Kumar T · Sep 22, 2023 go to post

You could add $char(13,10) or $$$NL ( this also refer $c(13,10) ) macro to make a new line

$$$LOGINFO("object: 'This is a try'"_$$$NL_"this is the second line with an example parameter: "_$get(x)_$$$NL_"this is the third line with an example parameter: "_$get(y))
Ashok Kumar T · Sep 22, 2023 go to post

Hi @Ryan Pflughaupt

You need to use the $NAME function set the global variable into local variable to process global names extended global reference dynamically. There is no problem with setting global name in local variable if it's belongs from the current namespace. Use indirection( @ )  operator to do $query,$order,$data string functions and get values from it(Suggest to use $NAME for current namespace global as well) . 

USER>set GlobalVar=$NAME(^["IRISMYDEV"]TEST)
 
USER>zwrite @GlobalVar
^["IRISMYDEV"]TEST("a")="Test"
^["IRISMYDEV"]TEST("a","b")="66739,34774"
^["IRISMYDEV"]TEST("a","b","c")="Apple\Orange-Peach#ball\1#0#1#1"

USER>set sub=$query(@GlobalVar) for  quit:sub=""  write sub,! set sub=$Query(@sub)
^["IRISMYDEV"]TEST("a")
^["IRISMYDEV"]TEST("a","b")
^["IRISMYDEV"]TEST("a","b","c")
 

by using this you can take the values. Check last global reference by using the $zreference function.

Ashok Kumar T · Sep 20, 2023 go to post

Have you tried to pass the provider as a host variable in the query

SELECT ID FROM TestTable WHERE ProviderName = :PROVIDER AND IDType= 'BPI'
Ashok Kumar T · Sep 20, 2023 go to post

Hello @Muhammad Waseem 

Maybe you can try extract the patient resource from bundle or use if it's already resource. Load into FHIR model patient class  HS.FHIR.DTL.vR4.Model.Resource.Patient with the extracted resource. Then you can convert the Birthdate and validate the Age. You can use the same logic in your code DTL in your FHIR process in between FHIR service (HS.FHIRServer.Interop.Service) to FHIR operation (HS.FHIRServer.Interop.Operation)

ClassMethod VaidatePatientResource(patientResourceStreram As %Stream.Object)
{
	#dim patient As HS.FHIR.DTL.vR4.Model.Resource.Patient
	try {
		set patient = ##class(HS.FHIR.DTL.vR4.Model.Resource.Patient).FromJSON(patientResourceStreram)
		Set age = $horolog - $ZdateH(patient.birthDate,3)\360
		if age<18 $$$ThrowStatus($$$ERROR($$$GeneralError, "Age is less than 18"))
	}
	catch ex {
		w ex.DisplayString()
	}
}

Ashok Kumar T · Sep 20, 2023 go to post

Hello @Padmaja Konduru 

The certificate and private key is configured for the your SSL/TLS connection.  You can try  executing the below code to get some certificates of the certificate

I have attached my sample "test" SSL/TLS which is included the sample certificate and private key (x509)

Call the SSLDetails method with your SSL name. This method will return an local array with some basic details like expire date , subject and so on.  SSL configuration name was taken from the   System > Security Management > SSL/TLS Configurations 

/// Call this method with your ssl name
ClassMethod SSLDetails(SSLName As %String = "") As %Status
{
	new $namespace
	set $namespace="%SYS"
	set ssl=##class(Security.SSLConfigs).%OpenId("test")
	set privateKeyFile = ssl.CertificateFile
	set file = ##class(%FileCharacterStream).%New()
	do file.LinkToFile(privateKeyFile)
	set str=file.Read($$$MaxLocalLength)
	do ..certificateDetails(str,.fields)
	zw fields
	return $$$OK
}

ClassMethod certificateDetails(str As %String, ByRef fields)
{
	#;getting some basic  details
	for field="SerialNumber","Issuer","ValidityNotAfter","ValidityNotBefore","Subject","SubjectKeyIdentifier" {
		set fields(field) = $SYSTEM.Encryption.X509GetField(str,field)
	}
}

output

verify the local array fields("ValidityNotAfter") value for the expired date

IRISMYDEV>do ##class(Sample.NewClass1).SSLDetails("test")
fields("Issuer")="L=test,CN=test,O=test,ST=test,C=us"
fields("SerialNumber")=0
fields("Subject")="L=test,CN=test,O=test,ST=test,C=us"
fields("SubjectKeyIdentifier")=$c(144)_"¾&p"_$c(28)_"áÁZÀ"_$c(140)_"Ô4OÜ"_$c(24)_"º""=B"_$c(137)
fields("ValidityNotAfter")="2023-09-21 06:13:50"
fields("ValidityNotBefore")="2023-09-20 06:13:50"
 
Ashok Kumar T · Sep 19, 2023 go to post

Basically Summary Document Architecture aka SDA is an intersystems intermediary format to convert the HL7 Messages to FHIR or create an FHIR resource form custom data. vR4 is representing FHIR version.

So I guess. You may need to upgrade the instance to get vR4 packages