Example #1
0
    def atualizar_estoque(self, request, pedido):
        erros = False
        lista_prod_estocado = []
        lista_itens_saida = []

        # Gerar o ProdutoEstocado e ItensMovimento para cada produto com controle_estoque=True
        # Modificar o valor de estoque_atual de cada produto
        for item in pedido.itens_venda.all():
            if item.produto.controlar_estoque:
                try:
                    prod_estocado = ProdutoEstocado.objects.get(
                        local=pedido.local_orig, produto=item.produto)
                    if item.quantidade > item.produto.estoque_atual:
                        erros = True
                        messages.warning(request, 'Aviso: A venda não pode ser faturada. O estoque atual do produto ' + str(item.produto.descricao)
                                         + ' é de apenas ' + str(item.produto.estoque_atual))
                    elif item.quantidade > prod_estocado.quantidade:
                        erros = True
                        messages.warning(request, 'Aviso: A venda não pode ser faturada. O estoque atual do produto ' + str(item.produto.descricao) +
                                         ' no local ' + str(pedido.local_orig) + ' é de apenas ' + str(prod_estocado.quantidade))
                    elif not erros:
                        item_mvmt = ItensMovimento()
                        item_mvmt.produto = item.produto
                        item_mvmt.quantidade = item.quantidade
                        item_mvmt.valor_unit = item.valor_unit
                        item_mvmt.subtotal = item.vprod
                        lista_itens_saida.append(item_mvmt)

                        prod_estocado.produto.estoque_atual -= item.quantidade
                        prod_estocado.quantidade -= item.quantidade
                        lista_prod_estocado.append(prod_estocado)

                except ProdutoEstocado.DoesNotExist:
                    erros = True
                    messages.warning(request, 'Aviso: A venda não pode ser faturada. O estoque atual do produto ' + str(item.produto.descricao) +
                                     ' no local ' + str(pedido.local_orig) + ' é 0,00')

        # Salvar se nao ocorreu erros
        if not erros:
            saida_estoque = SaidaEstoque()
            saida_estoque.data_movimento = pedido.data_entrega
            saida_estoque.quantidade_itens = pedido.itens_venda.count()
            saida_estoque.observacoes = 'Saída de estoque pelo pedido de venda nº{}'.format(
                str(pedido.id))
            saida_estoque.tipo_movimento = u'1'
            saida_estoque.valor_total = pedido.get_total_produtos_estoque()
            saida_estoque.pedido_venda = pedido
            saida_estoque.local_orig = pedido.local_orig

            saida_estoque.save()

            for i in lista_itens_saida:
                i.movimento_id = saida_estoque
                i.save()

            for p in lista_prod_estocado:
                p.produto.save()
                p.save()

        return erros
Example #2
0
    def get(self, request, *args, **kwargs):
        compra_id = kwargs.get('pk', None)
        pedido = PedidoCompra.objects.get(id=compra_id)
        lista_prod_estocado = []
        lista_itens_entrada = []

        if pedido.movimentar_estoque:
            for item in pedido.itens_compra.all():
                if item.produto.controlar_estoque:
                    prod_estocado = ProdutoEstocado.objects.get_or_create(
                        local=pedido.local_dest, produto=item.produto)[0]
                    item_mvmt = ItensMovimento()

                    prod_estocado.produto.estoque_atual += item.quantidade
                    prod_estocado.quantidade += item.quantidade

                    item_mvmt.produto = item.produto
                    item_mvmt.quantidade = item.quantidade
                    item_mvmt.valor_unit = item.valor_unit
                    item_mvmt.subtotal = item.vprod

                    lista_prod_estocado.append(prod_estocado)
                    lista_itens_entrada.append(item_mvmt)

            entrada_estoque = EntradaEstoque()
            if pedido.data_entrega:
                entrada_estoque.data_movimento = pedido.data_entrega
            else:
                entrada_estoque.data_movimento = datetime.now().date()

            entrada_estoque.quantidade_itens = pedido.itens_compra.count()
            entrada_estoque.observacoes = 'Entrada de estoque pelo pedido de compra nº{}'.format(
                str(pedido.id))
            entrada_estoque.tipo_movimento = u'1'
            entrada_estoque.valor_total = pedido.get_total_produtos_estoque()
            entrada_estoque.pedido_compra = pedido
            entrada_estoque.local_dest = pedido.local_dest

            entrada_estoque.save()

            for i in lista_itens_entrada:
                i.movimento_id = entrada_estoque
                i.save()

            for p in lista_prod_estocado:
                p.produto.save()
                p.save()

        pedido.status = u'4'
        pedido.save()

        messages.success(
            request,
            "<b>Pedido de compra {0} </b>recebido com sucesso.".format(
                str(pedido.id)))

        return redirect(reverse_lazy('compras:listapedidocompraview'))
Example #3
0
    def post(self, request, *args, **kwargs):
        self.object = None
        # Tirar . dos campos decimais
        req_post = request.POST.copy()

        for key in req_post:
            if ('venda' in key or
                'custo' in key or
                'estoque_minimo' in key or
                    'estoque_atual' in key):
                req_post[key] = req_post[key].replace('.', '')

        if 'EX:' in req_post['ncm']:
            ncm = req_post['ncm'][0:8]
            ex_start = req_post['ncm'].find('EX:') + 3
            ex_end = req_post['ncm'].find(']')
            ex_tipi = req_post['ncm'][ex_start:ex_end]
            req_post['ncm'] = ncm + ex_tipi

        request.POST = req_post

        form_class = self.get_form_class()
        form = self.get_form(form_class)

        if form.is_valid():
            self.object = form.save(commit=False)

            if self.object.controlar_estoque and form.cleaned_data['estoque_inicial'] > 0:
                # Gerar movimento de estoque inicial
                mov_inicial = EntradaEstoque()
                item_entrada = ItensMovimento()
                prod_estocado = ProdutoEstocado()

                mov_inicial.data_movimento = datetime.now().date()
                mov_inicial.quantidade_itens = 1
                mov_inicial.tipo_movimento = u'3'
                mov_inicial.observacoes = ''
                mov_inicial.valor_total = round(
                    self.object.venda * form.cleaned_data['estoque_inicial'], 2)

                if form.cleaned_data['fornecedor']:
                    mov_inicial.fornecedor = Fornecedor.objects.get(
                        id=form.cleaned_data['fornecedor'])
                if form.cleaned_data['local_dest']:
                    mov_inicial.local_dest = form.cleaned_data['local_dest']

                item_entrada.quantidade = form.cleaned_data['estoque_inicial']
                item_entrada.valor_unit = self.object.venda
                item_entrada.subtotal = mov_inicial.valor_total

                prod_estocado.local = mov_inicial.local_dest
                prod_estocado.quantidade = form.cleaned_data['estoque_inicial']

                self.object.estoque_atual = form.cleaned_data[
                    'estoque_inicial']
                self.object.save()
                mov_inicial.save()

                item_entrada.movimento_id = mov_inicial
                item_entrada.produto = self.object
                item_entrada.save()

                prod_estocado.produto = self.object
                prod_estocado.save()

            else:
                self.object.save()

            return self.form_valid(form)

        return self.form_invalid(form)
Example #4
0
    def post(self, request, *args, **kwargs):
        self.object = None
        # Tirar . dos campos decimais
        req_post = request.POST.copy()

        for key in req_post:
            if ('venda' in key or 'custo' in key or 'estoque_minimo' in key
                    or 'estoque_atual' in key):
                req_post[key] = req_post[key].replace('.', '')

        if 'EX:' in req_post['ncm']:
            ncm = req_post['ncm'][0:8]
            ex_start = req_post['ncm'].find('EX:') + 3
            ex_end = req_post['ncm'].find(']')
            ex_tipi = req_post['ncm'][ex_start:ex_end]
            req_post['ncm'] = ncm + ex_tipi

        request.POST = req_post

        form_class = self.get_form_class()
        form = self.get_form(form_class)
        acomodacao_form = ProdutoAcomodacaoFormSet(request.POST,
                                                   prefix='acomodacao_form')
        cidade_form = ProdutoCidadeFormSet(request.POST, prefix='cidade_form')
        documento_form = DocumentoProdutoFormSet(request.POST,
                                                 request.FILES,
                                                 prefix='documento_form')

        formsets = [acomodacao_form, cidade_form]

        if form.is_valid():
            self.object = form.save(commit=False)

            if self.object.controlar_estoque and form.cleaned_data[
                    'estoque_inicial'] > 0:
                # Gerar movimento de estoque inicial
                mov_inicial = EntradaEstoque()
                item_entrada = ItensMovimento()
                prod_estocado = ProdutoEstocado()

                mov_inicial.data_movimento = datetime.now().date()
                mov_inicial.quantidade_itens = 1
                mov_inicial.tipo_movimento = u'3'
                mov_inicial.observacoes = ''
                mov_inicial.valor_total = round(
                    self.object.venda * form.cleaned_data['estoque_inicial'],
                    2)

                if form.cleaned_data['fornecedor']:
                    mov_inicial.fornecedor = Fornecedor.objects.get(
                        id=form.cleaned_data['fornecedor'])
                if form.cleaned_data['local_dest']:
                    mov_inicial.local_dest = form.cleaned_data['local_dest']

                item_entrada.quantidade = form.cleaned_data['estoque_inicial']
                item_entrada.valor_unit = self.object.venda
                item_entrada.subtotal = mov_inicial.valor_total

                prod_estocado.local = mov_inicial.local_dest
                prod_estocado.quantidade = form.cleaned_data['estoque_inicial']

                self.object.estoque_atual = form.cleaned_data[
                    'estoque_inicial']
                self.object.save()
                mov_inicial.save()

                item_entrada.movimento_id = mov_inicial
                item_entrada.produto = self.object
                item_entrada.save()

                prod_estocado.produto = self.object
                prod_estocado.save()

            else:
                if (all(formset.is_valid() for formset in formsets)
                        and acomodacao_form.is_valid()
                        and cidade_form.is_valid()):
                    self.object.save()
                    form.save_m2m()

                    acomodacao_form.instance = self.object
                    acom = acomodacao_form.save()

                    cidade_form.instance = self.object
                    cid = cidade_form.save()

                if documento_form.is_valid():
                    documentos = documento_form.save(commit=False)
                    for documento in documentos:
                        documento.save()
                        self.object.documentos.add(documento)

            return self.form_valid(form)

        return self.form_invalid(form)