Skip to content

Commit 182dfa0

Browse files
authored
Merge pull request #108 from starkinfra/feature/brcode-preview-subscription
Add subscription and due attribute to BR code preview
2 parents 57b99da + 3d804eb commit 182dfa0

File tree

8 files changed

+180
-19
lines changed

8 files changed

+180
-19
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ Given a version number MAJOR.MINOR.PATCH, increment:
1313

1414

1515
## [Unreleased]
16+
### Added
17+
- subcription and due attribute to BrcodePreview resource
1618

1719
## [0.20.0] - 2025-05-13
1820
### Added

starkinfra/brcodepreview/__brcodepreview.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from ..utils import rest
22
from starkcore.utils.resource import Resource
3+
from starkcore.utils.api import from_api_json
4+
from ..subscription.__subscription import Subscription
35
from starkcore.utils.checks import check_datetime_or_date
6+
from ..subscription.__subscription import _resource as _subscription_resource
47

58

69
class BrcodePreview(Resource):
@@ -25,6 +28,7 @@ class BrcodePreview(Resource):
2528
- cashier_bank_code [string]: Cashier's bank code. ex: "20018183"
2629
- cashier_type [string]: Cashier's type. Options: "merchant", "participant" and "other"
2730
- discount_amount [integer]: Discount value calculated over nominal_amount. ex: 3000
31+
- due [datetime.datetime]: BR Code due date. ex: datetime(2020, 3, 10)
2832
- fine_amount [integer]: Fine value calculated over nominal_amount. ex: 20000
2933
- interest_amount [integer]: Interest value calculated over nominal_amount. ex: 10000
3034
- key_id [string]: Receiver's PixKey id. ex: "+5511989898989"
@@ -34,13 +38,14 @@ class BrcodePreview(Resource):
3438
- reduction_amount [integer]: Reduction value to discount from nominal_amount. ex: 1000
3539
- scheduled [datetime.datetime]: date of payment execution. ex: datetime(2020, 3, 10)
3640
- status [string]: Payment status. ex: "created", "paid", "canceled" or "expired"
41+
- subscription [Subscription]: BR code subscription information
3742
- tax_id [string]: Payment receiver tax ID. ex: "012.345.678-90"
3843
"""
3944

4045
def __init__(self, id, payer_id, account_number=None, account_type=None, amount=None, amount_type=None, bank_code=None,
41-
branch_code=None, cash_amount=None, cashier_bank_code=None, cashier_type=None, discount_amount=None,
46+
branch_code=None, cash_amount=None, cashier_bank_code=None, cashier_type=None, discount_amount=None, due=None,
4247
fine_amount=None, interest_amount=None, key_id=None, name=None, nominal_amount=None, end_to_end_id=None,
43-
reconciliation_id=None, reduction_amount=None, scheduled=None, status=None, tax_id=None, description=None):
48+
reconciliation_id=None, reduction_amount=None, scheduled=None, subscription=None, status=None, tax_id=None, description=None):
4449
Resource.__init__(self, id=id)
4550

4651
self.payer_id = payer_id
@@ -55,6 +60,9 @@ def __init__(self, id, payer_id, account_number=None, account_type=None, amount=
5560
self.cashier_bank_code = cashier_bank_code
5661
self.cashier_type = cashier_type
5762
self.discount_amount = discount_amount
63+
if(due == ""):
64+
due = None
65+
self.due = check_datetime_or_date(due)
5866
self.fine_amount = fine_amount
5967
self.interest_amount = interest_amount
6068
self.key_id = key_id
@@ -64,12 +72,19 @@ def __init__(self, id, payer_id, account_number=None, account_type=None, amount=
6472
self.reduction_amount = reduction_amount
6573
self.scheduled = check_datetime_or_date(scheduled)
6674
self.status = status
75+
self.subscription = _parse_subscription(subscription)
6776
self.tax_id = tax_id
6877
self.description = description
6978

7079

7180
_resource = {"class": BrcodePreview, "name": "BrcodePreview"}
7281

82+
def _parse_subscription(subscription):
83+
if not subscription or subscription is None:
84+
return None
85+
if isinstance(subscription, Subscription):
86+
return subscription
87+
return from_api_json(_subscription_resource, subscription)
7388

7489
def create(previews, user=None):
7590
"""# Retrieve BrcodePreviews

starkinfra/subscription/__init__.py

Whitespace-only changes.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from starkcore.utils.subresource import SubResource
2+
from starkcore.utils.checks import check_datetime_or_date
3+
4+
5+
class Subscription(SubResource):
6+
"""# Subscription object
7+
Subscription is a recurring payment that can be used to charge a user periodically.
8+
## Attributes (return-only):
9+
- amount [integer]: amount to be charged in cents. ex: 1000 = R$ 10.00
10+
- amount_min_limit [integer]: minimum amount limit for the subscription. ex: 500 = R$ 5.00
11+
- bacen_id [string]: BACEN (Brazilian Central Bank) identifier.
12+
- created [datetime.datetime]: creation datetime for the subscription. ex: datetime(2020, 3, 10)
13+
- description [string]: description of the subscription.
14+
- installment_end [datetime.datetime]: end datetime for the installments. ex: datetime(2020, 3, 10)
15+
- installment_start [datetime.datetime]: start datetime for the installments. ex: datetime(2020, 3, 10)
16+
- interval [string]: interval for the recurring charge. ex: "monthly"
17+
- pull_retry_limit [integer]: maximum number of retries for pulling the payment.
18+
- receiver_bank_code [string]: bank code of the receiver.
19+
- receiver_name [string]: name of the receiver.
20+
- receiver_tax_id [string]: tax ID of the receiver.
21+
- reference_code [string]: reference code for the subscription.
22+
- sender_final_name [string]: final sender name.
23+
- sender_final_tax_id [string]: final sender tax ID.
24+
- status [string]: current status of the subscription.
25+
- type [string]: type of the subscription.
26+
- updated [datetime.datetime]: last update datetime for the subscription. ex: datetime(2020, 3, 10)
27+
"""
28+
29+
def __init__(self, amount, amount_min_limit=None, bacen_id=None, created=None, description=None,
30+
installment_end=None, installment_start=None, interval=None, pull_retry_limit=None, receiver_bank_code=None,
31+
receiver_name=None, receiver_tax_id=None, reference_code=None, sender_final_name=None, sender_final_tax_id=None,
32+
status=None, type=None, updated=None
33+
):
34+
self.amount = amount
35+
self.amount_min_limit = amount_min_limit
36+
self.bacen_id = bacen_id
37+
self.created = check_datetime_or_date(created)
38+
self.description = description
39+
self.installment_end = check_datetime_or_date(installment_end)
40+
self.installment_start = check_datetime_or_date(installment_start)
41+
self.interval = interval
42+
self.pull_retry_limit = pull_retry_limit
43+
self.receiver_bank_code = receiver_bank_code
44+
self.receiver_name = receiver_name
45+
self.receiver_tax_id = receiver_tax_id
46+
self.reference_code = reference_code
47+
self.sender_final_name = sender_final_name
48+
self.sender_final_tax_id = sender_final_tax_id
49+
self.status = status
50+
self.type = type
51+
self.updated = check_datetime_or_date(updated)
52+
53+
54+
_resource = {"class": Subscription, "name": "Subscription"}

tests/sdk/testBrcodePreview.py

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import starkinfra
22
from unittest import TestCase, main
33
from tests.utils.user import exampleProject
4+
from tests.utils.brcodePreview import create_brcode_preview_by_id
5+
from tests.utils.dynamicBrcode import create_dynamic_brcode_by_type
46

57

68
starkinfra.user = exampleProject
79

810

9-
class TestBrcodePreview(TestCase):
11+
class TestCreateBrcodePreview(TestCase):
1012

11-
def test_success(self):
13+
def test_query_and_create(self):
1214
static_brcodes = list(starkinfra.staticbrcode.query(limit=2))
1315

1416
dynamic_brcodes = list(starkinfra.dynamicbrcode.query(limit=2))
@@ -18,19 +20,19 @@ def test_success(self):
1820
previews = starkinfra.brcodepreview.create([
1921
starkinfra.BrcodePreview(
2022
id=brcodes[0].id,
21-
payer_id="012.345.678-90"
23+
payer_id="20018183000180"
2224
),
2325
starkinfra.BrcodePreview(
2426
id=brcodes[1].id,
25-
payer_id="012.345.678-90"
27+
payer_id="20018183000180"
2628
),
2729
starkinfra.BrcodePreview(
2830
id=brcodes[2].id,
29-
payer_id="012.345.678-90"
31+
payer_id="20018183000180"
3032
),
3133
starkinfra.BrcodePreview(
3234
id=brcodes[3].id,
33-
payer_id="012.345.678-90"
35+
payer_id="20018183000180"
3436
)
3537
])
3638

@@ -39,8 +41,47 @@ def test_success(self):
3941
index = 0
4042
for preview in previews:
4143
self.assertEqual(str(preview.id), str(brcodes[index].id))
42-
print(preview)
4344
index = index + 1
45+
46+
def test_create_type_instant(self):
47+
created_dynamic_brcode = create_dynamic_brcode_by_type("instant")
48+
preview = create_brcode_preview_by_id(created_dynamic_brcode.id)
49+
50+
self.assertEqual(preview.id, created_dynamic_brcode.id)
51+
self.assertEqual(preview.due, None)
52+
self.assertEqual(preview.subscription, None)
53+
54+
def test_create_type_due(self):
55+
created_dynamic_brcode = create_dynamic_brcode_by_type("due")
56+
preview = create_brcode_preview_by_id(created_dynamic_brcode.id)
57+
58+
self.assertEqual(preview.id, created_dynamic_brcode.id)
59+
self.assertNotEqual(preview.due, None)
60+
self.assertEqual(preview.subscription, None)
61+
62+
def test_create_type_subscription(self):
63+
created_dynamic_brcode = create_dynamic_brcode_by_type("subscription")
64+
preview = create_brcode_preview_by_id(created_dynamic_brcode.id)
65+
66+
self.assertEqual(preview.id, created_dynamic_brcode.id)
67+
self.assertEqual(preview.payer_id, '')
68+
self.assertEqual(preview.subscription.type, "qrcode")
69+
70+
def test_create_type_subscription_and_instant(self):
71+
created_dynamic_brcode = create_dynamic_brcode_by_type("subscriptionAndInstant")
72+
preview = create_brcode_preview_by_id(created_dynamic_brcode.id)
73+
74+
self.assertEqual(preview.id, created_dynamic_brcode.id)
75+
self.assertNotEqual(preview.payer_id, None)
76+
self.assertEqual(preview.subscription.type, "qrcodeAndPayment")
77+
78+
def test_create_type_due_and_or_subscription(self):
79+
created_dynamic_brcode = create_dynamic_brcode_by_type("dueAndOrSubscription")
80+
preview = create_brcode_preview_by_id(created_dynamic_brcode.id)
81+
82+
self.assertEqual(preview.id, created_dynamic_brcode.id)
83+
self.assertNotEqual(preview.payer_id, None)
84+
self.assertEqual(preview.subscription.type, "paymentAndOrQrcode")
4485

4586

4687
if __name__ == '__main__':

tests/sdk/testDynamicBrcode.py

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from datetime import date, timedelta, datetime
55
from tests.utils.user import exampleProject
66
from starkcore.error import InvalidSignatureError
7-
from tests.utils.dynamicBrcode import generateExampleDynamicBrcodeJson
7+
from tests.utils.dynamicBrcode import create_dynamic_brcode_by_type
88

99
starkinfra.user = exampleProject
1010

@@ -52,13 +52,40 @@ def test_success(self):
5252

5353
class TestDynamicBrcodePost(TestCase):
5454

55-
def test_success(self):
56-
example_dynamic_brcode = generateExampleDynamicBrcodeJson()
57-
dynamic_brcode = starkinfra.dynamicbrcode.create(
58-
brcodes=[example_dynamic_brcode]
59-
)
60-
for brcode in dynamic_brcode:
61-
print(brcode)
55+
def test_create_instant_brcode(self):
56+
type = "instant"
57+
created_brcode = create_dynamic_brcode_by_type(type)
58+
59+
self.assertEqual(created_brcode.type, type)
60+
self.assertNotEqual(created_brcode.uuid, "")
61+
62+
def test_create_due_brcode(self):
63+
type = "due"
64+
created_brcode = create_dynamic_brcode_by_type(type)
65+
66+
self.assertEqual(created_brcode.type, type)
67+
self.assertNotEqual(created_brcode.uuid, "")
68+
69+
def test_create_subscription_brcode(self):
70+
type = "subscription"
71+
created_brcode = create_dynamic_brcode_by_type(type)
72+
73+
self.assertEqual(created_brcode.type, type)
74+
self.assertNotEqual(created_brcode.uuid, "")
75+
76+
def test_create_subscription_and_instant_brcode(self):
77+
type = "subscriptionAndInstant"
78+
created_brcode = create_dynamic_brcode_by_type(type)
79+
80+
self.assertEqual(created_brcode.type, type)
81+
self.assertNotEqual(created_brcode.uuid, "")
82+
83+
def test_create_due_and_or_subscription_brcode(self):
84+
type = "dueAndOrSubscription"
85+
created_brcode = create_dynamic_brcode_by_type(type)
86+
87+
self.assertEqual(created_brcode.type, type)
88+
self.assertNotEqual(created_brcode.uuid, "")
6289

6390

6491
class TestDynamicBrcodeParseRight(TestCase):

tests/utils/brcodePreview.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import starkinfra
2+
from starkinfra import BrcodePreview
3+
4+
def create_brcode_preview_by_id(id):
5+
previews = starkinfra.brcodepreview.create([
6+
starkinfra.BrcodePreview(
7+
id=id,
8+
payer_id="20018183000180"
9+
)
10+
])
11+
return previews[0]

tests/utils/dynamicBrcode.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import random
2+
import starkinfra
23
from starkinfra import DynamicBrcode
34

45

@@ -10,7 +11,17 @@
1011
)
1112

1213

13-
def generateExampleDynamicBrcodeJson():
14+
def generate_example_dynamic_brcode_json(type = None):
1415
example_dynamic_brcode.type = random.choice(["instant", "due"])
15-
example_dynamic_brcode.external_id = str(random.randint(1, 100000))
16+
example_dynamic_brcode.external_id = str(random.randint(1, 1000000))
1617
return example_dynamic_brcode
18+
19+
def create_dynamic_brcode_by_type(type = None):
20+
example_dynamic_brcode.type = type
21+
if type is None:
22+
type = random.choice(["instant", "due", "subscription", "subscriptionAndInstant", "dueAndOrSubscription"])
23+
example_dynamic_brcode.external_id = str(random.randint(1, 1000000))
24+
dynamic_brcode = starkinfra.dynamicbrcode.create(
25+
brcodes=[example_dynamic_brcode]
26+
)
27+
return dynamic_brcode[0]

0 commit comments

Comments
 (0)