From 2b92a0e6ff90847f4f0381e63239a24d936aa4de Mon Sep 17 00:00:00 2001 From: Jan Aertgeerts Date: Thu, 6 Jun 2024 16:07:32 +0200 Subject: [PATCH 1/2] feat(core) add attachment/supdoc support --- pyintacct/models/company.py | 18 +++++-- tests/test_company.py | 96 ++++++++++++++++++++++++++++++++++++- tests/test_order_entry.py | 39 +++++++++++++++ 3 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 tests/test_order_entry.py diff --git a/pyintacct/models/company.py b/pyintacct/models/company.py index c5fd332..f6de8b1 100755 --- a/pyintacct/models/company.py +++ b/pyintacct/models/company.py @@ -1,7 +1,20 @@ from .base import API21Object -from pydantic import BaseModel -from typing import Optional +from pydantic import BaseModel, Field +from typing import Optional, List +class AttachmentDetail(BaseModel): + attachmentname: Optional[str] = None + attachmenttype: Optional[str] = None + attachmentdata: Optional[str] = None + +class Attachment(BaseModel): + attachment: List[AttachmentDetail] = Field(default_factory=list) + +class SupDoc(API21Object): + supdocid: Optional[str] = None + supdocfoldername: Optional[str] = None + supdocdescription: Optional[str] = None + attachments: Attachment = Field(default_factory=Attachment) class MailAddress(BaseModel): address1: Optional[str] = None @@ -14,7 +27,6 @@ class MailAddress(BaseModel): latitude: Optional[str] = None longitude: Optional[str] = None - class Contact(API21Object): contactname: str = ... printas: Optional[str] = None diff --git a/tests/test_company.py b/tests/test_company.py index 0d10f38..48d23b4 100755 --- a/tests/test_company.py +++ b/tests/test_company.py @@ -1,4 +1,7 @@ -from pyintacct.models.company import Contact +import pytest +from decimal import Decimal +from pyintacct.models.company import Contact, MailAddress, SupDoc, Attachment, AttachmentDetail +from pyintacct.models.base import Date from tests.utils import random_str @@ -26,3 +29,94 @@ def test_create_from_dict(client): contact['CONTACT']['PRINTAS'] = 'MyTestContact1' client.update(contact) client.delete(Contact, [name]) + + +def test_create_contact_with_mailaddress(client): + contact_name = f'ρyIntacct-{random_str()}' + mail_address = MailAddress( + address1='123 Main St', + city='Anytown', + state='CA', + zip='12345', + country='USA' + ) + contact = Contact( + contactname=contact_name, + mailaddress=mail_address + ) + client.create(contact) + contacts = client.read_by_query('CONTACT', f"CONTACTNAME = \'{contact_name}\'") + assert len(contacts) == 1 + contact_key = contacts[0]['RECORDNO'] + client.delete('CONTACT', [contact_key]) + + +def test_create_contact_with_supdoc(client): + contact_name = f'ρyIntacct-{random_str()}' + attachment_detail = AttachmentDetail( + attachmentname='test_attachment', + attachmenttype='PDF', + attachmentdata='base64encodedstring' + ) + attachment = Attachment(attachment=[attachment_detail]) + supdoc = SupDoc( + supdocid='SUPDOC-001', + supdocdescription='Test SupDoc', + attachments=attachment + ) + contact = Contact( + contactname=contact_name, + printas=contact_name, + supdoc=supdoc + ) + client.create(contact) + contacts = client.read_by_query('CONTACT', f"CONTACTNAME = \'{contact_name}\'") + assert len(contacts) == 1 + contact_key = contacts[0]['RECORDNO'] + client.delete('CONTACT', [contact_key]) + + +def test_create_contact_with_full_details(client): + contact_name = f'ρyIntacct-{random_str()}' + mail_address = MailAddress( + address1='123 Main St', + city='Anytown', + state='CA', + zip='12345', + country='USA' + ) + attachment_detail = AttachmentDetail( + attachmentname='test_attachment', + attachmenttype='PDF', + attachmentdata='base64encodedstring' + ) + attachment = Attachment(attachment=[attachment_detail]) + supdoc = SupDoc( + supdocid='SUPDOC-001', + supdocdescription='Test SupDoc', + attachments=attachment + ) + contact = Contact( + contactname=contact_name, + printas=contact_name, + companyname='MyCompany', + phone1='123-456-7890', + email1='test@example.com', + mailaddress=mail_address, + supdoc=supdoc + ) + client.create(contact) + contacts = client.read_by_query('CONTACT', f"CONTACTNAME = \'{contact_name}\'") + assert len(contacts) == 1 + contact_key = contacts[0]['RECORDNO'] + client.delete('CONTACT', [contact_key]) + + +@pytest.fixture +def make_contact_record(): + def _make_contact(contact_name): + return Contact( + contactname=contact_name, + printas=contact_name + ) + return _make_contact diff --git a/tests/test_order_entry.py b/tests/test_order_entry.py new file mode 100644 index 0000000..0ee40e8 --- /dev/null +++ b/tests/test_order_entry.py @@ -0,0 +1,39 @@ +import pytest +from decimal import Decimal +from pyintacct.models.base import Date +from pyintacct.models.company import Contact +from pyintacct.models.order_entry import SOTransaction, SOTransactionItem, SOTransactionItems + + +def test_create_sotransaction(): + items = SOTransactionItems(sotransitem=[ + SOTransactionItem(itemid='1001', quantity=Decimal('5'), unit='each', price=Decimal('100.00')), + SOTransactionItem(itemid='1002', quantity=Decimal('3'), unit='each', price=Decimal('200.00')) + ]) + + transaction = SOTransaction( + transactiontype='Sales Order', + datecreated=Date(year='2024', month='6', day='18'), + customerid='CUST-1000', + sotransitems=items, + termname='Net 30', + basecurr='USD', + currency='USD', + exchratetype='Intacct Daily Rate' + ) + + assert transaction.transactiontype == 'Sales Order' + assert transaction.datecreated == Date(year='2024', month='6', day='18') + assert transaction.customerid == 'CUST-1000' + assert transaction.sotransitems == items + assert transaction.termname == 'Net 30' + assert transaction.basecurr == 'USD' + assert transaction.currency == 'USD' + assert transaction.exchratetype == 'Intacct Daily Rate' + assert len(transaction.sotransitems.sotransitem) == 2 + + +def test_query_transactions(client): + transactions = client.read_by_query('SOTRANSACTION', 'CUSTOMERID LIKE CUST%', fields='TRANSACTIONID', pagesize=3) + assert isinstance(transactions, list) + assert len(transactions) > 0 From 27c407e3fded3ccc054b73fa2689c489bd330845 Mon Sep 17 00:00:00 2001 From: red-coracle Date: Wed, 19 Jun 2024 15:34:36 -0400 Subject: [PATCH 2/2] Update tests --- tests/test_company.py | 4 ++-- tests/test_order_entry.py | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/tests/test_company.py b/tests/test_company.py index 48d23b4..c3e441a 100755 --- a/tests/test_company.py +++ b/tests/test_company.py @@ -1,7 +1,6 @@ import pytest -from decimal import Decimal + from pyintacct.models.company import Contact, MailAddress, SupDoc, Attachment, AttachmentDetail -from pyintacct.models.base import Date from tests.utils import random_str @@ -42,6 +41,7 @@ def test_create_contact_with_mailaddress(client): ) contact = Contact( contactname=contact_name, + printas=contact_name, mailaddress=mail_address ) client.create(contact) diff --git a/tests/test_order_entry.py b/tests/test_order_entry.py index 0ee40e8..2bd2d07 100644 --- a/tests/test_order_entry.py +++ b/tests/test_order_entry.py @@ -1,14 +1,13 @@ -import pytest from decimal import Decimal + from pyintacct.models.base import Date -from pyintacct.models.company import Contact from pyintacct.models.order_entry import SOTransaction, SOTransactionItem, SOTransactionItems -def test_create_sotransaction(): +def test_create_sotransaction(client): items = SOTransactionItems(sotransitem=[ - SOTransactionItem(itemid='1001', quantity=Decimal('5'), unit='each', price=Decimal('100.00')), - SOTransactionItem(itemid='1002', quantity=Decimal('3'), unit='each', price=Decimal('200.00')) + SOTransactionItem(itemid='1001', quantity=Decimal('5'), unit='Each', locationid='100', price=Decimal('100.00')), + SOTransactionItem(itemid='1002', quantity=Decimal('3'), unit='Each', locationid='100', price=Decimal('200.00')) ]) transaction = SOTransaction( @@ -31,9 +30,16 @@ def test_create_sotransaction(): assert transaction.currency == 'USD' assert transaction.exchratetype == 'Intacct Daily Rate' assert len(transaction.sotransitems.sotransitem) == 2 + client.create(transaction) def test_query_transactions(client): - transactions = client.read_by_query('SOTRANSACTION', 'CUSTOMERID LIKE CUST%', fields='TRANSACTIONID', pagesize=3) + transactions = client.read_by_query( + 'SODOCUMENT', + 'CUSTVENDID LIKE \'CUST%\'', + fields='*', + pagesize=3, + docparid='Sales Order' + ) assert isinstance(transactions, list) assert len(transactions) > 0