<?php
classDocument{private$code;
private$date;
private$costumer;
private$total;
private$vat;
private$imp;
private$i;
public$items;
public$template;
public function__construct($code,$date,$costumer){
$this->i=0;
$this->template='document.tpl.php';
$this->code=$code;
$this->date=$date;
$this->costumer=$costumer;
$this->items=array();
}
public functionaddItem($title,$code,$qnt,$price,$nVat){
$this->i++;
$item=newItem($code, $title, $qnt, $price, $nVat, $this->i, $this);
$this->items[$this->i] =$item;
$this->totaliDocumento();
return$item;
}
public functionremoveItem($item){
if(isset($this->items[$item->getKey()])){
unset($this->items[$item->getKey()]);
$this->totaliDocumento();
}
}
public functionchangeQnt($item,$newQnt){
if(isset($this->items[$item->getKey()])){
$item->changeQnt($newQnt);
$this->totaliDocumento();
}
}
public functiontotaliDocumento(){
$this->total=0;
$this->vat=0;
$this->imp=0;
foreach($this->itemsAS$item){
$this->total+=$item->getImporto('totale');
$this->imp+=$item->getImporto('imponibile');
$this->vat+=$item->getImporto('iva');
}
}
public functionattr($attr){
return$this->$attr;
}
public functionoutput(){
$document=$this;
include($this->template);
}
public functionoutputItem($item){
include($item->template);
}
}
classItem Document{private$qnt;
private$prezzo;
private$cIva;
public$titolo;
public$codice;
public$template;
/* * rayKey e' la chiave dell'array items * dell'istanza di ogni Item. * Serve per tenerne la tracciabilita' * (per rimuovere gli oggetti o modificarli) */private$rayKey;
private$documento;
private$totale;
private$imponibile;
private$iva;
public function__construct($codice,$titolo,$qnt,$prezzo,$cIva,$key,$documento){
$this->template='item.tpl.php';
$this->documento=$documento;
$this->rayKey=$key;
$this->codice=$codice;
$this->titolo=$titolo;
$this->qnt=$qnt;
$this->prezzo=$prezzo;
$this->cIva=$cIva;
//calcolo i totali$this->calcolaTotali();
}
public functiongetKey(){
return$this->rayKey;
}
/* *Diciamo che voglio avere la certezza che *aggiornando la quantita' o il prezzo *dell'oggetto, i totali sono sempre aggiornati. *Quindi qnt e prezzo sono privati, per aggiornarli *bisogna utilizzare la relativa funzione che *aggiorna anche i totali dell'oggetto. */public functionaggiornaQnt($qnt){
$this->qnt=$qnt;
$this->calcolaTotali();
}
public functionaggiornaPrezzo($prezzo){
$this->prezzo=$prezzo;
$this->calcolaTotali();
}
private functioncalcolaTotali(){
$this->imponibile=$this->qnt*$this->prezzo;
$this->iva= ($this->imponibile*$this->cIva) /100;
$this->totale=$this->imponibile+$this->iva;
$this->documento->totaliDocumento();
}
/* * Anche i totali non sono modificabili * direttamente ma dipendono da altre * proprieta' dell'oggetto. * L'unico modo per ottenerli al di fuori * della classe, e' quindi questa funzione */public functiongetImporto($importo='totale'){
switch($importo){
case'totale':
return$this->totale;
break;
case'imponibile':
return$this->imponibile;
break;
case'iva':
return$this->iva;
break;
}
}
/* * questo metodo serve solo per recuperare dall'esterno * le variabli protette */public functionattr($attr){
return$this->$attr;
}
public functionoutput(){
$item=$this;
include($this->template);
}
}
?>