def card_pay(self, cost, paytype, sereialno): """ 信用卡支付,从信用卡可透支余额中扣费 :param sereialno: 流水号 :param cost: 消费金额 float类型 :param paytype: 消费类型 int类型 ( 1:消费、2:转账、3:提现、4:手续费 ) 对于2,3类型的支付要扣手续费,单记录一条流水单 :return: """ if paytype == 1: payfor = "消费" elif paytype == 2: payfor = "转账" elif paytype == 3: payfor = "提现" elif paytype == 4: payfor = "手续费" else: payfor = "未知" # 支付扣款 self.credit_balance -= cost # 记录消费流水对账单,将发生了费用还没有还款的账单信息写入文件 report_bill 中 _tmp_bill_record = dict(cardno="{0}".format(self.cardno), starttime=datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M"), payfor=payfor, cost=cost, serialno=sereialno) dbapi.append_db_json(_tmp_bill_record, os.path.join(Settings.REPORT_PATH, "report_bill")) # 更新信用卡可透支余额信息到数据库 creditcard.db self.credit_card[self.cardno]["credit_balance"] = self.credit_balance dbapi.write_db_json(self.credit_card, self.__database)
def create_card_statement(cardno): """ 生成信用卡对账单 :param cardno:卡号 :return: """ # 获得当前时间 currday = datetime.now().strftime("%Y-%m-%d") today = date.today().day # 如果是账单日22号 开始生成账单 if today == settings.STATEMENT_DAY: # 生成对账单数据库中存放对账单数据的字典 key startday = (datetime.now() + timedelta(days=-30)).strftime( "%Y%m{0}".format(settings.STATEMENT_DAY)) endday = datetime.now().strftime("%Y%m%d") statement_key = "{start}{end}".format(start=startday, end=endday) # 从对账单流水中计算出要还款的金额 startdate = (datetime.now() + timedelta(days=-30)).strftime( "%Y-%m-{0} 00:00:00".format(settings.STATEMENT_DAY)) enddate = datetime.now().strftime("%Y-%m-%d 00:00:00") # 获取卡号对应的消费流水记录列表 bill_list = dbapi.load_bill_report(cardno, startdate, enddate) statement_total = 0.00 # 如果有消费记录,生成对账单 if len(bill_list) > 0: for bill in bill_list: # 获取一个对账单日期的消费总费用 statement_total += bill["cost"] # 获取还款日期 下个月10号 statement_pdate = (datetime.now() + timedelta(days=30)).strftime("%Y-%m-10") # 生成对账单的统计数据字典{"2016012220160222":{"账单日":currday, # "账单范围":startdate至enddate, # "账单金额":statement_bill, # "已还款":0, # "还款日":pdate # "已还完":0}} statement_dict = { statement_key: { "billdate": currday, "startdate": startdate, "enddate": enddate, "total": statement_total, "payed": 0, "pdate": statement_pdate, "interest": 0, "isfinished": 0 } } # 对账单文件名 file_name = os.path.join(settings.REPORT_PATH, "statement_{0}".format(cardno)) # 写入文件 dbapi.append_db_json(statement_dict, file_name)
def payfor_shopcart(self, userobj): """ 购物车结算模块,功能包括:购物车付款、购物记录写入文件、 :param kwargs: 字典参数 {cost=购物车金额, userobj=用户对象} :return: """ # 判断用户有没有绑定信用卡 if not userobj.bindcard: # 用户没有绑定信用卡,直接返回错误,在外层绑卡 return Errorcode.CARD_NOT_BINDED else: # 用户绑定了信用卡了, 获取信用卡信息(实例化对象) cardobj = CreditCard(userobj.bindcard) # 卡余额够吗 if cardobj.credit_balance < self.shopping_cost: common.show_message("您的信用卡本月额度不够! ", "NOTICE") return Errorcode.BALANCE_NOT_ENOUGHT else: # 生成一个流水号 serno = common.create_serialno() # 调用卡的支付模块进行支付 cardobj.card_pay(self.shopping_cost, 1, serno) # 记录购物流水 shopping_record = { userobj.username: { "time": datetime.now().strftime("%Y-%m-%d %H:%M"), "cost": self.shopping_cost, "serno": serno, "detail": self.shopping_cart } } # 写入报表记录文件 dbapi.append_db_json(shopping_record, self.__shop_report_file) # 购物结算完成后将对象的购物车清空, 购物车商品总价清0 ,待下次购物 self.shopping_cart.clear() self.shopping_cost = 0 return Errorcode.NO_ERROR