InsuranceBizLogic 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/bizLogic/VPMSHelper.rb +187 -0
 - data/lib/bizLogic/applymta.rb +82 -0
 - data/lib/bizLogic/continualQNB.rb +8 -0
 - data/lib/bizLogic/diff.rb +39 -0
 - data/lib/bizLogic/payment.rb +88 -0
 - data/lib/bizLogic/search.rb +34 -0
 - data/lib/bizLogic/xquery1 +28 -0
 - data/lib/bizLogic/xquery2 +5 -0
 - data/lib/processengine/HashEnhancement.rb +59 -0
 - data/lib/processengine/communicator.rb +18 -0
 - data/lib/processengine/engine.rb +247 -0
 - data/lib/servicebroker/broker.rb +74 -0
 - data/lib/servicebroker/mocks/CommercialCombinedQuoteNBRs.xml +2291 -0
 - data/lib/servicebroker/mocks/RoadRisksQuoteNBRs.xml +469 -0
 - data/lib/servicebroker/xsl/extractCode.xsl +11 -0
 - data/lib/servicebroker/xsl/extractDescription.xsl +11 -0
 - data/lib/servicebroker/xsl/extractPremium.xsl +52 -0
 - data/lib/servicebroker/xsl/in_MotorTrade.xsl +561 -0
 - metadata +92 -0
 
| 
         @@ -0,0 +1,187 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2008 Orangery Technology Limited 
         
     | 
| 
      
 2 
     | 
    
         
            +
            # You can redistribute it and/or modify it under the same terms as Ruby.
         
     | 
| 
      
 3 
     | 
    
         
            +
            # 
         
     | 
| 
      
 4 
     | 
    
         
            +
            module VPMSHelper
         
     | 
| 
      
 5 
     | 
    
         
            +
              include REXML
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              def mergeIntoXMLDoc(xml,premiums)
         
     | 
| 
      
 8 
     | 
    
         
            +
                doc = Document.new(xml)
         
     | 
| 
      
 9 
     | 
    
         
            +
                #premiums is a named value pair array
         
     | 
| 
      
 10 
     | 
    
         
            +
                premiums.each do |singleResult|
         
     | 
| 
      
 11 
     | 
    
         
            +
                  value = singleResult.pop
         
     | 
| 
      
 12 
     | 
    
         
            +
                  path = Array.new
         
     | 
| 
      
 13 
     | 
    
         
            +
                  insertionNode = nil
         
     | 
| 
      
 14 
     | 
    
         
            +
                  found_where_to_insert = false
         
     | 
| 
      
 15 
     | 
    
         
            +
                  singleResult.each do |a|
         
     | 
| 
      
 16 
     | 
    
         
            +
                      path.push("/#{a}")
         
     | 
| 
      
 17 
     | 
    
         
            +
                      nodes = XPath.match(doc,"/#{path}")
         
     | 
| 
      
 18 
     | 
    
         
            +
                      if (a != singleResult.last)
         
     | 
| 
      
 19 
     | 
    
         
            +
                        if nodes.length <= 0
         
     | 
| 
      
 20 
     | 
    
         
            +
                          path.pop
         
     | 
| 
      
 21 
     | 
    
         
            +
                          insertionNode = XPath.first(doc,"/#{path}")
         
     | 
| 
      
 22 
     | 
    
         
            +
                          insertionNode.insert_after insertionNode,Element.new(a)
         
     | 
| 
      
 23 
     | 
    
         
            +
                          path.push("/#{a}")
         
     | 
| 
      
 24 
     | 
    
         
            +
                          insertionNode = XPath.first(doc,"/#{path}")
         
     | 
| 
      
 25 
     | 
    
         
            +
                        elsif (nodes.length == 1)
         
     | 
| 
      
 26 
     | 
    
         
            +
                          insertionNode = nodes[0]
         
     | 
| 
      
 27 
     | 
    
         
            +
                        end
         
     | 
| 
      
 28 
     | 
    
         
            +
                      else
         
     | 
| 
      
 29 
     | 
    
         
            +
                        if nodes.length > 0
         
     | 
| 
      
 30 
     | 
    
         
            +
                          #leaf node already there and maybe with an old value from previous page
         
     | 
| 
      
 31 
     | 
    
         
            +
                        else
         
     | 
| 
      
 32 
     | 
    
         
            +
                          path.pop
         
     | 
| 
      
 33 
     | 
    
         
            +
                          e = Element.new(a)
         
     | 
| 
      
 34 
     | 
    
         
            +
                          e.text = value
         
     | 
| 
      
 35 
     | 
    
         
            +
                          insertionNode.insert_after insertionNode,e
         
     | 
| 
      
 36 
     | 
    
         
            +
                        end
         
     | 
| 
      
 37 
     | 
    
         
            +
                      end
         
     | 
| 
      
 38 
     | 
    
         
            +
                    end
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end
         
     | 
| 
      
 40 
     | 
    
         
            +
                doc.to_s
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
              def parseVPMSresponse(response,product)
         
     | 
| 
      
 44 
     | 
    
         
            +
                @premiums = Array.new
         
     | 
| 
      
 45 
     | 
    
         
            +
                doc = Document.new(response)
         
     | 
| 
      
 46 
     | 
    
         
            +
                nodes = XPath.match(doc,"//multiRef[returnCode=0]")
         
     | 
| 
      
 47 
     | 
    
         
            +
                nodes.each do |node|
         
     | 
| 
      
 48 
     | 
    
         
            +
                  extractPremiums(node,product)
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
                #display any VPMS issues
         
     | 
| 
      
 51 
     | 
    
         
            +
                #probably won't result in runtime issue since IAB currently asks for more than VPMS will understand
         
     | 
| 
      
 52 
     | 
    
         
            +
                #because VPMS schema built on product view of library and VPMS message is built from full library def of coverage
         
     | 
| 
      
 53 
     | 
    
         
            +
                #at the mo
         
     | 
| 
      
 54 
     | 
    
         
            +
                nodes = XPath.match(doc,"//multiRef[returnCode!=0]")
         
     | 
| 
      
 55 
     | 
    
         
            +
                nodes.each do |node|
         
     | 
| 
      
 56 
     | 
    
         
            +
                  viewPremiumComputeErrors(node,product)
         
     | 
| 
      
 57 
     | 
    
         
            +
                end
         
     | 
| 
      
 58 
     | 
    
         
            +
              end
         
     | 
| 
      
 59 
     | 
    
         
            +
              
         
     | 
| 
      
 60 
     | 
    
         
            +
              def viewPremiumComputeErrors(node,product) #:nodoc
         
     | 
| 
      
 61 
     | 
    
         
            +
                value = ""
         
     | 
| 
      
 62 
     | 
    
         
            +
                node.each_child do |child|
         
     | 
| 
      
 63 
     | 
    
         
            +
                  case child.node_type
         
     | 
| 
      
 64 
     | 
    
         
            +
                  when :element
         
     | 
| 
      
 65 
     | 
    
         
            +
                    key, value = child.expanded_name, extractPremiums(child,product)
         
     | 
| 
      
 66 
     | 
    
         
            +
                    #put out 'error' message text
         
     | 
| 
      
 67 
     | 
    
         
            +
                    puts "#{value}" if key == "message"
         
     | 
| 
      
 68 
     | 
    
         
            +
                  when :text
         
     | 
| 
      
 69 
     | 
    
         
            +
                    key, value = '$', unescape(child.to_s).strip
         
     | 
| 
      
 70 
     | 
    
         
            +
                  end
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
                value
         
     | 
| 
      
 73 
     | 
    
         
            +
             end  
         
     | 
| 
      
 74 
     | 
    
         
            +
              
         
     | 
| 
      
 75 
     | 
    
         
            +
              def extractPremiums(node,product) #:nodoc
         
     | 
| 
      
 76 
     | 
    
         
            +
                #vpms will return the following nodes of interest
         
     | 
| 
      
 77 
     | 
    
         
            +
                #message, name, reffield, returncode, value
         
     | 
| 
      
 78 
     | 
    
         
            +
                #like this
         
     | 
| 
      
 79 
     | 
    
         
            +
                #key=message,value=
         
     | 
| 
      
 80 
     | 
    
         
            +
                #key=name,value=F_CommercialProperty_#{product}_ContentsCover_CoverDetail_PremiumQuoteBreakdown_GrossAmount
         
     | 
| 
      
 81 
     | 
    
         
            +
                #key=refField,value=
         
     | 
| 
      
 82 
     | 
    
         
            +
                #key=returnCode,value=0
         
     | 
| 
      
 83 
     | 
    
         
            +
                #key=value,value=125.55
         
     | 
| 
      
 84 
     | 
    
         
            +
                value = ""
         
     | 
| 
      
 85 
     | 
    
         
            +
                node.each_child do |child|
         
     | 
| 
      
 86 
     | 
    
         
            +
                  case child.node_type
         
     | 
| 
      
 87 
     | 
    
         
            +
                  when :element
         
     | 
| 
      
 88 
     | 
    
         
            +
                    key, value = child.expanded_name, extractPremiums(child,product)
         
     | 
| 
      
 89 
     | 
    
         
            +
                    @premiums.push(value.gsub("F_CommercialProperty_","").gsub('CommercialProperty',product).split("_")) if (key == "name") 
         
     | 
| 
      
 90 
     | 
    
         
            +
                    if (key == "value")
         
     | 
| 
      
 91 
     | 
    
         
            +
                       name = @premiums.pop
         
     | 
| 
      
 92 
     | 
    
         
            +
                       name.push(value)
         
     | 
| 
      
 93 
     | 
    
         
            +
                       @premiums.push(name)
         
     | 
| 
      
 94 
     | 
    
         
            +
                    end
         
     | 
| 
      
 95 
     | 
    
         
            +
                  when :text
         
     | 
| 
      
 96 
     | 
    
         
            +
                    key, value = '$', unescape(child.to_s).strip
         
     | 
| 
      
 97 
     | 
    
         
            +
                  end
         
     | 
| 
      
 98 
     | 
    
         
            +
                end
         
     | 
| 
      
 99 
     | 
    
         
            +
                value
         
     | 
| 
      
 100 
     | 
    
         
            +
             end  
         
     | 
| 
      
 101 
     | 
    
         
            +
              
         
     | 
| 
      
 102 
     | 
    
         
            +
              def callVPMS(nvpxml)
         
     | 
| 
      
 103 
     | 
    
         
            +
                  headers = {
         
     | 
| 
      
 104 
     | 
    
         
            +
                          'Content-Type' => 'text/xml',
         
     | 
| 
      
 105 
     | 
    
         
            +
                          'SoapAction' => ""
         
     | 
| 
      
 106 
     | 
    
         
            +
                          }
         
     | 
| 
      
 107 
     | 
    
         
            +
                  Net::HTTP.start(APP_CONFIG['vpms_ip'], 8080) do |http|
         
     | 
| 
      
 108 
     | 
    
         
            +
                      response = http.post('/jvpms/services/ProductRequestProcessor',nvpxml,headers)
         
     | 
| 
      
 109 
     | 
    
         
            +
                      response.body
         
     | 
| 
      
 110 
     | 
    
         
            +
                  end
         
     | 
| 
      
 111 
     | 
    
         
            +
              end
         
     | 
| 
      
 112 
     | 
    
         
            +
              
         
     | 
| 
      
 113 
     | 
    
         
            +
              def buildVPMSMessage(product,package,brand,params)
         
     | 
| 
      
 114 
     | 
    
         
            +
                  @instructionBlock = ""
         
     | 
| 
      
 115 
     | 
    
         
            +
                  
         
     | 
| 
      
 116 
     | 
    
         
            +
            nvpxml = '<?xml version="1.0" encoding="utf-8"?>
         
     | 
| 
      
 117 
     | 
    
         
            +
            <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
         
     | 
| 
      
 118 
     | 
    
         
            +
                xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
         
     | 
| 
      
 119 
     | 
    
         
            +
                xmlns:tns="http://com/csc/dip/webservice/core/"
         
     | 
| 
      
 120 
     | 
    
         
            +
                xmlns:types="http://com/csc/dip/webservice/core/encodedTypes"
         
     | 
| 
      
 121 
     | 
    
         
            +
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         
     | 
| 
      
 122 
     | 
    
         
            +
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
         
     | 
| 
      
 123 
     | 
    
         
            +
                xmlns:q1="http://core.webservice.dip.csc.com">
         
     | 
| 
      
 124 
     | 
    
         
            +
                <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         
     | 
| 
      
 125 
     | 
    
         
            +
                    <tns:process>
         
     | 
| 
      
 126 
     | 
    
         
            +
                        <in0 href="#id1"/>
         
     | 
| 
      
 127 
     | 
    
         
            +
                    </tns:process>
         
     | 
| 
      
 128 
     | 
    
         
            +
                    <soapenc:Array id="id1" soapenc:arrayType="q1:ProductRequest[1]">
         
     | 
| 
      
 129 
     | 
    
         
            +
                        <Item href="#id3"/>
         
     | 
| 
      
 130 
     | 
    
         
            +
                    </soapenc:Array>
         
     | 
| 
      
 131 
     | 
    
         
            +
                    <q1:ProductRequest id="id3" xsi:type="q1:ProductRequest">
         
     | 
| 
      
 132 
     | 
    
         
            +
                        <productName xsi:type="xsd:string">CommercialPropertyProduct</productName>
         
     | 
| 
      
 133 
     | 
    
         
            +
                        <store xsi:type="xsd:boolean">false</store>
         
     | 
| 
      
 134 
     | 
    
         
            +
                        <traceMode xsi:type="xsd:boolean">false</traceMode>
         
     | 
| 
      
 135 
     | 
    
         
            +
                        <useUI xsi:type="xsd:boolean">false</useUI>
         
     | 
| 
      
 136 
     | 
    
         
            +
                        <actions href="#id5"/>
         
     | 
| 
      
 137 
     | 
    
         
            +
                    </q1:ProductRequest>'
         
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
| 
      
 139 
     | 
    
         
            +
                  @id=7
         
     | 
| 
      
 140 
     | 
    
         
            +
                  @instructionBlock << "<Item href=\"#id#{@id += 1}\"/>"        
         
     | 
| 
      
 141 
     | 
    
         
            +
                  nvpxml  << "<q1:SetAction id=\"id#{@id}\" xsi:type=\"q1:SetAction\">
         
     | 
| 
      
 142 
     | 
    
         
            +
                        <useUI xsi:type=\"xsd:boolean\">false</useUI>
         
     | 
| 
      
 143 
     | 
    
         
            +
                        <name xsi:type=\"xsd:string\">A_CommercialProperty_#{package}_Brand</name>
         
     | 
| 
      
 144 
     | 
    
         
            +
                        <value xsi:type=\"xsd:string\">#{brand}</value>
         
     | 
| 
      
 145 
     | 
    
         
            +
                    </q1:SetAction>"
         
     | 
| 
      
 146 
     | 
    
         
            +
                  @instructionBlock << "<Item href=\"#id#{@id += 1}\"/>"        
         
     | 
| 
      
 147 
     | 
    
         
            +
                  nvpxml  << "<q1:SetAction id=\"id#{@id}\" xsi:type=\"q1:SetAction\">
         
     | 
| 
      
 148 
     | 
    
         
            +
                        <useUI xsi:type=\"xsd:boolean\">false</useUI>
         
     | 
| 
      
 149 
     | 
    
         
            +
                        <name xsi:type=\"xsd:string\">A_CommercialProperty_#{package}_Package</name>
         
     | 
| 
      
 150 
     | 
    
         
            +
                        <value xsi:type=\"xsd:string\">#{product}</value>
         
     | 
| 
      
 151 
     | 
    
         
            +
                    </q1:SetAction>"   
         
     | 
| 
      
 152 
     | 
    
         
            +
                
         
     | 
| 
      
 153 
     | 
    
         
            +
                
         
     | 
| 
      
 154 
     | 
    
         
            +
                  nvpxml << createXMLMessage(product,params,true) do |k,v|
         
     | 
| 
      
 155 
     | 
    
         
            +
                    
         
     | 
| 
      
 156 
     | 
    
         
            +
                    @instructionBlock << "<Item href=\"#id#{@id += 1}\"/>"
         
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
      
 158 
     | 
    
         
            +
                     "<q1:SetAction id=\"id#{@id}\" xsi:type=\"q1:SetAction\">
         
     | 
| 
      
 159 
     | 
    
         
            +
                        <useUI xsi:type=\"xsd:boolean\">false</useUI>
         
     | 
| 
      
 160 
     | 
    
         
            +
                        <name xsi:type=\"xsd:string\">A_CommercialProperty_#{package}_#{k}</name>
         
     | 
| 
      
 161 
     | 
    
         
            +
                        <value xsi:type=\"xsd:string\">#{v}</value>
         
     | 
| 
      
 162 
     | 
    
         
            +
                    </q1:SetAction>"
         
     | 
| 
      
 163 
     | 
    
         
            +
                  end
         
     | 
| 
      
 164 
     | 
    
         
            +
             
     | 
| 
      
 165 
     | 
    
         
            +
                  nvpxml << deriveComputes(package)
         
     | 
| 
      
 166 
     | 
    
         
            +
                  @instructionBlock << "<Item href=\"#id#{@id}\"/>"
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
                  nvpxml << "<soapenc:Array id=\"id5\" soapenc:arrayType=\"q1:VpmsAction[1]\">
         
     | 
| 
      
 169 
     | 
    
         
            +
                          #{@instructionBlock}
         
     | 
| 
      
 170 
     | 
    
         
            +
                         </soapenc:Array>"
         
     | 
| 
      
 171 
     | 
    
         
            +
             
     | 
| 
      
 172 
     | 
    
         
            +
                  nvpxml << "</soap:Body></soap:Envelope>"
         
     | 
| 
      
 173 
     | 
    
         
            +
                  nvpxml
         
     | 
| 
      
 174 
     | 
    
         
            +
              end
         
     | 
| 
      
 175 
     | 
    
         
            +
              
         
     | 
| 
      
 176 
     | 
    
         
            +
              def deriveComputes(package)
         
     | 
| 
      
 177 
     | 
    
         
            +
                nvpxml = ""
         
     | 
| 
      
 178 
     | 
    
         
            +
                @pqbNodes.each do |n|
         
     | 
| 
      
 179 
     | 
    
         
            +
                  nvpxml << "<q1:ComputeAction id=\"id#{@id += 1}\" xsi:type=\"q1:ComputeAction\">
         
     | 
| 
      
 180 
     | 
    
         
            +
                        <useUI xsi:type=\"xsd:boolean\">false</useUI>
         
     | 
| 
      
 181 
     | 
    
         
            +
                        <name xsi:type=\"xsd:string\">F_CommercialProperty_#{package}_#{n}</name>
         
     | 
| 
      
 182 
     | 
    
         
            +
                    </q1:ComputeAction>"
         
     | 
| 
      
 183 
     | 
    
         
            +
                  @instructionBlock << "<Item href=\"#id#{@id}\"/>"
         
     | 
| 
      
 184 
     | 
    
         
            +
                end
         
     | 
| 
      
 185 
     | 
    
         
            +
                nvpxml
         
     | 
| 
      
 186 
     | 
    
         
            +
              end
         
     | 
| 
      
 187 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,82 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2008 Orangery Technology Limited 
         
     | 
| 
      
 2 
     | 
    
         
            +
            # You can redistribute it and/or modify it under the same terms as Ruby.
         
     | 
| 
      
 3 
     | 
    
         
            +
            # 
         
     | 
| 
      
 4 
     | 
    
         
            +
            module ApplyMTA  
         
     | 
| 
      
 5 
     | 
    
         
            +
                def applyMTA(startDateTime,endDateTime,policyKey,origImage,newImage)     
         
     | 
| 
      
 6 
     | 
    
         
            +
                  appliedDateTime = Time.now.strftime('%Y-%m-%d') #TODO: add time into this
         
     | 
| 
      
 7 
     | 
    
         
            +
                  appliedDateTimeEpoch = Time.now.to_i
         
     | 
| 
      
 8 
     | 
    
         
            +
                  
         
     | 
| 
      
 9 
     | 
    
         
            +
                  xmldiff = determineDiff(origImage,newImage)
         
     | 
| 
      
 10 
     | 
    
         
            +
                
         
     | 
| 
      
 11 
     | 
    
         
            +
                  doc = REXML::Document.new xmldiff
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  #remove the diff records of no interest to us
         
     | 
| 
      
 14 
     | 
    
         
            +
                  doc.elements.delete_all('//xupdate:append')
         
     | 
| 
      
 15 
     | 
    
         
            +
                  doc.elements.delete_all('//xupdate:remove')
         
     | 
| 
      
 16 
     | 
    
         
            +
                  doc.elements.delete_all('//xupdate:insert-after')
         
     | 
| 
      
 17 
     | 
    
         
            +
                  doc.elements.delete_all('//xupdate:insert-before')
         
     | 
| 
      
 18 
     | 
    
         
            +
                  doc.elements.delete_all('//xupdate:rename')
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                  #the reduced doc
         
     | 
| 
      
 21 
     | 
    
         
            +
                  #puts doc.to_s
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  persist = Persist.instance
         
     | 
| 
      
 24 
     | 
    
         
            +
                  #add the MTA diff doc to the data store
         
     | 
| 
      
 25 
     | 
    
         
            +
                  key = persist.put('UUID',doc.to_s)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  #puts "MTA diff doc key is #{key}"
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                  #get the doc that holds the relationship between the policy and
         
     | 
| 
      
 29 
     | 
    
         
            +
                  #any MTA diff docs
         
     | 
| 
      
 30 
     | 
    
         
            +
                  #if it does not exist then get! will create it
         
     | 
| 
      
 31 
     | 
    
         
            +
                  mtas = persist.get!("#{policyKey}MTAS","<MTAS></MTAS>")
         
     | 
| 
      
 32 
     | 
    
         
            +
                  doc = REXML::Document.new mtas
         
     | 
| 
      
 33 
     | 
    
         
            +
                  mtasNode = REXML::XPath.first(doc, '//MTAS')
         
     | 
| 
      
 34 
     | 
    
         
            +
                  
         
     | 
| 
      
 35 
     | 
    
         
            +
                  #check to see if any MTAs exist that start later than this one
         
     | 
| 
      
 36 
     | 
    
         
            +
                  #if so mark them as rolled back and store them in a
         
     | 
| 
      
 37 
     | 
    
         
            +
                  #reapply->hash
         
     | 
| 
      
 38 
     | 
    
         
            +
                  reapply = []
         
     | 
| 
      
 39 
     | 
    
         
            +
                  
         
     | 
| 
      
 40 
     | 
    
         
            +
                  elems = doc.root.get_elements('//MTAS/MTA[@startDateTime]')
         
     | 
| 
      
 41 
     | 
    
         
            +
                  sorted = elems.map { |s| s.attributes["startDateTime"].to_s}.sort
         
     | 
| 
      
 42 
     | 
    
         
            +
                  #puts "This new MTA starting on #{startDateTime} yields out-of-sequence node(s):"
         
     | 
| 
      
 43 
     | 
    
         
            +
                  count = 0
         
     | 
| 
      
 44 
     | 
    
         
            +
                  sorted.each do |sd|
         
     | 
| 
      
 45 
     | 
    
         
            +
                    if (sd > startDateTime)
         
     | 
| 
      
 46 
     | 
    
         
            +
                      #roll these back
         
     | 
| 
      
 47 
     | 
    
         
            +
                      xpath = '//MTAS/MTA[@startDateTime = '+'"'+sd+'"]'
         
     | 
| 
      
 48 
     | 
    
         
            +
                      node = REXML::XPath.first(doc, xpath)
         
     | 
| 
      
 49 
     | 
    
         
            +
                      #puts node
         
     | 
| 
      
 50 
     | 
    
         
            +
                      #put into reapply-array providing of course not already rolled back
         
     | 
| 
      
 51 
     | 
    
         
            +
                      rb = node.attributes["rolledBack"]
         
     | 
| 
      
 52 
     | 
    
         
            +
                      if (rb != "true") then
         
     | 
| 
      
 53 
     | 
    
         
            +
                        reapply[count] = node.deep_clone
         
     | 
| 
      
 54 
     | 
    
         
            +
                        count = count + 1
         
     | 
| 
      
 55 
     | 
    
         
            +
                        #set current node to rolledBack
         
     | 
| 
      
 56 
     | 
    
         
            +
                        node.attributes["rolledBack"] = true
         
     | 
| 
      
 57 
     | 
    
         
            +
                      end
         
     | 
| 
      
 58 
     | 
    
         
            +
                    end
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
      
 60 
     | 
    
         
            +
                  #puts "No nodes qualified." unless count > 0
         
     | 
| 
      
 61 
     | 
    
         
            +
                  #puts "\n"
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                  #get first node and add element with meta data relating to the MTA diff doc added above
         
     | 
| 
      
 64 
     | 
    
         
            +
                  #meta data includes the key of the diff doc
         
     | 
| 
      
 65 
     | 
    
         
            +
                  mtasNode.add_element('MTA',{'key' => key , 'appliedDateTimeEpoch' => appliedDateTimeEpoch, 'appliedDateTime' => appliedDateTime, 'startDateTime' => startDateTime, 'endDateTime' => endDateTime, 'rolledBack' => false})
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                  #check the reapply->array
         
     | 
| 
      
 68 
     | 
    
         
            +
                  #create new entries for any in the reapply->hash with new appliedDateTime attribute values      appliedDateTime = Time.now.strftime('%Y-%m-%d') #TODO: add time into this
         
     | 
| 
      
 69 
     | 
    
         
            +
                  reapply.each do |n|
         
     | 
| 
      
 70 
     | 
    
         
            +
                    appliedDateTimeEpoch = appliedDateTimeEpoch + 1
         
     | 
| 
      
 71 
     | 
    
         
            +
                    n.attributes["appliedDateTime"] = appliedDateTime
         
     | 
| 
      
 72 
     | 
    
         
            +
                    n.attributes["appliedDateTimeEpoch"] = appliedDateTimeEpoch
         
     | 
| 
      
 73 
     | 
    
         
            +
                    n.attributes["rolledBack"] = false
         
     | 
| 
      
 74 
     | 
    
         
            +
                    mtasNode.add_element(n)
         
     | 
| 
      
 75 
     | 
    
         
            +
                  end
         
     | 
| 
      
 76 
     | 
    
         
            +
                  #puts "Final state of MTA meta data doc:"+doc.to_s
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                  mtaKey = persist.put("#{policyKey}MTAS",doc.to_s)
         
     | 
| 
      
 79 
     | 
    
         
            +
                  #puts "MTAS key is still:#{mtaKey}"
         
     | 
| 
      
 80 
     | 
    
         
            +
                  doc.to_s
         
     | 
| 
      
 81 
     | 
    
         
            +
                end
         
     | 
| 
      
 82 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,8 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module RefineQuote
         
     | 
| 
      
 2 
     | 
    
         
            +
              def integrateData(session,origData,newData)
         
     | 
| 
      
 3 
     | 
    
         
            +
                #this piece of logica takes two xml documents that need to be merge, there will be new nodes
         
     | 
| 
      
 4 
     | 
    
         
            +
                #and overlapping nodes as question answers for the quote are made available
         
     | 
| 
      
 5 
     | 
    
         
            +
                result = origData.gsub("</#{session[:product]}>","")+newData.gsub("<#{session[:product]}>","")
         
     | 
| 
      
 6 
     | 
    
         
            +
                result
         
     | 
| 
      
 7 
     | 
    
         
            +
              end
         
     | 
| 
      
 8 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,39 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2008 Orangery Technology Limited 
         
     | 
| 
      
 2 
     | 
    
         
            +
            # You can redistribute it and/or modify it under the same terms as Ruby.
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module XMLDiff
         
     | 
| 
      
 6 
     | 
    
         
            +
              def runCommand(cmd, inp='')
         
     | 
| 
      
 7 
     | 
    
         
            +
                IO.popen(cmd, 'r+') do |io|
         
     | 
| 
      
 8 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 9 
     | 
    
         
            +
                    io.write inp
         
     | 
| 
      
 10 
     | 
    
         
            +
                    io.close_write
         
     | 
| 
      
 11 
     | 
    
         
            +
                    return io.read
         
     | 
| 
      
 12 
     | 
    
         
            +
                  rescue Exception => e
         
     | 
| 
      
 13 
     | 
    
         
            +
                    e.message
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
              
         
     | 
| 
      
 18 
     | 
    
         
            +
              def determineDiff(origImage,newImage)
         
     | 
| 
      
 19 
     | 
    
         
            +
                before, after, result = nil, nil, nil
         
     | 
| 
      
 20 
     | 
    
         
            +
                begin      
         
     | 
| 
      
 21 
     | 
    
         
            +
                  before = Tempfile.new('iab')
         
     | 
| 
      
 22 
     | 
    
         
            +
                  before << origImage
         
     | 
| 
      
 23 
     | 
    
         
            +
                  before.close
         
     | 
| 
      
 24 
     | 
    
         
            +
                  after = Tempfile.new('iab')
         
     | 
| 
      
 25 
     | 
    
         
            +
                  after << newImage
         
     | 
| 
      
 26 
     | 
    
         
            +
                  after.close
         
     | 
| 
      
 27 
     | 
    
         
            +
                  result = Tempfile.new('iab')
         
     | 
| 
      
 28 
     | 
    
         
            +
                  cmd = "#{APP_CONFIG['python_xmldiff_path']} -x #{before.path} #{after.path} > #{result.path}"
         
     | 
| 
      
 29 
     | 
    
         
            +
                  runCommand(cmd)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  xmlDiff = result.read
         
     | 
| 
      
 31 
     | 
    
         
            +
                  #identify only the update nodes - we do not need to know about nodes that have moved sequence
         
     | 
| 
      
 32 
     | 
    
         
            +
                  return xmlDiff
         
     | 
| 
      
 33 
     | 
    
         
            +
                ensure
         
     | 
| 
      
 34 
     | 
    
         
            +
                  before.delete unless before == nil
         
     | 
| 
      
 35 
     | 
    
         
            +
                  after.delete unless after == nil
         
     | 
| 
      
 36 
     | 
    
         
            +
                  result.delete unless result == nil
         
     | 
| 
      
 37 
     | 
    
         
            +
                end    
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,88 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2008 Orangery Technology Limited 
         
     | 
| 
      
 2 
     | 
    
         
            +
            # You can redistribute it and/or modify it under the same terms as Ruby.
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            # See doc/paypal_developer_info.txt
         
     | 
| 
      
 5 
     | 
    
         
            +
            # See www.codyfauser.com
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            require 'active_merchant'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            module Payment
         
     | 
| 
      
 10 
     | 
    
         
            +
                
         
     | 
| 
      
 11 
     | 
    
         
            +
              include ActiveMerchant::Billing
         
     | 
| 
      
 12 
     | 
    
         
            +
              
         
     | 
| 
      
 13 
     | 
    
         
            +
              # returns a url
         
     | 
| 
      
 14 
     | 
    
         
            +
              def setup_payment(params)
         
     | 
| 
      
 15 
     | 
    
         
            +
                amount = params[:payment_amount].to_i
         
     | 
| 
      
 16 
     | 
    
         
            +
                if amount < 1
         
     | 
| 
      
 17 
     | 
    
         
            +
                  return params[:cancel_return_url]
         
     | 
| 
      
 18 
     | 
    
         
            +
                else
         
     | 
| 
      
 19 
     | 
    
         
            +
                  setup_response = payment_gateway.setup_purchase(amount, :ip => params[:ip], :return_url => params[:return_url], :cancel_return_url => params[:cancel_return_url])
         
     | 
| 
      
 20 
     | 
    
         
            +
                  return payment_gateway.redirect_url_for(setup_response.token)
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
              
         
     | 
| 
      
 24 
     | 
    
         
            +
              # returns a PaymentDetails
         
     | 
| 
      
 25 
     | 
    
         
            +
              def get_gateway_payment_details(params)
         
     | 
| 
      
 26 
     | 
    
         
            +
                details_response = payment_gateway.details_for(params[:token])
         
     | 
| 
      
 27 
     | 
    
         
            +
                return PaymentDetails.new(details_response.success?, details_response.message, details_response.address)
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
              
         
     | 
| 
      
 30 
     | 
    
         
            +
              class PaymentDetails
         
     | 
| 
      
 31 
     | 
    
         
            +
                attr_reader :error_message, :address
         
     | 
| 
      
 32 
     | 
    
         
            +
                def initialize(success, error_message, address)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  @success = success
         
     | 
| 
      
 34 
     | 
    
         
            +
                  @error_message = error_message
         
     | 
| 
      
 35 
     | 
    
         
            +
                  @address = address
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
                def success?
         
     | 
| 
      
 38 
     | 
    
         
            +
                  @success
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
              
         
     | 
| 
      
 42 
     | 
    
         
            +
              # returns a PurchaseDetails
         
     | 
| 
      
 43 
     | 
    
         
            +
              def complete_payment(params)
         
     | 
| 
      
 44 
     | 
    
         
            +
                amount = params[:payment_amount].to_i
         
     | 
| 
      
 45 
     | 
    
         
            +
                if amount < 1
         
     | 
| 
      
 46 
     | 
    
         
            +
                  #TODO localise error message
         
     | 
| 
      
 47 
     | 
    
         
            +
                  return PurchaseDetails.new(false, "Amount to pay must be greater than 0")
         
     | 
| 
      
 48 
     | 
    
         
            +
                else
         
     | 
| 
      
 49 
     | 
    
         
            +
                  purchase = payment_gateway.purchase(amount, :ip => params[:ip], :payer_id => params[:payer_id], :token => params[:token])
         
     | 
| 
      
 50 
     | 
    
         
            +
                  return PurchaseDetails.new(purchase.success?, purchase.message)
         
     | 
| 
      
 51 
     | 
    
         
            +
                end
         
     | 
| 
      
 52 
     | 
    
         
            +
              end
         
     | 
| 
      
 53 
     | 
    
         
            +
              
         
     | 
| 
      
 54 
     | 
    
         
            +
              class PurchaseDetails
         
     | 
| 
      
 55 
     | 
    
         
            +
                attr_reader :error_message
         
     | 
| 
      
 56 
     | 
    
         
            +
                def initialize(success, error_message)
         
     | 
| 
      
 57 
     | 
    
         
            +
                  @success = success
         
     | 
| 
      
 58 
     | 
    
         
            +
                  @error_message = error_message
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
                def success?
         
     | 
| 
      
 61 
     | 
    
         
            +
                  @success
         
     | 
| 
      
 62 
     | 
    
         
            +
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
              end
         
     | 
| 
      
 64 
     | 
    
         
            +
              
         
     | 
| 
      
 65 
     | 
    
         
            +
              #  private
         
     | 
| 
      
 66 
     | 
    
         
            +
              # TODO this is the test paypal account, needs to come from configuration
         
     | 
| 
      
 67 
     | 
    
         
            +
              def payment_gateway
         
     | 
| 
      
 68 
     | 
    
         
            +
                @payment_gateway ||= @@gateway_creator.call
         
     | 
| 
      
 69 
     | 
    
         
            +
              end
         
     | 
| 
      
 70 
     | 
    
         
            +
              
         
     | 
| 
      
 71 
     | 
    
         
            +
              def self.gateway_creator=(creator)
         
     | 
| 
      
 72 
     | 
    
         
            +
                @@gateway_creator = creator
         
     | 
| 
      
 73 
     | 
    
         
            +
              end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
            end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
            #TODO THIS BELONGS IN A CONFIGURATION INCLUDE SOMEWHERE (which is why it looks funny here)
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
            # Put ActiveMerchant in test mode
         
     | 
| 
      
 81 
     | 
    
         
            +
            ActiveMerchant::Billing::Base.mode = :test
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
            # Use the ActiveMerchant Paypal Express gateway with these sandbox account details
         
     | 
| 
      
 84 
     | 
    
         
            +
            Payment.gateway_creator = lambda { ActiveMerchant::Billing::PaypalExpressGateway.new(
         
     | 
| 
      
 85 
     | 
    
         
            +
                :login => 'kuboid_1208170947_biz_api1.gmail.com',
         
     | 
| 
      
 86 
     | 
    
         
            +
                :password => '1208170953',
         
     | 
| 
      
 87 
     | 
    
         
            +
                :signature => 'AMVR2Do.R-utyMm2sFyqPkqVzWDzAn4yKS9xT07kyzoyj5DFPG-wh53q'
         
     | 
| 
      
 88 
     | 
    
         
            +
              ) }
         
     | 
| 
         @@ -0,0 +1,34 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2007-2008 Orangery Technology Limited 
         
     | 
| 
      
 2 
     | 
    
         
            +
            # You can redistribute it and/or modify it under the same terms as Ruby.
         
     | 
| 
      
 3 
     | 
    
         
            +
            #
         
     | 
| 
      
 4 
     | 
    
         
            +
            module Search
         
     | 
| 
      
 5 
     | 
    
         
            +
              def executeSearch(product,params)
         
     | 
| 
      
 6 
     | 
    
         
            +
                
         
     | 
| 
      
 7 
     | 
    
         
            +
                mypredicate = ""
         
     | 
| 
      
 8 
     | 
    
         
            +
                params.each do |k,v|
         
     | 
| 
      
 9 
     | 
    
         
            +
                  if (v.class.name == 'HashWithIndifferentAccess')
         
     | 
| 
      
 10 
     | 
    
         
            +
                    mypredicate << explodeHash(v)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                open("#{File.dirname(__FILE__)}/xquery1") {|f| @query = f.read }
         
     | 
| 
      
 15 
     | 
    
         
            +
                @query = @query.gsub("PRODUCT","#{product}").gsub("PREDICATE",mypredicate[0..-5])
         
     | 
| 
      
 16 
     | 
    
         
            +
                
         
     | 
| 
      
 17 
     | 
    
         
            +
                persist = Persist.instance
         
     | 
| 
      
 18 
     | 
    
         
            +
                result = persist.find(@query)
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
              
         
     | 
| 
      
 21 
     | 
    
         
            +
              def explodeHash(h)
         
     | 
| 
      
 22 
     | 
    
         
            +
                predicate = ""
         
     | 
| 
      
 23 
     | 
    
         
            +
                h.each do |k,v|
         
     | 
| 
      
 24 
     | 
    
         
            +
                  if (v.class.name == 'HashWithIndifferentAccess')
         
     | 
| 
      
 25 
     | 
    
         
            +
                    predicate << explodeHash(v)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  elsif (v.class.name == "String")
         
     | 
| 
      
 27 
     | 
    
         
            +
                    if (v.length > 0)
         
     | 
| 
      
 28 
     | 
    
         
            +
                      predicate << "$result//#{k} =\"#{v}\" and "
         
     | 
| 
      
 29 
     | 
    
         
            +
                    end
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
                predicate
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
             declare namespace xupdate="http://www.xmldb.org/xupdate";
         
     | 
| 
      
 2 
     | 
    
         
            +
            for $result in collection("quotes.dbxml")/PRODUCT
         
     | 
| 
      
 3 
     | 
    
         
            +
            where PREDICATE
         
     | 
| 
      
 4 
     | 
    
         
            +
            return
         
     | 
| 
      
 5 
     | 
    
         
            +
            (
         
     | 
| 
      
 6 
     | 
    
         
            +
                concat(
         
     | 
| 
      
 7 
     | 
    
         
            +
                "@rowHash = {",
         
     | 
| 
      
 8 
     | 
    
         
            +
                "'companyname' => '",$result//Insured[1]//CompanyName/string(),"',",
         
     | 
| 
      
 9 
     | 
    
         
            +
                "'postcode' => '",$result//Insured[1]//Postcode/string(),"',",
         
     | 
| 
      
 10 
     | 
    
         
            +
                "'key' => '", $result/dbxml:metadata("dbxml:name"),"',"),
         
     | 
| 
      
 11 
     | 
    
         
            +
                "'mtas' => [",		
         
     | 
| 
      
 12 
     | 
    
         
            +
                for $mtas in collection("quotes.dbxml")/MTAS/MTA,
         
     | 
| 
      
 13 
     | 
    
         
            +
                     $mta in collection("quotes.dbxml")
         
     | 
| 
      
 14 
     | 
    
         
            +
                where $mtas/dbxml:metadata("dbxml:name") = concat($result/dbxml:metadata("dbxml:name"),"MTAS")
         
     | 
| 
      
 15 
     | 
    
         
            +
                and $mta/dbxml:metadata("dbxml:name") = $mtas/@key
         
     | 
| 
      
 16 
     | 
    
         
            +
                return (
         
     | 
| 
      
 17 
     | 
    
         
            +
                            concat(
         
     | 
| 
      
 18 
     | 
    
         
            +
                              "{",
         
     | 
| 
      
 19 
     | 
    
         
            +
                             "'AD' => '",$mtas/@appliedDateTime/string(),"',",
         
     | 
| 
      
 20 
     | 
    
         
            +
                             "'SD' => '",$mtas/@startDateTime/string(),"',",
         
     | 
| 
      
 21 
     | 
    
         
            +
                             "'ED' => '",$mtas/@endDateTime/string(),"',",
         
     | 
| 
      
 22 
     | 
    
         
            +
                             "'RB' => '",$mtas/@rolledBack/string(),"',",
         
     | 
| 
      
 23 
     | 
    
         
            +
                             "'Changes' => '",$mta//xupdate:update/@select," -to- ",$mta//xupdate:update/string(),"'",
         
     | 
| 
      
 24 
     | 
    
         
            +
                            "},"
         
     | 
| 
      
 25 
     | 
    
         
            +
                            )
         
     | 
| 
      
 26 
     | 
    
         
            +
                        ),
         
     | 
| 
      
 27 
     | 
    
         
            +
                "]}"
         
     | 
| 
      
 28 
     | 
    
         
            +
            )
         
     |