Skip to content

Commit 89e2506

Browse files
committed
make all reports but GLR and PNL full sync
1 parent f248210 commit 89e2506

File tree

8 files changed

+341
-677
lines changed

8 files changed

+341
-677
lines changed

tap_quickbooks/quickbooks/__init__.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -571,27 +571,29 @@ def query(self, catalog_entry, state, state_passed):
571571

572572
def query_report(self, catalog_entry, state, state_passed):
573573
start_date = singer_utils.strptime_with_tz(self.get_start_date(state, catalog_entry))
574+
575+
state_passed = True if state.get('bookmarks', {}).get(catalog_entry['stream']) is not None else False
574576
if self.reports_full_sync:
575577
state_passed = None
576578

577579
if catalog_entry["stream"] == "BalanceSheetReport":
578-
reader = BalanceSheetReport(self, start_date, None, state_passed)
580+
reader = BalanceSheetReport(self, start_date, None)
579581
elif catalog_entry["stream"] == "MonthlyBalanceSheetReport":
580-
reader = MonthlyBalanceSheetReport(self, start_date, None, state_passed)
582+
reader = MonthlyBalanceSheetReport(self, start_date, None)
581583
elif catalog_entry["stream"] == "GeneralLedgerAccrualReport":
582584
reader = GeneralLedgerAccrualReport(self, start_date, self.report_periods, state_passed)
583585
elif catalog_entry["stream"] == "GeneralLedgerCashReport":
584586
reader = GeneralLedgerCashReport(self, start_date, self.report_periods, state_passed)
585587
elif catalog_entry["stream"] == "CashFlowReport":
586-
reader = CashFlowReport(self, start_date, None, state_passed)
588+
reader = CashFlowReport(self, start_date, None)
587589
elif catalog_entry["stream"] == "DailyCashFlowReport":
588-
reader = DailyCashFlowReport(self, start_date, None, state_passed)
590+
reader = DailyCashFlowReport(self, start_date, None)
589591
elif catalog_entry["stream"] == "MonthlyCashFlowReport":
590-
reader = MonthlyCashFlowReport(self, start_date, None, state_passed)
592+
reader = MonthlyCashFlowReport(self, start_date, None)
591593
elif catalog_entry["stream"] == "ARAgingSummaryReport":
592-
reader = ARAgingSummaryReport(self, start_date, None, state_passed)
594+
reader = ARAgingSummaryReport(self, start_date, None)
593595
elif catalog_entry["stream"] == "TransactionListReport":
594-
reader = TransactionListReport(self, start_date, None, state_passed)
596+
reader = TransactionListReport(self, start_date, None)
595597
elif catalog_entry["stream"] == "ProfitAndLossReport":
596598
reader = ProfitAndLossReport(self, start_date, self.report_periods, state_passed)
597599
else:

tap_quickbooks/quickbooks/reportstreams/BalanceSheetReport.py

Lines changed: 43 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -49,103 +49,49 @@ def _recursive_row_search(self, row, output, categories):
4949
categories.pop()
5050

5151
def sync(self, catalog_entry):
52-
full_sync = not self.state_passed and not self.has_number_of_periods
53-
54-
if full_sync:
55-
LOGGER.info(f"Starting full sync of BalanceSheet")
56-
end_date = datetime.date.today()
57-
start_date = self.start_date
58-
params = {
59-
"start_date": start_date.strftime("%Y-%m-%d"),
60-
"end_date": end_date.strftime("%Y-%m-%d"),
61-
"accounting_method": "Accrual"
62-
}
63-
64-
LOGGER.info(f"Fetch BalanceSheet Report for period {params['start_date']} to {params['end_date']}")
65-
resp = self._get(report_entity='BalanceSheet', params=params)
66-
67-
# Get column metadata.
68-
columns = self._get_column_metadata(resp)
69-
70-
# Recursively get row data.
71-
row_group = resp.get("Rows")
72-
row_array = row_group.get("Row")
73-
74-
if row_array is None:
75-
return
76-
77-
output = []
78-
categories = []
79-
for row in row_array:
80-
self._recursive_row_search(row, output, categories)
81-
82-
# Zip columns and row data.
83-
for raw_row in output:
84-
row = dict(zip(columns, raw_row))
85-
if not row.get("Total"):
86-
# If a row is missing the amount, skip it
52+
LOGGER.info(f"Starting full sync of BalanceSheet")
53+
end_date = datetime.date.today()
54+
start_date = self.start_date
55+
params = {
56+
"start_date": start_date.strftime("%Y-%m-%d"),
57+
"end_date": end_date.strftime("%Y-%m-%d"),
58+
"accounting_method": "Accrual"
59+
}
60+
61+
LOGGER.info(f"Fetch BalanceSheet Report for period {params['start_date']} to {params['end_date']}")
62+
resp = self._get(report_entity='BalanceSheet', params=params)
63+
64+
# Get column metadata.
65+
columns = self._get_column_metadata(resp)
66+
67+
# Recursively get row data.
68+
row_group = resp.get("Rows")
69+
row_array = row_group.get("Row")
70+
71+
if row_array is None:
72+
return
73+
74+
output = []
75+
categories = []
76+
for row in row_array:
77+
self._recursive_row_search(row, output, categories)
78+
79+
# Zip columns and row data.
80+
for raw_row in output:
81+
row = dict(zip(columns, raw_row))
82+
if not row.get("Total"):
83+
# If a row is missing the amount, skip it
84+
continue
85+
86+
cleansed_row = {}
87+
for k, v in row.items():
88+
if v == "":
8789
continue
90+
else:
91+
cleansed_row.update({k: v})
8892

89-
cleansed_row = {}
90-
for k, v in row.items():
91-
if v == "":
92-
continue
93-
else:
94-
cleansed_row.update({k: v})
95-
96-
cleansed_row["Total"] = float(row.get("Total"))
97-
cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ")
98-
99-
yield cleansed_row
100-
else:
101-
LOGGER.info(f"Syncing BalanceSheet of last {self.number_of_periods} periods")
102-
end_date = datetime.date.today()
103-
104-
for i in range(self.number_of_periods):
105-
start_date = end_date.replace(day=1)
106-
params = {
107-
"start_date": start_date.strftime("%Y-%m-%d"),
108-
"end_date": end_date.strftime("%Y-%m-%d"),
109-
"accounting_method": "Accrual"
110-
}
111-
112-
LOGGER.info(f"Fetch BalanceSheet for period {params['start_date']} to {params['end_date']}")
113-
resp = self._get(report_entity='BalanceSheet', params=params)
114-
115-
# Get column metadata.
116-
columns = self._get_column_metadata(resp)
117-
118-
# Recursively get row data.
119-
row_group = resp.get("Rows")
120-
row_array = row_group.get("Row")
121-
122-
if row_array is None:
123-
# Update end date
124-
end_date = start_date - datetime.timedelta(days=1)
125-
continue
126-
127-
output = []
128-
categories = []
129-
for row in row_array:
130-
self._recursive_row_search(row, output, categories)
131-
132-
# Zip columns and row data.
133-
for raw_row in output:
134-
row = dict(zip(columns, raw_row))
135-
if not row.get("Total"):
136-
# If a row is missing the amount, skip it
137-
continue
138-
139-
cleansed_row = {}
140-
for k, v in row.items():
141-
if v == "":
142-
continue
143-
else:
144-
cleansed_row.update({k: v})
145-
146-
cleansed_row["Total"] = float(row.get("Total"))
147-
cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ")
148-
149-
yield cleansed_row
93+
cleansed_row["Total"] = float(row.get("Total"))
94+
cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ")
15095

151-
end_date = start_date - datetime.timedelta(days=1)
96+
yield cleansed_row
97+

tap_quickbooks/quickbooks/reportstreams/BaseReport.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
class BaseReportStream(QuickbooksStream):
88

9-
def __init__(self, qb, start_date, report_periods, state_passed):
9+
def __init__(self, qb, start_date, report_periods, state_passed=None):
1010
self.qb = qb
1111
self.start_date = start_date
1212
self.has_number_of_periods = report_periods is not None

tap_quickbooks/quickbooks/reportstreams/CashFlowReport.py

Lines changed: 43 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -50,103 +50,49 @@ def _recursive_row_search(self, row, output, categories):
5050
categories.pop()
5151

5252
def sync(self, catalog_entry):
53-
full_sync = not self.state_passed and not self.has_number_of_periods
54-
55-
if full_sync:
56-
LOGGER.info(f"Starting full sync of CashFlow")
57-
end_date = datetime.date.today()
58-
start_date = self.start_date
59-
params = {
60-
"start_date": start_date.strftime("%Y-%m-%d"),
61-
"end_date": end_date.strftime("%Y-%m-%d"),
62-
"accounting_method": "Accrual"
63-
}
64-
65-
LOGGER.info(f"Fetch CashFlow Report for period {params['start_date']} to {params['end_date']}")
66-
resp = self._get(report_entity='CashFlow', params=params)
67-
68-
# Get column metadata.
69-
columns = self._get_column_metadata(resp)
70-
71-
# Recursively get row data.
72-
row_group = resp.get("Rows")
73-
row_array = row_group.get("Row")
74-
75-
if row_array is None:
76-
return
77-
78-
output = []
79-
categories = []
80-
for row in row_array:
81-
self._recursive_row_search(row, output, categories)
82-
83-
# Zip columns and row data.
84-
for raw_row in output:
85-
row = dict(zip(columns, raw_row))
86-
if not row.get("Total"):
87-
# If a row is missing the amount, skip it
53+
LOGGER.info(f"Starting full sync of CashFlow")
54+
end_date = datetime.date.today()
55+
start_date = self.start_date
56+
params = {
57+
"start_date": start_date.strftime("%Y-%m-%d"),
58+
"end_date": end_date.strftime("%Y-%m-%d"),
59+
"accounting_method": "Accrual"
60+
}
61+
62+
LOGGER.info(f"Fetch CashFlow Report for period {params['start_date']} to {params['end_date']}")
63+
resp = self._get(report_entity='CashFlow', params=params)
64+
65+
# Get column metadata.
66+
columns = self._get_column_metadata(resp)
67+
68+
# Recursively get row data.
69+
row_group = resp.get("Rows")
70+
row_array = row_group.get("Row")
71+
72+
if row_array is None:
73+
return
74+
75+
output = []
76+
categories = []
77+
for row in row_array:
78+
self._recursive_row_search(row, output, categories)
79+
80+
# Zip columns and row data.
81+
for raw_row in output:
82+
row = dict(zip(columns, raw_row))
83+
if not row.get("Total"):
84+
# If a row is missing the amount, skip it
85+
continue
86+
87+
cleansed_row = {}
88+
for k, v in row.items():
89+
if v == "":
8890
continue
91+
else:
92+
cleansed_row.update({k: v})
8993

90-
cleansed_row = {}
91-
for k, v in row.items():
92-
if v == "":
93-
continue
94-
else:
95-
cleansed_row.update({k: v})
96-
97-
cleansed_row["Total"] = float(row.get("Total"))
98-
cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ")
99-
100-
yield cleansed_row
101-
else:
102-
LOGGER.info(f"Syncing CashFlow of last {self.number_of_periods} periods")
103-
end_date = datetime.date.today()
104-
105-
for i in range(self.number_of_periods):
106-
start_date = end_date.replace(day=1)
107-
params = {
108-
"start_date": start_date.strftime("%Y-%m-%d"),
109-
"end_date": end_date.strftime("%Y-%m-%d"),
110-
"accounting_method": "Accrual"
111-
}
112-
113-
LOGGER.info(f"Fetch CashFlow for period {params['start_date']} to {params['end_date']}")
114-
resp = self._get(report_entity='CashFlow', params=params)
115-
116-
# Get column metadata.
117-
columns = self._get_column_metadata(resp)
118-
119-
# Recursively get row data.
120-
row_group = resp.get("Rows")
121-
row_array = row_group.get("Row")
122-
123-
if row_array is None:
124-
# Update end date
125-
end_date = start_date - datetime.timedelta(days=1)
126-
continue
127-
128-
output = []
129-
categories = []
130-
for row in row_array:
131-
self._recursive_row_search(row, output, categories)
132-
133-
# Zip columns and row data.
134-
for raw_row in output:
135-
row = dict(zip(columns, raw_row))
136-
if not row.get("Total"):
137-
# If a row is missing the amount, skip it
138-
continue
139-
140-
cleansed_row = {}
141-
for k, v in row.items():
142-
if v == "":
143-
continue
144-
else:
145-
cleansed_row.update({k: v})
146-
147-
cleansed_row["Total"] = float(row.get("Total"))
148-
cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ")
149-
150-
yield cleansed_row
94+
cleansed_row["Total"] = float(row.get("Total"))
95+
cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ")
15196

152-
end_date = start_date - datetime.timedelta(days=1)
97+
yield cleansed_row
98+

0 commit comments

Comments
 (0)