/// <summary>
        /// Validates the general application record of a Person.
        /// </summary>
        /// <param name="AContext">Context that describes where the data validation failed.</param>
        /// <param name="ARow">The <see cref="DataRow" /> which holds the the data against which the validation is run.</param>
        /// <param name="AEventApplication">true if application for event, false if application for field.</param>
        /// <param name="AVerificationResultCollection">Will be filled with any <see cref="TVerificationResult" /> items if
        /// data validation errors occur.</param>
        /// <param name="AValidationControlsDict">A <see cref="TValidationControlsDict" /> containing the Controls that
        /// display data that is about to be validated.</param>
        /// <returns>void</returns>
        public static void ValidateGeneralApplicationManual(object AContext, PmGeneralApplicationRow ARow, bool AEventApplication,
            ref TVerificationResultCollection AVerificationResultCollection, TValidationControlsDict AValidationControlsDict)
        {
            DataColumn ValidationColumn;
            TValidationControlsData ValidationControlsData;
            TVerificationResult VerificationResult;

            // Don't validate deleted DataRows
            if (ARow.RowState == DataRowState.Deleted)
            {
                return;
            }

            // 'Application Type' must have a value and must not be unassignable
            ValidationColumn = ARow.Table.Columns[PmGeneralApplicationTable.ColumnAppTypeNameId];

            if (AValidationControlsDict.TryGetValue(ValidationColumn, out ValidationControlsData))
            {
                VerificationResult = TStringChecks.StringMustNotBeEmpty(ARow.AppTypeName,
                    ValidationControlsData.ValidationControlLabel,
                    AContext, ValidationColumn, ValidationControlsData.ValidationControl);

                // Handle addition to/removal from TVerificationResultCollection
                AVerificationResultCollection.Auto_Add_Or_AddOrRemove(AContext, VerificationResult, ValidationColumn);

                PtApplicationTypeTable AppTypeTable;
                PtApplicationTypeRow AppTypeRow = null;

                VerificationResult = null;

                if (!ARow.IsAppTypeNameNull())
                {
                    AppTypeTable = (PtApplicationTypeTable)TSharedDataCache.TMPersonnel.GetCacheablePersonnelTableDelegate(
                        TCacheablePersonTablesEnum.ApplicationTypeList);
                    AppTypeRow = (PtApplicationTypeRow)AppTypeTable.Rows.Find(ARow.AppTypeName);

                    // 'Application Type' must not be unassignable
                    if ((AppTypeRow != null)
                        && AppTypeRow.UnassignableFlag
                        && (AppTypeRow.IsUnassignableDateNull()
                            || (AppTypeRow.UnassignableDate <= DateTime.Today)))
                    {
                        // if 'Application Type' is unassignable then check if the value has been changed or if it is a new record
                        if (TSharedValidationHelper.IsRowAddedOrFieldModified(ARow, PmGeneralApplicationTable.GetAppTypeNameDBName()))
                        {
                            VerificationResult = new TScreenVerificationResult(new TVerificationResult(AContext,
                                    ErrorCodes.GetErrorInfo(PetraErrorCodes.ERR_VALUEUNASSIGNABLE_WARNING,
                                        new string[] { ValidationControlsData.ValidationControlLabel, ARow.AppTypeName })),
                                ValidationColumn, ValidationControlsData.ValidationControl);
                        }
                    }
                }

                // Handle addition/removal to/from TVerificationResultCollection
                AVerificationResultCollection.Auto_Add_Or_AddOrRemove(AContext, VerificationResult, ValidationColumn);
            }

            // 'Application Status' must not be unassignable
            ValidationColumn = ARow.Table.Columns[PmGeneralApplicationTable.ColumnGenApplicationStatusId];

            if (AValidationControlsDict.TryGetValue(ValidationColumn, out ValidationControlsData))
            {
                PtApplicantStatusTable AppStatusTable;
                PtApplicantStatusRow AppStatusRow = null;

                VerificationResult = null;

                if (!ARow.IsGenApplicationStatusNull())
                {
                    AppStatusTable = (PtApplicantStatusTable)TSharedDataCache.TMPersonnel.GetCacheablePersonnelTableDelegate(
                        TCacheablePersonTablesEnum.ApplicantStatusList);
                    AppStatusRow = (PtApplicantStatusRow)AppStatusTable.Rows.Find(ARow.GenApplicationStatus);

                    // 'Application Status' must not be unassignable
                    if ((AppStatusRow != null)
                        && AppStatusRow.UnassignableFlag
                        && (AppStatusRow.IsUnassignableDateNull()
                            || (AppStatusRow.UnassignableDate <= DateTime.Today)))
                    {
                        // if 'Application Status' is unassignable then check if the value has been changed or if it is a new record
                        if (TSharedValidationHelper.IsRowAddedOrFieldModified(ARow, PmGeneralApplicationTable.GetGenApplicationStatusDBName()))
                        {
                            VerificationResult = new TScreenVerificationResult(new TVerificationResult(AContext,
                                    ErrorCodes.GetErrorInfo(PetraErrorCodes.ERR_VALUEUNASSIGNABLE_WARNING,
                                        new string[] { ValidationControlsData.ValidationControlLabel, ARow.GenApplicationStatus })),
                                ValidationColumn, ValidationControlsData.ValidationControl);
                        }
                    }
                }

                // Handle addition/removal to/from TVerificationResultCollection
                AVerificationResultCollection.Auto_Add_Or_AddOrRemove(AContext, VerificationResult, ValidationColumn);
            }

            // following validation only relevant for event applications
            if (AEventApplication)
            {
                // 'Organization Contact 1' must not be unassignable
                ValidationColumn = ARow.Table.Columns[PmGeneralApplicationTable.ColumnGenContact1Id];

                if (AValidationControlsDict.TryGetValue(ValidationColumn, out ValidationControlsData))
                {
                    PtContactTable ContactTable;
                    PtContactRow ContactRow;

                    VerificationResult = null;

                    if ((!ARow.IsGenContact1Null())
                        && (ARow.GenContact1 != String.Empty))
                    {
                        ContactTable = (PtContactTable)TSharedDataCache.TMPersonnel.GetCacheablePersonnelTable(
                            TCacheablePersonTablesEnum.ContactList);
                        ContactRow = (PtContactRow)ContactTable.Rows.Find(ARow.GenContact1);

                        // 'Contact' must not be unassignable
                        if ((ContactRow != null)
                            && ContactRow.UnassignableFlag
                            && (ContactRow.IsUnassignableDateNull()
                                || (ContactRow.UnassignableDate <= DateTime.Today)))
                        {
                            // if 'Contact' is unassignable then check if the value has been changed or if it is a new record
                            if (TSharedValidationHelper.IsRowAddedOrFieldModified(ARow, PmGeneralApplicationTable.GetGenContact1DBName()))
                            {
                                VerificationResult = new TScreenVerificationResult(new TVerificationResult(AContext,
                                        ErrorCodes.GetErrorInfo(PetraErrorCodes.ERR_VALUEUNASSIGNABLE_WARNING,
                                            new string[] { ValidationControlsData.ValidationControlLabel, ARow.GenContact1 })),
                                    ValidationColumn, ValidationControlsData.ValidationControl);
                            }
                        }
                    }

                    // Handle addition/removal to/from TVerificationResultCollection
                    AVerificationResultCollection.Auto_Add_Or_AddOrRemove(AContext, VerificationResult, ValidationColumn);
                }

                // 'Organization Contact 2' must not be unassignable
                ValidationColumn = ARow.Table.Columns[PmGeneralApplicationTable.ColumnGenContact2Id];

                if (AValidationControlsDict.TryGetValue(ValidationColumn, out ValidationControlsData))
                {
                    PtContactTable ContactTable;
                    PtContactRow ContactRow;

                    VerificationResult = null;

                    if ((!ARow.IsGenContact2Null())
                        && (ARow.GenContact2 != String.Empty))
                    {
                        ContactTable = (PtContactTable)TSharedDataCache.TMPersonnel.GetCacheablePersonnelTable(
                            TCacheablePersonTablesEnum.ContactList);
                        ContactRow = (PtContactRow)ContactTable.Rows.Find(ARow.GenContact2);

                        // 'Contact' must not be unassignable
                        if ((ContactRow != null)
                            && ContactRow.UnassignableFlag
                            && (ContactRow.IsUnassignableDateNull()
                                || (ContactRow.UnassignableDate <= DateTime.Today)))
                        {
                            // if 'Contact' is unassignable then check if the value has been changed or if it is a new record
                            if (TSharedValidationHelper.IsRowAddedOrFieldModified(ARow, PmGeneralApplicationTable.GetGenContact2DBName()))
                            {
                                VerificationResult = new TScreenVerificationResult(new TVerificationResult(AContext,
                                        ErrorCodes.GetErrorInfo(PetraErrorCodes.ERR_VALUEUNASSIGNABLE_WARNING,
                                            new string[] { ValidationControlsData.ValidationControlLabel, ARow.GenContact2 })),
                                    ValidationColumn, ValidationControlsData.ValidationControl);
                            }
                        }
                    }

                    // Handle addition/removal to/from TVerificationResultCollection
                    AVerificationResultCollection.Auto_Add_Or_AddOrRemove(AContext, VerificationResult, ValidationColumn);
                }
            }

            // following validation only relevant for field applications
            if (!AEventApplication)
            {
                // Field Application: 'Field' must be a Partner of Class 'UNIT' and must not be 0 and not be null
                ValidationColumn = ARow.Table.Columns[PmGeneralApplicationTable.ColumnGenAppPossSrvUnitKeyId];

                if (AValidationControlsDict.TryGetValue(ValidationColumn, out ValidationControlsData))
                {
                    if (ARow.IsGenAppPossSrvUnitKeyNull())
                    {
                        VerificationResult = new TScreenVerificationResult(new TVerificationResult(AContext,
                                ErrorCodes.GetErrorInfo(PetraErrorCodes.ERR_PARTNERKEY_INVALID_NOTNULL,
                                    new string[] { ValidationControlsData.ValidationControlLabel })),
                            ValidationColumn, ValidationControlsData.ValidationControl);
                    }
                    else
                    {
                        VerificationResult = TSharedPartnerValidation_Partner.IsValidUNITPartner(
                            ARow.GenAppPossSrvUnitKey, false, THelper.NiceValueDescription(
                                ValidationControlsData.ValidationControlLabel) + " must be set correctly.",
                            AContext, ValidationColumn, ValidationControlsData.ValidationControl);
                    }

                    // Since the validation can result in different ResultTexts we need to remove any validation result manually as a call to
                    // AVerificationResultCollection.AddOrRemove wouldn't remove a previous validation result with a different
                    // ResultText!
                    AVerificationResultCollection.Remove(ValidationColumn);
                    AVerificationResultCollection.AddAndIgnoreNullValue(VerificationResult);
                }
            }

            // 'Cancellation date' must not be a future date
            ValidationColumn = ARow.Table.Columns[PmGeneralApplicationTable.ColumnGenAppCancelledId];

            if (AValidationControlsDict.TryGetValue(ValidationColumn, out ValidationControlsData))
            {
                VerificationResult = null;

                VerificationResult = TDateChecks.IsCurrentOrPastDate(ARow.GenAppCancelled, ValidationControlsData.ValidationControlLabel,
                    AContext, ValidationColumn, ValidationControlsData.ValidationControl);

                // Handle addition to/removal from TVerificationResultCollection
                AVerificationResultCollection.Auto_Add_Or_AddOrRemove(AContext, VerificationResult, ValidationColumn);
            }

            // 'Accepted by sending field date' must not be a future date
            ValidationColumn = ARow.Table.Columns[PmGeneralApplicationTable.ColumnGenAppSendFldAcceptDateId];

            if (AValidationControlsDict.TryGetValue(ValidationColumn, out ValidationControlsData))
            {
                VerificationResult = null;

                VerificationResult = TDateChecks.IsCurrentOrPastDate(ARow.GenAppSendFldAcceptDate, ValidationControlsData.ValidationControlLabel,
                    AContext, ValidationColumn, ValidationControlsData.ValidationControl);

                // Handle addition to/removal from TVerificationResultCollection
                AVerificationResultCollection.Auto_Add_Or_AddOrRemove(AContext, VerificationResult, ValidationColumn);
            }

            // 'Accepted by receiving field date' must not be a future date
            ValidationColumn = ARow.Table.Columns[PmGeneralApplicationTable.ColumnGenAppRecvgFldAcceptId];

            if (AValidationControlsDict.TryGetValue(ValidationColumn, out ValidationControlsData))
            {
                VerificationResult = null;

                VerificationResult = TDateChecks.IsCurrentOrPastDate(ARow.GenAppRecvgFldAccept, ValidationControlsData.ValidationControlLabel,
                    AContext, ValidationColumn, ValidationControlsData.ValidationControl);

                // Handle addition to/removal from TVerificationResultCollection
                AVerificationResultCollection.Auto_Add_Or_AddOrRemove(AContext, VerificationResult, ValidationColumn);
            }
        }