<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  
  <!-- Java.ProducerCodeHandler.Account -->
  <xsd:element name="AccountProducerCodeHandler">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="ProducerStatus" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="SystemPermType" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
      <!-- To bypass ProducerCode check on accounts with no active policies -->
      <xsd:attribute name="bypassProducerCodeCheckOnAccountsWithNoActivePolicies" type="xsd:boolean" default="false"/>
      <xsd:attribute name="desc" type="xsd:string"/>
      <!-- Requires redeclaring this permission in content or configuration -->
      <xsd:attribute name="external" type="xsd:boolean"/>
      <!-- Prevents redeclaring this permission in content or configuration -->
      <xsd:attribute name="internal" type="xsd:boolean"/>
      <xsd:attribute name="noPermissionDisplayKey" type="xsd:string"/>
      <!-- The permission key -->
      <xsd:attribute name="permKey" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <!-- BizRules-related permissions -->
  <xsd:element name="BizRulesPermissions">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="RuleSubtypeAccessProfile" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="ContactCreatePermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="ContactDeletePermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="ContactEditPermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <!-- Contact-related permissions -->
  <xsd:element name="ContactPermissions">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="ContactSubtypeAccessProfile" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="ContactTagAccessProfile" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="ContactSubtypeAccessProfile">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="ContactCreatePermission" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="ContactDeletePermission" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="ContactEditPermission" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="ContactViewPermission" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
      <xsd:attribute name="entity" type="xsd:string" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:simpleType name="ContactTag">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="Claim Party"/>
      <!-- Client -->
      <xsd:enumeration value="Client"/>
      <!-- Vendor -->
      <xsd:enumeration value="Vendor"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:element name="ContactTagAccessProfile">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="ContactCreatePermission" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="ContactDeletePermission" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="ContactEditPermission" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="ContactViewPermission" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
      <xsd:attribute name="tag" type="ContactTag" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="ContactViewPermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="DocumentAccessProfile">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="DocumentCreatePermission" minOccurs="0" maxOccurs="1"/>
        <xsd:element ref="DocumentDeletePermission" minOccurs="0" maxOccurs="1"/>
        <xsd:element ref="DocumentEditPermission" minOccurs="0" maxOccurs="1"/>
        <xsd:element ref="DocumentViewPermission" minOccurs="0" maxOccurs="1"/>
      </xsd:choice>
      <xsd:attribute name="securitylevel" type="DocumentSecurityLevel" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="DocumentCreatePermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="DocumentDeletePermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="DocumentEditPermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <!-- Encapsulates the permission mappings for a given DocumentSecurityType value -->
  <xsd:element name="DocumentPermissions">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="DocumentAccessProfile" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:simpleType name="DocumentSecurityLevel">
    <xsd:restriction base="xsd:string">
      <!-- Document that should not be viewed by people outside the company -->
      <xsd:enumeration value="internalonly"/>
      <!-- Document that is sensitive in nature -->
      <xsd:enumeration value="sensitive"/>
      <!-- Document that does not require access restriction -->
      <xsd:enumeration value="unrestricted"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:element name="DocumentViewPermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="Handler">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="code" type="xsd:string" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <!-- Java.ProducerCodeHandler.Job -->
  <xsd:element name="JobProducerCodeHandler">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="ProducerStatus" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="SystemPermType" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
      <xsd:attribute name="desc" type="xsd:string"/>
      <!-- Requires redeclaring this permission in content or configuration -->
      <xsd:attribute name="external" type="xsd:boolean"/>
      <!-- Prevents redeclaring this permission in content or configuration -->
      <xsd:attribute name="internal" type="xsd:boolean"/>
      <!-- Java.ProducerCodeHandler.JobType -->
      <xsd:attribute name="jobType" type="JobTypeSecurityLevel" use="required"/>
      <xsd:attribute name="noPermissionDisplayKey" type="xsd:string"/>
      <!-- The permission key -->
      <xsd:attribute name="permKey" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:simpleType name="JobTypeSecurityLevel">
    <xsd:restriction base="xsd:string">
      <!-- Audit -->
      <xsd:enumeration value="Audit"/>
      <!-- Cancellation -->
      <xsd:enumeration value="Cancellation"/>
      <!-- Issuance -->
      <xsd:enumeration value="Issuance"/>
      <!-- Job -->
      <xsd:enumeration value="Job"/>
      <!-- Policy Change -->
      <xsd:enumeration value="PolicyChange"/>
      <!-- Reinstatement -->
      <xsd:enumeration value="Reinstatement"/>
      <!-- Renewal -->
      <xsd:enumeration value="Renewal"/>
      <!-- Rewrite -->
      <xsd:enumeration value="Rewrite"/>
      <!-- Rewrite New Account -->
      <xsd:enumeration value="RewriteNewAccount"/>
      <!-- Submission -->
      <xsd:enumeration value="Submission"/>
      <!-- TestJob -->
      <xsd:enumeration value="TestJob"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <!-- Encapsulates the permission mappings for a given NoteSecurityType value -->
  <xsd:element name="NoteAccessProfile">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="NoteCreatePermission" minOccurs="0" maxOccurs="1"/>
        <xsd:element ref="NoteDeletePermission" minOccurs="0" maxOccurs="1"/>
        <xsd:element ref="NoteEditBodyPermission" minOccurs="0" maxOccurs="1"/>
        <xsd:element ref="NoteEditPermission" minOccurs="0" maxOccurs="1"/>
        <xsd:element ref="NoteViewPermission" minOccurs="0" maxOccurs="1"/>
      </xsd:choice>
      <xsd:attribute name="securitylevel" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="NoteCreatePermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="NoteDeletePermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="NoteEditBodyPermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="NoteEditPermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <!-- Note-related permissions, allowing a mapping between actions such as view, edit, etc.
       and a required system permission based on the Note's SecurityType property -->
  <xsd:element name="NotePermissions">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="NoteAccessProfile" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:simpleType name="NoteSecurityLevel">
    <xsd:restriction base="xsd:string">
      <!-- Note viewable by internal users only -->
      <xsd:enumeration value="internalonly"/>
      <!-- Note which is sensitive in nature -->
      <xsd:enumeration value="sensitive"/>
      <!-- Note viewable by any user in the system -->
      <xsd:enumeration value="unrestricted"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:element name="NoteViewPermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <!-- This will create an object handler for the given permission -->
  <xsd:element name="ObjectHandler">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="Handler" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="SystemPermType" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
      <xsd:attribute name="desc" type="xsd:string"/>
      <!-- The entity for the permission key and permission check -->
      <xsd:attribute name="entity" type="xsd:string" use="required"/>
      <!-- Requires redeclaring this permission in content or configuration -->
      <xsd:attribute name="external" type="xsd:boolean"/>
      <!-- Prevents redeclaring this permission in content or configuration -->
      <xsd:attribute name="internal" type="xsd:boolean"/>
      <xsd:attribute name="noPermissionDisplayKey" type="xsd:string"/>
      <!-- The permission key -->
      <xsd:attribute name="permKey" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <!-- This will create an optional object handler for the given permission -->
  <xsd:element name="OptionalObjectHandler">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="Handler" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="SystemPermType" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
      <xsd:attribute name="desc" type="xsd:string"/>
      <!-- The entity for the permission key and permission check -->
      <xsd:attribute name="entity" type="xsd:string" use="required"/>
      <!-- Requires redeclaring this permission in content or configuration -->
      <xsd:attribute name="external" type="xsd:boolean"/>
      <!-- Prevents redeclaring this permission in content or configuration -->
      <xsd:attribute name="internal" type="xsd:boolean"/>
      <xsd:attribute name="noPermissionDisplayKey" type="xsd:string"/>
      <!-- The permission key -->
      <xsd:attribute name="permKey" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <!-- Java.ProducerCodeHandler.PolicyPeriod -->
  <xsd:element name="PolicyPeriodProducerCodeHandler">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="ProducerStatus" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="SystemPermType" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
      <xsd:attribute name="desc" type="xsd:string"/>
      <!-- Requires redeclaring this permission in content or configuration -->
      <xsd:attribute name="external" type="xsd:boolean"/>
      <!-- Prevents redeclaring this permission in content or configuration -->
      <xsd:attribute name="internal" type="xsd:boolean"/>
      <!-- Java.ProducerCodeHandler.IsAllowedForPCOfRecord -->
      <xsd:attribute name="isAllowedForPCOfRecord" type="xsd:boolean" default="false"/>
      <xsd:attribute name="noPermissionDisplayKey" type="xsd:string"/>
      <!-- The permission key -->
      <xsd:attribute name="permKey" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <!-- Java.ProducerCodeHandler.Status -->
  <xsd:element name="ProducerStatus">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <!-- Java.ProducerCodeHandler.Code -->
      <xsd:attribute name="code" type="ProducerStatusSecurityLevel" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:simpleType name="ProducerStatusSecurityLevel">
    <xsd:restriction base="xsd:string">
      <!-- Normal privileges -->
      <xsd:enumeration value="Active"/>
      <!-- Reduced permissions, can still renew. -->
      <xsd:enumeration value="Limited"/>
      <!-- Reduced permissions, can no longer renew. -->
      <xsd:enumeration value="Suspended"/>
      <!-- The producer relationship is stopped and the producer is no longer granted access
           to the system. -->
      <xsd:enumeration value="Terminated"/>
      <!-- The producer is going away. -->
      <xsd:enumeration value="Terminating"/>
    </xsd:restriction>
  </xsd:simpleType>
  
  <xsd:element name="RuleApprovePermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="RuleDeployPermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="RuleEditPermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="RuleImportPermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="RuleSubtypeAccessProfile">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="RuleApprovePermission" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="RuleDeployPermission" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="RuleEditPermission" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="RuleImportPermission" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="RuleViewPermission" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
      <xsd:attribute name="entity" type="xsd:string" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="RuleViewPermission">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <xsd:attribute name="permission" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="SecurityConfig">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="AccountProducerCodeHandler" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="BizRulesPermissions" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="ContactPermissions" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="DocumentPermissions" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="JobProducerCodeHandler" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="NotePermissions" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="ObjectHandler" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="OptionalObjectHandler" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="PolicyPeriodProducerCodeHandler" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="StaticHandler" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="WrapHandler" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
  
  <!-- This will create a static handler for the given permission -->
  <xsd:element name="StaticHandler">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="Handler" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element ref="SystemPermType" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
      <xsd:attribute name="desc" type="xsd:string"/>
      <!-- The entity for the permission key and permission check -->
      <xsd:attribute name="entity" type="xsd:string" use="required"/>
      <!-- Requires redeclaring this permission in content or configuration -->
      <xsd:attribute name="external" type="xsd:boolean"/>
      <!-- Prevents redeclaring this permission in content or configuration -->
      <xsd:attribute name="internal" type="xsd:boolean"/>
      <xsd:attribute name="noPermissionDisplayKey" type="xsd:string"/>
      <!-- The permission key -->
      <xsd:attribute name="permKey" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="SystemPermType">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded"/>
      <!-- see SystemPermissionType typelist -->
      <xsd:attribute name="code" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
  
  <!-- This will create a wrap handler that first checked the wrapPermKey but also requires
       one of the given permissions to be true as well. -->
  <xsd:element name="WrapHandler">
    <xsd:complexType>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="SystemPermType" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>
      <xsd:attribute name="desc" type="xsd:string"/>
      <!-- The entity for the permission key and permission check -->
      <xsd:attribute name="entity" type="xsd:string" use="required"/>
      <!-- Requires redeclaring this permission in content or configuration -->
      <xsd:attribute name="external" type="xsd:boolean"/>
      <!-- Prevents redeclaring this permission in content or configuration -->
      <xsd:attribute name="internal" type="xsd:boolean"/>
      <xsd:attribute name="noPermissionDisplayKey" type="xsd:string"/>
      <!-- The permission key -->
      <xsd:attribute name="permKey" type="xsd:NMTOKEN" use="required"/>
      <!-- The permission key to wrap and for this permission key and additional permission check -->
      <xsd:attribute name="wrapPermKey" type="xsd:NMTOKEN" use="required"/>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>