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
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'))
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)
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)