Generování faktur Enciovni

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

Zprovoznila jsem generátor faktur OndrejBrejla/Enciovni. Je funkční, ale jen když generuji jednu fakturu, nevím, jak na to, abych mohla vygenerovat více faktur v cyklu po sobě. Pomůžete mi nasměrovat?

Když udělám toto, tak se mi sice vygeneruje více faktur s odlišným číslem faktury, ale s daty, které patří první faktuře v cyklu.

V presenteru:

foreach ($data_order as $data){
			$mpdf=new mPDF('utf-8');
            $fa_name ='faktura-'. date('Y') .'00' .$data->id.'.pdf';
            $this["eciovni"]->exportToPdf($mpdf, 'files/faktury/'.$fa_name, 'F');
}


 protected function createComponentEciovni() {

      var_dump($this->data_order['prodavajici']['name']); //tady jsou data správně, v každém průchodu cyklem jiná a ty která k dané faktuře patří...
        $dateNow = new \DateTime();
        $dateExp = new \DateTime();
        $dateExp->modify('+14 days');
        $variableSymbol = date('Y') .'00' .$this->data_order['faktura']['id'];

        $supplierBuilder = new ParticipantBuilder($this->data_order['prodavajici']['name'], $this->data_order['prodavajici']['ulice'], $this->data_order['prodavajici']['cp'], $this->data_order['prodavajici']['mesto'], $this->data_order['prodavajici']['psc']);
        $supplier = $supplierBuilder->setIn($this->data_order['prodavajici']['ic'])->setTin($this->data_order['prodavajici']['dic'])->setAccountNumber($this->data_order['prodavajici']['ucet'])->build();
        $customerBuilder = new ParticipantBuilder($this->data_order['customer']['name'], $this->data_order['customer']['ulice'], $this->data_order['customer']['cp'], $this->data_order['customer']['mesto'], $this->data_order['customer']['psc']);
        $customer = $customerBuilder->setAccountNumber('')->build();

       foreach ($this->data_order['products'] as $product){
           $items[] = new ItemImpl( $product->name, $product->quantity, $product->price, TaxImpl::fromPercent($product->dph));
       }

        $dataBuilder = new DataBuilder($variableSymbol, 'Faktura - faktura číslo', $supplier, $customer, $dateExp, $dateNow, $items);
        $dataBuilder->setVariableSymbol($variableSymbol)->setDateOfVatRevenueRecognition($dateNow);
        $data = $dataBuilder->build();

        return new Eciovni($data);
    }

Děkuji

Oli
Člen | 1215
+
0
-

Sice tenhle doplněk neznám, ale hledal bych problém v tom, že se to vše provádí nad jednou instancí Eciovni. Zkus použít multiplier, který je schopen udělat víc instancí createComponentEciovni.

CZechBoY
Člen | 3608
+
0
-

Je potřeba mít to v komponentě?
Pokud by se to přepsalo do obyčejné funkce tak si myslím že to bude ok.

foreach ($data_order as $data) {
	$mpdf = new mPDF('utf-8');
    $fa_name = 'faktura-' . date('Y') . '00' .$data->id . '.pdf';
    $this->createPdf()->exportToPdf($mpdf, 'files/faktury/' . $fa_name, 'F');
}


    private function createPdf()
    {
        $dateNow = new \DateTime();
        $dateExp = new \DateTime();
        $dateExp->modify('+14 days');
        $variableSymbol = date('Y') .'00' .$this->data_order['faktura']['id'];

        $supplierBuilder = new ParticipantBuilder($this->data_order['prodavajici']['name'], $this->data_order['prodavajici']['ulice'], $this->data_order['prodavajici']['cp'], $this->data_order['prodavajici']['mesto'], $this->data_order['prodavajici']['psc']);
        $supplier = $supplierBuilder->setIn($this->data_order['prodavajici']['ic'])->setTin($this->data_order['prodavajici']['dic'])->setAccountNumber($this->data_order['prodavajici']['ucet'])->build();
        $customerBuilder = new ParticipantBuilder($this->data_order['customer']['name'], $this->data_order['customer']['ulice'], $this->data_order['customer']['cp'], $this->data_order['customer']['mesto'], $this->data_order['customer']['psc']);
        $customer = $customerBuilder->setAccountNumber('')->build();

        foreach ($this->data_order['products'] as $product){
            $items[] = new ItemImpl( $product->name, $product->quantity, $product->price, TaxImpl::fromPercent($product->dph));
        }

        $dataBuilder = new DataBuilder($variableSymbol, 'Faktura - faktura číslo', $supplier, $customer, $dateExp, $dateNow, $items);
        $dataBuilder->setVariableSymbol($variableSymbol)->setDateOfVatRevenueRecognition($dateNow);
        $data = $dataBuilder->build();

        return new Eciovni($data);
    }

Editoval CZechBoY (28. 9. 2016 20:18)

iru
Člen | 110
+
0
-

CZechBoY napsal(a):

Je potřeba mít to v komponentě?
Pokud by se to přepsalo do obyčejné funkce tak si myslím že to bude ok.

když to takhle udělám, tak mi to vyhazuje chybovou hlášku:

Component '' is not attached to ‚Nette\Application\UI\Presenter‘

jenom v té komponentě to funguje

iru
Člen | 110
+
0
-

Oli napsal(a):

Sice tenhle doplněk neznám, ale hledal bych problém v tom, že se to vše provádí nad jednou instancí Eciovni. Zkus použít multiplier, který je schopen udělat víc instancí createComponentEciovni.

zkusila jsem použít multiplier, ale hlásí chybu: Call to undefined method Nette\Application\UI\Multiplier::exportToPdf()

 protected function createComponentEciovni() {

       return new Multiplier(function () {


...............

  return new Eciovni($data);
       });
    }

tak už jsem na to přišla. Kdyby to někdo potřeboval, tak to vypadá takto:

  protected function createComponentEciovni() {

       $id = $this->data_order['faktura']['id'];
       return new Multiplier(function ($id) {

...........


        return new Eciovni($data);
       });
    }

a volání komponenty:

$this["eciovni-$id"]->exportToPdf($mpdf, 'files/faktury/'.$fa_name, 'F');

Děkuji vám všem za pomoc :-)

Editoval iru (28. 9. 2016 21:17)

Oli
Člen | 1215
+
0
-

Protože jsi to nepoužila dobře :-) Ty jsi zavolala tu komponentu, ve které je ale multiplier. Takže se snažíš zavolat metodu exportToPdf nad multiplierem. Ten ale takovou metodu nemá. Musíš jít víc do hloubky. Správně by mělo být něco takového (doufám):

protected function createComponentEciovni() {
	return new Multiplier(function ($id) { // Tady to $id možná nemusí být, nevím
		// ...............
		return new Eciovni($data);
	});
}
foreach ($data_order as $id => $data){
	$mpdf=new mPDF('utf-8');
	$fa_name ='faktura-'. date('Y') .'00' .$data->id.'.pdf';
	$this["eciovni-$id"]->exportToPdf($mpdf, 'files/faktury/'.$fa_name, 'F');
	// Možná je ten zápis v presenteru pro vnořenou komponentu takhle $this['eciovni'][$id], to si z hlavy nepamatuju :)
}
iru
Člen | 110
+
0
-

Oli napsal(a):

Protože jsi to nepoužila dobře :-) Ty jsi zavolala tu komponentu, ve které je ale multiplier. Takže se snažíš zavolat metodu exportToPdf nad multiplierem. Ten ale takovou metodu nemá. Musíš jít víc do hloubky. Správně by mělo být něco takového (doufám):

protected function createComponentEciovni() {
	return new Multiplier(function ($id) { // Tady to $id možná nemusí být, nevím
		// ...............
		return new Eciovni($data);
	});
}
foreach ($data_order as $id => $data){
	$mpdf=new mPDF('utf-8');
	$fa_name ='faktura-'. date('Y') .'00' .$data->id.'.pdf';
	$this["eciovni-$id"]->exportToPdf($mpdf, 'files/faktury/'.$fa_name, 'F');
	// Možná je ten zápis v presenteru pro vnořenou komponentu takhle $this['eciovni'][$id], to si z hlavy nepamatuju :)
}

máš pravdu… funguje to s $id i bez … return new Multiplier(function ($id) {

Shaman
Člen | 2
+
0
-

Taky jsem se snažil zprovoznit generátor faktur OndrejBrejla/Enciovni. Nakonec jsem si udělal vlastní fork, protože aktuální (4 roky stará) verze nefungovala s novým mPDF (6.1) a php (7.0). Přidal jsem README.md s popisem mého použití. Třeba to někomu pomůže.

https://github.com/…goci/Eciovni

V kostce – udělal jsem servisu, která injectuje templateFactory a linkGenerator. Pak odkudkoliv zavolám generování faktury. Snad to někomu ušetří čas.