🎉 New Source: Insightly [python cdk] (#18164)
* [ADD] logic for source insightly Signed-off-by: Henri Blancke <blanckehenri@gmail.com> * [UPD] schema cleanup Signed-off-by: Henri Blancke <blanckehenri@gmail.com> * [ADD] documentation Signed-off-by: Henri Blancke <blanckehenri@gmail.com> * [UPD] configured catalog Co-authored-by: Marcos Marx <marcosmarxm@users.noreply.github.com> * [RMV] catalog and logs Signed-off-by: Henri Blancke <blanckehenri@gmail.com> * [UPD] source tests Signed-off-by: Henri Blancke <blanckehenri@gmail.com> * format files * fix pk * add seed config * auto-bump connector version Signed-off-by: Henri Blancke <blanckehenri@gmail.com> Co-authored-by: Marcos Marx <marcosmarxm@users.noreply.github.com> Co-authored-by: marcosmarxm <marcosmarxm@gmail.com> Co-authored-by: Octavia Squidington III <octavia-squidington-iii@users.noreply.github.com>
This commit is contained in:
@@ -499,6 +499,13 @@
|
||||
icon: db2.svg
|
||||
sourceType: database
|
||||
releaseStage: alpha
|
||||
- name: Insightly
|
||||
sourceDefinitionId: 38f84314-fe6a-4257-97be-a8dcd942d693
|
||||
dockerRepository: airbyte/source-insightly
|
||||
dockerImageTag: 0.1.0
|
||||
documentationUrl: https://docs.airbyte.com/integrations/sources/insightly
|
||||
sourceType: api
|
||||
releaseStage: alpha
|
||||
- name: Instagram
|
||||
sourceDefinitionId: 6acf6b55-4f1e-4fca-944e-1a3caef8aba8
|
||||
dockerRepository: airbyte/source-instagram
|
||||
|
||||
@@ -5004,6 +5004,39 @@
|
||||
supportsNormalization: false
|
||||
supportsDBT: false
|
||||
supported_destination_sync_modes: []
|
||||
- dockerImage: "airbyte/source-insightly:0.1.0"
|
||||
spec:
|
||||
documentationUrl: "https://docs.airbyte.com/integrations/sources/insightly"
|
||||
connectionSpecification:
|
||||
$schema: "http://json-schema.org/draft-07/schema#"
|
||||
title: "Insightly Spec"
|
||||
type: "object"
|
||||
required:
|
||||
- "token"
|
||||
- "start_date"
|
||||
additionalProperties: true
|
||||
properties:
|
||||
token:
|
||||
type:
|
||||
- "string"
|
||||
- "null"
|
||||
title: "API Token"
|
||||
description: "Your Insightly API token."
|
||||
airbyte_secret: true
|
||||
start_date:
|
||||
type:
|
||||
- "string"
|
||||
- "null"
|
||||
title: "Start Date"
|
||||
description: "The date from which you'd like to replicate data for Insightly\
|
||||
\ in the format YYYY-MM-DDT00:00:00Z. All data generated after this date\
|
||||
\ will be replicated. Note that it will be used only for incremental streams."
|
||||
examples:
|
||||
- "2021-03-01T00:00:00Z"
|
||||
pattern: "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$"
|
||||
supportsNormalization: false
|
||||
supportsDBT: false
|
||||
supported_destination_sync_modes: []
|
||||
- dockerImage: "airbyte/source-instagram:1.0.0"
|
||||
spec:
|
||||
documentationUrl: "https://docs.airbyte.com/integrations/sources/instagram"
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
| Greenhouse | [](https://dnsgjos7lj2fu.cloudfront.net/tests/summary/source-greenhouse) |
|
||||
| HubSpot | [](https://dnsgjos7lj2fu.cloudfront.net/tests/summary/source-hubspot) |
|
||||
| IBM Db2 | [](https://dnsgjos7lj2fu.cloudfront.net/tests/summary/source-db2) |
|
||||
| Insightly | [](https://dnsgjos7lj2fu.cloudfront.net/tests/summary/source-insightly) |
|
||||
| Instagram | [](https://dnsgjos7lj2fu.cloudfront.net/tests/summary/source-instagram) |
|
||||
| Intercom | [](https://dnsgjos7lj2fu.cloudfront.net/tests/summary/source-intercom) |
|
||||
| Iterable | [](https://dnsgjos7lj2fu.cloudfront.net/tests/summary/source-iterable) |
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
*
|
||||
!Dockerfile
|
||||
!main.py
|
||||
!source_insightly
|
||||
!setup.py
|
||||
!secrets
|
||||
38
airbyte-integrations/connectors/source-insightly/Dockerfile
Normal file
38
airbyte-integrations/connectors/source-insightly/Dockerfile
Normal file
@@ -0,0 +1,38 @@
|
||||
FROM python:3.9.13-alpine3.15 as base
|
||||
|
||||
# build and load all requirements
|
||||
FROM base as builder
|
||||
WORKDIR /airbyte/integration_code
|
||||
|
||||
# upgrade pip to the latest version
|
||||
RUN apk --no-cache upgrade \
|
||||
&& pip install --upgrade pip \
|
||||
&& apk --no-cache add tzdata build-base
|
||||
|
||||
|
||||
COPY setup.py ./
|
||||
# install necessary packages to a temporary folder
|
||||
RUN pip install --prefix=/install .
|
||||
|
||||
# build a clean environment
|
||||
FROM base
|
||||
WORKDIR /airbyte/integration_code
|
||||
|
||||
# copy all loaded and built libraries to a pure basic image
|
||||
COPY --from=builder /install /usr/local
|
||||
# add default timezone settings
|
||||
COPY --from=builder /usr/share/zoneinfo/Etc/UTC /etc/localtime
|
||||
RUN echo "Etc/UTC" > /etc/timezone
|
||||
|
||||
# bash is installed for more convenient debugging.
|
||||
RUN apk --no-cache add bash
|
||||
|
||||
# copy payload code only
|
||||
COPY main.py ./
|
||||
COPY source_insightly ./source_insightly
|
||||
|
||||
ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py"
|
||||
ENTRYPOINT ["python", "/airbyte/integration_code/main.py"]
|
||||
|
||||
LABEL io.airbyte.version=0.1.0
|
||||
LABEL io.airbyte.name=airbyte/source-insightly
|
||||
132
airbyte-integrations/connectors/source-insightly/README.md
Normal file
132
airbyte-integrations/connectors/source-insightly/README.md
Normal file
@@ -0,0 +1,132 @@
|
||||
# Insightly Source
|
||||
|
||||
This is the repository for the Insightly source connector, written in Python.
|
||||
For information about how to use this connector within Airbyte, see [the documentation](https://docs.airbyte.io/integrations/sources/insightly).
|
||||
|
||||
## Local development
|
||||
|
||||
### Prerequisites
|
||||
**To iterate on this connector, make sure to complete this prerequisites section.**
|
||||
|
||||
#### Minimum Python version required `= 3.9.0`
|
||||
|
||||
#### Build & Activate Virtual Environment and install dependencies
|
||||
From this connector directory, create a virtual environment:
|
||||
```
|
||||
python -m venv .venv
|
||||
```
|
||||
|
||||
This will generate a virtualenv for this module in `.venv/`. Make sure this venv is active in your
|
||||
development environment of choice. To activate it from the terminal, run:
|
||||
```
|
||||
source .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
pip install '.[tests]'
|
||||
```
|
||||
If you are in an IDE, follow your IDE's instructions to activate the virtualenv.
|
||||
|
||||
Note that while we are installing dependencies from `requirements.txt`, you should only edit `setup.py` for your dependencies. `requirements.txt` is
|
||||
used for editable installs (`pip install -e`) to pull in Python dependencies from the monorepo and will call `setup.py`.
|
||||
If this is mumbo jumbo to you, don't worry about it, just put your deps in `setup.py` but install using `pip install -r requirements.txt` and everything
|
||||
should work as you expect.
|
||||
|
||||
#### Building via Gradle
|
||||
You can also build the connector in Gradle. This is typically used in CI and not needed for your development workflow.
|
||||
|
||||
To build using Gradle, from the Airbyte repository root, run:
|
||||
```
|
||||
./gradlew :airbyte-integrations:connectors:source-insightly:build
|
||||
```
|
||||
|
||||
#### Create credentials
|
||||
**If you are a community contributor**, follow the instructions in the [documentation](https://docs.airbyte.io/integrations/sources/insightly)
|
||||
to generate the necessary credentials. Then create a file `secrets/config.json` conforming to the `source_insightly/spec.yaml` file.
|
||||
Note that any directory named `secrets` is gitignored across the entire Airbyte repo, so there is no danger of accidentally checking in sensitive information.
|
||||
See `integration_tests/sample_config.json` for a sample config file.
|
||||
|
||||
**If you are an Airbyte core member**, copy the credentials in Lastpass under the secret name `source insightly test creds`
|
||||
and place them into `secrets/config.json`.
|
||||
|
||||
### Locally running the connector
|
||||
```
|
||||
python main.py spec
|
||||
python main.py check --config secrets/config.json
|
||||
python main.py discover --config secrets/config.json
|
||||
python main.py read --config secrets/config.json --catalog integration_tests/configured_catalog.json
|
||||
```
|
||||
|
||||
### Locally running the connector docker image
|
||||
|
||||
#### Build
|
||||
First, make sure you build the latest Docker image:
|
||||
```
|
||||
docker build . -t airbyte/source-insightly:dev
|
||||
```
|
||||
|
||||
You can also build the connector image via Gradle:
|
||||
```
|
||||
./gradlew :airbyte-integrations:connectors:source-insightly:airbyteDocker
|
||||
```
|
||||
When building via Gradle, the docker image name and tag, respectively, are the values of the `io.airbyte.name` and `io.airbyte.version` `LABEL`s in
|
||||
the Dockerfile.
|
||||
|
||||
#### Run
|
||||
Then run any of the connector commands as follows:
|
||||
```
|
||||
docker run --rm airbyte/source-insightly:dev spec
|
||||
docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-insightly:dev check --config /secrets/config.json
|
||||
docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-insightly:dev discover --config /secrets/config.json
|
||||
docker run --rm -v $(pwd)/secrets:/secrets -v $(pwd)/integration_tests:/integration_tests airbyte/source-insightly:dev read --config /secrets/config.json --catalog /integration_tests/configured_catalog.json
|
||||
```
|
||||
## Testing
|
||||
Make sure to familiarize yourself with [pytest test discovery](https://docs.pytest.org/en/latest/goodpractices.html#test-discovery) to know how your test files and methods should be named.
|
||||
First install test dependencies into your virtual environment:
|
||||
```
|
||||
pip install .[tests]
|
||||
```
|
||||
### Unit Tests
|
||||
To run unit tests locally, from the connector directory run:
|
||||
```
|
||||
python -m pytest unit_tests
|
||||
```
|
||||
|
||||
### Integration Tests
|
||||
There are two types of integration tests: Acceptance Tests (Airbyte's test suite for all source connectors) and custom integration tests (which are specific to this connector).
|
||||
#### Custom Integration tests
|
||||
Place custom tests inside `integration_tests/` folder, then, from the connector root, run
|
||||
```
|
||||
python -m pytest integration_tests
|
||||
```
|
||||
#### Acceptance Tests
|
||||
Customize `acceptance-test-config.yml` file to configure tests. See [Source Acceptance Tests](https://docs.airbyte.io/connector-development/testing-connectors/source-acceptance-tests-reference) for more information.
|
||||
If your connector requires to create or destroy resources for use during acceptance tests create fixtures for it and place them inside integration_tests/acceptance.py.
|
||||
To run your integration tests with acceptance tests, from the connector root, run
|
||||
```
|
||||
python -m pytest integration_tests -p integration_tests.acceptance
|
||||
```
|
||||
To run your integration tests with docker
|
||||
|
||||
### Using gradle to run tests
|
||||
All commands should be run from airbyte project root.
|
||||
To run unit tests:
|
||||
```
|
||||
./gradlew :airbyte-integrations:connectors:source-insightly:unitTest
|
||||
```
|
||||
To run acceptance and custom integration tests:
|
||||
```
|
||||
./gradlew :airbyte-integrations:connectors:source-insightly:integrationTest
|
||||
```
|
||||
|
||||
## Dependency Management
|
||||
All of your dependencies should go in `setup.py`, NOT `requirements.txt`. The requirements file is only used to connect internal Airbyte dependencies in the monorepo for local development.
|
||||
We split dependencies between two groups, dependencies that are:
|
||||
* required for your connector to work need to go to `MAIN_REQUIREMENTS` list.
|
||||
* required for the testing need to go to `TEST_REQUIREMENTS` list
|
||||
|
||||
### Publishing a new version of the connector
|
||||
You've checked out the repo, implemented a million dollar feature, and you're ready to share your changes with the world. Now what?
|
||||
1. Make sure your changes are passing unit and integration tests.
|
||||
1. Bump the connector version in `Dockerfile` -- just increment the value of the `LABEL io.airbyte.version` appropriately (we use [SemVer](https://semver.org/)).
|
||||
1. Create a Pull Request.
|
||||
1. Pat yourself on the back for being an awesome contributor.
|
||||
1. Someone from Airbyte will take a look at your PR and iterate with you to merge it into master.
|
||||
@@ -0,0 +1,24 @@
|
||||
# See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference)
|
||||
# for more information about how to configure these tests
|
||||
connector_image: airbyte/source-insightly:dev
|
||||
tests:
|
||||
spec:
|
||||
- spec_path: "source_insightly/spec.json"
|
||||
connection:
|
||||
- config_path: "secrets/config.json"
|
||||
status: "succeed"
|
||||
- config_path: "integration_tests/invalid_config.json"
|
||||
status: "failed"
|
||||
discovery:
|
||||
- config_path: "secrets/config.json"
|
||||
basic_read:
|
||||
- config_path: "secrets/config.json"
|
||||
configured_catalog_path: "integration_tests/configured_catalog.json"
|
||||
empty_streams: []
|
||||
incremental:
|
||||
- config_path: "secrets/config.json"
|
||||
configured_catalog_path: "integration_tests/configured_catalog.json"
|
||||
future_state_path: "integration_tests/abnormal_state.json"
|
||||
full_refresh:
|
||||
- config_path: "secrets/config.json"
|
||||
configured_catalog_path: "integration_tests/configured_catalog.json"
|
||||
@@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
# Build latest connector image
|
||||
docker build . -t $(cat acceptance-test-config.yml | grep "connector_image" | head -n 1 | cut -d: -f2-)
|
||||
|
||||
# Pull latest acctest image
|
||||
docker pull airbyte/source-acceptance-test:latest
|
||||
|
||||
# Run
|
||||
docker run --rm -it \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v /tmp:/tmp \
|
||||
-v $(pwd):/test_input \
|
||||
airbyte/source-acceptance-test \
|
||||
--acceptance-test-config /test_input
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
# Insightly
|
||||
OpenWeather is an online service offering an API to retrieve historical, current and forecasted weather data over the globe.
|
||||
|
||||
### Auth
|
||||
API calls are authenticated through an API key. An API key can be retrieved from Insightly User Settings page in the API section.
|
||||
|
||||
### Rate limits
|
||||
The API has different rate limits for different account types. Keep that in mind when syncing large amounts of data:
|
||||
* Free/Gratis - 1,000 requests/day/instance
|
||||
* Legacy plans - 20,000 requests/day/instance
|
||||
* Plus - 40,000 requests/day/instance
|
||||
* Professional - 60,000 requests/day/instance
|
||||
* Enterprise - 100,000 requests/day/instance
|
||||
@@ -0,0 +1,9 @@
|
||||
plugins {
|
||||
id 'airbyte-python'
|
||||
id 'airbyte-docker'
|
||||
id 'airbyte-source-acceptance-test'
|
||||
}
|
||||
|
||||
airbytePython {
|
||||
moduleDirectory 'source_insightly'
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
#
|
||||
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
@@ -0,0 +1,13 @@
|
||||
[
|
||||
{
|
||||
"type": "STREAM",
|
||||
"stream": {
|
||||
"stream_descriptor": {
|
||||
"name": "users"
|
||||
},
|
||||
"stream_state": {
|
||||
"DATE_UPDATED_UTC": "2122-10-17T19:10:14+00:00"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,16 @@
|
||||
#
|
||||
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
import pytest
|
||||
|
||||
pytest_plugins = ("source_acceptance_test.plugin",)
|
||||
|
||||
|
||||
@pytest.fixture(scope="session", autouse=True)
|
||||
def connector_setup():
|
||||
"""This fixture is a placeholder for external resources that acceptance test might require."""
|
||||
# TODO: setup test dependencies if needed. otherwise remove the TODO comments
|
||||
yield
|
||||
# TODO: clean up test dependencies
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"streams": [
|
||||
{
|
||||
"stream": {
|
||||
"name": "team_members",
|
||||
"json_schema": {},
|
||||
"supported_sync_modes": ["full_refresh"],
|
||||
"source_defined_primary_key": [["MEMBER_USER_ID"]]
|
||||
},
|
||||
"sync_mode": "full_refresh",
|
||||
"destination_sync_mode": "overwrite"
|
||||
},
|
||||
{
|
||||
"stream": {
|
||||
"name": "users",
|
||||
"json_schema": {},
|
||||
"supported_sync_modes": ["full_refresh", "incremental"],
|
||||
"source_defined_cursor": true,
|
||||
"default_cursor_field": ["DATE_UPDATED_UTC"],
|
||||
"source_defined_primary_key": [["USER_ID"]]
|
||||
},
|
||||
"sync_mode": "incremental",
|
||||
"destination_sync_mode": "append"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"token": "bad-token",
|
||||
"start_date": "2019-01-01T00:00:00Z"
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"token": "my-insightly-api-token",
|
||||
"start_date": "2022-10-01T00:00:00Z"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
[
|
||||
{
|
||||
"type": "STREAM",
|
||||
"stream": {
|
||||
"stream_descriptor": {
|
||||
"name": "users"
|
||||
},
|
||||
"stream_state": {
|
||||
"DATE_UPDATED_UTC": "2022-10-17T19:10:14+00:00"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
13
airbyte-integrations/connectors/source-insightly/main.py
Normal file
13
airbyte-integrations/connectors/source-insightly/main.py
Normal file
@@ -0,0 +1,13 @@
|
||||
#
|
||||
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
import sys
|
||||
|
||||
from airbyte_cdk.entrypoint import launch
|
||||
from source_insightly import SourceInsightly
|
||||
|
||||
if __name__ == "__main__":
|
||||
source = SourceInsightly()
|
||||
launch(source, sys.argv[1:])
|
||||
@@ -0,0 +1,2 @@
|
||||
-e ../../bases/source-acceptance-test
|
||||
-e .
|
||||
29
airbyte-integrations/connectors/source-insightly/setup.py
Normal file
29
airbyte-integrations/connectors/source-insightly/setup.py
Normal file
@@ -0,0 +1,29 @@
|
||||
#
|
||||
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
from setuptools import find_packages, setup
|
||||
|
||||
MAIN_REQUIREMENTS = [
|
||||
"airbyte-cdk~=0.2",
|
||||
]
|
||||
|
||||
TEST_REQUIREMENTS = [
|
||||
"pytest~=6.1",
|
||||
"pytest-mock~=3.6.1",
|
||||
"source-acceptance-test",
|
||||
]
|
||||
|
||||
setup(
|
||||
name="source_insightly",
|
||||
description="Source implementation for Insightly.",
|
||||
author="Airbyte",
|
||||
author_email="contact@airbyte.io",
|
||||
packages=find_packages(),
|
||||
install_requires=MAIN_REQUIREMENTS,
|
||||
package_data={"": ["*.json", "*.yaml", "schemas/*.json", "schemas/shared/*.json"]},
|
||||
extras_require={
|
||||
"tests": TEST_REQUIREMENTS,
|
||||
},
|
||||
)
|
||||
@@ -0,0 +1,8 @@
|
||||
#
|
||||
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
from .source import SourceInsightly
|
||||
|
||||
__all__ = ["SourceInsightly"]
|
||||
@@ -0,0 +1,122 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"ACTIVITYSET_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FOR_CONTACTS": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"FOR_ORGANISATIONS": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"FOR_OPPORTUNITIES": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"FOR_PROJECTS": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"FOR_LEADS": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ACTIVITIES": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"ACTIVITY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ACTIVITYSET_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ACTIVITY_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ACTIVITY_DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ACTIVITY_TYPE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CATEGORY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"REMINDER": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"REMINDER_DAYS_BEFORE_DUE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"REMINDER_TIME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PUBLICLY_VISIBLE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"OWNER_VISIBLE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"RESPONSIBLE_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ASSIGNED_TEAM_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"SKIP_SUN": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"SKIP_MON": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"SKIP_TUE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"SKIP_WED": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"SKIP_THU": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"SKIP_FRI": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"SKIP_SAT": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"DUE_DAYS_AFTER_START": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DUE_DAYS_BEFORE_END": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"EVENT_DAYS_AFTER_START": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"EVENT_DAYS_BEFORE_END": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"EVENT_TIME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ALL_DAY": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"DURATION": {
|
||||
"type": ["integer", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"CONTACT_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"SALUTATION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIRST_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LAST_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"IMAGE_URL": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"BACKGROUND": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"SOCIAL_LINKEDIN": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"SOCIAL_FACEBOOK": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"SOCIAL_TWITTER": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DATE_OF_BIRTH": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PHONE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PHONE_HOME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PHONE_MOBILE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PHONE_OTHER": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PHONE_ASSISTANT": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PHONE_FAX": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"EMAIL_ADDRESS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ASSISTANT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_MAIL_STREET": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_MAIL_CITY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_MAIL_STATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_MAIL_POSTCODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_MAIL_COUNTRY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_OTHER_STREET": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_OTHER_CITY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_OTHER_STATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_OTHER_POSTCODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_OTHER_COUNTRY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LAST_ACTIVITY_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"NEXT_ACTIVITY_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ORGANISATION_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"TITLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"EMAIL_OPTED_OUT": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"TAGS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TAG_NAME": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"DATES": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"DATE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OCCASION_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OCCASION_DATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"REPEAT_YEARLY": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"CREATE_TASK_YEARLY": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"LINKS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LINK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LINK_OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LINK_OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ROLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"RELATIONSHIP_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IS_FORWARD": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"COUNTRY_NAME": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"CURRENCY_CODE": {
|
||||
"type": "string"
|
||||
},
|
||||
"CURRENCY_SYMBOL": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"EMAIL_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"EMAIL_FROM": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"SUBJECT": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"EMAIL_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"FORMAT": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"SIZE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"QUEUED_SEND_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"TAGS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TAG_NAME": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"LINKS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LINK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LINK_OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LINK_OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ROLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"RELATIONSHIP_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IS_FORWARD": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"EVENT_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"TITLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LOCATION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"START_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"END_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"ALL_DAY": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"REMINDER_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"REMINDER_SENT": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"LINKS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LINK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LINK_OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LINK_OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ROLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"RELATIONSHIP_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IS_FORWARD": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"CATEGORY_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"CATEGORY_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DESCRIPTION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FOLDER_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"FOLDER_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CATEGORY_ID": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"VISIBILITY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ORDER_ARTICLES": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"ARTICLE_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"CATEGORY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"FOLDER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ARTICLE_NO": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ArticleVersion": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"Status": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"Language": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"Title": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"Body": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"URL_SLUG": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DOWNVOTE_COUNT": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"UPVOTE_COUNT": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PROMOTED": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"FIRST_PUBLISHED_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"LAST_PUBLISHED_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"ARCHIVED_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ExternalLinkCount": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"TAGS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TAG_NAME": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LEAD_SOURCE_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"LEAD_SOURCE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DEFAULT_VALUE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"FIELD_ORDER": {
|
||||
"type": ["integer", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LEAD_STATUS_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"LEAD_STATUS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DEFAULT_STATUS": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"STATUS_TYPE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"FIELD_ORDER": {
|
||||
"type": ["integer", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,179 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LEAD_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"SALUTATION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIRST_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LAST_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LEAD_SOURCE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LEAD_STATUS_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"TITLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CONVERTED": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"CONVERTED_CONTACT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CONVERTED_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"CONVERTED_OPPORTUNITY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CONVERTED_ORGANISATION_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"EMAIL": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"EMPLOYEE_COUNT": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"FAX": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"INDUSTRY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LEAD_DESCRIPTION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LEAD_RATING": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"MOBILE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PHONE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"RESPONSIBLE_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"WEBSITE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_STREET": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_CITY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_STATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_POSTCODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_COUNTRY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LAST_ACTIVITY_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"NEXT_ACTIVITY_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"ORGANISATION_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IMAGE_URL": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"EMAIL_OPTED_OUT": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"TAGS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TAG_NAME": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"LINKS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LINK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LINK_OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LINK_OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ROLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"RELATIONSHIP_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IS_FORWARD": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"MILESTONE_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"TITLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"COMPLETED": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"DUE_DATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"COMPLETED_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"PROJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"RESPONSIBLE_USER": {
|
||||
"type": ["integer", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"NOTE_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"TITLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"BODY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LINKS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LINK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LINK_OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LINK_OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ROLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"RELATIONSHIP_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IS_FORWARD": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"OPPORTUNITY_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"OPPORTUNITY_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OPPORTUNITY_DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OPPORTUNITY_STATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"RESPONSIBLE_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CATEGORY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IMAGE_URL": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"BID_CURRENCY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"BID_AMOUNT": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"BID_TYPE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"BID_DURATION": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ACTUAL_CLOSE_DATE": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"OPPORTUNITY_VALUE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PROBABILITY": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"FORECAST_CLOSE_DATE": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LAST_ACTIVITY_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"NEXT_ACTIVITY_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"PIPELINE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"STAGE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ORGANISATION_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PRICEBOOK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"TAGS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TAG_NAME": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
},
|
||||
"required": ["TAG_NAME"]
|
||||
}
|
||||
},
|
||||
"LINKS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LINK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LINK_OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LINK_OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ROLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"RELATIONSHIP_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IS_FORWARD": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"CATEGORY_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"CATEGORY_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ACTIVE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"BACKGROUND_COLOR": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"OPPORTUNITY_ITEM_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"OPPORTUNITY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PRICEBOOK_ENTRY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CURRENCY_CODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"UNIT_PRICE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DESCRIPTION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"QUANTITY": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"SERVICE_DATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"TOTAL_PRICE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"LIST_PRICE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"SUBTOTAL": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DISCOUNT": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"STATE_REASON_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"STATE_REASON": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FOR_OPPORTUNITY_STATE": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"ORGANISATION_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"ORGANISATION_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"BACKGROUND": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"IMAGE_URL": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"LAST_ACTIVITY_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"NEXT_ACTIVITY_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PHONE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PHONE_FAX": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"WEBSITE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_BILLING_STREET": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_BILLING_CITY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_BILLING_STATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_BILLING_COUNTRY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_BILLING_POSTCODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_SHIP_STREET": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_SHIP_CITY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_SHIP_STATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_SHIP_POSTCODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_SHIP_COUNTRY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"SOCIAL_LINKEDIN": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"SOCIAL_FACEBOOK": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"SOCIAL_TWITTER": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"TAGS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TAG_NAME": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"DATES": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"DATE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OCCASION_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OCCASION_DATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"REPEAT_YEARLY": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"CREATE_TASK_YEARLY": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"EMAILDOMAINS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"EMAIL_DOMAIN_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"EMAIL_DOMAIN": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"LINKS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LINK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LINK_OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LINK_OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ROLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"RELATIONSHIP_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IS_FORWARD": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"STAGE_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"PIPELINE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"STAGE_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"STAGE_ORDER": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ACTIVITYSET_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"PIPELINE_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"PIPELINE_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FOR_OPPORTUNITIES": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"FOR_PROJECTS": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"PRICEBOOK_ENTRY_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"PRICEBOOK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PRODUCT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CURRENCY_CODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PRICE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"USE_STANDARD_PRICE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"ACTIVE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"PRICEBOOK_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DESCRIPTION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CURRENCY_CODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"IS_STANDARD": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"ACTIVE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"PRODUCT_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"PRODUCT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PRODUCT_CODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PRODUCT_SKU": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DESCRIPTION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PRODUCT_FAMILY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PRODUCT_IMAGE_URL": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CURRENCY_CODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DEFAULT_PRICE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ACTIVE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"CATEGORY_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"CATEGORY_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ACTIVE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"BACKGROUND_COLOR": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"PROJECT_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"PROJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"STATUS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PROJECT_DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"STARTED_DATE": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"COMPLETED_DATE": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"OPPORTUNITY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CATEGORY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PIPELINE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"STAGE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IMAGE_URL": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"LAST_ACTIVITY_DATE_UTC": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"NEXT_ACTIVITY_DATE_UTC": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"RESPONSIBLE_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"TAGS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TAG_NAME": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"LINKS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LINK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LINK_OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LINK_OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ROLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"RELATIONSHIP_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IS_FORWARD": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"PROSPECT_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"LEAD_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CONTACT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ORGANISATION_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"SALUTATION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIRST_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LAST_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ORGANISATION_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"TITLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"EMAIL_ADDRESS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PHONE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"MOBILE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FAX": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"WEBSITE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_STREET": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_CITY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_STATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_POSTCODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_COUNTRY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"INDUSTRY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"EMPLOYEE_COUNT": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"SCORE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"GRADE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DESCRIPTION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DO_NOT_EMAIL": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"DO_NOT_CALL": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"OPTED_OUT": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"LAST_ACTIVITY_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DO_NOT_SYNC": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"LEAD_CONVERSION_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"GRADE_PROFILE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"TAGS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TAG_NAME": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"QUOTATION_ITEM_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"QUOTE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OPPORTUNITY_ITEM_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PRICEBOOK_ENTRY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DESCRIPTION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CURRENCY_CODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"QUANTITY": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LIST_PRICE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"UNIT_PRICE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"SUBTOTAL": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DISCOUNT": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"TOTAL_PRICE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"SORT_ORDER": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"QUOTE_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"QUOTATION_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OPPORTUNITY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CONTACT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ORGANISATION_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PRICEBOOK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"QUOTATION_NUMBER": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"QUOTATION_DESCRIPTION": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"QUOTATION_PHONE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"QUOTATION_EMAIL": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"QUOTATION_FAX": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"QUOTE_STATUS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"QUOTATION_EXPIRATION_DATE": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"LINE_ITEM_COUNT": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IS_SYNCING": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"QUOTATION_CURRENCY_CODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"SUBTOTAL": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DISCOUNT": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"TOTAL_PRICE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"SHIPPING_HANDLING": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"TAX": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"GRAND_TOTAL": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ADDRESS_BILLING_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_BILLING_STREET": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_BILLING_CITY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_BILLING_STATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_BILLING_POSTCODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_BILLING_COUNTRY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_SHIPPING_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_SHIPPING_STREET": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_SHIPPING_CITY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_SHIPPING_STATE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_SHIPPING_POSTCODE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADDRESS_SHIPPING_COUNTRY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"RELATIONSHIP_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"FORWARD_TITLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FORWARD": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"REVERSE_TITLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"REVERSE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FOR_CONTACTS": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"FOR_ORGANISATIONS": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TAG_NAME": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"CATEGORY_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"CATEGORY_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ACTIVE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"BACKGROUND_COLOR": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TASK_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"TITLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CATEGORY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DUE_DATE": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"COMPLETED_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"COMPLETED": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"STATUS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PRIORITY": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PERCENT_COMPLETE": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"START_DATE": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"MILESTONE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"RESPONSIBLE_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"EMAIL_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PROJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"REMINDER_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"REMINDER_SENT": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"OWNER_VISIBLE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"STAGE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ASSIGNED_BY_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PARENT_TASK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"RECURRENCE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OPPORTUNITY_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ASSIGNED_TEAM_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ASSIGNED_DATE_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items":
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
"LINKS": {
|
||||
"type": "array",
|
||||
"items":
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"LINK_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"LINK_OBJECT_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LINK_OBJECT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ROLE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DETAILS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"RELATIONSHIP_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"IS_FORWARD": {
|
||||
"type": ["boolean", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"PERMISSION_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"TEAM_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"MEMBER_USER_ID": {
|
||||
"type": "integer"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TEAM_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"TEAM_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ANONYMOUS_TEAM": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"TEAMMEMBERS": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TICKET_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"ORGANISATION_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"TICKET_TYPE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"SUBJECT": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"TICKET_STATUS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"PRIORITY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"TO_EMAIL_ADDRESS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CONTACT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"CREATED_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"OWNER_USER_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"TICKET_NUMBER": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"SOURCE": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"DATE_SOLVED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_CLOSED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"TicketCommentBodyHtml": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CUSTOMFIELDS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"FIELD_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"FIELD_VALUE": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"TAGS": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TAG_NAME": {
|
||||
"type": ["string", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"USER_ID": {
|
||||
"type": "integer"
|
||||
},
|
||||
"CONTACT_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"FIRST_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"LAST_NAME": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"TIMEZONE_ID": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"EMAIL_ADDRESS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"EMAIL_DROPBOX_IDENTIFIER": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"EMAIL_DROPBOX_ADDRESS": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"ADMINISTRATOR": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"ACCOUNT_OWNER": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"ACTIVE": {
|
||||
"type": ["boolean", "null"]
|
||||
},
|
||||
"DATE_CREATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"DATE_UPDATED_UTC": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"USER_CURRENCY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CONTACT_DISPLAY": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"CONTACT_ORDER": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"TASK_WEEK_START": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"INSTANCE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"PROFILE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
},
|
||||
"ROLE_ID": {
|
||||
"type": ["integer", "null"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,404 @@
|
||||
#
|
||||
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
from abc import ABC
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Tuple
|
||||
from urllib.parse import parse_qs, urlparse
|
||||
|
||||
import pendulum
|
||||
import requests
|
||||
from airbyte_cdk.sources import AbstractSource
|
||||
from airbyte_cdk.sources.streams import Stream
|
||||
from airbyte_cdk.sources.streams.http import HttpStream
|
||||
from airbyte_cdk.sources.streams.http.auth import BasicHttpAuthenticator
|
||||
from requests.auth import AuthBase
|
||||
|
||||
PAGE_SIZE = 500
|
||||
BASE_URL = "https://api.insightly.com/v3.1/"
|
||||
|
||||
|
||||
# Basic full refresh stream
|
||||
class InsightlyStream(HttpStream, ABC):
|
||||
total_count: int = 0
|
||||
page_size: Optional[int] = PAGE_SIZE
|
||||
|
||||
url_base = BASE_URL
|
||||
|
||||
def __init__(self, authenticator: AuthBase, start_date: str = None, **kwargs):
|
||||
self.start_date = start_date
|
||||
super().__init__(authenticator=authenticator)
|
||||
|
||||
def next_page_token(self, response: requests.Response) -> Optional[Mapping[str, Any]]:
|
||||
parsed = urlparse(response.request.url)
|
||||
previous_skip = parse_qs(parsed.query)["skip"][0]
|
||||
new_skip = int(previous_skip) + self.page_size
|
||||
return new_skip if new_skip <= self.total_count else None
|
||||
|
||||
def request_params(
|
||||
self, stream_state: Mapping[str, Any], stream_slice: Mapping[str, any] = None, next_page_token: Mapping[str, Any] = None
|
||||
) -> MutableMapping[str, Any]:
|
||||
return {
|
||||
"count_total": True,
|
||||
"top": self.page_size,
|
||||
"skip": next_page_token or 0,
|
||||
}
|
||||
|
||||
def request_headers(self, **kwargs) -> Mapping[str, Any]:
|
||||
return {"Accept": "application/json"}
|
||||
|
||||
def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]:
|
||||
self.total_count = int(response.headers.get("X-Total-Count", 0))
|
||||
results = response.json()
|
||||
yield from results
|
||||
|
||||
|
||||
class ActivitySets(InsightlyStream):
|
||||
primary_key = "ACTIVITYSET_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "ActivitySets"
|
||||
|
||||
|
||||
class Countries(InsightlyStream):
|
||||
primary_key = "COUNTRY_NAME"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Countries"
|
||||
|
||||
|
||||
class Currencies(InsightlyStream):
|
||||
primary_key = "CURRENCY_CODE"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Currencies"
|
||||
|
||||
|
||||
class Emails(InsightlyStream):
|
||||
primary_key = "EMAIL_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Emails"
|
||||
|
||||
|
||||
class LeadSources(InsightlyStream):
|
||||
primary_key = "LEAD_SOURCE_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "LeadSources"
|
||||
|
||||
|
||||
class LeadStatuses(InsightlyStream):
|
||||
primary_key = "LEAD_STATUS_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "LeadStatuses"
|
||||
|
||||
|
||||
class OpportunityCategories(InsightlyStream):
|
||||
primary_key = "CATEGORY_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "OpportunityCategories"
|
||||
|
||||
|
||||
class OpportunityStateReasons(InsightlyStream):
|
||||
primary_key = "STATE_REASON_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "OpportunityStateReasons"
|
||||
|
||||
|
||||
class Pipelines(InsightlyStream):
|
||||
primary_key = "PIPELINE_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Pipelines"
|
||||
|
||||
|
||||
class PipelineStages(InsightlyStream):
|
||||
primary_key = "STAGE_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "PipelineStages"
|
||||
|
||||
|
||||
class ProjectCategories(InsightlyStream):
|
||||
primary_key = "CATEGORY_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "ProjectCategories"
|
||||
|
||||
|
||||
class Relationships(InsightlyStream):
|
||||
primary_key = "RELATIONSHIP_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Relationships"
|
||||
|
||||
|
||||
class Tags(InsightlyStream):
|
||||
primary_key = "TAG_NAME"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Tags"
|
||||
|
||||
|
||||
class TaskCategories(InsightlyStream):
|
||||
primary_key = "CATEGORY_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "TaskCategories"
|
||||
|
||||
|
||||
class TeamMembers(InsightlyStream):
|
||||
primary_key = "MEMBER_USER_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "TeamMembers"
|
||||
|
||||
|
||||
class Teams(InsightlyStream):
|
||||
primary_key = "TEAM_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Teams"
|
||||
|
||||
|
||||
class IncrementalInsightlyStream(InsightlyStream, ABC):
|
||||
"""Insighlty incremental stream using `updated_after_utc` filter"""
|
||||
|
||||
cursor_field = "DATE_UPDATED_UTC"
|
||||
|
||||
def request_params(
|
||||
self, stream_state: Mapping[str, Any], stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None, **kwargs
|
||||
) -> MutableMapping[str, Any]:
|
||||
params = super().request_params(stream_state=stream_state, stream_slice=stream_slice, next_page_token=next_page_token)
|
||||
|
||||
start_datetime = pendulum.parse(self.start_date)
|
||||
if stream_state.get(self.cursor_field):
|
||||
start_datetime = pendulum.parse(stream_state[self.cursor_field])
|
||||
|
||||
# Add one second to avoid duplicate records and ensure greater than
|
||||
params.update({"updated_after_utc": (start_datetime + timedelta(seconds=1)).strftime("%Y-%m-%dT%H:%M:%SZ")})
|
||||
return params
|
||||
|
||||
def get_updated_state(self, current_stream_state: MutableMapping[str, Any], latest_record: Mapping[str, Any]) -> Mapping[str, Any]:
|
||||
record_time = pendulum.parse(latest_record[self.cursor_field])
|
||||
current_state = current_stream_state.get(self.cursor_field)
|
||||
if current_state:
|
||||
current_state = current_state if isinstance(current_state, datetime) else pendulum.parse(current_state)
|
||||
|
||||
current_stream_state[self.cursor_field] = max(record_time, current_state) if current_state else record_time
|
||||
return current_stream_state
|
||||
|
||||
|
||||
class Contacts(IncrementalInsightlyStream):
|
||||
primary_key = "CONTACT_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Contacts/Search"
|
||||
|
||||
|
||||
class Events(IncrementalInsightlyStream):
|
||||
primary_key = "EVENT_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Events/Search"
|
||||
|
||||
|
||||
class KnowledgeArticleCategories(IncrementalInsightlyStream):
|
||||
primary_key = "CATEGORY_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "KnowledgeArticleCategory/Search"
|
||||
|
||||
|
||||
class KnowledgeArticleFolders(IncrementalInsightlyStream):
|
||||
primary_key = "FOLDER_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "KnowledgeArticleFolder/Search"
|
||||
|
||||
|
||||
class KnowledgeArticles(IncrementalInsightlyStream):
|
||||
primary_key = "ARTICLE_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "KnowledgeArticle/Search"
|
||||
|
||||
|
||||
class Leads(IncrementalInsightlyStream):
|
||||
primary_key = "LEAD_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Leads/Search"
|
||||
|
||||
|
||||
class Milestones(IncrementalInsightlyStream):
|
||||
primary_key = "MILESTONE_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Milestones/Search"
|
||||
|
||||
|
||||
class Notes(IncrementalInsightlyStream):
|
||||
primary_key = "NOTE_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Notes/Search"
|
||||
|
||||
|
||||
class Opportunities(IncrementalInsightlyStream):
|
||||
primary_key = "OPPORTUNITY_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Opportunities/Search"
|
||||
|
||||
|
||||
class OpportunityProducts(IncrementalInsightlyStream):
|
||||
primary_key = "OPPORTUNITY_ITEM_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "OpportunityLineItem/Search"
|
||||
|
||||
|
||||
class Organisations(IncrementalInsightlyStream):
|
||||
primary_key = "ORGANISATION_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Organisations/Search"
|
||||
|
||||
|
||||
class PricebookEntries(IncrementalInsightlyStream):
|
||||
primary_key = "PRICEBOOK_ENTRY_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "PricebookEntry/Search"
|
||||
|
||||
|
||||
class Pricebooks(IncrementalInsightlyStream):
|
||||
primary_key = "PRICEBOOK_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Pricebook/Search"
|
||||
|
||||
|
||||
class Products(IncrementalInsightlyStream):
|
||||
primary_key = "PRODUCT_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Product/Search"
|
||||
|
||||
|
||||
class Projects(IncrementalInsightlyStream):
|
||||
primary_key = "PROJECT_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Projects/Search"
|
||||
|
||||
|
||||
class Prospects(IncrementalInsightlyStream):
|
||||
primary_key = "PROSPECT_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Prospect/Search"
|
||||
|
||||
|
||||
class QuoteProducts(IncrementalInsightlyStream):
|
||||
primary_key = "QUOTATION_ITEM_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "QuotationLineItem/Search"
|
||||
|
||||
|
||||
class Quotes(IncrementalInsightlyStream):
|
||||
primary_key = "QUOTE_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Quotation/Search"
|
||||
|
||||
|
||||
class Tasks(IncrementalInsightlyStream):
|
||||
primary_key = "TASK_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Tasks/Search"
|
||||
|
||||
|
||||
class Tickets(IncrementalInsightlyStream):
|
||||
primary_key = "TICKET_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Ticket/Search"
|
||||
|
||||
|
||||
class Users(IncrementalInsightlyStream):
|
||||
primary_key = "USER_ID"
|
||||
|
||||
def path(self, **kwargs) -> str:
|
||||
return "Users/Search"
|
||||
|
||||
|
||||
# Source
|
||||
class SourceInsightly(AbstractSource):
|
||||
def check_connection(self, logger, config) -> Tuple[bool, any]:
|
||||
try:
|
||||
token = config.get("token")
|
||||
response = requests.get(f"{BASE_URL}Instance", auth=(token, ""))
|
||||
response.raise_for_status()
|
||||
|
||||
result = response.json()
|
||||
logger.info(result)
|
||||
|
||||
return True, None
|
||||
except Exception as e:
|
||||
return False, e
|
||||
|
||||
def streams(self, config: Mapping[str, Any]) -> List[Stream]:
|
||||
"""
|
||||
:param config: A Mapping of the user input configuration as defined in the connector spec.
|
||||
"""
|
||||
|
||||
auth = BasicHttpAuthenticator(username=config.get("token"), password="")
|
||||
return [
|
||||
ActivitySets(authenticator=auth, **config),
|
||||
Contacts(authenticator=auth, **config),
|
||||
Countries(authenticator=auth, **config),
|
||||
Currencies(authenticator=auth, **config),
|
||||
Emails(authenticator=auth, **config),
|
||||
Events(authenticator=auth, **config),
|
||||
KnowledgeArticleCategories(authenticator=auth, **config),
|
||||
KnowledgeArticleFolders(authenticator=auth, **config),
|
||||
KnowledgeArticles(authenticator=auth, **config),
|
||||
LeadSources(authenticator=auth, **config),
|
||||
LeadStatuses(authenticator=auth, **config),
|
||||
Leads(authenticator=auth, **config),
|
||||
Milestones(authenticator=auth, **config),
|
||||
Notes(authenticator=auth, **config),
|
||||
Opportunities(authenticator=auth, **config),
|
||||
OpportunityCategories(authenticator=auth, **config),
|
||||
OpportunityProducts(authenticator=auth, **config),
|
||||
OpportunityStateReasons(authenticator=auth, **config),
|
||||
Organisations(authenticator=auth, **config),
|
||||
PipelineStages(authenticator=auth, **config),
|
||||
Pipelines(authenticator=auth, **config),
|
||||
PricebookEntries(authenticator=auth, **config),
|
||||
Pricebooks(authenticator=auth, **config),
|
||||
Products(authenticator=auth, **config),
|
||||
ProjectCategories(authenticator=auth, **config),
|
||||
Projects(authenticator=auth, **config),
|
||||
Prospects(authenticator=auth, **config),
|
||||
QuoteProducts(authenticator=auth, **config),
|
||||
Quotes(authenticator=auth, **config),
|
||||
Relationships(authenticator=auth, **config),
|
||||
Tags(authenticator=auth, **config),
|
||||
TaskCategories(authenticator=auth, **config),
|
||||
Tasks(authenticator=auth, **config),
|
||||
TeamMembers(authenticator=auth, **config),
|
||||
Teams(authenticator=auth, **config),
|
||||
Tickets(authenticator=auth, **config),
|
||||
Users(authenticator=auth, **config),
|
||||
]
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"documentationUrl": "https://docs.airbyte.com/integrations/sources/insightly",
|
||||
"connectionSpecification": {
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "Insightly Spec",
|
||||
"type": "object",
|
||||
"required": ["token", "start_date"],
|
||||
"additionalProperties": true,
|
||||
"properties": {
|
||||
"token": {
|
||||
"type": ["string", "null"],
|
||||
"title": "API Token",
|
||||
"description": "Your Insightly API token.",
|
||||
"airbyte_secret": true
|
||||
},
|
||||
"start_date": {
|
||||
"type": ["string", "null"],
|
||||
"title": "Start Date",
|
||||
"description": "The date from which you'd like to replicate data for Insightly in the format YYYY-MM-DDT00:00:00Z. All data generated after this date will be replicated. Note that it will be used only for incremental streams.",
|
||||
"examples": ["2021-03-01T00:00:00Z"],
|
||||
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
#
|
||||
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
@@ -0,0 +1,63 @@
|
||||
#
|
||||
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from airbyte_cdk.sources.streams.http.auth import BasicHttpAuthenticator
|
||||
from pytest import fixture
|
||||
from source_insightly.source import IncrementalInsightlyStream
|
||||
|
||||
start_date = "2021-01-01T00:00:00Z"
|
||||
authenticator = BasicHttpAuthenticator(username="test", password="")
|
||||
|
||||
|
||||
@fixture
|
||||
def patch_incremental_base_class(mocker):
|
||||
# Mock abstract methods to enable instantiating abstract class
|
||||
mocker.patch.object(IncrementalInsightlyStream, "path", "v0/example_endpoint")
|
||||
mocker.patch.object(IncrementalInsightlyStream, "primary_key", "test_primary_key")
|
||||
mocker.patch.object(IncrementalInsightlyStream, "__abstractmethods__", set())
|
||||
|
||||
|
||||
def test_cursor_field(patch_incremental_base_class):
|
||||
stream = IncrementalInsightlyStream(authenticator=authenticator, start_date=start_date)
|
||||
# TODO: replace this with your expected cursor field
|
||||
expected_cursor_field = "DATE_UPDATED_UTC"
|
||||
assert stream.cursor_field == expected_cursor_field
|
||||
|
||||
|
||||
def test_get_updated_state(patch_incremental_base_class):
|
||||
stream = IncrementalInsightlyStream(authenticator=authenticator, start_date=start_date)
|
||||
inputs = {
|
||||
"current_stream_state": {"DATE_UPDATED_UTC": "2021-01-01T00:00:00Z"},
|
||||
"latest_record": {"DATE_UPDATED_UTC": "2021-02-01T00:00:00Z"},
|
||||
}
|
||||
expected_state = {"DATE_UPDATED_UTC": datetime(2021, 2, 1, 0, 0, 0, tzinfo=timezone.utc)}
|
||||
assert stream.get_updated_state(**inputs) == expected_state
|
||||
|
||||
|
||||
def test_get_updated_state_no_current_state(patch_incremental_base_class):
|
||||
stream = IncrementalInsightlyStream(authenticator=authenticator, start_date=start_date)
|
||||
inputs = {"current_stream_state": {}, "latest_record": {"DATE_UPDATED_UTC": "2021-01-01T00:00:00Z"}}
|
||||
expected_state = {"DATE_UPDATED_UTC": datetime(2021, 1, 1, 0, 0, 0, tzinfo=timezone.utc)}
|
||||
assert stream.get_updated_state(**inputs) == expected_state
|
||||
|
||||
|
||||
def test_supports_incremental(patch_incremental_base_class, mocker):
|
||||
mocker.patch.object(IncrementalInsightlyStream, "cursor_field", "dummy_field")
|
||||
stream = IncrementalInsightlyStream(authenticator=authenticator, start_date=start_date)
|
||||
assert stream.supports_incremental
|
||||
|
||||
|
||||
def test_source_defined_cursor(patch_incremental_base_class):
|
||||
stream = IncrementalInsightlyStream(authenticator=authenticator, start_date=start_date)
|
||||
assert stream.source_defined_cursor
|
||||
|
||||
|
||||
def test_stream_checkpoint_interval(patch_incremental_base_class):
|
||||
stream = IncrementalInsightlyStream(authenticator=authenticator, start_date=start_date)
|
||||
# TODO: replace this with your expected checkpoint interval
|
||||
expected_checkpoint_interval = None
|
||||
assert stream.state_checkpoint_interval == expected_checkpoint_interval
|
||||
@@ -0,0 +1,56 @@
|
||||
#
|
||||
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from source_insightly.source import SourceInsightly
|
||||
|
||||
|
||||
class MockResponse:
|
||||
def __init__(self, json_data, status_code):
|
||||
self.json_data = json_data
|
||||
self.status_code = status_code
|
||||
|
||||
def json(self):
|
||||
return self.json_data
|
||||
|
||||
def raise_for_status(self):
|
||||
if self.status_code != 200:
|
||||
raise Exception("Bad things happened")
|
||||
|
||||
|
||||
def mocked_requests_get(fail=False):
|
||||
def wrapper(*args, **kwargs):
|
||||
if fail:
|
||||
return MockResponse(None, 404)
|
||||
|
||||
return MockResponse(
|
||||
{"INSTANCE_NAME": "bossco", "INSTANCE_SUBDOMAIN": None, "PLAN_NAME": "Gratis", "NEW_USER_EXPERIENCE_ENABLED": True}, 200
|
||||
)
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
@patch("requests.get", side_effect=mocked_requests_get())
|
||||
def test_check_connection(mocker):
|
||||
source = SourceInsightly()
|
||||
logger_mock, config_mock = MagicMock(), MagicMock()
|
||||
assert source.check_connection(logger_mock, config_mock) == (True, None)
|
||||
|
||||
|
||||
@patch("requests.get", side_effect=mocked_requests_get(fail=True))
|
||||
def test_check_connection_fail(mocker):
|
||||
source = SourceInsightly()
|
||||
logger_mock, config_mock = MagicMock(), MagicMock()
|
||||
assert source.check_connection(logger_mock, config_mock)[0] is False
|
||||
assert source.check_connection(logger_mock, config_mock)[1] is not None
|
||||
|
||||
|
||||
def test_streams(mocker):
|
||||
source = SourceInsightly()
|
||||
config_mock = MagicMock()
|
||||
streams = source.streams(config_mock)
|
||||
|
||||
expected_streams_number = 37
|
||||
assert len(streams) == expected_streams_number
|
||||
@@ -0,0 +1,126 @@
|
||||
#
|
||||
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
||||
#
|
||||
|
||||
from http import HTTPStatus
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
from airbyte_cdk.sources.streams.http.auth import BasicHttpAuthenticator
|
||||
from source_insightly.source import InsightlyStream
|
||||
|
||||
authenticator = BasicHttpAuthenticator(username="test", password="")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def patch_base_class(mocker):
|
||||
# Mock abstract methods to enable instantiating abstract class
|
||||
mocker.patch.object(InsightlyStream, "path", "v0/example_endpoint")
|
||||
mocker.patch.object(InsightlyStream, "primary_key", "test_primary_key")
|
||||
mocker.patch.object(InsightlyStream, "__abstractmethods__", set())
|
||||
|
||||
|
||||
def test_request_params(patch_base_class):
|
||||
stream = InsightlyStream(authenticator=authenticator)
|
||||
inputs = {"stream_slice": None, "stream_state": None, "next_page_token": None}
|
||||
expected_params = {"count_total": True, "skip": 0, "top": 500}
|
||||
assert stream.request_params(**inputs) == expected_params
|
||||
|
||||
|
||||
def test_request_param_with_next_page_token(patch_base_class):
|
||||
stream = InsightlyStream(authenticator=authenticator)
|
||||
inputs = {"stream_slice": None, "stream_state": None, "next_page_token": 1000}
|
||||
expected_params = {"count_total": True, "skip": 1000, "top": 500}
|
||||
assert stream.request_params(**inputs) == expected_params
|
||||
|
||||
|
||||
def test_next_page_token(patch_base_class):
|
||||
stream = InsightlyStream(authenticator=authenticator)
|
||||
stream.total_count = 10000
|
||||
|
||||
request = MagicMock()
|
||||
request.url = "https://api.insight.ly/v0/example_endpoint?count_total=True&skip=0&top=500"
|
||||
response = MagicMock()
|
||||
response.status_code = HTTPStatus.OK
|
||||
response.request = request
|
||||
|
||||
inputs = {"response": response}
|
||||
expected_token = 500
|
||||
assert stream.next_page_token(**inputs) == expected_token
|
||||
|
||||
|
||||
def test_next_page_token_last_records(patch_base_class):
|
||||
stream = InsightlyStream(authenticator=authenticator)
|
||||
stream.total_count = 2100
|
||||
|
||||
request = MagicMock()
|
||||
request.url = "https://api.insight.ly/v0/example_endpoint?count_total=True&skip=1500&top=500"
|
||||
response = MagicMock()
|
||||
response.status_code = HTTPStatus.OK
|
||||
response.request = request
|
||||
|
||||
inputs = {"response": response}
|
||||
expected_token = 2000
|
||||
assert stream.next_page_token(**inputs) == expected_token
|
||||
|
||||
|
||||
def test_next_page_token_no_more_records(patch_base_class):
|
||||
stream = InsightlyStream(authenticator=authenticator)
|
||||
stream.total_count = 1000
|
||||
|
||||
request = MagicMock()
|
||||
request.url = "https://api.insight.ly/v0/example_endpoint?count_total=True&skip=1000&top=500"
|
||||
response = MagicMock()
|
||||
response.status_code = HTTPStatus.OK
|
||||
response.request = request
|
||||
|
||||
inputs = {"response": response}
|
||||
expected_token = None
|
||||
assert stream.next_page_token(**inputs) == expected_token
|
||||
|
||||
|
||||
def test_parse_response(patch_base_class):
|
||||
stream = InsightlyStream(authenticator=authenticator)
|
||||
|
||||
response = MagicMock()
|
||||
response.json = MagicMock(return_value=[{"data_field": [{"keys": ["keys"]}]}])
|
||||
|
||||
inputs = {"stream_state": "test_stream_state", "response": response}
|
||||
expected_parsed_object = response.json()[0]
|
||||
assert next(stream.parse_response(**inputs)) == expected_parsed_object
|
||||
|
||||
|
||||
def test_request_headers(patch_base_class):
|
||||
stream = InsightlyStream(authenticator=authenticator)
|
||||
inputs = {"stream_slice": None, "stream_state": None, "next_page_token": None}
|
||||
expected_headers = {"Accept": "application/json"}
|
||||
assert stream.request_headers(**inputs) == expected_headers
|
||||
|
||||
|
||||
def test_http_method(patch_base_class):
|
||||
stream = InsightlyStream(authenticator=authenticator)
|
||||
expected_method = "GET"
|
||||
assert stream.http_method == expected_method
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("http_status", "should_retry"),
|
||||
[
|
||||
(HTTPStatus.OK, False),
|
||||
(HTTPStatus.BAD_REQUEST, False),
|
||||
(HTTPStatus.TOO_MANY_REQUESTS, True),
|
||||
(HTTPStatus.INTERNAL_SERVER_ERROR, True),
|
||||
],
|
||||
)
|
||||
def test_should_retry(patch_base_class, http_status, should_retry):
|
||||
response_mock = MagicMock()
|
||||
response_mock.status_code = http_status
|
||||
stream = InsightlyStream(authenticator=authenticator)
|
||||
assert stream.should_retry(response_mock) == should_retry
|
||||
|
||||
|
||||
def test_backoff_time(patch_base_class):
|
||||
response_mock = MagicMock()
|
||||
stream = InsightlyStream(authenticator=authenticator)
|
||||
expected_backoff_time = None
|
||||
assert stream.backoff_time(response_mock) == expected_backoff_time
|
||||
@@ -80,6 +80,7 @@ For more information about the grading system, see [Product Release Stages](http
|
||||
| [Harvest](sources/harvest.md) | Generally Available | Yes |
|
||||
| [http-request](sources/http-request.md) | Alpha | No |
|
||||
| [HubSpot](sources/hubspot.md) | Generally Available | Yes |
|
||||
| [Insightly](sources/insightly.md) | Alpha | Yes |
|
||||
| [Instagram](sources/instagram.md) | Generally Available | Yes |
|
||||
| [Intercom](sources/intercom.md) | Generally Available | Yes |
|
||||
| [Iterable](sources/iterable.md) | Generally Available | Yes |
|
||||
|
||||
74
docs/integrations/sources/insightly.md
Normal file
74
docs/integrations/sources/insightly.md
Normal file
@@ -0,0 +1,74 @@
|
||||
# Insightly
|
||||
|
||||
This page guides you through the process of setting up the Insightly source connector.
|
||||
|
||||
## Set up the Insightly connector
|
||||
|
||||
1. Log into your [Airbyte Cloud](https://cloud.airbyte.io/workspaces) or Airbyte Open Source account.
|
||||
2. Click **Sources** and then click **+ New source**.
|
||||
3. On the Set up the source page, select **Insightly** from the Source type dropdown.
|
||||
4. Enter a name for your source.
|
||||
5. For **API token**, enter the API token for your Insightly account. You can find your API token in your Insightly Account > Click on your avatar > User Settings > API.
|
||||
6. For **Start date**, enter the date in YYYY-MM-DDTHH:mm:ssZ format. The data added on and after this date will be replicated.
|
||||
7. Click **Set up source**.
|
||||
|
||||
## Supported sync modes
|
||||
|
||||
The Insightly source connector supports the following [sync modes](https://docs.airbyte.com/cloud/core-concepts#connection-sync-modes):
|
||||
|
||||
- Full Refresh
|
||||
- Incremental
|
||||
|
||||
## Supported Streams
|
||||
|
||||
The Insightly source connector supports the following streams, some of them may need elevated permissions:
|
||||
|
||||
* [Activity Sets](https://api.na1.insightly.com/v3.1/#!/ActivitySets/GetActivitySets) \(Full table\)
|
||||
* [Contacts](https://api.na1.insightly.com/v3.1/#!/Contacts/GetEntities) \(Incremental\)
|
||||
* [Countries](https://api.na1.insightly.com/v3.1/#!/Countries/GetCountries) \(Full table\)
|
||||
* [Currencies](https://api.na1.insightly.com/v3.1/#!/Currencies/GetCurrencies) \(Full table\)
|
||||
* [Emails](https://api.na1.insightly.com/v3.1/#!/Emails/GetEntities) \(Full table\)
|
||||
* [Events](https://api.na1.insightly.com/v3.1/#!/Events/GetEntities) \(Incremental\)
|
||||
* [Knowledge Article Categories](https://api.na1.insightly.com/v3.1/#!/KnowledgeArticleCategories/GetEntities) \(Incremental\)
|
||||
* [Knowledge Article Folders](https://api.na1.insightly.com/v3.1/#!/KnowledgeArticleFolders/GetEntities) \(Incremental\)
|
||||
* [Knowledge Articles](https://api.na1.insightly.com/v3.1/#!/KnowledgeArticles/GetEntities) \(Incremental\)
|
||||
* [Leads](https://api.na1.insightly.com/v3.1/#!/Leads/GetEntities) \(Incremental\)
|
||||
* [Lead Sources](https://api.na1.insightly.com/v3.1/#!/LeadSources/GetLeadSources) \(Full table\)
|
||||
* [Lead Statuses](https://api.na1.insightly.com/v3.1/#!/LeadStatuses/GetLeadStatuses) \(Full table\)
|
||||
* [Milestones](https://api.na1.insightly.com/v3.1/#!/Milestones/GetEntities) \(Incremental\)
|
||||
* [Notes](https://api.na1.insightly.com/v3.1/#!/Notes/GetEntities) \(Incremental\)
|
||||
* [Opportunities](https://api.na1.insightly.com/v3.1/#!/Opportunities/GetEntities) \(Incremental\)
|
||||
* [Opportunity Categories](https://api.na1.insightly.com/v3.1/#!/OpportunityCategories/GetOpportunityCategories) \(Full table\)
|
||||
* [Opportunity Products](https://api.na1.insightly.com/v3.1/#!/OpportunityProducts/GetEntities) \(Incremental\)
|
||||
* [Opportunity State Reasons](https://api.na1.insightly.com/v3.1/#!/OpportunityStateReasons/GetOpportunityStateReasons) \(Full table\)
|
||||
* [Organisations](https://api.na1.insightly.com/v3.1/#!/Organisations/GetEntities) \(Incremental\)
|
||||
* [Pipelines](https://api.na1.insightly.com/v3.1/#!/Pipelines/GetPipelines) \(Full table\)
|
||||
* [Pipeline Stages](https://api.na1.insightly.com/v3.1/#!/PipelineStages/GetPipelineStages) \(Full table\)
|
||||
* [Price Book Entries](https://api.na1.insightly.com/v3.1/#!/PriceBookEntries/GetEntities) \(Incremental\)
|
||||
* [Price Books](https://api.na1.insightly.com/v3.1/#!/PriceBooks/GetEntities) \(Incremental\)
|
||||
* [Products](https://api.na1.insightly.com/v3.1/#!/Products/GetEntities) \(Incremental\)
|
||||
* [Project Categories](https://api.na1.insightly.com/v3.1/#!/ProjectCategories/GetProjectCategories) \(Full table\)
|
||||
* [Projects](https://api.na1.insightly.com/v3.1/#!/Projects/GetEntities) \(Incremental\)
|
||||
* [Prospects](https://api.na1.insightly.com/v3.1/#!/Prospects/GetEntities) \(Incremental\)
|
||||
* [Quote Products](https://api.na1.insightly.com/v3.1/#!/QuoteProducts/GetEntities) \(Incremental\)
|
||||
* [Quotes](https://api.na1.insightly.com/v3.1/#!/Quotes/GetEntities) \(Incremental\)
|
||||
* [Relationships](https://api.na1.insightly.com/v3.1/#!/Relationships/GetRelationships) \(Full table\)
|
||||
* [Tags](https://api.na1.insightly.com/v3.1/#!/Tags/GetTags) \(Full table\)
|
||||
* [Task Categories](https://api.na1.insightly.com/v3.1/#!/TaskCategories/GetTaskCategories) \(Full table\)
|
||||
* [Tasks](https://api.na1.insightly.com/v3.1/#!/Tasks/GetEntities) \(Incremental\)
|
||||
* [Team Members](https://api.na1.insightly.com/v3.1/#!/TeamMembers/GetTeamMembers) \(Full table\)
|
||||
* [Teams](https://api.na1.insightly.com/v3.1/#!/Teams/GetTeams) \(Full table\)
|
||||
* [Tickets](https://api.na1.insightly.com/v3.1/#!/Tickets/GetEntities) \(Incremental\)
|
||||
* [Users](https://api.na1.insightly.com/v3.1/#!/Users/GetUsers) \(Incremental\)
|
||||
|
||||
|
||||
## Performance considerations
|
||||
|
||||
The connector is restricted by Insightly [requests limitation](https://api.na1.insightly.com/v3.1/#!/Overview/Introduction).
|
||||
|
||||
|
||||
## Changelog
|
||||
|
||||
| Version | Date | Pull Request | Subject |
|
||||
| :------ | :--------- | :------------------------------------------------------- | :-------------------------------------------------------------------------------------------- |
|
||||
| 0.1.0 | 2021-07-19 | | Release Insightly CDK Connector |
|
||||
Reference in New Issue
Block a user