Skip to content

Commit 1f2bdb2

Browse files
authored
Merge pull request #328 from ej2/0.9.5
0.9.5
2 parents 5d29d1f + b12f7cf commit 1f2bdb2

18 files changed

+500
-296
lines changed

CHANGELOG.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
Changelog
22
=========
3+
* 0.9.5 (November 1, 2023)
4+
* Added the ability to void all voidable QB types
5+
* Added to_ref to CreditMemo object
6+
* Added ProjectRef and ShipFromAddr to Estimate
7+
* Added missing initialization for objects on DiscountLineDetail, Estimate, Employee, and Invoice
8+
39
* 0.9.4 (August 29, 2023)
410
* Removed python 2 compatible decorators
511
* Removed python 2 dependencies

Pipfile

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,3 @@ simplejson = ">=3.19.1"
1515
nose = "*"
1616
coverage = "*"
1717
twine = "*"
18-
19-
[requires]
20-
python_version = "3.8"

Pipfile.lock

Lines changed: 282 additions & 251 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

quickbooks/mixins.py

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,21 +119,66 @@ def send(self, qb=None, send_to=None):
119119

120120

121121
class VoidMixin(object):
122+
123+
def get_void_params(self):
124+
qb_object_params_map = {
125+
"Payment": {
126+
"operation": "update",
127+
"include": "void"
128+
},
129+
"SalesReceipt": {
130+
"operation": "update",
131+
"include": "void"
132+
},
133+
"BillPayment": {
134+
"operation": "update",
135+
"include": "void"
136+
},
137+
"Invoice": {
138+
"operation": "void",
139+
},
140+
}
141+
# setting the default operation to void (the original behavior)
142+
return qb_object_params_map.get(self.qbo_object_name, {"operation": "void"})
143+
144+
def get_void_data(self):
145+
qb_object_params_map = {
146+
"Payment": {
147+
"Id": self.Id,
148+
"SyncToken": self.SyncToken,
149+
"sparse": True
150+
},
151+
"SalesReceipt": {
152+
"Id": self.Id,
153+
"SyncToken": self.SyncToken,
154+
"sparse": True
155+
},
156+
"BillPayment": {
157+
"Id": self.Id,
158+
"SyncToken": self.SyncToken,
159+
"sparse": True
160+
},
161+
"Invoice": {
162+
"Id": self.Id,
163+
"SyncToken": self.SyncToken,
164+
},
165+
}
166+
# setting the default operation to void (the original behavior)
167+
return qb_object_params_map.get(self.qbo_object_name, {"operation": "void"})
168+
122169
def void(self, qb=None):
123170
if not qb:
124171
qb = QuickBooks()
125172

126173
if not self.Id:
127174
raise QuickbooksException('Cannot void unsaved object')
128175

129-
data = {
130-
'Id': self.Id,
131-
'SyncToken': self.SyncToken,
132-
}
133-
134176
endpoint = self.qbo_object_name.lower()
135177
url = "{0}/company/{1}/{2}".format(qb.api_url, qb.company_id, endpoint)
136-
results = qb.post(url, json.dumps(data), params={'operation': 'void'})
178+
179+
data = self.get_void_data()
180+
params = self.get_void_params()
181+
results = qb.post(url, json.dumps(data), params=params)
137182

138183
return results
139184

quickbooks/objects/attachable.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def save(self, qb=None):
5858
else:
5959
json_data = qb.create_object(self.qbo_object_name, self.to_json(), _file_path=self._FilePath)
6060

61-
if self.FileName:
61+
if self.Id is None and self.FileName:
6262
obj = type(self).from_json(json_data['AttachableResponse'][0]['Attachable'])
6363
else:
6464
obj = type(self).from_json(json_data['Attachable'])

quickbooks/objects/billpayment.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from .base import QuickbooksBaseObject, Ref, LinkedTxn, QuickbooksManagedObject, LinkedTxnMixin, \
22
QuickbooksTransactionEntity
3-
from ..mixins import DeleteMixin
3+
from ..mixins import DeleteMixin, VoidMixin
44

55

66
class CheckPayment(QuickbooksBaseObject):
@@ -47,7 +47,7 @@ def __str__(self):
4747
return str(self.Amount)
4848

4949

50-
class BillPayment(DeleteMixin, QuickbooksManagedObject, QuickbooksTransactionEntity, LinkedTxnMixin):
50+
class BillPayment(DeleteMixin, QuickbooksManagedObject, QuickbooksTransactionEntity, LinkedTxnMixin, VoidMixin):
5151
"""
5252
QBO definition: A BillPayment entity represents the financial transaction of payment
5353
of bills that the business owner receives from a vendor for goods or services purchased

quickbooks/objects/creditmemo.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,11 @@ def __init__(self):
7070

7171
def __str__(self):
7272
return str(self.TotalAmt)
73+
74+
def to_ref(self):
75+
ref = Ref()
76+
77+
ref.type = self.qbo_object_name
78+
ref.value = self.Id
79+
80+
return ref

quickbooks/objects/detailline.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def __init__(self):
5151
self.Discount = None
5252
self.ClassRef = None
5353
self.TaxCodeRef = None
54+
self.DiscountAccountRef = None
5455
self.PercentBased = False
5556
self.DiscountPercent = 0
5657

quickbooks/objects/employee.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def __init__(self):
3535
self.BillableTime = False
3636

3737
self.PrimaryAddr = None
38+
self.PrimaryPhone = None
3839

3940
def __str__(self):
4041
return self.DisplayName

quickbooks/objects/estimate.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ class Estimate(DeleteMixin,
1919
class_dict = {
2020
"BillAddr": Address,
2121
"ShipAddr": Address,
22+
"ShipFromAddr": Address,
2223
"CustomerRef": Ref,
24+
"ProjectRef": Ref,
2325
"TxnTaxDetail": TxnTaxDetail,
2426
"CustomerMemo": CustomerMemo,
2527
"BillEmail": EmailAddress,
@@ -64,9 +66,12 @@ def __init__(self):
6466
self.AcceptedDate = None
6567
self.GlobalTaxCalculation = "TaxExcluded"
6668
self.BillAddr = None
69+
self.DepartmentRef = None
6770
self.ShipAddr = None
71+
self.ShipFromAddr = None
6872
self.BillEmail = None
6973
self.CustomerRef = None
74+
self.ProjectRef = None
7075
self.TxnTaxDetail = None
7176
self.CustomerMemo = None
7277
self.ClassRef = None

0 commit comments

Comments
 (0)