diff --git a/recurly/__init__.py b/recurly/__init__.py
index 3e409c83..8ce0c6ed 100644
--- a/recurly/__init__.py
+++ b/recurly/__init__.py
@@ -515,6 +515,24 @@ class GatewayAttributes(Resource):
'account_reference',
)
+class GeneralLedgerAccount(Resource):
+
+ """General Ledger Account for Revenue Recognition"""
+
+ member_path = 'general_ledger_accounts/%s'
+ collection_path = 'general_ledger_accounts'
+
+ nodename = 'general_ledger_account'
+
+ attributes = (
+ 'id',
+ 'account_type',
+ 'code',
+ 'description',
+ 'created_at',
+ 'updated_at',
+ )
+
class BillingInfo(Resource):
"""A set of billing information for an account."""
diff --git a/tests/fixtures/general_ledger_accounts/created.xml b/tests/fixtures/general_ledger_accounts/created.xml
new file mode 100644
index 00000000..367682ed
--- /dev/null
+++ b/tests/fixtures/general_ledger_accounts/created.xml
@@ -0,0 +1,28 @@
+POST https://api.recurly.com/v2/general_ledger_accounts HTTP/1.1
+X-Api-Version: {api-version}
+Accept: application/xml
+Authorization: Basic YXBpa2V5Og==
+User-Agent: {user-agent}
+Content-Type: application/xml; charset=utf-8
+
+
+
+ liability
+ code2
+ Liability Description
+
+
+
+HTTP/1.1 201 Created
+Content-Type: application/xml; charset=utf-8
+Location: https://api.recurly.com/v2/general_ledger_accounts/u9hmrpzksuy8
+
+
+
+ u9hmrpzksuy8
+ code2
+ liability
+ Liability Description
+ 2024-01-18T23:20:01Z
+ 2024-01-18T23:20:01Z
+
diff --git a/tests/fixtures/general_ledger_accounts/get.xml b/tests/fixtures/general_ledger_accounts/get.xml
new file mode 100644
index 00000000..95f0caa1
--- /dev/null
+++ b/tests/fixtures/general_ledger_accounts/get.xml
@@ -0,0 +1,20 @@
+GET https://api.recurly.com/v2/general_ledger_accounts/u90r5deeaxix HTTP/1.1
+X-Api-Version: {api-version}
+Accept: application/xml
+Authorization: Basic YXBpa2V5Og==
+User-Agent: {user-agent}
+
+
+HTTP/1.1 200 OK
+X-Records: 1
+Content-Type: application/xml; charset=utf-8
+
+
+
+ u90r5deeaxix
+ code1
+ revenue
+ Some Description
+ 2024-01-16T14:34:16Z
+ 2024-01-16T14:34:16Z
+
diff --git a/tests/fixtures/general_ledger_accounts/list.xml b/tests/fixtures/general_ledger_accounts/list.xml
new file mode 100644
index 00000000..b4311264
--- /dev/null
+++ b/tests/fixtures/general_ledger_accounts/list.xml
@@ -0,0 +1,30 @@
+GET https://api.recurly.com/v2/general_ledger_accounts HTTP/1.1
+X-Api-Version: {api-version}
+Accept: application/xml
+Authorization: Basic YXBpa2V5Og==
+User-Agent: {user-agent}
+
+
+HTTP/1.1 200 OK
+X-Records: 1
+Content-Type: application/xml; charset=utf-8
+
+
+
+
+ u90r5deeaxix
+ code1
+ revenue
+ Some Description
+ 2024-01-16T14:34:16Z
+ 2024-01-16T14:34:16Z
+
+
+ u9hmrpzksuy8
+ code2
+ liability
+ Liability Description
+ 2024-01-18T23:20:01Z
+ 2024-01-18T23:20:01Z
+
+
diff --git a/tests/fixtures/general_ledger_accounts/list_filtered.xml b/tests/fixtures/general_ledger_accounts/list_filtered.xml
new file mode 100644
index 00000000..7f5fc180
--- /dev/null
+++ b/tests/fixtures/general_ledger_accounts/list_filtered.xml
@@ -0,0 +1,22 @@
+GET https://api.recurly.com/v2/general_ledger_accounts?account_type=revenue HTTP/1.1
+X-Api-Version: {api-version}
+Accept: application/xml
+Authorization: Basic YXBpa2V5Og==
+User-Agent: {user-agent}
+
+
+HTTP/1.1 200 OK
+X-Records: 1
+Content-Type: application/xml; charset=utf-8
+
+
+
+
+ u90r5deeaxix
+ code1
+ revenue
+ Some Description
+ 2024-01-16T14:34:16Z
+ 2024-01-16T14:34:16Z
+
+
diff --git a/tests/fixtures/general_ledger_accounts/updated.xml b/tests/fixtures/general_ledger_accounts/updated.xml
new file mode 100644
index 00000000..87906a15
--- /dev/null
+++ b/tests/fixtures/general_ledger_accounts/updated.xml
@@ -0,0 +1,27 @@
+PUT https://api.recurly.com/v2/general_ledger_accounts/u90r5deeaxix HTTP/1.1
+X-Api-Version: {api-version}
+Accept: application/xml
+Authorization: Basic YXBpa2V5Og==
+User-Agent: {user-agent}
+Content-Type: application/xml; charset=utf-8
+
+
+
+ code2
+ Updated Description
+
+
+
+HTTP/1.1 200 OK
+Content-Type: application/xml; charset=utf-8
+Location: https://api.recurly.com/v2/general_ledger_accounts/u90r5deeaxix
+
+
+
+ u90r5deeaxix
+ code2
+ liability
+ Updated Description
+ 2024-01-18T23:20:01Z
+ 2024-01-18T23:24:47Z
+
diff --git a/tests/test_resources.py b/tests/test_resources.py
index b2cfaa00..22492414 100644
--- a/tests/test_resources.py
+++ b/tests/test_resources.py
@@ -9,7 +9,7 @@
from recurly import Account, AddOn, Address, Adjustment, BillingInfo, Coupon, Item, Plan, Redemption, Subscription, \
SubscriptionAddOn, Transaction, MeasuredUnit, Usage, GiftCard, Delivery, ShippingAddress, AccountAcquisition, \
Purchase, Invoice, InvoiceCollection, CreditPayment, CustomField, ExportDate, ExportDateFile, DunningCampaign, \
- DunningCycle, InvoiceTemplate, PlanRampInterval, SubRampInterval, ExternalSubscription, ExternalProduct, \
+ DunningCycle, GeneralLedgerAccount, InvoiceTemplate, PlanRampInterval, SubRampInterval, ExternalSubscription, ExternalProduct, \
ExternalProductReference, ExternalPaymentPhase, CustomFieldDefinition, ExternalInvoice, ExternalCharge, ExternalAccount, \
GatewayAttributes, BusinessEntity
from recurly import Money, NotFoundError, ValidationError, BadRequestError, PageError
@@ -3393,6 +3393,53 @@ def test_account_external_accounts(self):
with self.mock_request('account/created-with-external-accounts.xml'):
account.save()
+ def test_list_general_ledger_accounts(self):
+ with self.mock_request('general_ledger_accounts/list.xml'):
+ general_ledger_accounts = GeneralLedgerAccount.all()
+
+ self.assertEqual(len(general_ledger_accounts), 2)
+
+ def test_list_filtered_general_ledger_accounts(self):
+ with self.mock_request('general_ledger_accounts/list_filtered.xml'):
+ general_ledger_accounts = GeneralLedgerAccount.all(account_type='revenue')
+
+ self.assertEqual(len(general_ledger_accounts), 1)
+ self.assertEqual(general_ledger_accounts[0].account_type, 'revenue')
+
+ def test_get_general_ledger_accounts(self):
+ with self.mock_request('general_ledger_accounts/get.xml'):
+ general_ledger_account = GeneralLedgerAccount.get('u90r5deeaxix')
+
+ self.assertEqual(general_ledger_account.id, 'u90r5deeaxix')
+ self.assertEqual(general_ledger_account.code, 'code1')
+ self.assertEqual(general_ledger_account.account_type, 'revenue')
+ self.assertEqual(general_ledger_account.description, 'Some Description')
+
+ def test_create_general_ledger_account(self):
+ general_ledger_account = GeneralLedgerAccount(
+ code='code2',
+ account_type='liability',
+ description='Liability Description'
+ )
+ with self.mock_request('general_ledger_accounts/created.xml'):
+ general_ledger_account.save()
+
+ self.assertEquals(general_ledger_account.code, 'code2')
+ self.assertEquals(general_ledger_account.account_type, 'liability')
+ self.assertEquals(general_ledger_account.description, 'Liability Description')
+
+ def test_update_general_ledger_account(self):
+ with self.mock_request('general_ledger_accounts/get.xml'):
+ general_ledger_account = GeneralLedgerAccount.get('u90r5deeaxix')
+
+ with self.mock_request('general_ledger_accounts/updated.xml'):
+ general_ledger_account.code = 'code2'
+ general_ledger_account.description = 'Updated Description'
+ general_ledger_account.save()
+
+ self.assertEquals(general_ledger_account.code, 'code2')
+ self.assertEquals(general_ledger_account.description, 'Updated Description')
+
if __name__ == '__main__':
import unittest
unittest.main()