...

Дублирование контрагентов

Тема в разделе "Разработчикам", создана пользователем AndySwan, 26 мар 2019.

  1. AndySwan

    AndySwan New Member

    Здравствуйте. Подскажите, пожалуйста, новичку. Стоит задача обеспечить уникальность контрагентов. Используется ELMA-CE. В базе знаний есть статья Исключение дублирования контрагентов, согласно которой в Дизайнере был заведён Объект Перехватчик и создан в нём сценарий. В статье пишется, что данный метод работает и при создании нового объекта, и при изменении существующего. Пробую завести нового контрагента с ИНН, который уже есть у существующего контрагента в базе и он спокойно создаётся! Таким образом в базе теперь есть два контрагента с одинаковыми ИНН. Т.е. при создании нового контрагента проверка на уникальность не сработала. Но при этом, если вносить какие-либо изменения в контрагенте, то проверка на уникальность работает. Нельзя установить контрагенту ИНН, который уже есть у другого в базе. Так же проводится проверка при удалении. Если попробовать удалить только что созданного контрагента с не уникальным ИНН, то выдаст ошибку и удалить его можно только после изменения ИНН на уникальный. Получается, что данный сценарий не работает при создании нового контрагента и работает только при изменении существующего, что противоречит написанному в указанной в статье. Подскажите, где и что я делаю не так?
     
  2. arkarimov

    arkarimov Member

    OnPreUpdate это событие реагирующее на обновление контрагента, статью надо рассматривать как пример а не как готовое решение.
    Надо отлавливать другие событие (OnPreInsert) для предупреждения создания неуникальных
    А при обновлении надо исключать ситуацию, когда обновляются служебные поля: удаление происходит примерно так: вы жмете удалить, программа проставляет IsDeleted =true (объекты в CRM не удаляются совсем, а метятся на удаление). Поскольку IsDeleted это изменение свойства, то это с точки зрения программы обновление а не удаление - срабатывает обработчик изменения который ругается на неуникального.
    Решить второй вопрос можно вставив в начале блока проверки что-то в духе
    if Kontragent.IsDeleted return false;
    А далее уже проверять если это не обработка удаления.
    PS названия свойств писал по памяти сверяться с свойствами в объектной модели. По логике тоже не тестировал на практике такое, но полагаю что все именно так как написал.
     
  3. AndySwan

    AndySwan New Member

    Спасибо. Всё получилось с OnPreInsert.
     
  4. yaroslawww

    yaroslawww New Member

    Покажите пожалуйста код перехватчика.
    По инструкции все выполняю, даже на редактирование не срабатывает
     
  5. MikeG

    MikeG New Member

    Код:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using EleWise.ELMA.ComponentModel;
    using EleWise.ELMA.CRM.Models;
    using EleWise.ELMA.Logging;
    using EleWise.ELMA.Model.Managers;
    using EleWise.ELMA.Runtime.NH.Listeners;
    using EleWise.ELMA.Runtime.Settings;
    using EleWise.ELMA.Services;
    using NHibernate.Event;
    
    namespace EleWise.ELMA.ConfigurationModel.Scripts
    {
       
       /// <summary>
       /// Модуль сценариев объекта "Перехватчик"
       /// </summary>
    
    
    
    //   public class PerehvatchikScripts : EleWise.ELMA.Model.Scripts.Entities.EntityScriptModule<IPerehvatchik>
    //   {
    
         [Component]
         public class ReSaveContractor : EntityEventsListener
         {
           public override bool OnPreInsert(PreInsertEvent @event)
           {
             // Определяем тип объекта
             //----------------------------------------------------------
             if (@event.Entity is IContractor) // интерфейс объекта типа Контрагент
             {
               var Kontragent = (IContractor)@event.Entity;
               
               if (Kontragent.LegalAddress != null && !string.IsNullOrWhiteSpace(Kontragent.LegalAddress.City)) // Если ввели город в юридическом адресе
               {
                 // Ищем по фильтру контрагента указываем ИНН и город и исключаем текущего контрагента
                 var filterString = string.Format(@"(INN is NULL OR INN = ’{0}’) and LegalAddress in (City LIKE ’%{1}%’) and Id <> {2}", Kontragent.INN, Kontragent.LegalAddress.City.Trim(), Kontragent.Id);
                 var findKA = EntityManager<IContractor>.Instance.Find(filterString);
                 if (findKA.Count == 0)
                 {
                   Logger.Log.Error("==Выход нет дублей ");
                 } else
                 {
                   throw new Exception("Контрагент уже существует. " + string.Format(@"{0}:9800/CRM/ContractorLegal/Details/{1}",
                    Locator.GetServiceNotNull<CommonSettingsModule>().Settings.ApplicationBaseUrl,
                    findKA.ElementAt(0).Id) +
                    " Укажите другие ИНН и город.");
                 }
               } else
               {
                 // Ищем по фильтру контрагента указываем ИНН и город и исключаем текущего контрагента
                 var filterString = string.Format(@"(INN is NULL OR INN = ’{0}’) and LegalAddress in (City is NULL OR City = ’’) and Id <> {1}", Kontragent.INN, Kontragent.Id);
                 var findKA = EntityManager<IContractor>.Instance.Find(filterString);
                 if (findKA.Count == 0)
                 {
                   Logger.Log.Error("==Выход нет дублей ");
                 } else
                 {
                   throw new Exception("Контрагент уже ." + string.Format(@"{0}:9900/CRM/ContractorLegal/Details/{1}",
                    Locator.GetServiceNotNull<CommonSettingsModule>().Settings.ApplicationBaseUrl,
                    findKA.ElementAt(0).Id) +
                    " Укажите другие ИНН и город.");
                 }
               }
             }
             return false; // возврат в норме
           }
    
           public override bool OnPreUpdate(PreUpdateEvent @event)
           {
    //         if (Kontragent.IsDeleted) return false;
             
             // Определяем тип объекта
             //----------------------------------------------------------
             if (@event.Entity is IContractor) // интерфейс объекта типа Контрагент
             {
               var Kontragent = (IContractor)@event.Entity;
               
               if (Kontragent.LegalAddress != null && !string.IsNullOrWhiteSpace(Kontragent.LegalAddress.City)) // Если ввели город в юридическом адресе
               {
                 // Ищем по фильтру контрагента указываем ИНН и город и исключаем текущего контрагента
                 var filterString = string.Format(@"(INN is NULL OR INN = ’{0}’) and LegalAddress in (City LIKE ’%{1}%’) and Id <> {2}", Kontragent.INN, Kontragent.LegalAddress.City.Trim(), Kontragent.Id);
                 var findKA = EntityManager<IContractor>.Instance.Find(filterString);
                 if (findKA.Count == 0)
                 {
                   Logger.Log.Error("==Выход нет дублей ");
                 } else
                 {
                   throw new Exception("Контрагент уже существует. " + string.Format(@"{0}:9800/CRM/ContractorLegal/Details/{1}",
                    Locator.GetServiceNotNull<CommonSettingsModule>().Settings.ApplicationBaseUrl,
                    findKA.ElementAt(0).Id) +
                    " Укажите другие ИНН и город.");
                 }
               } else
               {
                 // Ищем по фильтру контрагента указываем ИНН и город и исключаем текущего контрагента
                 var filterString = string.Format(@"(INN is NULL OR INN = ’{0}’) and LegalAddress in (City is NULL OR City = ’’) and Id <> {1}", Kontragent.INN, Kontragent.Id);
                 var findKA = EntityManager<IContractor>.Instance.Find(filterString);
                 if (findKA.Count == 0)
                 {
                   Logger.Log.Error("==Выход нет дублей ");
                 } else
                 {
                   throw new Exception("Контрагент уже ." + string.Format(@"{0}:9900/CRM/ContractorLegal/Details/{1}",
                    Locator.GetServiceNotNull<CommonSettingsModule>().Settings.ApplicationBaseUrl,
                    findKA.ElementAt(0).Id) +
                    " Укажите другие ИНН и город.");
                 }
               }
             }
             return false; // возврат в норме
           }
    
    
         }
    
    
    
    //   }
    
    }
    
     

Поделиться: