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_STARTED
ATTRIBUTE_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, updateProspectCategory
cleanupCurrentNote, 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, vName
addReloadEventListener, 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, validateSubType
public 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.Exception
public 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 DBObject
public 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 ChargeableTask
java.lang.Exception
- A serious problemcom.aspc.DBObj.DBObject#autoEnterCreate()
@CheckReturnValue protected boolean extIsMandatory(@Nonnull DBField field)
extIsMandatory
in class ChargeableTask
field
- The field to getDBObject.extIsMandatory( DBField)
@OverridingMethodsMustInvokeSuper protected void extPreValidate() throws java.lang.Exception
extPreValidate
in class ChargeableTask
java.lang.Exception
- A serious problem@OverridingMethodsMustInvokeSuper protected void extPreSaveRecord() throws java.lang.Exception
ChargeableTask
extPreSaveRecord
in class ChargeableTask
java.lang.Exception
- a serious problem@OverridingMethodsMustInvokeSuper protected void extCheckModifyAccess() throws DBAccessException
extCheckModifyAccess
in class DBObject
DBAccessException
- No access to modify@OverridingMethodsMustInvokeSuper protected void extCheckCreateAccess() throws DBAccessException
extCheckCreateAccess
in class DBObject
DBAccessException
- No access to createDBObject.checkCreateAccess()
@OverridingMethodsMustInvokeSuper protected void extCheckDeleteAccess() throws DBAccessException
extCheckDeleteAccess
in class DBObject
DBAccessException
- No access to delete this object@OverridingMethodsMustInvokeSuper protected void extCheckReadAccess() throws DBAccessException
extCheckReadAccess
in class DBObject
DBAccessException
- No access to READDBObject.checkReadAccess()
@OverridingMethodsMustInvokeSuper protected void extFixUp() throws java.lang.Exception
extFixUp
in class ChargeableTask
java.lang.Exception
- A serious problem@CheckReturnValue protected boolean extIsOnChange(@Nonnull DBField field)
ChargeableTask
extIsOnChange
in class ChargeableTask
field
- 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 ChargeableTask
field
- 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 ChargeableTask
field
- 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 ChargeableTask
field
- 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.Exception
protected java.lang.String makeRawTags() throws java.lang.Exception
java.lang.Exception
stSoftware Copyright © 2001-2014 stSoftware All Rights Reserved.