php 账单生成

Posted gaogaoxingxing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 账单生成相关的知识,希望对你有一定的参考价值。

  1 <?php
  2 
  3 
  4 $start = ‘2019-01-30‘;
  5 $end = ‘2020-01-29‘;
  6 
  7 
  8 // 月账单
  9 function billMonth($start, $end) 
 10     $m = [];
 11     do 
 12         $mend = getNextMonthEnd($start);
 13         if (strtotime($mend) > strtotime($end)) 
 14             $mend = $end;
 15         
 16         $m[] = [
 17             ‘s‘ => preDate($start),
 18             ‘e‘ => $mend
 19         ];
 20         $start = date(‘Y-m-d‘, strtotime($mend) + 3600*24);
 21     
 22     while(strtotime($mend) < strtotime($end));
 23     return $m;
 24 
 25 
 26 //季度账单
 27 function billQuarter($start, $end) 
 28     $bill = billMonth($start, $end);
 29     
 30 
 31 
 32 
 33 //获得下个月年,月
 34 function getNextDate($year, $m) 
 35     if ($m == 12) 
 36         $m = 1;
 37         $year += 1;
 38      else 
 39         $m++;
 40     
 41     return [$year, $m];
 42 
 43 
 44 //获取月份的最后一天
 45 function getMonthLastDay($year, $m) 
 46     $t = date(‘t‘, strtotime($year .‘-‘. $m.‘-01‘));
 47     return $t;
 48 
 49 
 50 //获取一个账单结束日
 51 function getNextMonthEnd($start) 
 52     //获取开始年
 53     $year = date(‘Y‘, strtotime($start));
 54     //获取开始日
 55     $d = date(‘j‘, strtotime($start));
 56     //获取开始月
 57     $m = date(‘n‘, strtotime($start));
 58     
 59     if ($d == 1)  //如果是第一天,自然月处理
 60         $t = getMonthLastDay($year, $m);
 61         return sprintf("%s-%s-%s", $year, preNum($m), preNum($t));
 62      else 
 63         //判断下个月最大天数
 64         list($year, $m) = getNextDate($year, $m);
 65         $nextMonthLastDay = getMonthLastDay($year, $m);
 66         if ($nextMonthLastDay>$d)  //如果下个月最后一天 大于开始时间的日期, 说明可以做一个月账期
 67             return sprintf("%s-%s-%s", $year, preNum($m), preNum($d-1));            
 68          else  //做不到,直接截到月末
 69             return sprintf("%s-%s-%s", $year, preNum($m), preNum($nextMonthLastDay));
 70         
 71     
 72 
 73 
 74 
 75 
 76 //有前导0的日期
 77 function preDate($date) 
 78     return date(‘Y-m-d‘, strtotime($date));
 79 
 80 
 81 //处理前导0
 82 function preNum($num) 
 83     return substr("0".$num, -2);    
 84 
 85 
 86 
 87 function feeMonth($start, $end, $total_fee) 
 88     $bill = billMonth($start, $end);
 89     //先算月账单
 90 
 91 
 92     $perMonth_fee = round($total_fee/count($bill), 2);  //每月平均价格
 93 
 94     //看看是不是算多了或少了, 补齐到第一个月
 95 
 96     $tmp = $perMonth_fee * (count($bill) - 1);
 97     if (($perMonth_fee + $tmp) > $total_fee) 
 98         $firstMonth_fee =  $perMonth_fee - (($perMonth_fee + $tmp) - $total_fee);
 99      else 
100         $firstMonth_fee = $total_fee - $tmp;
101     
102     for($i = 0; $i<count($bill); $i++) 
103         if ($i==0) 
104             $bill[$i][‘fee‘] = $firstMonth_fee;
105          else 
106             $bill[$i][‘fee‘] = $perMonth_fee;
107         
108     
109     return $bill;
110 
111 
112 //季度账单
113 function feeQuarter($start, $end, $total_fee) 
114     $feeMonth = feeMonth($start, $end, $total_fee);
115     $q = array_chunk($feeMonth, 3);
116     $quarterFee = [];
117     for($j = 0; $j<count($q); $j++) 
118         $quarterFee[$j] = [
119             ‘fee‘ => 0
120         ];
121         for($i=0; $i<count($q[$j]); $i++) 
122             if ($i == 0) 
123                 $quarterFee[$j][‘s‘] = $q[$j][$i][‘s‘];
124             
125             $quarterFee[$j][‘fee‘] += $q[$j][$i][‘fee‘];
126             if ($i == count($q[$j]) - 1) 
127                 $quarterFee[$j][‘e‘] = $q[$j][$i][‘e‘];
128             
129          
130         
131     
132     return $quarterFee;
133 
134 
135 //
136 function feeYear($start, $end, $total_fee, $times = 1, $type = 0) 
137     $split = $times * 12;
138     $feeMonth = feeMonth($start, $end, $total_fee);
139     $q = array_chunk($feeMonth, $split);
140     $yearFee = [];
141     for($j = 0; $j<count($q); $j++) 
142         $yearFee[$j] = [
143             ‘total_taxes‘ => 0
144         ];
145         if ($type == 1)  //中付 计算中间日期
146             $mid = ceil(count($q[$j])/2) - 1;
147             $mid_start = $q[$j][$mid][‘s‘];
148             $mid_date = date("Y-m-d", strtotime($mid_start) + 3600 *24 *15);
149             $yearFee[$j][‘bill_day‘] = $mid_date;
150         
151         
152         for($i=0; $i<count($q[$j]); $i++) 
153             if ($i == 0) 
154                 $yearFee[$j][‘bill_start_time‘] = $q[$j][$i][‘s‘];
155                 if ($type == 0) 
156                     $yearFee[$j][‘bill_day‘] = $q[$j][$i][‘s‘];
157                 
158             
159             
160             $yearFee[$j][‘total_taxes‘] += $q[$j][$i][‘fee‘];
161             if ($i == count($q[$j]) - 1) 
162                 $yearFee[$j][‘bill_end_time‘] = $q[$j][$i][‘e‘];
163                 if ($type == 2) 
164                     $yearFee[$j][‘bill_day‘] = date(‘Y-m-d‘, strtotime($q[$j][$i][‘e‘]) + 3600 * 24);
165                 
166             
167          
168         
169     
170     return $yearFee;
171 
172 
173 $total_fee = 200000;
174 echo "月账单:\n";
175 print_r(feeYear($start, $end, $total_fee, 0.1, 1));
176 echo "季账单:\n";
177 print_r(feeYear($start, $end, $total_fee, 0.3, 1));
178 //echo "半年账单:\n";
179 //print_r(feeYear($start, $end, $total_fee, 0.5));
180 //echo "全年账单:\n";
181 //print_r(feeYear($start, $end, $total_fee, 1));
182 //echo "2年账单:\n";
183 //print_r(feeYear($start, $end, $total_fee, 2));
184 //echo "5年账单:\n";
185 //print_r(feeYear($start, $end, $total_fee, 5));
186 
187 /*
188 echo "总月数:".count($bill)."\n";
189 echo "总费用:". $total_fee."\n";
190 echo "首月价格:".$firstMonth_fee."\n";
191 echo "每月价格:".$perMonth_fee."\n";
192 echo "总费用计算:". ( $firstMonth_fee + $perMonth_fee*(count($bill)-1))."\n";
193 */
194 //如果需要季度账单
195 
196 
197 ///print_r($bill);

 

以上是关于php 账单生成的主要内容,如果未能解决你的问题,请参考以下文章

Java+微信支付(下预购单+回调+退款+查询账单)

在 FPDF 中显示值

将外部 PDF 插入 Prawn 生成的文档

12.9

比特币-架构原理

怎么使用可视化数据库工具 DBeaver 在账单类型 type 表里添加数据?