예제 #1
0
        private string GetFilterBy()
        {
            var filter = String.Empty;

            var info       = new SearchTextInfo(SearchText);
            var searchText = info.SearchText;

            var sqlSearchText      = info.SqlSearchText;
            var searchTextIsNumber = info.SearchTextIsNumber;
            var searchTextIsPhone  = info.SearchTextIsPhone;

            switch (SearchBy)
            {
            case SearchUserBy.Auto: {
                if (searchTextIsNumber)
                {
                    filter += String.Format(@" u.Id = {0} or s.Id = {0} ", searchText);
                }
                else
                {
                    filter = AddFilterCriteria(filter,
                                               String.Format(@"
LOWER(u.Login) like '{0}' or
LOWER(u.Name) like '{0}' or
LOWER(s.Name) like '{0}' ",
                                                             sqlSearchText));
                }
                if (searchTextIsPhone && searchText.Length >= 6)
                {
                    filter += String.Format(" or (REPLACE(Contacts.ContactText, '-', '') like '{0}' and Contacts.Type = 1)" +
                                            " or (REPLACE(ContactsAddresses.ContactText, '-', '') like '{0}' and ContactsAddresses.Type = 1) ",
                                            sqlSearchText.Replace("-", ""));
                }
                break;
            }

            case SearchUserBy.ByClientName: {
                filter = AddFilterCriteria(filter,
                                           String.Format(" LOWER(s.Name) like '{0}'", sqlSearchText));
                break;
            }

            case SearchUserBy.ByClientId: {
                filter = AddFilterCriteria(filter, String.Format(" s.Id = {0} ", searchTextIsNumber ? searchText : "-1"));
                break;
            }

            case SearchUserBy.ByJuridicalName: {
                filter = AddFilterCriteria(filter, String.Format(" LOWER(p.JuridicalName) like '{0}'", sqlSearchText));
                break;
            }

            case SearchUserBy.ByLogin: {
                filter = AddFilterCriteria(filter, String.Format(" LOWER(u.Login) like '{0}' ", sqlSearchText));
                break;
            }

            case SearchUserBy.ByPayerId: {
                filter = AddFilterCriteria(filter, String.Format(" u.PayerId = {0} ", searchTextIsNumber ? searchText : "-1"));
                break;
            }

            case SearchUserBy.ByUserId: {
                filter = AddFilterCriteria(filter, String.Format(" u.Id = {0} ", searchTextIsNumber ? searchText : "-1"));
                break;
            }

            case SearchUserBy.ByUserName: {
                filter = AddFilterCriteria(filter, String.Format(" LOWER(u.Name) like '{0}' ", sqlSearchText));
                break;
            }

            case SearchUserBy.ByContacts: {
                if (searchTextIsPhone || searchTextIsNumber)
                {
                    filter = AddFilterCriteria(filter,
                                               String.Format(@"
(REPLACE(Contacts.ContactText, '-', '') like '{0}' and Contacts.Type = 1 ) or 
(REPLACE(ContactsAddresses.ContactText, '-', '') like '{0}' and ContactsAddresses.Type = 1 ) or
(REPLACE(PayerCont.ContactText, '-', '') like '{0}' and PayerCont.Type = 1 )
", sqlSearchText.Replace("-", "")));
                }
                else
                {
                    filter = AddFilterCriteria(filter,
                                               String.Format(@"
(LOWER(Contacts.ContactText) like '{0}' and Contacts.Type = 0 and ((cg.Specialized = false) or (cg.id = ifnull(u.ContactGroupId, (cg.Specialized = false))))) or
(LOWER(ContactsAddresses.ContactText) like '{0}' and ContactsAddresses.Type = 0 and ((cga.Specialized = false) or (cga.id = ifnull(u.ContactGroupId, (cga.Specialized = false))))) or
(LOWER(ContactsPerson.ContactText) like '{0}' and ContactsPerson.Type = 0) or
(LOWER(PayerCont.ContactText) like '{0}' and PayerCont.Type = 0)
", sqlSearchText));
                }
                break;
            }

            case SearchUserBy.ByPersons: {
                filter = AddFilterCriteria(filter, String.Format(" LOWER(Persons.Name) like '{0}' ", sqlSearchText));
                break;
            }

            case SearchUserBy.AddressMail:
                filter = AddFilterCriteria(filter, String.Format(" (concat(a.Id, '@waybills.analit.net') = '{0}' or concat(a.Id, '@refused.analit.net') = '{0}') ", sqlSearchText.Replace("%", string.Empty)));
                break;
            }
            return(filter);
        }
예제 #2
0
        public IList <UserSearchItem> Find()
        {
            var administrator = SecurityContext.Administrator;
            var orderFilter   = String.Format("ORDER BY {0} {1}", GetSortProperty(), GetSortDirection());
            var filter        = String.Empty;
            var oldSearchText = SearchText;

            SearchText = MiniMailPrepare();
            filter     = AddFilterCriteria(filter, GetFilterBy());
            filter     = AddFilterCriteria(filter, GetTypeFilter(ClientType));
            filter     = AddFilterCriteria(filter, GetStatusFilter(SearchStatus));
            if (!String.IsNullOrEmpty(filter))
            {
                filter = String.Format(" and ({0}) ", filter);
            }

            var regionMask = administrator.RegionMask;

            if (Region != null)
            {
                regionMask &= Region.Id;
            }

            var sqlStr = String.Format(@"
SELECT
u.Id as UserId,
u.Login as Login,
u.Name as UserName,
u.PayerId as PayerId,
u.Enabled as UserEnabled,
if (max(uui.UpdateDate) >= max(uui.UncommitedUpdateDate), uui.UpdateDate, uui.UncommitedUpdateDate) as UpdateDate,
if (uui.UpdateDate is not null, if (max(uui.UpdateDate) >= max(uui.UncommitedUpdateDate), 0, 1), 0) as UpdateIsUncommited,
max(uui.AFAppVersion) as AFVersion,

if(s.Type = 0, 2, 1) as ClientType,
if(rcs.InvisibleOnFirm = 2, 1, 0) as InvisibleClient,
s.Id as ClientId,
s.Name as ClientName,
s.Disabled as ServiceDisabled,

p.JuridicalName as JuridicalName,
r.Region as RegionName,
r.RegionCode as RegionCode,
u.AllowDownloadUnconfirmedOrders as AllowDownloadUnconfirmedOrders,
u.SubmitOrders as SubmitOrders,
u.IgnoreCheckMinOrder as IgnoreCheckMinOrder
FROM
Customers.Users u
join usersettings.UserUpdateInfo uui ON uui.UserId = u.Id
join Customers.Services s on s.Id = u.RootService
	join farm.Regions r ON r.RegionCode = s.HomeRegion
	left join Customers.Suppliers sup on sup.Id = u.RootService
	left join Customers.Clients ON Clients.Id = u.ClientId
		left join Usersettings.RetClientsSet rcs on rcs.ClientCode = Clients.Id
	left join Customers.UserAddresses ua on ua.UserId = u.Id
	left join Customers.Addresses a on a.Id = ua.AddressId
	left join contacts.contact_groups cg ON cg.ContactGroupOwnerId = ifnull(Clients.ContactGroupOwnerId, sup.ContactGroupOwnerId)
	left join contacts.contact_groups cga ON a.ContactGroupId = cga.Id
	left join contacts.RegionalDeliveryGroups rdg on rdg.ContactGroupId = cg.Id
	left join contacts.RegionalDeliveryGroups rdga on rdga.ContactGroupId = cga.Id
	left join contacts.Contacts ON Contacts.ContactOwnerId = cg.Id and if(rdg.ContactGroupId is not null, (rdg.RegionId & sup.RegionMask > 0), 1)
	left join contacts.Contacts as ContactsAddresses ON ContactsAddresses.ContactOwnerId = cga.Id and if(rdga.ContactGroupId is not null, (rdga.RegionId & sup.RegionMask > 0), 1)
	left join contacts.Persons ON Persons.ContactGroupId = cg.Id and if(rdg.ContactGroupId is not null, (rdg.RegionId & sup.RegionMask > 0), 1)
	left join contacts.Contacts as ContactsPerson on ContactsPerson.ContactOwnerId = Persons.Id
join Billing.Payers p on p.PayerId = u.PayerId
left join contacts.payerownercontacts poc on poc.Payer = p.PayerId
left join contacts.Contacts PayerCont on PayerCont.Id = poc.Contact
WHERE
((Clients.MaskRegion & :RegionMask > 0) or (sup.RegionMask & :RegionMask > 0))
{0}
GROUP BY u.Id
{1}
", filter, orderFilter);

            var result = session.CreateSQLQuery(sqlStr)
                         .SetParameter("RegionMask", regionMask)
                         .ToList <UserSearchItem>();

            ArHelper.Evict(session, result);
            var logins = result.Select(t => t.Login).ToList();

            var adInfo = ADHelper.GetPartialUsersInformation(logins);

            for (var i = 0; i < result.Count; i++)
            {
                if (adInfo == null)
                {
                    continue;
                }
                result[i].DisabledInAd  = adInfo[result[i].Login].DisabledInAd;
                result[i].IsLocked      = adInfo[result[i].Login].IsLocked;
                result[i].IsLoginExists = adInfo[result[i].Login].IsLoginExists;
            }

            var info = new SearchTextInfo(SearchText);

            if (result.Count > 0 && ((info.SearchTextIsPhone && info.SearchText.Length >= 6) || SearchBy == SearchUserBy.ByContacts))
            {
                var findedUsers = result.Select(r => r.UserId).Implode();
                var findInUsers = session.CreateSQLQuery(string.Format(@"
select u.Id 
from Customers.Users u
left join Customers.UserAddresses ua on ua.UserId = u.Id
left join Customers.Addresses a on a.Id = ua.AddressId
left join contacts.contact_groups cg ON u.ContactGroupId = cg.Id
left join contacts.contact_groups cga ON a.ContactGroupId = cga.Id
left join Customers.Suppliers sup on sup.Id = u.RootService
left join Customers.Clients ON Clients.Id = u.ClientId
left join contacts.RegionalDeliveryGroups rdg on rdg.ContactGroupId = cg.Id
left join contacts.RegionalDeliveryGroups rdga on rdga.ContactGroupId = cga.Id
left join contacts.Contacts ON Contacts.ContactOwnerId = cg.Id and if(rdg.ContactGroupId is not null, (rdg.RegionId & sup.RegionMask > 0), 1)
left join contacts.Contacts as ContactAddress ON ContactAddress.ContactOwnerId = cga.Id and if(rdga.ContactGroupId is not null, (rdga.RegionId & sup.RegionMask > 0), 1)
where 
((Clients.MaskRegion & :RegionMask > 0) or (sup.RegionMask & :RegionMask > 0)) and
((REPLACE(Contacts.ContactText, '-', '') like '{0}' and Contacts.Type = 1) or
(REPLACE(ContactAddress.ContactText, '-', '') like '{0}' and ContactAddress.Type = 1))
and
u.Id in ({1})
", info.SqlSearchText.Replace("-", ""), findedUsers))
                                  .SetParameter("RegionMask", regionMask)
                                  .List <uint>();

                if (findInUsers.Count > 0)
                {
                    var bufResult = result.Where(r => findInUsers.Contains(r.UserId)).ToList();
                    result = bufResult;
                }
            }
            SearchText = oldSearchText;
            return(result);
        }