def test_get_price_from_cost_with_warehouse(
        self,
        get_total_usage_in_period_mock
    ):
        get_total_usage_in_period_mock.return_value = 100.0
        usage_price = models.UsagePrice(
            start=datetime.date(2013, 10, 10),
            end=datetime.date(2013, 10, 10),
            cost=2000,
            type=self.usage_type_cost_wh,
        )
        result = self.plugin._get_price_from_cost(
            usage_price,
            False,
            warehouse=self.warehouse1
        )

        self.assertEquals(result, D(20))  # 2000 / 100 = 20
        get_total_usage_in_period_mock.assert_called_with(
            datetime.date(2013, 10, 10),
            datetime.date(2013, 10, 10),
            self.usage_type_cost_wh,
            self.warehouse1,
            None,
            None,
        )
    def test_get_price_from_cost_total_excluded_ventures(
        self,
        get_total_usage_in_period_mock
    ):
        get_total_usage_in_period_mock.return_value = 10.0
        usage_price = models.UsagePrice(
            start=datetime.date(2013, 10, 10),
            end=datetime.date(2013, 10, 10),
            cost=3000,
            type=self.usage_type_cost_wh,
        )
        result = self.plugin._get_price_from_cost(
            usage_price,
            False,
            excluded_ventures=[self.venture1],
        )

        self.assertEquals(result, D(300))
        get_total_usage_in_period_mock.assert_called_with(
            datetime.date(2013, 10, 10),
            datetime.date(2013, 10, 10),
            self.usage_type_cost_wh,
            None,
            None,
            [self.venture1]
        )
    def test_get_price_from_cost_total_usage_0(
        self,
        get_total_usage_in_period_mock
    ):
        get_total_usage_in_period_mock.return_value = 0.0
        usage_price = models.UsagePrice(
            start=datetime.date(2013, 10, 10),
            end=datetime.date(2013, 10, 10),
            cost=3000,
            type=self.usage_type_cost_wh,
        )
        result = self.plugin._get_price_from_cost(usage_price, False)

        self.assertEquals(result, D(0))
 def add_usage_price(usage_type, prices_costs, warehouse=None):
     for daterange, price_cost in zip(dates, prices_costs):
         start, end = daterange
         usage_price = models.UsagePrice(
             type=usage_type,
             start=start,
             end=end,
         )
         if warehouse is not None:
             usage_price.warehouse = warehouse
         if usage_type.by_cost:
             usage_price.cost = price_cost[0]
             usage_price.forecast_cost = price_cost[1]
         else:
             usage_price.price = price_cost[0]
             usage_price.forecast_price = price_cost[1]
         usage_price.save()
예제 #5
0
 def test_team_average_cost_no_price(self):
     team_avg = models.Team(name='TeamAVG', billing_type='AVERAGE')
     team_avg.save()
     # daily cost: 200
     up = models.UsagePrice(
         type=self.usage_type,
         cost=3000,
         forecast_cost=5000,
         start=date(2013, 10, 16),
         end=date(2013, 10, 30),
         team=team_avg,
     )
     up.save()
     result = self.plugin._get_team_cost_per_venture(
         start=date(2013, 11, 2),
         end=date(2013, 11, 5),
         team=team_avg,
         usage_type=self.usage_type,
         ventures=self.ventures,
         forecast=False,
         no_price_msg=True,
     )
     cost_key = 'ut_{0}_team_{1}_cost'.format(
         self.usage_type.id,
         team_avg.id,
     )
     percent_key = 'ut_{0}_team_{1}_percent'.format(
         self.usage_type.id,
         team_avg.id,
     )
     self.assertEquals(result, {
         self.venture1.id: {
             cost_key: _('No price'),
             percent_key: D(0),
         },
         self.venture2.id: {
             cost_key: _('No price'),
             percent_key: D(0),
         },
         self.venture3.id: {
             cost_key: _('No price'),
             percent_key: D(0),
         },
     })
예제 #6
0
 def test_usage_models(self):
     type_ = models.UsageType(name='ziew')
     type_.save()
     price = models.UsagePrice(
         type=type_,
         price=3,
         start=datetime.date(2013, 4, 24),
         end=datetime.date(2013, 4, 26),
     )
     price.save()
     usage = models.DailyUsage(
         date=datetime.date(2013, 4, 25),
         value=3,
         type=type_,
     )
     usage.save()
     self.assertEquals(usage.value, 3)
     self.assertEquals(usage.type, type_)
     self.assertEquals(price.price, 3)
     self.assertEquals(type_.name, 'ziew')
    def test_get_price_from_cost_with_forecast(
        self,
        get_total_usage_in_period_mock
    ):
        get_total_usage_in_period_mock.return_value = 100.0
        usage_price = models.UsagePrice(
            start=datetime.date(2013, 10, 10),
            end=datetime.date(2013, 10, 10),
            forecast_cost=3000,
            type=self.usage_type_cost_wh,
        )
        result = self.plugin._get_price_from_cost(usage_price, True)

        self.assertEquals(result, D(30))  # 3000 / 100 = 30
        get_total_usage_in_period_mock.assert_called_with(
            datetime.date(2013, 10, 10),
            datetime.date(2013, 10, 10),
            self.usage_type_cost_wh,
            None,
            None,
            None
        )
예제 #8
0
 def test_usages_count_price(self):
     day = datetime.date(2013, 4, 25)
     venture = models.Venture(venture_id=3)
     venture.save()
     usage_type = models.UsageType(name='waciki')
     usage_type.save()
     daily_usage = models.DailyUsage(
         type=usage_type,
         value=32,
         date=day,
         pricing_venture=venture,
     )
     daily_usage.save()
     other_day = datetime.date(2013, 4, 24)
     daily_usage = models.DailyUsage(
         type=usage_type,
         value=32,
         date=other_day,
         pricing_venture=venture,
     )
     daily_usage.save()
     usage_price = models.UsagePrice(
         start=day,
         end=day,
         price=4,
         type=usage_type,
     )
     usage_price.save()
     count, price = venture.get_usages_count_price(day, day, usage_type)
     self.assertEquals(count, 32)
     self.assertEquals(price, decimal.Decimal('128'))
     day = datetime.date(2013, 4, 26)
     count, price = venture.get_usages_count_price(day, day, usage_type)
     self.assertEquals(count, 0)
     self.assertEquals(price, decimal.Decimal('0'))
     day = datetime.date(2013, 4, 24)
     count, price = venture.get_usages_count_price(day, day, usage_type)
     self.assertEquals(count, 32)
     self.assertIsNone(price)
예제 #9
0
    def test_total_cost(self):
        # add regular usage type
        regular_usage_type = models.UsageType(
            name='RUsageType1',
            symbol='rut1',
            by_cost=True,
            type='RU',
        )
        regular_usage_type.save()
        models.DailyUsage(type=regular_usage_type,
                          pricing_venture=self.venture1,
                          value=100,
                          date=datetime.date(2013, 10, 11)).save()
        models.DailyUsage(type=regular_usage_type,
                          pricing_venture=self.venture2,
                          value=300,
                          date=datetime.date(2013, 10, 12)).save()
        models.ServiceUsageTypes(
            usage_type=self.service_usage_type1,
            service=self.service,
            start=datetime.date(2013, 10, 1),
            end=datetime.date(2013, 10, 30),
            percent=100,
        ).save()
        models.UsagePrice(type=regular_usage_type,
                          start=datetime.date(2013, 10, 1),
                          end=datetime.date(2013, 10, 30),
                          cost=1000).save()
        self.service.regular_usage_types.add(regular_usage_type)
        self.service.save()

        self.assertEqual(
            D(4490),
            ServicePlugin.total_cost(datetime.date(2013, 10, 10),
                                     datetime.date(2013, 10, 20), self.service,
                                     False, [self.venture1]))
예제 #10
0
    def setUp(self):
        # set up decimal precision to make comparisons easier
        decimal_context = getcontext()
        self.__prev_decimal_prec = decimal_context.prec
        decimal_context.prec = 4

        self.plugin = Team

        # usage type
        self.usage_type = models.UsageType(
            name='Teams',
            symbol='Teams',
            by_team=True,
            type='BU',
        )
        self.usage_type.save()

        # teams
        self.team_time = models.Team(
            name='T1',
            billing_type='TIME',
            show_percent_column=True,
        )
        self.team_time.save()
        self.team_devices_cores = models.Team(
            name='T2',
            billing_type='DEVICES_CORES',
        )
        self.team_devices_cores.save()
        self.team_devices = models.Team(
            name='T3',
            billing_type='DEVICES',
        )
        self.team_devices.save()
        self.team_distribute = models.Team(
            name='T4',
            billing_type='DISTRIBUTE',
        )
        self.team_distribute.save()
        self.teams = models.Team.objects.all()

        # dateranges
        self.daterange1 = models.TeamDaterange(
            team=self.team_time,
            start=date(2013, 10, 1),
            end=date(2013, 10, 10),
        )
        self.daterange1.save()
        self.daterange2 = models.TeamDaterange(
            team=self.team_time,
            start=date(2013, 10, 11),
            end=date(2013, 10, 30),
        )
        self.daterange2.save()

        # costs
        # team time
        up = models.UsagePrice(
            type=self.usage_type,
            cost=300,
            forecast_cost=600,
            start=date(2013, 10, 1),
            end=date(2013, 10, 15),
            team=self.team_time,
            team_members_count=10,
        )
        up.save()
        up = models.UsagePrice(
            type=self.usage_type,
            cost=900,
            forecast_cost=450,
            start=date(2013, 10, 16),
            end=date(2013, 10, 30),
            team=self.team_time,
            team_members_count=20,
        )
        up.save()

        up = models.UsagePrice(
            type=self.usage_type,
            cost=300,
            forecast_cost=600,
            start=date(2013, 10, 1),
            end=date(2013, 10, 30),
            team=self.team_devices_cores,
            team_members_count=20,
        )
        up.save()

        up = models.UsagePrice(
            type=self.usage_type,
            cost=800,
            forecast_cost=1600,
            start=date(2013, 10, 1),
            end=date(2013, 10, 10),
            team=self.team_devices,
            team_members_count=20,
        )
        up.save()
        up = models.UsagePrice(
            type=self.usage_type,
            cost=100,
            forecast_cost=200,
            start=date(2013, 10, 11),
            end=date(2013, 10, 30),
            team=self.team_devices,
            team_members_count=10,
        )
        up.save()

        up = models.UsagePrice(
            type=self.usage_type,
            cost=3000,
            forecast_cost=1500,
            start=date(2013, 10, 1),
            end=date(2013, 10, 15),
            team=self.team_distribute,
            team_members_count=10,
        )
        up.save()
        up = models.UsagePrice(
            type=self.usage_type,
            cost=6000,
            forecast_cost=3000,
            start=date(2013, 10, 16),
            end=date(2013, 10, 30),
            team=self.team_distribute,
            team_members_count=10,
        )
        up.save()

        # ventures
        self.venture1 = models.Venture(name='V1', venture_id=1, is_active=True)
        self.venture1.save()
        self.venture2 = models.Venture(name='V2', venture_id=2, is_active=True)
        self.venture2.save()
        self.venture3 = models.Venture(name='V3', venture_id=3, is_active=True)
        self.venture3.save()
        self.ventures = models.Venture.objects.all()

        # ventures percentage (only for time team)
        percentage = (
            (self.daterange1, [30, 30, 40]),
            (self.daterange2, [20, 50, 30]),
        )
        for team_daterange, percent in percentage:
            for venture, p in zip(self.ventures, percent):
                tvp = models.TeamVenturePercent(
                    team_daterange=team_daterange,
                    venture=venture,
                    percent=p,
                )
                tvp.save()
예제 #11
0
    def test_team_average_cost(
        self,
        distributed_mock,
        devices_mock,
        devices_cores_mock,
        time_team_mock,
    ):
        team_avg = models.Team(name='TeamAVG', billing_type='AVERAGE')
        team_avg.save()
        team_percent_key = lambda t: 'ut_{0}_team_{1}_percent'.format(
            self.usage_type.id,
            t.id,
        )

        time_percent_key = team_percent_key(self.team_time)
        time_team_mock.return_value = {
            self.venture1.id: {time_percent_key: D('0.3')},
            self.venture2.id: {time_percent_key: D('0.3')},
            self.venture3.id: {time_percent_key: D('0.4')},
        }

        devices_cores_percent_key = team_percent_key(self.team_devices_cores)
        devices_cores_mock.return_value = {
            self.venture1.id: {devices_cores_percent_key: D('1.0')},
            self.venture2.id: {devices_cores_percent_key: D('0')},
        }

        devices_percent_key = team_percent_key(self.team_devices)
        devices_mock.return_value = {
            self.venture1.id: {devices_percent_key: D('0.1')},
            self.venture2.id: {devices_percent_key: D('0.3')},
            self.venture3.id: {devices_percent_key: D('0.6')},
        }

        distribted_percent_key = team_percent_key(self.team_distribute)
        distributed_mock.return_value = {
            self.venture2.id: {distribted_percent_key: D('0.3')},
            self.venture3.id: {distribted_percent_key: D('0.7')},
        }

        # daily cost: 100
        up = models.UsagePrice(
            type=self.usage_type,
            cost=1500,
            forecast_cost=2000,
            start=date(2013, 10, 1),
            end=date(2013, 10, 15),
            team=team_avg,
        )
        up.save()
        # daily cost: 200
        up = models.UsagePrice(
            type=self.usage_type,
            cost=3000,
            forecast_cost=5000,
            start=date(2013, 10, 16),
            end=date(2013, 10, 30),
            team=team_avg,
        )
        up.save()
        result = self.plugin._get_team_cost_per_venture(
            start=date(2013, 10, 6),
            end=date(2013, 10, 25),
            team=team_avg,
            usage_type=self.usage_type,
            ventures=self.ventures,
            forecast=False,
            no_price_msg=True,
        )
        cost_key = 'ut_{0}_team_{1}_cost'.format(
            self.usage_type.id,
            team_avg.id,
        )
        percent_key = 'ut_{0}_team_{1}_percent'.format(
            self.usage_type.id,
            team_avg.id,
        )
        # venture1: 0.3 + 1.0 + 0.1 = 1.4
        # venture2: 0.3 + 0 + 0.3 + 0.3 = 0.9
        # venture3: 0.4 + 0.6 + 0.7 = 1.7
        # cost between 6 and 15: 100 * 10 = 1000
        # cost between 16 and 25: 200 * 10 = 2000
        self.assertEquals(result, {
            self.venture1.id: {
                cost_key: D('1050'),  # 1000 * 1.4 / 4 + 2000 * 1.4 / 4
                percent_key: D('0.35'),  # 1050 / 3000
            },
            self.venture2.id: {
                cost_key: D('675'),  # 1000 * 0.9 / 4 + 2000 * 0.9 / 4
                percent_key: D('0.225'),  # 675 / 3000
            },
            self.venture3.id: {
                cost_key: D('1275'),  # 1000 * 1.7 / 4 + 2000 * 1.7 / 4
                percent_key: D('0.425'),  # 1275 / 3000
            },
        })