Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

ajustes do orçamento

  • Loading branch information...
commit 252b5a5e6532a7fafa69f62924f997ac46cfe2e3 1 parent 12aa9ad
@wpjunior authored
View
BIN  database.db
Binary file not shown
View
51 orcamento/models.py
@@ -2,10 +2,59 @@
import locale
locale.setlocale(locale.LC_ALL, 'pt_BR.utf8')
from django.db import models
-
from MCD.produto.models import Produto
+class Orcamento(models.Model):
+ cliente = models.CharField(
+ verbose_name="Cliente",
+ max_length=250)
+
+ telefone = models.CharField(
+ verbose_name="Telefone",
+ max_length=20,
+ blank=True, null=True)
+
+ endr = models.CharField(
+ verbose_name=u"Endereço",
+ max_length=300,
+ blank=True, null=True)
+
+ condicao_pagto = models.CharField(
+ verbose_name="Condição pagto",
+ max_length=1,
+ default='v',
+ choices=(
+ ('v', "à vista"),
+ ('p', "a prazo"),
+ ('c', "cartão"))
+ )
+
+ data = models.DateTimeField(auto_now=True)
+
+ def get_absolute_url(self):
+ return '/orcamento/%d/' % self.id
+
+ def items(self, *args, **kwargs):
+ return Item.objects.filter(
+ orcamento=self).order_by('-pk')
+
+ def valor_total(self, *args, **kwargs):
+ valor_total = self.items().aggregate(models.Sum(
+ 'valor_total')).get('valor_total__sum', 0)
+
+ if valor_total:
+ if self.condicao_pagto == 'c':
+ valor_total = valor_total * 1.04
+
+ return locale.format(
+ '%0.2f', valor_total, 1)
+
+
class Item(models.Model):
+ orcamento = models.ForeignKey(
+ Orcamento,
+ verbose_name=u"Orçamento")
+
produto = models.ForeignKey(
Produto,
verbose_name="Produto")
View
1  orcamento/output.py
@@ -6,6 +6,7 @@
from django.http import HttpResponse
from django.template.loader import get_template
from django.template import Context
+
import ho.pisa as pisa
try:
View
4 orcamento/static/js/orcamento.js
@@ -62,10 +62,6 @@ $(document).ready(function () {
e.preventDefault();
var data = {
- cliente: $('#id_cliente').val(),
- telefone: $('#id_telefone').val(),
- endr: $('#id_endr').val(),
- cond_pagto: $('#id_cond_pagto').val(),
cmd: 'print_orcamento'
}
View
14 orcamento/templates/orcamento/main.html
@@ -15,7 +15,7 @@
{% block content %}
<div class="page-header">
- <h3>Novo Orçamento</h3>
+ <h3>Orçamento / Pedido</h3>
</div>
<div class="well">
@@ -59,24 +59,20 @@
<div id="form" class="pull-right">
<div class="pull-left">
<label>Cliente</label>
- <input id="id_cliente" type="text" />
+ <input id="id_cliente" type="text" value="{{ object.cliente }}" disabled />
</div>
<div class="pull-left" style="padding-left: 10px">
<label>Telefone</label>
- <input id="id_telefone" type="text" class="input-medium" />
+ <input id="id_telefone" type="text" class="input-medium" value="{{ object.telefone }}" disabled />
</div>
<br clear="all"/>
<div class="pull-left">
<label>Endereço</label>
- <input id="id_endr" type="text" />
+ <input id="id_endr" type="text" value="{{ object.endr }}" disabled />
</div>
<div class="pull-left" style="padding-left: 10px">
<label>Condições pagto</label>
- <select id="id_cond_pagto" class="input-small">
- <option value="v">Á Vista</option>
- <option value="p">A Prazo</option>
- <option value="c">Cartão</option>
- </select>
+ <input id="id_telefone" type="text" class="input-medium" value="{{ object.get_condicao_pagto_display }}" disabled />
</div>
</div>
<br clear="all"/>
View
21 orcamento/templates/orcamento/orcamento_form.html
@@ -0,0 +1,21 @@
+{% extends "base.html" %}
+
+{% block content %}
+<div class="page-header">
+ <h3>
+ {% if object %}Editando{% else %}Adicionando{% endif %} orçamento
+ <small>* são obrigatórios</small>
+ </h3>
+</div>
+
+<form action="." method="POST">
+ {% include "form_snippet.html" %}
+
+ <p class="btn-group">
+ <button type="button" class="btn" onclick="history.go(-1)">
+ Voltar
+ </button>
+ <input type="submit" value="Salvar" class="btn btn-primary"></input>
+ </p>
+</form>
+{% endblock %}
View
52 orcamento/templates/orcamento/orcamento_list.html
@@ -0,0 +1,52 @@
+{% extends "base.html" %}
+{% block title %}Orçamentos{% endblock %}
+{% block header %}
+<script type="text/javascript" src="{{ STATIC_URL }}js/jquery.dataTables.js"></script>
+<script type="text/javascript" src="{{ STATIC_URL }}js/lethus.bootstrapListBuilder.js"></script>
+<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/lethus.bootstrapListBuilder.css" />
+
+<script type="text/javascript">
+$(document).ready( function (e) {
+ $("#list table").listbuilder({iDisplayLength: 100});
+});
+</script>
+
+
+{% endblock %}
+{% block content %}
+<div class="page-header">
+ <h3>Gerenciando orçamentos</h3>
+</div>
+
+<div id="toolbar" class="btn-group">
+ <a id="add-btn" class="btn" href="/orcamento/add/">
+ <i class="icon-plus"></i> Adicionar
+ </a>
+ <a id="edit-btn" class="btn alone-action dblclick" href="/orcamento/update/%d/">
+ <i class="icon-pencil"></i> Editar
+ </a>
+ <a id="delete-btn" class="alone-action btn" href="/orcamento/%d/">
+ <i class="icon-pencil"></i> Produtos
+ </a>
+
+ <a id="edit-btn" class="btn alone-action" href="/orcamento/%d/?cmd=print_orcamento">
+ <i class="icon-print"></i> Imprimir
+ </a>
+</div>
+
+<div id="list">
+ <table cellpadding="0" cellspacing="0" border="0" class="table table-striped table-bordered">
+ <thead>
+ <tr>
+ <th scope="col">ID</th>
+ <th scope="col">Cliente</th>
+ <th scope="col">Data</th>
+ <th scope="col">Valor</th>
+ </tr>
+ </thead>
+ <tbody class="ui-corner-all">
+ </tbody>
+ </table>
+</div>
+
+{% endblock %}
View
30 orcamento/templates/orcamento/pdf.html
@@ -40,35 +40,25 @@ <h1 style="padding: 0px; border: 0px;">DUTRA Materias para construção</h1>
<tbody>
<tr>
<td style="width: 110px;">Cliente</td>
- <td>{{ cliente }}</td>
+ <td>{{ object.cliente }}</td>
<td style="width: 90px;">Tel.</td>
- <td style="width: 150px;">{{ telefone }}</td>
+ <td style="width: 150px;">{{ object.telefone }}</td>
</tr>
<tr>
<td style="width: 110px;">Endereço</td>
- <td colspan="3">{{ endr }}</td>
+ <td colspan="3">{{ object.endr }}</td>
</tr>
<tr>
<td style="width: 110px;">Condições pgto.</td>
<td colspan="3">
- {% if cond_pagto == 'v' %}
- Á vista
- {% endif %}
-
- {% if cond_pagto == 'p' %}
- Á prazo
- {% endif %}
-
- {% if cond_pagto == 'c' %}
- Cartão
- {% endif %}
+ {{ object.get_condicao_pagto_display }}
</td>
</tr>
<tr>
<td>Vendedor</td>
<td>&nbsp</td>
<td style="width: 110px;">Data</td>
- <td>{% now "d/m/Y" %}</td>
+ <td>{{ object.data|date:"SHORT_DATE_FORMAT" }}</td>
</tr>
</tbody>
</table>
@@ -86,21 +76,21 @@ <h1 style="padding: 0px; border: 0px;">DUTRA Materias para construção</h1>
</tr>
</thead>
<tbody>
- {% for item in items %}
+ {% for item in object.items %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ item.produto.desc }}</td>
<td>{% firstof item.produto.marca "-" %}</td>
<td>{{ item.qtde }}</td >
<td>
- {% if cond_pagto == "c" %}
+ {% if object.condicao_pagto == "c" %}
{{ item.valor_item_cartao_display }}
{% else %}
{{ item.valor_item_display }}
{% endif %}
</td>
<td>
- {% if cond_pagto == "c" %}
+ {% if object.condicao_pagto == "c" %}
{{ item.valor_total_cartao_display }}
{% else %}
{{ item.valor_total_display }}
@@ -114,10 +104,10 @@ <h1 style="padding: 0px; border: 0px;">DUTRA Materias para construção</h1>
</tr>
{% endfor %}
</tbody>
- {% if items %}
+ {% if object.items %}
<tfoot>
<th colspan="5">Valor total</th>
- <td>{{ valor_total }}</td>
+ <td>{{ object.valor_total }}</td>
</tfoot>
{% endif %}
</table>
View
6 orcamento/templates/orcamento/preview.html
@@ -13,7 +13,7 @@
</tr>
</thead>
<tbody>
- {% for item in items %}
+ {% for item in object.items %}
<tr rel="{{ item.id }}">
<td>{{ forloop.counter }}</td>
<td>{{ item.produto.desc }}</td>
@@ -46,11 +46,11 @@
</tr>
{% endfor %}
</tbody>
- {% if items %}
+ {% if object.items %}
<tfoot>
<th colspan="7">Valor total</th>
<td>
- {{ valor_total }}
+ {{ object.valor_total }}
</td>
</tfoot>
{% endif %}
View
68 orcamento/views.py
@@ -1,19 +1,30 @@
# -*- coding: utf-8 -*-
+__all__ = ('AddOrcamentoView', 'OrcamentoView',
+ 'ListOrcamentoView')
+
+
import locale
locale.setlocale(locale.LC_ALL, 'pt_BR.utf8')
-from django.views.generic import TemplateView
+from django.views.generic import (
+ TemplateView, CreateView, DetailView)
+
from django.shortcuts import render
from django.db.models import Q, Sum
from MCD.produto.models import Produto
from MCD.common.decorators import json_response
from MCD.common.fields import MoneyInput
+from MCD.produto.responses import HybridListView
from output import PDFView
-from .models import Item
+from .models import Orcamento, Item
-class OrcamentoView(TemplateView):
+class AddOrcamentoView(CreateView):
+ model = Orcamento
+
+class OrcamentoView(DetailView):
+ model = Orcamento
template_name = "orcamento/main.html"
get_services = ('auto_complete_produto', 'get_valores',
'preview_orcamento', 'print_orcamento')
@@ -54,21 +65,10 @@ def _get_valores(self):
}
def _preview_orcamento(self):
- items = Item.objects.all().order_by('-pk')
- cond_pagto = self.request.GET.get('cond_pagto')
-
- valor_total = items.aggregate(Sum(
- 'valor_total')).get('valor_total__sum', 0)
-
- if valor_total:
- if cond_pagto == 'c':
- valor_total = valor_total * 1.04
-
- valor_total = locale.format(
- '%0.2f', valor_total, 1)
-
return render(
- self.request, "orcamento/preview.html", locals())
+ self.request, "orcamento/preview.html", {
+ 'object': self.get_object()
+ })
@json_response
def _add_produto(self):
@@ -81,6 +81,7 @@ def _add_produto(self):
item = Item()
+ item.orcamento = self.get_object()
item.produto = produto
item.qtde = qtde or 1
@@ -105,26 +106,25 @@ def _remove_item(self):
@json_response
def _clear_items(self):
- Item.objects.all().delete()
+ orcamento = self.get_object()
+ orcamento.items().delete()
return {'ok': True}
def _print_orcamento(self):
- items = Item.objects.all().order_by('-pk')
- cond_pagto = self.request.GET.get('cond_pagto')
- cliente = self.request.GET.get('cliente')
- endr = self.request.GET.get('endr')
- telefone = self.request.GET.get('telefone')
-
- valor_total = items.aggregate(Sum(
- 'valor_total')).get('valor_total__sum', 0)
- if valor_total:
- if cond_pagto == 'c':
- valor_total = valor_total * 1.04
-
- valor_total = locale.format(
- '%0.2f', valor_total, 1)
-
- v = PDFView(locals(), "orcamento/pdf.html")
+ v = PDFView({
+ 'object': self.get_object()
+ }, "orcamento/pdf.html")
return v.render()
+
+class ListOrcamentoView(HybridListView):
+ sort_fields = json_object_list_fields = [
+ 'id', 'cliente', 'data', 'valor_total']
+ filter_fields = ['cliente']
+ paginate_by = 20
+ allow_empty = True
+ model = Orcamento
+
+ def get_queryset(self):
+ return self.model.objects.all().order_by('-data')
View
25 produto/models.py
@@ -21,6 +21,10 @@ class Produto(models.Model):
valor_venda = models.FloatField(
verbose_name="Valor de venda")
+ qtde = models.FloatField(
+ verbose_name="Quantidade em estoque",
+ default=0)
+
def valor_venda_display(self):
if self.valor_venda:
return locale.format('%0.2f', self.valor_venda, 1)
@@ -38,3 +42,24 @@ def get_autocomplete_display(self):
class Meta:
ordering = ['desc']
+
+class ProdutoMovimentacao(models.Model):
+ produto = models.ForeignKey(Produto)
+ data = models.DateTimeField(auto_now=True)
+
+ desc = models.CharField(
+ verbose_name=u"Descrição",
+ max_length=200)
+
+ qtde = models.FloatField(
+ verbose_name="Quantidade")
+
+ saldo_ant = models.FloatField(
+ verbose_name="Saldo anterior",
+ default=0)
+
+ saldo_final = models.FloatField(
+ verbose_name="Saldo final",
+ default=0)
+
+
View
6 produto/responses.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python
# -*- coding: utf-8 -*-
@@ -12,6 +12,10 @@
from django.views.generic import ListView
from django.http import HttpResponse
from django.db.models import Q
+from django.conf import settings
+
+DATETIME_FORMAT = settings.DATETIME_FORMAT
+DATE_FORMAT = settings.DATE_FORMAT
class JSONResponse(HttpResponse):
""" JSON response class """
View
2  produto/templates/base.html
@@ -35,7 +35,7 @@
<li><h4>Materiais de construção DUTRA</h4></li>
<li class="divider"></li>
<li><a href="/"><i class="icon-list"></i>Produtos</a></li>
- <li><a href="/orcamento/"><i class="icon-share"></i>Novo orçamento</a></li>
+ <li><a href="/orcamento/"><i class="icon-share"></i>Orçamentos</a></li>
</ul>
</div>
</div>
View
4 produto/templates/produto/produto_list.html
@@ -29,6 +29,9 @@
<a id="delete-btn" class="alone-action btn" href="{{ module_url }}/delete/%d/">
<i class="icon-remove"></i> Apagar
</a>
+ <a id="movimentacao-btn" class="alone-action btn" href="{{ module_url }}/movimentacao/%d/">
+ <i class="icon-share"></i> Movimentação
+ </a>
</div>
<div id="list">
@@ -40,6 +43,7 @@
<th scope="col">Marca</th>
<th scope="col">Valor Compra</th>
<th scope="col">Valor Venda</th>
+ <th scope="col">Quantidade em estoque</th>
</tr>
</thead>
<tbody class="ui-corner-all">
View
5 produto/views.py
@@ -19,10 +19,11 @@ class ProdutoListView(HybridListView):
json_object_list_fields = [
'id', 'desc', 'marca',
'valor_compra_display',
- 'valor_venda_display']
+ 'valor_venda_display',
+ 'qtde']
sort_fields = ['id', 'desc', 'marca', 'valor_compra',
- 'valor_venda']
+ 'valor_venda', 'qtde']
filter_fields = ['desc', 'marca']
paginate_by = 20
allow_empty = True
View
3  settings.py
@@ -10,7 +10,8 @@
)
MANAGERS = ADMINS
-
+DATE_FORMAT = 'd/m/Y'
+DATETIME_FORMAT = 'd/m/Y - H:i:s'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
View
4 urls.py
@@ -11,7 +11,9 @@
url(r'^(?P<pk>\d+)/$', ProdutoUpdateView.as_view()),
url(r'^delete/(?P<pk>\d+)/$', ProdutoDeleteView.as_view()),
- url(r'^orcamento/$', OrcamentoView.as_view()),
+ url(r'^orcamento/$', ListOrcamentoView.as_view()),
+ url(r'^orcamento/(?P<pk>\d+)/$', OrcamentoView.as_view()),
+ url(r'^orcamento/add/$', AddOrcamentoView.as_view()),
#url(r'^consignacoes/add/$', ConsignacaoAddView.as_view()),
#url(r'^consignacoes/produtos/(?P<pk>\d+)/$',
# ConsignacaoProdutosView.as_view()),
Please sign in to comment.
Something went wrong with that request. Please try again.