diff --git a/_data/taps/schemas/harvest/v3/harvest-v3-foreign-keys.yml b/_data/taps/schemas/harvest/v3/harvest-v3-foreign-keys.yml new file mode 100644 index 000000000..a82a57167 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/harvest-v3-foreign-keys.yml @@ -0,0 +1,946 @@ +tap: harvest +version: '3' +keys: + clients_client_id: + - table: clients + keys: + - id + - table: contacts + keys: + - client_id + - table: estimates + keys: + - client_id + - table: expenses + keys: + - client_id + - table: invoices + keys: + - client_id + - table: projects + keys: + - client_id + - table: time_entries + keys: + - client_id + - table: user_projects + keys: + - client_id + contacts_contact_id: + - table: contacts + keys: + - id + estimate_item_categories_: + - table: estimate_item_categories + keys: + - id + estimate_line_items_: + - table: estimate_line_items + keys: + - id + estimate_messages_: + - table: estimate_messages + keys: + - id + estimates_estimate_id: + - table: estimate_line_items + keys: + - estimate_id + - table: estimate_messages + keys: + - estimate_id + - table: estimates + keys: + - id + - table: invoices + keys: + - estimate_id + expense_categories_expense_category_id: + - table: expense_categories + keys: + - id + - table: expenses + keys: + - expense_category_id + expenses_expense_id: + - table: expenses + keys: + - id + - table: time_entries + keys: + - external_reference_id + - table: time_entry_external_reference + keys: + - external_reference_id + invoice_item_categories_invoice_item_category_id: + - table: invoice_item_categories + keys: + - id + invoice_messages_invoice_message_id: + - table: invoice_messages + keys: + - id + invoices_invoice_id: + - table: expenses + keys: + - invoice_id + - table: invoice_line_items + keys: + - invoice_id + - table: invoice_messages + keys: + - invoice_id + - table: invoice_payments + keys: + - invoice_id + - table: invoices + keys: + - id + - table: time_entries + keys: + - invoice_id + invoice_payments_invoice_payment_id: + - table: invoice_payments + keys: + - id + projects_project_id: + - table: expenses + keys: + - project_id + - table: invoice_line_items + keys: + - project_id + - table: project_tasks + keys: + - project_id + - table: project_users + keys: + - project_id + - table: projects + keys: + - id + - table: time_entries + keys: + - project_id + - table: user_projects + keys: + - project_id + project_tasks_project_task_id: + - table: project_tasks + keys: + - id + - table: user_project_tasks + keys: + - project_task_id + project_users_project_user_id: + - table: project_users + keys: + - id + roles_role_id: + - table: roles + keys: + - id + - table: user_roles + keys: + - role_id + tasks_task_id: + - table: tasks + keys: + - id + - table: time_entries + keys: + - task_id + time_entries_time_entry_id: + - table: time_entries + keys: + - id + - table: time_entry_external_reference + keys: + - time_entry_id + users_user_id: + - table: estimates + keys: + - creator_id + - table: invoices + keys: + - creator_id + - table: time_entries + keys: + - user_id + - table: users + keys: + - id + - table: user_project_tasks + keys: + - user_id + - table: user_projects + keys: + - user_id + - table: user_roles + keys: + - user_id + user_project_tasks_user_project_task_id: + - table: user_project_tasks + keys: + - id + user_projects_user_project_id: + - table: user_projects + keys: + - id +tables: +- table-name: clients + join: + - table-name: contacts + keys: + - key: id + foreign-key: client_id + - table-name: estimates + keys: + - key: id + foreign-key: client_id + - table-name: expenses + keys: + - key: id + foreign-key: client_id + - table-name: invoices + keys: + - key: id + foreign-key: client_id + - table-name: projects + keys: + - key: id + foreign-key: client_id + - table-name: time_entries + keys: + - key: id + foreign-key: client_id + - table-name: user_projects + keys: + - key: id + foreign-key: client_id +- table-name: contacts + join: + - table-name: clients + keys: + - key: client_id + foreign-key: id + - table-name: estimates + keys: + - key: client_id + foreign-key: client_id + - table-name: expenses + keys: + - key: client_id + foreign-key: client_id + - table-name: invoices + keys: + - key: client_id + foreign-key: client_id + - table-name: projects + keys: + - key: client_id + foreign-key: client_id + - table-name: time_entries + keys: + - key: client_id + foreign-key: client_id + - table-name: user_projects + keys: + - key: client_id + foreign-key: client_id +- table-name: estimates + join: + - table-name: clients + keys: + - key: client_id + foreign-key: id + - table-name: contacts + keys: + - key: client_id + foreign-key: client_id + - table-name: expenses + keys: + - key: client_id + foreign-key: client_id + - table-name: invoices + keys: + - key: client_id + foreign-key: client_id + - key: id + foreign-key: estimate_id + - key: creator_id + foreign-key: creator_id + - table-name: projects + keys: + - key: client_id + foreign-key: client_id + - table-name: time_entries + keys: + - key: client_id + foreign-key: client_id + - key: creator_id + foreign-key: user_id + - table-name: user_projects + keys: + - key: client_id + foreign-key: client_id + - key: creator_id + foreign-key: user_id + - table-name: estimate_line_items + keys: + - key: id + foreign-key: estimate_id + - table-name: estimate_messages + keys: + - key: id + foreign-key: estimate_id + - table-name: users + keys: + - key: creator_id + foreign-key: id + - table-name: user_project_tasks + keys: + - key: creator_id + foreign-key: user_id + - table-name: user_roles + keys: + - key: creator_id + foreign-key: user_id +- table-name: expenses + join: + - table-name: clients + keys: + - key: client_id + foreign-key: id + - table-name: contacts + keys: + - key: client_id + foreign-key: client_id + - table-name: estimates + keys: + - key: client_id + foreign-key: client_id + - table-name: invoices + keys: + - key: client_id + foreign-key: client_id + - key: invoice_id + foreign-key: id + - table-name: projects + keys: + - key: client_id + foreign-key: client_id + - key: project_id + foreign-key: id + - table-name: time_entries + keys: + - key: client_id + foreign-key: client_id + - key: id + foreign-key: external_reference_id + - key: invoice_id + foreign-key: invoice_id + - key: project_id + foreign-key: project_id + - table-name: user_projects + keys: + - key: client_id + foreign-key: client_id + - key: project_id + foreign-key: project_id + - table-name: expense_categories + keys: + - key: expense_category_id + foreign-key: id + - table-name: time_entry_external_reference + keys: + - key: id + foreign-key: external_reference_id + - table-name: invoice_line_items + keys: + - key: invoice_id + foreign-key: invoice_id + - key: project_id + foreign-key: project_id + - table-name: invoice_messages + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: invoice_payments + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: project_tasks + keys: + - key: project_id + foreign-key: project_id + - table-name: project_users + keys: + - key: project_id + foreign-key: project_id +- table-name: invoices + join: + - table-name: clients + keys: + - key: client_id + foreign-key: id + - table-name: contacts + keys: + - key: client_id + foreign-key: client_id + - table-name: estimates + keys: + - key: client_id + foreign-key: client_id + - key: estimate_id + foreign-key: id + - key: creator_id + foreign-key: creator_id + - table-name: expenses + keys: + - key: client_id + foreign-key: client_id + - key: id + foreign-key: invoice_id + - table-name: projects + keys: + - key: client_id + foreign-key: client_id + - table-name: time_entries + keys: + - key: client_id + foreign-key: client_id + - key: id + foreign-key: invoice_id + - key: creator_id + foreign-key: user_id + - table-name: user_projects + keys: + - key: client_id + foreign-key: client_id + - key: creator_id + foreign-key: user_id + - table-name: estimate_line_items + keys: + - key: estimate_id + foreign-key: estimate_id + - table-name: estimate_messages + keys: + - key: estimate_id + foreign-key: estimate_id + - table-name: invoice_line_items + keys: + - key: id + foreign-key: invoice_id + - table-name: invoice_messages + keys: + - key: id + foreign-key: invoice_id + - table-name: invoice_payments + keys: + - key: id + foreign-key: invoice_id + - table-name: users + keys: + - key: creator_id + foreign-key: id + - table-name: user_project_tasks + keys: + - key: creator_id + foreign-key: user_id + - table-name: user_roles + keys: + - key: creator_id + foreign-key: user_id +- table-name: projects + join: + - table-name: clients + keys: + - key: client_id + foreign-key: id + - table-name: contacts + keys: + - key: client_id + foreign-key: client_id + - table-name: estimates + keys: + - key: client_id + foreign-key: client_id + - table-name: expenses + keys: + - key: client_id + foreign-key: client_id + - key: id + foreign-key: project_id + - table-name: invoices + keys: + - key: client_id + foreign-key: client_id + - table-name: time_entries + keys: + - key: client_id + foreign-key: client_id + - key: id + foreign-key: project_id + - table-name: user_projects + keys: + - key: client_id + foreign-key: client_id + - key: id + foreign-key: project_id + - table-name: invoice_line_items + keys: + - key: id + foreign-key: project_id + - table-name: project_tasks + keys: + - key: id + foreign-key: project_id + - table-name: project_users + keys: + - key: id + foreign-key: project_id +- table-name: time_entries + join: + - table-name: clients + keys: + - key: client_id + foreign-key: id + - table-name: contacts + keys: + - key: client_id + foreign-key: client_id + - table-name: estimates + keys: + - key: client_id + foreign-key: client_id + - key: user_id + foreign-key: creator_id + - table-name: expenses + keys: + - key: client_id + foreign-key: client_id + - key: external_reference_id + foreign-key: id + - key: invoice_id + foreign-key: invoice_id + - key: project_id + foreign-key: project_id + - table-name: invoices + keys: + - key: client_id + foreign-key: client_id + - key: invoice_id + foreign-key: id + - key: user_id + foreign-key: creator_id + - table-name: projects + keys: + - key: client_id + foreign-key: client_id + - key: project_id + foreign-key: id + - table-name: user_projects + keys: + - key: client_id + foreign-key: client_id + - key: project_id + foreign-key: project_id + - key: user_id + foreign-key: user_id + - table-name: time_entry_external_reference + keys: + - key: external_reference_id + foreign-key: external_reference_id + - key: id + foreign-key: time_entry_id + - table-name: invoice_line_items + keys: + - key: invoice_id + foreign-key: invoice_id + - key: project_id + foreign-key: project_id + - table-name: invoice_messages + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: invoice_payments + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: project_tasks + keys: + - key: project_id + foreign-key: project_id + - table-name: project_users + keys: + - key: project_id + foreign-key: project_id + - table-name: tasks + keys: + - key: task_id + foreign-key: id + - table-name: users + keys: + - key: user_id + foreign-key: id + - table-name: user_project_tasks + keys: + - key: user_id + foreign-key: user_id + - table-name: user_roles + keys: + - key: user_id + foreign-key: user_id +- table-name: user_projects + join: + - table-name: clients + keys: + - key: client_id + foreign-key: id + - table-name: contacts + keys: + - key: client_id + foreign-key: client_id + - table-name: estimates + keys: + - key: client_id + foreign-key: client_id + - key: user_id + foreign-key: creator_id + - table-name: expenses + keys: + - key: client_id + foreign-key: client_id + - key: project_id + foreign-key: project_id + - table-name: invoices + keys: + - key: client_id + foreign-key: client_id + - key: user_id + foreign-key: creator_id + - table-name: projects + keys: + - key: client_id + foreign-key: client_id + - key: project_id + foreign-key: id + - table-name: time_entries + keys: + - key: client_id + foreign-key: client_id + - key: project_id + foreign-key: project_id + - key: user_id + foreign-key: user_id + - table-name: invoice_line_items + keys: + - key: project_id + foreign-key: project_id + - table-name: project_tasks + keys: + - key: project_id + foreign-key: project_id + - table-name: project_users + keys: + - key: project_id + foreign-key: project_id + - table-name: users + keys: + - key: user_id + foreign-key: id + - table-name: user_project_tasks + keys: + - key: user_id + foreign-key: user_id + - table-name: user_roles + keys: + - key: user_id + foreign-key: user_id +- table-name: estimate_line_items + join: + - table-name: estimate_messages + keys: + - key: estimate_id + foreign-key: estimate_id + - table-name: estimates + keys: + - key: estimate_id + foreign-key: id + - table-name: invoices + keys: + - key: estimate_id + foreign-key: estimate_id +- table-name: estimate_messages + join: + - table-name: estimate_line_items + keys: + - key: estimate_id + foreign-key: estimate_id + - table-name: estimates + keys: + - key: estimate_id + foreign-key: id + - table-name: invoices + keys: + - key: estimate_id + foreign-key: estimate_id +- table-name: expense_categories + join: + - table-name: expenses + keys: + - key: id + foreign-key: expense_category_id +- table-name: time_entry_external_reference + join: + - table-name: expenses + keys: + - key: external_reference_id + foreign-key: id + - table-name: time_entries + keys: + - key: external_reference_id + foreign-key: external_reference_id + - key: time_entry_id + foreign-key: id +- table-name: invoice_messages + join: + - table-name: expenses + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: invoice_line_items + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: invoice_payments + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: invoices + keys: + - key: invoice_id + foreign-key: id + - table-name: time_entries + keys: + - key: invoice_id + foreign-key: invoice_id +- table-name: invoice_line_items + join: + - table-name: expenses + keys: + - key: invoice_id + foreign-key: invoice_id + - key: project_id + foreign-key: project_id + - table-name: invoice_messages + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: invoice_payments + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: invoices + keys: + - key: invoice_id + foreign-key: id + - table-name: time_entries + keys: + - key: invoice_id + foreign-key: invoice_id + - key: project_id + foreign-key: project_id + - table-name: project_tasks + keys: + - key: project_id + foreign-key: project_id + - table-name: project_users + keys: + - key: project_id + foreign-key: project_id + - table-name: projects + keys: + - key: project_id + foreign-key: id + - table-name: user_projects + keys: + - key: project_id + foreign-key: project_id +- table-name: invoice_payments + join: + - table-name: expenses + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: invoice_line_items + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: invoice_messages + keys: + - key: invoice_id + foreign-key: invoice_id + - table-name: invoices + keys: + - key: invoice_id + foreign-key: id + - table-name: time_entries + keys: + - key: invoice_id + foreign-key: invoice_id +- table-name: project_tasks + join: + - table-name: expenses + keys: + - key: project_id + foreign-key: project_id + - table-name: invoice_line_items + keys: + - key: project_id + foreign-key: project_id + - table-name: project_users + keys: + - key: project_id + foreign-key: project_id + - table-name: projects + keys: + - key: project_id + foreign-key: id + - table-name: time_entries + keys: + - key: project_id + foreign-key: project_id + - table-name: user_projects + keys: + - key: project_id + foreign-key: project_id + - table-name: user_project_tasks + keys: + - key: id + foreign-key: project_task_id +- table-name: project_users + join: + - table-name: expenses + keys: + - key: project_id + foreign-key: project_id + - table-name: invoice_line_items + keys: + - key: project_id + foreign-key: project_id + - table-name: project_tasks + keys: + - key: project_id + foreign-key: project_id + - table-name: projects + keys: + - key: project_id + foreign-key: id + - table-name: time_entries + keys: + - key: project_id + foreign-key: project_id + - table-name: user_projects + keys: + - key: project_id + foreign-key: project_id +- table-name: user_project_tasks + join: + - table-name: project_tasks + keys: + - key: project_task_id + foreign-key: id + - table-name: estimates + keys: + - key: user_id + foreign-key: creator_id + - table-name: invoices + keys: + - key: user_id + foreign-key: creator_id + - table-name: time_entries + keys: + - key: user_id + foreign-key: user_id + - table-name: users + keys: + - key: user_id + foreign-key: id + - table-name: user_projects + keys: + - key: user_id + foreign-key: user_id + - table-name: user_roles + keys: + - key: user_id + foreign-key: user_id +- table-name: roles + join: + - table-name: user_roles + keys: + - key: id + foreign-key: role_id +- table-name: user_roles + join: + - table-name: roles + keys: + - key: role_id + foreign-key: id + - table-name: estimates + keys: + - key: user_id + foreign-key: creator_id + - table-name: invoices + keys: + - key: user_id + foreign-key: creator_id + - table-name: time_entries + keys: + - key: user_id + foreign-key: user_id + - table-name: users + keys: + - key: user_id + foreign-key: id + - table-name: user_project_tasks + keys: + - key: user_id + foreign-key: user_id + - table-name: user_projects + keys: + - key: user_id + foreign-key: user_id +- table-name: tasks + join: + - table-name: time_entries + keys: + - key: id + foreign-key: task_id +- table-name: users + join: + - table-name: estimates + keys: + - key: id + foreign-key: creator_id + - table-name: invoices + keys: + - key: id + foreign-key: creator_id + - table-name: time_entries + keys: + - key: id + foreign-key: user_id + - table-name: user_project_tasks + keys: + - key: id + foreign-key: user_id + - table-name: user_projects + keys: + - key: id + foreign-key: user_id + - table-name: user_roles + keys: + - key: id + foreign-key: user_id diff --git a/_data/taps/schemas/harvest/v3/harvest-v3-tables.yml b/_data/taps/schemas/harvest/v3/harvest-v3-tables.yml new file mode 100644 index 000000000..6d321da55 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/harvest-v3-tables.yml @@ -0,0 +1,333 @@ +tap: harvest +version: '3' +tables: +- name: clients + description: 'The `{{ table.name }}` table contains info about the clients in your + Harvest account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/clients-api/clients/clients/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/clients.json + api-method: https://help.getharvest.com/api-v2/clients-api/clients/clients/#list-all-clients + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: contacts + description: 'The `{{ table.name }}` table contains info about the client contacts + in your Harvest account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/clients-api/clients/contacts/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/contacts.json + api-method: https://help.getharvest.com/api-v2/clients-api/clients/contacts/#list-all-contacts + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: estimates + description: 'The `{{ table.name }}` table contains info about the estimates in your + {{ integration.display_name }} account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/estimates-api/estimates/estimates/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/estimates.json + api-method: https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-messages/#list-all-messages-for-an-estimate + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: estimate_item_categories + description: 'The `estimate_item_categories` table contains info about the estimate + item categories in your Harvest account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-item-categories/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/estimate_item_categories.json + api-method: https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-item-categories/#list-all-estimate-item-categories + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: estimate_line_items + description: 'The `{{ table.name }}` table contains info about the line items contained + in estimates. + + + **Note**: This table is updated based on new and updated `estimates`. This means + that when an estimate is updated, this table will also be updated. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/estimates-api/estimates/estimates/#the-estimate-line-item-object + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/estimate_line_items.json + api-method: https://help.getharvest.com/api-v2/estimates-api/estimates/estimates/#get-all-estimates + table-details: + replication-method: Key-based Incremental + primary-key: id +- name: estimate_messages + description: 'The `{{ table.name }}` table contains info about the messages associated + with estimates. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-messages/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/estimate_messages.json + api-method: https://help.getharvest.com/api-v2/estimates-api/estimates/estimate-messages/#list-all-messages-for-an-estimate + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: expenses + description: 'The `expenses` table contains info about the expenses recorded in + your Harvest account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/expenses-api/expenses/expenses/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/expenses.json + api-method: https://help.getharvest.com/api-v2/expenses-api/expenses/expenses#list-all-expenses + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: expense_categories + description: 'The `expense_categories` table contains info about the expense categories + in your Harvest account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/expenses-api/expenses/expense-categories/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/expense_categories.json + api-method: https://help.getharvest.com/api-v2/expenses-api/expenses/expense-categories/#list-all-expense-categories + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: invoices + description: 'The `{{ table.name }}` table contains info about the invoices in your + Harvest account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/invoices-api/invoices/invoices/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/invoices.json + api-method: https://help.getharvest.com/api-v2/invoices-api/invoices/invoices#list-all-invoices + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: invoice_item_categories + description: 'The `{{ table.name }}` table contains info about the various categories + that can be applied to invoice line items. + + + **Note**: Harvest includes two non-removable categories by default for the hours + and expenses you bill. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-item-categories/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/invoice_item_categories.json + api-method: http://help.getharvest.com/api-v1/invoices-api/invoices/invoice-messages-payments/#show-all-categories + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: invoice_line_items + description: 'The `{{ table.name }}` table contains info about the line items contained + in invoices. + + + **Note**: This table is updated based on new and updated `invoices`. This means + that when an invoice is updated, this table will also be updated. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/invoices-api/invoices/invoices#the-invoice-line-item-object + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/invoice_line_items.json + api-method: https://help.getharvest.com/api-v2/invoices-api/invoices/invoices#list-all-invoices + table-details: + replication-method: Key-based Incremental + primary-key: id +- name: invoice_messages + description: 'The `{{ table.name }}` table contains info about invoice messages, + or emails sent to clients about invoices. + + ' + links: + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/invoice_messages.json + api-method: https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-messages/ + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: invoice_payments + description: 'The `{{ table.name }}` table contains info about the payments applied + to invoices in your Harvest account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-payments/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/invoice_payments.json + api-method: https://help.getharvest.com/api-v2/invoices-api/invoices/invoice-payments#list-all-payments-for-an-invoice + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: projects + description: 'The `{{ table.name }}` table contains info about the projects in your + Harvest account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/projects-api/projects/projects/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/projects.json + api-method: https://help.getharvest.com/api-v2/projects-api/projects/projects#list-all-projects + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: project_tasks + description: 'The `{{ table.name }}` table contains info about the tasks assigned + to projects. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/projects-api/projects/task-assignments/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/project_tasks.json + api-method: https://help.getharvest.com/api-v2/projects-api/projects/task-assignments#list-all-task-assignments + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: project_users + description: 'The `{{ table.name }}` table contains info about the users assigned + to projects. + + ' + links: + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/project_users.json + api-method: https://help.getharvest.com/api-v2/projects-api/projects/user-assignments/ + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: roles + description: 'The `{{ table.name }}` table contains info about the roles in your + {{ integration.display_name }} account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/roles-api/roles/roles/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/roles.json + api-method: https://help.getharvest.com/api-v2/roles-api/roles/roles#list-all-roles + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: tasks + description: 'The `{{ table.name }}` table contains info about the tasks in your + Harvest account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/tasks-api/tasks/tasks/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/tasks.json + api-method: https://help.getharvest.com/api-v2/tasks-api/tasks/tasks#list-all-tasks + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: time_entries + description: 'The `{{ table.name }}` table contains info about the time entries + in your Harvest account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/time_entries.json + api-method: https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries#list-all-time-entries + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: time_entry_external_reference + description: 'The `{{ table.name }}` table contains pairs of time entry IDs and + external reference IDs. This data can be used to tie time entries tracked in external + services (such as Trello) to your other Harvest data. + + + **Note**: This table is updated based on new and updated `time_entries`. This + means that when a time entry is updated, this table will also be updated. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/time_entry_external_reference.json + api-method: https://help.getharvest.com/api-v2/timesheets-api/timesheets/time-entries#list-all-time-entries + table-details: + replication-method: Key-based Incremental + primary-keys: + - time_entry_id + - external_reference_id +- name: users + description: 'The `{{ table.name }}` table contains info about the users in your + Harvest account. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/users-api/users/users/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/users.json + api-method: https://help.getharvest.com/api-v2/users-api/users/users#list-all-users + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: user_projects + description: 'The `{{ table.name }}` table contains info about the project assignments + users are assigned to. + + ' + links: + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/user_projects.json + api-method: https://help.getharvest.com/api-v2/users-api/users/project-assignments/ + table-details: + replication-method: Key-based Incremental + primary-key: id + replication-key: updated_at +- name: user_project_tasks + description: "The `{{ table.name }}` table contains pairs of user IDs and project\ + \ task IDs.\n\n This data can be used to see lists of all the project tasks associated\ + \ with a user, and join tables together to get a comprehensive look at the user's\ + \ projects.\n\n**Note**: This table is updated based on new and updated `users`.\ + \ This means that when a user is updated, this table will also be updated.\n" + links: + doc-link: null + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/user_project_tasks.json + table-details: + replication-method: Key-based Incremental + primary-keys: + - user_id + - project_task_id +- name: user_roles + description: 'The `{{ table.name }}` table contains a list of user ID and role ID + pairs, enabling you to see the roles users are associated with. + + + **Note**: This table is updated based on new and updated `users`. This means that + when a user is updated, this table will also be updated. + + ' + links: + doc-link: https://help.getharvest.com/api-v2/users-api/users/users/ + singer-schema: https://github.com/singer-io/tap-harvest/blob/master/tap_harvest/schemas/user_roles.json + table-details: + replication-method: Key-based Incremental + primary-keys: + - user_id + - role_id diff --git a/_data/taps/schemas/harvest/v3/json/clients.json b/_data/taps/schemas/harvest/v3/json/clients.json new file mode 100644 index 000000000..0df08b2bd --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/clients.json @@ -0,0 +1,47 @@ +{ + "properties": { + "address": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "currency": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_active": { + "type": [ + "null", + "boolean" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/contacts.json b/_data/taps/schemas/harvest/v3/json/contacts.json new file mode 100644 index 000000000..0868709de --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/contacts.json @@ -0,0 +1,71 @@ +{ + "properties": { + "client_id": { + "type": [ + "null", + "integer" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "fax": { + "type": [ + "null", + "string" + ] + }, + "first_name": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "last_name": { + "type": [ + "null", + "string" + ] + }, + "phone_mobile": { + "type": [ + "null", + "string" + ] + }, + "phone_office": { + "type": [ + "null", + "string" + ] + }, + "title": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/estimate_item_categories.json b/_data/taps/schemas/harvest/v3/json/estimate_item_categories.json new file mode 100644 index 000000000..87185e5c1 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/estimate_item_categories.json @@ -0,0 +1,29 @@ +{ + "properties": { + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/estimate_line_items.json b/_data/taps/schemas/harvest/v3/json/estimate_line_items.json new file mode 100644 index 000000000..24d0a69ca --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/estimate_line_items.json @@ -0,0 +1,59 @@ +{ + "properties": { + "amount": { + "type": [ + "null", + "number" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "estimate_id": { + "type": [ + "null", + "integer" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "kind": { + "type": [ + "null", + "string" + ] + }, + "quantity": { + "type": [ + "null", + "integer" + ] + }, + "taxed": { + "type": [ + "null", + "boolean" + ] + }, + "taxed2": { + "type": [ + "null", + "boolean" + ] + }, + "unit_price": { + "type": [ + "null", + "number" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/estimate_messages.json b/_data/taps/schemas/harvest/v3/json/estimate_messages.json new file mode 100644 index 000000000..bbb0afaa8 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/estimate_messages.json @@ -0,0 +1,103 @@ +{ + "properties": { + "body": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "estimate_id": { + "type": [ + "null", + "integer" + ] + }, + "event_type": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "recipients": { + "items": { + "properties": { + "email": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "send_me_a_copy": { + "type": [ + "null", + "boolean" + ] + }, + "sent_by": { + "type": [ + "null", + "string" + ] + }, + "sent_by_email": { + "type": [ + "null", + "string" + ] + }, + "sent_from": { + "type": [ + "null", + "string" + ] + }, + "sent_from_email": { + "type": [ + "null", + "string" + ] + }, + "subject": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/estimates.json b/_data/taps/schemas/harvest/v3/json/estimates.json new file mode 100644 index 000000000..3e5fbcebc --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/estimates.json @@ -0,0 +1,146 @@ +{ + "properties": { + "accepted_at": { + "type": [ + "null", + "date-time" + ] + }, + "amount": { + "type": [ + "null", + "number" + ] + }, + "client_id": { + "type": [ + "null", + "integer" + ] + }, + "client_key": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "creator_id": { + "type": [ + "null", + "integer" + ] + }, + "currency": { + "type": [ + "null", + "string" + ] + }, + "declined_at": { + "type": [ + "null", + "date-time" + ] + }, + "discount": { + "type": [ + "null", + "string", + "number" + ] + }, + "discount_amount": { + "type": [ + "null", + "number" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "issue_date": { + "type": [ + "null", + "date-time" + ] + }, + "notes": { + "type": [ + "null", + "string" + ] + }, + "number": { + "type": [ + "null", + "string" + ] + }, + "purchase_order": { + "type": [ + "null", + "string" + ] + }, + "sent_at": { + "type": [ + "null", + "date-time" + ] + }, + "state": { + "type": [ + "null", + "string" + ] + }, + "subject": { + "type": [ + "null", + "string" + ] + }, + "tax": { + "type": [ + "null", + "string", + "number" + ] + }, + "tax2": { + "type": [ + "null", + "string", + "number" + ] + }, + "tax2_amount": { + "type": [ + "null", + "number" + ] + }, + "tax_amount": { + "type": [ + "null", + "number" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/expense_categories.json b/_data/taps/schemas/harvest/v3/json/expense_categories.json new file mode 100644 index 000000000..90cfd97a9 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/expense_categories.json @@ -0,0 +1,47 @@ +{ + "properties": { + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_active": { + "type": [ + "null", + "boolean" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "unit_name": { + "type": [ + "null", + "string" + ] + }, + "unit_price": { + "type": [ + "null", + "number" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/expenses.json b/_data/taps/schemas/harvest/v3/json/expenses.json new file mode 100644 index 000000000..6c41d1fce --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/expenses.json @@ -0,0 +1,137 @@ +{ + "properties": { + "billable": { + "type": [ + "null", + "boolean" + ] + }, + "client_id": { + "type": [ + "null", + "integer" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "expense_category_id": { + "type": [ + "null", + "integer" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "invoice_id": { + "type": [ + "null", + "integer" + ] + }, + "is_billed": { + "type": [ + "null", + "boolean" + ] + }, + "is_closed": { + "type": [ + "null", + "boolean" + ] + }, + "is_locked": { + "type": [ + "null", + "boolean" + ] + }, + "locked_reason": { + "type": [ + "null", + "string" + ] + }, + "notes": { + "type": [ + "null", + "string" + ] + }, + "project_id": { + "type": [ + "null", + "integer" + ] + }, + "receipt_content_type": { + "type": [ + "null", + "string" + ] + }, + "receipt_file_name": { + "type": [ + "null", + "string" + ] + }, + "receipt_file_size": { + "type": [ + "null", + "integer" + ] + }, + "receipt_url": { + "type": [ + "null", + "string" + ] + }, + "spent_date": { + "type": [ + "null", + "date-time" + ] + }, + "total_cost": { + "type": [ + "null", + "number" + ] + }, + "units": { + "type": [ + "null", + "number" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + }, + "user_assignment_id": { + "type": [ + "null", + "integer" + ] + }, + "user_id": { + "type": [ + "null", + "integer" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/invoice_item_categories.json b/_data/taps/schemas/harvest/v3/json/invoice_item_categories.json new file mode 100644 index 000000000..4e72640f9 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/invoice_item_categories.json @@ -0,0 +1,41 @@ +{ + "properties": { + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + }, + "use_as_expense": { + "type": [ + "null", + "boolean" + ] + }, + "use_as_service": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/invoice_line_items.json b/_data/taps/schemas/harvest/v3/json/invoice_line_items.json new file mode 100644 index 000000000..0797fe788 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/invoice_line_items.json @@ -0,0 +1,65 @@ +{ + "properties": { + "amount": { + "type": [ + "null", + "number" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "invoice_id": { + "type": [ + "null", + "integer" + ] + }, + "kind": { + "type": [ + "null", + "string" + ] + }, + "project_id": { + "type": [ + "null", + "integer" + ] + }, + "quantity": { + "type": [ + "null", + "integer" + ] + }, + "taxed": { + "type": [ + "null", + "boolean" + ] + }, + "taxed2": { + "type": [ + "null", + "boolean" + ] + }, + "unit_price": { + "type": [ + "null", + "number" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/invoice_messages.json b/_data/taps/schemas/harvest/v3/json/invoice_messages.json new file mode 100644 index 000000000..2264fc52f --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/invoice_messages.json @@ -0,0 +1,133 @@ +{ + "properties": { + "attach_pdf": { + "type": [ + "null", + "boolean" + ] + }, + "body": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "event_type": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "include_link_to_client_invoice": { + "type": [ + "null", + "boolean" + ] + }, + "invoice_id": { + "type": [ + "null", + "integer" + ] + }, + "recipients": { + "items": { + "properties": { + "email": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "reminder": { + "type": [ + "null", + "boolean" + ] + }, + "send_me_a_copy": { + "type": [ + "null", + "boolean" + ] + }, + "send_reminder_on": { + "type": [ + "null", + "date-time" + ] + }, + "sent_by": { + "type": [ + "null", + "string" + ] + }, + "sent_by_email": { + "type": [ + "null", + "string" + ] + }, + "sent_from": { + "type": [ + "null", + "string" + ] + }, + "sent_from_email": { + "type": [ + "null", + "string" + ] + }, + "subject": { + "type": [ + "null", + "string" + ] + }, + "thank_you": { + "type": [ + "null", + "boolean" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/invoice_payments.json b/_data/taps/schemas/harvest/v3/json/invoice_payments.json new file mode 100644 index 000000000..a44155331 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/invoice_payments.json @@ -0,0 +1,83 @@ +{ + "properties": { + "amount": { + "type": [ + "null", + "number" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "invoice_id": { + "type": [ + "null", + "integer" + ] + }, + "notes": { + "type": [ + "null", + "string" + ] + }, + "paid_at": { + "type": [ + "null", + "date-time" + ] + }, + "paid_date": { + "type": [ + "null", + "date-time" + ] + }, + "payment_gateway_id": { + "type": [ + "null", + "integer" + ] + }, + "payment_gateway_name": { + "type": [ + "null", + "integer" + ] + }, + "recorded_by": { + "type": [ + "null", + "string" + ] + }, + "recorded_by_email": { + "type": [ + "null", + "string" + ] + }, + "transaction_id": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/invoices.json b/_data/taps/schemas/harvest/v3/json/invoices.json new file mode 100644 index 000000000..d3e452caa --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/invoices.json @@ -0,0 +1,194 @@ +{ + "properties": { + "amount": { + "type": [ + "null", + "number" + ] + }, + "client_id": { + "type": [ + "null", + "integer" + ] + }, + "client_key": { + "type": [ + "null", + "string" + ] + }, + "closed_at": { + "type": [ + "null", + "date-time" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "creator_id": { + "type": [ + "null", + "integer" + ] + }, + "currency": { + "type": [ + "null", + "string" + ] + }, + "discount": { + "type": [ + "null", + "string", + "number" + ] + }, + "discount_amount": { + "type": [ + "null", + "number" + ] + }, + "due_amount": { + "type": [ + "null", + "number" + ] + }, + "due_date": { + "type": [ + "null", + "date-time" + ] + }, + "estimate_id": { + "type": [ + "null", + "integer" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "issue_date": { + "type": [ + "null", + "date-time" + ] + }, + "notes": { + "type": [ + "null", + "string" + ] + }, + "number": { + "type": [ + "null", + "string" + ] + }, + "paid_at": { + "type": [ + "null", + "date-time" + ] + }, + "paid_date": { + "type": [ + "null", + "date-time" + ] + }, + "payment_term": { + "type": [ + "null", + "string" + ] + }, + "period_end": { + "type": [ + "null", + "date-time" + ] + }, + "period_start": { + "type": [ + "null", + "date-time" + ] + }, + "purchase_order": { + "type": [ + "null", + "string" + ] + }, + "retainer_id": { + "type": [ + "null", + "integer" + ] + }, + "sent_at": { + "type": [ + "null", + "date-time" + ] + }, + "state": { + "type": [ + "null", + "string" + ] + }, + "subject": { + "type": [ + "null", + "string" + ] + }, + "tax": { + "type": [ + "null", + "string", + "number" + ] + }, + "tax2": { + "type": [ + "null", + "string", + "number" + ] + }, + "tax2_amount": { + "type": [ + "null", + "number" + ] + }, + "tax_amount": { + "type": [ + "null", + "number" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/project_tasks.json b/_data/taps/schemas/harvest/v3/json/project_tasks.json new file mode 100644 index 000000000..a83c8f223 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/project_tasks.json @@ -0,0 +1,59 @@ +{ + "properties": { + "billable": { + "type": [ + "null", + "boolean" + ] + }, + "budget": { + "type": [ + "null", + "number" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "hourly_rate": { + "type": [ + "null", + "number" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_active": { + "type": [ + "null", + "boolean" + ] + }, + "project_id": { + "type": [ + "null", + "integer" + ] + }, + "task_id": { + "type": [ + "null", + "integer" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/project_users.json b/_data/taps/schemas/harvest/v3/json/project_users.json new file mode 100644 index 000000000..cb13b6b5f --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/project_users.json @@ -0,0 +1,59 @@ +{ + "properties": { + "budget": { + "type": [ + "null", + "number" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "hourly_rate": { + "type": [ + "null", + "number" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_active": { + "type": [ + "null", + "boolean" + ] + }, + "is_project_manager": { + "type": [ + "null", + "boolean" + ] + }, + "project_id": { + "type": [ + "null", + "integer" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + }, + "user_id": { + "type": [ + "null", + "integer" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/projects.json b/_data/taps/schemas/harvest/v3/json/projects.json new file mode 100644 index 000000000..d8a96590a --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/projects.json @@ -0,0 +1,149 @@ +{ + "properties": { + "bill_by": { + "type": [ + "null", + "string" + ] + }, + "budget": { + "type": [ + "null", + "number" + ] + }, + "budget_by": { + "type": [ + "null", + "string" + ] + }, + "budget_is_monthly": { + "type": [ + "null", + "boolean" + ] + }, + "client_id": { + "type": [ + "null", + "integer" + ] + }, + "code": { + "type": [ + "null", + "string" + ] + }, + "cost_budget": { + "type": [ + "null", + "number" + ] + }, + "cost_budget_include_expenses": { + "type": [ + "null", + "boolean" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "ends_on": { + "type": [ + "null", + "string" + ] + }, + "fee": { + "type": [ + "null", + "number" + ] + }, + "hourly_rate": { + "type": [ + "null", + "number" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_active": { + "type": [ + "null", + "boolean" + ] + }, + "is_billable": { + "type": [ + "null", + "boolean" + ] + }, + "is_fixed_fee": { + "type": [ + "null", + "boolean" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "notes": { + "type": [ + "null", + "string" + ] + }, + "notify_when_over_budget": { + "type": [ + "null", + "boolean" + ] + }, + "over_budget_notification_date": { + "type": [ + "null", + "date-time" + ] + }, + "over_budget_notification_percentage": { + "type": [ + "null", + "integer" + ] + }, + "show_budget_to_all": { + "type": [ + "null", + "boolean" + ] + }, + "starts_on": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/roles.json b/_data/taps/schemas/harvest/v3/json/roles.json new file mode 100644 index 000000000..87185e5c1 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/roles.json @@ -0,0 +1,29 @@ +{ + "properties": { + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/tasks.json b/_data/taps/schemas/harvest/v3/json/tasks.json new file mode 100644 index 000000000..4f7fdab2a --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/tasks.json @@ -0,0 +1,53 @@ +{ + "properties": { + "billable_by_default": { + "type": [ + "null", + "boolean" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "default_hourly_rate": { + "type": [ + "null", + "number" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_active": { + "type": [ + "null", + "boolean" + ] + }, + "is_default": { + "type": [ + "null", + "boolean" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/time_entries.json b/_data/taps/schemas/harvest/v3/json/time_entries.json new file mode 100644 index 000000000..f0a43779f --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/time_entries.json @@ -0,0 +1,161 @@ +{ + "properties": { + "billable": { + "type": [ + "null", + "boolean" + ] + }, + "billable_rate": { + "type": [ + "null", + "number" + ] + }, + "budgeted": { + "type": [ + "null", + "number" + ] + }, + "client_id": { + "type": [ + "null", + "integer" + ] + }, + "cost_rate": { + "type": [ + "null", + "number" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "ended_time": { + "type": [ + "null", + "time" + ] + }, + "external_reference_id": { + "type": [ + "null", + "string" + ] + }, + "hours": { + "type": [ + "null", + "number" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "invoice_id": { + "type": [ + "null", + "integer" + ] + }, + "is_billed": { + "type": [ + "null", + "boolean" + ] + }, + "is_closed": { + "type": [ + "null", + "boolean" + ] + }, + "is_locked": { + "type": [ + "null", + "boolean" + ] + }, + "is_running": { + "type": [ + "null", + "boolean" + ] + }, + "locked_reason": { + "type": [ + "null", + "string" + ] + }, + "notes": { + "type": [ + "null", + "string" + ] + }, + "project_id": { + "type": [ + "null", + "integer" + ] + }, + "spent_date": { + "type": [ + "null", + "date-time" + ] + }, + "started_time": { + "type": [ + "null", + "time" + ] + }, + "task_assignment_id": { + "type": [ + "null", + "integer" + ] + }, + "task_id": { + "type": [ + "null", + "integer" + ] + }, + "timer_started_at": { + "type": [ + "null", + "date-time" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + }, + "user_assignment_id": { + "type": [ + "null", + "integer" + ] + }, + "user_id": { + "type": [ + "null", + "integer" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/time_entry_external_reference.json b/_data/taps/schemas/harvest/v3/json/time_entry_external_reference.json new file mode 100644 index 000000000..16f340b69 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/time_entry_external_reference.json @@ -0,0 +1,17 @@ +{ + "properties": { + "external_reference_id": { + "type": [ + "null", + "string" + ] + }, + "time_entry_id": { + "type": [ + "null", + "integer" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/user_project_tasks.json b/_data/taps/schemas/harvest/v3/json/user_project_tasks.json new file mode 100644 index 000000000..446fd3330 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/user_project_tasks.json @@ -0,0 +1,17 @@ +{ + "properties": { + "project_task_id": { + "type": [ + "null", + "integer" + ] + }, + "user_id": { + "type": [ + "null", + "integer" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/user_projects.json b/_data/taps/schemas/harvest/v3/json/user_projects.json new file mode 100644 index 000000000..183aa71d2 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/user_projects.json @@ -0,0 +1,65 @@ +{ + "properties": { + "budget": { + "type": [ + "null", + "number" + ] + }, + "client_id": { + "type": [ + "null", + "integer" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "hourly_rate": { + "type": [ + "null", + "number" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_active": { + "type": [ + "null", + "boolean" + ] + }, + "is_project_manager": { + "type": [ + "null", + "boolean" + ] + }, + "project_id": { + "type": [ + "null", + "integer" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + }, + "user_id": { + "type": [ + "null", + "integer" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/user_roles.json b/_data/taps/schemas/harvest/v3/json/user_roles.json new file mode 100644 index 000000000..39ba08837 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/user_roles.json @@ -0,0 +1,17 @@ +{ + "properties": { + "role_id": { + "type": [ + "null", + "integer" + ] + }, + "user_id": { + "type": [ + "null", + "integer" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/schemas/harvest/v3/json/users.json b/_data/taps/schemas/harvest/v3/json/users.json new file mode 100644 index 000000000..24163bdd7 --- /dev/null +++ b/_data/taps/schemas/harvest/v3/json/users.json @@ -0,0 +1,125 @@ +{ + "properties": { + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "can_create_invoices": { + "type": [ + "null", + "boolean" + ] + }, + "can_create_projects": { + "type": [ + "null", + "boolean" + ] + }, + "can_see_rates": { + "type": [ + "null", + "boolean" + ] + }, + "cost_rate": { + "type": [ + "null", + "number" + ] + }, + "created_at": { + "type": [ + "null", + "date-time" + ] + }, + "default_hourly_rate": { + "type": [ + "null", + "number" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "first_name": { + "type": [ + "null", + "string" + ] + }, + "has_access_to_all_future_projects": { + "type": [ + "null", + "boolean" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_active": { + "type": [ + "null", + "boolean" + ] + }, + "is_admin": { + "type": [ + "null", + "boolean" + ] + }, + "is_contractor": { + "type": [ + "null", + "boolean" + ] + }, + "is_project_manager": { + "type": [ + "null", + "boolean" + ] + }, + "last_name": { + "type": [ + "null", + "string" + ] + }, + "telephone": { + "type": [ + "null", + "string" + ] + }, + "timezone": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "type": [ + "null", + "date-time" + ] + }, + "weekly_capacity": { + "type": [ + "null", + "integer" + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/_data/taps/versions/harvest.yml b/_data/taps/versions/harvest.yml index 62b774223..a91225053 100644 --- a/_data/taps/versions/harvest.yml +++ b/_data/taps/versions/harvest.yml @@ -2,13 +2,17 @@ # HARVEST VERSIONS # # -------------------------- # -latest-version: "2" +latest-version: "3" released-versions: + - number: "3" + date-released: "June 14, 2025" + - number: "2" date-released: "August 30, 2018" # date-last-connection: sunset-date: + deprecation-date: "June 14, 2025" - number: "1" status: "sunset" diff --git a/_saas-integrations/harvest/v2/harvest-v2.md b/_saas-integrations/harvest/v2/harvest-v2.md index 8a928cfc4..024a3d6d9 100755 --- a/_saas-integrations/harvest/v2/harvest-v2.md +++ b/_saas-integrations/harvest/v2/harvest-v2.md @@ -1,9 +1,10 @@ --- title: Harvest (v2) -permalink: /integrations/saas/harvest +permalink: /integrations/saas/harvest/v2 keywords: harvest, harvest integration, schema, etl harvest, harvest etl, harvest schema summary: "Connection instructions, replication info, and schema details for Stitch's Harvest integration." layout: singer +input: false key: "harvest-setup" diff --git a/_saas-integrations/harvest/v3/harvest-v3.md b/_saas-integrations/harvest/v3/harvest-v3.md new file mode 100644 index 000000000..0ad0c1767 --- /dev/null +++ b/_saas-integrations/harvest/v3/harvest-v3.md @@ -0,0 +1,112 @@ +--- +title: Harvest (v3) +permalink: /integrations/saas/harvest +keywords: harvest, harvest integration, schema, etl harvest, harvest etl, harvest schema +summary: "Connection instructions, replication info, and schema details for Stitch's Harvest integration." +layout: singer + +key: "harvest-setup" + +# -------------------------- # +# Tap Details # +# -------------------------- # + +name: "harvest" +display_name: "Harvest" +singer: true +repo-url: https://github.com/singer-io/tap-harvest + +this-version: "3" + +api: | + [{{ integration.display_name }} REST API V2](https://help.getharvest.com/api-v2/){:target="new"} + +# -------------------------- # +# Stitch Details # +# -------------------------- # + +certified: false + +historical: "1 year" +frequency: "30 minutes" +tier: "Standard" +status-url: http://harveststatus.com/ + +api-type: "platform.harvest" + +table-selection: true +column-selection: true +select-all: true +select-all-reason: | + As this integration doesn't support table or column selection, all available tables and columns are automatically replicated. + +anchor-scheduling: true +cron-scheduling: false + +extraction-logs: true +loading-reports: true + + +# -------------------------- # +# Feature Summary # +# -------------------------- # + +feature-summary: | + Stitch's {{ integration.display_name }} integration replicates data using the {{ integration.api | flatify | strip }}. Refer to the [Schema](#schema) section for a list of objects available for replication. + + +# -------------------------- # +# Setup Instructions # +# -------------------------- # + +requirements-list: + - item: | + **Verify your Harvest user's access.** Stitch will have the same permissions as the user setting up the integration. This means Stitch will only be able to access the same objects and data as the authorizing user. + + For example: if you're unable to access expenses in Harvest, Stitch will be unable to replicate expense data. + +requirements-info: | + Before diving into the setup process, verify that the user setting up the integration has access to all the objects - such as expenses - that you want to replicate. + + [Read more about Harvest permissions in their documentation](http://help.getharvest.com/harvest/team/overview/new-permissions/). + +setup-steps: + - title: "Add {{ integration.display_name }} as a Stitch data source" + anchor: "add-stitch-data-source" + content: | + {% include integrations/shared-setup/connection-setup.html %} + 4. Enter your Harvest account name in the **Account Name** field. For example: if your Harvest account URL is `stitch.harvestapp.com`, you'd enter `stitch` in this field. + - title: "Define the historical replication start date" + anchor: "define-historical-sync" + content: | + {% include integrations/saas/setup/historical-sync.html %} + + - title: "Create a replication schedule" + anchor: "define-rep-frequency" + content: | + {% include integrations/shared-setup/replication-frequency.html %} + + - title: "Authorize Stitch to Access Harvest" + anchor: "grant-stitch-authorization" + content: | + Lastly, you'll be directed to Harvest's website to complete the setup. + + 1. Enter your Harvest credentials and click **Create Integration**. + 2. A screen asking for authorization to Harvest will display. **Note that Stitch will only ever read your data.** + 3. Click **Connect.** + 4. After the authorization process successfully completes, you'll be redirected back to Stitch. + 5. Click {{ app.buttons.finish-int-setup }}. + - title: "Set objects to replicate" + anchor: "setting-data-to-replicate" + content: | + {% include integrations/shared-setup/data-selection/object-selection.html %} + +# -------------------------- # +# Table Schemas # +# -------------------------- # + +# Looking for the table schemas & info? +# Each table has a its own .md file in /_integration-schemas/harvest +--- +{% assign integration = page %} +{% include misc/data-files.html %} \ No newline at end of file