Win

Fiskalizacije gotovinskih računa

Kreirano: Ponedjeljak, 21 Ožujak 2016 Ažurirano: Subota, 08 Veljača 2020

Fiskalizacija je prvi primjer povezivanja knjigovodstvene aplikacije sa vanjskim svijetom, gdje se knjigovodstvena aplikacija pojavljuje kao klijent web servisa https://cis.porezna-uprava.hr:8449/FiskalizacijaService porezna uprave.

Tehnički nije to neki zahvat za onog koji sa time radi, ali ako se tako gleda dali uopće postoje složeni zahvati. 

Cilj je sto bezbolnije inplementirat fiskalizaciju u već postojeći kod za izdavanje gotovinskig račun. Riješenje je napravit klasu koja će to obavit i smjestit je u 'event' štampanja računa. Ta klasa ima javnu metodu koja vraća JIR, koji se onda inplementira u izlist računa. Cijela priča bi izgledala ovako:

            // fiskalizacija računa
            if (fiskaliziraj.Certifikat != null)
            {
                string Jir = fiskaliziraj.Racun(drv);
                drv["POB"] = "Jir: " + Jir;
            }

Parametar drv je datarowview koji sadrži potrebne podatke o računu, a da se izbjega 'kobasica' parametara za svako polje pojedinačno. Klasa Fiskaliziraj se deklarira na nivou klase računa, tako da za svako izdavanje računa ne 'grebe' po disku tražeći certifikatfi, nego ga dohvati jednom za cijelo vrijeme rada sa računima. Ako ne postoji certifikat, fiskalizacija se ignorira.

Metoda fiskaliziraj.Racun() izgleda ovako:

        // fiskalizacija računa, vraća Jir
        public string Racun(DataRowView rw)
        {
            // Generira XDocument Racun za dostavu Poreznoj
            XDocument Racun = GetXMLracun(rw);   // podatke o rčunu samo proslijedimo

            // Generira XElement Potpis za Racun
            XElement Signature = wClient.PotpisRacuna(Racun, "#signXmlId");
            Racun.Root.Add(Signature);

              // Kreirati novi XDokument PotpisaniRacun koji objedinjuje račun i potpis
            XNamespace soapenv = XNamespace.Get("http://schemas.xmlsoap.org/soap/envelope/");
            XNamespace xsd = XNamespace.Get("http://www.w3.org/2001/XMLSchema");

            RacunZahtjev = new XDocument(
                new XElement(soapenv + "Envelope", new XAttribute(XNamespace.Xmlns + "soapenv", soapenv), new XAttribute(XNamespace.Xmlns + "xsd", xsd), new XAttribute(XNamespace.Xmlns + "xsi", xsi),
                    new XElement(soapenv + "Body",
                    Racun.Root
            )));

            // XDocument Odgovor koji vraća Porezna
            XDocument Odgovor = wClient.SendSoapMessage(RacunZahtjev);
 
            // Vraća JIR iz XDokumenta Odgovor koji sadrži odgovor na RacunZahtjev.
            return DohvatiJir(Odgovor);
 
        }//---------------------------------------------------------------

RacunZahtjev je najelegantnije napraviti u LINQ tehnologiji, to bi izgledalo ovako.


            // kreiranje dokumenta 'RacunZahtjev'
           XDocument xDocument = new XDocument(
               new XDeclaration("1.0", "utf-8", ""),
               new XComment(" 'Fiskalizacija RacunZahtjev' by Ivan Smilović www.smilovic.com "),
               new XElement(tns + "RacunZahtjev",
                   new XAttribute(XNamespace.Xmlns + "xsi", xsi),
                   new XAttribute("Id", "signXmlId"),
                   new XAttribute(XNamespace.Xmlns + "tns", tns),
                   new XElement(tns + "Zaglavlje",
                   new XElement(tns + "IdPoruke", Guid.NewGuid()),
                   new XElement(tns + "DatumVrijeme", DatumVrijeme) ),
                   new XElement(tns + "Racun",
                   new XElement(tns + "Oib", CertOib),
                   new XElement(tns + "USustPdv", "true"),
                   new XElement(tns + "DatVrijeme", DatVrijeme),
                   new XElement(tns + "OznSlijed", "P"),
                   new XElement(tns + "BrRac",
                       new XElement(tns + "BrOznRac", Broj),
                       new XElement(tns + "OznPosPr", Sklad.cSkl),
                       new XElement(tns + "OznNapUr", "1")
                   ),
                   new XElement(tns + "Pdv", pdv25, pdv13, pdv5, pp3, BezPdv ),
                   new XElement(tns + "IznosUkupno", IznosUkupno),
                   new XElement(tns + "NacinPlac", NacinPlac),
                   new XElement(tns + "OibOper", User.OpOib),
                   new XElement(tns + "ZastKod", ZastKod),
                   new XElement(tns + "NakDost", "false") // naknadno dostavljanje posebno
       ))); 

Sve poslove oko potpisivanja i komunikacije sa poreznom upravom preuzima klasa WClient, koja se pojavljuje kao član klase Fiskalizacija. WClient, u glavnom konstruktoru, preuzima od Fiskalizacija certifikat i Url porezne uprave, za obavljanje prijave računa.

                    public XDocument SendSoapMessage(XDocument xDocument)
                    {
                        // konvertrati XDocument u MemoryStream
                        XmlDocument xmlDocument = DocumentExtensions.ToXmlDocument(xDocument);
                        byte[] byteArray = UTF8Encoding.UTF8.GetBytes(xmlDocument.InnerXml);
                        MemoryStream stream = new MemoryStream(byteArray);
             
                        return SendRequest(stream);
             
                    }//---------------------------------------------------------------

SendSoapMessage(envelopeZahtjev) vraća odgovor porezne uprave u kojem je sadržan jedinstveni identifikator računa. Još trena izvući Jir iz dobivenog odgovora i vratit ga starom kodu (prije fiskalizacije) kako bi ga mogao prenijet na račun. Vidi zadnju liniju metode fiskaliziraj.Racun.

        // Vraća JIR iz XML dokumenta koji sadrži odgovor (RacunOdgovor) na RacunZahtjev.
        public string DohvatiJir(XDocument Odgovor)
        {
              string jir = "";
                  
              if (Odgovor != null)
              {
                    XElement Jir = Odgovor.Element(soap + "Envelope").Element(soap + "Body").Element(tns + "RacunOdgovor").Element(tns + "Jir");
                      if (Jir != null) return Jir.Value;
              }
       
              // Ako fiskalizacija nije uspjela
              Javi.Poruka(2, "Račun nije fiskaliziran, OBAVEZNO ga fiskalizirajte ga naknadno...");
       
              // Kreirati direktorij u koji se sprema greška fiskalizacije
              string XmlFilePath = Udf.GetArhivaDir("Xml\\Fiskalizacija");
              RacunZahtjev.Save(XmlFilePath + ZastKod + ".xml");
       
              return jir;
       
       }//---------------------------------------------------------------

Naravno da je sve poprilično skraćeno, spomenute su samo neke od metoda klase Fiskalizacije i WClient, tek toliko da se dobije uvid u organizaciju postupka. Klase su kreirane tako da se jadnog dana mogu primijenit i na druge dokumente. WClient opslužuje servise: slanje računa za državu, zaprimanje računa za državi i dostava obrazaca poreznoj upravi (na žalost nikako da ga dovrše).

Kreirao i izradio Ivan Smilović!.
Blue joomla theme by Template Joomla