1: using Ia.Ngn.Cl.Model.Business;
2: using Microsoft.EntityFrameworkCore;
3: using System;
4: using System.Collections;
5: using System.Collections.Generic;
6: using System.Data;
7: using System.Linq;
8: using static Ia.Cl.Model.Db.Temp;
9:
10: namespace Ia.Ngn.Cl.Model.Data
11: {
12: ////////////////////////////////////////////////////////////////////////////
13:
14: /// <summary publish="true">
15: /// Provision support class for Optical Fiber Network (OFN) data model.
16: /// </summary>
17: ///
18: /// <remarks>
19: /// Copyright © 2006-2021 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
20: ///
21: /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
22: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
23: ///
24: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
25: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
26: ///
27: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
28: ///
29: /// Copyright notice: This notice may not be removed or altered from any source distribution.
30: /// </remarks>
31: public class Provision
32: {
33: private static int nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordListIndex, nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordListIndex, allPossibleNddOntNotInAgcfGatewayRecordListIndex, allPossibleAgcfGatewayRecordFromWithinOltListIndex, agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointListIndex, allPossibleAgcfGatewayRecordNoInOntListIndex;
34: private static List<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> allPossibleNddOntNotInAgcfGatewayRecordList, nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordList, nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordList;
35: private static List<Ia.Ngn.Cl.Model.Nokia.AgcfGatewayRecord> allPossibleAgcfGatewayRecordFromWithinOltList, agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointList, allPossibleAgcfGatewayRecordNoInOntList;
36: private static List<string> provisionedImsServiceWithNullAccessNotInPstnNorInNceOntSipInfoNorVoipPstnUserNorMsanWithinMsanDomainListList;
37:
38: private static readonly object objectLock = new object();
39:
40: ////////////////////////////////////////////////////////////////////////////
41:
42: /// <summary>
43: ///
44: /// </summary>
45: public Provision() { }
46:
47: ////////////////////////////////////////////////////////////////////////////
48:
49: /// <summary>
50: ///
51: /// </summary>
52: public static Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont NddNokiaSwitchOntInNonSipOltWithAccessButNoAgcfGatewayRecord(out string result)
53: {
54: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont;
55:
56: if (nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordList == null || nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordListIndex == 0)
57: {
58: nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordList = Ia.Ngn.Cl.Model.Data.Nokia.Ims.NddNokiaSwitchOntInNonSipOltWithAccessButNoAgcfGatewayRecordList();//.Where(u=>u.Access.Name.Contains("SLA")).ToList();
59:
60: nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordListIndex = 0;
61: }
62:
63: if (nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordList.Count > 0)
64: {
65: ont = (Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont)nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordList[nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordListIndex];
66:
67: nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordListIndex = Ia.Cl.Model.Default.IncrementListIndexOrRestart(nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordList, nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordListIndex);
68: }
69: else ont = null;
70:
71: result = "(" + nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordListIndex + "/" + nddNokiaOntInNonSipOltWithAccessButNoAgcfGatewayRecordList.Count + ") ";
72:
73: return ont;
74: }
75:
76: ////////////////////////////////////////////////////////////////////////////
77:
78: /// <summary>
79: ///
80: /// </summary>
81: public static Ia.Ngn.Cl.Model.Nokia.AgcfGatewayRecord AgcfGatewayRecordWithNoNddNokiaSwitchOntInNonSipOltAndNullOrEmptyAgcfEndpoint(out string result)
82: {
83: Ia.Ngn.Cl.Model.Nokia.AgcfGatewayRecord agcfGatewayRecord;
84:
85: if (agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointList == null || agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointListIndex == 0)
86: {
87: agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointList = Ia.Ngn.Cl.Model.Data.Nokia.Ims.AgcfGatewayRecordWithNoNddNokiaSwitchOntInNonSipOltAndNullOrEmptyAgcfEndpointList();
88:
89: agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointListIndex = 0;
90: }
91:
92: if (agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointList.Count > 0)
93: {
94: agcfGatewayRecord = (Ia.Ngn.Cl.Model.Nokia.AgcfGatewayRecord)agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointList[agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointListIndex];
95:
96: agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointListIndex = Ia.Cl.Model.Default.IncrementListIndexOrRestart(agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointList, agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointListIndex);
97: }
98: else agcfGatewayRecord = null;
99:
100: result = "(" + agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointListIndex + "/" + agcfGatewayRecordWithNoNddOntAndNullOrEmptyAgcfEndpointList.Count + ") ";
101:
102: return agcfGatewayRecord;
103: }
104:
105: ////////////////////////////////////////////////////////////////////////////
106:
107: /// <summary>
108: ///
109: /// </summary>
110: public static Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont NddOntNotInAgcfGatewayRecordList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt, out string result)
111: {
112: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont;
113:
114: if (allPossibleNddOntNotInAgcfGatewayRecordList == null || allPossibleNddOntNotInAgcfGatewayRecordListIndex == 0)
115: {
116: allPossibleNddOntNotInAgcfGatewayRecordList = Ia.Ngn.Cl.Model.Data.Nokia.Ims.NddOntNotInAgcfGatewayRecordList(olt);
117:
118: allPossibleNddOntNotInAgcfGatewayRecordListIndex = 0;
119: }
120:
121: if (allPossibleNddOntNotInAgcfGatewayRecordList.Count > 0)
122: {
123: ont = (Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont)allPossibleNddOntNotInAgcfGatewayRecordList[allPossibleNddOntNotInAgcfGatewayRecordListIndex];
124:
125: allPossibleNddOntNotInAgcfGatewayRecordListIndex = Ia.Cl.Model.Default.IncrementListIndexOrRestart(allPossibleNddOntNotInAgcfGatewayRecordList, allPossibleNddOntNotInAgcfGatewayRecordListIndex);
126: }
127: else ont = null;
128:
129: result = "(" + allPossibleNddOntNotInAgcfGatewayRecordListIndex + "/" + allPossibleNddOntNotInAgcfGatewayRecordList.Count + ") ";
130:
131: return ont;
132: }
133:
134: ////////////////////////////////////////////////////////////////////////////
135:
136: /// <summary>
137: ///
138: /// </summary>
139: public static Ia.Ngn.Cl.Model.Nokia.AgcfGatewayRecord AgcfGatewayRecordFromWithinOltList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt, out string result)
140: {
141: Ia.Ngn.Cl.Model.Nokia.AgcfGatewayRecord agcfGatewayRecord;
142:
143: if (allPossibleAgcfGatewayRecordFromWithinOltList == null || allPossibleAgcfGatewayRecordFromWithinOltListIndex == 0)
144: {
145: allPossibleAgcfGatewayRecordFromWithinOltList = Ia.Ngn.Cl.Model.Data.Nokia.AgcfGatewayRecord.List(olt);
146:
147: allPossibleAgcfGatewayRecordFromWithinOltListIndex = 0;
148: }
149:
150: if (allPossibleAgcfGatewayRecordFromWithinOltList.Count > 0)
151: {
152: agcfGatewayRecord = (Ia.Ngn.Cl.Model.Nokia.AgcfGatewayRecord)allPossibleAgcfGatewayRecordFromWithinOltList[allPossibleAgcfGatewayRecordFromWithinOltListIndex];
153:
154: allPossibleAgcfGatewayRecordFromWithinOltListIndex = Ia.Cl.Model.Default.IncrementListIndexOrRestart(allPossibleAgcfGatewayRecordFromWithinOltList, allPossibleAgcfGatewayRecordFromWithinOltListIndex);
155: }
156: else agcfGatewayRecord = null;
157:
158: result = "(" + allPossibleAgcfGatewayRecordFromWithinOltListIndex + "/" + allPossibleAgcfGatewayRecordFromWithinOltList.Count + ") ";
159:
160: return agcfGatewayRecord;
161: }
162:
163: ////////////////////////////////////////////////////////////////////////////
164:
165: /// <summary>
166: ///
167: /// </summary>
168: public static Ia.Ngn.Cl.Model.Nokia.AgcfGatewayRecord AgcfGatewayRecordNoInOntList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
169: {
170: Ia.Ngn.Cl.Model.Nokia.AgcfGatewayRecord agcfGatewayRecord;
171:
172: if (allPossibleAgcfGatewayRecordNoInOntList == null || allPossibleAgcfGatewayRecordNoInOntListIndex == 0)
173: {
174: allPossibleAgcfGatewayRecordNoInOntList = Ia.Ngn.Cl.Model.Data.Nokia.Ims.AllPossibleAgcfGatewayRecordsNoInOntsList(olt);
175:
176: allPossibleAgcfGatewayRecordNoInOntListIndex = 0;
177: }
178:
179: agcfGatewayRecord = (Ia.Ngn.Cl.Model.Nokia.AgcfGatewayRecord)allPossibleAgcfGatewayRecordNoInOntList[allPossibleAgcfGatewayRecordNoInOntListIndex];
180:
181: allPossibleAgcfGatewayRecordNoInOntListIndex = Ia.Cl.Model.Default.IncrementListIndexOrRestart(allPossibleAgcfGatewayRecordNoInOntList, allPossibleAgcfGatewayRecordNoInOntListIndex);
182:
183: return agcfGatewayRecord;
184: }
185:
186: ////////////////////////////////////////////////////////////////////////////
187: ////////////////////////////////////////////////////////////////////////////
188:
189: /// <summary>
190: ///
191: /// </summary>
192: public static Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont NddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecord(out string result)
193: {
194: Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont;
195:
196: if (nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordList == null || nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordListIndex == 0)
197: {
198: nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordList = Ia.Ngn.Cl.Model.Data.Huawei.Ims.NddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecord();//.Where(u=>u.Access.Name.Contains("SLA")).ToList();
199:
200: nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordListIndex = 0;
201: }
202:
203: if (nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordList.Count > 0)
204: {
205: ont = (Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont)nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordList[nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordListIndex];
206:
207: nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordListIndex = Ia.Cl.Model.Default.IncrementListIndexOrRestart(nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordList, nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordListIndex);
208: }
209: else ont = null;
210:
211: result = "(" + nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordListIndex + "/" + nddHuaweiSwitchAndNokiaAccessOntWithAccessButNoMgwRecordList.Count + ") ";
212:
213: return ont;
214: }
215:
216: /*
217: ////////////////////////////////////////////////////////////////////////////
218:
219: /// <summary>
220: ///
221: /// </summary>
222: public static bool UpdateServiceRequestServiceServiceSuspensionWithNonNullAccess(out string result)
223: {
224: bool toTrue, toFalse;
225: StringBuilder sb;
226: List<string> srsCurrentList, toTrueList, toFalseList;
227:
228: toTrue = toFalse = false;
229:
230: srsCurrentList = Ia.Ngn.Cl.Model.Data.ServiceRequestService.ServiceSuspensionIsTrueStringNumberList;
231:
232: toTrueList = new List<string>(srsCurrentList.Count);
233: toFalseList = new List<string>(srsCurrentList.Count);
234:
235: sb = new StringBuilder(12 * (srsCurrentList.Count));
236:
237: // below: numbers that should be added to SRS barring
238: sb.Append("\r\nNumber(s) to be set in SRS as barred: ");
239:
240: toTrue = Ia.Ngn.Cl.Model.Data.ServiceRequestService.UpdateServiceSuspensionAndServiceSuspensionTypeIdToSpecifiedSuspensionStateForAServiceStringList(toTrueList, true, Guid.Empty);
241: sb.Append("\r\nNumber(s) set?: " + toTrue.ToString());
242:
243: // below: numbres that should be removed from SRS barring
244: sb.Append("\r\nNumber(s) to be reset in SRS as not barred: ");
245:
246: toFalse = Ia.Ngn.Cl.Model.Data.ServiceRequestService.UpdateServiceSuspensionAndServiceSuspensionTypeIdToSpecifiedSuspensionStateForAServiceStringList(toFalseList, false, Guid.Empty);
247: sb.Append("\r\nNumber(s) reset?: " + toTrue.ToString());
248:
249: result = sb.ToString();
250:
251: return toTrue || toFalse;
252: }
253: */
254:
255: ////////////////////////////////////////////////////////////////////////////
256:
257: /// <summary>
258: ///
259: /// </summary>
260: private static List<Ia.Ngn.Cl.Model.ServiceRequestService> ServiceRequestServiceWithAccessesWithNullAgcfEndpointList
261: {
262: get
263: {
264: List<Ia.Ngn.Cl.Model.ServiceRequestService> serviceRequestServiceList;
265:
266: using (var db = new Ia.Ngn.Cl.Model.Ngn())
267: {
268: serviceRequestServiceList = (from srs in db.ServiceRequestServices
269: join e in db.AgcfEndpoints on Ia.Ngn.Cl.Model.Business.NumberFormatConverter.PrividUser(srs.Service) equals e.PrividUser
270: into gj
271: from u in gj.DefaultIfEmpty()
272: where u == null && srs.Access != null
273: select srs).Include(u => u.Access).ToList();
274: }
275:
276: return serviceRequestServiceList;
277: }
278: }
279:
280: ////////////////////////////////////////////////////////////////////////////
281:
282: /// <summary>
283: ///
284: /// </summary>
285: public static List<string> ImsServiceMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList()
286: {
287: return ServiceMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService, out List<string> serviceToSuspendList, out List<string> serviceToReleaseList, out List<string> serviceInternationalCallingToSuspendList, out List<string> serviceInternationalCallingToReleaseList);
288: }
289:
290: ////////////////////////////////////////////////////////////////////////////
291:
292: /// <summary>
293: ///
294: /// </summary>
295: public static List<string> PstnServiceSuspensionMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList()
296: {
297: return ServiceMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(Ia.Ngn.Cl.Model.Business.Service.ServiceType.PstnService, out List<string> serviceToSuspendList, out List<string> serviceToReleaseList, out List<string> serviceInternationalCallingToSuspendList, out List<string> serviceInternationalCallingToReleaseList);
298: }
299:
300: ////////////////////////////////////////////////////////////////////////////
301:
302: /// <summary>
303: ///
304: /// </summary>
305: public static void EricssonAxePstnServiceSuspensionMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(out List<string> serviceToSuspendList, out List<string> serviceToReleaseList, out List<string> serviceInternationalCallingToSuspendList, out List<string> serviceInternationalCallingToReleaseList)
306: {
307: PstnServiceSuspensionMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.PstnExchangeType.EricssonAxe, out serviceToSuspendList, out serviceToReleaseList, out serviceInternationalCallingToSuspendList, out serviceInternationalCallingToReleaseList);
308: }
309:
310: ////////////////////////////////////////////////////////////////////////////
311:
312: /// <summary>
313: ///
314: /// </summary>
315: public static void SiemensEwsdPstnServiceSuspensionMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(out List<string> serviceToSuspendList, out List<string> serviceToReleaseList, out List<string> serviceInternationalCallingToSuspendList, out List<string> serviceInternationalCallingToReleaseList)
316: {
317: PstnServiceSuspensionMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.PstnExchangeType.SiemensEwsd, out serviceToSuspendList, out serviceToReleaseList, out serviceInternationalCallingToSuspendList, out serviceInternationalCallingToReleaseList);
318: }
319:
320: ////////////////////////////////////////////////////////////////////////////
321:
322: /// <summary>
323: ///
324: /// </summary>
325: public static void PstnServiceSuspensionMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.PstnExchangeType pstnExchangeType, out List<string> serviceToSuspendList, out List<string> serviceToReleaseList, out List<string> serviceInternationalCallingToSuspendList, out List<string> serviceInternationalCallingToReleaseList)
326: {
327: ServiceMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(Ia.Ngn.Cl.Model.Business.Service.ServiceType.PstnService, out List<string> serviceToSuspend0List, out List<string> serviceToRelease0List, out List<string> serviceInternationalCallingToSuspend0List, out List<string> serviceInternationalCallingToRelease0List);
328:
329: serviceToSuspendList = new List<string>();
330: serviceToReleaseList = new List<string>();
331:
332: serviceInternationalCallingToSuspendList = new List<string>();
333: serviceInternationalCallingToReleaseList = new List<string>();
334:
335: if (pstnExchangeType == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.PstnExchangeType.EricssonAxe)
336: {
337: foreach (var s in serviceToSuspend0List)
338: {
339: if (Ia.Ngn.Cl.Model.Business.Service.NumberIsWithinAllowedEricssonAxeSwitchDomainList(s))
340: {
341: serviceToSuspendList.Add(s);
342: }
343: }
344:
345: foreach (var s in serviceToRelease0List)
346: {
347: if (Ia.Ngn.Cl.Model.Business.Service.NumberIsWithinAllowedEricssonAxeSwitchDomainList(s))
348: {
349: serviceToReleaseList.Add(s);
350: }
351: }
352:
353: foreach (var s in serviceInternationalCallingToSuspend0List)
354: {
355: if (Ia.Ngn.Cl.Model.Business.Service.NumberIsWithinAllowedEricssonAxeSwitchDomainList(s))
356: {
357: serviceInternationalCallingToSuspendList.Add(s);
358: }
359: }
360:
361: foreach (var s in serviceInternationalCallingToRelease0List)
362: {
363: if (Ia.Ngn.Cl.Model.Business.Service.NumberIsWithinAllowedEricssonAxeSwitchDomainList(s))
364: {
365: serviceInternationalCallingToReleaseList.Add(s);
366: }
367: }
368: }
369: else if (pstnExchangeType == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.PstnExchangeType.SiemensEwsd)
370: {
371: foreach (var s in serviceToSuspend0List)
372: {
373: if (Ia.Ngn.Cl.Model.Business.Service.NumberIsWithinAllowedSiemensEwsdSwitchDomainList(s))
374: {
375: serviceToSuspendList.Add(s);
376: }
377: }
378:
379: foreach (var s in serviceToRelease0List)
380: {
381: if (Ia.Ngn.Cl.Model.Business.Service.NumberIsWithinAllowedSiemensEwsdSwitchDomainList(s))
382: {
383: serviceToReleaseList.Add(s);
384: }
385: }
386:
387: foreach (var s in serviceInternationalCallingToSuspend0List)
388: {
389: if (Ia.Ngn.Cl.Model.Business.Service.NumberIsWithinAllowedSiemensEwsdSwitchDomainList(s))
390: {
391: serviceInternationalCallingToSuspendList.Add(s);
392: }
393: }
394:
395: foreach (var s in serviceInternationalCallingToRelease0List)
396: {
397: if (Ia.Ngn.Cl.Model.Business.Service.NumberIsWithinAllowedSiemensEwsdSwitchDomainList(s))
398: {
399: serviceInternationalCallingToReleaseList.Add(s);
400: }
401: }
402: }
403: else throw new ArgumentOutOfRangeException(@"pstnExchangeType " + pstnExchangeType.ToString() + " is unknown.");
404: }
405:
406: ////////////////////////////////////////////////////////////////////////////
407:
408: /// <summary>
409: ///
410: /// </summary>
411: public static List<string> ServiceMismatchBetweenServiceRequestAdministrativeIssueAndServiceServiceList(int serviceType, out List<string> serviceToSuspendList, out List<string> serviceToReleaseList, out List<string> serviceInternationalCallingToSuspendList, out List<string> serviceInternationalCallingToReleaseList)
412: {
413: List<string> serviceList;
414:
415: serviceToSuspendList = new List<string>();
416: serviceToReleaseList = new List<string>();
417:
418: serviceInternationalCallingToSuspendList = new List<string>();
419: serviceInternationalCallingToReleaseList = new List<string>();
420:
421: var programmedAccountingDisconnectionType = Ia.Ngn.Cl.Model.Business.ServiceRequestAdministrativeIssue.DisconnectionType.ProgrammedAccounting;
422: var programmedInternationalCallingDisconnectionType = Ia.Ngn.Cl.Model.Business.ServiceRequestAdministrativeIssue.DisconnectionType.ProgrammedInternationalCalling;
423:
424: using (var db = new Ia.Ngn.Cl.Model.Ngn())
425: {
426: serviceToSuspendList = (from srai in db.ServiceRequestAdministrativeIssues
427: join s in db.Service2 on srai.Id equals s.Id
428: where s.ServiceSuspension != true && s.ServiceType == serviceType && srai.Type == (int)programmedAccountingDisconnectionType
429: select s.Service).AsNoTracking().ToList();
430:
431: serviceToReleaseList = (from s in db.Service2
432: join srai in db.ServiceRequestAdministrativeIssues on s.Id equals srai.Id into srais
433: from srai in srais.DefaultIfEmpty()
434: where srai == null && s.ServiceType == serviceType && s.ServiceSuspension == true
435: select s.Service).AsNoTracking().ToList();
436:
437: serviceInternationalCallingToSuspendList = (from srai in db.ServiceRequestAdministrativeIssues
438: join s in db.Service2 on srai.Id equals s.Id
439: join srs in db.ServiceRequestServices on srai.Id equals srs.Id
440: where s.ServiceType == serviceType && srs.InternationalCalling == true && s.InternationalCalling == true && srai.Type == (int)programmedInternationalCallingDisconnectionType
441: select s.Service).AsNoTracking().ToList();
442:
443: serviceInternationalCallingToReleaseList = (from s in db.Service2
444: join srs in db.ServiceRequestServices on s.Id equals srs.Id
445: join srai in db.ServiceRequestAdministrativeIssues on s.Id equals srai.Id into srais
446: from srai in srais.DefaultIfEmpty()
447: where srai == null && s.ServiceType == serviceType && srs.InternationalCalling == true && s.InternationalCalling == false
448: select s.Service).AsNoTracking().ToList();
449: }
450:
451: var serviceExemptionList = ServiceOfServiceExemptFromProvisionProcessingList();
452: foreach (string s in serviceExemptionList)
453: {
454: serviceToSuspendList.Remove(s);
455: serviceToReleaseList.Remove(s);
456:
457: serviceInternationalCallingToSuspendList.Remove(s);
458: serviceInternationalCallingToReleaseList.Remove(s);
459: }
460:
461:
462: serviceList = serviceToSuspendList.Union(serviceToReleaseList).Union(serviceInternationalCallingToSuspendList).Union(serviceInternationalCallingToReleaseList).ToList();
463:
464: // temp until we settle issues with disconnection dept
465: var serviceToDeleteList = new List<string>();
466: foreach (string s in serviceList)
467: {
468: if (!Ia.Ngn.Cl.Model.Business.Service.NumberIsWithinAllowedNokiaSwitchDomainList(s)) serviceToDeleteList.Add(s);
469: }
470: foreach (var s in serviceToDeleteList) serviceList.Remove(s);
471:
472: return serviceList;
473: }
474:
475: ////////////////////////////////////////////////////////////////////////////
476:
477: /// <summary>
478: ///
479: /// </summary>
480: public static Dictionary<string, string> ComplementaryImsServiceMismatchBetweenProvisionedServiceRequestServiceAndServiceServiceIdAccessIdList(DateTime earliestRequestDateTime)
481: {
482: return Ia.Ngn.Cl.Model.Data.Provision.ComplementaryServiceMismatchBetweenProvisionedServiceRequestServiceAndServiceServiceIdAccessIdList(Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService, earliestRequestDateTime);
483: }
484:
485: ////////////////////////////////////////////////////////////////////////////
486:
487: /// <summary>
488: ///
489: /// </summary>
490: public static Dictionary<string, string> ComplementaryPstnServiceMismatchBetweenProvisionedServiceRequestServiceAndServiceServiceIdAccessIdList(DateTime earliestRequestDateTime)
491: {
492: return Ia.Ngn.Cl.Model.Data.Provision.ComplementaryServiceMismatchBetweenProvisionedServiceRequestServiceAndServiceServiceIdAccessIdList(Ia.Ngn.Cl.Model.Business.Service.ServiceType.PstnService, earliestRequestDateTime);
493: }
494:
495: ////////////////////////////////////////////////////////////////////////////
496:
497: /// <summary>
498: ///
499: /// </summary>
500: public static Dictionary<string, string> ComplementaryServiceMismatchBetweenProvisionedServiceRequestServiceAndServiceServiceIdAccessIdList(int serviceType, DateTime earliestRequestDateTime)
501: {
502: Dictionary<string, string> serviceIdAccessIdDictionary;
503:
504: var allowedOltToBeProvisionedIdList = Ia.Ngn.Cl.Model.Data.Service.AllowedToBeProvisionedOltIdList;
505:
506: using (var db = new Ia.Ngn.Cl.Model.Ngn())
507: {
508: var servicePbxList = Ia.Ngn.Cl.Model.Data.Service.ServicePbxList;
509: //var huaweiSwitchDomainList = Ia.Ngn.Cl.Model.Data.Service.HuaweiSwitchDomainList.ConvertAll<string>(u => u.ToString());
510:
511: // below: Service different from ServiceRequestService
512: serviceIdAccessIdDictionary = (from s in db.Service2
513: //join srs in db.ServiceRequestServices on s.Id equals srs.Id // this is faster, but I need to match Services to account for PSTN numbers
514: join srs in db.ServiceRequestServices on s.Service equals srs.Service
515: join srai in db.ServiceRequestAdministrativeIssues on s.Service equals srai.Service into srai2
516: from srai3 in srai2.DefaultIfEmpty()
517: where s.ServiceType == serviceType
518: && srs.Provisioned == true
519: && srs.LastRequestDateTime >= earliestRequestDateTime
520: && (s.Access != null && allowedOltToBeProvisionedIdList.Contains(s.Access.Olt) || s.Access == null)
521: &&
522: (
523: s.AbbriviatedCalling != srs.AbbriviatedCalling
524: || s.AlarmCall != srs.AlarmCall
525: || s.WakeupCall != srs.WakeupCall
526: || s.CallerId != srs.CallerId
527: || s.CallForwarding != srs.CallForwarding
528: || s.ConferenceCall != srs.ConferenceCall
529: || s.InternationalCallingUserControlled != srs.InternationalCallingUserControlled
530: || s.InternationalCalling != srs.InternationalCalling
531: || s.SpeedDial != srs.SpeedDial
532: //|| (Ia.Ngn.Cl.Model.Business.Administration.ServiceSuspensionIsEnabled && s.ServiceSuspension != srs.CallBarring)
533:
534: // below: exclude PBX numbers from the Call Waiting service requirement
535: || !servicePbxList.Contains(srs.Service) && s.CallWaiting != srs.CallWaiting
536:
537: /*
538: // below: exclude huawei from barring and service suspension operations
539: //|| !huaweiSwitchDomainList.Any(u => srs.Service.StartsWith(u.ToString()))
540: || !huaweiSwitchDomainList.Contains(srs.Service.Substring(0, 4)) && !huaweiSwitchDomainList.Contains(srs.Service.Substring(0, 5))
541: &&
542: (
543: srs.CallBarring == false && srs.ServiceSuspension == false && s.ServiceSuspension == true
544: || srs.CallBarring == true && srs.ServiceSuspension == false && s.ServiceSuspension == false
545: || srs.CallBarring == false && srs.ServiceSuspension == true && s.ServiceSuspension == false
546: || srs.CallBarring == true && srs.ServiceSuspension == true && s.ServiceSuspension == false
547: )
548: */
549:
550: // below: check for numbers in which srs.Access != s.Access when s.Access != null
551: //|| (s.Access != null && s.Access.Id != srs.Access.Id) // not appropriate to compare s.Access and srs.Access here
552: )
553: && srai3.Id == null // srai3.Id == null means no ServiceRequestAdministrativeIssues
554: select new
555: {
556: s.Id,
557: AccessId = (s.Access != null) ? s.Access.Id : string.Empty
558: }).AsNoTracking().ToDictionary(n => n.Id, n => n.AccessId);
559: }
560:
561: return serviceIdAccessIdDictionary;
562: }
563:
564: ////////////////////////////////////////////////////////////////////////////
565:
566: /// <summary>
567: ///
568: /// </summary>
569: public static SortedList ProvisionedServiceRequestServiceAndServiceMismatchAccessServiceIdList()
570: {
571: SortedList serviceRequestServiceAndServiceMismatchAccessServiceIdList;
572: Dictionary<string, int> srsIdDictionary, sIdDictionary;
573:
574: using (var db = new Ia.Ngn.Cl.Model.Ngn())
575: {
576: // below: ServiceRequestService dictionary
577: srsIdDictionary = (from srs in db.ServiceRequestServices
578: join s in db.Service2 on srs.Id equals s.Id
579: where s.ServiceType == Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService && srs.Provisioned == true && srs.Access != null && s.Access != null && srs.Access.Id != s.Access.Id
580: select srs.Id).ToDictionary(n => n, n => 1);
581:
582: // below: Service dictionary
583: sIdDictionary = (from s in db.Service2
584: join srs in db.ServiceRequestServices on s.Id equals srs.Id
585: where s.ServiceType == Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService && srs.Provisioned == true && s.Access != null && srs.Access != null && s.Access.Id != srs.Access.Id
586: select s.Id).ToDictionary(n => n, n => 1);
587: }
588:
589: serviceRequestServiceAndServiceMismatchAccessServiceIdList = new SortedList(srsIdDictionary.Count + sIdDictionary.Count);
590:
591: foreach (KeyValuePair<string, int> kvp in srsIdDictionary)
592: if (!serviceRequestServiceAndServiceMismatchAccessServiceIdList.ContainsKey(kvp.Key))
593: serviceRequestServiceAndServiceMismatchAccessServiceIdList.Add(kvp.Key, 1);
594:
595: foreach (KeyValuePair<string, int> kvp in sIdDictionary)
596: if (!serviceRequestServiceAndServiceMismatchAccessServiceIdList.ContainsKey(kvp.Key))
597: serviceRequestServiceAndServiceMismatchAccessServiceIdList.Add(kvp.Key, 1);
598:
599: return serviceRequestServiceAndServiceMismatchAccessServiceIdList;
600: }
601:
602: ////////////////////////////////////////////////////////////////////////////
603:
604: /// <summary>
605: ///
606: /// </summary>
607: public static void ServiceToUpdateServiceIdAccessIdDictionary_ServiceToCreateServiceIdAccessIdDictionary_ServiceToDeleteServiceIdAccessIdDictionary(out Dictionary<string, string> serviceToUpdateServiceIdAccessIdDictionary, out Dictionary<string, string> serviceToCreateServiceIdAccessIdDictionary, out Dictionary<string, string> serviceToDeleteServiceIdAccessIdDictionary)
608: {
609: ServiceToUpdateServiceIdAccessIdDictionary_ServiceToCreateServiceIdAccessIdDictionary_ServiceToDeleteServiceIdAccessIdDictionary(0, out serviceToUpdateServiceIdAccessIdDictionary, out serviceToCreateServiceIdAccessIdDictionary, out serviceToDeleteServiceIdAccessIdDictionary);
610: }
611:
612: ////////////////////////////////////////////////////////////////////////////
613:
614: /// <summary>
615: ///
616: /// </summary>
617: public static void ServiceToUpdateServiceIdAccessIdDictionary_ServiceToCreateServiceIdAccessIdDictionary_ServiceToDeleteServiceIdAccessIdDictionary(int provisionWithinLastNDays, out Dictionary<string, string> serviceToUpdateServiceIdAccessIdDictionary, out Dictionary<string, string> serviceToCreateServiceIdAccessIdDictionary, out Dictionary<string, string> serviceToDeleteServiceIdAccessIdDictionary)
618: {
619: string service, serviceId;
620: Dictionary<string, string> mismatchServiceIdAccessIdDictionary, serviceRequestServiceProvisionedServiceIdAccessIdDictionary, serviceRequestServiceRemovedServiceIdAccessIdDictionary, serviceIdAccessIdDictionary;
621:
622: var earliestRequestDateTime = (provisionWithinLastNDays > 0) ? DateTime.UtcNow.AddHours(3).AddDays(-provisionWithinLastNDays) : Ia.Ngn.Cl.Model.Business.Administration.EarliestRequestDateTime;
623:
624: var allowedOltToBeProvisionedIdList = Ia.Ngn.Cl.Model.Data.Service.AllowedToBeProvisionedOltIdList;
625:
626: using (var db = new Ia.Ngn.Cl.Model.Ngn())
627: {
628: // below: ServiceRequestService dictionary
629: serviceRequestServiceProvisionedServiceIdAccessIdDictionary = (from srs in db.ServiceRequestServices
630: where srs.Provisioned == true && srs.LastRequestDateTime >= earliestRequestDateTime
631: && srs.Access != null && allowedOltToBeProvisionedIdList.Contains(srs.Access.Olt)
632: select new { srs.Id, AccessId = srs.Access.Id }).AsNoTracking().ToDictionary(n => n.Id, n => n.AccessId);
633:
634: serviceRequestServiceRemovedServiceIdAccessIdDictionary = (from srs in db.ServiceRequestServices
635: where srs.Provisioned == false && srs.LastRequestDateTime >= earliestRequestDateTime
636: /*&& srs.Access != null && allowedOltToBeProvisionedIdList.Contains(srs.Access.Olt)*/
637: select new { srs.Id, AccessId = srs.Access.Id }).AsNoTracking().ToDictionary(n => n.Id, n => n.AccessId);
638:
639: serviceIdAccessIdDictionary = (from s in db.Service2
640: where s.ServiceType == Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService
641: && (s.Access != null && allowedOltToBeProvisionedIdList.Contains(s.Access.Olt) || s.Access == null)
642: select new { s.Id, AccessId = s.Access.Id }).AsNoTracking().ToDictionary(n => n.Id, n => n.AccessId);
643: }
644:
645: // services to provision (ServiceRequestService.Provisioned = true and not in Service list)
646: serviceToCreateServiceIdAccessIdDictionary = new Dictionary<string, string>();
647: foreach (KeyValuePair<string, string> kvp in serviceRequestServiceProvisionedServiceIdAccessIdDictionary)
648: {
649: if (!serviceIdAccessIdDictionary.ContainsKey(kvp.Key))
650: {
651: if (!string.IsNullOrEmpty(kvp.Value))
652: {
653: serviceId = kvp.Key;
654: service = Ia.Ngn.Cl.Model.Business.Service.ServiceIdToService(serviceId);
655:
656: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service) && !service.StartsWith("2489"))
657: {
658: serviceToCreateServiceIdAccessIdDictionary.Add(kvp.Key, kvp.Value);
659: }
660: }
661: }
662: }
663:
664: // services to remove (Service has equivalent ServiceRequestService.Provisioned = false)
665: serviceToDeleteServiceIdAccessIdDictionary = new Dictionary<string, string>();
666: foreach (KeyValuePair<string, string> kvp in serviceIdAccessIdDictionary)
667: {
668: if (serviceRequestServiceRemovedServiceIdAccessIdDictionary.ContainsKey(kvp.Key))
669: {
670: //if (!string.IsNullOrEmpty(kvp.Value)) // only delete numbers with accesses, to be removed later
671: //{
672: serviceId = kvp.Key;
673: service = Ia.Ngn.Cl.Model.Business.Service.ServiceIdToService(serviceId);
674:
675: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service) && !service.StartsWith("2489"))
676: {
677: serviceToDeleteServiceIdAccessIdDictionary.Add(kvp.Key, kvp.Value);
678: }
679: //}
680: }
681: }
682:
683:
684: mismatchServiceIdAccessIdDictionary = Ia.Ngn.Cl.Model.Data.Provision.ComplementaryImsServiceMismatchBetweenProvisionedServiceRequestServiceAndServiceServiceIdAccessIdList(earliestRequestDateTime);
685:
686:
687: // services to update
688: serviceToUpdateServiceIdAccessIdDictionary = new Dictionary<string, string>();
689: foreach (KeyValuePair<string, string> kvp in mismatchServiceIdAccessIdDictionary)
690: {
691: serviceId = kvp.Key;
692: service = Ia.Ngn.Cl.Model.Business.Service.ServiceIdToService(serviceId);
693:
694: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service) && !service.StartsWith("2489"))
695: {
696: serviceToUpdateServiceIdAccessIdDictionary.Add(kvp.Key, kvp.Value);
697: }
698: }
699:
700: // 3. Update list (order is important behind create and delete lists)
701: foreach (KeyValuePair<string, string> kvp in mismatchServiceIdAccessIdDictionary)
702: {
703: // I will exclude all numbers from complementary list that are in either serviceToProvision list or serviceToRemove list
704: if (serviceToCreateServiceIdAccessIdDictionary.ContainsKey(kvp.Key) || serviceToDeleteServiceIdAccessIdDictionary.ContainsKey(kvp.Key))
705: {
706: serviceToUpdateServiceIdAccessIdDictionary.Remove(kvp.Key);
707: }
708: }
709:
710: // will exclude exempt numbers
711: var serviceIdExemptionList = ServiceIdOfServiceExemptFromProvisionProcessingList();
712: foreach (string s in serviceIdExemptionList)
713: {
714: serviceToUpdateServiceIdAccessIdDictionary.Remove(s);
715: serviceToCreateServiceIdAccessIdDictionary.Remove(s);
716: serviceToDeleteServiceIdAccessIdDictionary.Remove(s);
717: }
718: }
719:
720: ////////////////////////////////////////////////////////////////////////////
721:
722: /// <summary>
723: ///
724: /// </summary>
725: public static void ServiceToCreateServiceIdDictionary_ServiceToDeleteServiceIdDictionary(out Dictionary<string, string> serviceToCreateServiceIdDictionary, out Dictionary<string, string> serviceToDeleteServiceIdDictionary)
726: {
727: ServiceToCreateServiceIdDictionary_ServiceToDeleteServiceIdDictionary(0, out serviceToCreateServiceIdDictionary, out serviceToDeleteServiceIdDictionary);
728: }
729:
730: ////////////////////////////////////////////////////////////////////////////
731:
732: /// <summary>
733: ///
734: /// </summary>
735: public static void ServiceToCreateServiceIdDictionary_ServiceToDeleteServiceIdDictionary(int provisionWithinLastNDays, out Dictionary<string, string> serviceToCreateServiceIdDictionary, out Dictionary<string, string> serviceToDeleteServiceIdDictionary)
736: {
737: /*
738: var siteList = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.SiteList;
739:
740: var site0List = (from s in siteList
741: where s.Name == "SLB" || s.Name == "ARD" || s.Name == "QRN" || s.Name == "MSF" || s.Name == "MGF" || s.Name == "JHB" || s.Name == "SKB"
742: select s).ToList();
743:
744: var msanList = site0List.SelectMany(u => u.Msans).ToList();
745: */
746:
747: var msanList = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.MsanList;
748:
749: ServiceToCreateServiceIdDictionary_ServiceToDeleteServiceIdDictionary(msanList, provisionWithinLastNDays, out serviceToCreateServiceIdDictionary, out serviceToDeleteServiceIdDictionary);
750: }
751:
752: ////////////////////////////////////////////////////////////////////////////
753:
754: /// <summary>
755: ///
756: /// </summary>
757: public static void ServiceToCreateServiceIdDictionary_ServiceToDeleteServiceIdDictionary(List<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Msan> msanList, int provisionWithinLastNDays, out Dictionary<string, string> serviceToCreateServiceIdDictionary, out Dictionary<string, string> serviceToDeleteServiceIdDictionary)
758: {
759: string service, serviceId;
760: Dictionary<string, string> serviceRequestServiceProvisionedServiceIdDictionary, serviceRequestServiceRemovedServiceIdDictionary;
761: Dictionary<string, string> serviceIdDictionary;
762:
763: var earliestRequestDateTime = (provisionWithinLastNDays > 0) ? DateTime.UtcNow.AddHours(3).AddDays(-provisionWithinLastNDays) : Ia.Ngn.Cl.Model.Business.Administration.EarliestRequestDateTime;
764:
765: var allowedOltToBeProvisionedIdList = Ia.Ngn.Cl.Model.Data.Service.AllowedToBeProvisionedOltIdList;
766:
767: //var msanDomainList = Ia.Ngn.Cl.Model.Data.Service.MsanDomainList;
768: var msanDomainList = msanList.SelectMany(u => u.DomainList).ToList();
769:
770: var msanDomainStringList = msanDomainList.ConvertAll(delegate (int i) { return i.ToString(); });
771:
772: using (var db = new Ia.Ngn.Cl.Model.Ngn())
773: {
774: var serviceRequestServiceList = (from srs in db.ServiceRequestServices
775: where srs.LastRequestDateTime >= earliestRequestDateTime
776: && srs.Access == null
777: select new { srs.Id, srs.Service, srs.Provisioned }).AsNoTracking().ToList();
778:
779: serviceRequestServiceProvisionedServiceIdDictionary = (from l in serviceRequestServiceList
780: where l.Provisioned == true && (msanDomainStringList.Contains(l.Service.Substring(0, 4)) || msanDomainStringList.Contains(l.Service.Substring(0, 5)))
781: select new { l.Id }).ToDictionary(n => n.Id, n => n.Id);
782:
783: serviceRequestServiceRemovedServiceIdDictionary = (from l in serviceRequestServiceList
784: where l.Provisioned == false && (msanDomainStringList.Contains(l.Service.Substring(0, 4)) || msanDomainStringList.Contains(l.Service.Substring(0, 5)))
785: select new { l.Id }).ToDictionary(n => n.Id, n => n.Id);
786:
787: serviceIdDictionary = (from s in db.Service2
788: where s.ServiceType == Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService
789: /*&& s.Access == null*/ && (msanDomainStringList.Contains(s.Service.Substring(0, 4)) || msanDomainStringList.Contains(s.Service.Substring(0, 5)))
790: select new { s.Id }).AsNoTracking().ToDictionary(n => n.Id, n => n.Id);
791: }
792:
793:
794: // services to provision (ServiceRequestService.Provisioned = true and not in Service list)
795: serviceToCreateServiceIdDictionary = new Dictionary<string, string>();
796: foreach (var kvp in serviceRequestServiceProvisionedServiceIdDictionary)
797: {
798: if (!serviceIdDictionary.ContainsKey(kvp.Key))
799: {
800: if (!string.IsNullOrEmpty(kvp.Value))
801: {
802: serviceId = kvp.Key;
803: service = Ia.Ngn.Cl.Model.Business.Service.ServiceIdToService(serviceId);
804:
805: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service) && !service.StartsWith("2489"))
806: {
807: serviceToCreateServiceIdDictionary.Add(kvp.Key, kvp.Value);
808: }
809: }
810: }
811: }
812:
813: // If there is an entry in MSAN for number then I will create it on IMS even if it has a PSTN version (which will be deleted by net-manager or axe projects)
814: var pstnServiceIdList = Ia.Ngn.Cl.Model.Data.Service2.PstnServiceIdList;
815: var msanServiceDictionary = Ia.Ngn.Cl.Model.Data.Huawei.VoipPstnUser.MsanServiceDictionary;
816:
817: foreach (var serviceId0 in pstnServiceIdList)
818: {
819: service = Ia.Ngn.Cl.Model.Business.Service.ServiceIdToService(serviceId0);
820: var service2Id = Ia.Ngn.Cl.Model.Business.Service.ServiceToServiceId(service, Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService);
821:
822: if (!msanServiceDictionary.ContainsKey(service)) serviceToCreateServiceIdDictionary.Remove(service2Id);
823: }
824: //serviceToCreateServiceIdDictionary = new Dictionary<string, string>();
825:
826:
827: // services to remove (Service has equivalent ServiceRequestService.Provisioned = false)
828: serviceToDeleteServiceIdDictionary = new Dictionary<string, string>();
829: foreach (var kvp in serviceIdDictionary)
830: {
831: if (serviceRequestServiceRemovedServiceIdDictionary.ContainsKey(kvp.Key))
832: {
833: if (!string.IsNullOrEmpty(kvp.Value)) // only delete numbers with accesses, to be removed later
834: {
835: serviceId = kvp.Key;
836: service = Ia.Ngn.Cl.Model.Business.Service.ServiceIdToService(serviceId);
837:
838: if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service) && !service.StartsWith("2489"))
839: {
840: serviceToDeleteServiceIdDictionary.Add(kvp.Key, kvp.Value);
841: }
842: }
843: }
844: }
845:
846: /*
847: // temp until I fix changed-to problems
848: var changedAndChangedToServiceIdList = Ia.Ngn.Cl.Model.Data.ServiceRequest.ChangedAndChangedToServiceIdList();
849: foreach (var serviceId in changedAndChangedToServiceIdList)
850: {
851: serviceToCreateServiceIdDictionary.Remove(serviceId);
852: serviceToDeleteServiceIdDictionary.Remove(serviceId);
853: }
854: */
855:
856: var serviceIdExemptionList = ServiceIdOfServiceExemptFromProvisionProcessingList();
857: foreach (var serviceId0 in serviceIdExemptionList)
858: {
859: serviceToCreateServiceIdDictionary.Remove(serviceId0);
860: serviceToDeleteServiceIdDictionary.Remove(serviceId0);
861: }
862: }
863:
864: ////////////////////////////////////////////////////////////////////////////
865:
866: /// <summary>
867: /// List of exempt number ids
868: /// </summary>
869: public static List<string> ServiceIdOfServiceExemptFromProvisionProcessingList()
870: {
871: List<string> list;
872:
873: list = new List<string>();
874:
875: foreach (string u in Ia.Ngn.Cl.Model.Data.ServiceExemption.ServiceIdList()) list.Add(u);
876:
877: return list;
878: }
879:
880: ////////////////////////////////////////////////////////////////////////////
881:
882: /// <summary>
883: /// List of exempt services
884: /// </summary>
885: public static List<string> ServiceOfServiceExemptFromProvisionProcessingList()
886: {
887: List<string> list;
888:
889: list = new List<string>();
890:
891: foreach (string u in Ia.Ngn.Cl.Model.Data.ServiceExemption.ServiceList()) list.Add(u);
892:
893: return list;
894: }
895:
896: ////////////////////////////////////////////////////////////////////////////
897: ////////////////////////////////////////////////////////////////////////////
898:
899: /// <summary>
900: ///
901: /// </summary>
902: public static List<string> ProvisionedImsServiceWithNullAccessNotInPstnNorInNceOntSipInfoNorVoipPstnUserNorMsanWithinMsanDomainListList(bool reloadData)
903: {
904: if (reloadData || provisionedImsServiceWithNullAccessNotInPstnNorInNceOntSipInfoNorVoipPstnUserNorMsanWithinMsanDomainListList == null || provisionedImsServiceWithNullAccessNotInPstnNorInNceOntSipInfoNorVoipPstnUserNorMsanWithinMsanDomainListList.Count == 0)
905: {
906: lock (objectLock)
907: {
908: provisionedImsServiceWithNullAccessNotInPstnNorInNceOntSipInfoNorVoipPstnUserNorMsanWithinMsanDomainListList = _ProvisionedImsServiceWithNullAccessNotInPstnNorInNceOntSipInfoNorVoipPstnUserNorMsanWithinMsanDomainListList();
909: }
910: }
911:
912: return provisionedImsServiceWithNullAccessNotInPstnNorInNceOntSipInfoNorVoipPstnUserNorMsanWithinMsanDomainListList;
913: }
914:
915: ////////////////////////////////////////////////////////////////////////////
916:
917: /// <summary>
918: ///
919: /// </summary>
920: private static List<string> _ProvisionedImsServiceWithNullAccessNotInPstnNorInNceOntSipInfoNorVoipPstnUserNorMsanWithinMsanDomainListList()
921: {
922: List<string> list;
923:
924: var imsServiceWithAccessNullList = Ia.Ngn.Cl.Model.Data.Service2.ImsServiceWithAccessNullList;
925: var serviceWithProvisionedTrueAndNullAccessList = Ia.Ngn.Cl.Model.Data.ServiceRequestService.ServiceWithProvisionedTrueAndNullAccessList();
926:
927: var pstnServiceList = Ia.Ngn.Cl.Model.Data.Service2.PstnServiceList;
928: var emsOntSipInfoServiceList = Ia.Ngn.Cl.Model.Data.Huawei.OntSipInfo.ServiceList();
929: var emsVoipPstnUserServiceList = Ia.Ngn.Cl.Model.Data.Huawei.VoipPstnUser.ServiceList();
930:
931: var msanDomainList = Ia.Ngn.Cl.Model.Data.Service.MsanDomainList;
932:
933: var list0 = imsServiceWithAccessNullList.Intersect(serviceWithProvisionedTrueAndNullAccessList).ToList();
934: var list1 = pstnServiceList.Union(emsOntSipInfoServiceList).Union(emsVoipPstnUserServiceList).ToList();
935:
936: var list2 = list0.Except(list1).ToList();
937:
938: list = (from l in list2 where msanDomainList.Any(u => l.StartsWith(u.ToString())) select l).ToList();
939:
940: return list;
941: }
942:
943: ////////////////////////////////////////////////////////////////////////////
944: ////////////////////////////////////////////////////////////////////////////
945: }
946:
947: ////////////////////////////////////////////////////////////////////////////
948: ////////////////////////////////////////////////////////////////////////////
949: }