Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
3. Create and checkout a new branch feature/student1FirstName_student2FirstName
4. Install dependencies: poetry install
5. Implemented two functions in terms.py.
6. Install the pre-commit hook: poetry run pre-commit install
6. Install the pre-commit hook: poetry run pre-commit install
7. Commit your code (passing pre-commit hook) and push the code.
8. Create a pull request to merge your feature branch into the upstream repo's main branch.
60 changes: 30 additions & 30 deletions response.xml
Original file line number Diff line number Diff line change
@@ -1,78 +1,78 @@
<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<TermsQueryRs statusCode="0" statusSeverity="Info" statusMessage="Status OK">
<TermsQueryRs requestID="1" statusCode="0" statusSeverity="Info" statusMessage="Status OK">
<StandardTermsRet>
<ListID>80000001-1758063532</ListID>
<TimeCreated>2025-09-16T22:58:52+00:00</TimeCreated>
<TimeModified>2025-09-16T22:58:52+00:00</TimeModified>
<EditSequence>1758063532</EditSequence>
<ListID>80000001-1758131663</ListID>
<TimeCreated>2025-09-17T17:54:23+00:00</TimeCreated>
<TimeModified>2025-09-17T17:54:23+00:00</TimeModified>
<EditSequence>1758131663</EditSequence>
<Name>1% 10 Net 30</Name>
<IsActive>true</IsActive>
<StdDueDays>30</StdDueDays>
<StdDiscountDays>10</StdDiscountDays>
<DiscountPct>1.00</DiscountPct>
</StandardTermsRet>
<StandardTermsRet>
<ListID>80000002-1758063532</ListID>
<TimeCreated>2025-09-16T22:58:52+00:00</TimeCreated>
<TimeModified>2025-09-16T22:58:52+00:00</TimeModified>
<EditSequence>1758063532</EditSequence>
<ListID>80000002-1758131663</ListID>
<TimeCreated>2025-09-17T17:54:23+00:00</TimeCreated>
<TimeModified>2025-09-17T17:54:23+00:00</TimeModified>
<EditSequence>1758131663</EditSequence>
<Name>2% 10 Net 30</Name>
<IsActive>true</IsActive>
<StdDueDays>30</StdDueDays>
<StdDiscountDays>10</StdDiscountDays>
<DiscountPct>2.00</DiscountPct>
</StandardTermsRet>
<StandardTermsRet>
<ListID>80000003-1758063532</ListID>
<TimeCreated>2025-09-16T22:58:52+00:00</TimeCreated>
<TimeModified>2025-09-16T22:58:52+00:00</TimeModified>
<EditSequence>1758063532</EditSequence>
<ListID>80000003-1758131663</ListID>
<TimeCreated>2025-09-17T17:54:23+00:00</TimeCreated>
<TimeModified>2025-09-17T17:54:23+00:00</TimeModified>
<EditSequence>1758131663</EditSequence>
<Name>Consignment</Name>
<IsActive>true</IsActive>
<StdDueDays>90</StdDueDays>
<StdDiscountDays>0</StdDiscountDays>
<DiscountPct>0.00</DiscountPct>
</StandardTermsRet>
<StandardTermsRet>
<ListID>80000004-1758063532</ListID>
<TimeCreated>2025-09-16T22:58:52+00:00</TimeCreated>
<TimeModified>2025-09-16T22:58:52+00:00</TimeModified>
<EditSequence>1758063532</EditSequence>
<ListID>80000004-1758131663</ListID>
<TimeCreated>2025-09-17T17:54:23+00:00</TimeCreated>
<TimeModified>2025-09-17T17:54:23+00:00</TimeModified>
<EditSequence>1758131663</EditSequence>
<Name>Due on receipt</Name>
<IsActive>true</IsActive>
<StdDueDays>0</StdDueDays>
<StdDiscountDays>0</StdDiscountDays>
<DiscountPct>0.00</DiscountPct>
</StandardTermsRet>
<StandardTermsRet>
<ListID>80000005-1758063532</ListID>
<TimeCreated>2025-09-16T22:58:52+00:00</TimeCreated>
<TimeModified>2025-09-16T22:58:52+00:00</TimeModified>
<EditSequence>1758063532</EditSequence>
<ListID>80000005-1758131663</ListID>
<TimeCreated>2025-09-17T17:54:23+00:00</TimeCreated>
<TimeModified>2025-09-17T18:01:45+00:00</TimeModified>
<EditSequence>1758132105</EditSequence>
<Name>Net 15</Name>
<IsActive>true</IsActive>
<StdDueDays>15</StdDueDays>
<StdDiscountDays>0</StdDiscountDays>
<StdDiscountDays>25</StdDiscountDays>
<DiscountPct>0.00</DiscountPct>
</StandardTermsRet>
<StandardTermsRet>
<ListID>80000006-1758063532</ListID>
<TimeCreated>2025-09-16T22:58:52+00:00</TimeCreated>
<TimeModified>2025-09-16T22:58:52+00:00</TimeModified>
<EditSequence>1758063532</EditSequence>
<ListID>80000006-1758131663</ListID>
<TimeCreated>2025-09-17T17:54:23+00:00</TimeCreated>
<TimeModified>2025-09-17T17:54:23+00:00</TimeModified>
<EditSequence>1758131663</EditSequence>
<Name>Net 30</Name>
<IsActive>true</IsActive>
<StdDueDays>30</StdDueDays>
<StdDiscountDays>0</StdDiscountDays>
<DiscountPct>0.00</DiscountPct>
</StandardTermsRet>
<StandardTermsRet>
<ListID>80000007-1758063532</ListID>
<TimeCreated>2025-09-16T22:58:52+00:00</TimeCreated>
<TimeModified>2025-09-16T22:58:52+00:00</TimeModified>
<EditSequence>1758063532</EditSequence>
<ListID>80000007-1758131663</ListID>
<TimeCreated>2025-09-17T17:54:23+00:00</TimeCreated>
<TimeModified>2025-09-17T17:54:23+00:00</TimeModified>
<EditSequence>1758131663</EditSequence>
<Name>Net 60</Name>
<IsActive>true</IsActive>
<StdDueDays>60</StdDueDays>
Expand Down
55 changes: 50 additions & 5 deletions terms.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,62 @@
import xml.etree.ElementTree as ET

try:
from win32com.client import Dispatch, constants # poetry install pywin32 (32-bit)
from win32com.client import (
Dispatch,
constants,
) # Requires 32-bit Python for QB Desktop
except ImportError:
print("Please 'poetry add pywin32' (use 32-bit Python for QB Desktop).")
sys.exit(1)


def build_terms_query() -> str:
"""Return a minimal TermsQueryRq XML."""
raise NotImplementedError()
qbxml = """<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="16.0"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<TermsQueryRq requestID="1">
<ActiveStatus>All</ActiveStatus>
</TermsQueryRq>
</QBXMLMsgsRq>
</QBXML>"""
return qbxml


def parse_and_print(response_xml: str) -> None:
"""Parse response and print term name + discount days."""
raise NotImplementedError()
"""Parse response and print term name + discount information."""
try:
root = ET.fromstring(response_xml)
except ET.ParseError as e:
print(f"Error parsing response XML: {e}")
return

# Handle both StandardTermsRet and DateDrivenTermsRet
standard_terms = root.findall(".//StandardTermsRet")
date_driven_terms = root.findall(".//DateDrivenTermsRet")

if not (standard_terms or date_driven_terms):
print("No terms found in response.")
return

# Standard terms
for term in standard_terms:
name = term.findtext("Name", default="(unknown)")
discount_days = term.findtext("StdDiscountDays", default="N/A")
discount_pct = term.findtext("DiscountPct", default="N/A")
print(
f"[Standard] Term: {name}, Discount Days: {discount_days}, Discount %: {discount_pct}"
)

# Date-driven terms
for term in date_driven_terms:
name = term.findtext("Name", default="(unknown)")
discount_day = term.findtext("DiscountDayOfMonth", default="N/A")
discount_pct = term.findtext("DiscountPct", default="N/A")
print(
f"[DateDriven] Term: {name}, Discount Day: {discount_day}, Discount %: {discount_pct}"
)


def main():
Expand All @@ -32,8 +74,11 @@ def main():

request_xml = build_terms_query()
response_xml = rp.ProcessRequest(ticket, request_xml)
with open("response.xml", "w") as file:

# Save to file for debugging
with open("response.xml", "w", encoding="utf-8") as file:
file.write(response_xml)

parse_and_print(response_xml)

finally:
Expand Down