Example #1
0
 /**
  * Make sure totalDiscount methods works correctly.
  */
 public function test_total_discount()
 {
     // Create one product and add to the first bill
     $product = factory(\App\Product::class)->create(['user_id' => $this->user->id]);
     $billProduct = factory(\App\BillProduct::class)->create(['bill_id' => $this->bill->id, 'product_id' => $product->id]);
     // Create one application product and add to the first bill
     $applicationProduct = factory(\App\ApplicationProduct::class)->create();
     $billApplicationProduct = factory(\App\BillApplicationProduct::class)->create(['bill_id' => $this->bill->id, 'product_id' => $applicationProduct->id]);
     // Create another product and add to the second bill
     $secondProduct = factory(\App\Product::class)->create(['user_id' => $this->user->id]);
     $secondBillProduct = factory(\App\BillProduct::class)->create(['bill_id' => $this->bill->id, 'product_id' => $secondProduct->id]);
     // Create also another application product and add to the second bill
     $secondApplicationProduct = factory(\App\ApplicationProduct::class)->create();
     $secondBillApplicationProduct = factory(\App\BillApplicationProduct::class)->create(['bill_id' => $this->bill->id, 'product_id' => $secondApplicationProduct->id]);
     // Calculate expected discount
     $expectedDiscount = $billProduct->price - $billProduct->final_price + ($billApplicationProduct->price - $billApplicationProduct->final_price);
     $expectedDiscount += $secondBillProduct->price - $secondBillProduct->final_price + ($secondBillApplicationProduct->price - $secondBillApplicationProduct->final_price);
     $expectedDiscount = number_format($expectedDiscount, 2);
     $this->actingAs($this->user)->assertEquals($expectedDiscount, CampaignStatistics::totalDiscount($this->campaign->number, $this->campaign->year));
 }
 /**
  * Return statistics about discount compared in given two campaigns.
  *
  * @param array $campaign
  * @param array $campaignToCompare
  * @return array
  */
 public static function offeredDiscountDetails($campaign, $campaignToCompare)
 {
     $campaignDiscount = CampaignStatistics::totalDiscount($campaign['number'], $campaign['year']);
     $campaignToCompareDiscount = CampaignStatistics::totalDiscount($campaignToCompare['number'], $campaignToCompare['year']);
     $translationData = ['campaign_number' => $campaign['number'], 'campaign_year' => $campaign['year'], 'money' => $campaignDiscount, 'other_campaign_number' => $campaignToCompare['number'], 'other_campaign_year' => $campaignToCompare['year']];
     $baseOutput = ['discount_offered' => $campaignDiscount, 'discount_offered_in_campaign_to_compare' => $campaignToCompareDiscount, 'discount_offered_label' => trans('statistics.offered_discount_label', ['campaign_number' => $campaign['number'], 'campaign_year' => $campaign['year']]), 'discount_offered_in_campaign_to_compare_label' => trans('statistics.offered_discount_label', ['campaign_number' => $campaignToCompare['number'], 'campaign_year' => $campaignToCompare['year']])];
     // Handle case when there is no discount in both campaigns
     if ($campaignDiscount <= 0 && $campaignToCompareDiscount <= 0) {
         $output = ['message' => trans('statistics.offered_discount_equal_trend', $translationData), 'title' => trans('statistics.offered_discount_equal_trend_title')];
         return array_merge($output, $baseOutput);
     }
     // Handle case when is no discount in first campaign
     if ($campaignDiscount <= 0) {
         $translationData['minus'] = $campaignToCompareDiscount;
         $output = ['message' => trans('statistics.offered_discount_down_trend', $translationData), 'title' => trans('statistics.offered_discount_down_trend_title', ['percent' => 100])];
         return array_merge($output, $baseOutput);
     }
     // Handle case when is no discount in campaign to compare
     if ($campaignToCompareDiscount <= 0) {
         $translationData['plus'] = $campaignDiscount;
         $output = ['message' => trans('statistics.offered_discount_up_trend', $translationData), 'title' => trans('statistics.offered_discount_up_trend_title', ['percent' => 100])];
         return array_merge($output, $baseOutput);
     }
     // Handle case when both campaigns have discount
     // Calculate difference and make sure is positive
     $difference = number_format($campaignDiscount - $campaignToCompareDiscount, 2);
     if ($difference < 0) {
         $difference = number_format($difference * -1, 2);
     }
     // Make sure divider is the biggest number
     $divider = $campaignDiscount;
     if ($campaignDiscount < $campaignToCompareDiscount) {
         $divider = $campaignToCompareDiscount;
     }
     $percent = number_format($difference * 100 / $divider, 2);
     if ($campaignDiscount > $campaignToCompareDiscount) {
         $translationData['plus'] = $difference;
         $output = ['message' => trans('statistics.offered_discount_up_trend', $translationData), 'title' => trans('statistics.offered_discount_up_trend_title', ['percent' => $percent])];
     } else {
         if ($campaignDiscount < $campaignToCompareDiscount) {
             $translationData['minus'] = $difference;
             $output = ['message' => trans('statistics.offered_discount_down_trend', $translationData), 'title' => trans('statistics.offered_discount_down_trend_title', ['percent' => $percent])];
         } else {
             $output = ['message' => trans('statistics.offered_discount_equal_trend', $translationData), 'title' => trans('statistics.offered_discount_equal_trend_title')];
         }
     }
     return array_merge($output, $baseOutput);
 }