Files
old-svijetlastrana/application/third/eligibility/bcbsi/bxe.go
2018-05-16 18:30:59 +02:00

152 lines
4.0 KiB
Go

package bcbsi
import (
"bytes"
"crypto/md5"
"encoding/hex"
"encoding/xml"
"errors"
"fmt"
"html"
"io/ioutil"
"net/http"
"strings"
"time"
"github.com/pquerna/ffjson/ffjson"
"bitbucket.org/nemt/nemt-portal-api/application/third/eligibility/bcbsi/bcbsimodel"
"bitbucket.org/nemt/nemt-portal-api/application/viewmodel"
"bitbucket.org/nemt/nemt-portal-api/infra/config"
)
type bxeService struct {
cfg *config.Config
}
func newBXEService(cfg *config.Config) *bxeService {
return &bxeService{
cfg: cfg,
}
}
func (s bxeService) getSignature(APIKey string, secretKey string) string {
rawKey := fmt.Sprintf("%s%s%v", APIKey, secretKey, time.Now().Unix())
hasher := md5.New()
hasher.Write([]byte(rawKey))
key := hex.EncodeToString(hasher.Sum(nil))
return strings.ToLower(key)
}
func (s bxeService) GetPayerDetails(subscriberID string) ([]bcbsimodel.EntityResponse, error) {
apiKey := s.cfg.Blue365.APIKey
secretKey := s.cfg.Blue365.Secret
URL := s.cfg.Blue365.URL
prefix := subscriberID[:3]
client := &http.Client{}
req, _ := http.NewRequest("GET", URL+"/"+prefix, bytes.NewBuffer([]byte{}))
req.Header.Add("X-Api-Key", apiKey)
req.Header.Add("X-Signature", s.getSignature(apiKey, secretKey))
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error Blue365: ", err)
return nil, err
}
defer resp.Body.Close()
bReturn, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error Blue365: ", err)
return nil, err
}
var response []bcbsimodel.EntityResponse
err = ffjson.Unmarshal(bReturn, &response)
if err != nil {
fmt.Println("Error Blue365: ", err)
return nil, err
}
return response, nil
}
func (s bxeService) Get271(eligibility viewmodel.Eligibility) (bcbsimodel.Interchange271, error) {
resp, err := s.CheckEligibility(eligibility)
if err != nil {
return bcbsimodel.Interchange271{}, err
}
if resp.QueryResult.HIPPA271.T271 != "" {
xmlString := html.UnescapeString(resp.QueryResult.HIPPA271.T271)
xmlReader := strings.NewReader(xmlString)
var f bcbsimodel.Interchange271
err = xml.NewDecoder(xmlReader).Decode(&f)
if err != nil {
fmt.Println("Error to unmarshal: ", err.Error())
return bcbsimodel.Interchange271{}, err
}
return f, nil
} else {
return bcbsimodel.Interchange271{}, errors.New("No 271 response")
}
}
func (s bxeService) CheckEligibility(eligibility viewmodel.Eligibility) (bcbsimodel.MemberEligibilityResponse, error) {
// payer, err := s.GetPayerDetails(eligibility.Subscriber.SubscriberID)
// if err != nil {
// return bcbsimodel.MemberEligibilityResponse{}, err
// }
eligibility.Payer.PayerID = "621"
eligibility.Payer.PayerName = "blue_cross_blue_shield_il"
envelope := bcbsimodel.GetEnvelope(eligibility)
apiKey := s.cfg.BXE.APIKey
secretKey := s.cfg.BXE.Secret
bObj, err := xml.Marshal(envelope)
if err != nil {
return bcbsimodel.MemberEligibilityResponse{}, err
}
client := &http.Client{}
req, _ := http.NewRequest("POST", s.cfg.BXE.URL, bytes.NewBuffer(bObj))
req.Header.Add("Soapaction", "CheckEligibility")
req.Header.Add("Content-Type", "text/xml")
req.Header.Add("X-Api-Key", apiKey)
req.Header.Add("X-Signature", s.getSignature(apiKey, secretKey))
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error WebService Request: ", err)
return bcbsimodel.MemberEligibilityResponse{}, err
}
defer resp.Body.Close()
bReturn, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error WebService getting byte: ", err)
return bcbsimodel.MemberEligibilityResponse{}, err
}
sResponse := string(bReturn)
sResponse = strings.Replace(sResponse, "soapenv:Envelope", "Envelope", -1)
sResponse = strings.Replace(sResponse, "soapenv:Body", "Body", -1)
sResponse = strings.Replace(sResponse, "ns2:", "", -1)
var result bcbsimodel.EnvelopeResponse
err = xml.Unmarshal([]byte(sResponse), &result)
if err != nil {
fmt.Println("Error WebService getting object: ", err)
return bcbsimodel.MemberEligibilityResponse{}, err
}
return result.Body.MemberEligibilityResponse, nil
}