Cubus Arts Blog

@ Gabriel Târnovan
Gabriel Târnovan

factureaza.ro - lansare API

Gabriel Târnovan

La cererea mai multor clienţi şi deoarece considerăm că momentul este oportun, am lansat accesul API la serviciul factureaza.ro.

Pe scurt, aceasta înseamnă că orice alt sistem informatic poate fi integrat cu factureaza.ro. Facturarea devine astfel un modul care nu mai trebuie implementat pentru fiecare aplicaţie în parte. Mai mult, din moment ce toate datele de facturare pot fi păstrate în acelaşi loc, diversele aplicaţii conectate vor împărţi aceleaşi date; integrarea e mai strânsă şi duplicarea informaţiei dispare.

Exemple de utilizare:

  • aplicaţii de e-commerce (dorim să lansăm în curând module de facturare pentru magento şi spreecommerce )
  • SaaS sau alte forme de aplicaţii online pe bază de abonament; noi am integrat de exemplu pe travelbox.ro
  • CRM
  • aplicaţii de project management şi time tracking
  • … orice aplicaţie unde e nevoie de facturare

Detalii tehnice pentru integrarea API-ului factureaza.ro în aplicația voastră gasiți aici: factureaza.ro/documentatie/api.

Pentru implementare am folosit gem-urile serialize_with_options și inherited_resources. Factureaza.ro fiind construit pe Ruby on Rails, implementarea a fost destul de simplă. Mai multe detalii într-un post viitor.

Exemplu concret – integrare travelbox.ro

Pentru travelbox.ro, al doilea SaaS oferit de firma noastră am făcut prima integrare pe baza APIului factureaza.ro după cum urmează:

  • în momentul în care un client nou se înregistrează pe travelbox.ro, se creează automat prin API o înregistrare pentru acest client pe factureaza.ro
  • clientul este înregistrat în funcţia de facturi recurente (abonamente); periodic aceasta va emite facturile aferente
  • de fiecare dată când un utilizator se autentifică pe travelbox.ro, se verifică prin API dacă nu există facturi emise acestul client scadente de mai mult de o lună. Accesul nu este permis dacă acesta este cazul.

În curând travelbox.ro va permite generarea de facturi către turişti, desigur prin intermediul APIului factureaza.ro

În concluzie

Detaliile pentru integrarea APIului găsiţi aici: factureaza.ro/documentatie/api Aşteptăm cu interes să vedem în ce fel îl veţi folosi.

Vă invităm să aruncaţi o privire şi peste openapi.ro – un set de servicii web utile dezvoltatorilor români (date de pe mfinante.ro, geolocare IP, diverse validări, etc) – în uz şi la factureaza.ro

Gabriel Târnovan

factureaza.ro - scurt istoric

Gabriel Târnovan

Înainte de 2007 întocmeam clienţilor noştri din Germania şi Austria facturi cu ajutorul omniprezentului Excel, pentru că facturile în regim special de atunci nu erau acceptate de clienţi. Aceasta creea o situaţie comică: făceam o factură in Euro care era trimisă clienţilor, şi una in Lei care intra în contabilitate. Cum majoritatea clienţilor noştri la acea vreme erau externi, am decis să înlocuim Excelul, directoarele anuale și subdirectoarele lor lunare cu o aplicaţie web-based, pentru că la asta ne pricepem şi pentru că vroiam să emitem facturi de oriunde; inclusiv de la sediul clienţilor din Austria.

Ne-am scris deci cândva în 2005 prima aplicaţie de facturare în PHP care exporta LaTeX din care generam PDF. Am folosit sistemul respectiv fără probleme. Din păcate nu scăpaserăm de redactarea periodică a facturilor pentru clienţii noştri de hosting, majoritatea locali.

În 2007 situaţia s-a schimbat complet. Nu doar că fiecare furnizor işi putea emite facturile în orice formă, dar chiar semnarea şi ştampilarea facturilor nu mai erau obligatorii. Ne-am pus pe treabă şi in aprilie 2007 factureaza.ro era online cu 200 de conturi înregistrate. Aplicaţie Ruby on Rails, Prototype JS, MySQL cluster. Acel moment a reprezentat pentru firma noastră şi trecerea completă pe dezvoltare bazată pe Ruby on Rails, și nu ne-a părut rău niciodată.

După boom-ul iniţial – în prima parte a lui 2007 toată lumea căuta înlocuitor pentru vechile tipizate – evoluţia s-a stabilizat într-o creştere constantă a cererii pentru acest tip de servicii.

În ultimii patru ani am încercat să ţinem pasul cu cerinţele clienţilor noştri prin îmbunătăţirea serviciului, adăugarea de funcţii noi şi oferind un suport cât mai bun. Cele mai recente completări includ:

  • API-ul factureaza.ro prin care oferim posibilitatea clienţilor noştri să integreze sistemul de facturare în propriile sisteme (eCommerce, CRM, etc).
  • integrare cu openapi.ro
  • un sistem de drepturi prin care se poate partaja accesul angajaților la facturile firmei
  • ajutor live prin chat direct de pe site (prin integrarea serviciilor olark.com)

De la câteva sute de utilizatori la sfârșitul lui 2007 am ajuns acum la peste 4200 și un total de peste 150.000 facturi emise. Valoarea totală a facturilor emise se apropie de jumătate de miliard de RON. Dar despre asta într-un alt post.

Gabriel Târnovan

Simple Audit for Rails Apps

Gabriel Târnovan

simple_audit is a lightweight auditing solution for Rails apps. Instead of auditing all attributes of your models, simple_audit allows you to specify what data is relevant for auditing. This simple idea makes auditing complex model aggregations (through has_many, has_one, habtm associations) trivial.

Audit in 2 minutes:

Result will look like this:
Screenshot of helper result

Why ?

simple_audit is intended as a straightforward auditing solution for complex model associations. In a normalized data structure (which is usually the case when using SQL), a core business model will aggregate data from several associated entities. More often than not in such cases, only the core model is of interest from an auditing point of view (the parent in the has_xxx relations).

One approach would be to audit all aggregated entities sepparately. The downside of this is the high complexity of retracing all changes triggered on each save. Another minus is the increased database workload.

simple_audit takes a simpler approach: you decide for each audited model what data needs to be audited by specifying a serializable representation of all relevant information – including the any relevant aggregated entities (e.g. the housing_unit_bookings in the above example) This data will be serialized on every save. The available helper methods will render a clear audit trail (see above).

Limitations

This is not a solution for versioning. Changed data can not be restored. Use acts_as_audited or acts_as_versioned for that.

Dependencies

The current user is assumed to be available by calling User.current You can use sentient_user or roll your own solution.

More information

Read more on the github page. Contributions are welcome!