/*Validate Document Type compatability
         *	@return Error message or null if valid
         */
        public String Validate()
        {
            MDocType dt = GetDocType();

            if (dt == null)
            {
                log.Log(Level.SEVERE, "No DocType=" + GetC_DocType_ID());
                SetIsValid(false);
                return("No Document Type");
            }
            MDocType c_dt = GetCounterDocType();

            if (c_dt == null)
            {
                log.Log(Level.SEVERE, "No Counter DocType=" + GetCounter_C_DocType_ID());
                SetIsValid(false);
                return("No Counter Document Type");
            }
            //
            String dtBT   = dt.GetDocBaseType();
            String c_dtBT = c_dt.GetDocBaseType();

            log.Fine(dtBT + " -> " + c_dtBT);

            //	SO / PO
            if ((MDocBaseType.DOCBASETYPE_SALESORDER.Equals(dtBT) && MDocBaseType.DOCBASETYPE_PURCHASEORDER.Equals(c_dtBT)) ||
                (MDocBaseType.DOCBASETYPE_SALESORDER.Equals(c_dtBT) && MDocBaseType.DOCBASETYPE_PURCHASEORDER.Equals(dtBT)))
            {
                SetIsValid(true);
            }
            //	AP/AR Invoice
            else if ((MDocBaseType.DOCBASETYPE_APINVOICE.Equals(dtBT) && MDocBaseType.DOCBASETYPE_ARINVOICE.Equals(c_dtBT)) ||
                     (MDocBaseType.DOCBASETYPE_APINVOICE.Equals(c_dtBT) && MDocBaseType.DOCBASETYPE_ARINVOICE.Equals(dtBT)))
            {
                SetIsValid(true);
            }
            //	Shipment
            else if ((MDocBaseType.DOCBASETYPE_MATERIALDELIVERY.Equals(dtBT) && MDocBaseType.DOCBASETYPE_MATERIALRECEIPT.Equals(c_dtBT)) ||
                     (MDocBaseType.DOCBASETYPE_MATERIALDELIVERY.Equals(c_dtBT) && MDocBaseType.DOCBASETYPE_MATERIALRECEIPT.Equals(dtBT)))
            {
                SetIsValid(true);
            }
            //	AP/AR CreditMemo
            else if ((MDocBaseType.DOCBASETYPE_APCREDITMEMO.Equals(dtBT) && MDocBaseType.DOCBASETYPE_ARCREDITMEMO.Equals(c_dtBT)) ||
                     (MDocBaseType.DOCBASETYPE_APCREDITMEMO.Equals(c_dtBT) && MDocBaseType.DOCBASETYPE_ARCREDITMEMO.Equals(dtBT)))
            {
                SetIsValid(true);
            }
            //	Receipt / Payment
            else if ((MDocBaseType.DOCBASETYPE_ARRECEIPT.Equals(dtBT) && MDocBaseType.DOCBASETYPE_APPAYMENT.Equals(c_dtBT)) ||
                     (MDocBaseType.DOCBASETYPE_ARRECEIPT.Equals(c_dtBT) && MDocBaseType.DOCBASETYPE_APPAYMENT.Equals(dtBT)))
            {
                SetIsValid(true);
            }
            else
            {
                log.Warning("NOT - " + dtBT + " -> " + c_dtBT);
                SetIsValid(false);
                return("Not valid");
            }
            //	Counter should have document numbering
            if (!c_dt.IsDocNoControlled())
            {
                return("Counter Document Type should be automatically Document Number controlled");
            }
            return(null);
        }