public class SalesCycle extends ChargeableTask
DBObject.DenormalizeAction| Modifier and Type | Field and Description |
|---|---|
static GlobalId |
DBCLASS_GID
Sales Opportunities record potential sales including details of
estimated sales value, enquiry source and products and labour charges to
be provided in the case of a sale.
|
static java.lang.String |
DBCLASS_NAME
Sales Opportunities record potential sales including details of
estimated sales value, enquiry source and products and labour charges to
be provided in the case of a sale.
|
skipAlert, STATUS_ACCEPTED, STATUS_COMPLETED, STATUS_DOLATER, STATUS_ENTERED, STATUS_REJECTED, STATUS_STARTEDATTRIBUTE_MARVIN, dbClass, ds, NO_LOOP_PARAMS| Constructor and Description |
|---|
SalesCycle(DBClass def,
DataSource dataSource)
Std.
|
| Modifier and Type | Method and Description |
|---|---|
DBObject |
createQuote(MutableDataSource mds) |
Sale |
createSale(MutableDataSource mds) |
java.lang.String |
displayName()
The display name
|
protected void |
eventFieldUpdated(DBField field,
java.lang.Object previous,
GlobalKey previousKey,
FldParams params)
update dependent fields.
|
protected void |
extAutoEnterCreate()
Additional functionality when an object is created.
|
protected void |
extCheckCreateAccess()
Additional access checking for create access of this object.
|
protected void |
extCheckDeleteAccess()
Additional access checking for DELETE access for this object.
|
protected void |
extCheckModifyAccess()
Additional access checking for write access of this object.
|
protected void |
extCheckReadAccess()
Additional access checking for READ access of this object.
|
protected void |
extFixUp()
The extended fix up routine for known problems.
|
protected GlobalKey |
extGetDerivedGlobalKey(DBField field,
FldParams params)
Calculate the derived global key for this field.
|
protected java.lang.Object |
extGetDerivedValue(DBField field,
FldParams params)
Calculate the derived value for this field.
|
protected boolean |
extIsMandatory(DBField field)
Conditional mandatory field.
|
protected boolean |
extIsOnChange(DBField field)
OVERRIDE This method to specify that when a field is updated it will affect other fields.
|
protected void |
extPreSaveRecord()
Over ridden method
|
protected void |
extPreValidate()
Update the in-memory universe BEFORE validating
|
InquirySource |
findInquirySource(java.lang.String... args)
Select Enquiry Source from pick list.
|
Invoice |
findOriginalSubscriptionInvoice(java.lang.String... args)
Invoice that this opportunity was generated from.
|
Quote |
findQuote() |
java.lang.Object |
findRejectedReason(java.lang.String... args)
Reason for rejection.
|
Invoice |
findRenewal() |
Sale |
findSale() |
TaskType |
findSaleType(java.lang.String... args)
Sale Type.
|
Invoice |
generateRenewal(MutableDataSource mds)
Generates a renewal invoice based on the chargeitems
The process creates a new subscription item if there is not already one
and makes sure that all charges are under this
The generateInvoice is then called to convert to invoice
TODO - tidy this process up so that we don't have to generate a
subscription item which we delete again
|
java.lang.String |
getAllDayEvent(java.lang.String... args) |
double |
getCalcEstSaleAmt(java.lang.String... args) |
double |
getCostOfSale(java.lang.String... args) |
java.util.Date |
getEstCloseDate(java.lang.String... args) |
java.lang.String |
getEstCloseMonthYear(java.lang.String... args) |
int |
getEstSaleAmt(java.lang.String... args) |
java.lang.String |
getHtmlProductList(java.lang.String... args) |
InquirySource |
getInquirySource(java.lang.String... args) |
Invoice |
getOriginalSubscriptionInvoice(java.lang.String... args) |
double |
getPotentialSaleAmt(java.lang.String... args) |
java.lang.String |
getPrivate(java.lang.String... args) |
java.util.Date |
getPublishedTS(java.lang.String... args) |
java.lang.Object |
getRejectedReason(java.lang.String... args) |
java.lang.String |
getReturnDateMonthYear(java.lang.String... args) |
TaskType |
getSaleType(java.lang.String... args) |
java.lang.String |
getUnsuccessfulNote(java.lang.String... args) |
java.lang.String |
getUnsuccessfulSubject(java.lang.String... args) |
boolean |
isClosesIn(java.lang.String... args) |
boolean |
isNeglected(java.lang.String... args) |
protected java.lang.String |
makeRawTags() |
protected java.lang.String |
makeSearchText() |
SalesCycle |
setEstCloseDate(java.util.Date value,
java.lang.String... args) |
SalesCycle |
setEstSaleAmt(int value,
java.lang.String... args) |
SalesCycle |
setInquirySource(com.aspc.dal.dbobj.misc.InquirySource value,
java.lang.String... args) |
SalesCycle |
setOriginalSubscriptionInvoice(com.aspc.dal.layers.aspc_app.invoice.Invoice value,
java.lang.String... args) |
SalesCycle |
setPublishedTS(java.util.Date value,
java.lang.String... args) |
SalesCycle |
setRejectedReason(java.lang.Object value,
java.lang.String... args) |
SalesCycle |
setSaleType(com.aspc.dal.layers.aspc_app.misc.TaskType value,
java.lang.String... args) |
SalesCycle |
setUnsuccessfulNote(java.lang.String value,
java.lang.String... args) |
SalesCycle |
setUnsuccessfulSubject(java.lang.String value,
java.lang.String... args) |
copyChildren, extCopy, extPostSaveRecord, findAccountManager, findBillTo, findCalcSaleType, findCampaign, findChargeTaxCode, findContact, findCopyFromTemplate, findDefaultLabourRate, findLastCompleteActivity, findLastModifiedActivity, findNextScheduledActivity, findPaymentTerms, findRecipient, findSite, findSiteRegion, findState, findSuburb, getAccountManager, getActivities, getAdjTotalPrice, getBillTo, getCalcAttn, getCalcBillTo, getCalcSaleType, getCampaign, getChargeTaxCode, getChargeTaxRate, getContact, getContactDisplaySiteAddress, getCopyFromTemplate, getCreditSurchargePerc, getCustomerInvoice, getCustomerInvoiceDate, getCustomerPO, getDefaultLabourRate, getDefaultSiteContact, getDeliveryFee, getDiscountRate, getDisplayContact, getDisplaySiteAddress, getDisplaySiteCountry, getDisplaySitePhone, getDisplaySitePostCode, getDisplaySiteState, getDisplaySiteSuburbCity, getJobItems, getLastActionTime, getLastCompleteActivity, getLastModifiedActivity, getLastNoticeNumber, getNextScheduledActivity, getOrderConfirmationNum, getPaymentTerms, getProfit, getProfitPerc, getRecipient, getRecipientName, getReminderComment, getSite, getSiteAddress, getSiteContactMobile, getSiteContactPerson, getSiteContactPhone, getSiteCoordinate, getSiteCountry, getSiteFax, getSiteName, getSiteNotes, getSitePhone, getSitePostcode, getSiteRegion, getSiteState, getSiteSuburbCity, getState, getStatusJournal, getSuburb, getTotalDiscount, getTotalRoyalties, setAccountManager, setAdjTotalPrice, setBillTo, setCampaign, setChargeTaxCode, setChargeTaxRate, setContact, setCopyFromTemplate, setCreditSurchargePerc, setCustomerInvoice, setCustomerInvoiceDate, setCustomerPO, setDefaultLabourRate, setDeliveryFee, setDiscountRate, setOrderConfirmationNum, setPaymentTerms, setRecipient, setReminderComment, setSite, setSiteAddress, setSiteContactMobile, setSiteContactPerson, setSiteContactPhone, setSiteCoordinate, setSiteCountry, setSiteFax, setSiteName, setSiteNotes, setSitePhone, setSitePostcode, setSiteRegion, setSiteState, setSiteSuburbCity, setState, setSuburb, updateProspectCategorycleanupCurrentNote, copyIncludeField, createFromType, extPreValidateDelete, extSetValue, extValidateField, findAssignTo, findAssignToGroup, findAttachedEmail, findCalcCustomer, findCategory, findCurrentNote, findCurrentNoteRaw, findDependsOn, findEnteredBy, findInitialAssignTo, findInitialNotNullAssignTo, findKey, findLastModifiedBy, findOwner, findOwnerBusUnit, findPredecessorsStatus, findPriority, findRepeatBase, findRepeatNext, findRepeatPrevious, findRequestedBy, findResult, findSchedAmPm, findSeriesPrevious, findSimpleStatus, findStatus, findStatusLastChangedBy, findTemplateType, findType, getActionByDate, getActualDuration, getActualEnd, getActualEndMonth, getActualStart, getAdditionalCharge, getAdditionalCosts, getAdditionalDetails, getAdjActualDuration, getAdjustedCost, getAssignTo, getAssignToDate, getAssignToGroup, getAttachedEmail, getCalcActualDuration, getCalcCustomer, getCalcTotalDuration, getCategory, getCurrentNote, getCurrentNoteRaw, getDependsOn, getDescription, getDisplayBusyTime, getDisplayId, getDisplaySchedTime, getDisplayShortDesc, getDisplayStatus, getDueBy, getDuration, getEndDate, getEnteredBy, getEnterTime, getEnterTimeMonthYear, getEstVSActualHours, getExpectedFinishMonthYear, getFullTextSearchScore, getHtmlDescription, getICalEnd, getICalFullAddress, getICalOrganizer, getICalStart, getID, getInitialAssignTo, getInitialAssignToDate, getInitialNotNullAssignTo, getInitialNotNullAssignToDate, getIssueDate, getLastModifiedBy, getLastModifiedTime, getLinkedJobs, getNextAlert, getNextOverdueAlert, getObseleteNotes, getOwner, getOwnerBusUnit, getPercUntilClosed, getPreAlertDuration, getPredecessorsStatus, getPrimaryType, getPriority, getProperties, getRawSearchText, getReferenceNumber, getReferencesUUID, getRepeatBase, getRepeatedTimezone, getRepeatNext, getRepeatPrevious, getRequestedBy, getResult, getSchedAmPm, getSequence, getSeriesPrevious, getShortDesc, getSimpleStatus, getStartDate, getStatus, getStatusLastChanged, getStatusLastChangedBy, getStatusLastChangedTurnaround, getTags, getTagsLabel, getTagsRaw, getTaskCoverphoto, getTaskfeedBackBad, getTaskfeedBackGood, getTaskfeedbacknotes, getTaskRating, getTaskSeries, getTemplateType, getTimemapDurationField, getTimemapEndTime, getTimemapEndTimeField, getTimemapStartTime, getTimemapStartTimeField, getTmpAttachmentKey, getTotalCost, getTotalLabourCosts, getTotalLabourPrice, getTotalLabourPriceExcTax, getTotalPriceExcTax, getTotalPriceIncTax, getTotalProductCosts, getTotalProductPrice, getTotalProductPriceExcTax, getTotalProfit, getTotalProfitPerc, getTotalRelatedCosts, getTotalTax, getType, getUntouchedTaskSeries, getUUID, getValueForPublic, getWeakReferencesUUID, handleEvent, hasReadAccess, isAllPredecessorsClosed, isApplicableTo, isCategoryRequired, isChangedByUser, isCheckPredecessorsClosed, isChildNode, isClosed, isContains, isCurrent, isDescendantNode, isDirectory, isDueByExpiresIn, isLockedAssignTo, isLockedStartDate, isMatchesSkillLevel, isMyGroup, isNextAlertDueIn, isNoteRequired, isPublic, isReferenceable, isRepeated, isSameNode, isSendAlert, isTimemapHasEndTime, isVersionable, lastModified, listNodes, makeQuery, makeSearchPlan, processRawTags, setActualEnd, setActualStart, setAdditionalCharge, setAdditionalCosts, setAdditionalDetails, setAdjActualDuration, setAdjustedCost, setAllPredecessorsClosed, setAssignTo, setAssignToDate, setAssignToGroup, setAttachedEmail, setCategory, setCategoryRequired, setChangedByUser, setCurrentNoteRaw, setDependsOn, setDescription, setDueBy, setDuration, setEndDate, setEnteredBy, setEnterTime, setID, setInitialAssignTo, setInitialAssignToDate, setIssueDate, setLastModifiedBy, setLastModifiedTime, setLockedAssignTo, setLockedStartDate, setNextAlert, setNextOverdueAlert, setObseleteNotes, setOwner, setOwnerBusUnit, setPercUntilClosed, setPreAlertDuration, setPredecessorsStatus, setPrimaryType, setPriority, setProperties, setRawSearchText, setReferenceable, setReferenceNumber, setReferencesUUID, setRepeatBase, setRepeated, setRepeatedTimezone, setRepeatNext, setRepeatPrevious, setRequestedBy, setResult, setSchedAmPm, setSendAlert, setSequence, setSeriesPrevious, setShortDesc, setSimpleStatus, setStartDate, setStatus, setStatusLastChanged, setStatusLastChangedBy, setTags, setTagsRaw, setTaskCoverphoto, setTaskfeedBackBad, setTaskfeedBackGood, setTaskfeedbacknotes, setTaskRating, setTemplateType, setTmpAttachmentKey, setType, setUUID, setVersionable, setWeakReferencesUUID, toString, updateStatus, vDisplayName, vNameaddReloadEventListener, archiveCheck, autoEnterCreate, calculateValue, calculateValue, calculateValue, callingRestoreByJournal, changeThreadMode, checkCreateAccess, checkDelete, checkDeleteAccess, checkModifyAccess, checkModifyAccess, checkReadAccess, clearCache, copy, copyFields, copyInwardLinks, delete, denormalizedResult, displayLogName, displayValue, doSearch, dump, equals, eventDataLoaded, extCanDeleteDependantObject, extCheckModifyAccess, extDelete, extDeleteRecord, extGetValue, extMarkSavePoint, extPostDeleteRecord, extPreDeleteRecord, extRaiseEvents, extRollbackTo, extSaveRecord, extUndelete, extValidateDelete, extValidateRecord, fetchLinkHolder, findGlobalKey, findGlobalKey, findGlobalKey, findGlobalKey, findLinkedObject, findLinkedObject, findLinkedObject, findRawData, fireEventDataLoaded, fixUp, forceLockedTransaction, getBoolean, getBoolean, getBoolean, getBoolean, getBoolean, getBoolean, getChangedFieldInfo, getChangedFields, getDate, getDate, getDate, getDate, getDate, getDefaultValue, getDisableOnChangeEvent, getDouble, getDouble, getDouble, getDouble, getDouble, getFieldDouble, getFieldInt, getFieldLong, getFieldString, getFormattedString, getFormattedString, getGlobalKey, getGlobalKey, getGlobalKey, getGlobalKey, getGlobalKey, getInt, getInt, getInt, getInt, getInt, getInt, getInwardLinkage, getKeyString, getKeyValue, getLinkedObject, getLinkedObject, getLinkedObject, getLinkedObjectByKey, getLinkedRowId, getLinkedRowId, getLinkedRowIdByData, getLinkHolder, getLockedTransaction, getLong, getLong, getLong, getLong, getLong, getLong, getMutableArrayValue, getMutableArrayValue, getOriginalKey, getOriginalValue, getOriginalValue, getProcessedValue, getPureValue, getRawData, getRawValue, getRawValue, getRowId, getRowKey, getSecondaryCacheGroupKey, getSrcLayerID, getString, getString, getString, getString, getString, getString, getValue, getValue, getValue, getValue, hasAutoChanged, hasAutoChanged, hasChanged, hasChangedByUser, hasChangedByUserField, hasChangedByUserField, hasFieldChanged, hasFieldChanged, hashCode, hasStoredResult, iCheckDeleteAccess, iCheckModifyAccess, iCheckReadAccess, iGetDenormalizedMap, iGetRawValue, iPlaceDenormalizedResult, iPostSaveOrDeleteRecord, iPreSaveOrDeleteRecord, iPreValidate, iRaiseEvents, iSaveOrDeleteRecord, isBrokenLink, isBrokenLink, isChanged, isDataCacheKnownToBeDirty, isDeleted, isEmpty, iSetValue, isForceReindex, isKeyWordField, isMandatory, isNew, isNull, isNull, isOnChange, isReindex, iValidateRecord, lastTouched, makeArchiveDataLoader, makeClone, makeDataLoader, makeDenormalizedDoc, makeLinkedArray, makeModifyAccessException, makeWriteProvider, manualDenormalizeOnSave, markSavePoint, optLockedTransaction, registerWatchedObject, reindex, releaseDenormalized, removeReloadEventListener, restoreByJournal, rollbackTo, setBoolean, setBoolean, setBoolean, setBoolean, setDisableOnChangeEvent, setDouble, setDouble, setInt, setInt, setLong, setLong, setRawData, setValue, setValue, setValue, setValue, setValue, setValue, setValue, setValue, setValue, setValue, touch, undelete, validateField, validateRecord, validateSubTypepublic static final java.lang.String DBCLASS_NAME
public static final GlobalId DBCLASS_GID
public SalesCycle(DBClass def, DataSource dataSource) throws java.lang.Exception
def - The class of this objectdataSource - The datasource for this objectjava.lang.Exception - A serious problem occurred@CheckReturnValue @Nonnull public java.lang.String getAllDayEvent(java.lang.String... args)
@CheckReturnValue public double getCalcEstSaleAmt(java.lang.String... args)
@CheckReturnValue public boolean isClosesIn(java.lang.String... args)
@CheckReturnValue public double getCostOfSale(java.lang.String... args)
@CheckReturnValue @Nullable public java.util.Date getEstCloseDate(java.lang.String... args)
@Nonnull public SalesCycle setEstCloseDate(java.util.Date value, java.lang.String... args) throws java.lang.Exception
java.lang.Exception@CheckReturnValue @Nonnull public java.lang.String getEstCloseMonthYear(java.lang.String... args)
@CheckReturnValue public int getEstSaleAmt(java.lang.String... args)
@Nonnull public SalesCycle setEstSaleAmt(int value, java.lang.String... args) throws java.lang.Exception
java.lang.Exception@CheckReturnValue @Nonnull public java.lang.String getHtmlProductList(java.lang.String... args)
@CheckReturnValue @Nullable public InquirySource getInquirySource(java.lang.String... args)
@CheckReturnValue @Nonnull public final InquirySource findInquirySource(java.lang.String... args) throws NotFoundException
InquirySource
(String, Searchable)args - the optional argumentsNotFoundException - InquirySource was not found@Nonnull public SalesCycle setInquirySource(com.aspc.dal.dbobj.misc.InquirySource value, java.lang.String... args) throws java.lang.Exception
java.lang.Exception@CheckReturnValue public boolean isNeglected(java.lang.String... args)
@CheckReturnValue @Nullable public Invoice getOriginalSubscriptionInvoice(java.lang.String... args)
@CheckReturnValue @Nonnull public final Invoice findOriginalSubscriptionInvoice(java.lang.String... args) throws NotFoundException
Invoice
(Integer, Searchable)args - the optional argumentsNotFoundException - Invoice was not found@Nonnull public SalesCycle setOriginalSubscriptionInvoice(com.aspc.dal.layers.aspc_app.invoice.Invoice value, java.lang.String... args) throws java.lang.Exception
java.lang.Exception@CheckReturnValue public double getPotentialSaleAmt(java.lang.String... args)
@CheckReturnValue @Nonnull public java.lang.String getPrivate(java.lang.String... args)
@CheckReturnValue @Nullable public java.util.Date getPublishedTS(java.lang.String... args)
@Nonnull public SalesCycle setPublishedTS(java.util.Date value, java.lang.String... args) throws java.lang.Exception
java.lang.Exception@CheckReturnValue @Nullable public java.lang.Object getRejectedReason(java.lang.String... args)
@CheckReturnValue
@Nonnull
public final java.lang.Object findRejectedReason(java.lang.String... args)
throws NotFoundException
SalesCycleRejectionReason (String, Searchable)args - the optional argumentsNotFoundException - SalesCycleRejectionReason was not found@Nonnull public SalesCycle setRejectedReason(java.lang.Object value, java.lang.String... args) throws java.lang.Exception
java.lang.Exception@CheckReturnValue @Nonnull public java.lang.String getReturnDateMonthYear(java.lang.String... args)
@CheckReturnValue @Nullable public TaskType getSaleType(java.lang.String... args)
@CheckReturnValue @Nonnull public final TaskType findSaleType(java.lang.String... args) throws NotFoundException
TaskType
(String, Mandatory, Searchable)args - the optional argumentsNotFoundException - TaskType was not found@Nonnull public SalesCycle setSaleType(com.aspc.dal.layers.aspc_app.misc.TaskType value, java.lang.String... args) throws java.lang.Exception
java.lang.Exception@CheckReturnValue @Nonnull public java.lang.String getUnsuccessfulNote(java.lang.String... args)
@Nonnull public SalesCycle setUnsuccessfulNote(java.lang.String value, java.lang.String... args) throws java.lang.Exception
java.lang.Exception@CheckReturnValue @Nonnull public java.lang.String getUnsuccessfulSubject(java.lang.String... args)
@Nonnull public SalesCycle setUnsuccessfulSubject(java.lang.String value, java.lang.String... args) throws java.lang.Exception
java.lang.Exceptionpublic Quote findQuote()
public Sale findSale()
public Sale createSale(MutableDataSource mds) throws java.lang.Exception
mds - the mutable data sourcejava.lang.Exception - a serious problempublic Invoice findRenewal()
public Invoice generateRenewal(MutableDataSource mds) throws java.lang.Exception
mds - the mutable data sourcejava.lang.Exception - a serious problem@CheckReturnValue @Nonnull public java.lang.String displayName()
displayName in class DBObjectpublic DBObject createQuote(MutableDataSource mds) throws java.lang.Exception
mds - the mutable data sourcejava.lang.Exception - a serious problem@OverridingMethodsMustInvokeSuper
protected void extAutoEnterCreate()
throws java.lang.Exception
extAutoEnterCreate in class ChargeableTaskjava.lang.Exception - A serious problemcom.aspc.DBObj.DBObject#autoEnterCreate()@CheckReturnValue
protected boolean extIsMandatory(@Nonnull
DBField field)
extIsMandatory in class ChargeableTaskfield - The field to getDBObject.extIsMandatory( DBField)@OverridingMethodsMustInvokeSuper
protected void extPreValidate()
throws java.lang.Exception
extPreValidate in class ChargeableTaskjava.lang.Exception - A serious problem@OverridingMethodsMustInvokeSuper
protected void extPreSaveRecord()
throws java.lang.Exception
ChargeableTaskextPreSaveRecord in class ChargeableTaskjava.lang.Exception - a serious problem@OverridingMethodsMustInvokeSuper
protected void extCheckModifyAccess()
throws DBAccessException
extCheckModifyAccess in class DBObjectDBAccessException - No access to modify@OverridingMethodsMustInvokeSuper
protected void extCheckCreateAccess()
throws DBAccessException
extCheckCreateAccess in class DBObjectDBAccessException - No access to createDBObject.checkCreateAccess()@OverridingMethodsMustInvokeSuper
protected void extCheckDeleteAccess()
throws DBAccessException
extCheckDeleteAccess in class DBObjectDBAccessException - No access to delete this object@OverridingMethodsMustInvokeSuper
protected void extCheckReadAccess()
throws DBAccessException
extCheckReadAccess in class DBObjectDBAccessException - No access to READDBObject.checkReadAccess()@OverridingMethodsMustInvokeSuper
protected void extFixUp()
throws java.lang.Exception
extFixUp in class ChargeableTaskjava.lang.Exception - A serious problem@CheckReturnValue
protected boolean extIsOnChange(@Nonnull
DBField field)
ChargeableTaskextIsOnChange in class ChargeableTaskfield - The field@OverridingMethodsMustInvokeSuper
protected void eventFieldUpdated(@Nonnull
DBField field,
@Nullable
java.lang.Object previous,
@Nullable
GlobalKey previousKey,
@Nullable
FldParams params)
throws java.lang.Exception
eventFieldUpdated in class ChargeableTaskfield - The field updated.previous - The previous value for this field.previousKey - The previous keyparams - The parameters usedjava.lang.Exception - a serious problem@CheckReturnValue
protected java.lang.Object extGetDerivedValue(@Nonnull
DBField field,
@Nullable
FldParams params)
throws java.lang.Exception
extGetDerivedValue in class ChargeableTaskfield - The field to getparams - The parameters for this field eg. language= or default=java.lang.Exception - A serious problem@CheckReturnValue @Nullable protected GlobalKey extGetDerivedGlobalKey(@Nonnull DBField field, @Nullable FldParams params) throws java.lang.Exception
extGetDerivedGlobalKey in class ChargeableTaskfield - The field to getparams - The parameters for this field eg. language= or default=java.lang.Exception - A serious problemprotected java.lang.String makeSearchText()
throws java.lang.Exception
java.lang.Exceptionprotected java.lang.String makeRawTags()
throws java.lang.Exception
java.lang.ExceptionstSoftware Copyright © 2001-2014 stSoftware All Rights Reserved.