Generátor faktur – Nette šablony + mPDF
- Ondřej Brejla
- Člen | 746
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 control v repozitář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)
- o5
- Člen | 416
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
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
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
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
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
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
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
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
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
- Ondřej Brejla
- Člen | 746
Metoda exportToPdf()
má druhý a třetí parametr jako metoda
Output()
samotného mPdf, dokumentace k metodě.
- Ondřej Brejla
- Člen | 746
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š.
- Ondřej Brejla
- Člen | 746
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…
- Ondřej Brejla
- Člen | 746
Zkus si pohrát s parametrem 'S'
u metody
exportToPdf()
, viz. dokumentace. Ale nezkoušel jsem, nepotřebuju mailovat.
- despiq
- Člen | 320
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
- Honza Marek
- Člen | 1664
Ten filtr je přejmenovaný na LatteFilter a registruje se automaticky. Takže najdi, kde se pokouší v té komponentě registrovat a zruš to.
- Ondřej Brejla
- Člen | 746
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
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
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
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
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
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
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
- iguana007
- Člen | 970
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');
- Ondřej Brejla
- Člen | 746
jakubroz napsal(a):
Ano, to jsem zkoušel. Tohle nejde ;)
Což je zajímavé, mně ano :-) Práva k zápisu?
- Lawondyss
- Člen | 106
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)
- wotaen
- Člen | 82
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ě…
- iguana007
- Člen | 970
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
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
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
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 vnetterobots.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
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
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?…
- Lawondyss
- Člen | 106
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
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?