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