Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Faktura - generator faktur do PDF w PHP, Biblioteka do generowania faktur PDF
cepa
post 5.02.2018, 20:01:16
Post #1





Grupa: Zarejestrowani
Postów: 125
Pomógł: 7
Dołączył: 27.01.2010

Ostrzeżenie: (0%)
-----


Hej,

pracuje aktualnie nad jednym projektem i jest w nim kawałek CRM w związku z tym potrzebowałem czegoś do masowego generowania faktur dla klientów.
Pomyślałem, że pewnie nie jestem pierwszy, który ma ten problem więc można by zrobić z tego osobną bibliotekę do używania w różnych projektach.

I tak oto jest:
https://github.com/loskoderos/faktura-php

Przykładowa faktura:
https://github.com/loskoderos/faktura-php/b..._invoice_pl.pdf


Używanie jest dość proste:
  1. use Faktura\Faktura;
  2.  
  3. $faktura = new Faktura();
  4.  
  5. $invoice = $faktura->newInvoice();
  6. $invoice->setInvoiceReference('INV/123/2018');
  7.  
  8. //...
  9.  
  10. $invoice->newItem()
  11. ->setDescription('Some item on the invoice')
  12. ->setUnitNetPrice(123)
  13. ;
  14.  
  15. //...
  16.  
  17. $faktura->setTemplate('path_to_your_invoice_template.phtml');
  18. $faktura->export($invoice, 'invoice.pdf');


Tutaj jest pełny przykład:
https://github.com/loskoderos/faktura-php/b..._invoice_pl.php

Projekt aktualnie bazuje na Xvfb i Wkhtmltopdf, które muszą być zainstalowane w systemie aby działało. Ponieważ, buduję aplikacje w Symfony to pewnie opakuje to w bundle i dodam support dla Twig'a, ale póki co to jest pierwsza beta.

Wrzucam tutaj, fajnie jakbyście zajrzeli w kod i ocenili co warto by zmienić. W założeniu to musi być w stanie generować fakture dla dowolnego projektu i wspierać model faktury z dowolnego kraju.

Z góry dzięki za feedback.


--------------------
Go to the top of the page
+Quote Post
pyro
post 5.02.2018, 20:43:48
Post #2





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Nie przyglądałem się bliżej, ale jestem przekonany, że ta klasa ma za dużo odpowiedzialności. Fabryka, renderer i exporter w jednym. Rozdziel to na klasy posiadające pojedynczą odpowiedzialność i przy okazji skorzystaj z interfejsów.

Przy okazji też unikaj takich myków:

  1. public function __construct()
  2. {
  3. $this
  4. ->setRenderer(new PhtmlRenderer())
  5. ->setExporter(new WkhtmltopdfExporter())
  6. ;
  7. }


W ten sposób jesteś uzależniony od tych konkretnych implementacji. (Co jak będziesz chciał eksportować do docx, itp?). Użyj Dependency Injection z typowaniem za pomocą interfejsów.


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
cepa
post 5.02.2018, 20:58:51
Post #3





Grupa: Zarejestrowani
Postów: 125
Pomógł: 7
Dołączył: 27.01.2010

Ostrzeżenie: (0%)
-----


E, ale dokładnie po to zrobiłem setRenderer i setExporter żeby móc zmienic renderer lub exporter, są też interfejsy do tego. Generalnie mógłbym zainicjować konstruktor lub całkowicie pozbyć sie fabryki, ale ten sposób wydał mi się najprostszy do używania.


--------------------
Go to the top of the page
+Quote Post
pyro
post 5.02.2018, 23:31:24
Post #4





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Cytat(cepa @ 5.02.2018, 20:58:51 ) *
E, ale dokładnie po to zrobiłem setRenderer i setExporter żeby móc zmienic renderer lub exporter, są też interfejsy do tego. Generalnie mógłbym zainicjować konstruktor lub całkowicie pozbyć sie fabryki, ale ten sposób wydał mi się najprostszy do używania.


Widzę, że interfejsy rzeczywiście są, więc nie dostrzegam sensu tworzyć w konstruktorze konkretnych instancji obiektów, które można wstrzyknąć: https://pl.wikipedia.org/wiki/Wstrzykiwanie...C5%BCno%C5%9Bci

Na drugą część odpowiem tylko tyle, że Singletonów też się łatwo używa, a God classy łatwo rozszerza zanim się nimi staną. https://laracasts.com/series/solid-principles-in-php

Przy okazji zajrzałem teraz do testów, a tam na początku pliku klasa, która ma służyć jako mock... zamiast tego zrób po prostu mocka. Jeśli chodzi o same testy to widać, że coś jest nie tak z konstrukcją, bo jest za dużo efektów ubocznych. Przy okazji kątem oka zauważyłem też, że są odniesienia typu:
  1. $this->assertFalse(is_file($filename));
. Można to zastąpić https://phpunit.de/manual/current/en/append...ssertFileExists

// ADD

PHPDoc tylko dla wybrańców, np. https://github.com/loskoderos/faktura-php/b...ntity/Party.php


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.02.2018 - 07:06