Generátor faktur – Nette šablony + mPDF

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ondřej Brejla
Člen | 746
+
0
-

Třeba se to někomu hodí. Hned pro začátek upozorňuji, že je to psané dost na míru, spousta věcí není úplně ideálně a rozhodně by mohla být zpracována lépe. Potřeboval jsem podobnou komponentu vytvořit co možná nejrychleji, tak podle toho vypadá.

Každopádně je funkční.

HTML šablona je příšerný bastl. Byla v div layoutu, ale konverze, bohužel, nefungovala tak jak měla…takže pokud budete podle šablony zobrazovat fakturu na webu, bylo by záhodno ji přepsat ;)

Jinak si upravujte, opravujte, dodělávejte ,předělávejte, připomínkujte a navrhujte jak je libo. Jen mě prosím nekamenujte, děkuji ;)

Jen pro připomenutí, je potřeba knihovna mPDF pro generování PDFka z HTML.

Výsledná faktura v tomto provedení vypadá následovně.

Zdrojáky ke stažení na stránce Invoice controlrepozitáři komponent a pluginů. (InvoicePresenter.php je jen ukázkový)

Tak to je vše (snad jsem nic nezapomněl ;) Snad to k něčemu a někomu bude ;)

Editoval Warden (21. 5. 2009 11:28)

satano
Člen | 3
+
0
-

Fúúú. Komponenta OK. Ale nešlo by zdrojáky niekde zazipované zavesiť a na fórum len niečo zaujímavé/dôležité vypichnúť? To myslím teraz všeobecne do budúcnosti aj pre iné komponenty. Mať taký obrovský kus zdrojáku v browseri nieje bohviečo.

o5
Člen | 416
+
0
-

vsak Warden to rad da i do https://componette.org/search/?q=cs ..vid? :D

Editoval o5 (11. 5. 2009 23:07)

Ondřej Brejla
Člen | 746
+
0
-

Věřte tomu nebo ne, ale bylo to v plánu..oboje :) Akorát už nebyly síly. Takže nějaký archiv vytvořím a šoupnu ho sem a pokud se zadaří, tak i do extras to plácnu :)

Hotovo…link pro stažení je nahoře a v extras to je taktéž.

Editoval Warden (12. 5. 2009 18:22)

Ondřej Brejla
Člen | 746
+
0
-

Proběhlo trošku úprav…polymorfismus: InvoiceItem a InvoiceParticipant jsou nyní pod rozhraním + přidané nějaké metody a menší úpravy.

na1k
Člen | 288
+
0
-

Super komponenta, přesně tohle jsem vymýšlel a najednou mrknu do extras a on už to někdo udělal, díky za ni :)

Jenom dvě poznámečky : v přiloženém ukázkovém presenteru je stále funkce zřejmě z dřívější verze, teď nevím její název, ale je třeba ji nahradit funkcí setDateOfVatRevenueRecognition

a protože jsem sám potřeboval fakturu namísto zobrazení uložit do souboru, hledal jsem v (bohužel nedostatečně zdokumentovaném) kódu a tady je mé řešení, tak třeba někomu ušetří těch pět minut :)

<?php
$invoice->exportToPdf($mpdf, './faktura.pdf', 'F');
?>
Ondřej Brejla
Člen | 746
+
0
-

Hehe…on to někdo používá :) Máš pravdu, opravím.

To ukládání do souboru…to jsem nijak extra nepopisoval, protože to je v dokumentaci mPDF…možná bych tam mohl dopsat, že parametry exportToPdf jsou stejné jako parametry mPDF->Output()…to asi není jasné.

na1k
Člen | 288
+
0
-

Ano, používá a líbí se :) Nerad znova vynalézám kolo, obzvlášť když už je k dispozici takové pěkně kulaté jako to tvé ;)

S tou dokumentací je to tak, že ani mPDF nemá funkci řádně zdokumentovanou. Po rychlém nahlédnutí do jejího kódu je sice všechno zřejmé, ale zase ten luxus napovídání :))

A ještě mě napadla drobnost (kdyby jsi snad vydával další verzi, já už jsem si to ohnul) – forma úhrady nemusí být vždy „převodem“. Nejsem účetní, ale určitě je možnost platit i bezhotovostně nebo nějak jinak. Tudíž by bylo fajn mít setter i na tuhle vlastnost.

Ps. opravdu má být http://www.profitux.cz/skladiste/ veřejně přístupné? Já jsem se celkem bavil nad tím co všechno jsem tam našel :-D

Ondřej Brejla
Člen | 746
+
0
-

S tím setterem…to bylo jen o lenosti, vím o tom, ale bylo to dělané na míru systému, kde jiný způsob platby nebyl možný :-) Nicméně v příští verzi to pořeším.

Jinak to, že se komponenta používá, mi dělá jen radost :-)

PS: to být opravdu nemělo, přestože se to už moc nevyužívá, fatální bug…fixed…díky…viník je potrestán :)

Editoval Warden (10. 8. 2009 1:24)

ic
Člen | 430
+
0
-

Faktura je super… taky už jsem jednu sestavil a vytiskl, další ale budou následovat. → Moc dík.

Možná by bodla úprava kdy by se při nezadání některého ze 3 symbolů (konstantní, …) tento text vůbec nezobrazil… asi lepší než 0.

Není předtištěné razítko a podpis v rozporu se zákonem (nevím jakým)? Slyšel jsem že například Celní úřad doklady s předtištěným podpisem vrací a chce podpis vlastnoruční.

PS: Škoda toho skladu štěňata byla roztomilá

Ondřej Brejla
Člen | 746
+
0
-

Vytištěné razítko s podpisem je dle mých informací zcela v pořádku a v souladu se zákonem, jinak nikomu nic nebrání v tom, aby img tag odstranil ;-) Na VS, KS atd se v další revizi ještě podívám. Stejný problém jako s „platbou převodem“ – děláno přesně na míru, ale v tom by neměl být problém.

PS: štěňata mohu dodat i jinak :-D

sin
Člen | 82
+
0
-

Ahoj,
zatim jsem na to koukal jen okrajově ale dost se mi to líbí :)
jenom bych to potreboval rovnou odesilat na mail bez ukladani a nasel jsem ze kdyz dam u exportToPdf parametr ‚S‘ tak by to nejak melo jit ale nemate s tim nekdo zkusenosti ? Diky sin

Ondřej Brejla
Člen | 746
+
0
-

Metoda exportToPdf() má druhý a třetí parametr jako metoda Output() samotného mPdf, dokumentace k metodě.

sin
Člen | 82
+
0
-

At zkousim jakekoliv parametry output() nebo ukazku tak mi to vypise
Output has already been sent from the script – PDF file generation aborted.*
a nic mi to nikam neulozí ani neposle. Nevíte co s tim? Funguje to i na win nebo jenom na linuxu?

Ondřej Brejla
Člen | 746
+
0
-

Nic jiného než ukládání jsem nepotřeboval, takže ani nezkoušel. Každopádně nevidím důvod, proč by to na win nemělo fungovat.

Není jendodušší vygenerovat → do souboru → soubor poslat → soubor smazat? Pokud to nejde jednoduše tak jak chceš.

sin
Člen | 82
+
0
-

No ja mam problem ze mi nejde to vygenerovat ani do souboru. Ze mi to vypise jenom ten text co jsem psal ale soubor se nikam neulozil…

Ondřej Brejla
Člen | 746
+
0
-

Tak nejspíš posíláš na výstup něco ještě před vygenerováním…co BOM u UTF8 souborů? Nebo bílé znaky za ukončovací značkou PHP? Případně něco jiného? Nevím, proč by to jinak nešlo…jinak na win nemám možnost testovat…

sin
Člen | 82
+
0
-

Tak jsem musel mit nekde nejakou divnou chybu. cele jsem to smazal a nakopiroval znovu a ted uz to ukládá normálně na localhostu. Díky a já se s tím jdu seznamovat dál

Kenn
Člen | 110
+
0
-

Vyřešil někdo to posílání vygenerovaného PDF jako přílohu e-mailu klasickou cestou a ne uložení souboru/poslání/mazání? Používám Nette/Mail a pořád mi hlásí neexistující soubor.

Vygenerování s pouhým zobrazením funguje pěkně.

Ondřej Brejla
Člen | 746
+
0
-

Zkus si pohrát s parametrem 'S' u metody exportToPdf(), viz. dokumentace. Ale nezkoušel jsem, nepotřebuju mailovat.

despiq
Člen | 320
+
0
-

mam podezreni ze tak jak je ukazka na tenhle addon tak je papirove spatne

pri zaokrouhlovani konecne castky se musi ta cast o kterou bylo zaokrouhleno pricist nebo odecist z dane, takze celkovou cenu a dph by si mel kazdy spocitat sam jeste pred generovanim a pak uz by se u celkove ceny zaokrouhlovat nemelo

Ondřej Brejla
Člen | 746
+
0
-

Jak budu mít chvilku, mrknu na to.

jakubroz
Člen | 16
+
0
-

Zdravím,
mám problémek :)

Jakmile chci vygenerovat fakturu, hází mi nette chybu Filter CurlyBracketsFilter::invoke: Callback ‚CurlyBracketsFilter::invoke‘ is not callable, jak se to dá opravit?

Filtr jsem zkoušel registrovat v Basu, ale nešlo to.

Předem diky za pomoc.

Honza Marek
Člen | 1664
+
0
-

Ten filtr je přejmenovaný na LatteFilter a registruje se automaticky. Takže najdi, kde se pokouší v té komponentě registrovat a zruš to.

jakubroz
Člen | 16
+
0
-

Paráda, už to jde. Ale tedkon když to udělalo fakturu, tak nejde diakritika uvnitř, nějaká rada? :)

Ondřej Brejla
Člen | 746
+
0
-

Přesně jak píše Honza, já si to napíšu do todo ;-)

EDIT: jinak je to v metodě generate() třídy InvoiceControl

Editoval Ondřej Brejla (9. 4. 2010 20:43)

Ondřej Brejla
Člen | 746
+
0
-

jakubroz napsal(a):

Paráda, už to jde. Ale tedkon když to udělalo fakturu, tak nejde diakritika uvnitř, nějaká rada? :)

Zkus si pohrát s kódováním při vytváření objektu $mpdf = new mPDF('iso-8859-2');, zkus utf-8 (když jsem to zkoušel já, fungovalo pouze iso a to s utf-8 soubory), případně si zkontroluj, že máš soubory v utf-8.

despiq
Člen | 320
+
0
-

abych poopravil svuj drivejsi post, pri zaokrouhleni konecne castky se musi zaokrouhleni uvest na fakturu, dale take primo v ukazce
zbozi bez dph je 756.30 × 2 = 1512.60, avsak na fakture je napsano 1512,61
halere se mohou zdat nedulezite ale finacni urad na to tak nenahlizi, nechci komponentu hanit, jen mam sve spatne zkusenosti se spatnymi fakturami a tak bych chtel aby bylo vse v poradku

Ondřej Brejla
Člen | 746
+
0
-

To není žádné hanění, to je konstruktivní. To je v pořádku. Ta komponenta byla dělána podle fakturací ve firmě a podle systému, který faktury generoval. Já nejsem ekonom, takže v těchto detailech se nevyznám. Pokud by si mi poslal typovou fakturu se všemi náležitostmi, velice bych to ocenil. Díky.

despiq
Člen | 320
+
0
-

http://www.faktury.cz/…i-faktur.php
tady je to hezky popsano, ale stejne to neni dostatecne, az to znovu proberu s poradcem tak to sem napisu, at nebluduju

Honza Kuchař
Člen | 1662
+
0
-

K těm háčkům a čárkám: zkus to napasovat na PdfResponse. (doplňky) Tam s ěščřžýáíé nemám žádný problém.

michalh
Člen | 22
+
0
-

despiq napsal(a):

http://www.faktury.cz/…i-faktur.php
tady je to hezky popsano, ale stejne to neni dostatecne, az to znovu proberu s poradcem tak to sem napisu, at nebluduju

Náležitosti faktur popisuje také nový formát isdoc ve své hypertextové dokumentaci

jakubroz
Člen | 16
+
0
-

Nevíte jak nastavím do jakého adresáře se faktura uloží? Mě se pořád dává rovnou do document_root. :(

Předem díky.

iguana007
Člen | 970
+
0
-

jakubroz napsal(a):

Nevíte jak nastavím do jakého adresáře se faktura uloží? Mě se pořád dává rovnou do document_root. :(

Předem díky.

Tuto komponentu jsem ještě nepoužil, ale stačí si přečíst toto vlákno a hned u 6. příspěvku najdeš tento kód:

$invoice->exportToPdf($mpdf, './faktura.pdf', 'F');

z tohoto kousku kódu:

'./faktura.pdf'

je to imho jasné. Zkusil bych napsat třeba:

$invoice->exportToPdf($mpdf, './faktury/faktura.pdf', 'F');
jakubroz
Člen | 16
+
0
-

Ano, to jsem zkoušel. Tohle nejde ;)

despiq
Člen | 320
+
0
-

co to znamena nejde?

Ondřej Brejla
Člen | 746
+
0
-

jakubroz napsal(a):

Ano, to jsem zkoušel. Tohle nejde ;)

Což je zajímavé, mně ano :-) Práva k zápisu?

Lawondyss
Člen | 106
+
0
-

Mám problém s pamětí. Když zkusím fakturu vygenerovat, vyhodí mi to fatal error:

Allowed memory size of 16777216 bytes exhausted (tried to allocate 1572864 bytes)

Začalo to chodit až při navýšení paměti na 128MB :-(

Stáhl jsem si verzi z githubu a mPDF 4.5

Editoval Lawondyss (26. 8. 2010 22:25)

despiq
Člen | 320
+
0
-

to je celkem logicky, do 16MB se mi nevejde ani moje aplikace natož pak mpdf který je nekompromisně narocny, 128MB nic extra, ja mam nastaveno pres giga

wotaen
Člen | 82
+
0
-

despiq napsal(a):

to je celkem logicky, do 16MB se mi nevejde ani moje aplikace natož pak mpdf který je nekompromisně narocny, 128MB nic extra, ja mam nastaveno pres giga

Taky používám mPDF a taky to začne fungovat až při 512M…asi ten mpdf budu muset uplne odstranit z RobotLoadera a includovat to ručně…

rokerkony
Člen | 122
+
0
-

no já mám teda memory_limit=32M a jede to v pohodě… :-/

iguana007
Člen | 970
+
0
-

JJ taky se mi to nějak nezdá … používám mPDF u addonu PDFResponse a tolik paměti to nepotřebuje. mPDF už používám několik let i v jiných notNette projektech a nikdy problém nebyl. Je to hlavně o optimalizaci vstupních dat, která lezou do toho PDF parseru. Ale o tom více na mPDF webu, je tam řada tipů jak tu RAM ušetřit a zároveň zrychlit generování PDF.

Ondřej Brejla
Člen | 746
+
0
-

Přesně jak říkají kolegové…žádné problémy s tím nemám, hledej tedy problém někde u sebe…s tím ti moc nepomohu :-/

Ondřej Brejla
Člen | 746
+
0
-

wotaen napsal(a):

despiq napsal(a):

to je celkem logicky, do 16MB se mi nevejde ani moje aplikace natož pak mpdf který je nekompromisně narocny, 128MB nic extra, ja mam nastaveno pres giga

Taky používám mPDF a taky to začne fungovat až při 512M…asi ten mpdf budu muset uplne odstranit z RobotLoadera a includovat to ručně…

Pokud jde o spotřebu paměti při nahrávání RobotLoaderem…tak to je jasné, samozřejmě mám mPDF v netterobots.txt jako Disallow…ono je taky dost zbytečné ho nahrávat, když ho člověk používá opravdu jen občas…

wotaen
Člen | 82
+
0
-

jj, přesně tohle jsem měl na mysli

Ondřej Brejla napsal(a):

wotaen napsal(a):

despiq napsal(a):

to je celkem logicky, do 16MB se mi nevejde ani moje aplikace natož pak mpdf který je nekompromisně narocny, 128MB nic extra, ja mam nastaveno pres giga

Taky používám mPDF a taky to začne fungovat až při 512M…asi ten mpdf budu muset uplne odstranit z RobotLoadera a includovat to ručně…

Pokud jde o spotřebu paměti při nahrávání RobotLoaderem…tak to je jasné, samozřejmě mám mPDF v netterobots.txt jako Disallow…ono je taky dost zbytečné ho nahrávat, když ho člověk používá opravdu jen občas…

Lawondyss
Člen | 106
+
0
-

No já jsem mPDF zakázal nahrávat RobotLoaderem hned, jak jsem zjistil, že kvůli němu ani nerozjedu web. mPDF includuju ručně až ve chvíli, kdy chci generovat fakturu. A právě v tu chvíli to zkolabuje na nedostatek paměti. xdebug odkazuje na řádek uvnitř mpdf.php, ale kolem něj jsem nic zvláštního nenašel.

Zkusím se kouknout na jeho stránky. Pokud se mi to podaří vyřešit, dám to sem.

Těm co to běhá i s malou pamětí poprosím, aby napsali postup, jakým mPDF využívají. Díky.

iguana007
Člen | 970
+
0
-

Lawondyss napsal(a):
Těm co to běhá i s malou pamětí poprosím, aby napsali postup, jakým mPDF využívají. Díky.

mrkni sem: http://mpdf1.com/…al/index.php?…

rokerkony
Člen | 122
+
0
-

aha… tak to taky mám v netterobots.txt :-D a uz o tom ani nevim :-D

Lawondyss
Člen | 106
+
0
-

Tak na 16MB jsem se sice nedostal, ale 32MB už je dost s velikou rezervou. Optimalizoval jsem vstupní šablonu, ale hlavně jsem použil kompresi (compress.php ve stejném adresáři) skriptu mpdf.php. Nechal jsem pouze funkce pro tabulky a obrázky. Také načtení toho skriptu nechávám až na chvíli, kdy je potřeba.

Lawondyss
Člen | 106
+
0
-

Tak řeším další situaci. Když umístím generování výstupu faktury do actionXXX(), aplikace už se nedostane k renderXXX a web tak zůstane viset na stránce, odkud proběhlo přesměrování.
Napadlo mě, že řešením by bylo, kdyby se faktura otevřela do nového okna, původní by se přesměrovalo jak má, ale nepodařilo se mi toho dosáhnout. Máte někdo nějaký nápad?