<?php
/* $Id: expiry_calc.php,v 1.3 2010/01/01 14:15:19 devincen Exp $
--------------------------------------------------------------------------
Gazie - Gestione Azienda
Copyright (C) 2004-2010 - Antonio De Vincentiis Montesilvano (PE)
(www.devincentiis.it)
<http://gazie.sourceforge.net>
--------------------------------------------------------------------------
Questo programma e` free software; e` lecito redistribuirlo e/o
modificarlo secondo i termini della Licenza Pubblica Generica GNU
come e` pubblicata dalla Free Software Foundation; o la versione 2
della licenza o (a propria scelta) una versione successiva.
Questo programma e` distribuito nella speranza che sia utile, ma
SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di
NEGOZIABILITA` o di APPLICABILITA` PER UN PARTICOLARE SCOPO. Si
veda la Licenza Pubblica Generica GNU per avere maggiori dettagli.
Ognuno dovrebbe avere ricevuto una copia della Licenza Pubblica
Generica GNU insieme a questo programma; in caso contrario, si
scriva alla Free Software Foundation, Inc., 59
Temple Place, Suite 330, Boston, MA 02111-1307 USA Stati Uniti.
--------------------------------------------------------------------------
*/
class Expiry {
public function CalcExpiry($amount,$date,$effect='D',$start_day=0,$expiry_number=1,$periodicity='M',$foll_month=0,$fix_day=0)
{
/* Questa funzione serve per il calcolo delle scadenze.
Restituisce una matrice (array) bidimensionale dove
sull'indice 'amount' c'è l'importo e
sull'indice 'date' c'è la data di scadenza.
$effect può avere i valori D,G,F
$start_day sono i giorni di decorrenza della prima scadenza
$expiry_number è il numero di rate
$periodicity è la periodicità in mesi
$foll_month è il mese da saltare (es.agosto)
$fix_day è il giorno fisso di scadenza quando $effect vale 'G'
*/
// definisco le variabili comuni
$this->year=intval(substr($date,0,4));
$this->month=intval(substr($date,5,2));
$this->day=intval(substr($date,8,2));
$this->effect=strtoupper(substr($effect,0,1));
$this->start_day=intval($start_day);
$this->expiry_number=intval($expiry_number);
$this->periodicity=strtoupper(substr($periodicity,0,1));
$this->foll_month=intval($foll_month);
$this->fix_day=intval($fix_day);
// variabili di flusso
$this->ctrl_day=$this->day;
$this->ctrl_month=$this->month;
$this->ctrl_year=$this->year;
// main
$this->expiry=array();
$partial=0.00;
for ($c=1; $c<=$this->expiry_number; $c++) {
if ($c==$this->expiry_number && $this->expiry_number==1) { // rata unica
$this->expiry[$c]['amount']= number_format($amount,2,'.','');
} elseif ($c==$this->expiry_number && $this->expiry_number>1) { // ultima rata
$this->expiry[$c]['amount']= number_format(($amount-$partial),2,'.','');
} elseif ($c<$this->expiry_number && $this->expiry_number>1) { // rate intermedie e prima
$this->expiry[$c]['amount']= number_format(($amount/$this->expiry_number),2,'.','');
}
$partial+=$this->expiry[$c]['amount'];
// chiamo la funzione per il calcolo della data
$this->expiry[$c]['date']= $this->_Date($c);
}
// end main
return $this->expiry;
}
// calcolo date
protected function _Date($c) {
if ($c==1) { // alla prima scadenza si devono aggiungere i giorni di decorrenza
switch($this->effect) {
case "D": //caso in cui la scadenza fa riferimento alla data della fattura
$uts = mktime(0,0,0,$this->month,$this->day+$this->start_day,$this->year);
$this->ctrl_day = strftime("%d",$uts);
$this->ctrl_month = strftime("%m",$uts);
$this->ctrl_year = strftime("%Y",$uts);
break;
case "G": //caso in cui la scadenza fa riferimento ad un giorno fisso impostato sul relativo campo
$uts = mktime(0,0,0,$this->month,$this->day+$this->start_day,$this->year);
$this->ctrl_day = strftime("%d",$uts);
$this->ctrl_month = strftime("%m",$uts);
$this->ctrl_year = strftime("%Y",$uts);
if ($this->fix_day<$this->ctrl_day) { // salto un mese se va a cadere in un giorno precedente
$this->ctrl_month++;
}
$uts = mktime(0,0,0,$this->ctrl_month,$this->fix_day,$this->ctrl_year);
$this->ctrl_day = strftime("%d",$uts);
$this->ctrl_month = strftime("%m",$uts);
$this->ctrl_year = strftime("%Y",$uts);
break;
case "F": //caso in cui la scadenza deve far riferimento al fine mese rispetto alla data della fattura
// prima porto il riferimento al primo finemese
$uts = mktime(0,0,0,$this->ctrl_month+1,0,$this->ctrl_year);
$this->ctrl_day = strftime("%d",$uts);
$this->ctrl_month = strftime("%m",$uts);
$this->ctrl_year = strftime("%Y",$uts);
// poi aumento dei giorni di decorrenza (-2 per compensare febbraio)
$uts = mktime(0,0,0,$this->ctrl_month,$this->ctrl_day+$this->start_day-2,$this->ctrl_year);
$this->ctrl_month = strftime("%m",$uts);
$this->ctrl_year = strftime("%Y",$uts);
// quindi riporto a fine mese
$uts = mktime(0,0,0,$this->ctrl_month+1,0,$this->ctrl_year);
$this->ctrl_day = strftime("%d",$uts);
$this->ctrl_month = strftime("%m",$uts);
$this->ctrl_year = strftime("%Y",$uts);
if ($this->fix_day>0){ // eventualmente vado al giorno successivo
$uts = mktime(0,0,0,$this->ctrl_month+1,$this->fix_day,$this->ctrl_year);
$this->ctrl_day = strftime("%d",$uts);
$this->ctrl_month = strftime("%m",$uts);
$this->ctrl_year = strftime("%Y",$uts);
}
break;
}
if ($this->foll_month>0 && $this->foll_month==$this->ctrl_month) {
$this->ctrl_month++;
}
} else { // le scadenze successive
switch($this->periodicity) {
case "Q": // quindicinale
if ($c%2==0) {
$n_m=0;
$this->ctrl_day += 15;
} else {
$n_m=1;
$this->ctrl_day -= 15;
}
break;
case "M":$n_m= 1;break; // mensile
case "B":$n_m= 2;break; // bimestrale
case "T":$n_m= 3;break; // trimestrale
case "U":$n_m= 4;break; // quadrimestrale
case "E":$n_m= 6;break; // semestrale
case "A":$n_m=12;break; // annuale
}
$this->ctrl_month+=$n_m;
if ($this->effect=='F' && $this->periodicity!='Q' && $this->fix_day==0) { // quando si deve andare a fine mese
$this->ctrl_day=0;
$this->ctrl_month++;
}
$uts = mktime(0,0,0,$this->ctrl_month,$this->ctrl_day,$this->ctrl_year);
$this->ctrl_day = strftime("%d",$uts);
$this->ctrl_month = strftime("%m",$uts);
$this->ctrl_year = strftime("%Y",$uts);
if ($this->foll_month>0 && $this->foll_month==$this->ctrl_month) {
$this->ctrl_month++;
}
}
$uts = mktime(0,0,0,$this->ctrl_month,$this->ctrl_day,$this->ctrl_year);
$this->ctrl_day = strftime("%d",$uts);
$this->ctrl_month = strftime("%m",$uts);
$this->ctrl_year = strftime("%Y",$uts);
return strftime("%Y-%m-%d",mktime(0,0,0,$this->ctrl_month,$this->ctrl_day,$this->ctrl_year));
}
// fine calcolo date
}
?>