init() ->setIdTrasmittente() //order of execution matters. ->setDatiTrasmissione() ->setIdFiscaleIVA() ->setAnagrafica() ->setDatiAnagrafici() ->setCedentePrestatore() ->setClientDetails() ->setDatiGeneraliDocumento() ->setDatiGenerali() ->setLineItems() ->setDettaglioPagamento() ->setFatturaElettronica(); } public function getFatturaElettronica(): FatturaElettronica { return $this->FatturaElettronica; } private function setDatiTrasmissione(): self { $this->DatiTrasmissione->FormatoTrasmissione = "FPR12"; $this->DatiTrasmissione->CodiceDestinatario = $this->invoice->client->routing_id; $this->DatiTrasmissione->ProgressivoInvio = $this->invoice->number; $this->DatiTrasmissione->IdTrasmittente = $this->IdTrasmittente; $this->FatturaElettronicaHeader->DatiTrasmissione = $this->DatiTrasmissione; return $this; } private function setIdTrasmittente():self { $this->IdTrasmittente->IdPaese = $this->invoice->company->country()->iso_3166_2; $this->IdTrasmittente->IdCodice = $this->invoice->company->settings->vat_number; return $this; } private function setCedentePrestatore():self { $this->CedentePrestatore->DatiAnagrafici = $this->DatiAnagrafici; $sede = new Sede; $sede->Indirizzo = $this->invoice->company->settings->address1; $sede->CAP = (int)$this->invoice->company->settings->postal_code; $sede->Comune = $this->invoice->company->settings->city; $sede->Provincia = $this->invoice->company->settings->state; $sede->Nazione = $this->invoice->company->country()->iso_3166_2; $this->CedentePrestatore->Sede = $sede; $this->FatturaElettronicaHeader->CedentePrestatore = $this->CedentePrestatore; return $this; } private function setDatiAnagrafici():self { $this->DatiAnagrafici->RegimeFiscale = "RF01"; $this->DatiAnagrafici->Anagrafica = $this->Anagrafica; $this->DatiAnagrafici->IdFiscaleIVA = $this->IdFiscaleIVA; return $this; } private function setClientDetails():self { $datiAnagrafici = new DatiAnagrafici(); $anagrafica = new Anagrafica(); $anagrafica->Denominazione = $this->invoice->client->present()->name(); $datiAnagrafici->Anagrafica = $anagrafica; $sede = new Sede; $sede->Indirizzo = $this->invoice->client->address1; $sede->CAP = (int)$this->invoice->client->postal_code; $sede->Comune = $this->invoice->client->city; $sede->Provincia = $this->invoice->client->state; $sede->Nazione = $this->invoice->client->country->iso_3166_2; $cessionarioCommittente = new CessionarioCommittente; $cessionarioCommittente->DatiAnagrafici = $datiAnagrafici; $cessionarioCommittente->Sede = $sede; $this->FatturaElettronicaHeader->CessionarioCommittente = $cessionarioCommittente; return $this; } private function setIdFiscaleIVA():self { $this->IdFiscaleIVA->IdPaese = $this->invoice->company->country()->iso_3166_2; $this->IdFiscaleIVA->IdCodice = $this->invoice->company->settings->vat_number; return $this; } //this is a choice, need to switch based on values here. private function setAnagrafica():self { $this->Anagrafica->Denominazione = $this->invoice->company->present()->name(); return $this; } private function setDatiGeneraliDocumento():self { $this->DatiGeneraliDocumento->TipoDocumento = "TD01"; $this->DatiGeneraliDocumento->Divisa = $this->invoice->client->currency()->code; $this->DatiGeneraliDocumento->Data = new \DateTime($this->invoice->date); $this->DatiGeneraliDocumento->Numero = $this->invoice->number; $this->DatiGeneraliDocumento->Causale[] = substr($this->invoice->public_notes ?? '',0, 200); //unsure.. return $this; } private function setDatiGenerali():self { $this->DatiGenerali->DatiGeneraliDocumento = $this->DatiGeneraliDocumento; $this->FatturaElettronicaBody->DatiGenerali = $this->DatiGenerali; return $this; } private function setDettaglioPagamento():self { $this->DettaglioPagamento->ModalitaPagamento = "MP01"; //String $this->DettaglioPagamento->DataScadenzaPagamento = new \DateTime($this->invoice->due_date ?? $this->invoice->date); $this->DettaglioPagamento->ImportoPagamento = (string) sprintf('%0.2f', $this->invoice->balance); $DatiPagamento = new DatiPagamento; $DatiPagamento->CondizioniPagamento = "TP02"; $DatiPagamento->DettaglioPagamento[] = $this->DettaglioPagamento; $this->FatturaElettronicaBody->DatiPagamento[] = $DatiPagamento; return $this; } private function setLineItems(): self { $datiBeniServizi = new DatiBeniServizi(); $tax_rate_level = 0; //line items foreach ($this->invoice->line_items as $key => $item) { $numero = $key + 1; $dettaglioLinee = new DettaglioLinee; $dettaglioLinee->NumeroLinea = "{$numero}"; $dettaglioLinee->Descrizione = $item->notes ?? 'Descrizione'; $dettaglioLinee->Quantita = sprintf('%0.2f', $item->quantity); $dettaglioLinee->PrezzoUnitario = sprintf('%0.2f', $item->cost); $dettaglioLinee->PrezzoTotale = sprintf('%0.2f', $item->line_total); $dettaglioLinee->AliquotaIVA = sprintf('%0.2f', $item->tax_rate1); $datiBeniServizi->DettaglioLinee[] = $dettaglioLinee; if ($item->tax_rate1 > $tax_rate_level) { $tax_rate_level = sprintf('%0.2f', $item->tax_rate1); } } //totals if($this->invoice->tax_rate1 > $tax_rate_level) { $tax_rate_level = sprintf('%0.2f', $this->invoice->tax_rate1); } $calc = $this->invoice->calc(); $subtotal = sprintf('%0.2f', $calc->getSubTotal()); $taxes = sprintf('%0.2f', $calc->getTotalTaxes()); $datiRiepilogo = new DatiRiepilogo; $datiRiepilogo->AliquotaIVA = "{$tax_rate_level}"; $datiRiepilogo->ImponibileImporto = "{$subtotal}"; $datiRiepilogo->Imposta = "{$taxes}"; $datiRiepilogo->EsigibilitaIVA = "I"; $datiBeniServizi->DatiRiepilogo[] = $datiRiepilogo; $this->FatturaElettronicaBody->DatiBeniServizi = $datiBeniServizi; return $this; } private function setFatturaElettronica(): self { $this->FatturaElettronica->FatturaElettronicaBody[] = $this->FatturaElettronicaBody; $this->FatturaElettronica->FatturaElettronicaHeader = $this->FatturaElettronicaHeader; return $this; } private function init(): self { $this->FatturaElettronica = new FatturaElettronica; $this->FatturaElettronicaBody = new FatturaElettronicaBody; $this->FatturaElettronicaHeader = new FatturaElettronicaHeader; $this->DatiTrasmissione = new DatiTrasmissione; $this->IdTrasmittente = new IdTrasmittente; $this->CedentePrestatore = new CedentePrestatore; $this->DatiAnagrafici = new DatiAnagrafici; $this->IdFiscaleIVA = new IdFiscaleIVA; $this->Anagrafica = new Anagrafica; $this->DatiGeneraliDocumento = new DatiGeneraliDocumento; $this->DatiGenerali = new DatiGenerali; $this->DettaglioPagamento = new DettaglioPagamento; return $this; } }