def update_business_impact_value(self, hosts, services, timeperiods, bi_modulations):
        """We update our 'business_impact' value with the max of
        the impacts business_impact if we got impacts. And save our 'configuration'
        business_impact if we do not have do it before
        If we do not have impacts, we revert our value

        :param hosts: hosts objects, used to get impacts
        :type hosts: alignak.objects.host.Hosts
        :param services: services objects, used to get impacts
        :type services: alignak.objects.service.Services
        :param timeperiods: Timeperiods objects, used to get modulation_period
        :type timeperiods: alignak.objects.timeperiod.Timeperiods
        :param bi_modulations: business impact modulations objects
        :type bi_modulations: alignak.object.businessimpactmodulation.Businessimpactmodulations
        :return: None
        TODO: SchedulingItem object should not handle other schedulingitem obj.
              We should call obj.register* on both obj.
              This is 'Java' style
        """
        # First save our business_impact if not already do
        if self.my_own_business_impact == -1:
            self.my_own_business_impact = self.business_impact

        # We look at our crit modulations. If one apply, we take apply it
        # and it's done
        in_modulation = False
        for bi_modulation_id in self.business_impact_modulations:
            bi_modulation = bi_modulations[bi_modulation_id]
            now = time.time()
            period = timeperiods[bi_modulation.modulation_period]
            if period is None or period.is_time_valid(now):
                self.business_impact = bi_modulation.business_impact
                in_modulation = True
                # We apply the first available, that's all
                break

        # If we truly have impacts, we get the max business_impact
        # if it's huge than ourselves
        if self.impacts:
            bp_impacts = [hosts[elem].business_impact for elem in self.impacts if elem in hosts]
            bp_impacts.extend([services[elem].business_impact for elem in self.impacts
                               if elem in services])
            self.business_impact = max(self.business_impact, max(bp_impacts))
            return

        # If we are not a problem, we setup our own_crit if we are not in a
        # modulation period
        if self.my_own_business_impact != -1 and not in_modulation:
            self.business_impact = self.my_own_business_impact
We update our 'business_impact' value with the max of
        the impacts business_impact if we got impacts. And save our 'configuration'
        business_impact if we do not have do it before
        If we do not have impacts, we revert our value

        :param hosts: hosts objects, used to get impacts
        :type hosts: alignak.objects.host.Hosts
        :param services: services objects, used to get impacts
        :type services: alignak.objects.service.Services
        :param timeperiods: Timeperiods objects, used to get modulation_period
        :type timeperiods: alignak.objects.timeperiod.Timeperiods
        :param bi_modulations: business impact modulations objects
        :type bi_modulations: alignak.object.businessimpactmodulation.Businessimpactmodulations
        :return: None
        TODO: SchedulingItem object should not handle other schedulingitem obj.
              We should call obj.register* on both obj.
              This is 'Java' style