Beispiel #1
0
def converte_produto_novo(item, categorias):
    """
        recebe um produto e suas categorias
        e o converte para Magento Object para ser
        enviado para o site
    """

    stock = Stock()
    stock.qty = item.saldo.qtdatualestoque
    stock.is_in_stock = 1 if stock.qty else 0

    if item.valmultivendas != 1:
        stock.enable_qty_increments = 1
        stock.qty_increments = f'{item.valmultivendas:.2f}'

    attr = Attribute()
    attr.marca = item.produto.fabricante
    attr.codigo_ciss = item.idsubproduto
    attr.multiplicador = '{0:.2f}'.format(float(item.valmultivendas))
    attr.embalagem = str(item.produto.embalagem.descrembalagem)

    nome_produto = '{0} {1} - {2}'.format(item.produto.descrcomproduto,
                                          item.subdescricao,
                                          item.produto.fabricante)
    nome_produto = nome_produto.title()

    product = Product()
    product.sku = item.idsubproduto
    product.name = nome_produto
    product.description = nome_produto
    product.short_description = nome_produto
    product.price = item.preco.valprecovarejo
    product.weight = item.pesoliquido
    product.status = '1'
    product.visibility = '4'
    product.tax_class_id = '0'
    product.stock_data = stock
    product.categories = categorias
    product.additional_attributes = attr

    dt_cadastro = item.dtcadastro
    dt_novo = date.today() + timedelta(-45)

    if dt_cadastro >= dt_novo:
        from_date = str(dt_cadastro)
        to_date = str(dt_cadastro + timedelta(45))
        product.news_from_date = from_date
        product.news_to_date = to_date

    imagens = read_images()
    image = os.getcwd() + '/uploads/photos/sem_imagem.jpg'
    if product.sku in imagens:
        image = imagens[product.sku]

    return {
        'sku': str(item.idsubproduto),
        'data': product.to_soap(),
        'image': image
    }
Beispiel #2
0
def enviar_novos():
    """
        Envia os produtos novos para o site
    """

    template = 'produtos/form-enviar-produtos.html'
    form = EnviarProdutosNovosForm()
    imagens = read_images().keys()

    task = current_app.enviar_novos_task
    clear_task = request.args.get('clear_task', None)
    if clear_task and clear_task == 'yes':
        if task and task.state == 'SUCCESS':
            current_app.enviar_novos_task = task = None
        return redirect(url_for('produtos.enviar_novos'))

    produtos = None
    if not task:
        produtos = buscar_produtos_novos()

    if not produtos and not task:
        warning('Não existem produtos para serem enviados para o site')

    categorias = buscar_categorias_produtos()
    if not categorias:
        warning('Não existem categorias do site cadastradas')

    if form.validate_on_submit() and produtos and categorias:
        produtos_task = {}

        for p in produtos:
            secao = int(request.form.get(f'secao-{p.idsubproduto}', 0))
            grupo = int(request.form.get(f'grupo-{p.idsubproduto}', 0))
            subgrupo = int(request.form.get(f'subgrupo-{p.idsubproduto}', 0))

            if secao and grupo and subgrupo:
                categorias = [secao, grupo, subgrupo]
                produtos_task[p.idsubproduto] = categorias

        task = enviar_novos_task.apply_async(args=(produtos_task, ))
        current_app.enviar_novos_task = task

        success(f'Tarefa iniciada com sucesso')
        return redirect(url_for('produtos.enviar_novos'))

    result = {
        'title': 'Produtos',
        'subtitle': 'Enviar Novos',
        'form': form,
        'imagens': imagens,
        'produtos': produtos,
        'categorias': categorias,
        'task': task
    }
    return render_template(template, **result)
Beispiel #3
0
def listar_nao_enviados():
    """
        Lista os produtos que ainda não foram enviados para o site
    """
    template = 'produtos/lista-produtos-nao-enviados.html'
    produtos = buscar_produtos_nao_enviados()
    imagens = read_images().keys()

    if not produtos:
        warning('Não existem produtos pendentes de serem enviados')

    result = {
        'title': 'Produtos',
        'subtitle': 'Não Enviados',
        'produtos': produtos,
        'imagens': imagens
    }
    return render_template(template, **result)
Beispiel #4
0
def converteProdutos(produtos):
    """
        recebe um lista dos produtos e categorias 
        e a converte para Magento Object para ser
        enviado para o site
    """
    result = {'produtos': [], 'erros': []}

    for p in produtos:
        categoria_produto = MagCategoriaProduto.query
        categoria_produto = categoria_produto.filter_by(sku=p.idsubproduto)
        categoria_produto = categoria_produto.first()

        if not categoria_produto:
            result['erros'].append(
                [p.idsubproduto, 'Produto sem categoria cadastrada'])
            continue

        stock = Stock()
        stock.qty = p.saldo[0].qtdatualestoque
        stock.is_in_stock = 1

        attr = Attribute()
        attr.marca = p.produto.fabricante
        attr.codigo_ciss = p.idsubproduto
        attr.multiplicador = '{0:.2f}'.format(float(p.valmultivendas))
        attr.embalagem = str(p.produto.embalagem.descrembalagem)

        nome_produto = '{0} {1} - {2}'.format(p.produto.descrcomproduto,
                                              p.subdescricao,
                                              p.produto.fabricante)
        nome_produto = nome_produto.title()

        product = Product()
        product.sku = p.idsubproduto
        product.name = nome_produto
        product.description = nome_produto
        product.short_description = nome_produto
        product.price = p.preco[0].valprecovarejo
        product.weight = 1.23
        product.status = 1
        product.visibility = 1
        product.tax_class_id = 0
        product.stock_data = stock
        product.categories = [
            categoria_produto.secao, categoria_produto.grupo,
            categoria_produto.subgrupo
        ]
        product.additional_attributes = attr

        dt_cadastro = p.dtcadastro
        dt_novo = date.today() + timedelta(-45)

        if dt_cadastro >= dt_novo:
            from_date = str(dt_cadastro)
            to_date = str(dt_cadastro + timedelta(45))
            product.news_from_date = from_date
            product.news_to_date = to_date

        imagens = read_images()
        image = os.getcwd() + '/uploads/photos/sem_imagem.jpg'
        if product.sku in imagens:
            image = imagens[product.sku]

        result['produtos'].append({
            'sku': str(p.idsubproduto),
            'produto': p,
            'data': product.to_soap(),
            'image': image
        })

    return result
Beispiel #5
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'
        }
Beispiel #6
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'
    }