def importar(): """ Faz a importação das categorias criadas no site para serem usadas no envio de novos produtos """ template = 'categorias/importar/form-importar.html' categorias = MagCategorias.by(parent_id=2) form = ImportarCategoriaForm() config = ConfigMagento.by_id(1) has_cat_default = config.categoria_default if config else None if form.validate_on_submit() and has_cat_default: Log.info(f'[CATEGORIAS] Iniciando a atualização das Categorias.') registrar_categorias() Log.info(f'[CATEGORIAS] Atualização das Categorias finalizado.') result = { 'title': 'Categorias', 'subtitle': 'Importar do Site', 'categorias': categorias, 'has_cat_default': has_cat_default, 'tasks': True, 'form': form } return render_template(template, **result)
def enviar_imagem(): """ Envia as imagens dos produtos """ template = 'produtos/form-enviar-imagem.html' if current_app.config['UPLOADS_DEFAULT_URL'] is None: warning('A URL Base do Sistema não está configurada. ' + 'Configure-a para que as imagens possam ser salvas.') return redirect(url_for('integrador.produtos_enviar_imagem')) if request.method == 'POST': import os import glob base_path = os.getcwd() + '/uploads/photos/' imagem = request.files['file'] nome = imagem.filename sku = int(nome.split('.')[0]) filepath = base_path + nome if nome == '': return 'Nenhuma Imagem Foi Selecionada', 400 if nome.rfind('.') == -1: return 'O arquivo informado não possui extensão definida', 400 ext = nome.split('.')[1].lower() if not imageSet.extension_allowed(ext): return 'A extensão informada não é válida', 400 if not validar_nome_imagem(nome): return 'O nome da imagem precisa ser um codigo válido', 400 # verifca se ja existe alguma imagem na pasta deste item # pegando o sku do item e iterando na pasta de destino, verificando # se existe alguma imagem e a removendo path = os.path.dirname(filepath) if os.path.exists(path): for im in glob.glob(os.path.join(path, f'{sku}*.*')): os.remove(os.path.join(path, im)) image = imageSet.save(imagem) image = base_path + image genImage(image, image) # busca o cadastro do produto e se existir altera para atualizar imagem produto = MagProduto.by(sku=sku) if produto: produto.atualiza_imagem = True produto.possui_imagem = True produto.update() Log.info(f'[ENVIAR IMAGEM] Enviado Imagem do produto {nome}.') result = {'title': 'Produtos', 'subtitle': 'Enviar Imagens'} return render_template(template, **result)
def atualizar_base(produtos): """ recebe um lista dos produtos do site e atualiza a base do sistema """ Log.info('[ATUALIZA BASE] Iniciando a atualização da base') for p in produtos: sku = p['sku'] if sku.isdigit(): sku = int(sku) mag_produto = MagProduto.by(sku=sku) produto_ciss = CissProdutoGrade.by(idsubproduto=sku) if not mag_produto and produto_ciss: Log.info(f'[ATUALIZA BASE] Registrando o item {sku}') try: produto_site = productInfo(sku) except Exception: continue mag_produto = MagProduto() mag_produto.sku = sku mag_produto.idsecao = produto_site['categories'][0] mag_produto.idgrupo = produto_site['categories'][1] mag_produto.idsubgrupo = produto_site['categories'][2] mag_produto.atualiza_imagem = False mag_produto.possui_imagem = True mag_produto.update() Log.info('[ATUALIZA BASE]------ Registrado no Integrador') # salva no erp verificando se esta ativo no site status = produto_site['status'] produto_ciss.idmodelo = 4 produto_ciss.idtipo = 2 if status == '1' else 3 produto_ciss.update() Log.info('[ATUALIZA BASE]------ Registrado no ERP') Log.info('[ATUALIZA BASE] Atualização da base Finalizada')
def atualiza_imagem_task(self): """ Usado para atualizar as imagens de produtos que ja estão no site """ with app.app_context(): Log.info(f'[IMAGENS] Iniciando o envio dos produtos.') db.engine.dispose() produtos = MagProduto.query.filter( MagProduto.atualiza_imagem == True ).all() imagens = read_images() concluidos = 0 erros_count = 0 erros = [] count = 0 total = len(produtos) for p in produtos: Log.info(f'[IMAGENS] Iniciando o envio do item {p.sku}.') self.update_state( state='PROGRESS', meta={ 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': count, 'total': total, 'status': f'Enviando o produto {p.sku}' } ) try: imagem = imagens.get(p.sku, None) nome_imagem = str(p.sku) if not imagem: Log.info(f'[IMAGENS]------ Produto sem imagem') count += 1 continue imagens_site = listImage( p.sku ) # verifca se o produto possui imagens para serem excluidas # antes de enviar a nova if imagens_site: for im in imagens_site: # se ao tentar excluir a imagem gerar a exceção de que # a imagem nao existe na galeria do produto salva como # erro para ser exida ao usuario try: removeImage( p.sku, im['file'], ) except Fault as e: pass # se existir imagens altera o nome para adcionar um contador # exemplo: 13504_6 nome_imagem = f'{nome_imagem}_{len(imagens_site) + 1}' updateImage( imagem, nome_imagem, str(p.sku) ) Log.info(f'[IMAGENS]------ Imagem enviada com sucesso') p.atualiza_imagem = False p.update() Log.info(f'[IMAGENS]------ Produto Atulizado no Integrador') concluidos += 1 except Exception as e: erros_count += 1 erros.append(f'Produto: {p.sku} -------- Erro: {e}') Log.error( f'[IMAGENS] Erro ao enviar o produto {p.sku} erro: {e}') count += 1 Log.info(f'[IMAGENS] Envio de produtos finalizado.') return { 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': total, 'total': total, 'status': 'complete' }
def inativar_task(self): """ cria uma tarefa para atualizar os produtos inativos no site Raises ----------- Fault<sku já existe no site> Exceção lançada quando o produto já existe no site """ with app.app_context(): Log.info(f'[INATIVAR] Iniciando o envio dos produtos.') db.engine.dispose() config = ConfigMagento.by_id(1) dthr_sincr = datetime.now() produtos_erp = buscar_produtos_inativos() # produtos = converte_produto_inativo(produtos) # Variáveis utilizadas para atualizar a barra de # progresso na tela do usuário concluidos = 0 erros_count = 0 erros = [] count = 0 total = len(produtos_erp) for produto_erp in produtos_erp: sku = produto_erp.idsubproduto self.update_state( state='PROGRESS', meta={ 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': count, 'total': total, 'status': f'Enviando o produto {sku}' } ) try: Log.info(f'[INATIVAR] Iniciando o envio do item {sku}.') mag_produto = converte_produto_inativo(produto_erp) updateProduct( mag_produto['sku'], mag_produto['data'] ) Log.info(f'[INATIVAR]------ Enviado para o site') # pega o tipo e se esta inativo do ERP tipo, inativo = produto_erp.idtipo, produto_erp.flaginativo # verifica se o produto foi ativado ou inativado no site if tipo == 2 and inativo == 'T': produto_erp.idtipo = 3 elif tipo == 3 and inativo == 'F': produto_erp.idtipo = 2 produto_erp.update() Log.info(f'[INATIVAR]------ Gravado no ERP.') concluidos += 1 except Exception as e: erros_count += 1 erros.append(f'Produto: {sku} -------- Erro: {e}') Log.error( f'[INATIVAR] Erro ao enviar o produto {sku} erro: {e}') count += 1 Log.info(f'[INATIVAR] Envio de produtos finalizado.') Log.info(f'[INATIVAR] Salvando data e hora da sincronização.') config.dtsincr_inativos = dthr_sincr config.update() return { 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': total, 'total': total, 'status': 'complete' }
def atualiza_promocoes_task(self): """ cria uma tarefa para atualizar as promoções dos produtos no site Raises ----------- Fault<sku já existe no site> Exceção lançada quando o produto já existe no site """ Log.info(f'[PROMOÇÃO] Iniciando o envio dos produtos.') config = ConfigMagento.by_id(1) dthr_sincr = datetime.now() produtos = buscar_produtos_promocao(dthr_sincr=config.dtsincr_promocao) produtos = converte_produtos_promocao(produtos) concluidos = 0 erros_count = 0 erros = [] count = 0 total = len(produtos) for p in produtos: self.update_state( state='PROGRESS', meta={ 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': count, 'total': total, 'status': f'Enviando o produto {p["sku"]}' } ) try: Log.info(f'[PROMOÇÃO] Iniciando o envio do item {p["sku"]}.') updateProduct( p['sku'], p['data'] ) Log.info(f'[PROMOÇÃO]------ Enviado para o site') concluidos += 1 except Exception as e: erros_count += 1 erros.append(f'Produto: {p["sku"]} -------- Erro: {e}') Log.error( f'[PROMOÇÃO] Erro ao enviar o produto {p["sku"]} erro: {e}') count += 1 Log.info(f'[PROMOÇÃO] Envio de produtos finalizado.') Log.info(f'[PROMOÇÃO] Salvando data e hora da sincronização.') with app.app_context(): db.engine.dispose() # corrigi o erro do postgres config.dtsincr_promocao = dthr_sincr config.update() return { 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': total, 'total': total, 'status': 'complete' }
def enviar_novos_task(self, produtos): """ cria uma tarefa para enviar os produtos no site Params ----------- produtos <dict> onde a chave é o código do produto e o valor é a lista com as categorias dos produtos. Raises ----------- Fault<sku já existe no site> Exceção lançada quando o produto já existe no site """ Log.info(f'[NOVOS] Iniciando o envio dos produtos.') imagens = read_images().keys() concluidos = 0 erros_count = 0 erros = [] count = 0 total = len(produtos) with app.app_context(): db.engine.dispose() for sku, categorias in produtos.items(): self.update_state( state='PROGRESS', meta={ 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': count, 'total': total, 'status': f'Enviando o produto {sku}' } ) try: Log.info(f'[NOVOS] Iniciando o envio do item {sku}.') produto_erp = CissProdutoGrade.by(idsubproduto=int(sku)) mag_produto = MagProduto.by(sku=int(sku)) if not mag_produto: mag_produto = MagProduto() mag_produto.sku = produto_erp.idsubproduto mag_produto.idsecao = categorias[0] mag_produto.idgrupo = categorias[1] mag_produto.idsubgrupo = categorias[2] produto = converte_produto_novo(produto_erp, categorias) createProduct( produto['sku'], 'simple', '4', produto['data'] ) updateImage( produto['image'], produto['sku'], produto['sku'] ) Log.info(f'[NOVOS]------ Enviado para o site') # altera o tipo do produto como enviado no erp produto_erp.idtipo = 2 produto_erp.update() # salva se o produto possui imagem ou nao possui_imagem = True if sku in imagens else False mag_produto.atualiza_imagem = False mag_produto.possui_imagem = possui_imagem mag_produto.update() Log.info(f'[NOVOS]------ Gravado no ERP e Integrador') concluidos += 1 except Fault as fault: if fault.faultCode == 1: produto_erp.idtipo = 2 produto_erp.update() erros_count += 1 erros.append(f'Produto: {sku} -------- Erro: {fault}') Log.error( f'[NOVOS] Erro ao enviar o produto {sku} erro: {fault}') except Exception as e: erros_count += 1 erros.append(f'Produto: {sku} -------- Erro: {e}') Log.error( f'[NOVOS] Erro ao enviar o produto {sku} erro: {e}') count += 1 self.update_state( state='PROGRESS', meta={ 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': count, 'total': total, 'status': f'Enviando o produto {sku}' } ) Log.info(f'[NOVOS] Envio de produtos finalizado.') return { 'name': format_task_name(self.name), 'complete': concluidos, 'errors_count': erros_count, 'errors': erros, 'current': total, 'total': total, 'status': 'complete' }
def email_cobranca_task(self, dtinicial, dtfinal): """ Task para enviar os emails de cobranca Params --------- dtinicial: Date Data inicial para buscar as pendencias em aberto para o envio dos email dtfinal: Date Data Final para buscar as pendencias em aberto para o envio dos email """ with app.app_context(): db.engine.dispose() config = ConfigFinanceiro.by_id(1) data_envio = date.today().strftime('%d/%m/%Y') # data de envio do email dtinicial = date(day=dtinicial[0], month=dtinicial[1], year=dtinicial[2]) dtfinal = date(day=dtfinal[0], month=dtfinal[1], year=dtfinal[2]) pendencias = validar_pendencias_enviadas(dtinicial, dtfinal) pendencias = buscar_pendencias_para_email(pendencias) count = 1 total = len(pendencias) Log.info('[CONBRANÇA] Iniciando o envio dos emails') for cliente, dados in pendencias.items(): Log.info(f'[CONBRANÇA] Enviando o email do cliente {cliente}') self.update_state( state='PROGRESS', meta={ 'current': count, 'total': total, 'status': 'Enviando o cliente {}'.format(cliente) } ) assunto = 'Cobrança Automatica' remetente = config.emailremetente bcc = config.emailscc.split(';') if config.emailscc else None pendencias_cliente = dados.get('pendencias') email_cliente = dados.get('email') enviado = True # valida se o(s) email(s) é valido usando validar_email() # e caso seja invalido email=False e mensagem=Motivo destinatarios, mensagem = validar_email(email_cliente) if destinatarios: # utiliza a funcao render_template para gerar o html usado no email # passando os paramametros que serao usados para preencher o html # e depois faz o envio do email utlizando a funcao envia_email # do pacote core.email do sistema html = render_template( 'financeiro/cobranca/email-cobranca/mail-template.html', nome=cliente, data=data_envio, pendencias=pendencias_cliente ) if config.flagteste and bcc: destinatarios = bcc bcc = None enviar_email(assunto, remetente, destinatarios, html, bcc=bcc) Log.info(f'[CONBRANÇA]------ Email enviado com sucesso') else: Log.info(f'[CONBRANÇA]------ Email não enviado. Cliente sem emails válidos') enviado = False # Salva os dados de envio da cobranca em AppEmailEnviadoCobranca # para ficar registrado o que foi enviado e quando para consulta # posterior id_cliente = dados.get('idclifor') # id do cliente no Ciss for p in pendencias_cliente: log_envio = AppEmailEnviadoCobranca.by(titulo=p['titulo']) if not log_envio: log_envio = AppEmailEnviadoCobranca() log_envio.titulo = p['titulo'] log_envio.parcela = p['parcela'] log_envio.dtenvio = data_envio log_envio.dtvencimento = p['vencimento'] log_envio.valor = p['valor'] log_envio.idcliente = id_cliente log_envio.nomecliente = cliente log_envio.email = destinatarios if destinatarios else mensagem log_envio.flagenviado = enviado log_envio.update() Log.info(f'[CONBRANÇA]------ Evento registrado no sistema') count += 1 Log.info('[CONBRANÇA] Envio dos emails finalizado.') return { 'current': total, 'total': total, 'status': 'complete' }