/** * 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); }