-
Notifications
You must be signed in to change notification settings - Fork 0
/
Calc.php
137 lines (131 loc) · 3.79 KB
/
Calc.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php
/**
* M PHP Framework
*
* @package M PHP Framework
* @subpackage Calc
* @author Arnaud Sellenet <demental at github>
* @license http://opensource.org/licenses/lgpl-license.php GNU Lesser General Public License
* @version 0.1
* @link http://m4php5.googlecode.com/
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*/
/**
* Calculation related static methods
* (Mostly money)
*/
class Calc
{
/**
* Convert Tax free to VAT amount.
*
* @access public
* @static
* @param float $price Input price
* @param float $vat VAT Value
* @param bool $round Avoid .01 or .99
* @return Amount Amount included VAT
*/
public static function HT2TTC($price, $vat, $precision=2, $round = true)
{
if($vat==0) return number_format($price,$precision,'.','');
if($price==0) return number_format(0,$precision,'.','');
$vat=$vat>1?$vat/100:$vat;
$result = abs($price*(1+$vat));
$dir = $price/abs($price);
if($round) {
// We round the result to avoid 1cent difference
$mod = $result-floor($result);
if($mod==0) {
// no round
} elseif($result < 0.05) {
$result = 0;
} elseif(($mod > 0.48 && $mod < 0.50) || ($mod > 0.98) || ($mod > 0.50 && $mod < 0.52) || ($mod < 0.02)) {
$result=round($result*2)/2;
}
}
return number_format($dir*$result,$precision, '.', '');
}
// Alias
public static function addVAT($price,$vat)
{
return self::HT2TTC($price,$vat);
}
/**
* Convert VAT amount to Tax free amount.
*
* @access public
* @static
* @param float $price Input price
* @param float $vat VAT Value
* @return Amount Amount excluded VAT
*/
public static function TTC2HT($price,$vat)
{
$vat=$vat>1?$vat/100:$vat;
return number_format($price/(1+$vat),3, '.', '');
}
// Alias
public static function removeVAT($price,$vat)
{
return self::TTC2HT($price,$vat);
}
/**
* Return formatted amount with currency.
*
* @access public
* @static
* @param float $value Input price
* @param string $currency Currency
* @return string Formatted string
*/
public static function money($value,$currency='EUR')
{
return ($value>=0?'':'-').money_format('%i',abs($value));
}
/**
* Return ratio to calculate prorata amount from start date until month end date.
*
* @access public
* @static
* @param date $date Start date (eg: 20090301)
* @return float $ratio Ratio
*/
public static function prorata($date) {
$nbdays = date('t',strtotime($date));
$ratio = number_format(1-date('d',strtotime($date))/$nbdays,2);
return $ratio;
}
/**
* Returns an array of dates for a monthly schedule (like subscription)
* @param $startDate date('Y-m-d')
* @param int number of months
* @param bool (optional, default true) include start date in the schedule
*/
public static function monthlySchedule($startDate,$num,$inclstart = true)
{
$startTime = strtotime($startDate);
$startDay = date('d',$startTime);
$startMonth = date('m',$startTime);
$startYear = date('Y',$startTime);
$startoffset = $inclstart ? 0:1;
for($i=$startoffset;$i<$num;$i++) {
$dt[] = Date_Calc::addMonths($i,
$startDay,
$startMonth,
$startYear,
'%Y-%m-%d');
// Correcting not valid dates (e.g. february 30, june 31)
/* $tempdt = date('d',strtotime($dt[$i]));
$numd = date('t',strtotime($dt[$i]));
if($tempdt>$numd) {
$dt[$i] = date('Y',strtotime($dt[$i])).'-'.date('m',strtotime($dt[$i])).'-'.$numd;
}*/
}
return $dt;
}
}