diff --git a/tap_quickbooks/quickbooks/__init__.py b/tap_quickbooks/quickbooks/__init__.py index fc9802c..6051bbd 100644 --- a/tap_quickbooks/quickbooks/__init__.py +++ b/tap_quickbooks/quickbooks/__init__.py @@ -571,27 +571,28 @@ def query(self, catalog_entry, state, state_passed): def query_report(self, catalog_entry, state, state_passed): start_date = singer_utils.strptime_with_tz(self.get_start_date(state, catalog_entry)) + if self.reports_full_sync: state_passed = None if catalog_entry["stream"] == "BalanceSheetReport": - reader = BalanceSheetReport(self, start_date, None, state_passed) + reader = BalanceSheetReport(self, start_date, None) elif catalog_entry["stream"] == "MonthlyBalanceSheetReport": - reader = MonthlyBalanceSheetReport(self, start_date, None, state_passed) + reader = MonthlyBalanceSheetReport(self, start_date, None) elif catalog_entry["stream"] == "GeneralLedgerAccrualReport": reader = GeneralLedgerAccrualReport(self, start_date, self.report_periods, state_passed) elif catalog_entry["stream"] == "GeneralLedgerCashReport": reader = GeneralLedgerCashReport(self, start_date, self.report_periods, state_passed) elif catalog_entry["stream"] == "CashFlowReport": - reader = CashFlowReport(self, start_date, None, state_passed) + reader = CashFlowReport(self, start_date, None) elif catalog_entry["stream"] == "DailyCashFlowReport": - reader = DailyCashFlowReport(self, start_date, None, state_passed) + reader = DailyCashFlowReport(self, start_date, None) elif catalog_entry["stream"] == "MonthlyCashFlowReport": - reader = MonthlyCashFlowReport(self, start_date, None, state_passed) + reader = MonthlyCashFlowReport(self, start_date, None) elif catalog_entry["stream"] == "ARAgingSummaryReport": - reader = ARAgingSummaryReport(self, start_date, None, state_passed) + reader = ARAgingSummaryReport(self, start_date, None) elif catalog_entry["stream"] == "TransactionListReport": - reader = TransactionListReport(self, start_date, None, state_passed) + reader = TransactionListReport(self, start_date, None) elif catalog_entry["stream"] == "ProfitAndLossReport": reader = ProfitAndLossReport(self, start_date, self.report_periods, state_passed) else: diff --git a/tap_quickbooks/quickbooks/reportstreams/BalanceSheetReport.py b/tap_quickbooks/quickbooks/reportstreams/BalanceSheetReport.py index 6ba0006..ae00274 100644 --- a/tap_quickbooks/quickbooks/reportstreams/BalanceSheetReport.py +++ b/tap_quickbooks/quickbooks/reportstreams/BalanceSheetReport.py @@ -49,103 +49,49 @@ def _recursive_row_search(self, row, output, categories): categories.pop() def sync(self, catalog_entry): - full_sync = not self.state_passed and not self.has_number_of_periods - - if full_sync: - LOGGER.info(f"Starting full sync of BalanceSheet") - end_date = datetime.date.today() - start_date = self.start_date - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual" - } - - LOGGER.info(f"Fetch BalanceSheet Report for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='BalanceSheet', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - return - - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = dict(zip(columns, raw_row)) - if not row.get("Total"): - # If a row is missing the amount, skip it + LOGGER.info(f"Starting full sync of BalanceSheet") + end_date = datetime.date.today() + start_date = self.start_date + params = { + "start_date": start_date.strftime("%Y-%m-%d"), + "end_date": end_date.strftime("%Y-%m-%d"), + "accounting_method": "Accrual" + } + + LOGGER.info(f"Fetch BalanceSheet Report for period {params['start_date']} to {params['end_date']}") + resp = self._get(report_entity='BalanceSheet', params=params) + + # Get column metadata. + columns = self._get_column_metadata(resp) + + # Recursively get row data. + row_group = resp.get("Rows") + row_array = row_group.get("Row") + + if row_array is None: + return + + output = [] + categories = [] + for row in row_array: + self._recursive_row_search(row, output, categories) + + # Zip columns and row data. + for raw_row in output: + row = dict(zip(columns, raw_row)) + if not row.get("Total"): + # If a row is missing the amount, skip it + continue + + cleansed_row = {} + for k, v in row.items(): + if v == "": continue + else: + cleansed_row.update({k: v}) - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) - - cleansed_row["Total"] = float(row.get("Total")) - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - - yield cleansed_row - else: - LOGGER.info(f"Syncing BalanceSheet of last {self.number_of_periods} periods") - end_date = datetime.date.today() - - for i in range(self.number_of_periods): - start_date = end_date.replace(day=1) - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual" - } - - LOGGER.info(f"Fetch BalanceSheet for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='BalanceSheet', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - # Update end date - end_date = start_date - datetime.timedelta(days=1) - continue - - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = dict(zip(columns, raw_row)) - if not row.get("Total"): - # If a row is missing the amount, skip it - continue - - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) - - cleansed_row["Total"] = float(row.get("Total")) - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - - yield cleansed_row + cleansed_row["Total"] = float(row.get("Total")) + cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - end_date = start_date - datetime.timedelta(days=1) + yield cleansed_row + \ No newline at end of file diff --git a/tap_quickbooks/quickbooks/reportstreams/BaseReport.py b/tap_quickbooks/quickbooks/reportstreams/BaseReport.py index 2f6e5d0..93a8f60 100644 --- a/tap_quickbooks/quickbooks/reportstreams/BaseReport.py +++ b/tap_quickbooks/quickbooks/reportstreams/BaseReport.py @@ -6,7 +6,7 @@ class BaseReportStream(QuickbooksStream): - def __init__(self, qb, start_date, report_periods, state_passed): + def __init__(self, qb, start_date, report_periods, state_passed=None): self.qb = qb self.start_date = start_date self.has_number_of_periods = report_periods is not None diff --git a/tap_quickbooks/quickbooks/reportstreams/CashFlowReport.py b/tap_quickbooks/quickbooks/reportstreams/CashFlowReport.py index 2c639cf..c377f51 100644 --- a/tap_quickbooks/quickbooks/reportstreams/CashFlowReport.py +++ b/tap_quickbooks/quickbooks/reportstreams/CashFlowReport.py @@ -50,103 +50,49 @@ def _recursive_row_search(self, row, output, categories): categories.pop() def sync(self, catalog_entry): - full_sync = not self.state_passed and not self.has_number_of_periods - - if full_sync: - LOGGER.info(f"Starting full sync of CashFlow") - end_date = datetime.date.today() - start_date = self.start_date - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual" - } - - LOGGER.info(f"Fetch CashFlow Report for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='CashFlow', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - return - - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = dict(zip(columns, raw_row)) - if not row.get("Total"): - # If a row is missing the amount, skip it + LOGGER.info(f"Starting full sync of CashFlow") + end_date = datetime.date.today() + start_date = self.start_date + params = { + "start_date": start_date.strftime("%Y-%m-%d"), + "end_date": end_date.strftime("%Y-%m-%d"), + "accounting_method": "Accrual" + } + + LOGGER.info(f"Fetch CashFlow Report for period {params['start_date']} to {params['end_date']}") + resp = self._get(report_entity='CashFlow', params=params) + + # Get column metadata. + columns = self._get_column_metadata(resp) + + # Recursively get row data. + row_group = resp.get("Rows") + row_array = row_group.get("Row") + + if row_array is None: + return + + output = [] + categories = [] + for row in row_array: + self._recursive_row_search(row, output, categories) + + # Zip columns and row data. + for raw_row in output: + row = dict(zip(columns, raw_row)) + if not row.get("Total"): + # If a row is missing the amount, skip it + continue + + cleansed_row = {} + for k, v in row.items(): + if v == "": continue + else: + cleansed_row.update({k: v}) - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) - - cleansed_row["Total"] = float(row.get("Total")) - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - - yield cleansed_row - else: - LOGGER.info(f"Syncing CashFlow of last {self.number_of_periods} periods") - end_date = datetime.date.today() - - for i in range(self.number_of_periods): - start_date = end_date.replace(day=1) - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual" - } - - LOGGER.info(f"Fetch CashFlow for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='CashFlow', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - # Update end date - end_date = start_date - datetime.timedelta(days=1) - continue - - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = dict(zip(columns, raw_row)) - if not row.get("Total"): - # If a row is missing the amount, skip it - continue - - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) - - cleansed_row["Total"] = float(row.get("Total")) - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - - yield cleansed_row + cleansed_row["Total"] = float(row.get("Total")) + cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - end_date = start_date - datetime.timedelta(days=1) + yield cleansed_row + \ No newline at end of file diff --git a/tap_quickbooks/quickbooks/reportstreams/DailyCashFlowReport.py b/tap_quickbooks/quickbooks/reportstreams/DailyCashFlowReport.py index 0bcf662..0820cd2 100644 --- a/tap_quickbooks/quickbooks/reportstreams/DailyCashFlowReport.py +++ b/tap_quickbooks/quickbooks/reportstreams/DailyCashFlowReport.py @@ -76,127 +76,74 @@ def correct_end_date(self, end_date, start_date, current_date): if end_date <= start_date: end_date = start_date return end_date - def sync(self, catalog_entry): - full_sync = not self.state_passed and not self.has_number_of_periods - - if full_sync or self.qb.report_period_days: - LOGGER.info(f"Starting full sync of CashFlow") - current_date = datetime.datetime.now() - timedelta(days=1) - #getting today's date as a datetime to avoid type errors - min_time = datetime.datetime.min.time() - today = datetime.date.today() - today_datetime = datetime.datetime.combine(today, min_time) - #- - end_date = today_datetime + datetime.timedelta(60) - if self.qb.report_period_days: - start_date = today_datetime - datetime.timedelta(int(self.qb.report_period_days)) - else: - start_date = self.start_date - start_date = start_date.replace(tzinfo=None) - - if self.check_date_greater_than_months(start_date): - end_date = self.add_months(start_date) - end_date = self.correct_end_date(end_date,start_date,current_date) - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual", - "summarize_column_by": "Days" - } - - while start_date.replace(tzinfo=None) <= current_date: - LOGGER.info(f"Fetch DailyCashFlow Report for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='CashFlow', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - return - - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = dict(zip(columns, raw_row)) - if not row.get("Total"): - # If a row is missing the amount, skip it - continue - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) - - cleansed_row["Total"] = float(row.get("Total")) - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - daily_total = [] - for key,value in cleansed_row.items(): - if key not in ['Account', 'Categories', 'SyncTimestampUtc', 'Total']: - daily_total.append({key:value}) - cleansed_row['DailyTotal'] = daily_total - start_date = end_date + timedelta(days=1) - end_date = self.add_months(start_date) - end_date = self.correct_end_date(end_date,start_date,current_date) - yield cleansed_row + def sync(self, catalog_entry): + LOGGER.info(f"Starting full sync of CashFlow") + current_date = datetime.datetime.now() - timedelta(days=1) + #getting today's date as a datetime to avoid type errors + min_time = datetime.datetime.min.time() + today = datetime.date.today() + today_datetime = datetime.datetime.combine(today, min_time) + #- + end_date = today_datetime + datetime.timedelta(60) + if self.qb.report_period_days: + start_date = today_datetime - datetime.timedelta(int(self.qb.report_period_days)) else: - LOGGER.info(f"Syncing CashFlow of last {self.number_of_periods} periods") - end_date = datetime.date.today() - - for i in range(self.number_of_periods): - start_date = end_date.replace(day=1) - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual" - } - - LOGGER.info(f"Fetch CashFlow for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='CashFlow', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - # Update end date - end_date = start_date - datetime.timedelta(days=1) - continue - - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = dict(zip(columns, raw_row)) - if not row.get("Total"): - # If a row is missing the amount, skip it - continue + start_date = self.start_date + start_date = start_date.replace(tzinfo=None) + + if self.check_date_greater_than_months(start_date): + end_date = self.add_months(start_date) + end_date = self.correct_end_date(end_date,start_date,current_date) + params = { + "start_date": start_date.strftime("%Y-%m-%d"), + "end_date": end_date.strftime("%Y-%m-%d"), + "accounting_method": "Accrual", + "summarize_column_by": "Days" + } + + while start_date.replace(tzinfo=None) <= current_date: + LOGGER.info(f"Fetch DailyCashFlow Report for period {params['start_date']} to {params['end_date']}") + resp = self._get(report_entity='CashFlow', params=params) + + # Get column metadata. + columns = self._get_column_metadata(resp) + + # Recursively get row data. + row_group = resp.get("Rows") + row_array = row_group.get("Row") - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) + if row_array is None: + return - cleansed_row["Total"] = float(row.get("Total")) - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") + output = [] + categories = [] + for row in row_array: + self._recursive_row_search(row, output, categories) - yield cleansed_row + # Zip columns and row data. + for raw_row in output: + row = dict(zip(columns, raw_row)) + if not row.get("Total"): + # If a row is missing the amount, skip it + continue - end_date = start_date - datetime.timedelta(days=1) + cleansed_row = {} + for k, v in row.items(): + if v == "": + continue + else: + cleansed_row.update({k: v}) + + cleansed_row["Total"] = float(row.get("Total")) + cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") + daily_total = [] + for key,value in cleansed_row.items(): + if key not in ['Account', 'Categories', 'SyncTimestampUtc', 'Total']: + daily_total.append({key:value}) + cleansed_row['DailyTotal'] = daily_total + start_date = end_date + timedelta(days=1) + end_date = self.add_months(start_date) + end_date = self.correct_end_date(end_date,start_date,current_date) + yield cleansed_row + \ No newline at end of file diff --git a/tap_quickbooks/quickbooks/reportstreams/MonthlyBalanceSheetReport.py b/tap_quickbooks/quickbooks/reportstreams/MonthlyBalanceSheetReport.py index 7c4db3d..686073d 100644 --- a/tap_quickbooks/quickbooks/reportstreams/MonthlyBalanceSheetReport.py +++ b/tap_quickbooks/quickbooks/reportstreams/MonthlyBalanceSheetReport.py @@ -50,110 +50,54 @@ def _recursive_row_search(self, row, output, categories): categories.pop() def sync(self, catalog_entry): - full_sync = not self.state_passed and not self.has_number_of_periods - - if full_sync: - LOGGER.info(f"Starting full sync of MonthylBalanceSheet") - end_date = datetime.date.today() - start_date = self.start_date - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual", - "summarize_column_by": "Month" - } - - LOGGER.info(f"Fetch MonthlyBalanceSheet Report for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='BalanceSheet', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - return - - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = dict(zip(columns, raw_row)) - # if not row.get("Total"): - # # If a row is missing the amount, skip it - # continue - - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) - - - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - monthly_total = [] - for key,value in cleansed_row.items(): - if key not in ['Account', 'Categories', 'SyncTimestampUtc']: - monthly_total.append({key:value}) - cleansed_row['MonthlyTotal'] = monthly_total - - yield cleansed_row - else: - LOGGER.info(f"Syncing MonthlyBalanceSheet of last {self.number_of_periods} periods") - end_date = datetime.date.today() - - for i in range(self.number_of_periods): - start_date = end_date.replace(day=1) - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual", - "summarize_column_by": "Month" - } - - LOGGER.info(f"Fetch MonthlyBalanceSheet for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='BalanceSheet', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - # Update end date - end_date = start_date - datetime.timedelta(days=1) + LOGGER.info(f"Starting full sync of MonthylBalanceSheet") + end_date = datetime.date.today() + start_date = self.start_date + params = { + "start_date": start_date.strftime("%Y-%m-%d"), + "end_date": end_date.strftime("%Y-%m-%d"), + "accounting_method": "Accrual", + "summarize_column_by": "Month" + } + + LOGGER.info(f"Fetch MonthlyBalanceSheet Report for period {params['start_date']} to {params['end_date']}") + resp = self._get(report_entity='BalanceSheet', params=params) + + # Get column metadata. + columns = self._get_column_metadata(resp) + + # Recursively get row data. + row_group = resp.get("Rows") + row_array = row_group.get("Row") + + if row_array is None: + return + + output = [] + categories = [] + for row in row_array: + self._recursive_row_search(row, output, categories) + + # Zip columns and row data. + for raw_row in output: + row = dict(zip(columns, raw_row)) + # if not row.get("Total"): + # # If a row is missing the amount, skip it + # continue + + cleansed_row = {} + for k, v in row.items(): + if v == "": continue - - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = dict(zip(columns, raw_row)) - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) - - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - monthly_total = [] - for key,value in cleansed_row.items(): - if key not in ['Account', 'Categories', 'SyncTimestampUtc']: - monthly_total.append({key:value}) - cleansed_row['MonthlyTotal'] = monthly_total - - yield cleansed_row - - end_date = start_date - datetime.timedelta(days=1) + else: + cleansed_row.update({k: v}) + + + cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") + monthly_total = [] + for key,value in cleansed_row.items(): + if key not in ['Account', 'Categories', 'SyncTimestampUtc']: + monthly_total.append({key:value}) + cleansed_row['MonthlyTotal'] = monthly_total + + yield cleansed_row diff --git a/tap_quickbooks/quickbooks/reportstreams/MonthlyCashFlowReport.py b/tap_quickbooks/quickbooks/reportstreams/MonthlyCashFlowReport.py index ac090bb..6a0429f 100644 --- a/tap_quickbooks/quickbooks/reportstreams/MonthlyCashFlowReport.py +++ b/tap_quickbooks/quickbooks/reportstreams/MonthlyCashFlowReport.py @@ -50,109 +50,55 @@ def _recursive_row_search(self, row, output, categories): categories.pop() def sync(self, catalog_entry): - full_sync = not self.state_passed and not self.has_number_of_periods - - if full_sync: - LOGGER.info(f"Starting full sync of MonthlyCashFlow") - end_date = datetime.date.today() - start_date = self.start_date - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual", - "summarize_column_by": "Month" - } - - LOGGER.info(f"Fetch MonthlyCashFlow Report for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='CashFlow', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - return - - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = dict(zip(columns, raw_row)) - if not row.get("Total"): - # If a row is missing the amount, skip it + LOGGER.info(f"Starting full sync of MonthlyCashFlow") + end_date = datetime.date.today() + start_date = self.start_date + params = { + "start_date": start_date.strftime("%Y-%m-%d"), + "end_date": end_date.strftime("%Y-%m-%d"), + "accounting_method": "Accrual", + "summarize_column_by": "Month" + } + + LOGGER.info(f"Fetch MonthlyCashFlow Report for period {params['start_date']} to {params['end_date']}") + resp = self._get(report_entity='CashFlow', params=params) + + # Get column metadata. + columns = self._get_column_metadata(resp) + + # Recursively get row data. + row_group = resp.get("Rows") + row_array = row_group.get("Row") + + if row_array is None: + return + + output = [] + categories = [] + for row in row_array: + self._recursive_row_search(row, output, categories) + + # Zip columns and row data. + for raw_row in output: + row = dict(zip(columns, raw_row)) + if not row.get("Total"): + # If a row is missing the amount, skip it + continue + + cleansed_row = {} + for k, v in row.items(): + if v == "": continue - - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) - - cleansed_row["Total"] = float(row.get("Total")) - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - monthly_total = [] - for key,value in cleansed_row.items(): - if key not in ['Account', 'Categories', 'SyncTimestampUtc', 'Total']: - monthly_total.append({key:value}) - cleansed_row['MonthlyTotal'] = monthly_total - - yield cleansed_row - else: - LOGGER.info(f"Syncing MonthlyCashFlow of last {self.number_of_periods} periods") - end_date = datetime.date.today() - - for i in range(self.number_of_periods): - start_date = end_date.replace(day=1) - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual" - } - - LOGGER.info(f"Fetch MonthlyCashFlow for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='CashFlow', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - # Update end date - end_date = start_date - datetime.timedelta(days=1) - continue - - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = dict(zip(columns, raw_row)) - if not row.get("Total"): - # If a row is missing the amount, skip it - continue - - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) - - cleansed_row["Total"] = float(row.get("Total")) - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - - yield cleansed_row - - end_date = start_date - datetime.timedelta(days=1) + else: + cleansed_row.update({k: v}) + + cleansed_row["Total"] = float(row.get("Total")) + cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") + monthly_total = [] + for key,value in cleansed_row.items(): + if key not in ['Account', 'Categories', 'SyncTimestampUtc', 'Total']: + monthly_total.append({key:value}) + cleansed_row['MonthlyTotal'] = monthly_total + + yield cleansed_row + \ No newline at end of file diff --git a/tap_quickbooks/quickbooks/reportstreams/TransactionListReport.py b/tap_quickbooks/quickbooks/reportstreams/TransactionListReport.py index 4fa5c3e..bb98cbe 100644 --- a/tap_quickbooks/quickbooks/reportstreams/TransactionListReport.py +++ b/tap_quickbooks/quickbooks/reportstreams/TransactionListReport.py @@ -48,152 +48,85 @@ def _recursive_row_search(self, row, output, categories): categories.pop() def sync(self, catalog_entry): - full_sync = not self.state_passed and not self.has_number_of_periods - - if full_sync: - LOGGER.info(f"Starting full sync of TransactionListReport") - end_date = datetime.date.today() - start_date = self.start_date - cols = [ - 'account_name', - 'create_by', - 'create_date', - 'cust_msg', - 'due_date', - 'doc_num', - 'inv_date', - 'is_ap_paid', - 'is_cleared', - 'is_no_post', - 'last_mod_by', - 'memo', - 'name', - 'other_account', - 'pmt_mthd', - 'printed', - 'sales_cust1', - 'sales_cust2', - 'sales_cust3', - 'term_name', - 'tracking_num', - 'tx_date', - 'txn_type', - 'term_name', - 'dept_name', - 'subt_nat_amount' - ] - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual", - "columns": ",".join(cols) - } - - LOGGER.info(f"Fetch TransactionListReport for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='TransactionList', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - return - - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = {} - for c, v in zip(columns, raw_row): - if isinstance(v, dict): - row[c] = v.get("value") - if "id" in v: - row[f"{c}Id"] = v.get("id") - else: - row[c] = v - - if not row.get("Amount"): - # If a row is missing the amount, skip it + LOGGER.info(f"Starting full sync of TransactionListReport") + end_date = datetime.date.today() + start_date = self.start_date + cols = [ + 'account_name', + 'create_by', + 'create_date', + 'cust_msg', + 'due_date', + 'doc_num', + 'inv_date', + 'is_ap_paid', + 'is_cleared', + 'is_no_post', + 'last_mod_by', + 'memo', + 'name', + 'other_account', + 'pmt_mthd', + 'printed', + 'sales_cust1', + 'sales_cust2', + 'sales_cust3', + 'term_name', + 'tracking_num', + 'tx_date', + 'txn_type', + 'term_name', + 'dept_name', + 'subt_nat_amount' + ] + params = { + "start_date": start_date.strftime("%Y-%m-%d"), + "end_date": end_date.strftime("%Y-%m-%d"), + "accounting_method": "Accrual", + "columns": ",".join(cols) + } + + LOGGER.info(f"Fetch TransactionListReport for period {params['start_date']} to {params['end_date']}") + resp = self._get(report_entity='TransactionList', params=params) + + # Get column metadata. + columns = self._get_column_metadata(resp) + + # Recursively get row data. + row_group = resp.get("Rows") + row_array = row_group.get("Row") + + if row_array is None: + return + + output = [] + categories = [] + for row in row_array: + self._recursive_row_search(row, output, categories) + + # Zip columns and row data. + for raw_row in output: + row = {} + for c, v in zip(columns, raw_row): + if isinstance(v, dict): + row[c] = v.get("value") + if "id" in v: + row[f"{c}Id"] = v.get("id") + else: + row[c] = v + + if not row.get("Amount"): + # If a row is missing the amount, skip it + continue + + cleansed_row = {} + for k, v in row.items(): + if v == "": continue + else: + cleansed_row.update({k: v}) - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) - - cleansed_row["Amount"] = float(row.get("Amount")) - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - - yield cleansed_row - else: - LOGGER.info(f"Syncing TransactionListReport of last {self.number_of_periods} periods") - end_date = datetime.date.today() - - for i in range(self.number_of_periods): - start_date = end_date.replace(day=1) - params = { - "start_date": start_date.strftime("%Y-%m-%d"), - "end_date": end_date.strftime("%Y-%m-%d"), - "accounting_method": "Accrual" - } - - LOGGER.info(f"Fetch TransactionListReport for period {params['start_date']} to {params['end_date']}") - resp = self._get(report_entity='TransactionList', params=params) - - # Get column metadata. - columns = self._get_column_metadata(resp) - - # Recursively get row data. - row_group = resp.get("Rows") - row_array = row_group.get("Row") - - if row_array is None: - # Update end date - end_date = start_date - datetime.timedelta(days=1) - continue + cleansed_row["Amount"] = float(row.get("Amount")) + cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - output = [] - categories = [] - for row in row_array: - self._recursive_row_search(row, output, categories) - - # Zip columns and row data. - for raw_row in output: - row = {} - for c, v in zip(columns, raw_row): - if isinstance(v, dict): - row[c] = v.get("value") - if "id" in v: - row[f"{c}Id"] = v.get("id") - else: - row[c] = v - - if not row.get("Amount"): - # If a row is missing the amount, skip it - continue - - cleansed_row = {} - for k, v in row.items(): - if v == "": - continue - else: - cleansed_row.update({k: v}) - - if type(row.get("Amount")) is dict: - cleansed_row['Amount'] = row["Amount"].get("value", 0) - else: - cleansed_row["Amount"] = float(row.get("Amount")) - - cleansed_row["SyncTimestampUtc"] = singer.utils.strftime(singer.utils.now(), "%Y-%m-%dT%H:%M:%SZ") - - yield cleansed_row - - end_date = start_date - datetime.timedelta(days=1) + yield cleansed_row