def set_discount_info(self,cr,uid,total_fee,member_id=None,discount_card_id=None,discounter_id=None): """ 计算并设置折扣信息 根据传入的数据计算打折费用 优先级 discounter_id > member_id > discount_card_id :param total_fee float 总费用 :param member_id integer 会员id :param discount_card_id integer 打折卡id :param discounter_id integer 打折人(员工id) :rtype dict """ discount_rate = total_discount_fee = 0.0 ret = {} if discount_card_id: discount_card = self.pool.get('ktv.discount_card').browse(cr,uid,discount_card_id) ret['discount_card_id'] = discount_card_id discount_rate = ret['discount_card_room_fee_discount_rate'] = discount_card.discount_card_type_id.room_fee_discount total_discount_fee = ret['discount_card_room_fee_discount_fee'] = ktv_helper.float_round(cr,total_fee*(100 - discount_rate)/100) if member_id: the_member = self.pool.get('ktv.member').browse(cr,uid,member_id) ret['member_id'] = member_id discount_rate = ret['member_room_fee_discount_rate'] = the_member.member_class_id.room_fee_discount total_discount_fee = ret['member_room_fee_discount_fee'] = ktv_helper.float_round(cr,total_fee*(100.0 - discount_rate)/100.0) #员工打折 #TODO #if 'discounter_id' in context and context['discounter_id']: ret['discount_rate'] = discount_rate ret['total_discount_fee'] = total_discount_fee return ret
def set_calculate_fields(self,cr,uid,fields_dict): fields_dict['total_minutes'] = fields_dict['consume_minutes'] + fields_dict['present_minutes'] + fields_dict['changed_room_minutes'] fields_dict['total_after_discount_fee'] = fields_dict['total_fee'] - fields_dict['total_discount_fee'] fields_dict['total_after_discount_cash_fee']= fields_dict['total_after_discount_fee'] - fields_dict['member_card_fee'] - fields_dict['credit_card_fee'] - fields_dict['sales_voucher_fee'] - fields_dict['free_fee'] fields_dict['act_pay_cash_fee'] = fields_dict['total_after_discount_cash_fee'] fields_dict['cash_change'] = 0.0 #将所有float字段进行round for k,v in fields_dict.items(): if isinstance(v,float): fields_dict[k] = ktv_helper.float_round(cr,v) return fields_dict
def get_hourly_fee_array(self,cr,uid,room_id,context): """ 计算当前包厢钟点费用信息,按照时段钟点费的设置,消费可能分为几段时间进行计算, 因各个时间段的钟点费用不同 打印时还可使用 :param room_id integer 当前要计算的包厢id required :param context[datetime_open] string 包厢消费起始时间 required :param context[datetime_close] string 包厢消费结束时间 required :param context[price_class_id] integer 价格类型id required :param context[member_id] integer 会员卡id :rtype list 分段费用数组 """ pool = self.pool datetime_open = ktv_helper.strptime(context['datetime_open']) datetime_close = ktv_helper.strptime(context['datetime_close']) room = pool.get('ktv.room').browse(cr,uid,room_id) room_type_id = room.room_type_id.id price_class_id = context.get('price_class_id') member_id = context.get('member_id',None) member_class_id = None if member_id: member = pool.get('ktv.member').browse(cr,uid,member_id) member_class_id = member.member_class_id.id #hourly_fee_configs 包厢时段设置 hourly_fee_discount_configs = [] domain = {'price_class_id' : price_class_id,'ignore_time_range' : True} if member_class_id: domain['member_class_id'] = member_class_id domain['which_fee']="member_hourly_fee_discount" hourly_discount_configs = self.pool.get('ktv.member_hourly_fee_discount')\ .get_active_conifg(cr,uid,room_type_id,domain) hourly_discount_configs = self.pool.get("ktv.hourly_fee_discount").get_active_configs(cr,uid,room_type_id,domain) #形成config_array数组 def construct_config_array(c): config_datetime_from = ktv_helper.float_time_to_datetime(c['time_from']) config_datetime_to = ktv_helper.float_time_to_datetime(c['time_to']) #如果config_datetime_to < config_datetime_from,则config_datetime_to + 1 day if config_datetime_to < config_datetime_from: config_datetime_to = config_datetime_to + timedelta(days = 1) #先形成时间顺序的数组 #FIXME 此处要求在设置时间时,必须是连续的 return { 'datetime_from' : config_datetime_from, 'datetime_to' : config_datetime_to, 'hourly_fee' : c['hourly_fee'], 'hourly_discount' : c['hourly_discount'], } config_array = [construct_config_array(c) for c in hourly_discount_configs] #根据获取到的设置进行分段费用计算 for c in config_array: #判断时间情况如下所列,共有6种情况 # |--1--|-2--|--3--|--4-| # |----| # |----| # |---------------| # |----------------------------| # |----------| # |---------| #设置的最早时段 config_datetime_min = config_array[0]['datetime_from'] config_datetime_max = config_array[-1]['datetime_to'] _logger.debug('config_datetime_min = %s' % config_datetime_min) _logger.debug('config_datetime_max = %s' % config_datetime_max) _logger.debug('datetime_open = %s' % datetime_open) _logger.debug('datetime_close = %s' % datetime_close) #情况1:消费时间不在设置时间区间内,按照正常费用设置 if datetime_close <= config_datetime_min or datetime_open >= config_datetime_max: config_array = [] #情况2: 消费时段包含在设置时段内 #更新第一个的datetime_from 更新最后一个的datetime_to if datetime_open >= config_datetime_min and datetime_close <= config_datetime_max: #删除不在消费时段内的元素 [config_array.remove(c_fee) for c_fee in config_array if c_fee['datetime_to'] <= datetime_open] [config_array.remove(c_fee) for c_fee in config_array if c_fee['datetime_from'] >= datetime_close] config_array[0]['datetime_from'] = datetime_open config_array[-1]['datetime_to'] = datetime_close #3:消费时段包含设置时段 #在首尾分别添加费用设置 if datetime_open < config_datetime_min and datetime_close > config_datetime_max: config_array.insert(0,{ "datetime_from" : datetime_open, "datetime_to" : config_datetime_min, "hourly_fee" : room.hourly_fee, "hourly_discount" : 100, }) config_array.append({ "datetime_from" : config_datetime_max, "datetime_to" : datetime_close, "hourly_fee" : room.hourly_fee, "hourly_discount" : 100, }) #4:消费起始时间早于设置开始时间,消费结束时间早于设置结束时间 #在数组头部添加费用设置,删除后部的元素 if datetime_open < config_datetime_min and datetime_close < config_datetime_max: #删除不在消费时段内的元素 [config_array.remove(c_fee) for c_fee in config_array if c_fee['datetime_from'] >= datetime_close] config_array.insert(0,{ "datetime_from" : datetime_open, "datetime_to" : config_datetime_min, "hourly_fee" : room.hourly_fee, "hourly_discount" : 100, }) config_array[-1]['datetime_to'] = datetime_close #5:消费起始时间晚于设置开始时间,消费结束时间晚于设置结束时间 #删除数组头部不符合要求的数据,在数组尾部添加费用设置 if datetime_open >= config_datetime_min and datetime_close >= config_datetime_max: #删除不在消费时段内的元素 [config_array.remove(c_fee) for c_fee in config_array if c_fee['datetime_to'] <= datetime_open] config_array.append({ "datetime_from" : config_datetime_max, "datetime_to" : datetime_close, "hourly_fee" : room.hourly_fee, "hourly_discount" : 100, }) config_array[0]['datetime_from'] = datetime_open #逐个计算费用信息 for c in config_array: consume_minutes= ktv_helper.timedelta_minutes(c["datetime_from"],c["datetime_to"]) c['sum_hourly_fee']= ktv_helper.float_round(cr,c['hourly_fee']*consume_minutes/60) c['consume_minutes']= consume_minutes c['time_from'] = c['datetime_from'].strftime('%H:%M') c['time_to'] = c['datetime_to'].strftime('%H:%M') #如果没有钟点费用信息,则设置默认钟点费信息 if not config_array: tmp_dict = dict() consume_minutes= ktv_helper.timedelta_minutes(datetime_open,datetime_close) tmp_dict['sum_hourly_fee']= ktv_helper.float_round(cr,room.hourly_fee*consume_minutes/60) tmp_dict['hourly_fee']= room.hourly_fee tmp_dict['hourly_discount']= 100 #不打折 tmp_dict['consume_minutes']= consume_minutes tmp_dict['datetime_from'] = datetime_open tmp_dict['datetime_to'] = datetime_close tmp_dict['time_from'] = datetime_open.strftime('%H:%M') tmp_dict['time_to'] = datetime_close.strftime('%H:%M') config_array.append(tmp_dict) _logger.debug("config array = %s",repr(config_array)) return config_array