diff --git a/python/.gitignore b/python/.gitignore
new file mode 100644
index 0000000..378a19a
--- /dev/null
+++ b/python/.gitignore
@@ -0,0 +1,129 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+venv/
+env/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
diff --git a/python/README.md b/python/README.md
new file mode 100644
index 0000000..d35c624
--- /dev/null
+++ b/python/README.md
@@ -0,0 +1,61 @@
+# omie_python_api
+Uma maneira fácil de comunicar-se com a API da Omie, utilizando Python.
+
+## Configuração inicial
+
+### Primeiramente, crie um arquivo .env contendo os seguintes dados:
+
+*EmpresaTeste_KEY = '38333295000'*
+
+*EmpresaTeste_SECRET = 'fed2163e2e8dccb53ff914ce9e2f1258'*
+
+*EmpresaTeste_CLIENTE_IMPOSTO = 1*
+
+*EmpresaTeste_CENARIO_IMPOSTO = 1*
+
+*EmpresaTeste_LOCAL_DE_ESTOQUE = 464449588*
+
+#### Essas são as credenciais da API teste da Omie.
+
+### Para adicionar suas empresas, utilize o mesmo padrão, mudando apenas o nome inicial no nome da variável e as informações. Exemplo:
+
+*MinhaEmpresa_KEY = "APP_KEY da sua primeira empresa"*
+
+*MinhaEmpresa_SECRET = "APP_SECRET da sua primeira empresa"*
+
+*MinhaEmpresa_CLIENTE_IMPOSTO = 'Cliente padrão para consulta de impostos da sua empresa (Código API Omie)'*
+
+*MinhaEmpresa_CENARIO_IMPOSTO = Número do cenário de impostos da sua empresa (Código API Omie)*
+
+*MinhaEmpresa_LOCAL_DE_ESTOQUE = Número do local de estoque padrão da sua empresa (Código API Omie)*
+
+*MinhaOutraEmpresa_KEY = "APP_KEY da sua segunda empresa"*
+
+*MinhaOutraEmpresa_SECRET = "APP_SECRET da sua segunda empresa"*
+
+*MinhaOutraEmpresa_CLIENTE_IMPOSTO = 'Cliente padrão para consulta de impostos da sua segunda empresa'*
+
+*MinhaOutraEmpresa_CENARIO_IMPOSTO = Número do cenário de impostos da sua segunda empresa*
+
+*MinhaOutraEmpresa_LOCAL_DE_ESTOQUE = Número do local de estoque padrão da sua segunda empresa*
+
+### Após, instale as bibliotecas necessárias, rodando dentro dessa pasta o comando:
+
+*pip install -r requirements.txt*
+
+### E então, você pode usar o arquivo *exemplo.py* para entender como essa biblioteca funciona, e se basear.
+
+## Métodos já configurados:
+
++ **AlterarProduto** - executar()
++ **ConsultarCliente** - executar()
++ **ConsultarPedido** - executar()
++ **ConsultarVendedor** - executar()
++ **ListarCenarios** - executar()
++ **ListarClientes** - executar(), todos()
++ **ListarLocaisEstoque** - executar()
++ **ListarImpostosCenario** - executar()
++ **ListarPosEstoque** - executar(), todos()
++ **ListarProdutos** - executar(), todos()
++ **ListarTabelaItens** - executar(), todos()
++ **ListarTabelasPreco** - executar()
\ No newline at end of file
diff --git a/python/exemplo.py b/python/exemplo.py
new file mode 100644
index 0000000..f7675c9
--- /dev/null
+++ b/python/exemplo.py
@@ -0,0 +1,11 @@
+from omie import *
+
+
+exemplo = Omie("EmpresaTeste").ListarClientes
+
+exemplo.registros_por_pagina = 2
+exemplo.pagina = 5
+
+exec = exemplo.executar()
+
+print(exec)
\ No newline at end of file
diff --git a/python/omie.py b/python/omie.py
new file mode 100644
index 0000000..83da8f0
--- /dev/null
+++ b/python/omie.py
@@ -0,0 +1,259 @@
+import os
+import requests
+from dotenv import load_dotenv
+
+class Omie:
+ def __init__(self, empresa):
+
+ self.AlterarProduto = OmieAlterarProduto(empresa)
+ self.ConsultarCliente = OmieConsultarCliente(empresa)
+ self.ConsultarPedido = OmieConsultarPedido(empresa)
+ self.ConsultarVendedor = OmieConsultarVendedor(empresa)
+ self.ListarCenarios = OmieListarCenarios(empresa)
+ self.ListarClientes = OmieListarClientes(empresa)
+ self.ListarImpostosCenario = OmieListarImpostosCenario(empresa)
+ self.ListarLocaisEstoque = OmieListarLocaisEstoque(empresa)
+ self.ListarPosEstoque = OmieListarPosEstoque(empresa)
+ self.ListarProdutos = OmieListarProdutos(empresa)
+ self.ListarTabelaItens = OmieListarTabelaItens(empresa)
+ self.ListarTabelasPreco = OmieListarTabelasPreco(empresa)
+
+class OmieAlterarProduto:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "geral/produtos/"
+ self.call = "AlterarProduto"
+ self.codigo_produto = 0
+
+ def executar(self):
+ return OmieApi().executar(self, self.empresa)
+
+class OmieConsultarCliente:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "geral/clientes/"
+ self.call = "ConsultarCliente"
+ self.codigo_cliente_omie = 0
+ self.codigo_cliente_integracao = ""
+
+ def executar(self):
+ return OmieApi().executar(self, self.empresa)
+
+class OmieConsultarPedido:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "produtos/pedido/"
+ self.call = "ConsultarPedido"
+ self.codigo_pedido = 0
+
+ def executar(self):
+ return OmieApi().executar(self, self.empresa)
+
+class OmieConsultarVendedor:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "geral/vendedores/"
+ self.call = "ConsultarVendedor"
+ self.codigo = 0
+ self.codInt = ""
+
+ def executar(self):
+ return OmieApi().executar(self, self.empresa)
+
+class OmieListarCenarios:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "geral/cenarios/"
+ self.call = 'ListarCenarios'
+ self.nPagina = 1
+ self.nRegPorPagina = 20
+
+ def executar(self):
+ return OmieApi().executar(self, self.empresa)
+
+class OmieListarClientes:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "geral/clientes/"
+ self.call = 'ListarClientes'
+ self.pagina = 1
+ self.registros_por_pagina = 50
+
+ def executar(self):
+ return OmieApi().executar(self, self.empresa)
+
+ def todos(self):
+ nome_lista_omie = "clientes_cadastro"
+ self.registros_por_pagina = 500
+ consulta = self.executar()
+ total_de_paginas = consulta['total_de_paginas']
+ lista = consulta[nome_lista_omie]
+ while self.pagina < total_de_paginas:
+ self.pagina += 1
+ produtos = self.executar()[nome_lista_omie]
+ for produto in produtos:
+ lista.append(produto)
+ return lista
+
+class OmieListarImpostosCenario:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "geral/cenarios/"
+ self.call = 'ListarImpostosCenario'
+ self.consumo_final = "N"
+ self.codigo_produto = 0
+
+ def executar(self):
+ self.codigo_cliente_omie = OmieApi(self.empresa).cliente_imposto()
+ self.codigo_cenario = OmieApi(self.empresa).cenario_imposto()
+ return OmieApi().executar(self, self.empresa)
+
+class OmieListarLocaisEstoque:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "estoque/local/"
+ self.call = 'ListarLocaisEstoque'
+ self.nPagina = 1
+ self.nRegPorPagina = 20
+
+ def executar(self):
+ return OmieApi().executar(self, self.empresa)
+
+class OmieListarPosEstoque:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "estoque/consulta/"
+ self.call = 'ListarPosEstoque'
+ self.nPagina = 1
+ self.nRegPorPagina = 20
+ self.dDataPosicao = ""
+ self.cExibeTodos = "N"
+ self.codigo_local_estoque = OmieApi(empresa).local_de_estoque()
+
+ def executar(self):
+ return OmieApi().executar(self, self.empresa)
+
+ def todos(self):
+ nome_lista_omie = "produtos"
+ self.nRegPorPagina = 500
+ consulta = self.executar()
+ total_de_paginas = consulta['nTotPaginas']
+ lista = consulta[nome_lista_omie]
+ while self.nPagina < total_de_paginas:
+ self.nPagina += 1
+ produtos = self.executar()[nome_lista_omie]
+ for produto in produtos:
+ lista.append(produto)
+ return lista
+
+class OmieListarProdutos:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "geral/produtos/"
+ self.call = 'ListarProdutos'
+ self.pagina = 1
+ self.registros_por_pagina = 50
+ self.apenas_importado_api = 'N'
+ self.filtrar_apenas_omiepdv = 'N'
+
+ def executar(self):
+ return OmieApi().executar(self, self.empresa)
+
+ def todos(self):
+ nome_lista_omie = "produto_servico_cadastro"
+ self.registros_por_pagina = 500
+ consulta = self.executar()
+ total_de_paginas = consulta['total_de_paginas']
+ lista = consulta[nome_lista_omie]
+ while self.pagina < total_de_paginas:
+ self.pagina += 1
+ produtos = self.executar()[nome_lista_omie]
+ for produto in produtos:
+ lista.append(produto)
+ return lista
+
+class OmieListarTabelaItens:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "produtos/tabelaprecos/"
+ self.call = 'ListarTabelaItens'
+ self.nPagina = 1
+ self.nRegPorPagina = 20
+ self.nCodTabPreco = 0
+ self.cCodIntTabPreco = ""
+
+ def executar(self):
+ return OmieApi().executar(self, self.empresa)
+
+ def todos(self):
+ nome_lista_omie = "listaTabelaPreco"
+ self.nRegPorPagina = 500
+ consulta = self.executar()
+ total_de_paginas = consulta['nTotPaginas']
+ lista = consulta[nome_lista_omie]['itensTabela']
+ while self.nPagina < total_de_paginas:
+ self.nPagina += 1
+ produtos = self.executar()[nome_lista_omie]['itensTabela']
+ for produto in produtos:
+ lista.append(produto)
+ return lista
+
+class OmieListarTabelasPreco:
+ def __init__(self, empresa):
+ self.empresa = empresa
+ self.caminho = "produtos/tabelaprecos/"
+ self.call = 'ListarTabelasPreco'
+ self.nPagina = 1
+ self.nRegPorPagina = 20
+
+ def executar(self):
+ return OmieApi().executar(self, self.empresa)
+
+
+class OmieApi:
+ def __init__(self, empresa = ""):
+ self.caminho = ""
+ self.call = ""
+ load_dotenv()
+ self.empresa = empresa
+
+ def executar(self, metodo, empresa):
+
+ self.empresa = empresa
+
+ metodo_json = self.__converter_json(metodo)
+
+ parametros = metodo_json.copy()
+ parametros.pop('caminho')
+ parametros.pop('call')
+ parametros.pop('empresa')
+
+ json_data = {}
+ json_data['app_key'] = self.key()
+ json_data['app_secret'] = self.secret()
+ json_data['call'] = metodo_json['call']
+ json_data['param'] = [parametros]
+
+ response = requests.post('https://app.omie.com.br/api/v1/' + metodo_json['caminho'], json=json_data)
+ return response.json()
+
+ def __converter_json(self, metodo):
+
+ antigo = metodo.__dict__
+ classe = metodo.__class__.__name__
+ novo = {}
+
+ for atributo in antigo:
+ valor = antigo[atributo]
+ atributo = atributo.replace("_" + classe + "__", "")
+ atributo = atributo.replace("_" + classe + "_", "")
+ atributo = atributo.replace("_" + classe, "")
+ novo[atributo] = valor
+
+ return novo
+
+ def key(self): return os.getenv(self.empresa + '_KEY')
+ def secret(self): return os.getenv(self.empresa + '_SECRET')
+ def cliente_imposto(self): return os.getenv(self.empresa + '_CLIENTE_IMPOSTO')
+ def cenario_imposto(self): return os.getenv(self.empresa + '_CENARIO_IMPOSTO')
+ def local_de_estoque(self): return os.getenv(self.empresa + '_LOCAL_DE_ESTOQUE')
\ No newline at end of file
diff --git a/python/requirements.txt b/python/requirements.txt
new file mode 100644
index 0000000..5997a19
Binary files /dev/null and b/python/requirements.txt differ