|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.kuali.rice.kns.bo.BusinessObjectBase
org.kuali.rice.kns.bo.PersistableBusinessObjectBase
org.kuali.rice.kns.document.DocumentBase
org.kuali.rice.kns.document.TransactionalDocumentBase
org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase
org.kuali.kfs.sys.document.LedgerPostingDocumentBase
org.kuali.kfs.sys.document.GeneralLedgerPostingDocumentBase
org.kuali.kfs.module.ar.document.CustomerCreditMemoDocument
public class CustomerCreditMemoDocument
Field Summary | |
---|---|
protected AccountsReceivableDocumentHeader |
accountsReceivableDocumentHeader
|
protected AccountsReceivableTaxService |
arTaxService
|
protected List<CustomerCreditMemoDetail> |
creditMemoDetails
|
protected org.kuali.rice.kns.util.KualiDecimal |
crmTotalAmount
|
protected org.kuali.rice.kns.util.KualiDecimal |
crmTotalItemAmount
|
protected org.kuali.rice.kns.util.KualiDecimal |
crmTotalTaxAmount
|
protected String |
financialDocumentReferenceInvoiceNumber
|
protected CustomerInvoiceDocument |
invoice
|
protected Integer |
invOutstandingDays
|
protected static org.apache.log4j.Logger |
LOG
|
protected String |
statusCode
|
protected TaxService |
taxService
|
Fields inherited from class org.kuali.kfs.sys.document.GeneralLedgerPostingDocumentBase |
---|
generalLedgerPendingEntries |
Fields inherited from class org.kuali.kfs.sys.document.LedgerPostingDocumentBase |
---|
accountingPeriod, accountingPeriodService, checkPostingYearForCopy, dataDictionaryService, dateTimeService, postingPeriodCode, postingYear |
Fields inherited from class org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase |
---|
documentHeader |
Fields inherited from class org.kuali.rice.kns.document.DocumentBase |
---|
documentBusinessObject, documentNumber |
Fields inherited from class org.kuali.rice.kns.bo.PersistableBusinessObjectBase |
---|
extension, versionNumber |
Constructor Summary | |
---|---|
CustomerCreditMemoDocument()
|
Method Summary | |
---|---|
protected void |
addIncomeGLPEs(GeneralLedgerPendingEntrySequenceHelper sequenceHelper,
GeneralLedgerPendingEntrySourceDetail glpeSourceDetail,
boolean hasClaimOnCashOffset)
This method adds pending entry with transaction ledger entry amount set to item price * quantity |
void |
addPendingEntry(GeneralLedgerPendingEntry entry)
Adds a GeneralLedgerPendingEntry to this document's list of pending entries |
protected void |
addReceivableGLPEs(GeneralLedgerPendingEntrySequenceHelper sequenceHelper,
GeneralLedgerPendingEntrySourceDetail glpeSourceDetail,
boolean hasClaimOnCashOffset)
This method creates the receivable GLPEs for credit memo detail lines. |
protected void |
addSalesTaxGLPEs(GeneralLedgerPendingEntrySequenceHelper sequenceHelper,
GeneralLedgerPendingEntrySourceDetail glpeSourceDetail,
boolean hasClaimOnCashOffset)
This method add pending entries for every tax detail that exists for a particular postal code |
void |
clearAnyGeneralLedgerPendingEntries()
This resets this document's list of general ledger pending etnries, though it does not delete those entries (however, the GeneralLedgerPendingEntryService will in most cases when this method is called). |
void |
clearInitFields()
Clear out the initially populated fields. |
void |
doRouteStatusChange(org.kuali.rice.kew.dto.DocumentRouteStatusChangeDTO statusChangeEvent)
When document is processed do the following: 1) Apply amounts to writeoff invoice 2) Mark off invoice indiciator |
boolean |
generateDocumentGeneralLedgerPendingEntries(GeneralLedgerPendingEntrySequenceHelper sequenceHelper)
Creates any GeneralLedgerPostingEntry's that are based on a document, not those based on GeneralLedgerPendingEntrySourceDetail entries |
boolean |
generateGeneralLedgerPendingEntries(GeneralLedgerPendingEntrySourceDetail glpeSourceDetail,
GeneralLedgerPendingEntrySequenceHelper sequenceHelper)
This method creates the following GLPE's for the customer credit memo 1. |
AccountsReceivableDocumentHeader |
getAccountsReceivableDocumentHeader()
|
AccountsReceivableTaxService |
getArTaxService()
Gets the arTaxService attribute. |
List<CustomerCreditMemoDetail> |
getCreditMemoDetails()
Gets the creditMemoDetails attribute. |
org.kuali.rice.kns.util.KualiDecimal |
getCrmTotalAmount()
Gets the crmTotalAmount attribute. |
org.kuali.rice.kns.util.KualiDecimal |
getCrmTotalItemAmount()
Gets the crmTotalItemAmount attribute. |
org.kuali.rice.kns.util.KualiDecimal |
getCrmTotalTaxAmount()
Gets the crmTotalTaxAmount attribute. |
String |
getCurrencyFormattedCrmTotalAmount()
This method returns the crmTotalAmount as a currency formatted string. |
String |
getCurrencyFormattedCrmTotalItemAmount()
This method returns the crmTotalItemAmount as a currency formatted string. |
String |
getCurrencyFormattedCrmTotalTaxAmount()
This method returns the crmTotalTaxAmount as a currency formatted string. |
protected org.kuali.rice.kns.util.KualiDecimal |
getCustomerInvoiceDetailOpenPretaxAmount(org.kuali.rice.kns.util.KualiDecimal openAmount)
|
String |
getFinancialDocumentReferenceInvoiceNumber()
Gets the financialDocumentReferenceInvoiceNumber attribute. |
String |
getFinancialDocumentTypeCode()
Returns the general ledger input type code for the given document, using the DataDictionaryService |
org.kuali.rice.kns.util.KualiDecimal |
getGeneralLedgerPendingEntryAmountForDetail(GeneralLedgerPendingEntrySourceDetail postable)
A method to determine what the actual amount, based off of a GeneralLedgerPendingEntrySourceDetail, should be for the resultant GeneralLedgerPendingEntry |
List<GeneralLedgerPendingEntrySourceDetail> |
getGeneralLedgerPendingEntrySourceDetails()
Returns a list of any GeneralLedgerPostables this helper has, to create GeneralLedgerPendingEntries |
CustomerInvoiceDocument |
getInvoice()
Gets the invoice attribute. |
org.kuali.rice.kns.util.KualiDecimal |
getInvoiceOpenItemQuantity(CustomerCreditMemoDetail customerCreditMemoDetail,
CustomerInvoiceDetail customerInvoiceDetail)
|
Integer |
getInvOutstandingDays()
Gets the invOutstandingDays attribute. |
String |
getPostalCode()
|
String |
getStatusCode()
Gets the statusCode attribute. |
TaxService |
getTaxService()
Gets the taxService attribute. |
org.kuali.rice.kns.util.KualiDecimal |
getTotalDollarAmount()
This method returns the total dollar amount for the document. |
List<Long> |
getWorkflowEngineDocumentIdsToLock()
|
void |
initiateDocument()
Initializes the values for a new document. |
boolean |
isDebit(GeneralLedgerPendingEntrySourceDetail postable)
This method determines if the passed in GeneralLedgerPendingEntrySourceDetail is a debit or not. |
void |
populateCustomerCreditMemoDetails()
|
void |
populateCustomerCreditMemoDetailsAfterLoad()
This method populates credit memo details that aren't saved in database |
void |
prepareForSave(org.kuali.rice.kns.rule.event.KualiDocumentEvent event)
do all the calculations before the document gets saved gets called for 'Submit', 'Save', and 'Blanket Approved' |
protected void |
prepareTotalsForUpdate(org.kuali.rice.kns.util.KualiDecimal oldItemAmount,
boolean isTaxableItemFlag)
|
void |
recalculateTotals(CustomerCreditMemoDetail customerCreditMemoDetail)
|
void |
recalculateTotals(org.kuali.rice.kns.util.KualiDecimal itemAmount,
boolean isTaxableItemFlag)
|
void |
recalculateTotalsBasedOnChangedItemAmount(CustomerCreditMemoDetail customerCreditMemoDetail)
|
void |
resetTotals()
|
void |
setAccountsReceivableDocumentHeader(AccountsReceivableDocumentHeader accountsReceivableDocumentHeader)
|
void |
setCreditMemoDetails(List<CustomerCreditMemoDetail> creditMemoDetails)
Sets the creditMemoDetails attribute value. |
void |
setCrmTotalAmount(org.kuali.rice.kns.util.KualiDecimal crmTotalAmount)
Sets the crmTotalAmount attribute value. |
void |
setCrmTotalItemAmount(org.kuali.rice.kns.util.KualiDecimal crmTotalItemAmount)
Sets the crmTotalItemAmount attribute value. |
void |
setCrmTotalTaxAmount(org.kuali.rice.kns.util.KualiDecimal crmTotalTaxAmount)
Sets the crmTotalTaxAmount attribute value. |
void |
setFinancialDocumentReferenceInvoiceNumber(String financialDocumentReferenceInvoiceNumber)
Sets the financialDocumentReferenceInvoiceNumber attribute value. |
void |
setInvoice(CustomerInvoiceDocument invoice)
Sets the invoice attribute value. |
void |
setInvOutstandingDays(Integer invOutstandingDays)
Sets the invOutstandingDays attribute value. |
void |
setStatusCode(String statusCode)
Sets the statusCode attribute value. |
Methods inherited from class org.kuali.kfs.sys.document.LedgerPostingDocumentBase |
---|
createInitialAccountingPeriod, getAccountingPeriod, getAccountingPeriodService, getDataDictionaryService, getDateTimeService, getPostingPeriodCode, getPostingYear, retrieveCurrentAccountingPeriod, setAccountingPeriod, setPostingPeriodCode, setPostingYear |
Methods inherited from class org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase |
---|
answerSplitNodeQuestion, getDocumentHeader, prepareForSave, processAfterRetrieve, setDocumentHeader |
Methods inherited from class org.kuali.rice.kns.document.TransactionalDocumentBase |
---|
getAllowsCopy, isSessionDocument |
Methods inherited from class org.kuali.rice.kns.document.DocumentBase |
---|
addCopyErrorDocumentNote, addPessimisticLock, afterLookup, afterWorkflowEngineProcess, beforeWorkflowEngineProcess, createPropertySerializabilityEvaluator, doActionTaken, doRouteLevelChange, generateSaveEvents, getAdHocRoutePersons, getAdHocRouteWorkgroups, getBasePathToDocumentDuringSerialization, getCustomLockDescriptor, getDocumentBusinessObject, getDocumentNumber, getDocumentPropertySerizabilityEvaluator, getDocumentTitle, getLockClearningMethodNames, getNonLockingActionTakenCodes, getPessimisticLocks, getXmlForRouteReport, logErrors, populateDocumentForRouting, postProcessSave, refresh, refreshIfEmpty, refreshPessimisticLocks, refreshReferenceObject, serializeDocumentToXml, setAdHocRoutePersons, setAdHocRouteWorkgroups, setDocumentNumber, setNewDocumentHeader, setPessimisticLocks, toString, toStringBuilder, toStringMapper, useCustomLockDescriptors, validateBusinessRules, wrapDocumentWithMetadataForXmlSerialization |
Methods inherited from class org.kuali.rice.kns.bo.PersistableBusinessObjectBase |
---|
addNote, afterDelete, afterInsert, afterUpdate, beforeDelete, beforeInsert, beforeInsert, beforeUpdate, beforeUpdate, buildListOfDeletionAwareLists, deleteNote, getAttachmentService, getBoNote, getBoNotes, getExtension, getNoteService, getObjectId, getPersistenceService, getPersistenceStructureService, getVersionNumber, isAutoIncrementSet, isBoNotesSupport, isNewCollectionRecord, linkEditableUserFields, refreshNonUpdateableReferences, setAutoIncrementSet, setBoNotes, setExtension, setNewCollectionRecord, setObjectId, setVersionNumber, supportsBoNotes |
Methods inherited from class org.kuali.rice.kns.bo.BusinessObjectBase |
---|
prepareForWorkflow |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Methods inherited from interface org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource |
---|
getDocumentHeader, getPostingYear |
Methods inherited from interface org.kuali.kfs.sys.document.LedgerPostingDocument |
---|
getAccountingPeriod, getPostingPeriodCode, getPostingYear, setAccountingPeriod, setPostingPeriodCode, setPostingYear |
Methods inherited from interface org.kuali.kfs.sys.document.FinancialSystemTransactionalDocument |
---|
answerSplitNodeQuestion, getDocumentHeader |
Methods inherited from interface org.kuali.rice.kns.document.Document |
---|
addPessimisticLock, afterWorkflowEngineProcess, beforeWorkflowEngineProcess, doActionTaken, doRouteLevelChange, generateSaveEvents, getAdHocRoutePersons, getAdHocRouteWorkgroups, getAllowsCopy, getBasePathToDocumentDuringSerialization, getCustomLockDescriptor, getDocumentBusinessObject, getDocumentNumber, getDocumentPropertySerizabilityEvaluator, getDocumentTitle, getLockClearningMethodNames, getPessimisticLocks, getXmlForRouteReport, populateDocumentForRouting, postProcessSave, prepareForSave, processAfterRetrieve, refreshPessimisticLocks, serializeDocumentToXml, setAdHocRoutePersons, setAdHocRouteWorkgroups, setDocumentHeader, setDocumentNumber, useCustomLockDescriptors, validateBusinessRules, wrapDocumentWithMetadataForXmlSerialization |
Methods inherited from interface org.kuali.rice.kns.bo.PersistableBusinessObject |
---|
addNote, buildListOfDeletionAwareLists, deleteNote, getBoNote, getBoNotes, getExtension, getObjectId, getVersionNumber, isBoNotesSupport, isNewCollectionRecord, linkEditableUserFields, refreshNonUpdateableReferences, refreshReferenceObject, setAutoIncrementSet, setExtension, setNewCollectionRecord, setObjectId, setVersionNumber |
Methods inherited from interface org.kuali.rice.kns.bo.BusinessObject |
---|
prepareForWorkflow, refresh |
Methods inherited from interface org.apache.ojb.broker.PersistenceBrokerAware |
---|
afterDelete, afterInsert, afterLookup, afterUpdate, beforeDelete, beforeInsert, beforeUpdate |
Field Detail |
---|
protected static org.apache.log4j.Logger LOG
protected String statusCode
protected String financialDocumentReferenceInvoiceNumber
protected org.kuali.rice.kns.util.KualiDecimal crmTotalItemAmount
protected org.kuali.rice.kns.util.KualiDecimal crmTotalTaxAmount
protected org.kuali.rice.kns.util.KualiDecimal crmTotalAmount
protected Integer invOutstandingDays
protected CustomerInvoiceDocument invoice
protected AccountsReceivableDocumentHeader accountsReceivableDocumentHeader
protected List<CustomerCreditMemoDetail> creditMemoDetails
protected transient TaxService taxService
protected transient AccountsReceivableTaxService arTaxService
Constructor Detail |
---|
public CustomerCreditMemoDocument()
Method Detail |
---|
public List<CustomerCreditMemoDetail> getCreditMemoDetails()
public void setCreditMemoDetails(List<CustomerCreditMemoDetail> creditMemoDetails)
creditMemoDetails
- The creditMemoDetails to set.public String getFinancialDocumentReferenceInvoiceNumber()
public void setFinancialDocumentReferenceInvoiceNumber(String financialDocumentReferenceInvoiceNumber)
financialDocumentReferenceInvoiceNumber
- The financialDocumentReferenceInvoiceNumber to set.public CustomerInvoiceDocument getInvoice()
public void setInvoice(CustomerInvoiceDocument invoice)
invoice
- The invoice to set.public String getStatusCode()
public void setStatusCode(String statusCode)
statusCode
- The statusCode to set.public void initiateDocument()
public void clearInitFields()
public org.kuali.rice.kns.util.KualiDecimal getCrmTotalAmount()
public String getCurrencyFormattedCrmTotalAmount()
public void setCrmTotalAmount(org.kuali.rice.kns.util.KualiDecimal crmTotalAmount)
crmTotalAmount
- The crmTotalAmount to set.public org.kuali.rice.kns.util.KualiDecimal getCrmTotalItemAmount()
public String getCurrencyFormattedCrmTotalItemAmount()
public void setCrmTotalItemAmount(org.kuali.rice.kns.util.KualiDecimal crmTotalItemAmount)
crmTotalItemAmount
- The crmTotalItemAmount to set.public org.kuali.rice.kns.util.KualiDecimal getCrmTotalTaxAmount()
public String getCurrencyFormattedCrmTotalTaxAmount()
public void setCrmTotalTaxAmount(org.kuali.rice.kns.util.KualiDecimal crmTotalTaxAmount)
crmTotalTaxAmount
- The crmTotalTaxAmount to set.public Integer getInvOutstandingDays()
public void setInvOutstandingDays(Integer invOutstandingDays)
invOutstandingDays
- The invOutstandingDays to set.public void recalculateTotalsBasedOnChangedItemAmount(CustomerCreditMemoDetail customerCreditMemoDetail)
public void recalculateTotals(CustomerCreditMemoDetail customerCreditMemoDetail)
protected void prepareTotalsForUpdate(org.kuali.rice.kns.util.KualiDecimal oldItemAmount, boolean isTaxableItemFlag)
public void resetTotals()
public void recalculateTotals(org.kuali.rice.kns.util.KualiDecimal itemAmount, boolean isTaxableItemFlag)
public void populateCustomerCreditMemoDetails()
public void populateCustomerCreditMemoDetailsAfterLoad()
public org.kuali.rice.kns.util.KualiDecimal getInvoiceOpenItemQuantity(CustomerCreditMemoDetail customerCreditMemoDetail, CustomerInvoiceDetail customerInvoiceDetail)
protected org.kuali.rice.kns.util.KualiDecimal getCustomerInvoiceDetailOpenPretaxAmount(org.kuali.rice.kns.util.KualiDecimal openAmount)
public void prepareForSave(org.kuali.rice.kns.rule.event.KualiDocumentEvent event)
prepareForSave
in interface org.kuali.rice.kns.document.Document
prepareForSave
in class GeneralLedgerPostingDocumentBase
Document.prepareForSave(org.kuali.rice.kns.rule.event.KualiDocumentEvent)
public boolean generateDocumentGeneralLedgerPendingEntries(GeneralLedgerPendingEntrySequenceHelper sequenceHelper)
GeneralLedgerPendingEntrySource
generateDocumentGeneralLedgerPendingEntries
in interface GeneralLedgerPendingEntrySource
sequenceHelper
- a sequence helper for the method to create more general ledger pending entries
GeneralLedgerPendingEntrySource.generateDocumentGeneralLedgerPendingEntries(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper)
public boolean isDebit(GeneralLedgerPendingEntrySourceDetail postable)
GeneralLedgerPendingEntrySource
isDebit
in interface GeneralLedgerPendingEntrySource
GeneralLedgerPendingEntrySource.isDebit(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail)
public void clearAnyGeneralLedgerPendingEntries()
GeneralLedgerPostingDocumentBase
clearAnyGeneralLedgerPendingEntries
in interface GeneralLedgerPendingEntrySource
clearAnyGeneralLedgerPendingEntries
in class GeneralLedgerPostingDocumentBase
GeneralLedgerPendingEntrySource.clearAnyGeneralLedgerPendingEntries()
public List<GeneralLedgerPendingEntrySourceDetail> getGeneralLedgerPendingEntrySourceDetails()
GeneralLedgerPendingEntrySource
getGeneralLedgerPendingEntrySourceDetails
in interface GeneralLedgerPendingEntrySource
org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#getGeneralLedgerPostables()
public void addPendingEntry(GeneralLedgerPendingEntry entry)
GeneralLedgerPostingDocumentBase
addPendingEntry
in interface GeneralLedgerPendingEntrySource
addPendingEntry
in class GeneralLedgerPostingDocumentBase
entry
- a pending entry to addGeneralLedgerPendingEntrySource.addPendingEntry(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry)
public org.kuali.rice.kns.util.KualiDecimal getGeneralLedgerPendingEntryAmountForDetail(GeneralLedgerPendingEntrySourceDetail postable)
GeneralLedgerPendingEntrySource
getGeneralLedgerPendingEntryAmountForDetail
in interface GeneralLedgerPendingEntrySource
postable
- the detail line from the general ledger pending entry source to find an amount for
org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#getGeneralLedgerPendingEntryAmountForGeneralLedgerPostable(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail)
public String getFinancialDocumentTypeCode()
getFinancialDocumentTypeCode
in interface GeneralLedgerPendingEntrySource
getFinancialDocumentTypeCode
in class LedgerPostingDocumentBase
public List<Long> getWorkflowEngineDocumentIdsToLock()
getWorkflowEngineDocumentIdsToLock
in interface org.kuali.rice.kns.document.Document
getWorkflowEngineDocumentIdsToLock
in class org.kuali.rice.kns.document.DocumentBase
public void doRouteStatusChange(org.kuali.rice.kew.dto.DocumentRouteStatusChangeDTO statusChangeEvent)
doRouteStatusChange
in interface org.kuali.rice.kns.document.Document
doRouteStatusChange
in class GeneralLedgerPostingDocumentBase
org.kuali.kfs.sys.document.GeneralLedgerPostingDocumentBase#doRouteStatusChange()
public boolean generateGeneralLedgerPendingEntries(GeneralLedgerPendingEntrySourceDetail glpeSourceDetail, GeneralLedgerPendingEntrySequenceHelper sequenceHelper)
generateGeneralLedgerPendingEntries
in interface GeneralLedgerPendingEntrySource
glpeSourceDetail
- the source detail line to generate general ledger pending entries forsequenceHelper
- the sequence helper which will assign sequence number to generated general ledger pending entries
org.kuali.kfs.service.impl.GenericGeneralLedgerPendingEntryGenerationProcessImpl#processGenerateGeneralLedgerPendingEntries(org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper)
protected void addReceivableGLPEs(GeneralLedgerPendingEntrySequenceHelper sequenceHelper, GeneralLedgerPendingEntrySourceDetail glpeSourceDetail, boolean hasClaimOnCashOffset)
poster
- sequenceHelper
- postable
- explicitEntry
- protected void addIncomeGLPEs(GeneralLedgerPendingEntrySequenceHelper sequenceHelper, GeneralLedgerPendingEntrySourceDetail glpeSourceDetail, boolean hasClaimOnCashOffset)
poster
- sequenceHelper
- postable
- explicitEntry
- protected void addSalesTaxGLPEs(GeneralLedgerPendingEntrySequenceHelper sequenceHelper, GeneralLedgerPendingEntrySourceDetail glpeSourceDetail, boolean hasClaimOnCashOffset)
sequenceHelper
- glpeSourceDetail
- hasClaimOnCashOffset
- public org.kuali.rice.kns.util.KualiDecimal getTotalDollarAmount()
AmountTotaling
getTotalDollarAmount
in interface AmountTotaling
public AccountsReceivableDocumentHeader getAccountsReceivableDocumentHeader()
public void setAccountsReceivableDocumentHeader(AccountsReceivableDocumentHeader accountsReceivableDocumentHeader)
public String getPostalCode()
public TaxService getTaxService()
public AccountsReceivableTaxService getArTaxService()
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |