Content Accelerator for Policy and Procedure Management - tsgrp/HPI GitHub Wiki
The Alfresco Content Accelerator for Policy and Procedure Management helps companies maintain quality processes of their essential documents that require strict control over content lifecycle, reviews, and approvals. The intuitive interface facilitates consistency, collaboration, electronic review and approval for knowledge workers and provides 21 CFR Part 11 compliant electronic signatures. Document annotations are supported through using the build in Alfresco Enterprise Viewer to efficiently facilitate document review and approval. Customers will benefit from the following:
- Time & Cost Savings – Significant cost and time savings for customers that are using email and manual processes to gather signatures.
- Compliance – The interface adheres to the quality regulations from FDA, ISO, NRC, etc. For example, the Policy and Procedure Manager ensures that policies and procedures undergo periodic review and limit access to only Approved and Effective content.
- Consistency - The Policy and Procedure Accelerator drives the approval process based on a configurable change request form which collects relevant data about the change. This approach reduces user decisions and errors commonly found with an ad-hoc or static workflow template approach.
- Support for Complex Changes – Allows changes that impact multiple documents to be managed together as a single change package.
- Efficiency – A simple, intuitive interface allows users to easily locate and work with documents, including report generation for management.
- Secure - Document security is tightly controlled by the Alfresco Content Accelerator for Policy and Procedure Management. Consumer users are only able to access Approved or Released content, while document editors and approvers can create and edit work-in-process versions, ensuring that document consumers are never referencing the wrong version of a policy or procedure document.
While the Content Accelerator administration console provides powerful UI-based configurations, sometimes back end configurations are desired. Typical configuration points include:
Form and workflow updates are made in the WizardAdmin application. See the ACA Administration guide for more information.
The default Quality Document object type is the out-of-the-box available controlled document type. If you wish to add additional properties or aspects to your Policy and Procedure solution, you can extend the quality document type using the following steps.
In a custom Alfresco AMP, define your custom Alfresco object model, then do the following:
- Extend the
aw:qualityDocument
type in your object model.
<type name="acme:document">
<title>Sample Document Type</title>
<parent>aw:qualityDocument</parent>
</type>
You can define whatever additional properties, aspects, associations etc that you wish on your custom object type.
-
You'll need to import the
aw
namespace -<import uri="http://www.activewizard.com/model/content/1.0" prefix="aw" />
-
Update your dictionary import bean to depend on the
com.tsgrp.openContent.dictionaryBootstrap
bean, eg below:
<bean id="pnp-sample-extension-project.dictionaryBootstrap" parent="dictionaryModelBootstrap"
depends-on="dictionaryBootstrap,com.tsgrp.openContent.dictionaryBootstrap">
For an example of the above steps fully implemented for the acme:document
object type, see the following sample project: https://github.com/tsgrp/Alfresco-Utilities/tree/master/sample-projects/acme-pnp-extension-sample
In addition to the above steps in your custom AMP, you'll need to configure the opencontent-override-module-context.xml
to recognize your new custom type.
-
Define the
tsgQualityDocBehaviours
,tsgControlledDocVersionPolicies
, andpermissionsModel
beans in theopencontent-override-module-context.xml
. -
Add the
acme:document
object type to thevalidDoctypesForTSGVersionControl
property lists for the first three beans. -
Add the
acme:document
object type to thepermissionsModel
bean. -
Add the
acme:document
object type to theWizardQualityDocLifecycleApplicableTypes
bean in theopencontent-override-config.xml
.
For the three steps above, see the below for example configuration:
<!-- Behaviour to applied to Quality Documents in order to update aspects, tsg:status, and remove minor versions upon promotion. -->
<bean id="tsgQualityDocBehaviours" class="com.tsgrp.alfresco.behaviour.TSGQualityDocumentBehaviors" init-method="init" depends-on="com.tsgrp.openContent.dictionaryBootstrap,pnp-sample-extension-project.dictionaryBootstrap">
<property name="policyComponent" ref="policyComponent" />
<property name="serviceRegistry" ref="ServiceRegistry" />
<property name="behaviorFilter" ref="policyBehaviourFilter" />
<property name="newTSGControlledDocPermissionAspect" value="{http://www.tsgrp.com/model/tsg/1.0}qualityDraft" />
<property name="controlledDocOwnerName" value="admin" />
<property name="namespacePrefixResolver">
<ref bean="namespaceService" />
</property>
<property name="validDoctypesForTSGVersionControl">
<list>
<value>aw:psi</value>
<value>aw:controlledDocument</value>
<value>aw:qualityDocument</value>
<value>acme:document</value>
</list>
</property>
</bean>
<!-- Contains the version policy and related necessary behaviors to control document versioning schema -->
<bean id="tsgControlledDocVersionPolicies" class="com.tsgrp.alfresco.behaviour.ControlledDocumentVersionPolicy" init-method="init" depends-on="com.tsgrp.openContent.dictionaryBootstrap,pnp-sample-extension-project.dictionaryBootstrap">
<property name="policyComponent" ref="policyComponent" />
<property name="serviceRegistry" ref="ServiceRegistry" />
<property name="behaviorFilter" ref="policyBehaviourFilter" />
<property name="namespacePrefixResolver">
<ref bean="namespaceService" />
</property>
<property name="validDoctypesForTSGVersionControl">
<list>
<value>aw:psi</value>
<value>aw:qualityDocument</value>
<value>aw:controlledDocument</value>
<value>acme:document</value>
</list>
</property>
</bean>
<util:map id="permissionsModel">
<entry key="aw:qualityDocument" value-ref="permissions_aw_quality_document"/>
<entry key="aw:controlledDocument" value-ref="permissions_aw_controlled_document"/>
<entry key="aw:psi" value-ref="permissions_aw_psi"/>
<entry key="acme:document" value-ref="permissions_aw_quality_document"/>
</util:map>
<bean id="WizardQualityDocLifecycleApplicableTypes" class="java.util.ArrayList" >
<constructor-arg index="0">
<list>
<value>Quality Document</value>
<value>aw_legacyQualityDocument</value>
<value>acme_document</value>
</list>
</constructor-arg>
</bean>
The default Quality Document object type is the out-of-the-box available controlled document type. If you wish to add additional properties or aspects to your Policy and Procedure solution, you can extend the quality document type using the following steps.
In a custom Alfresco AMP (See https://github.com/tsgrp/HPI/wiki/Extension-Content-Accelerator-(Custom-Amp) on what is expected of a custom ACA amp and how to set it up properly), define your custom Alfresco object model, then do the following:
- Extend the
aw:qualityDocument
type in your object model.
<type name="acme:document">
<title>Sample Document Type</title>
<parent>aw:qualityDocument</parent>
</type>
You can define whatever additional properties, aspects, associations etc that you wish on your custom object type.
-
You'll need to import the
aw
namespace -<import uri="http://www.activewizard.com/model/content/1.0" prefix="aw" />
-
In the custom Amps module-context, override the
com.tsgrp.openContent.dictionaryBootstrap
bean and add your custom model (https://github.com/tsgrp/HPI/wiki/Extension-Content-Accelerator-(Custom-Amp)#how-to-add-custom-alfresco-models)
Next in your custom amps opencontent-extension-override-module-ctx.xml file
-
Define the
tsgQualityDocBehaviours
,tsgControlledDocVersionPolicies
, andpermissionsModel
beans. -
Add the
acme:document
object type to thevalidDoctypesForTSGVersionControl
property lists for the first three beans. -
Add the
acme:document
object type to thepermissionsModel
bean. -
Add the
acme:document
object type to theWizardQualityDocLifecycleApplicableTypes
bean in theopencontent-extension-override-config.xml
.
For the three steps above, see the below for example configuration:
<!-- Behaviour to applied to Quality Documents in order to update aspects, tsg:status, and remove minor versions upon promotion. -->
<bean id="tsgQualityDocBehaviours" class="com.tsgrp.alfresco.behaviour.TSGQualityDocumentBehaviors" init-method="init" depends-on="com.tsgrp.openContent.dictionaryBootstrap">
<property name="policyComponent" ref="policyComponent" />
<property name="serviceRegistry" ref="ServiceRegistry" />
<property name="behaviorFilter" ref="policyBehaviourFilter" />
<property name="newTSGControlledDocPermissionAspect" value="{http://www.tsgrp.com/model/tsg/1.0}qualityDraft" />
<property name="controlledDocOwnerName" value="admin" />
<property name="namespacePrefixResolver">
<ref bean="namespaceService" />
</property>
<property name="validDoctypesForTSGVersionControl">
<list>
<value>aw:psi</value>
<value>aw:controlledDocument</value>
<value>aw:qualityDocument</value>
<value>acme:document</value>
</list>
</property>
</bean>
<!-- Contains the version policy and related necessary behaviors to control document versioning schema -->
<bean id="tsgControlledDocVersionPolicies" class="com.tsgrp.alfresco.behaviour.ControlledDocumentVersionPolicy" init-method="init" depends-on="com.tsgrp.openContent.dictionaryBootstrap">
<property name="policyComponent" ref="policyComponent" />
<property name="serviceRegistry" ref="ServiceRegistry" />
<property name="behaviorFilter" ref="policyBehaviourFilter" />
<property name="namespacePrefixResolver">
<ref bean="namespaceService" />
</property>
<property name="validDoctypesForTSGVersionControl">
<list>
<value>aw:psi</value>
<value>aw:qualityDocument</value>
<value>aw:controlledDocument</value>
<value>acme:document</value>
</list>
</property>
</bean>
<util:map id="permissionsModel">
<entry key="aw:qualityDocument" value-ref="permissions_aw_quality_document"/>
<entry key="aw:controlledDocument" value-ref="permissions_aw_controlled_document"/>
<entry key="aw:psi" value-ref="permissions_aw_psi"/>
<entry key="acme:document" value-ref="permissions_aw_quality_document"/>
</util:map>
<bean id="WizardQualityDocLifecycleApplicableTypes" class="java.util.ArrayList" >
<constructor-arg index="0">
<list>
<value>Quality Document</value>
<value>aw_legacyQualityDocument</value>
<value>acme_document</value>
</list>
</constructor-arg>
</bean>
The Policy and Procedure solution includes a dynamic security model that allows documents to be secured independently based on lifecycle state. To override the existing security settings, override the following beans in the opencontent-override-module-context.xml
(or the opencontent-extension-override-module-ctx.xml
if using ACA 3.5 and above). This example extends the above acme:document
example of a custom object type extending the tsg:qualityDocument
object type, so please follow those steps above first.
- Update the
permissionsModel
bean with a new value ref for theacme:document
type (egpermissions_acme_document
in the below example)
<util:map id="permissionsModel">
<entry key="aw:qualityDocument" value-ref="permissions_aw_quality_document"/>
<entry key="aw:controlledDocument" value-ref="permissions_aw_controlled_document"/>
<entry key="aw:psi" value-ref="permissions_aw_psi"/>
<entry key="acme:document" value-ref="permissions_acme_document"/>
</util:map>
- Create a
permissions_acme_document
bean and update its value refs to point to new permission sets, as needed. If we want the subtype to simply follow the exact permissions as the out of the box parent, simply set the permissions model to the existing permissions, likelypermissions_aw_quality_document
for document subtypes andpermissions_aw_psi
for subtypes. However, if we want to make changes for our subtype, see the below example where the Superseded permissions are changed for a document subtype.
Original permission set:
<util:map id="permissions_acme_document">
<!-- quality doc security -->
<entry key="${wizard.lifecycle.repoNames.qualityDraftDocState}" value-ref="controlledDocDraftPermissions" />
<entry key="${wizard.lifecycle.repoNames.qualityInReviewDocState}" value-ref="controlledDocInReviewPermissions" />
<entry key="${wizard.lifecycle.repoNames.qualityPendingApprovalDocState}" value-ref="controlledDocPendingApprovalPermissions" />
<entry key="${wizard.lifecycle.repoNames.qualityApprovedDocState}" value-ref="controlledDocApprovedPermissions" />
<entry key="${wizard.lifecycle.repoNames.qualityEffectiveDocState}" value-ref="controlledDocEffectivePermissions" />
<entry key="${wizard.lifecycle.repoNames.qualitySupersededDocState}" value-ref="controlledDocSupersededPermissions" />
<entry key="${wizard.lifecycle.repoNames.qualityObsoleteDocState}" value-ref="controlledDocObsoletePermissions" />
<entry key="{http://www.tsgrp.com/model/openannotate/1.0}unredacted" value-ref="unredactedPermissions" />
</util:map>
Updated permission set
<util:map id="permissions_acme_document">
<!-- quality doc security -->
<entry key="${wizard.lifecycle.repoNames.qualityDraftDocState}" value-ref="controlledDocDraftPermissions" />
<entry key="${wizard.lifecycle.repoNames.qualityInReviewDocState}" value-ref="controlledDocInReviewPermissions" />
<entry key="${wizard.lifecycle.repoNames.qualityPendingApprovalDocState}" value-ref="controlledDocPendingApprovalPermissions" />
<entry key="${wizard.lifecycle.repoNames.qualityApprovedDocState}" value-ref="controlledDocApprovedPermissions" />
<entry key="${wizard.lifecycle.repoNames.qualityEffectiveDocState}" value-ref="controlledDocEffectivePermissions" />
<entry key="${wizard.lifecycle.repoNames.qualitySupersededDocState}" value-ref="acmeCustomSupersededPermissions" />
<entry key="${wizard.lifecycle.repoNames.qualityObsoleteDocState}" value-ref="controlledDocObsoletePermissions" />
<entry key="{http://www.tsgrp.com/model/openannotate/1.0}unredacted" value-ref="unredactedPermissions" />
</util:map>
- Lastly define the new custom permission.
Original permission setting
<util:map id="controlledDocSupersededPermissions">
<entry key="GROUP_wizard_administrators" value="controlled_doc_superseded" />
<!-- does NOT give wizard_contributors any access -->
</util:map>
Customized permission setting
<util:map id="acmeCustomSupersededPermissions">
<entry key="GROUP_wizard_administrators" value="controlled_doc_superseded" />
<!-- does NOT give wizard_contributors any access -->
<entry key="GROUP_acme_superseded_viewers" value="controlled_doc_superseded" />
</util:map>
A full reference of the permission sets granted can be found at this link: Permission Reference
If you wish to define your own custom permissionSets and permissionGroups, please see this page for more information: https://docs.alfresco.com/6.2/references/dev-extension-points-permissions.html
Once a custom permissionSet is defined and enabled via your custom AMP, it can be referenced in the customized ACA permission configuration.
In some cases, you may only want to override some of the default properties of the pnp accelerator. You do not need an entire custom amp to do this though. Instead you can create the file opencontent-override-placeholders.properties
at the tomcat/shared/classes/alfresco/module/com.tsgrp.opencontent/
folder and put the overridden properties in there.
Two things to note with this:
- This file will win out on any other property files, even ones in the custom amp. For this reason, if you are using a custom amp, it is better to override the properties in the amp than this file
- You will likely need to create the
module/com.tsgrp.opencontent/
folders in thetomcat/shared/classes
directory