Fiskalizacija i ruby

140 views
Skip to first unread message

Dorijan Jelincic

unread,
Nov 25, 2012, 6:12:48 PM11/25/12
to rub...@googlegroups.com
Pozdrav svima...

Da li je netko implementirao nesto vezano za fiskalizaciju u rubyu koja krece uskoro? Neka iskustva, ili mozda dio koda ili neke smjernice...

Evo hvala unaprijed :)

Dorijan

Borna Novak

unread,
Nov 28, 2012, 3:23:09 AM11/28/12
to rub...@googlegroups.com
Ako nitko ne razvija gem za ovo, evo ti par noobie pointera za razvoj (ne znam koliko znaš pa se unaprijed ispričavam)
  • jednostavan i za sada se čini robustan SOAP gem: http://railscasts.com/episodes/290-soap-with-savon
  • ako dobro razumijem, samo je važno da poruka o izdanom računu dođe do porezne eventualno, to nije nužno odmah i ne želiš da ti puca prodaja zato što je poreznoj pao sustav ili ti je pukao link, pa uzmi neki perzistentni background queue:
    • lakši za uklopiti u trenutačne instalacije, dovoljno ok za poprilično velike loadove i dobar za integraciju sa postojećim active record modelima: http://railscasts.com/episodes/171-delayed-job
    • bolji izbor za heavy load riješenje: http://railscasts.com/episodes/271-resque
    • PS ne zaboravi raisati exception ako ne dobiješ "sve savršeno" odgovor od hosta, pitaj Boga kako će to raditi, možda će postojati neka kombinacija polja koja ne raisa SOAP exception, a nije 'prihvaćeno'...
    • logiraj exceptione negdje gdje će ti ih biti ugodno pratiti, razvoj napravljen za državnu upravu je često suboptimalan i moguće će biti dosta napipavanja "hidden featura" u produkciji
    • implementiraj gledalicu jobova i failanih jobova ako ju nisi dobio out of the box (npr. sa resqueom)
  • imaj na umu da ne razvijaš web servis nego online financijski servis koji se uz to može delayati u stisci - greške u implementaciji su mnogo skuplje od grešaka u optimizaciji: fokusiraj se na kvalitetu razvoja i robustnost implementacije, apsolutno minimalno testovi svega što ima financijske poslijedice (kao npr ne-submit ili pogrešan submit računa pretpostavljam?), a manje fokusa na optimizaciju i procesiranje milijuna zahtijeva. Sve da ti je hardver koma i da ti je implementacija katastrofa uvijek možeš cronom dići queue server na kraju radnog vremena, spustiti ga na početku, dislocirati na drugi host... a broj zahtijeva je u pravilu direktno proporcionalan sa količinom sredstava koje klijent realno može investirati u infrastrukturu


Borna

Dorijan Jelincic

unread,
Nov 29, 2012, 3:06:16 PM11/29/12
to rub...@googlegroups.com
Hvala puno na pointerima...
No, nije mi jasno zakaj mislis da bi trebao raditi delayed job, kada ja odgovor od njih moram dobiti sad i odmah, i ako ne dobijem ne mogu izdati racun uopce?
Mogu napraviti da ako ne dobije povratnu informaciju, da jednostavno kaze probaj ponovo...


Borna Novak

unread,
Dec 1, 2012, 5:08:46 AM12/1/12
to rub...@googlegroups.com
Hm,

pretpostavio sam a priori da uspješno odrađen zahtijev nije prerequisite za izdavanje računa jer bi poslijedice toga bile pre brutalne (od kolapsa maloprodajnog sustava RH u slučaju pada hosta do golemih komplikacija na prostorima koji stalno ili privremeno nemaju broadband i široki spektar disaster scenarija između).


...i čini se da mi je pretpostavka na mjestu, ovo kaže specifikacija:

U slučaju da se prilikom obrade poruke zahtjeva dogodi greška (poruka neispravna po XML shemi,
neispravan elektronički potpis i sl.) CIS vraća XML poruku odgovora koja sadrži opis greške. U tom
slučaju odgovor ne sadrži JIR i operater na naplatnom uređaju (blagajnik) izdaje kupcu račun bez JIR-a.
Poslovni proces izdavanja računa kupcu ne smije biti onemogućen zbog nastale greške ali obveznik
fiskalizacije je dužan ispraviti nepravilnosti u slanju poruke i poruku naknadno dostaviti. Proces u slučaju
greške je prikazan slijednim dijagramom na slici 2.


Čini se da smiješ izdati račun čak i kada pogrešno isprogramiraš sustav, koristiš krivi certifikat i sl, samo to moraš dojaviti i naknadno poslati ispravno. I još jedan pointer, delayed job ti omogućava da kao parametar šalješ cijelu instancu modela koju ovaj marshallizira iirc, nemoj to raditi zato što ako imaš buhu u modelu ćeš ju mnogo teže naknadno ispraviti na način da se ti requesti na kraju pošalju prema hostu bez mnogo dopunskog petljanja.

Idealno bi bilo ako bi bilo dovoljno poslati id transakcije kao parametar u job, pa da trenutačna verzija koda zna što sa time treba napraviti (drugi razlog su preformanse).


Borna

Borna Novak

unread,
Dec 1, 2012, 5:33:22 AM12/1/12
to rub...@googlegroups.com
Ukratko, koliko razumijem, proces ide ovako nekako, u ruby pseudokodu


class Transaction

  def fiscalize # lol
    response = process_fiscalization_request!
  rescue Exception => e
    log_exception e #ili negdje dublje uhvati pa reraisaj
    AsyncFiscalizationJob.new(self.id)
  end

  def process_fiscalization_request!
    response = send_fiscalization_request

    raise FiscalizationException unless response.ok?

    # response mora sadržavati neke atribute koje treba uključiti u račun.
    #
    # u ovisnosti o načinu na koji fiskalizacijski host handla duple upite:
    #
    # pobrini se da
update_fiscalization_attributes nikada ne raisa, ali da
    #
logiraš i da primaš alerte o tome što se događa, naročito želiš
    # logirati raw response of fiskalizacijskog hosta u slučaju greške
    #
    update_fiscalization_attributes(response)


    response
  end

end


class AsyncFiscalizationJob < Struct.new(:transaction_id)

  def initialize(transaction_id)
    Transaction.find(transaction_id).process_fiscalization_request!
  end

end


2012/12/1 Borna Novak <dosad...@gmail.com>

Marko Žabčić

unread,
Jan 29, 2013, 8:29:39 AM1/29/13
to rub...@googlegroups.com
Pozdrav,

Jel netko onda nešto isprogramirao ili moram krenuti od nule :-) ?

Lijep pozdrav,
Marko


On Monday, November 26, 2012 12:12:48 AM UTC+1, Dorijan Jelincic wrote:

Dorijan Jelincic

unread,
Jan 29, 2013, 3:22:32 PM1/29/13
to rub...@googlegroups.com
Mislio sam krenuti, ali nikak da ulovim vremena, na kraju mislim da cu koristiti jednu php funkciju koju cu pozivati, jer je netko napravio FOSS rjesenje u phpu
ako se nekome da to ici pisati ispocetka, mogu pomoci :)

Marko Žabčić

unread,
Jan 29, 2013, 3:35:56 PM1/29/13
to rub...@googlegroups.com
Ok, hvala na odgovoru. Možeš poslati link do php rješenja?

Branimir Šloser

unread,
Jan 29, 2013, 3:41:45 PM1/29/13
to Marko Žabčić, rub...@googlegroups.com
Prepisat php u ruby ne bi trebao biti problem

2013/1/29 Marko Žabčić <gm.m...@gmail.com>:
> --
>
> ---
> Ovu ste poruku primili jer ste pretplaćeni na grupu "Ruby Hrvatska" kao
> jednu od Google Grupa.
> Da biste poništili pretplatu na tu grupu i prestali primati e-poruke s nje,
> pošaljite e-poruku na ruby-hr+u...@googlegroups.com.
> Dodatne opcije potražite na adresi https://groups.google.com/groups/opt_out.
>
>



--
www.emusoft.hr
www.twitter.com/emusoft
Reply all
Reply to author
Forward
0 new messages