public static RtppmData ParsePPMData(dynamic data)
        {
            var ppmData = new RtppmData();
            ppmData.Timestamp = UnixTsToDateTime((double)data.snapshotTStamp);

            foreach (var natSector in data.NationalPage.Sector)
            {
                ppmData.Sectors.Add(ParsePPMNationalRecord(natSector));
            }

            ppmData.NationalPPM = ParsePPMOperatorRecord(data.NationalPage.NationalPPM);

            foreach (var opSector in data.OperatorPage)
            {
                PPMRecord record = ParsePPMOperatorRecord(opSector.Operator);
                try
                {
                    if (opSector.OprServiceGrp != null)
                    {
                        if (opSector.OprServiceGrp is JArray)
                        {
                            foreach (var opServiceGroup in opSector.OprServiceGrp)
                            {
                                record.ServiceGroups.Add(ParsePPMServiceGroupRecord(opServiceGroup));
                            }
                        }
                        else
                        {
                            record.ServiceGroups.Add(ParsePPMServiceGroupRecord(opSector.OprServiceGrp));
                        }
                    }
                }
                catch { }
                ppmData.Operators.Add(record);
            }

            return ppmData;
        }
        public void CachePPMData(RtppmData data)
        {
            if (data == null)
                return;
            Trace.TraceInformation("Saving PPM Data for {0}", data.Timestamp);

            if (data.NationalPPM != null)
            {
                var nationalPPMId = _sectors
                    .Where(s => s.OperatorCode == null)
                    .Where(s => s.SectorCode == null)
                    .Select(s => s.PPMSectorId)
                    .SingleOrDefault();
                if (nationalPPMId != null && nationalPPMId != Guid.Empty)
                {
                    SavePPMData(data.NationalPPM, nationalPPMId, data.Timestamp);
                }
                else
                {
                    Trace.TraceError("PPM: Could not find National PPM in Database");
                }
            }
            if (data.Sectors != null)
            {
                foreach (var nationalSector in data.Sectors)
                {
                    var id = _sectors
                        .Where(s => s.OperatorCode == null)
                        .Where(s => s.SectorCode == nationalSector.Code)
                        .Select(s => s.PPMSectorId)
                        .SingleOrDefault();
                    if (id != null && id != Guid.Empty)
                    {
                        SavePPMData(nationalSector, id, data.Timestamp);
                    }
                    else
                    {
                        Trace.TraceError("PPM: Could not find Sector {0} in Database", nationalSector.Code);
                    }
                }
            }
            if (data.Operators != null)
            {
                foreach (var toc in data.Operators)
                {
                    var id = _sectors
                        .Where(s => Convert.ToByte(s.OperatorCode) == Convert.ToByte(toc.Code))
                        .Where(s => s.SectorCode == null)
                        .Select(s => s.PPMSectorId)
                        .SingleOrDefault();
                    if (id != null && id != Guid.Empty)
                    {
                        SavePPMData(toc, id, data.Timestamp);
                    }
                    else
                    {
                        Trace.TraceError("PPM: Could not find TOC {0} in Database", toc.Code);
                    }
                    foreach (var tocSector in toc.ServiceGroups)
                    {
                        var sectorId = _sectors
                            .Where(s => Convert.ToByte(s.OperatorCode) == Convert.ToByte(toc.Code))
                            .Where(s => s.SectorCode != null)
                            .Where(s => s.SectorCode.Equals(tocSector.Code, StringComparison.InvariantCultureIgnoreCase))
                            .Where(s => s.Description.Equals(tocSector.Name, StringComparison.InvariantCultureIgnoreCase))
                            .Select(s => s.PPMSectorId)
                            .SingleOrDefault();
                        if (sectorId != null && sectorId != Guid.Empty)
                        {
                            SavePPMData(tocSector, sectorId, data.Timestamp);
                        }
                        else
                        {
                            Trace.TraceError("PPM: Could not find TOC {0} Sector {1}-{2} in Database", toc.Code, tocSector.Name, tocSector.Code);
                        }
                    }
                }
            }
        }