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
示例#2
0
 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
示例#3
0
 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
示例#4
0
 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
示例#5
0
 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
示例#6
0
 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