Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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')
Esempio n. 4
0
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'
        }
Esempio n. 5
0
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'
    }
Esempio n. 6
0
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'
    }
Esempio n. 7
0
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'
    }
Esempio n. 8
0
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'
    }