Advertisement
IAfanasov

luxoft

Jul 18th, 2011
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 26.52 KB | None | 0 0
  1. using System;
  2. using System.Web.UI;
  3. using System.Web.UI.WebControls;
  4. using Microsoft.SharePoint;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Collections.Specialized;
  8. using Microsoft.SharePoint.Utilities;
  9. using System.Web.Script.Serialization;
  10. using System.IO;
  11. using System.Text;
  12. using System.Linq.Expressions;
  13. using System.Diagnostics;
  14. using CamlexNET;
  15. using SalesToTableWebPart.RequstsResponses;
  16. using SaleDocsLib;
  17. using Microsoft.Office.Server.Diagnostics;
  18. using System.Threading;
  19. using System.Globalization;
  20. using Microsoft.SharePoint.WebControls;
  21.  
  22. namespace SalesToTableWebPart.ViewWebPart
  23. {
  24.     public partial class ViewWebPartUserControl : UserControl, ICallbackEventHandler
  25.     {
  26.         public string jSON;
  27.         string ICallbackEventHandler.GetCallbackResult()
  28.         {
  29.             return jSON;
  30.         }
  31.         /// <summary>
  32.         /// Используется для записи запроса, вызвавшего ошибку, в логах
  33.         /// </summary>
  34.         static string eventArg;
  35.         void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
  36.         {
  37.             try
  38.             {
  39.                 eventArg = eventArgument;
  40.                 jSON = "";
  41.                 var rows = new List<string>();
  42.                 rows.AddRange(eventArgument.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries));
  43.                 string action = rows[0];
  44.                 rows.RemoveAt(0);
  45.                 switch (action)
  46.                 {
  47.                     case "GetObjects": jSON = GetAdsObjects(rows[0]); break;
  48.  
  49.                     default: jSON = new JSONResponce() { Exception = "Не распознанная команда" }.ToString(); break;
  50.                 }
  51.             }
  52.             catch (Exception exc)
  53.             {
  54.                 jSON = ExceptionMessage(exc, "");
  55.             }
  56.         }
  57.         /// <summary>
  58.         /// По фильтру выбирает объекты рекламы и устанавливает значения для пейджинга
  59.         /// </summary>
  60.         /// <param name="row">json фильтра</param>
  61.         /// <returns></returns>
  62.         public string GetAdsObjects(string row)
  63.         {
  64.             string result = "";
  65.             AdsFilter filter = new JavaScriptSerializer().Deserialize<AdsFilter>(row);
  66.             SPListItemCollection resCol;
  67.             List<AdsObj> resAdsObjs = GetAdsObjectsItems(filter, 8, out resCol).OrderBy(x => x.Art).ToList();
  68.             GetObjectsResponse resp = new GetObjectsResponse
  69.             {
  70.                 Objects = resAdsObjs,
  71.                 StartMonth = filter.From.Month,
  72.                 FinishMonth = filter.To.Month,
  73.                 NextPageInfo = "",
  74.                 PrevPageInfo = ""
  75.             };
  76.             //collect paging info
  77.             if (resAdsObjs.Any())
  78.             {
  79.                 if (filter.CustId == -1)
  80.                 {
  81.                     SPListItemCollection checkPrevNextItems;
  82.                     var prevPageInfo = string.Format("Paged=True&PagedPrev=True&p_ID={0}&p_Title={1}",
  83.                         resAdsObjs[0].ID, Server.UrlEncode(resAdsObjs[0].Art));
  84.                     filter.PageInfo = prevPageInfo;
  85.                     List<AdsObj> checkPrevAdsObjs = GetAdsObjectsItems(filter, 1, out checkPrevNextItems);
  86.                     if (checkPrevAdsObjs != null && checkPrevAdsObjs.Any())
  87.                         if (checkPrevAdsObjs[0].ID != resAdsObjs[0].ID)
  88.                             resp.PrevPageInfo = prevPageInfo;
  89.  
  90.                     AdsObj lastResAdsObj = resAdsObjs[resAdsObjs.Count - 1];
  91.                     var nextPageInfo = string.Format("Paged=True&p_ID={0}&p_Title={1}", lastResAdsObj.ID, Server.UrlEncode(lastResAdsObj.Art));
  92.                     filter.PageInfo = nextPageInfo;
  93.                     List<AdsObj> checkNextAdsObjs = GetAdsObjectsItems(filter, 1, out checkPrevNextItems);
  94.                     if (checkNextAdsObjs != null && checkNextAdsObjs.Any())
  95.                         if (checkNextAdsObjs[0].ID != lastResAdsObj.ID)
  96.                             resp.NextPageInfo = nextPageInfo;
  97.                 }
  98.                 else
  99.                 {
  100.                     if (resCol != null)
  101.                     {
  102.                         SPListItemCollection checkPrevNextItems;
  103.                         if (!string.IsNullOrEmpty(filter.PageInfo))
  104.                         {
  105.                             var id = filter.PageInfo.Split('&').First(x => x.Contains("p_ID")).Split('=')[1];
  106.                             var prevPageInfo = string.Format("Paged=True&PagedPrev=True&p_ID={0}", id);
  107.                             filter.PageInfo = prevPageInfo;
  108.                             List<AdsObj> checkPrevAdsObjs = GetAdsObjectsItems(filter, 1, out checkPrevNextItems);
  109.                             if (checkPrevAdsObjs.Any())
  110.                                 if (checkPrevAdsObjs[0].ID != resAdsObjs[0].ID)
  111.                                     resp.PrevPageInfo = prevPageInfo;
  112.                         }
  113.                         //if (checkPrevNextItems.ListItemCollectionPosition != null)// || tmp.ListItemCollectionPosition != null)
  114.  
  115.                         var nextPageInfo = string.Format("Paged=True&p_ID={0}", resCol[resCol.Count - 1].ID);
  116.                         filter.PageInfo = nextPageInfo;
  117.                         List<AdsObj> checkNextAdsObjs = GetAdsObjectsItems(filter, 1, out checkPrevNextItems);
  118.                         if (checkNextAdsObjs.Any())
  119.                             //if (checkNextAdsObjs[0].ID != resAdsObjs[resAdsObjs.Count - 1].ID)
  120.                             resp.NextPageInfo = nextPageInfo;
  121.                     }
  122.                 }
  123.             }
  124.             result = new JavaScriptSerializer().Serialize(resp);
  125.             return result;
  126.         }
  127.         /// <summary>
  128.         /// Выбирает нужное число объектов рекламы. Первым запросом выбирается указанное в параметре count кол-во элементов, после чего они фильтруются по проданности и метод вызывается рекурсивно с изменённым параметром count до выбора нужного кол-ва обхектов или пока не проверит все элементы списка
  129.         /// </summary>
  130.         /// <param name="filter"></param>
  131.         /// <param name="count"></param>
  132.         /// <param name="mainCol"></param>
  133.         /// <returns></returns>
  134.         public List<AdsObj> GetAdsObjectsItems(AdsFilter filter, int count, out SPListItemCollection mainCol)
  135.         {
  136.             List<AdsObj> resAdsObjs;
  137.             mainCol = null;
  138.             if (filter.CustId == -1)
  139.                 resAdsObjs = GetAdsObjs(filter, count, out mainCol);
  140.             else
  141.             {
  142.                 //Берем все сделки покупателя
  143.                 List<SPListItem> deals = GetDealsItems(filter.CustId, filter.AllowedStates);
  144.                 if (deals.Count == 0) return new List<AdsObj>();
  145.                 //Берем все позиции покупателя
  146.                 SPListItemCollection details = GetDetails(filter.From, filter.To, deals);
  147.                 if (details.Count == 0) return new List<AdsObj>();
  148.  
  149.                 var adsObjExpr = new List<Expression<Func<SPListItem, bool>>>(details.Count);
  150.                 foreach (SPListItem detailItem in details)
  151.                 //Если сделка бронь, то проверяем не истекла ли она
  152.                 {
  153.                     bool isReserve = (bool)deals.First(x => x.ID == new SPFieldLookupValue((string)detailItem[C.DetailsF.Order]).LookupId)
  154.                         [C.DealsF.IsReserve];
  155.                     if (!isReserve || isReserve && (DateTime)detailItem[C.DetailsF.ResPerDate] >= DateTime.Today)
  156.                     {
  157.                         var adsObjId = new SPFieldLookupValue((string)detailItem[C.DetailsF.Art]).LookupId;
  158.                         adsObjExpr.Add(x => (int)x["ID"] == adsObjId);
  159.                     }
  160.                 }
  161.                 if (adsObjExpr.Count == 0) return new List<AdsObj>();
  162.                 //Берем все объекты
  163.                 SPQuery adsObjQuery = new SPQuery();
  164.                 if (!string.IsNullOrEmpty(filter.AdsObjName))
  165.                 {
  166.                     adsObjExpr = new List<Expression<Func<SPListItem, bool>>>
  167.                                      {
  168.                                          CamlexNET.Impl.Helpers.ExpressionsHelper.CombineOr(adsObjExpr),
  169.                                          x=>((string)x[SPBuiltInFieldId.Title]).Contains(filter.AdsObjName)
  170.                                      };
  171.                     adsObjQuery.Query = Camlex.Query().WhereAll(adsObjExpr).ToString();
  172.                 }
  173.                 else
  174.                     adsObjQuery.Query = Camlex.Query().WhereAny(adsObjExpr).ToString();
  175.  
  176.                 var adsObjItems = GetList(C.L.AdsObjListName).GetItems(adsObjQuery);
  177.                 if (adsObjItems.Count == 0) return new List<AdsObj>();
  178.  
  179.                 CurObjectDetails = details.Cast<SPListItem>().ToList();
  180.                 resAdsObjs =
  181.                         (from SPListItem curItem in adsObjItems
  182.                          select new AdsObj(curItem, filter.From, filter.To)).ToList();
  183.             }
  184.             return resAdsObjs;
  185.         }
  186.  
  187.         private List<AdsObj> GetAdsObjs(AdsFilter filter, int count, out SPListItemCollection col)
  188.         {
  189.             List<AdsObj> resAdsObjs = null;
  190.             col = GetAdsObjectsItems(filter.Types, filter.PageInfo, filter.OwnerId, filter.AdsObjName, count);
  191.             if (col.Count > 0)
  192.             {
  193.                 CurObjectDetails = PrepareCurObjectDetails(col, filter.IsSale);
  194.  
  195.                 resAdsObjs = (from SPListItem curItem in col select new AdsObj(curItem, filter.From, filter.To)).ToList();
  196.             }
  197.             if (resAdsObjs != null && resAdsObjs.Count < count && col.ListItemCollectionPosition != null)
  198.             {
  199.                 filter.PageInfo = !string.IsNullOrEmpty(filter.PageInfo) && filter.PageInfo.Contains("PagedPrev=")
  200.                                       ? string.Format("Paged=True&PagedPrev=True&p_ID={0}&p_Title={1}",
  201.                                                       col[0].ID,
  202.                                                       col[0].Title.Replace(" ", "%20").Replace("_", "%5f"))
  203.                                       : col.ListItemCollectionPosition.PagingInfo;
  204.                 resAdsObjs =
  205.                     resAdsObjs.Concat(GetAdsObjectsItems(filter, count - resAdsObjs.Count, out col)).ToList();
  206.             }
  207.             return resAdsObjs;
  208.         }
  209.         /// <summary>
  210.         /// Выбирает все позиции указанных сделок с фильтром по датам
  211.         /// </summary>
  212.         /// <param name="from"></param>
  213.         /// <param name="to"></param>
  214.         /// <param name="deals"></param>
  215.         /// <returns></returns>
  216.         private SPListItemCollection GetDetails(DateTime from, DateTime to, List<SPListItem> deals)
  217.         {
  218.             SPList detailList = GetList(C.L.DetailsListName);
  219.             var detailExpr = new List<Expression<Func<SPListItem, bool>>>();
  220.             foreach (SPListItem dealItem in deals)
  221.                 if (dealItem.ModerationInformation.Status == SPModerationStatusType.Approved)
  222.                 {
  223.                     int dealId = dealItem.ID;
  224.                     detailExpr.Add(x => x[detailList.Fields[C.DetailsF.Order].Id] == (DataTypes.LookupId)dealId.ToString());
  225.                 }
  226.  
  227.             detailExpr = new List<Expression<Func<SPListItem, bool>>>
  228.                              {
  229.                                  FromToDatesExpr(detailList.Fields[C.DetailsF.DateFrom].Id, detailList.Fields[C.DetailsF.To].Id, from, to),
  230.                                  CamlexNET.Impl.Helpers.ExpressionsHelper.CombineOr(detailExpr)
  231.                              };
  232.  
  233.             var detailsQuery = new SPQuery
  234.                                    {
  235.                                        Query = Camlex.Query().WhereAll(detailExpr).ToString(),
  236.                                        ViewFields = CAML.ViewFields(new[]
  237.                                                                         {
  238.                                                                             detailList.Fields[C.DetailsF.Art].Id,
  239.                                                                             detailList.Fields[C.DetailsF.Order].Id,
  240.                                                                             detailList.Fields[C.DetailsF.DateFrom].Id,
  241.                                                                             detailList.Fields[C.DetailsF.DateTo].Id
  242.                                                                         })
  243.                                    };
  244.             return detailList.GetItems(detailsQuery);
  245.         }
  246.         /// <summary>
  247.         /// Выбирает объекты рекламы, фильтруя по вводимым параметрам
  248.         /// </summary>
  249.         /// <param name="typesFilter"></param>
  250.         /// <param name="pageInfo"></param>
  251.         /// <param name="ownerId"></param>
  252.         /// <param name="adsObjName"></param>
  253.         /// <param name="count"></param>
  254.         /// <returns></returns>
  255.         private SPListItemCollection GetAdsObjectsItems(string[] typesFilter, string pageInfo, int ownerId, string adsObjName, int count)
  256.         {
  257.             SPList adsObjList = GetList(C.L.AdsObjListName);
  258.  
  259.             var allExpr = new List<Expression<Func<SPListItem, bool>>>(2);
  260.             if (typesFilter.Length != 4)
  261.             {
  262.                 var typesExpr = new List<Expression<Func<SPListItem, bool>>>(3);
  263.                 for (int i = 0; i < typesFilter.Length; i++)
  264.                 {
  265.                     var ind = i;
  266.                     typesExpr.Add(x => (string)x[adsObjList.Fields[C.AdsObjsF.Type].Id] == typesFilter[ind]);
  267.                 }
  268.                 var exprTypesFilter = CamlexNET.Impl.Helpers.ExpressionsHelper.CombineOr(typesExpr);
  269.                 allExpr.Add(exprTypesFilter);
  270.             }
  271.             if (ownerId != -1)
  272.                 allExpr.Add(x => x[adsObjList.Fields[C.AdsObjsF.Owner].Id] == (DataTypes.LookupId)ownerId.ToString());
  273.             if (!string.IsNullOrEmpty(adsObjName))
  274.                 allExpr.Add(x => ((string)x[SPBuiltInFieldId.Title]).Contains(adsObjName));
  275.             var camlexQuery = allExpr.Any() ? Camlex.Query().WhereAll(allExpr) : Camlex.Query();
  276.  
  277.             SPQuery query = new SPQuery
  278.                                 {
  279.                                     Query = camlexQuery.OrderBy(z => z[SPBuiltInFieldId.Title]).ToString(),
  280.                                     ViewFields = CAML.ViewFields(new[] { "Title", C.AdsObjsF.Mount, C.AdsObjsF.Address, C.AdsObjsF.Cost, C.AdsObjsF.Type }, adsObjList)
  281.                                 };
  282.             if (!string.IsNullOrEmpty((pageInfo)))
  283.                 query.ListItemCollectionPosition = new SPListItemCollectionPosition(pageInfo);
  284.             query.RowLimit = (uint)count;
  285.             var result = adsObjList.GetItems(query);
  286.             return result;
  287.         }
  288.         /// <summary>
  289.         /// Возвращает Expression с пересекающимися датами
  290.         /// </summary>
  291.         /// <param name="fromGuid">id поля начала периода элемента</param>
  292.         /// <param name="toGuid">id поля конца периода элемента</param>
  293.         /// <param name="fromDate">дата начала фильтрующего периода</param>
  294.         /// <param name="toDate">дата конца фильтрующего периода</param>
  295.         /// <returns>Expression с пересекающимися датами</returns>
  296.         public static Expression<Func<SPListItem, bool>> FromToDatesExpr(Guid fromGuid, Guid toGuid, DateTime fromDate, DateTime toDate)
  297.         {
  298.             var allExpr = new List<Expression<Func<SPListItem, bool>>>(4){
  299.             x => (DateTime)x[fromGuid] <= fromDate && (DateTime)x[toGuid] >= fromDate,
  300.             x => (DateTime)x[fromGuid] <= toDate && (DateTime)x[toGuid] >= toDate,
  301.             x => (DateTime)x[fromGuid] >= fromDate && (DateTime)x[fromGuid] <= toDate,
  302.             x => ((DateTime)x[toGuid] >= fromDate && (DateTime)x[toGuid] <= toDate)
  303.             };
  304.             var result = CamlexNET.Impl.Helpers.ExpressionsHelper.CombineOr(allExpr);
  305.             return result;
  306.         }
  307.         /// <summary>
  308.         /// Возвращает все детали продаж объекта,
  309.         /// </summary>
  310.         /// <param name="artItems">Коллекция объектов, позиуии которых выбираются</param>
  311.         /// <param name="isSale">Определяет брать позиции закупок у собственников или продаж конечным клиентам</param>
  312.         /// <returns></returns>
  313.         private static List<SPListItem> PrepareCurObjectDetails(SPListItemCollection artItems, bool isSale)
  314.         {
  315.             var detailsList = GetList(C.L.DetailsListName);
  316.             var dealsList = GetList(C.L.DealsListName);
  317.  
  318.             var detailsExpr = new List<Expression<Func<SPListItem, bool>>>();
  319.             for (int i = 0; i < artItems.Count; i++)
  320.             {
  321.                 var ind = i;
  322.                 detailsExpr.Add(x => x[detailsList.Fields[C.L.Art].Id] == (DataTypes.LookupId)artItems[ind].ID.ToString());
  323.             }
  324.  
  325.             SPQuery query = new SPQuery
  326.             {
  327.                 ViewFields = CAML.ViewFields(new[] {C.DetailsF.DateFrom, C.DetailsF.DateTo, C.DetailsF.Art, C.DetailsF.Order,
  328.                 C.DetailsF.ResPerDate,C.DetailsF.CostOfSale,C.DetailsF.CostOfPeriod,C.DetailsF.PriceCost,C.DetailsF.ResDate}, detailsList),
  329.                 Query = Camlex.Query().WhereAny(detailsExpr).ToString()
  330.             };
  331.             var detailsItems = detailsList.GetItems(query).Cast<SPListItem>().Where(x => x[C.DetailsF.Order] != null).ToList();
  332.  
  333.             //сгенерить запрос для взять все сделки, содержащие эти позиции и с фильтром по продажа/закупка
  334.             var dealsExpr = new List<Expression<Func<SPListItem, bool>>>();
  335.             foreach (var dealID in (from item in detailsItems select new SPFieldLookupValue((string)item[C.DetailsF.Order]).LookupId).Distinct())
  336.             {
  337.                 int dealId = dealID;
  338.                 dealsExpr.Add(x => (int)x["ID"] == dealId);
  339.             }
  340.             var custTypeFieldId = dealsList.Fields[C.DealsF.CustType].Id;
  341.             dealsExpr = new List<Expression<Func<SPListItem, bool>>>(2)
  342.                           {
  343.                               CamlexNET.Impl.Helpers.ExpressionsHelper.CombineOr(dealsExpr),
  344.                               isSale?
  345.                               (Expression<Func<SPListItem, bool>>)(x=>x[custTypeFieldId] !=(DataTypes.LookupValue)C.CustomerF.TypeRetailer):
  346.                               (Expression<Func<SPListItem, bool>>)(x=>x[custTypeFieldId] == (DataTypes.LookupValue)C.CustomerF.TypeRetailer)
  347.                           };
  348.             SPQuery dealQuery = new SPQuery
  349.             {
  350.                 Query = Camlex.Query().WhereAll(dealsExpr).ToString(),
  351.                 ViewFields = C.DetailsF.Order
  352.             };
  353.             SPListItemCollection dealsItems = dealsList.GetItems(dealQuery);
  354.             var dealIds = (from item in dealsItems.Cast<SPListItem>() select item.ID).ToList();
  355.             //Оставить только позиции, пренадлежащие оным сделкам.)
  356.             detailsItems = detailsItems.Where(x => dealIds.Contains(new SPFieldLookupValue((string)x[C.DetailsF.Order]).LookupId)).ToList();
  357.  
  358.             return detailsItems.ToList();
  359.         }
  360.     }
  361.     public class GetObjectsResponse
  362.     {
  363.         public int StartMonth { get; set; }
  364.         public int FinishMonth { get; set; }
  365.         public IEnumerable<AdsObj> Objects = new List<AdsObj>();
  366.         public string PrevPageInfo { get; set; }
  367.         public string NextPageInfo { get; set; }
  368.     }
  369.     public enum AdsStates
  370.     {
  371.         All = -1,
  372.         Free = 0,
  373.         Reserved = 2,
  374.         Saled = 1
  375.     }
  376.     public class AdsFilter
  377.     {
  378.         public DateTime From { get; set; }
  379.         public DateTime To { get; set; }
  380.         public List<AdsStates> AllowedStates { get; set; }
  381.         public string[] Types { get; set; }
  382.         public int CustId { get; set; }
  383.         public int OwnerId { get; set; }
  384.         public string PageInfo { get; set; }
  385.         public string DetailsPageInfo { get; set; }
  386.         public bool IsSale { get; set; }
  387.         public string AdsObjName { get; set; }
  388.     }
  389.     public class JSONResponce
  390.     {
  391.         public string Alert { get; set; }
  392.         public string Noti { get; set; }
  393.         public string Action { get; set; }
  394.         public string Link { get; set; }
  395.         public string Exception { get; set; }
  396.         public string DealDetailsJson { get; set; }
  397.         public bool IsApprover { get; set; }
  398.         public int SellId { get; set; }
  399.         public override string ToString()
  400.         {
  401.             return new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(this);
  402.         }
  403.         public string Json()
  404.         {
  405.             return ToString();
  406.         }
  407.     }
  408.     /// <summary>
  409.     /// Constants
  410.     /// </summary>
  411.     public class C
  412.     {
  413.         /// <summary>
  414.         /// Lists
  415.         /// </summary>
  416.         public class L
  417.         {
  418.             /// <summary>
  419.             /// Продажи объектов
  420.             /// </summary>
  421.             public const string DealsListName = "Продажи объектов";
  422.             /// <summary>
  423.             /// Названия листа деталей продаж объектов
  424.             /// </summary>
  425.             public const string DetailsListName = "Детали продаж объектов";
  426.             public const string AdsObjListName = "Объекты рекламы";
  427.             public const string MountsListName = "Монтаж объектов";
  428.             public const string SalersListName = "Юрлица Топмедиа";
  429.             public const string UridFaceListName = "Юрлица Топмедиа";
  430.             public const string CustomersListName = "Покупатели";
  431.             public const string CapsListName = "Заглушки";
  432.             //public const string OwnersListName = "Собственники объектов рекламы";
  433.         }
  434.         public static class DealsF
  435.         {
  436.             public const string SalerIsOutdoorOwner = "Продавец:Собственник наружки";
  437.             public const string Saler = "Продавец";
  438.             public const string CustType = "Покупатель:Тип покупателя";
  439.             public const string Customer = "Покупатель";
  440.             public const string KomPred = "Коммерческое предложение";
  441.             public const string IsReserve = "Бронь";
  442.             public const string Realization = "Реализация";
  443.             public const string DealType = "Тип сделки";
  444.             public const string IsTrash = "В корзине";
  445.             public const string Discount = "Скидка";
  446.         }
  447.         public static class DetailsF
  448.         {
  449.             public const string Art = "Артикул";
  450.             /// <summary>
  451.             /// Дата
  452.             /// </summary>
  453.             public const string DateFrom = "Дата";
  454.             /// <summary>
  455.             /// Срок
  456.             /// </summary>
  457.             public const string DateTo = "Срок";
  458.             public const string Order = "Заказ";
  459.             /// <summary>
  460.             /// Бронь до
  461.             /// </summary>
  462.             public const string ResPerDate = "Бронь до";
  463.             public const string CostOfSale = "Цена";
  464.             public const string CostOfPeriod = "Цена за период";
  465.             public const string PriceCost = "По прайсу";
  466.             /// <summary>
  467.             /// Дата, когда бронь была поставленна
  468.             /// </summary>
  469.             public const string ResDate = "Бронированно";
  470.         }
  471.         public static class SalersF
  472.         {
  473.             public const string OutdoorOwner = "Собственник наружки";
  474.         }
  475.         public static class CustomerF
  476.         {
  477.             public const string Type = "Тип покупателя";
  478.             public const string TypeRetailer = "Закупщик";
  479.             public const string TypeWhole = "Оптовик";
  480.             public const string TypeSimple = "Розница";
  481.             public const string UrLico = "Юр лицо топмедиа";
  482.         }
  483.         public static class AdsObjsF
  484.         {
  485.             public const string MountSelfPrice = "Себестоимость монтажа";
  486.             public const string Mount = "Монтаж";
  487.             public const string Owner = "Собственник объекта";
  488.             public const string Type = "Тип объекта";
  489.             public const string TypePeretyag = "перетяжка";
  490.             public const string TypeSheet = "щит 3х6";
  491.             public const string TypeBrand = "брандмауэр";
  492.             public const string TypeSuper = "суперсайт";
  493.             public const string Cost = "Цена";
  494.             public const string SelfPrice = "Себестоимость";
  495.             public const string Address = "Адрес размещения";
  496.         }
  497.         public static class MountF
  498.         {
  499.             public const string Position = "Позиция";
  500.             public const string Detail = Position;
  501.             public const string Cost = "Цена";
  502.             public const string Date = "Дата монтажа";
  503.         }
  504.  
  505.         public static string FromMailAdress = "Outdoor <sharepoint@upsales.ru>";
  506.         public const string WithOutApprove = "Отдел наружной рекламы. Без соглосования";
  507.         /// <summary>
  508.         /// Название группы, которой можно утверждать заказы
  509.         /// </summary>
  510.         public const string TopManGroupName = "Руководство отдела наружной рекламы";
  511.     }
  512. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement