Beispiel #1
0
        public XDocument Generate()
        {
            XNamespace xmlns          = "http://xmls.skatteverket.se/se/skatteverket/ai/instans/infoForBeskattning/6.0";
            XNamespace xsi            = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
            XNamespace schemaLocation = "http://xmls.skatteverket.se/se/skatteverket/ai/instans/infoForBeskattning/6.0 http://xmls.skatteverket.se/se/skatteverket/ai/kontrolluppgift/instans/Kontrolluppgifter_6.0.xsd";
            XNamespace ku             = "http://xmls.skatteverket.se/se/skatteverket/ai/komponent/infoForBeskattning/6.0";
            var        doc            = new XDocument(new XDeclaration("1.0", "UTF-8", "no"));
            var        root           = new XElement(xmlns + "Skatteverket",
                                                     new XAttribute(XNamespace.Xmlns + "ku", ku),
                                                     new XAttribute("omrade", "Kontrolluppgifter"),
                                                     new XAttribute(XNamespace.Xmlns + "xsi", xsi),
                                                     new XAttribute(xsi + "schemaLocation", schemaLocation)
                                                     );
            var visitor = new XVisitor(ku);

            root.Add(Avsandare.Accept(visitor));
            var blankettgemensamt = new XElement(ku + "Blankettgemensamt");

            foreach (var uppgiftslamnare in Uppgiftslamnare)
            {
                blankettgemensamt.Add(uppgiftslamnare.Accept(visitor));
            }
            root.Add(blankettgemensamt);
            var blankettIdSet      = new HashSet <string>();
            var uppgiftslamnareSet = new HashSet <string>(Uppgiftslamnare.Select(x => x.UppgiftslamnarePersOrgnr));
            var i = 0;

            foreach (var blankett in Blanketter)
            {
                KUId id;
                try
                {
                    id = blankett.Blankettinnehall.GetId();
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException($"Blankett med index {i} har inget giltigt ID", ex);
                }

                if (!uppgiftslamnareSet.Contains(id.UppgiftslamnarId))
                {
                    throw new InvalidOperationException($"Uppgiftslämnare för blankett med ID '{id}' är inte med i registret över uppgiftslämnare ({string.Join(", ", uppgiftslamnareSet)}) för dokumentet");
                }

                if (blankett.Arendeinformation.Arendeagare != blankett.Blankettinnehall.Data.GetValueOrDefault <string>(Fältkod.UppgiftslamnarId))
                {
                    throw new InvalidOperationException($"Arendeagare för blankett med ID '{id}' ska vara lika med UppgiftslamnarId");
                }

                if (_inkomstar != id.Inkomstar)
                {
                    throw new InvalidOperationException($"Blankett med ID '{id}' avser ett annat inkomstår än {_inkomstar}");
                }

                try
                {
                    KUHelper.Validate(blankett.Blankettinnehall);
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException($"Blankett med ID '{id}' innehåller felaktiga uppgifter", ex);
                }

                Sambandskontroller.Sambandskontroll(blankett.Blankettinnehall);

                root.Add(blankett.Accept(visitor));
                i++;
            }
            doc.Add(root);

            // these are soft warnings, they need to be checked but they aren't formal errors
            foreach (var result in visitor.ValidationResults)
            {
                foreach (var result2 in result.ValidationResults)
                {
                    Console.Error.WriteLine(result2.ErrorMessage);
                }
            }

            // XSD validation

            var sw = new StringWriter();

            doc.Save(sw, SaveOptions.None);
            using (var reader = XmlReader.Create(new StringReader(sw.ToString()), _xmlSettings))
            {
                while (reader.Read())
                {
                    // nom nom nom...
                }
            }

            return(doc);
        }
Beispiel #2
0
 public XElement Accept(XVisitor visitor)
 {
     return(visitor.Visit(this));
 }