def make_payin_and_transfer(self, route, tippee, amount, status='succeeded', error=None, payer_country=None, unit_amount=None, period=None): payer = route.participant payin = prepare_payin(self.db, payer, amount, route) payin = update_payin(self.db, payin.id, 'fake', status, error) provider = route.network.split('-', 1)[0] try: destination = resolve_destination(self.db, tippee, provider, payer, payer_country, amount) except MissingPaymentAccount as e: destination = self.add_payment_account(e.args[0], provider) recipient = Participant.from_id(destination.participant) if tippee.kind == 'group': context = 'team-donation' team = tippee.id else: context = 'personal-donation' team = None pt = prepare_payin_transfer(self.db, payin, recipient, destination, context, amount, unit_amount, period, team) pt = update_payin_transfer(self.db, pt.id, 'fake', status, error) payer.update_giving() tippee.update_receiving() if team: recipient.update_receiving() return payin, pt
def make_payin_and_transfer(self, route, tippee, amount, provider, status='succeeded', error=None, payer_country=None, unit_amount=None, period=None): payer = route.participant payin = prepare_payin(self.db, payer, amount, route) payin = update_payin(self.db, payin.id, 'fake', status, error) destination = resolve_destination(self.db, tippee, provider, payer, payer_country, amount) recipient = Participant.from_id(destination.participant) if tippee.kind == 'group': context = 'team-donation' team = tippee else: context = 'personal-donation' team = None pt = prepare_payin_transfer(self.db, payin, recipient, destination, context, amount, unit_amount, period, team.id) pt = update_payin_transfer(self.db, pt.id, 'fake', status, error) return payin, pt
def make_payin_and_transfer( self, route, tippee, amount, status='succeeded', error=None, payer_country=None, unit_amount=None, period=None ): payer = route.participant payin = prepare_payin(self.db, payer, amount, route) payin = update_payin(self.db, payin.id, 'fake', status, error) provider = route.network.split('-', 1)[0] try: destination = resolve_destination( self.db, tippee, provider, payer, payer_country, amount ) except MissingPaymentAccount as e: destination = self.add_payment_account(e.args[0], provider) recipient = Participant.from_id(destination.participant) if tippee.kind == 'group': context = 'team-donation' team = tippee.id else: context = 'personal-donation' team = None pt = prepare_payin_transfer( self.db, payin, recipient, destination, context, amount, unit_amount, period, team ) pt = update_payin_transfer(self.db, pt.id, 'fake', status, error) payer.update_giving() tippee.update_receiving() if team: recipient.update_receiving() return payin, pt
def make_payin_and_transfers( self, route, amount, transfers, status='succeeded', error=None, payer_country=None, fee=None, remote_id='fake', ): payer = route.participant payin = prepare_payin(self.db, payer, amount, route) provider = route.network.split('-', 1)[0] for tippee, pt_amount, opt in transfers: tip = opt.get('tip') if tip: assert tip.tipper == payer.id assert tip.tippee == tippee.id else: tip = self.db.one(""" SELECT * FROM current_tips WHERE tipper = %s AND tippee = %s """, (payer.id, tippee.id)) assert tip for i in range(100): try: prepare_donation( self.db, payin, tip, tippee, provider, payer, payer_country, pt_amount ) except MissingPaymentAccount as e: if i > 95: # Infinite loop? raise recipient = e.args[0] if recipient.kind == 'group': raise self.add_payment_account(recipient, provider) else: break payin = update_payin(self.db, payin.id, remote_id, status, error, fee=fee) net_amount = payin.amount - (fee or 0) adjust_payin_transfers(self.db, payin, net_amount) payin_transfers = self.db.all(""" SELECT * FROM payin_transfers WHERE payin = %s ORDER BY ctime """, (payin.id,)) for tippee, pt_amount, opt in transfers: for i, pt in enumerate(payin_transfers): payin_transfers[i] = update_payin_transfer( self.db, pt.id, opt.get('remote_id', 'fake'), opt.get('status', status), opt.get('error', error) ) if pt.team: Participant.from_id(pt.recipient).update_receiving() tippee.update_receiving() payer.update_giving() return payin, payin_transfers
def make_payin_and_transfers( self, route, amount, transfers, status='succeeded', error=None, payer_country=None, remote_id='fake', ): payer = route.participant payin = prepare_payin(self.db, payer, amount, route) payin = update_payin(self.db, payin.id, remote_id, status, error) provider = route.network.split('-', 1)[0] payin_transfers = [] for tippee, pt_amount, opt in transfers: try: destination = resolve_destination(self.db, tippee, provider, payer, payer_country, pt_amount) except MissingPaymentAccount as e: destination = self.add_payment_account(e.args[0], provider) recipient = Participant.from_id(destination.participant) if tippee.kind == 'group': context = 'team-donation' team = tippee.id else: context = 'personal-donation' team = None pt = prepare_payin_transfer(self.db, payin, recipient, destination, context, pt_amount, opt.get('unit_amount'), opt.get('period'), team) pt = update_payin_transfer(self.db, pt.id, opt.get('remote_id', 'fake'), opt.get('status', status), opt.get('error', error)) payin_transfers.append(pt) tippee.update_receiving() if team: recipient.update_receiving() payer.update_giving() return payin, payin_transfers
def make_payin_and_transfers( self, route, amount, transfers, status='succeeded', error=None, payer_country=None, fee=None, remote_id='fake', ): payer = route.participant provider = route.network.split('-', 1)[0] proto_transfers = [] net_amount = 0 for tippee, pt_amount, opt in transfers: net_amount += pt_amount tip = opt.get('tip') if tip: assert tip.tipper == payer.id assert tip.tippee == tippee.id else: tip = self.db.one( """ SELECT * FROM current_tips WHERE tipper = %s AND tippee = %s """, (payer.id, tippee.id)) assert tip for i in range(100): try: proto_transfers.extend( resolve_tip(self.db, tip, tippee, provider, payer, payer_country, pt_amount)) except MissingPaymentAccount as e: if i > 95: # Infinite loop? raise recipient = e.args[0] if recipient.kind == 'group': raise self.add_payment_account(recipient, provider) else: break payin, payin_transfers = prepare_payin(self.db, payer, amount, route, proto_transfers) del proto_transfers payin = update_payin(self.db, payin.id, remote_id, status, error, fee=fee) if len(payin_transfers) > 1: adjust_payin_transfers(self.db, payin, net_amount) else: pt = payin_transfers[0] # Call `update_payin_transfer` twice to uncover bugs pt = update_payin_transfer(self.db, pt.id, None, pt.status, None, amount=net_amount) pt = update_payin_transfer(self.db, pt.id, None, pt.status, None) assert pt.amount == net_amount payin_transfers = self.db.all( """ SELECT * FROM payin_transfers WHERE payin = %s ORDER BY ctime """, (payin.id, )) fallback_remote_id = 'fake' if payin.status == 'succeeded' else None options_by_tippee = { tippee.id: opt for tippee, pt_amount, opt in transfers } for i, pt in enumerate(payin_transfers): opt = options_by_tippee[pt.team or pt.recipient] payin_transfers[i] = update_payin_transfer( self.db, pt.id, opt.get('remote_id', fallback_remote_id), opt.get('status', status), opt.get('error', error)) if pt.team: Participant.from_id(pt.recipient).update_receiving() for tippee, pt_amount, opt in transfers: tippee.update_receiving() payer.update_giving() # Call `update_payin` again to uncover bugs payin = update_payin(self.db, payin.id, remote_id, status, error) return payin, payin_transfers