def sync_with_mangopay(db): """We can get out of sync with MangoPay if record_exchange_result wasn't completed. This is where we fix that. """ check_db(db) exchanges = db.all("SELECT * FROM exchanges WHERE status = 'pre'") for e in exchanges: p = Participant.from_id(e.participant) transactions = Transaction.all(user_id=p.mangopay_user_id) transactions = [x for x in transactions if x.Tag == str(e.id)] assert len(transactions) < 2 if transactions: t = transactions[0] error = repr_error(t) status = t.Status.lower() assert (not error) ^ (status == 'failed') record_exchange_result(db, e.id, status, error, p) else: # The exchange didn't happen if e.amount < 0: # Mark it as failed if it was a credit record_exchange_result(db, e.id, 'failed', 'interrupted', p) else: # Otherwise forget about it db.run("DELETE FROM exchanges WHERE id=%s", (e.id,)) transfers = db.all("SELECT * FROM transfers WHERE status = 'pre'") for t in transfers: tipper = Participant.from_id(t.tipper) transactions = Transaction.all(user_id=tipper.mangopay_user_id) transactions = [x for x in transactions if x.Type == 'TRANSFER' and x.Tag == str(t.id)] assert len(transactions) < 2 if transactions: record_transfer_result(db, t.id, transactions[0]) else: # The transfer didn't happen, remove it db.run("DELETE FROM transfers WHERE id = %s", (t.id,)) check_db(db)
def test_retrieve_users_transactions(self): self.mock_natural_user() self.mock_legal_user() self.mock_user_wallet() self.mock_card() self.register_mock([{ 'method': responses.GET, 'url': settings.MANGOPAY_API_SANDBOX_URL + settings.MANGOPAY_CLIENT_ID + '/users/1167495', 'body': { "FirstName": "Victor", "LastName": "Hugo", "Address": { "AddressLine1": "AddressLine1", "AddressLine2": "AddressLine2", "City": "City", "Region": "Region", "PostalCode": "11222", "Country": "FR" }, "Birthday": today_timestamp, "Nationality": "FR", "CountryOfResidence": "FR", "Occupation": "Writer", "IncomeRange": 6, "ProofOfIdentity": None, "ProofOfAddress": None, "PersonType": "NATURAL", "Email": "*****@*****.**", "Id": "1169419", "Tag": "custom tag", "CreationDate": 1383321421, "KYCLevel": "LIGHT", "UserCategory": "OWNER" }, 'status': 200 }, { 'method': responses.POST, 'url': settings.MANGOPAY_API_SANDBOX_URL + settings.MANGOPAY_CLIENT_ID + '/transfers', 'body': { "Id": "1169434", "Tag": "DefaultTag", "CreationDate": 1431648000, "AuthorId": "1167495", "CreditedUserId": "1167502", "DebitedFunds": { "Currency": "EUR", "Amount": 1000 }, "CreditedFunds": { "Currency": "EUR", "Amount": 900 }, "Fees": { "Currency": "EUR", "Amount": 100 }, "Status": "SUCCEEDED", "ResultCode": "000000", "ResultMessage": "Success", "ExecutionDate": today_timestamp, "Type": "TRANSFER", "Nature": "REGULAR", "DebitedWalletId": "1167496", "CreditedWalletId": "1167504" }, 'status': 200 }, { 'method': responses.GET, 'url': settings.MANGOPAY_API_SANDBOX_URL + settings.MANGOPAY_CLIENT_ID + '/users/1169419/transactions', 'body': [{ "Id": "1174837", "Tag": "my transfer", "CreationDate": 1431648000, "AuthorId": "1167495", "CreditedUserId": "1167502", "DebitedFunds": { "Currency": "EUR", "Amount": 1000 }, "CreditedFunds": { "Currency": "EUR", "Amount": 900 }, "Fees": { "Currency": "EUR", "Amount": 100 }, "Status": "SUCCEEDED", "ResultCode": "000000", "ResultMessage": "Success", "ExecutionDate": today_timestamp, "Type": "TRANSFER", "Nature": "REGULAR", "CreditedWalletId": "1167496", "DebitedWalletId": "1167504" }], 'status': 200 }]) wallet_params = { 'tag': 'My custom tag', 'owners': [self.card.user], 'description': 'Wallet of Victor Hugo', 'currency': 'EUR' } wallet = Wallet(**wallet_params) wallet.save() # Create a transaction: params = { "author": self.card.user, "credited_user": self.legal_user, "debited_funds": Money(amount=10, currency='EUR'), "fees": Money(amount=1, currency='EUR'), "debited_wallet": wallet, "credited_wallet": self.legal_user_wallet, "tag": "custom tag" } transfer = Transfer(**params) transfer.save() # List wallet's transactions transactions = Transaction.all(**{"user_id": self.card.user.id}) self.assertEqual(len(transactions), 1) self.assertEqual(transactions[0].type, 'TRANSFER')
def test_retrieve_users_transactions(self): self.mock_natural_user() self.mock_legal_user() self.mock_user_wallet() self.mock_card() self.register_mock([ { 'method': responses.GET, 'url': settings.MANGOPAY_API_SANDBOX_URL + settings.MANGOPAY_CLIENT_ID + '/users/1167495', 'body': { "FirstName": "Victor", "LastName": "Hugo", "Address": { "AddressLine1": "AddressLine1", "AddressLine2": "AddressLine2", "City": "City", "Region": "Region", "PostalCode": "11222", "Country": "FR" }, "Birthday": today_timestamp, "Nationality": "FR", "CountryOfResidence": "FR", "Occupation": "Writer", "IncomeRange": 6, "ProofOfIdentity": None, "ProofOfAddress": None, "PersonType": "NATURAL", "Email": "*****@*****.**", "Id": "1169419", "Tag": "custom tag", "CreationDate": 1383321421, "KYCLevel": "LIGHT" }, 'status': 200 }, { 'method': responses.POST, 'url': settings.MANGOPAY_API_SANDBOX_URL + settings.MANGOPAY_CLIENT_ID + '/transfers', 'body': { "Id": "1169434", "Tag": "DefaultTag", "CreationDate": 1431648000, "AuthorId": "1167495", "CreditedUserId": "1167502", "DebitedFunds": { "Currency": "EUR", "Amount": 1000 }, "CreditedFunds": { "Currency": "EUR", "Amount": 900 }, "Fees": { "Currency": "EUR", "Amount": 100 }, "Status": "SUCCEEDED", "ResultCode": "000000", "ResultMessage": "Success", "ExecutionDate": today_timestamp, "Type": "TRANSFER", "Nature": "REGULAR", "DebitedWalletId": "1167496", "CreditedWalletId": "1167504" }, 'status': 200 }, { 'method': responses.GET, 'url': settings.MANGOPAY_API_SANDBOX_URL + settings.MANGOPAY_CLIENT_ID + '/users/1169419/transactions', 'body': [ { "Id": "1174837", "Tag": "my transfer", "CreationDate": 1431648000, "AuthorId": "1167495", "CreditedUserId": "1167502", "DebitedFunds": { "Currency": "EUR", "Amount": 1000 }, "CreditedFunds": { "Currency": "EUR", "Amount": 900 }, "Fees": { "Currency": "EUR", "Amount": 100 }, "Status": "SUCCEEDED", "ResultCode": "000000", "ResultMessage": "Success", "ExecutionDate": today_timestamp, "Type": "TRANSFER", "Nature": "REGULAR", "CreditedWalletId": "1167496", "DebitedWalletId": "1167504" } ], 'status': 200 } ]) wallet_params = { 'tag': 'My custom tag', 'owners': [self.card.user], 'description': 'Wallet of Victor Hugo', 'currency': 'EUR' } wallet = Wallet(**wallet_params) wallet.save() # Create a transaction: params = { "author": self.card.user, "credited_user": self.legal_user, "debited_funds": Money(amount=10, currency='EUR'), "fees": Money(amount=1, currency='EUR'), "debited_wallet": wallet, "credited_wallet": self.legal_user_wallet, "tag": "custom tag" } transfer = Transfer(**params) transfer.save() # List wallet's transactions transactions = Transaction.all(**{"user_id": self.card.user.id}) self.assertEqual(len(transactions), 1) self.assertEqual(transactions[0].type, 'TRANSFER')