200 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
|   require_once 'includes/header.php';
 | |
| 
 | |
|   function getPricePerMonth($cycle, $frequency, $price) {
 | |
|     switch ($cycle) {
 | |
|     case 1:
 | |
|         $numberOfPaymentsPerMonth = (30 / $frequency); 
 | |
|         return $price * $numberOfPaymentsPerMonth;
 | |
|         break;
 | |
|     case 2:
 | |
|         $numberOfPaymentsPerMonth = (4.35 / $frequency);
 | |
|         return $price * $numberOfPaymentsPerMonth;
 | |
|         break;
 | |
|     case 3:
 | |
|         $numberOfPaymentsPerMonth = (1 / $frequency);
 | |
|         return $price * $numberOfPaymentsPerMonth;
 | |
|         break;
 | |
|     case 4:
 | |
|         if ($frequency === 1) {
 | |
|           return $price / 12;
 | |
|           break;
 | |
|         }
 | |
|         $numberOfPaymentsPerMonth = (0.0833310 / $frequency);
 | |
|         return $price * $numberOfPaymentsPerMonth;
 | |
|         break;  
 | |
|     }
 | |
|   }
 | |
| 
 | |
| 
 | |
|   function getPriceConverted($price, $currency, $database) {
 | |
|       $query = "SELECT rate FROM currencies WHERE id = :currency";
 | |
|       $stmt = $database->prepare($query);
 | |
|       $stmt->bindParam(':currency', $currency, SQLITE3_INTEGER);
 | |
|       $result = $stmt->execute();
 | |
|       
 | |
|       $exchangeRate = $result->fetchArray(SQLITE3_ASSOC);
 | |
|       if ($exchangeRate === false) {
 | |
|           return $price;
 | |
|       } else {
 | |
|           $fromRate = $exchangeRate['rate'];
 | |
|           return $price / $fromRate;
 | |
|       }
 | |
|   }
 | |
| 
 | |
| //Get household members
 | |
| $members = array();
 | |
| $query = "SELECT * FROM household";
 | |
| $result = $db->query($query);
 | |
| while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
 | |
|     $memberId = $row['id'];
 | |
|     $members[$memberId] = $row;
 | |
|     $memberCost[$memberId]['cost'] = 0;
 | |
|     $memberCost[$memberId]['name'] = $row['name'];
 | |
| }  
 | |
| 
 | |
| // Get symbol of main currency to display on statistics
 | |
| $query = "SELECT c.symbol
 | |
|           FROM currencies c
 | |
|           INNER JOIN user u ON c.id = u.main_currency
 | |
|           WHERE u.id = 1";
 | |
| $stmt = $db->prepare($query);
 | |
| $result = $stmt->execute();
 | |
| $row = $result->fetchArray(SQLITE3_ASSOC);
 | |
| $symbol = $row['symbol'];
 | |
| 
 | |
| 
 | |
| // Calculate active subscriptions
 | |
| $query = "SELECT COUNT(*) AS active_subscriptions FROM subscriptions";
 | |
| $stmt = $db->prepare($query);
 | |
| $stmt->bindParam(':criteria', $criteria, SQLITE3_INTEGER);
 | |
| $result = $stmt->execute();
 | |
| $row = $result->fetchArray(SQLITE3_ASSOC);
 | |
| $activeSubscriptions = $row['active_subscriptions'];
 | |
| 
 | |
| // Calculate total monthly price
 | |
| $mostExpensiveSubscription = 0;
 | |
| $amountDueThisMonth = 0;
 | |
| $totalCostPerMonth = 0;
 | |
| $query = "SELECT name, price, frequency, cycle, currency_id, next_payment, payer_user_id FROM subscriptions";
 | |
| $result = $db->query($query);
 | |
| if ($result) {
 | |
|   while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
 | |
|     $subscriptions[] = $row;
 | |
|   }
 | |
|   if (isset($subscriptions)) {
 | |
|     foreach ($subscriptions as $subscription) {
 | |
|       $name = $subscription['name'];
 | |
|       $price = $subscription['price'];
 | |
|       $frequency = $subscription['frequency'];
 | |
|       $cycle = $subscription['cycle'];
 | |
|       $currency = $subscription['currency_id'];
 | |
|       $next_payment = $subscription['next_payment'];
 | |
|       $payerId = $subscription['payer_user_id'];
 | |
|       $originalSubscriptionPrice = getPriceConverted($price, $currency, $db);
 | |
|       $price = getPricePerMonth($cycle, $frequency, $originalSubscriptionPrice);
 | |
|       $totalCostPerMonth += $price;
 | |
|       $memberCost[$payerId]['cost'] += $price;
 | |
|       if ($price > $mostExpensiveSubscription) {
 | |
|         $mostExpensiveSubscription = $price;
 | |
|       }
 | |
| 
 | |
|       $memberCost[$payerId]['cost'] = number_format($memberCost[$payerId]['cost'], 2, ".", "");
 | |
|       if ((int)$memberCost[$payerId]['cost'] == $memberCost[$payerId]['cost']) {
 | |
|         $memberCost[$payerId]['cost'] = (int)$memberCost[$payerId]['cost'];
 | |
|       }
 | |
|       
 | |
|       $nextPaymentDate = DateTime::createFromFormat('Y-m-d', trim($next_payment));
 | |
|       $tomorrow = new DateTime('tomorrow');
 | |
|       $endOfMonth = new DateTime('last day of this month');
 | |
|   
 | |
|       if ($nextPaymentDate >= $tomorrow && $nextPaymentDate <= $endOfMonth) {
 | |
|           $timesToPay = 1;
 | |
|           $daysInMonth = $endOfMonth->diff($tomorrow)->days + 1;
 | |
|           $daysRemaining = $endOfMonth->diff($nextPaymentDate)->days + 1;
 | |
|           if ($cycle == 1) {
 | |
|             $timesToPay = $daysRemaining / $frequency;
 | |
|           }
 | |
|           if ($cycle == 2) {
 | |
|             $weeksInMonth = ceil($daysInMonth / 7);
 | |
|             $weeksRemaining = ceil($daysRemaining / 7);
 | |
|             $timesToPay = $weeksRemaining / $frequency;
 | |
|           }
 | |
|           $amountDueThisMonth += $originalSubscriptionPrice * $timesToPay;
 | |
|       }
 | |
|     }
 | |
|     $mostExpensiveSubscription = number_format($mostExpensiveSubscription, 2, ".", "");
 | |
|   
 | |
|     // Calculate yearly price
 | |
|     $totalCostPerYear = $totalCostPerMonth * 12;
 | |
|     $totalCostPerYear = number_format($totalCostPerYear, 2, ".", "");
 | |
|     if ((int)$totalCostPerYear == $totalCostPerYear) {
 | |
|       $totalCostPerYear = (int)$totalCostPerYear;
 | |
|     }
 | |
|   
 | |
|     // Calculate average subscription monthly cost
 | |
|     $averageSubscriptionCost = $totalCostPerMonth / $activeSubscriptions;
 | |
|     $averageSubscriptionCost = number_format($averageSubscriptionCost, 2, ".", "");
 | |
|     if ((int)$averageSubscriptionCost == $averageSubscriptionCost) {
 | |
|       $averageSubscriptionCost = (int)$averageSubscriptionCost;
 | |
|     }
 | |
| 
 | |
|     $totalCostPerMonth = number_format($totalCostPerMonth, 2, ".", "");
 | |
|     if ((int)$totalCostPerMonth == $totalCostPerMonth) {
 | |
|       $totalCostPerMonth = (int)$totalCostPerMonth;
 | |
|     }
 | |
|   } else {
 | |
|     $totalCostPerYear = 0;
 | |
|     $averageSubscriptionCost = 0;
 | |
|   }
 | |
| }
 | |
|  
 | |
| ?>
 | |
| <section class="contain">
 | |
|   <div class="statistics">
 | |
|     <div class="statistic">
 | |
|       <span><?= $activeSubscriptions ?></span>
 | |
|       <div class="title">Active Subscriptions</div>
 | |
|     </div>
 | |
|     <div class="statistic">
 | |
|       <span><?= $totalCostPerMonth ?><?= $symbol ?></span>
 | |
|       <div class="title">Monthly Cost</div>
 | |
|     </div>
 | |
|     <div class="statistic">
 | |
|       <span><?= $totalCostPerYear ?><?= $symbol ?></span>
 | |
|       <div class="title">Yearly Cost</div>
 | |
|     </div>
 | |
|     <div class="statistic">
 | |
|       <span><?= $averageSubscriptionCost ?><?= $symbol ?></span>
 | |
|       <div class="title">Average Monthly Subscription Cost</div>
 | |
|     </div>
 | |
|     <div class="statistic">
 | |
|       <span><?= $mostExpensiveSubscription ?><?= $symbol ?></span>
 | |
|       <div class="title">Most Expensive Subscription Cost</div>
 | |
|     </div>
 | |
|     <div class="statistic">
 | |
|       <span><?= number_format($amountDueThisMonth, 2, ".", "") ?><?= $symbol ?></span>
 | |
|       <div class="title">Amount due this month</div>
 | |
|     </div>
 | |
|     <?php
 | |
|       $numberOfElements = 6;
 | |
|       foreach($memberCost as $member) {
 | |
|         ?>
 | |
|           <div class="statistic">
 | |
|             <span><?= $member['cost'] ?><?= $symbol ?></span>
 | |
|             <div class="title"><?= $member['name'] ?>'s monthly costs</div>
 | |
|           </div>
 | |
|         <?php
 | |
|         $numberOfElements++;
 | |
|       }
 | |
|       if (($numberOfElements + 1) % 3 == 0) {
 | |
|         ?>
 | |
|           <div class="statistic empty"><div>
 | |
|         <?php
 | |
|       }
 | |
|     ?>
 | |
|   </div>
 | |
| </section>
 | |
| <?php
 | |
|   require_once 'includes/footer.php';
 | |
| ?>
 |