Skip to content

Instantly share code, notes, and snippets.

@duvictor
Created November 23, 2021 01:50
Show Gist options
  • Save duvictor/0fb42c0c7fa1652957be54f09972d426 to your computer and use it in GitHub Desktop.
Save duvictor/0fb42c0c7fa1652957be54f09972d426 to your computer and use it in GitHub Desktop.
from rest_framework import viewsets
from ..serializers.fornecedor import *
from ..models.models import *
from ..util import model_util, integracao, tipo_documento_util, geral_util, log_arquivo_util
from rest_framework.filters import SearchFilter
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
from rest_framework.request import Request
from rest_framework.parsers import MultiPartParser, FormParser
from zeep import Client
from zeep.transports import Transport
from requests.auth import HTTPBasicAuth
from requests import Session
import os
from django.db.models import Q
from django.http import HttpResponse
from ..negocio import dvf_ng, fornecedor_ng, documento_ng, extrato_fornecedor_ng
from ..util import ambiente_util
import re
from copel.api.negocio import login_ng
import json as json_api
class PaginacaoViews(PageNumberPagination):
def get_paginated_response(self, data):
return Response(data)
class DespachoView(viewsets.ViewSet):
serializer_class = DespachoSerialized
queryset = DespachoEnviadoFornecedor.objects.all().order_by('data_cadastro')
def incluir(self, request):
json = request.data
assunto = json['assunto']
descricao = json['descricao']
fornecedor_id = json['fornecedor']
despacho_ng.incluir(assunto, descricao, fornecedor_id=fornecedor_id)
return api_util.HttpOK('OK')
def listar_despachos(self, request: Request, cnpj) -> Response:
objects = DespachoEnviadoFornecedor.objects.order_by('-num_seq_def').filter(fornecedor__cpf_cnpj=cnpj)
dados = self.serializer_class(objects, many=True).data
return api_util.HttpOK(dados)
class BancoView(viewsets.ModelViewSet):
serializer_class = BancoSerialized
search_fields = ['=codigo']
filter_backends = [SearchFilter]
queryset = InstituicaoBancaria.objects.all().order_by('nome')
def get_queryset(self):
filtro = self.request.query_params.get('filtro')
if filtro is not None:
condicinonal = Q(nome__contains=filtro) | Q(codigo=filtro)
queryset = InstituicaoBancaria.objects.filter(condicinonal).order_by('nome')
else:
queryset = InstituicaoBancaria.objects.all().order_by('nome')
return queryset
class FornecedorListarView(viewsets.ModelViewSet):
serializer_class = FornecedorListagemSerialized
search_fields = ['nome_fantasia', 'cpf_cnpj', 'nome_responsavel_cadastro', 'codigo_sap']
filter_backends = [SearchFilter]
queryset = PreCadastroFornecedor.objects.all().order_by('nome_fantasia')
def create(self, request, *args, **kwargs):
raise Exception('Operação inválida para esse path')
def update(self, request, *args, **kwargs):
raise Exception('Operação inválida para esse path')
def destroy(self, request, *args, **kwargs):
raise Exception('Operação inválida para esse path')
def get_queryset(self):
situacao = self.request.query_params.get('situacao')
etapa = self.request.query_params.get('etapa')
codigo_sap = self.request.query_params.get('codigo_sap')
if situacao:
situacao = situacao.replace('/', '')
if etapa:
etapa = etapa.replace('/', '')
if situacao and etapa:
queryset = PreCadastroFornecedor.objects.filter(situacao_cadastro=situacao, etapa_cadastro=etapa).order_by(
'nome_fantasia')
elif situacao:
queryset = PreCadastroFornecedor.objects.filter(situacao_cadastro=situacao).order_by('nome_fantasia')
elif etapa:
queryset = PreCadastroFornecedor.objects.filter(etapa_cadastro=etapa).order_by('nome_fantasia')
elif codigo_sap:
queryset = PreCadastroFornecedor.objects.filter(codigo_sap=codigo_sap).order_by('nome_fantasia')
else:
queryset = PreCadastroFornecedor.objects.all().order_by('nome_fantasia')
return queryset
class FornecedorView(viewsets.ModelViewSet):
serializer_class = FornecedorSerialized
search_fields = ['nome_fantasia', 'cpf_cnpj', 'nome_responsavel_cadastro', 'codigo_sap']
filter_backends = [SearchFilter]
queryset = PreCadastroFornecedor.objects.all().order_by('nome_fantasia')
def registrarLogFornecedor(self, texto):
log_arquivo_util.salvar_texto(texto)
def update(self, request, *args, **kwargs):
tab = api_util.obter_parametro(request, 'tab')
self.registrarLogFornecedor("iniciando persistencia fornecedor:\n" + str(request.data))
response = super().update(request, *args, **kwargs)
self.registrarLogFornecedor("response:\n" + str(response.data))
id = response.data['num_seq_pcfnr']
self.registrarLogFornecedor("num_seq_pcfnr: " + str(id))
forn = PreCadastroFornecedor.objects.get(num_seq_pcfnr=id)
response = self.tratar_sap(forn, tab)
if response.status_code == 200:
# Ativa o vínculo dos documentos
lista_id_tipos_existentes = fornecedor_ps.listar_tipo_documento_ja_vinculado(id)
if len(lista_id_tipos_existentes) == 0:
dvf_ng.ativar_documentos_fornecedor(forn, False, lista_id_tipos_existentes=lista_id_tipos_existentes)
return response
def tratar_sap(self, forn: PreCadastroFornecedor, tab):
pj = PreCadastroFornecedorPj.objects.filter(num_pre_cad_fnr_pfpj=forn.num_seq_pcfnr).first()
valido, campo_faltante = self.validar_dados_obrigatorios_sap(forn, pj)
if not valido:
self.registrarLogFornecedor("num_seq_pcfnr " + str(forn.num_seq_pcfnr) + ": Não enviado ao SAP, falta o campo: " + campo_faltante)
return
# if ambiente_util.is_local_ou_dev():
if False: #comentado por paulo, 21/11/2021, tinha sido criado como um bypass antes de termos a integracao completa com sap, sap agora retorna o codigo sap
forn.codigo_sap = '9999999'
forn.save()
else:
try:
pf = PreCadastroFornecedorPf.objects.filter(num_pre_cad_fnr_pfpf=forn.num_seq_pcfnr).first()
dados_bancarios = PreCadDadoBancarioFnr.objects.filter(fornecedor_id=forn.num_seq_pcfnr).first()
if not geral_util.ok(forn.codigo_sap) or forn.codigo_sap == '9999999':#verifica se é pra inserir no sap ou atualizar
return self.inserir_sap(forn, pj, pf, dados_bancarios)
else:
if tab == 'cadastro':
return self.atualizar_sap_tab_cadastro(forn, pj, pf)
if tab == 'atividades':
return self.atualizar_sap_tab_atividades(forn, pj, pf)
if tab == 'mei_pf':
return self.atualizar_sap_tab_mei_pf(forn, pj, pf)
if tab == 'dados_bancarios':
return self.atualizar_sap_tab_dados_bancarios(forn, pj, pf, dados_bancarios)
if tab == 'gestores':
# Tab de gestores não tem nenhum dados a ser atualizado no sap
pass
# self.atualizar_sap(forn, pj, pf)
except Exception as e:
self.registrarLogFornecedor("erro_sap: " + str(e))
def listar_tipo_atividades(self, request: Request) -> Response:
lista = []
lista.append({'id': 0, 'nome': 'Prestador de serviços'})
lista.append({'id': 1, 'nome': 'Fornecedor de materiais'})
return api_util.HttpOK(lista)
def status(self, request: Request, cnpj) -> Response:
objects = PreCadastroFornecedor.objects.filter(cpf_cnpj=cnpj)[0:1]
dados = self.serializer_class(objects, many=True).data
if len(dados) == 0:
return api_util.HttpOK("ERRO: Não existe um fornecedor com o cnpj: " + cnpj)
return api_util.HttpOK(str(dados[0]['etapa_cadastro']))
def atualizar_situacao(self, request: Request, ids, etapa, situacao) -> Response:
list_id = ids.split(',')
if list_id:
for cod in list_id:
f = PreCadastroFornecedor.objects.filter(pk=cod).first()
if f:
f.etapa_cadastro = etapa
f.situacao_cadastro = situacao
f.save()
else:
return api_util.HttpResponse('Fornecedores não encontrados')
return api_util.HttpOK('Fornecedores atualizados para a etapa: ' + str(etapa) + ' e situação ' + str(situacao))
def atualizar_sap_tab_cadastro(self, fornp: PreCadastroFornecedor, pj: PreCadastroFornecedorPj, pf: PreCadastroFornecedorPf) -> Response:
# CÓDIGO SAP
codigo_sap = fornp.codigo_sap
is_pj = fornp.indicador_pj_pf.strip() == 'PJ'
# DADOS ENVIADOS NA TAB DE CADASTRO
cpf_cnpj = fornp.cpf_cnpj
nome_fantasia = fornp.nome_fantasia
nome_responsavel_cadastro = fornp.nome_responsavel_cadastro
cpf_responsavel_cadastro = fornp.cpf_responsavel_cadastro
funcao_responsavel_cadastro = fornp.funcao_responsavel_cadastro
email_responsavel_cadastro = fornp.email_responsavel_cadastro
pais = fornp.pais
uf = fornp.uf
cidade = fornp.cidade
endereco_caixa_postal = fornp.endereco_caixa_postal
cep = fornp.cep
endereco_logradouro = fornp.endereco_logradouro
endereco_complemento = fornp.endereco_complemento
endereco_numero = fornp.endereco_numero
endereco_bairro = fornp.endereco_bairro
fuso_horario = fornp.fuso_horario
idioma = fornp.idioma
fone_fixo = fornp.fone_fixo
fone_celular = fornp.fone_celular
email = fornp.email
url_site = fornp.url_site
anexo_simples_nacional = fornp.anexo_simples_nacional
possui_cadastro_cpom = fornp.possui_cadastro_cpom
data_validade_procuracao = fornp.data_validade_procuracao
indicador_pj_pf = fornp.indicador_pj_pf
request_api = {
"IM_BANCO": {
},
"IM_EMAIL": {
"item": {
"SMTP_ADDR": fornp.email,
"REMARK": "Principal"
}
},
"IM_INPUT": {
"LIFNR": (fornp.codigo_sap if fornp and fornp.codigo_sap else ""),
"STCD1": (fornp.cpf_cnpj if len(fornp.cpf_cnpj) == 14 and is_pj else ""),
"STCD3": pj.inscricao_estadual if is_pj else "",
"STCD4": (pj.inscricao_municipal if is_pj and pj.inscricao_municipal else ""),
"STCD2": (fornp.cpf_cnpj if len(fornp.cpf_cnpj) == 11 and fornp.indicador_pj_pf.strip() == 'PF' else ''),
"NAME1": fornp.nome_fantasia[:35],
"SORTL": fornp.nome_fantasia[:20],
"NAMEV": geral_util.obter_nome(fornp.nome_responsavel_cadastro)[:35],
"NAMES": geral_util.obter_sobrenome(fornp.nome_responsavel_cadastro)[:35],
"LAND1": (fornp.pais if fornp and fornp.pais else "BR"),
"REGIO": fornp.uf,
"ORT01": re.sub(u'[^a-zA-Z0-9áéíóúÁÉÍÓÚâêîôÂÊÎÔãõÃÕçÇ: ]', '', fornp.cidade[:35]),
"PSTLZ": (fornp.cep if len(fornp.cep) == 9 else fornp.cep[:5] + "-" + fornp.cep[5:9]),
"STRAS": fornp.endereco_logradouro[:35],
"HOUSE_NUM1": (fornp.endereco_numero if fornp and fornp.endereco_numero else "0"),
"ORT02": re.sub(u'[^a-zA-Z0-9áéíóúÁÉÍÓÚâêîôÂÊÎÔãõÃÕçÇ: ]', '', fornp.endereco_bairro[:35]),
"TELF1": fornp.fone_fixo,
"SCACD": 'MEI' if fornp.tipo_sociedade == 4 else ('SIM' if fornp.anexo_simples_nacional != "0" else ""),
"STGDL": ("03" if fornp.anexo_simples_nacional and fornp.anexo_simples_nacional == "3" else ""),
},
"IM_IRF": {
},
"IM_PARCEIRO": {
}
}
return self.enviar_requisicao_sap(fornp, pj, pf, request_api)
def atualizar_sap_tab_atividades(self, fornp: PreCadastroFornecedor, pj: PreCadastroFornecedorPj, pf: PreCadastroFornecedorPf) -> Response:
# CÓDIGO SAP
codigo_sap = fornp.codigo_sap
# DADOS ENVIADOS NA TAB DE ATIVIDADES
tipo_setor = fornp.tipo_setor
tipo_sociedade = fornp.tipo_sociedade
tipo_atividade = fornp.tipo_atividade
tipo_prestacao_servico = fornp.tipo_prestacao_servico
request_api = {
"IM_BANCO": {
},
"IM_EMAIL": {
},
"IM_INPUT": {
"LIFNR": (fornp.codigo_sap if fornp and fornp.codigo_sap else ""),
# campo utilizado como flag para update
},
"IM_IRF": {
},
"IM_PARCEIRO": {
}
}
return self.enviar_requisicao_sap(fornp, pj, pf, request_api)
def atualizar_sap_tab_mei_pf(self, fornp: PreCadastroFornecedor, pj: PreCadastroFornecedorPj, pf: PreCadastroFornecedorPf) -> Response:
# CÓDIGO SAP
codigo_sap = fornp.codigo_sap
# DADOS ENVIADOS NA TAB DE MEI E PF
raca = fornp.raca
estado_civil = fornp.estado_civil
grau_instrucao = fornp.grau_instrucao
pis = fornp.pis
rg = fornp.rg
cpf = fornp.cpf
sexo = fornp.sexo
pais = fornp.pais
nacionalidade = fornp.nacionalidade
tipo_atividade = fornp.tipo_atividade
num_seq_fate = fornp.num_seq_fate
tipo_prestacao_servico = fornp.tipo_prestacao_servico
request_api = {
"IM_BANCO": {
},
"IM_EMAIL": {
},
"IM_INPUT": {
"LIFNR": (fornp.codigo_sap if fornp and fornp.codigo_sap else "") , # campo utilizado como flag para update
"MM_PIS": pis,
"MM_RACA": raca,
"MM_ESTADO_CIVIL": estado_civil,
"MM_CPF_MEI": cpf,
"MM_SEXO": sexo,
"MM_GRAU_INSTRUCAO": grau_instrucao,
"MM_PAIS_NASCIMENTO": pais,
"MM_PAIS_NACIONALIDADE": nacionalidade,
},
"IM_IRF": {
},
"IM_PARCEIRO": {
}
}
return self.enviar_requisicao_sap(fornp, pj, pf, request_api)
def atualizar_sap_tab_dados_bancarios(self, forn: PreCadastroFornecedor, pj: PreCadastroFornecedorPj, pf: PreCadastroFornecedorPf, db: PreCadDadoBancarioFnr) -> Response:
# CÓDIGO SAP
# DADOS ENVIADOS NA TAB DE DADOS BANCARIOS
banco = lambda db: {
"item": {"BANKS": db.sigla_pais, "BANKL": db.conta, "BANKN": db.conta, "KOINH": forn.nome_fantasia[:35], "BANKA": db.banco.nome, "BKONT": db.agencia_digito, }} if (db != None) else "{}"
request_api = {
"IM_BANCO": banco(db),
"IM_EMAIL": {
},
"IM_INPUT": {
"LIFNR": (forn.codigo_sap if forn and forn.codigo_sap else "") # campo utilizado como flag para update
},
"IM_IRF": {
},
"IM_PARCEIRO": {
}
}
return self.enviar_requisicao_sap(forn, pj, pf, request_api)
def atualizar_sap(self, forn: PreCadastroFornecedor, pj: PreCadastroFornecedorPj, pf: PreCadastroFornecedorPf) -> Response:
# reponsavel por enviar os dados de fornecedor para o sap através da integracao
self.registrarLogFornecedor("atualizar_sap")
is_pj = forn.indicador_pj_pf.strip() == 'PJ'
request_api = {
"IM_BANCO": {
},
"IM_EMAIL": {
"item": {
"SMTP_ADDR": forn.email,
"REMARK": "Principal"
}
},
"IM_INPUT": {
"LIFNR": (forn.codigo_sap if forn and forn.codigo_sap else ""), # campo utilizado como flag para update
"NAME1": forn.nome_fantasia[:35],
"NAME2": "", # forn.razao_social,
"SORTL": forn.nome_fantasia[:20],
"STRAS": forn.endereco_logradouro[:35],
"HOUSE_NUM1": (forn.endereco_numero if forn and forn.endereco_numero else "0"),
"ORT02": re.sub(u'[^a-zA-Z0-9áéíóúÁÉÍÓÚâêîôÂÊÎÔãõÃÕçÇ: ]', '', forn.endereco_bairro[:35]),
"ORT01": re.sub(u'[^a-zA-Z0-9áéíóúÁÉÍÓÚâêîôÂÊÎÔãõÃÕçÇ: ]', '', forn.cidade[:35]),
"PSTLZ": (forn.cep if len(forn.cep) == 9 else forn.cep[:5] + "-" + forn.cep[5:9]),
"REGIO": forn.uf,
"LAND1": (forn.pais if forn and forn.pais else "BR"),
"SPRAS": "PT", # sempre PT
"TELF1": forn.fone_fixo,
"REMARK": forn.observacao[:50],
"KUNNR": "",
"STCD3": pj.inscricao_estadual if is_pj else "",
"STCD4": (pj.inscricao_municipal if is_pj and pj.inscricao_municipal else ""),
"STCD2": (forn.cpf_cnpj if len(forn.cpf_cnpj) == 11 and forn.indicador_pj_pf.strip() == 'PF' else ''),
"BRSCH": "0002", # forn.tipo_setor, #estava tipo, alterei para tipo_setor apenas para teste
"SCACD": 'MEI' if forn.tipo_sociedade == 4 else ('SIM' if forn.anexo_simples_nacional != "0" else ""),
"SFRGR": "CPOM",
"STGDL": ("03" if forn.anexo_simples_nacional and forn.anexo_simples_nacional == "3" else ""),
"TEL_NUMBER": forn.fone_fixo,
"PAFKT": "G2",
"WAERS": "BRL", # 'WAERS': 'BRL', #moeda do pedido
"ERNAM": os.getenv('WSDL_USER')
},
"IM_IRF": {
},
"IM_PARCEIRO": {
}
}
return self.enviar_requisicao_sap(forn, pf, pf, request_api)
def inserir_sap(self, forn: PreCadastroFornecedor, pj: PreCadastroFornecedorPj, pf: PreCadastroFornecedorPf, db: PreCadDadoBancarioFnr) -> Response:
self.registrarLogFornecedor("sincronizar_sap")
is_pj = forn.indicador_pj_pf.strip() == 'PJ'
banco = lambda db: {"item": { "BANKS": db.sigla_pais, "BANKL": db.conta,"BANKN": db.conta , "KOINH": forn.nome_fantasia[:35], "BANKA": db.banco.nome, "BKONT": db.agencia_digito, }} if (db != None) else "{}"
request_api = {
"IM_BANCO": banco(db) ,
"IM_EMAIL": {
"item": {
"SMTP_ADDR": forn.email,
"REMARK": "Principal"
}
},
"IM_INPUT": {
"LIFNR": "", # campo utilizado como flag para update
"KTOKK": (1000 if forn.indicador_pj_pf.strip() == 'PJ' else 2000),
"NAME1": forn.nome_fantasia[:35],
"NAME2": "", # forn.razao_social,
"SORTL": forn.nome_fantasia[:20],
"STRAS": forn.endereco_logradouro[:35],
"HOUSE_NUM1": (forn.endereco_numero if forn and forn.endereco_numero else "0"),
"ORT02": re.sub(u'[^a-zA-Z0-9áéíóúÁÉÍÓÚâêîôÂÊÎÔãõÃÕçÇ: ]', '', forn.endereco_bairro[:35]),
"ORT01": re.sub(u'[^a-zA-Z0-9áéíóúÁÉÍÓÚâêîôÂÊÎÔãõÃÕçÇ: ]', '', forn.cidade[:35]),
"PSTLZ": (forn.cep if len(forn.cep) == 9 else forn.cep[:5] + "-" + forn.cep[5:9]),
"REGIO": forn.uf,
"LAND1": (forn.pais if forn and forn.pais else "BR"),
"SPRAS": "PT", # sempre PT
"TELF1": forn.fone_fixo,
"REMARK": forn.observacao[:50],
"KUNNR": "",
"STCD1": (forn.cpf_cnpj if len(forn.cpf_cnpj) == 14 and is_pj else ""),
"STCD3": pj.inscricao_estadual if is_pj else "",
"STCD4": (pj.inscricao_municipal if is_pj and pj.inscricao_municipal else ""),
"STCD2": (forn.cpf_cnpj if len(forn.cpf_cnpj) == 11 and forn.indicador_pj_pf.strip() == 'PF' else ''),
"BRSCH": "0002", # forn.tipo_setor, #estava tipo, alterei para tipo_setor apenas para teste
"SCACD": 'MEI' if forn.tipo_sociedade == 4 else ('SIM' if forn.anexo_simples_nacional != "0" else ""),
"SFRGR": "CPOM",
"STGDL": ("03" if forn.anexo_simples_nacional and forn.anexo_simples_nacional == "3" else ""),
"NAMEV": geral_util.obter_nome(forn.nome_responsavel_cadastro)[:35],
"NAMES": geral_util.obter_sobrenome(forn.nome_responsavel_cadastro)[:35],
"TEL_NUMBER": forn.fone_fixo,
"PAFKT": "G2",
"BUKRS_DE": "1000",
"BUKRS_ATE": "9998",
"WAERS": "BRL", # 'WAERS': 'BRL', #moeda do pedido
"ERNAM": os.getenv('WSDL_USER'),
"QLAND": "508"
},
"IM_IRF": {
},
"IM_PARCEIRO": {
}
}
return self.enviar_requisicao_sap(forn, pj, pf, request_api)
def enviar_requisicao_sap(self, forn: PreCadastroFornecedor, pj: PreCadastroFornecedorPj, pf: PreCadastroFornecedorPf, request_api):
self.registrarLogFornecedor('request_api:\n' + str(request_api))
try:
# tem_codigo_sap = geral_util.ok(forn.codigo_sap)
self.registrarLogFornecedor("Carregando wsdl_fornecedores.wsdl")
session = Session()
session.auth = HTTPBasicAuth(os.getenv('WSDL_USER'), os.getenv('WSDL_SENHA'))
client = Client('copel/wsdl_fornecedores.wsdl', transport=Transport(session=session))
result = client.service.Inb_Sync_MM_CadastroFornecedor_PFN_Req(**request_api)
self.registrarLogFornecedor("Obtendo retorno Inb_Sync_MM_CadastroFornecedor_PFN_Req")
self.registrarLogFornecedor(str(result))
if result.CODIGO and result.CODIGO == '99':#se retornar 99, significa validcao por parte do sap
self.registrarLogFornecedor("result.CODIGO: " + str(result.CODIGO))
if result.MSG_ERRO and result.LIFNR == None: # se existir apenas erro e não existir codigo sap, signfica validacao ou erro
self.registrarLogFornecedor("result.MSG_ERRO: " + str(result.MSG_ERRO))
return api_util.HttpErroInterno(result.CODIGO + ': ' + result.MSG_ERRO)
elif result.LIFNR: # caso tenha o código sap, provavelmente o fornecedor já exista e o sap irá retornar o código do fornecedor
forn.codigo_sap = result.LIFNR # setando o código sap dentro do fornecedor
self.registrarLogFornecedor("Atualizando código SAP no banco de dados")
forn = api_util.atualizar_dados_sap(forn, model_util.DICT_SAP_FORNECEDOR, result)
forn.save()
return self.atualizar_sap_tab_cadastro(forn, pj, pf)
else:
self.registrarLogFornecedor("result.MSG_ERRO: Deve ser none")
return api_util.HttpErroInterno(result.CODIGO + ': mensagem não localizada SAP')
if result.CODIGO and result.CODIGO == '00' and result.LIFNR: # se for codigo 00, significa que o fornecedor foi cadastrado/atualiado no sap
forn.codigo_sap = result.LIFNR
self.registrarLogFornecedor("result.CODIGO: " + str(result.CODIGO))
self.registrarLogFornecedor("result.MSG_SUCESSO: " + str(result.MSG_ERRO))
self.registrarLogFornecedor("result.LIFNR: " + str(result.LIFNR))
# if not tem_codigo_sap:
# self.registrarLogFornecedor("Atualizando código SAP no banco de dados")
# forn = api_util.atualizar_dados_sap(forn, model_util.DICT_SAP_FORNECEDOR, result)
# forn.save()
# else:
# self.registrarLogFornecedor("NÃO atualiza código SAP, pois ele já existia ")
dados = self.serializer_class(forn).data
self.registrarLogFornecedor("Resposta: sap final ok ")
return api_util.HttpOK(dados)
except Exception as exc:
self.registrarLogFornecedor("Exception")
self.registrarLogFornecedor(str(exc))
# verificacao da falha ao enviar os dados para o sap
self.handle_exception(exc)
return api_util.HttpErroInterno(str(exc))
def validar_dados_obrigatorios_sap(self, forn: PreCadastroFornecedor, pj: PreCadastroFornecedorPj):
if not geral_util.ok(forn.email):
return False, 'email'
if not geral_util.ok(forn.indicador_pj_pf):
return False, 'indicador_pj_pf'
is_pj = forn.indicador_pj_pf.strip() == 'PJ'
if is_pj and not geral_util.ok(pj.inscricao_estadual):
return False, 'inscricao_estadual'
if is_pj and not geral_util.ok(forn.nome_responsavel_cadastro):
return False, 'nome_responsavel_cadastro'
if not geral_util.ok(forn.nome_fantasia):
return False, 'nome_fantasia'
if not geral_util.ok(forn.endereco_logradouro):
return False, 'endereco_logradouro'
if not geral_util.ok(forn.endereco_bairro):
return False, 'endereco_bairro'
if not geral_util.ok(forn.cidade):
return False, 'cidade'
if not geral_util.ok(forn.cep):
return False, 'cep'
if not geral_util.ok(forn.uf):
return False, 'uf'
if not geral_util.ok(forn.fone_fixo):
return False, 'fone_fixo'
if not geral_util.ok(forn.cpf_cnpj):
return False, 'cpf_cnpj'
if not geral_util.ok(forn.anexo_simples_nacional):
return False, 'anexo_simples_nacional'
return True, None
class FornecedorPreCadastroView(viewsets.ModelViewSet):
serializer_class = FornecedorSerialized
search_fields = ['nome_fantasia', 'cpf_cnpj', 'nome_responsavel_cadastro']
filter_backends = [SearchFilter]
queryset = PreCadastroFornecedor.objects.all().order_by('nome_fantasia')
http_method_names = ['post', 'options']
authentication_classes = []
def update(self, request, *args, **kwargs):
raise Exception('Fornecedor não pode ser atualizado por esse path')
def destroy(self, request, *args, **kwargs):
raise Exception('Fornecedor não pode ser deletado por esse path')
def get_queryset(self):
situacao = self.request.query_params.get('situacao')
etapa = self.request.query_params.get('etapa')
if situacao:
situacao = situacao.replace('/', '')
if etapa:
etapa = etapa.replace('/', '')
if situacao and etapa:
queryset = PreCadastroFornecedor.objects.filter(situacao_cadastro=situacao, etapa_cadastro=etapa).order_by(
'nome_fantasia')
elif situacao:
queryset = PreCadastroFornecedor.objects.filter(situacao_cadastro=situacao).order_by('nome_fantasia')
elif etapa:
queryset = PreCadastroFornecedor.objects.filter(etapa_cadastro=etapa).order_by('nome_fantasia')
else:
queryset = PreCadastroFornecedor.objects.all().order_by('nome_fantasia')
return queryset
def listar_tipo_atividades(self, request: Request) -> Response:
lista = []
lista.append({'id': 0, 'nome': 'Prestador de serviços'})
lista.append({'id': 1, 'nome': 'Fornecedor de materiais'})
return api_util.HttpOK(lista)
def status(self, request: Request, cnpj) -> Response:
objects = PreCadastroFornecedor.objects.filter(cpf_cnpj=cnpj)[0:1]
dados = self.serializer_class(objects, many=True).data
if len(dados) == 0:
return api_util.HttpOK("ERRO: Não existe um fornecedor com o cnpj: " + cnpj)
return api_util.HttpOK(str(dados[0]['etapa_cadastro']))
class DocumentoVinculoView(viewsets.ModelViewSet):
parser_classes = (MultiPartParser, FormParser)
serializer_class = DocumentoVinculoSerialized
filter_backends = [SearchFilter]
queryset = DocumentoVinculadoFornecedor.objects.all()
def create(self, request, *args, **kwargs):
raise Exception('Documentos não são criados nesse endpoint')
def enviar_conteudo_documento(self, request: Request):
json = request.data
id_tipo_documento = json['documento_id']
fornecedor_id = json['fornecedor_id'] if 'fornecedor_id' in json else None
numero_contrato = json['numero_contrato'] if 'numero_contrato' in json else None
id_dvf = json['dvf_id'] if 'dvf_id' in json else None
arquivo = json['url'].file.read()
nome = json['url'].name
return self.enviar_conteudo_documento_stg(id_dvf, id_tipo_documento, fornecedor_id, numero_contrato, arquivo,
nome, 'P')
def enviar_conteudo_documento_v2(self, request: Request, fornecedor_id, label_tipo_doc) -> Response:
try:
id_tipo_documento = tipo_documento_util.obter_id_por_label(label_tipo_doc)
arquivo = request.read()
nome = label_tipo_doc + '.pdf'
id_dvf = None
return self.enviar_conteudo_documento_stg(id_dvf, id_tipo_documento, fornecedor_id, None, arquivo, nome,
'R', label_tipo_doc)
except Exception as e:
return api_util.HttpErroInterno('ERRO NO V2: ' + str(e))
def enviar_conteudo_documento_stg(self, id_dvf, id_tipo_documento, fornecedor_id, numero_contrato, arquivo, nome,
enviado_por, label_tipo_doc='sem_label'):
if id_dvf is not None:
dvf = DocumentoVinculadoFornecedor.objects.get(pk=id_dvf)
else:
if fornecedor_id is not None and numero_contrato is not None:
raise Exception('Enviar o parâmetro fornecedor_id ou numero_contrato')
if fornecedor_id is not None:
condicional = Q(documento_id=id_tipo_documento) & Q(fornecedor_id=fornecedor_id) & Q(
numero_contrato__isnull=True) & Q(versao_atual=True)
elif numero_contrato is not None:
condicional = Q(documento_id=id_tipo_documento) & Q(numero_contrato=numero_contrato) & Q(
versao_atual=True)
else:
raise Exception('Enviar o parâmetro fornecedor_id ou numero_contrato')
dvf = DocumentoVinculadoFornecedor.objects.filter(condicional).first()
if dvf is None:
s_id_tipo_documento = 'None' if id_tipo_documento is None else str(id_tipo_documento)
s_fornecedor = 'None' if fornecedor_id is None else str(fornecedor_id)
s_numero_contrato = 'None' if numero_contrato is None else str(numero_contrato)
s_dvf_id = 'None' if id_dvf is None else str(id_dvf)
info_erro = 'id_dvf: ' + s_dvf_id + 'id_tipo_documento: ' + s_id_tipo_documento + ' | fornecedor_id: ' + s_fornecedor + ' | numero_contrato: ' + s_numero_contrato + ' | label_tipo_doc: ' + label_tipo_doc
return api_util.HttpBadRequest(
'Não foi encontrado um documento desse tipo para esse fornecedor: ' + info_erro)
if ambiente_util.is_local_ou_dev():
if dvf.token_stg is not None and (dvf.status == 3 or dvf.status == 4):
raise Exception(
'O documento já foi validado ou recusado e não pode ser alterado, crie uma nova versão de documento')
status_documento = 2
arquivo_stg_dev = geral_util.obter_arquivo_stg_dev(dvf.num_seq_dovf)
geral_util.salvar_bytes(arquivo_stg_dev, arquivo)
dvf.token_stg = 'SALVO_DEV'
dvf.enviado_por = enviado_por
dvf.status = status_documento
dvf.save()
documento_ng.tratar_despacho_alteracao_status(dvf, status_documento, '')
resultado = 'OK'
else:
resultado = integracao.stg_enviar_arquivo(arquivo, nome, dvf=dvf, enviado_por=enviado_por)
if resultado == 'OK':
return api_util.HttpOK('OK')
else:
return api_util.HttpErroInterno(resultado)
def stg_download(self, request: Request, codigo_doc) -> Response:
if ambiente_util.is_local_ou_dev():
arquivo_stg_dev = geral_util.obter_arquivo_stg_dev(codigo_doc)
arquivo = geral_util.obter_bytes(arquivo_stg_dev)
else:
arquivo = integracao.stg_download_arquivo(codigo_doc)
if type(arquivo) is str:
return api_util.HttpErroInterno(arquivo)
http_res = HttpResponse(arquivo, content_type='application/pdf')
http_res['Content-Disposition'] = 'attachment; filename=arquivo.pdf'
http_res['Content-Length'] = len(arquivo)
http_res['Access-Control-Allow-Origin'] = '*'
http_res['Access-Control-Allow-Methods'] = 'DELETE, GET, OPTIONS, PATCH, POST, PUT'
http_res[
'Access-Control-Allow-Headers'] = 'accept, accept-encoding, authorization, content-type, dnt, origin, user-agent, x-csrftoken, x-requested-with'
http_res['Access-Control-Allow-Age'] = '86400'
return http_res
def nome_arquivo(self, request: Request) -> Response:
caminho = os.path.abspath('copel/wsdl_contratos.wsdl')
return api_util.HttpOK(caminho + ' - existe = ' + str(os.path.isfile('copel/wsdl_contratos.wsdl')))
def contar_documentos_pendentes(self, request: Request, fornecedor_id) -> Response:
qtd = fornecedor_ps.contar_documentos_pendentes(fornecedor_id)
return api_util.HttpOK(str(qtd))
def contar_contratos_com_documentos_pendentes(self, request: Request, fornecedor_id) -> Response:
qtd = fornecedor_ps.contar_contratos_com_documentos_pendentes(fornecedor_id)
return api_util.HttpOK(str(qtd))
def contar_contratos_ativos(self, request: Request, codigo_sap) -> Response:
qtd = fornecedor_ps.contar_contratos_ativos(codigo_sap)
return api_util.HttpOK(str(qtd))
def listar_contratos_com_documentos_pendentes(self, request: Request, fornecedor_id) -> Response:
lista = fornecedor_ps.listar_contratos_com_documentos_pendentes(fornecedor_id)
return api_util.HttpOK(lista)
def montar_retorno_contrato_fornecedor(self, lista_pag) -> Response:
lista = []
for dado in lista_pag['data']:
lista.append({'contrato': dado['contrato'], 'fornecedor_id': dado['fornecedor_id']})
lista_final = []
lista_id_fornecedor = []
for item in lista:
lista_id_fornecedor.append(item['fornecedor_id'])
condicional = Q(num_seq_pcfnr__in=lista_id_fornecedor)
objects = PreCadastroFornecedor.objects.filter(condicional).order_by('nome_fantasia')
lista_fornecedores = FornecedorListagemSerialized(objects, many=True).data
dict_idfornecedor_fornecedor = {}
for fornecedor in lista_fornecedores:
dict_idfornecedor_fornecedor[fornecedor['num_seq_pcfnr']] = fornecedor
for item in lista:
fornecedor_id = item['fornecedor_id']
numero_contrato = item['contrato']
fornecedor = dict_idfornecedor_fornecedor[fornecedor_id]
dict_final = {
'contrato': {'numero_contrato': numero_contrato},
'fornecedor': fornecedor
}
lista_final.append(dict_final)
json = {
'metadata': lista_pag['metadata'],
'data': lista_final
}
return api_util.HttpOK(json)
def listar_pag_contratos(self, request: Request, somente_do_gestor_logado) -> Response:
offset, limit = api_util.obter_parametros_paginacao(request)
filtro = api_util.obter_parametro_search(request)
somente_gestor_logado = somente_do_gestor_logado.lower() == 'true'
login = None
if somente_gestor_logado:
login = login_ng.obter_login(request)
lista_pag = fornecedor_ps.listar_pag_contratos(filtro, login, offset, limit)
return self.montar_retorno_contrato_fornecedor(lista_pag)
def listar_pag_contratos_com_documentos_pendentes(self, request: Request, somente_do_gestor_logado) -> Response:
offset, limit = api_util.obter_parametros_paginacao(request)
filtro = api_util.obter_parametro_search(request)
somente_gestor_logado = somente_do_gestor_logado.lower() == 'true'
login = None
if somente_gestor_logado:
login = login_ng.obter_login(request)
lista_pag = fornecedor_ps.listar_pag_contratos_com_documentos_pendente(filtro, login, offset, limit)
return self.montar_retorno_contrato_fornecedor(lista_pag)
def listar_pag_fornecedor_documento_pendente(self, request: Request, somente_do_gestor_logado) -> Response:
offset, limit = api_util.obter_parametros_paginacao(request)
filtro = api_util.obter_parametro_search(request)
somente_gestor_logado = somente_do_gestor_logado.lower() == 'true'
login = None
if somente_gestor_logado:
login = login_ng.obter_login(request)
lista_pag = fornecedor_ps.listar_pag_id_fornecedor_documento_pendente_fc(filtro, login, offset, limit)
lista_id = []
for dado in lista_pag['data']:
lista_id.append(dado['id'])
lista_fornecedores = []
if len(lista_id) > 0:
condicional = Q(num_seq_pcfnr__in=lista_id)
objects = PreCadastroFornecedor.objects.filter(condicional).order_by('nome_fantasia')
lista_fornecedores = FornecedorListagemSerialized(objects, many=True).data
json = {
'metadata': lista_pag['metadata'],
'data': lista_fornecedores
}
return api_util.HttpOK(json)
def gerar_extrato_fornecedor(self, request: Request, fornecedor_id) -> Response:
s_data = api_util.obter_parametro(request, 'data')
if s_data is not None:
try:
data = datetime.strptime(s_data, '%Y-%m-%d')
except:
raise Exception("Formato de Data inválido")
extrato = extrato_fornecedor_ng.consultar_extrato(fornecedor_id, data)
if extrato is not None:
extrato = geral_util.to_string(extrato)
extrato = json_api.loads(extrato)
else:
extrato = extrato_fornecedor_ng.gerar_extrato(fornecedor_id)
if extrato is None:
return api_util.HttpBadRequest('Não existe histórico nessa data para esse fornecedor')
return api_util.HttpOK(extrato)
# Gera lista de extrato de todos fornecedores, ou dos fornecedores que atendam ao filtro
def gerar_extrato_fornecedores(self, request: Request) -> Response:
offset, limit = api_util.obter_parametros_paginacao(request)
filtro = api_util.obter_parametro_search(request)
fornecedores = fornecedor_ps.listar_id_fornecedores(filtro=filtro, offset=offset, limit=limit)
extratos = []
for fornecedor in fornecedores['data']:
extrato = extrato_fornecedor_ng.gerar_extrato(fornecedor['id'])
extrato[0]['id_fornecedor'] = fornecedor['id']
extrato[0]['codigo_sap'] = fornecedor['codigo_sap']
extrato[0]['cpf_cnpj'] = fornecedor['cpf_cnpj']
extratos.append(extrato)
json = {
'metadata': fornecedores['metadata'],
'data': extratos
}
return api_util.HttpOK(json)
def notificar_pendencias_contrato(self, request, num_contrato):
fornecedor_ng.preparar_notificacao_pendencias_contrato(num_contrato)
return api_util.HttpOK('Pendencia Notificada.')
class FornecedorVincularGrupoDocumentoView(viewsets.ViewSet):
def salvar_datas(self, request: Request, documento_id):
json = request.data
dvf = DocumentoVinculadoFornecedor.objects.get(num_seq_dovf=documento_id)
if dvf is None:
return api_util.HttpBadRequest('Não foi encontrado um documento com esse id: ' + str(documento_id))
dvf.dt_validade = geral_util.to_date_django(json['dt_validade'])
dvf.dt_emissao = geral_util.to_date_django(json['dt_emissao'])
dvf.save()
return api_util.HttpOK('OK')
def salvar_status(self, request: Request, documento_id, status):
json = request.data
dvf = DocumentoVinculadoFornecedor.objects.get(num_seq_dovf=documento_id)
if dvf is None:
return api_util.HttpBadRequest('Não foi encontrado um documento com esse id: ' + str(documento_id))
descricao_adicional = json['corpo_email_adicional'] if 'corpo_email_adicional' in json else ''
if status == 4 and descricao_adicional != '':
dvf.justificativa_recusa = descricao_adicional
dvf.status = status
dvf.save()
corpo_email_adicional = json['corpo_email_adicional'] if 'corpo_email_adicional' in json else ''
documento_ng.tratar_despacho_alteracao_status(dvf, status, corpo_email_adicional)
return api_util.HttpOK('OK')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment