public ErrorCode DeleteRow(DataModel dataModel, DataModelTransaction transaction, DebtRuleRow debtRuleRow)
        {
            debtRuleRow.AcquireReaderLock(transaction);
            DebtRuleMapRow[] debtRuleMaps = debtRuleRow.GetDebtRuleMapRows();

            if (debtRuleRow.GetDebtClassRows().Length != 0)
            {
                return(ErrorCode.AccessDenied);
            }
            debtRuleRow.ReleaseReaderLock(transaction.TransactionId);

            foreach (DebtRuleMapRow debtRuleMapRow in debtRuleMaps)
            {
                debtRuleMapRow.AcquireReaderLock(transaction);
                if (!DataModelFilters.HasAccess(transaction, TradingSupport.UserId, debtRuleMapRow.DebtClassId, AccessRight.Write))
                {
                    return(ErrorCode.AccessDenied);
                }
                debtRuleMapRow.ReleaseReaderLock(transaction.TransactionId);
            }

            debtRuleRow.AcquireWriterLock(transaction);
            dataModel.DestroyDebtRule(new object[] { debtRuleRow.DebtRuleId }, debtRuleRow.RowVersion);
            debtRuleRow.ReleaseLock(transaction.TransactionId);

            return(ErrorCode.Success);
        }
        public override void Update(DebtRule record)
        {
            DataModel            dataModelClient = new DataModel();
            DataModelTransaction transaction     = DataModelTransaction.Current;
            DebtRuleRow          debtRuleRow     = DataModel.DebtRule.DebtRuleKey.Find(record.RowId);

            DebtRuleMapRow[] debtRuleMapRows;
            List <Guid>      paymentMethod = record.PaymentMethod.ToList();

            if (record.RowId == null || debtRuleRow == null)
            {
                throw new FaultException <RecordNotFoundFault>(new RecordNotFoundFault("DebtRule", new object[] { record.RowId }), "DebtRule could not be found");
            }

            debtRuleRow.AcquireReaderLock(transaction);
            debtRuleMapRows = debtRuleRow.GetDebtRuleMapRows();

            // There really should be at most one of these, but there may be none.
            foreach (DebtRuleMapRow debtRuleMapRow in debtRuleMapRows)
            {
                debtRuleMapRow.AcquireReaderLock(transaction);
                if (!DataModelFilters.HasAccess(transaction, TradingSupport.UserId, debtRuleMapRow.DebtClassId, AccessRight.Write))
                {
                    throw new SecurityAccessDeniedException("Current user does not have right access to the debt class that owns this debt rule");
                }
                debtRuleMapRow.ReleaseLock(transaction.TransactionId);
            }

            foreach (DebtRulePaymentMethodRow methodRow in debtRuleRow.GetDebtRulePaymentMethodRows())
            {
                methodRow.AcquireReaderLock(transaction);
                if (paymentMethod.Contains(methodRow.PaymentMethodTypeId))
                {
                    paymentMethod.Remove(methodRow.PaymentMethodTypeId);
                }
                else
                {
                    dataModelClient.DestroyDebtRulePaymentMethod(new object[] { methodRow.DebtRulePaymentMethodId }, methodRow.RowVersion);
                }
                methodRow.ReleaseLock(transaction.TransactionId);
            }

            foreach (Guid method in paymentMethod)
            {
                dataModelClient.CreateDebtRulePaymentMethod(record.RowId, Guid.NewGuid(), method);
            }

            debtRuleRow.ReleaseLock(transaction.TransactionId);

            dataModelClient.UpdateDebtRule(
                null,
                new object[] { record.RowId },
                null,
                record.IsAutoSettled,
                record.Name,
                record.PaymentLength,
                record.PaymentStartDateLength,
                record.PaymentStartDateUnitId,
                record.RowVersion,
                record.SettlementUnitId,
                record.SettlementValue);
            debtRuleRow.ReleaseLock(transaction.TransactionId);
        }